From a wallet signature to a private channel
01
Derive a key
A wallet signature derives your message key. Nothing to store.
Public: you have a key02
Open a channel
The channel key is wrapped for up to eight members.
Public: a channel exists03
Post
Signed by a key every member shares and no wallet owns.
Public: ciphertext04
Read
Members find their channels by decrypting. No list exists.
Nothing on chainEverything in a channel account
FieldWhat it holds
seed32 random bytes. The address comes from it, not from anyone's key.
post keyDerived from the channel key. Only members can sign as it.
refund toWhoever paid the rent, so closing returns it.
wrapsThe channel key sealed to each member's x25519 key. No names attached.
slotsThe latest 24 messages, 360 bytes of ciphertext each.
Signed posts carry the sender's wallet and signature inside the ciphertext, so members can verify who wrote them and nobody else can see it.
Open, post, read
The client builds every instruction. Any wallet or relayer can pay the fees.
const ch = ag.newChannel([aliceKey, bobKey]); await send([relayer], ag.openChannelIx(relayer.publicKey, ch)); const msg = ag.sealMessage(ch.key, "bid 240, settle at noon", me); await send([relayer, ch.postKey], ag.postIx(ch.address, ch.postKey.publicKey, msg)); const mine = await ag.findChannels(connection, myBoxKey);