@1sat/actions 0.0.230 → 0.0.232

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (97) hide show
  1. package/dist/apply/opnsRegister.d.ts +12 -5
  2. package/dist/apply/opnsRegister.d.ts.map +1 -1
  3. package/dist/apply/opnsRegister.js +68 -10
  4. package/dist/apply/opnsRegister.js.map +1 -1
  5. package/dist/funding/index.d.ts +1 -0
  6. package/dist/funding/index.d.ts.map +1 -1
  7. package/dist/funding/index.js +1 -1
  8. package/dist/funding/index.js.map +1 -1
  9. package/dist/funding/walletFunding.d.ts +47 -0
  10. package/dist/funding/walletFunding.d.ts.map +1 -0
  11. package/dist/funding/walletFunding.js +162 -0
  12. package/dist/funding/walletFunding.js.map +1 -0
  13. package/dist/funding/walletFunding.test.d.ts +2 -0
  14. package/dist/funding/walletFunding.test.d.ts.map +1 -0
  15. package/dist/funding/walletFunding.test.js +225 -0
  16. package/dist/funding/walletFunding.test.js.map +1 -0
  17. package/dist/index.d.ts +3 -0
  18. package/dist/index.d.ts.map +1 -1
  19. package/dist/index.js +7 -0
  20. package/dist/index.js.map +1 -1
  21. package/dist/mandala/deploy.d.ts +89 -0
  22. package/dist/mandala/deploy.d.ts.map +1 -0
  23. package/dist/mandala/deploy.js +226 -0
  24. package/dist/mandala/deploy.js.map +1 -0
  25. package/dist/mandala/deploy.test.d.ts +2 -0
  26. package/dist/mandala/deploy.test.d.ts.map +1 -0
  27. package/dist/mandala/deploy.test.js +281 -0
  28. package/dist/mandala/deploy.test.js.map +1 -0
  29. package/dist/mandala/index.d.ts +9 -0
  30. package/dist/mandala/index.d.ts.map +1 -0
  31. package/dist/mandala/index.js +17 -0
  32. package/dist/mandala/index.js.map +1 -0
  33. package/dist/mandala/receive.d.ts +58 -0
  34. package/dist/mandala/receive.d.ts.map +1 -0
  35. package/dist/mandala/receive.js +162 -0
  36. package/dist/mandala/receive.js.map +1 -0
  37. package/dist/mandala/send.d.ts +74 -0
  38. package/dist/mandala/send.d.ts.map +1 -0
  39. package/dist/mandala/send.js +313 -0
  40. package/dist/mandala/send.js.map +1 -0
  41. package/dist/mandala/send.test.d.ts +2 -0
  42. package/dist/mandala/send.test.d.ts.map +1 -0
  43. package/dist/mandala/send.test.js +515 -0
  44. package/dist/mandala/send.test.js.map +1 -0
  45. package/dist/mandala/tokenId.d.ts +21 -0
  46. package/dist/mandala/tokenId.d.ts.map +1 -0
  47. package/dist/mandala/tokenId.js +29 -0
  48. package/dist/mandala/tokenId.js.map +1 -0
  49. package/dist/metanet/brc78.d.ts +29 -0
  50. package/dist/metanet/brc78.d.ts.map +1 -0
  51. package/dist/metanet/brc78.js +60 -0
  52. package/dist/metanet/brc78.js.map +1 -0
  53. package/dist/metanet/deliver.d.ts +26 -0
  54. package/dist/metanet/deliver.d.ts.map +1 -0
  55. package/dist/metanet/deliver.js +34 -0
  56. package/dist/metanet/deliver.js.map +1 -0
  57. package/dist/metanet/envelope.d.ts +69 -0
  58. package/dist/metanet/envelope.d.ts.map +1 -0
  59. package/dist/metanet/envelope.js +86 -0
  60. package/dist/metanet/envelope.js.map +1 -0
  61. package/dist/metanet/envelope.test.d.ts +2 -0
  62. package/dist/metanet/envelope.test.d.ts.map +1 -0
  63. package/dist/metanet/envelope.test.js +106 -0
  64. package/dist/metanet/envelope.test.js.map +1 -0
  65. package/dist/metanet/inbox.d.ts +51 -0
  66. package/dist/metanet/inbox.d.ts.map +1 -0
  67. package/dist/metanet/inbox.js +100 -0
  68. package/dist/metanet/inbox.js.map +1 -0
  69. package/dist/metanet/index.d.ts +8 -0
  70. package/dist/metanet/index.d.ts.map +1 -0
  71. package/dist/metanet/index.js +9 -0
  72. package/dist/metanet/index.js.map +1 -0
  73. package/dist/metanet/receive.d.ts +50 -0
  74. package/dist/metanet/receive.d.ts.map +1 -0
  75. package/dist/metanet/receive.js +107 -0
  76. package/dist/metanet/receive.js.map +1 -0
  77. package/dist/metanet/relay.d.ts +37 -0
  78. package/dist/metanet/relay.d.ts.map +1 -0
  79. package/dist/metanet/relay.js +51 -0
  80. package/dist/metanet/relay.js.map +1 -0
  81. package/dist/opns/index.d.ts +65 -4
  82. package/dist/opns/index.d.ts.map +1 -1
  83. package/dist/opns/index.js +93 -34
  84. package/dist/opns/index.js.map +1 -1
  85. package/dist/opns/registerOpns.test.d.ts +2 -0
  86. package/dist/opns/registerOpns.test.d.ts.map +1 -0
  87. package/dist/opns/registerOpns.test.js +186 -0
  88. package/dist/opns/registerOpns.test.js.map +1 -0
  89. package/dist/payments/index.d.ts +32 -1
  90. package/dist/payments/index.d.ts.map +1 -1
  91. package/dist/payments/index.js +118 -6
  92. package/dist/payments/index.js.map +1 -1
  93. package/dist/payments/sendBsvHandle.test.d.ts +2 -0
  94. package/dist/payments/sendBsvHandle.test.d.ts.map +1 -0
  95. package/dist/payments/sendBsvHandle.test.js +478 -0
  96. package/dist/payments/sendBsvHandle.test.js.map +1 -0
  97. package/package.json +8 -7
@@ -0,0 +1,515 @@
1
+ import { beforeEach, describe, expect, test } from 'bun:test';
2
+ import { Mandala } from '@1sat/templates';
3
+ import { mandalaProtocol } from '@1sat/types';
4
+ import { TRANSACTION_CBOR_CONTENT_TYPE, encodeMimeEntity, parseMimeEntity, } from '@1sat/utils';
5
+ import { Beef, EncryptedMessage, Hash, LockingScript, MerklePath, P2PKH, PrivateKey, ProtoWallet, PublicKey, Transaction, UnlockingScript, Utils, } from '@bsv/sdk';
6
+ import { decode as dagCborDecode, encode as dagCborEncode, } from '@ipld/dag-cbor';
7
+ import { encryptBrc78 } from '../metanet/brc78.js';
8
+ import { ENVELOPE_SIGNATURE_KEY_ID, ENVELOPE_SIGNATURE_PROTOCOL, envelopeSigningPreimage, signEnvelope, } from '../metanet/envelope.js';
9
+ import { messageRelay } from '../metanet/relay.js';
10
+ import { createContext } from '../types.js';
11
+ import { syncMandalaInbox } from './receive.js';
12
+ import { sendMandala } from './send.js';
13
+ const relayed = [];
14
+ const acknowledged = [];
15
+ const listed = [];
16
+ Object.assign(messageRelay, {
17
+ sendCborMessage: async (_wallet, messagebox, recipient, messageBox, body) => {
18
+ const messageId = `env-${relayed.length + 1}`;
19
+ relayed.push({ messagebox, recipient, messageBox, body, messageId });
20
+ return { status: 'success', messageId };
21
+ },
22
+ listCborMessages: async (wallet, messagebox, messageBox) => {
23
+ listed.push({ messagebox, messageBox });
24
+ const { publicKey } = await wallet.getPublicKey({ identityKey: true });
25
+ return relayed
26
+ .filter((m) => m.recipient === publicKey && m.messageBox === messageBox)
27
+ .map((m) => ({
28
+ messageId: m.messageId,
29
+ body: m.body,
30
+ sender: new Uint8Array(33),
31
+ }));
32
+ },
33
+ acknowledgeCborMessages: async (_wallet, _messagebox, messageIds) => {
34
+ acknowledged.push(messageIds);
35
+ return { status: 'success' };
36
+ },
37
+ });
38
+ const TOKEN_TXID = 'ab'.repeat(32);
39
+ const TOKEN_ID = `${TOKEN_TXID}.0`;
40
+ const SENDER = PrivateKey.fromHex('11'.repeat(32));
41
+ const SENDER_ID = SENDER.toPublicKey().toString();
42
+ const RECIPIENT = PrivateKey.fromHex('22'.repeat(32));
43
+ const RECIPIENT_ID = RECIPIENT.toPublicKey().toString();
44
+ const RESOLVED_BOX = 'https://messagebox.lkup.net';
45
+ const HOLD_KEY_ID = 'hold-1';
46
+ const PROTOCOL = mandalaProtocol(TOKEN_ID);
47
+ const HANDLE = '@deggen+conf@lkup.net';
48
+ /** A mined parent, then a tx holding Mandala outputs (`amounts`) for the sender. */
49
+ async function walletHolding(proto, amounts) {
50
+ const parent = new Transaction();
51
+ parent.addOutput({ lockingScript: new LockingScript([]), satoshis: 1000 });
52
+ parent.merklePath = new MerklePath(1, [
53
+ [{ offset: 0, hash: parent.id('hex'), txid: true }],
54
+ ]);
55
+ const { publicKey } = await proto.getPublicKey({
56
+ protocolID: PROTOCOL,
57
+ keyID: HOLD_KEY_ID,
58
+ counterparty: 'self',
59
+ forSelf: true,
60
+ });
61
+ const holding = new Transaction();
62
+ holding.addInput({
63
+ sourceTransaction: parent,
64
+ sourceOutputIndex: 0,
65
+ unlockingScript: new UnlockingScript([]),
66
+ });
67
+ for (const amount of amounts) {
68
+ holding.addOutput({
69
+ lockingScript: Mandala.value(`${TOKEN_TXID}_0`, amount, {
70
+ lock: new P2PKH().lock(PublicKey.fromString(publicKey).toAddress()),
71
+ }).lock(),
72
+ satoshis: 1,
73
+ });
74
+ }
75
+ return holding;
76
+ }
77
+ /** BRC-100 fake over a ProtoWallet: lists the holding, builds signable txs, applies spends. */
78
+ async function fakeWallet(amounts = [100n]) {
79
+ const proto = new ProtoWallet(SENDER);
80
+ const holding = await walletHolding(proto, amounts);
81
+ const rec = {
82
+ createArgs: [],
83
+ signArgs: [],
84
+ listBaskets: [],
85
+ holdingTxid: holding.id('hex'),
86
+ };
87
+ let pending;
88
+ const wallet = Object.assign(Object.create(proto), {
89
+ listOutputs: async (args) => {
90
+ rec.listBaskets.push(args.basket);
91
+ return {
92
+ totalOutputs: amounts.length,
93
+ outputs: amounts.map((_, i) => ({
94
+ outpoint: `${holding.id('hex')}.${i}`,
95
+ satoshis: 1,
96
+ spendable: true,
97
+ tags: [],
98
+ customInstructions: JSON.stringify({
99
+ protocolID: PROTOCOL,
100
+ keyID: HOLD_KEY_ID,
101
+ }),
102
+ })),
103
+ BEEF: holding.toBEEF(),
104
+ };
105
+ },
106
+ createAction: async (args) => {
107
+ rec.createArgs.push(args);
108
+ const beef = Beef.fromBinary(Array.from(args.inputBEEF ?? []));
109
+ const tx = new Transaction();
110
+ for (const input of args.inputs ?? []) {
111
+ const [txid, vout] = input.outpoint.split('.');
112
+ tx.addInput({
113
+ sourceTransaction: beef.findTxid(txid).tx,
114
+ sourceOutputIndex: Number(vout),
115
+ unlockingScript: new UnlockingScript([]),
116
+ });
117
+ }
118
+ for (const out of args.outputs ?? []) {
119
+ tx.addOutput({
120
+ lockingScript: LockingScript.fromHex(out.lockingScript),
121
+ satoshis: out.satoshis,
122
+ });
123
+ }
124
+ pending = tx;
125
+ return {
126
+ signableTransaction: { tx: tx.toAtomicBEEF(), reference: 'ref-1' },
127
+ };
128
+ },
129
+ signAction: async (args) => {
130
+ rec.signArgs.push(args);
131
+ const tx = pending;
132
+ for (const [i, spend] of Object.entries(args.spends)) {
133
+ tx.inputs[Number(i)].unlockingScript = UnlockingScript.fromHex(spend.unlockingScript);
134
+ }
135
+ return { txid: tx.id('hex'), tx: tx.toAtomicBEEF() };
136
+ },
137
+ abortAction: async () => ({ aborted: true }),
138
+ });
139
+ return { wallet, rec };
140
+ }
141
+ /** Recipient wallet: ProtoWallet crypto plus a recorded internalizeAction. */
142
+ function recipientWallet(fail = false) {
143
+ const internalized = [];
144
+ const wallet = Object.assign(Object.create(new ProtoWallet(RECIPIENT)), {
145
+ internalizeAction: async (args) => {
146
+ if (fail)
147
+ throw new Error('internalize refused');
148
+ internalized.push(args);
149
+ return { accepted: true };
150
+ },
151
+ });
152
+ return { wallet, internalized };
153
+ }
154
+ /** Resolve `HANDLE` to the recipient (BRC-169 §5) without the network. */
155
+ async function withResolver(fn) {
156
+ const realFetch = globalThis.fetch;
157
+ globalThis.fetch = (async (url) => {
158
+ if (String(url) === 'https://lkup.net/manifest.json') {
159
+ return new Response(JSON.stringify({ metanet: { handles: { version: '1.0' } } }));
160
+ }
161
+ expect(String(url)).toBe('https://lkup.net/.well-known/metanet-handles/resolve?handle=deggen');
162
+ return new Response(JSON.stringify({
163
+ metanetHandles: '1.0',
164
+ handle: 'deggen',
165
+ domain: 'lkup.net',
166
+ identityKey: RECIPIENT_ID,
167
+ certificate: { subject: RECIPIENT_ID },
168
+ messagebox: RESOLVED_BOX,
169
+ ttl: 3600,
170
+ revoked: false,
171
+ }));
172
+ });
173
+ try {
174
+ return await fn();
175
+ }
176
+ finally {
177
+ globalThis.fetch = realFetch;
178
+ }
179
+ }
180
+ /** Open the last relayed envelope with the recipient's raw key. */
181
+ function openLast() {
182
+ const env = dagCborDecode(relayed[relayed.length - 1].body);
183
+ const plaintext = EncryptedMessage.decrypt(Array.from(env.content), RECIPIENT);
184
+ const entity = parseMimeEntity(plaintext);
185
+ const body = dagCborDecode(entity.body);
186
+ return { env, plaintext, entity, body };
187
+ }
188
+ /** Post a signed envelope from SENDER to the recipient's mandala_inbox. */
189
+ async function postEnvelope(mime) {
190
+ const proto = new ProtoWallet(SENDER);
191
+ const content = await encryptBrc78(proto, Array.from(mime), RECIPIENT_ID);
192
+ const { envelope } = await signEnvelope(proto, {
193
+ metanetHandles: '1.0',
194
+ recipient: { handle: 'deggen', domain: 'lkup.net' },
195
+ sender: { identityKey: Uint8Array.from(Utils.toArray(SENDER_ID, 'hex')) },
196
+ created: '2026-10-03T00:00:00Z',
197
+ payment: null,
198
+ contentHash: Uint8Array.from(Hash.sha256(Array.from(mime))),
199
+ }, Uint8Array.from(content));
200
+ const messageId = `env-${relayed.length + 1}`;
201
+ relayed.push({
202
+ messagebox: RESOLVED_BOX,
203
+ recipient: RECIPIENT_ID,
204
+ messageBox: 'mandala_inbox',
205
+ body: envelope,
206
+ messageId,
207
+ });
208
+ return messageId;
209
+ }
210
+ beforeEach(() => {
211
+ relayed.length = 0;
212
+ acknowledged.length = 0;
213
+ listed.length = 0;
214
+ });
215
+ describe('sendMandala', () => {
216
+ test('splits when no output holds exactly amount, then one protected noSend send', async () => {
217
+ const { wallet, rec } = await fakeWallet();
218
+ const res = await withResolver(() => sendMandala.execute(createContext(wallet), {
219
+ tokenId: TOKEN_ID,
220
+ amount: '60',
221
+ destination: { handle: HANDLE },
222
+ }));
223
+ expect(res.error).toBeUndefined();
224
+ expect(res.delivered).toBe('envelope');
225
+ expect(res.messageId).toBe('env-1');
226
+ expect(rec.listBaskets).toEqual([`mandala ${TOKEN_TXID} 0`]);
227
+ expect(rec.createArgs).toHaveLength(2);
228
+ // Split: ordinary broadcast, exact 60 + remainder 40, both to us in the
229
+ // per-token basket, CI = derivation only.
230
+ const split = rec.createArgs[0];
231
+ expect(split.options?.noSend).toBeUndefined();
232
+ expect(split.labels).toEqual(['mandala', `mandala ${TOKEN_TXID} 0`]);
233
+ expect(split.inputs?.map((i) => i.outpoint)).toEqual([
234
+ `${rec.holdingTxid}.0`,
235
+ ]);
236
+ const splitOuts = split.outputs ?? [];
237
+ expect(splitOuts.map((o) => Mandala.decode(LockingScript.fromHex(o.lockingScript))?.amount)).toEqual([60n, 40n]);
238
+ for (const o of splitOuts) {
239
+ expect(o.satoshis).toBe(1);
240
+ expect(o.basket).toBe(`mandala ${TOKEN_TXID} 0`);
241
+ const ci = JSON.parse(o.customInstructions);
242
+ expect(Object.keys(ci).sort()).toEqual(['keyID', 'protocolID']);
243
+ expect(ci.protocolID).toEqual(PROTOCOL);
244
+ }
245
+ // Protected send: exactly one input (the exact split output), one output.
246
+ const args = rec.createArgs[1];
247
+ expect(args.options?.noSend).toBe(true);
248
+ expect(args.options?.randomizeOutputs).toBe(false);
249
+ expect(args.labels).toEqual([
250
+ 'mandala',
251
+ `mandala ${TOKEN_TXID} 0`,
252
+ 'p nosend expiry seconds 31536000',
253
+ ]);
254
+ const splitTxid = args.inputs[0].outpoint.split('.')[0];
255
+ expect(args.inputs?.map((i) => i.outpoint)).toEqual([`${splitTxid}.0`]);
256
+ expect(splitTxid).not.toBe(rec.holdingTxid);
257
+ expect(args.outputs).toHaveLength(1);
258
+ const out = args.outputs[0];
259
+ expect(out.basket).toBeUndefined();
260
+ expect(out.satoshis).toBe(1);
261
+ const token = Mandala.decode(LockingScript.fromHex(out.lockingScript));
262
+ expect(token?.role).toBe('value');
263
+ expect(token?.tokenId).toBe(`${TOKEN_TXID}_0`);
264
+ expect(token?.amount).toBe(60n);
265
+ // Token inputs were unlocked by the pipeline (caller-signed spends).
266
+ expect(rec.signArgs[0].spends[0].unlockingScript.length).toBeGreaterThan(0);
267
+ expect(rec.signArgs[1].spends[0].unlockingScript.length).toBeGreaterThan(0);
268
+ });
269
+ test('an output of exactly amount: no split, expiry override', async () => {
270
+ const { wallet, rec } = await fakeWallet([40n, 100n]);
271
+ const res = await withResolver(() => sendMandala.execute(createContext(wallet), {
272
+ tokenId: TOKEN_ID,
273
+ amount: '100',
274
+ destination: { handle: HANDLE },
275
+ expirySeconds: 86400,
276
+ }));
277
+ expect(res.error).toBeUndefined();
278
+ expect(rec.createArgs).toHaveLength(1);
279
+ const args = rec.createArgs[0];
280
+ expect(args.options?.noSend).toBe(true);
281
+ expect(args.labels).toContain('p nosend expiry seconds 86400');
282
+ expect(args.inputs?.map((i) => i.outpoint)).toEqual([
283
+ `${rec.holdingTxid}.1`,
284
+ ]);
285
+ expect(args.outputs).toHaveLength(1);
286
+ });
287
+ test('outputs summing exactly to amount are merged first (no remainder output)', async () => {
288
+ const { wallet, rec } = await fakeWallet([30n, 30n]);
289
+ const res = await withResolver(() => sendMandala.execute(createContext(wallet), {
290
+ tokenId: TOKEN_ID,
291
+ amount: '60',
292
+ destination: { handle: HANDLE },
293
+ }));
294
+ expect(res.error).toBeUndefined();
295
+ expect(rec.createArgs).toHaveLength(2);
296
+ expect(rec.createArgs[0].inputs).toHaveLength(2);
297
+ expect(rec.createArgs[0].outputs).toHaveLength(1);
298
+ expect(rec.createArgs[1].inputs).toHaveLength(1);
299
+ });
300
+ test('delivery: signed envelope to the resolved mandala_inbox, payment null, BRC-232 MIME content', async () => {
301
+ const { wallet } = await fakeWallet();
302
+ const res = await withResolver(() => sendMandala.execute(createContext(wallet), {
303
+ tokenId: TOKEN_ID,
304
+ amount: '60',
305
+ destination: { handle: HANDLE },
306
+ memo: 'for the conference',
307
+ }));
308
+ expect(res.error).toBeUndefined();
309
+ expect(relayed).toHaveLength(1);
310
+ expect(relayed[0].messagebox).toBe(RESOLVED_BOX);
311
+ expect(relayed[0].recipient).toBe(RECIPIENT_ID);
312
+ expect(relayed[0].messageBox).toBe('mandala_inbox');
313
+ const { env, plaintext, entity, body } = openLast();
314
+ expect(env.metanetHandles).toBe('1.0');
315
+ expect(env.recipient).toEqual({
316
+ handle: 'deggen',
317
+ tag: 'conf',
318
+ domain: 'lkup.net',
319
+ });
320
+ expect(env.payment).toBeNull();
321
+ const senderHex = Utils.toHex(Array.from(env.sender.identityKey));
322
+ expect(senderHex).toBe(SENDER_ID);
323
+ // content: a MIME entity of the BRC-232 type; contentHash over the MIME bytes.
324
+ expect(Utils.toUTF8(plaintext.slice(0, 60)).startsWith('Content-Type: application/vnd.metanet.transaction+cbor\r\n\r\n')).toBe(true);
325
+ expect(entity.contentType).toBe(TRANSACTION_CBOR_CONTENT_TYPE);
326
+ expect(Array.from(env.contentHash)).toEqual(Hash.sha256(plaintext));
327
+ // body: txid, beef, one basket-insertion entry with our identity as counterparty.
328
+ expect(body.memo).toBe('for the conference');
329
+ expect(Utils.toHex(Array.from(body.txid))).toBe(res.txid);
330
+ expect(Array.from(body.beef)).toEqual(res.tx);
331
+ expect(body.outputs).toHaveLength(1);
332
+ const entry = body.outputs[0];
333
+ expect(entry.outputIndex).toBe(0);
334
+ expect(entry.protocol).toBe('basket insertion');
335
+ expect(entry.protocolID).toEqual([2, `mandala ${TOKEN_TXID} 0`]);
336
+ expect(entry.keyID).toMatch(/^[A-Za-z0-9+/=]+ [A-Za-z0-9+/=]+$/);
337
+ expect(Utils.toHex(Array.from(entry.counterparty))).toBe(SENDER_ID);
338
+ // signature: §7.2 item 3, verifiable from sender.identityKey alone.
339
+ const { content: _c, signature, ...unsigned } = env;
340
+ const { valid } = await new ProtoWallet('anyone').verifySignature({
341
+ data: Array.from(envelopeSigningPreimage(unsigned)),
342
+ signature: Array.from(signature),
343
+ protocolID: ENVELOPE_SIGNATURE_PROTOCOL,
344
+ keyID: ENVELOPE_SIGNATURE_KEY_ID,
345
+ counterparty: senderHex,
346
+ });
347
+ expect(valid).toBe(true);
348
+ // The recipient derives the token output's key from the entry alone.
349
+ const { publicKey } = await new ProtoWallet(RECIPIENT).getPublicKey({
350
+ protocolID: entry.protocolID,
351
+ keyID: entry.keyID,
352
+ counterparty: senderHex,
353
+ forSelf: true,
354
+ });
355
+ const tx = Transaction.fromAtomicBEEF(Array.from(body.beef));
356
+ expect(Mandala.decode(tx.outputs[0].lockingScript)?.lock.toHex()).toBe(new P2PKH().lock(PublicKey.fromString(publicKey).toAddress()).toHex());
357
+ });
358
+ test('a txid_vout token is accepted and normalized to BRC-36 txid.vout', async () => {
359
+ const { wallet, rec } = await fakeWallet();
360
+ const res = await withResolver(() => sendMandala.execute(createContext(wallet), {
361
+ tokenId: `${TOKEN_TXID.toUpperCase()}_0`,
362
+ amount: '100',
363
+ destination: { handle: HANDLE },
364
+ }));
365
+ expect(res.error).toBeUndefined();
366
+ expect(rec.listBaskets).toEqual([`mandala ${TOKEN_TXID} 0`]);
367
+ });
368
+ test('the token is named by its deploy outpoint', async () => {
369
+ const { wallet, rec } = await fakeWallet();
370
+ const res = await sendMandala.execute(createContext(wallet), {
371
+ tokenId: TOKEN_TXID,
372
+ amount: '1',
373
+ destination: { handle: HANDLE },
374
+ });
375
+ expect(res.error).toBe('invalid-token: expected <txid>.<vout>');
376
+ expect(rec.listBaskets).toEqual([]);
377
+ });
378
+ test('insufficient balance', async () => {
379
+ const { wallet, rec } = await fakeWallet();
380
+ const res = await withResolver(() => sendMandala.execute(createContext(wallet), {
381
+ tokenId: TOKEN_ID,
382
+ amount: '101',
383
+ destination: { handle: HANDLE },
384
+ }));
385
+ expect(res.error).toBe('insufficient-tokens');
386
+ expect(rec.createArgs).toHaveLength(0);
387
+ expect(relayed).toHaveLength(0);
388
+ });
389
+ });
390
+ describe('syncMandalaInbox', () => {
391
+ test('round trip: a sent delivery is verified, decrypted and internalized, then acknowledged', async () => {
392
+ const { wallet: senderWallet } = await fakeWallet();
393
+ const sent = await withResolver(() => sendMandala.execute(createContext(senderWallet), {
394
+ tokenId: TOKEN_ID,
395
+ amount: '60',
396
+ destination: { handle: HANDLE },
397
+ }));
398
+ expect(sent.error).toBeUndefined();
399
+ const { body } = openLast();
400
+ const { wallet, internalized } = recipientWallet();
401
+ const res = await syncMandalaInbox.execute(createContext(wallet), {
402
+ messageboxUrl: 'https://messagebox.example/',
403
+ });
404
+ expect(res.error).toBeUndefined();
405
+ expect(listed).toEqual([
406
+ { messagebox: 'https://messagebox.example', messageBox: 'mandala_inbox' },
407
+ ]);
408
+ expect(res.skipped).toEqual([]);
409
+ expect(res.received).toEqual([
410
+ { messageId: 'env-1', txid: sent.txid, tokenIds: [TOKEN_ID] },
411
+ ]);
412
+ expect(internalized).toHaveLength(1);
413
+ const args = internalized[0];
414
+ expect(Transaction.fromAtomicBEEF(args.tx).id('hex')).toBe(sent.txid);
415
+ expect(args.labels).toEqual(['mandala', `mandala ${TOKEN_TXID} 0`]);
416
+ expect(args.outputs).toHaveLength(1);
417
+ const out = args.outputs[0];
418
+ expect(out.outputIndex).toBe(0);
419
+ expect(out.protocol).toBe('basket insertion');
420
+ expect(out.insertionRemittance?.basket).toBe(`mandala ${TOKEN_TXID} 0`);
421
+ expect(JSON.parse(out.insertionRemittance?.customInstructions ?? '')).toEqual({
422
+ protocolID: [2, `mandala ${TOKEN_TXID} 0`],
423
+ keyID: body.outputs[0].keyID,
424
+ counterparty: SENDER_ID,
425
+ });
426
+ expect(acknowledged).toEqual([['env-1']]);
427
+ });
428
+ test('an unknown content type is left unacknowledged and reported', async () => {
429
+ const id = await postEnvelope(encodeMimeEntity('text/plain; charset=utf-8', Utils.toArray('hello', 'utf8')));
430
+ const { wallet, internalized } = recipientWallet();
431
+ const res = await syncMandalaInbox.execute(createContext(wallet), {});
432
+ expect(res.received).toEqual([]);
433
+ expect(res.skipped).toEqual([
434
+ {
435
+ messageId: id,
436
+ reason: 'unsupported content type text/plain; charset=utf-8',
437
+ },
438
+ ]);
439
+ expect(internalized).toHaveLength(0);
440
+ expect(acknowledged).toEqual([]);
441
+ });
442
+ test('a protocolID naming a different token than the script is skipped', async () => {
443
+ const { wallet: senderWallet } = await fakeWallet();
444
+ await withResolver(() => sendMandala.execute(createContext(senderWallet), {
445
+ tokenId: TOKEN_ID,
446
+ amount: '100',
447
+ destination: { handle: HANDLE },
448
+ }));
449
+ const { body } = openLast();
450
+ relayed.length = 0;
451
+ const other = `${'cd'.repeat(32)}.0`;
452
+ body.outputs[0].protocolID = [2, `mandala ${'cd'.repeat(32)} 0`];
453
+ const id = await postEnvelope(encodeMimeEntity(TRANSACTION_CBOR_CONTENT_TYPE, dagCborEncode(body)));
454
+ const { wallet, internalized } = recipientWallet();
455
+ const res = await syncMandalaInbox.execute(createContext(wallet), {});
456
+ expect(res.received).toEqual([]);
457
+ expect(res.skipped).toEqual([
458
+ {
459
+ messageId: id,
460
+ reason: `output 0: token mismatch (protocolID ${other}, script ${TOKEN_ID})`,
461
+ },
462
+ ]);
463
+ expect(internalized).toHaveLength(0);
464
+ expect(acknowledged).toEqual([]);
465
+ });
466
+ test('an unknown protocolID is left unacknowledged', async () => {
467
+ const { wallet: senderWallet } = await fakeWallet();
468
+ await withResolver(() => sendMandala.execute(createContext(senderWallet), {
469
+ tokenId: TOKEN_ID,
470
+ amount: '100',
471
+ destination: { handle: HANDLE },
472
+ }));
473
+ const { body } = openLast();
474
+ relayed.length = 0;
475
+ body.outputs[0].protocolID = [2, 'some other protocol'];
476
+ await postEnvelope(encodeMimeEntity(TRANSACTION_CBOR_CONTENT_TYPE, dagCborEncode(body)));
477
+ const { wallet, internalized } = recipientWallet();
478
+ const res = await syncMandalaInbox.execute(createContext(wallet), {});
479
+ expect(res.skipped[0].reason).toStartWith('output 0: unknown protocolID');
480
+ expect(internalized).toHaveLength(0);
481
+ expect(acknowledged).toEqual([]);
482
+ });
483
+ test('a failed internalize is not acknowledged', async () => {
484
+ const { wallet: senderWallet } = await fakeWallet();
485
+ await withResolver(() => sendMandala.execute(createContext(senderWallet), {
486
+ tokenId: TOKEN_ID,
487
+ amount: '100',
488
+ destination: { handle: HANDLE },
489
+ }));
490
+ const { wallet } = recipientWallet(true);
491
+ const res = await syncMandalaInbox.execute(createContext(wallet), {});
492
+ expect(res.skipped).toEqual([
493
+ { messageId: 'env-1', reason: 'internalize refused' },
494
+ ]);
495
+ expect(acknowledged).toEqual([]);
496
+ });
497
+ test('a tampered envelope fails signature verification', async () => {
498
+ const { wallet: senderWallet } = await fakeWallet();
499
+ await withResolver(() => sendMandala.execute(createContext(senderWallet), {
500
+ tokenId: TOKEN_ID,
501
+ amount: '100',
502
+ destination: { handle: HANDLE },
503
+ }));
504
+ const env = dagCborDecode(relayed[0].body);
505
+ env.created = '2000-01-01T00:00:00Z';
506
+ relayed[0].body = dagCborEncode(env);
507
+ const { wallet, internalized } = recipientWallet();
508
+ const res = await syncMandalaInbox.execute(createContext(wallet), {});
509
+ expect(res.skipped).toEqual([
510
+ { messageId: 'env-1', reason: 'envelope signature does not verify' },
511
+ ]);
512
+ expect(internalized).toHaveLength(0);
513
+ });
514
+ });
515
+ //# sourceMappingURL=send.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"send.test.js","sourceRoot":"","sources":["../../src/mandala/send.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import { type MandalaToken } from '@1sat/templates';
2
+ /**
3
+ * Mandala tokens are referred to by BRC-36 outpoints, `<txid>.<vout>`
4
+ * (BRC-162 defers to BRC-36). The template's own string form is
5
+ * `<txid>_<vout>`; these helpers convert at that boundary.
6
+ */
7
+ /** Normalize `txid.vout`, `txid_vout` or `{ txid, vout }` to BRC-36 `txid.vout`. */
8
+ export declare function mandalaTokenOutpoint(token: string | {
9
+ txid: string;
10
+ vout: number;
11
+ }): string;
12
+ /** The BRC-162 wire id (32 or 36 bytes) for a token outpoint. */
13
+ export declare function mandalaWireId(token: string): Uint8Array;
14
+ /**
15
+ * The token outpoint `<txid>.<vout>` (lowercase) a decoded Mandala output
16
+ * belongs to, given the output's own outpoint: a deploy output's token is the
17
+ * output itself; a value or authority output names its token by its BRC-162
18
+ * id (32 bytes for vout 0, 36 bytes for a legacy vout > 0).
19
+ */
20
+ export declare function mandalaTokenOf(token: MandalaToken, txid: string, vout: number): string | undefined;
21
+ //# sourceMappingURL=tokenId.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokenId.d.ts","sourceRoot":"","sources":["../../src/mandala/tokenId.ts"],"names":[],"mappings":"AAAA,OAAO,EAAW,KAAK,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAG5D;;;;GAIG;AAEH,oFAAoF;AACpF,wBAAgB,oBAAoB,CACnC,KAAK,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC5C,MAAM,CAGR;AAED,iEAAiE;AACjE,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,CAGvD;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAC7B,KAAK,EAAE,YAAY,EACnB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,GACV,MAAM,GAAG,SAAS,CAGpB"}
@@ -0,0 +1,29 @@
1
+ import { Mandala } from '@1sat/templates';
2
+ import { mandalaOutpoint } from '@1sat/types';
3
+ /**
4
+ * Mandala tokens are referred to by BRC-36 outpoints, `<txid>.<vout>`
5
+ * (BRC-162 defers to BRC-36). The template's own string form is
6
+ * `<txid>_<vout>`; these helpers convert at that boundary.
7
+ */
8
+ /** Normalize `txid.vout`, `txid_vout` or `{ txid, vout }` to BRC-36 `txid.vout`. */
9
+ export function mandalaTokenOutpoint(token) {
10
+ const { txid, vout } = mandalaOutpoint(token);
11
+ return `${txid}.${vout}`;
12
+ }
13
+ /** The BRC-162 wire id (32 or 36 bytes) for a token outpoint. */
14
+ export function mandalaWireId(token) {
15
+ const { txid, vout } = mandalaOutpoint(token);
16
+ return Mandala.idFromString(`${txid}_${vout}`);
17
+ }
18
+ /**
19
+ * The token outpoint `<txid>.<vout>` (lowercase) a decoded Mandala output
20
+ * belongs to, given the output's own outpoint: a deploy output's token is the
21
+ * output itself; a value or authority output names its token by its BRC-162
22
+ * id (32 bytes for vout 0, 36 bytes for a legacy vout > 0).
23
+ */
24
+ export function mandalaTokenOf(token, txid, vout) {
25
+ if (token.role === 'deploy')
26
+ return `${txid.toLowerCase()}.${vout}`;
27
+ return token.tokenId ? mandalaTokenOutpoint(token.tokenId) : undefined;
28
+ }
29
+ //# sourceMappingURL=tokenId.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokenId.js","sourceRoot":"","sources":["../../src/mandala/tokenId.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAqB,MAAM,iBAAiB,CAAA;AAC5D,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAE7C;;;;GAIG;AAEH,oFAAoF;AACpF,MAAM,UAAU,oBAAoB,CACnC,KAA8C;IAE9C,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,eAAe,CAAC,KAAK,CAAC,CAAA;IAC7C,OAAO,GAAG,IAAI,IAAI,IAAI,EAAE,CAAA;AACzB,CAAC;AAED,iEAAiE;AACjE,MAAM,UAAU,aAAa,CAAC,KAAa;IAC1C,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,eAAe,CAAC,KAAK,CAAC,CAAA;IAC7C,OAAO,OAAO,CAAC,YAAY,CAAC,GAAG,IAAI,IAAI,IAAI,EAAE,CAAC,CAAA;AAC/C,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAC7B,KAAmB,EACnB,IAAY,EACZ,IAAY;IAEZ,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ;QAAE,OAAO,GAAG,IAAI,CAAC,WAAW,EAAE,IAAI,IAAI,EAAE,CAAA;IACnE,OAAO,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,oBAAoB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;AACvE,CAAC"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * BRC-78 portable encrypted message, with the crypto done by the wallet.
3
+ *
4
+ * BRC-78 is BRC-2 encryption under protocol `[2, 'message encryption']` with a
5
+ * random 32-byte key ID (base64 in the invoice number) and counterparty = the
6
+ * recipient: exactly BRC-100 `wallet.encrypt`. This module only writes the
7
+ * BRC-78 framing around the wallet's ciphertext, in the byte layout of
8
+ * `@bsv/sdk`'s `EncryptedMessage` (so its `decrypt` reads it):
9
+ *
10
+ * version `42421033` (4) ‖ sender identity key (33) ‖ recipient identity
11
+ * key (33) ‖ key ID (32) ‖ AES-256-GCM ciphertext (IV prepended)
12
+ */
13
+ import { type WalletInterface, type WalletProtocol } from '@bsv/sdk';
14
+ /** BRC-78 protocol, security level 2 */
15
+ export declare const BRC78_PROTOCOL: WalletProtocol;
16
+ /** Version bytes, in `@bsv/sdk` `EncryptedMessage` order */
17
+ export declare const BRC78_VERSION = "42421033";
18
+ /**
19
+ * Encrypt `plaintext` to `recipient` (identity key hex) and return the BRC-78
20
+ * serialization.
21
+ */
22
+ export declare function encryptBrc78(wallet: Pick<WalletInterface, 'encrypt' | 'getPublicKey'>, plaintext: number[], recipient: string): Promise<number[]>;
23
+ /**
24
+ * Decrypt a BRC-78 serialization addressed to this wallet: the inverse of
25
+ * {@link encryptBrc78}. The key ID is read from the BRC-78 header; the
26
+ * counterparty is the sender's identity key.
27
+ */
28
+ export declare function decryptBrc78(wallet: Pick<WalletInterface, 'decrypt'>, message: number[] | Uint8Array, sender: string): Promise<number[]>;
29
+ //# sourceMappingURL=brc78.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"brc78.d.ts","sourceRoot":"","sources":["../../src/metanet/brc78.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAS,KAAK,eAAe,EAAE,KAAK,cAAc,EAAE,MAAM,UAAU,CAAA;AAE3E,wCAAwC;AACxC,eAAO,MAAM,cAAc,EAAE,cAA0C,CAAA;AACvE,4DAA4D;AAC5D,eAAO,MAAM,aAAa,aAAa,CAAA;AAEvC;;;GAGG;AACH,wBAAsB,YAAY,CACjC,MAAM,EAAE,IAAI,CAAC,eAAe,EAAE,SAAS,GAAG,cAAc,CAAC,EACzD,SAAS,EAAE,MAAM,EAAE,EACnB,SAAS,EAAE,MAAM,GACf,OAAO,CAAC,MAAM,EAAE,CAAC,CAkBnB;AAED;;;;GAIG;AACH,wBAAsB,YAAY,CACjC,MAAM,EAAE,IAAI,CAAC,eAAe,EAAE,SAAS,CAAC,EACxC,OAAO,EAAE,MAAM,EAAE,GAAG,UAAU,EAC9B,MAAM,EAAE,MAAM,GACZ,OAAO,CAAC,MAAM,EAAE,CAAC,CAanB"}