Thread
A thread is the persistent on-chain record of a conversation between two wallets. It tracks both participants, message count, and escrow state.
How threads work
One wallet (from) opens the thread to another (to). Once open, either side can send messages. The thread ID is a random 32-bit number chosen at creation; the on-chain address is derived from it.
If the recipient has an inbox, it is updated to record the new thread. If their inbox has a payment rule, the first message must satisfy it — paying them directly or placing funds in escrow.
Loading a thread
By address:
const thread = await client.thread(threadAddress).load();
By numeric ID — returns a handle, load explicitly:
const handle = client.thread(42);
await handle.load();
Refreshing
Thread state changes when new messages arrive or escrow settles. Call refresh() to re-fetch:
await thread.refresh();
console.log(thread.Thread.totalMsgs);
The Thread type
interface Thread {
address: PublicKey;
id: number;
from: PublicKey; // who opened the thread
to: PublicKey; // who received it
inboxId?: BN; // recipient's inbox, if targeted
totalMsgs: number;
lastMsgSeq: number; // sequence number of the latest message
lastUpdated: number; // unix timestamp
lastSenderSide: number; // 0 = from sent last, 1 = to sent last
lastReadSeqFrom: number;
lastReadSeqTo: number;
escrowPayment: ThreadEscrowInfo | null;
}
Access it via thread.Thread after loading.
ThreadClient getters
| Getter | Type | Description |
|---|---|---|
Loaded | boolean | Whether the thread has been fetched |
Thread | Thread | Raw on-chain data (throws if not loaded) |
ThreadInfo | { id, from, to } | Minimal identity snapshot used internally by message pipelines |
Inbox | InboxClient | undefined | The recipient's inbox, if the thread was opened against one |
LastMessage | MessageClient | undefined | Cached last message after calling loadLastMessage() |