@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,281 @@
1
+ import { afterEach, describe, expect, test } from 'bun:test';
2
+ import { Mandala } from '@1sat/templates';
3
+ import { MANDALA_DEPLOY_PROTOCOL, MANDALA_LABEL, MANDALA_TOPIC, mandalaProtocol, mandalaTokenBasket, mandalaTokenLabel, parseMandalaName, } from '@1sat/types';
4
+ import { LockingScript, MerklePath, P2PKH, PrivateKey, ProtoWallet, PublicKey, Transaction, UnlockingScript, } from '@bsv/sdk';
5
+ import { deployMandala, fileMandalaDeploy } from './deploy.js';
6
+ const proto = new ProtoWallet(PrivateKey.fromHex('01'.repeat(32)));
7
+ /** Fake wallet: createAction builds the outputs into a real tx; internalize is recorded. */
8
+ function setup() {
9
+ const created = [];
10
+ const internalized = [];
11
+ const wallet = {
12
+ getPublicKey: (a) => proto.getPublicKey(a),
13
+ createAction: async (args) => {
14
+ created.push(args);
15
+ const parent = new Transaction();
16
+ parent.addInput({
17
+ sourceTXID: '11'.repeat(32),
18
+ sourceOutputIndex: 0,
19
+ unlockingScript: new UnlockingScript(),
20
+ sequence: 0xffffffff,
21
+ });
22
+ parent.addOutput({
23
+ lockingScript: new P2PKH().lock(PrivateKey.fromHex('05'.repeat(32)).toPublicKey().toAddress()),
24
+ satoshis: 100_000,
25
+ });
26
+ parent.merklePath = new MerklePath(100, [
27
+ [{ offset: 0, hash: parent.id('hex'), txid: true }],
28
+ ]);
29
+ const tx = new Transaction();
30
+ tx.addInput({
31
+ sourceTransaction: parent,
32
+ sourceOutputIndex: 0,
33
+ unlockingScript: new UnlockingScript(),
34
+ sequence: 0xffffffff,
35
+ });
36
+ for (const o of args.outputs ?? []) {
37
+ tx.addOutput({
38
+ lockingScript: LockingScript.fromHex(o.lockingScript),
39
+ satoshis: o.satoshis,
40
+ });
41
+ }
42
+ return { txid: tx.id('hex'), tx: tx.toAtomicBEEF() };
43
+ },
44
+ internalizeAction: async (args) => {
45
+ internalized.push(args);
46
+ return { accepted: true };
47
+ },
48
+ };
49
+ const ctx = {
50
+ wallet: wallet,
51
+ chain: 'main',
52
+ isBaseWallet: true,
53
+ };
54
+ return { ctx, created, internalized };
55
+ }
56
+ /** The P2PKH the wallet derives under MANDALA_DEPLOY_PROTOCOL for this keyID. */
57
+ async function derivedLock(ci) {
58
+ const { publicKey } = await proto.getPublicKey({
59
+ protocolID: MANDALA_DEPLOY_PROTOCOL,
60
+ keyID: ci.keyID,
61
+ counterparty: 'self',
62
+ forSelf: true,
63
+ });
64
+ return new P2PKH().lock(PublicKey.fromString(publicKey).toAddress());
65
+ }
66
+ function expectFiling(created, internalized, txid) {
67
+ // one createAction: deploy at vout 0, label `mandala`, derivation-only CI
68
+ expect(created).toHaveLength(1);
69
+ expect(created[0].options?.randomizeOutputs).toBe(false);
70
+ expect(created[0].labels).toEqual([MANDALA_LABEL]);
71
+ expect(created[0].outputs).toHaveLength(1);
72
+ // untracked: an output cannot later be moved out of a basket
73
+ expect(created[0].outputs?.[0].basket).toBeUndefined();
74
+ const ci = JSON.parse(created[0].outputs?.[0].customInstructions ?? '{}');
75
+ expect(Object.keys(ci).sort()).toEqual(['keyID', 'protocolID']);
76
+ // deploy key: [2, 'mandala deploy'] (txid unknown at derivation time)
77
+ expect(ci.protocolID).toEqual([2, 'mandala deploy']);
78
+ expect(ci.keyID).toStartWith('mandala-deploy-');
79
+ // one internalizeAction on the same tx: vout 0 into the per-token basket
80
+ expect(internalized).toHaveLength(1);
81
+ const int = internalized[0];
82
+ expect(Transaction.fromAtomicBEEF(int.tx).id('hex')).toBe(txid);
83
+ expect(int.labels).toEqual([MANDALA_LABEL, `mandala ${txid} 0`]);
84
+ expect(int.labels).toContain(mandalaTokenLabel({ txid, vout: 0 }));
85
+ expect(int.outputs).toHaveLength(1);
86
+ expect(int.outputs[0].outputIndex).toBe(0);
87
+ expect(int.outputs[0].protocol).toBe('basket insertion');
88
+ const remit = int.outputs[0].insertionRemittance;
89
+ expect(remit?.basket).toBe(`mandala ${txid} 0`);
90
+ expect(remit?.basket).toBe(mandalaTokenBasket(`${txid}_0`));
91
+ expect(remit?.customInstructions).toBe(created[0].outputs?.[0].customInstructions);
92
+ return { ci, tx: Transaction.fromAtomicBEEF(int.tx) };
93
+ }
94
+ describe('deployMandala', () => {
95
+ test('fixed supply: createAction + internalize into the per-token basket, tokenId = txid', async () => {
96
+ const { ctx, created, internalized } = setup();
97
+ const res = await deployMandala.execute(ctx, {
98
+ amount: '21000000',
99
+ symbol: 'GOLD',
100
+ decimals: 8,
101
+ });
102
+ expect(res.error).toBeUndefined();
103
+ expect(res.txid).toMatch(/^[0-9a-f]{64}$/);
104
+ expect(res.tokenId).toBe(`${res.txid}.0`);
105
+ expect(res.tx).toBeDefined();
106
+ expect(created[0].options?.noSend).toBeUndefined();
107
+ const { ci, tx } = expectFiling(created, internalized, res.txid);
108
+ const expected = Mandala.deployValue(21000000n, {
109
+ lock: await derivedLock(ci),
110
+ payload: { sym: 'GOLD', dec: 8 },
111
+ });
112
+ expect(created[0].outputs?.[0].lockingScript).toBe(expected.lock().toHex());
113
+ const decoded = Mandala.decode(tx.outputs[0].lockingScript);
114
+ expect(decoded?.role).toBe('deploy');
115
+ expect(decoded?.amount).toBe(21000000n);
116
+ expect(decoded?.metadata).toEqual({ sym: 'GOLD', dec: 8 });
117
+ });
118
+ test('authority: amount 0 deploys the first authority, filed the same way', async () => {
119
+ const { ctx, created, internalized } = setup();
120
+ const res = await deployMandala.execute(ctx, {
121
+ amount: 0n,
122
+ symbol: 'STABLE',
123
+ decimals: 2,
124
+ icon: 1,
125
+ });
126
+ expect(res.error).toBeUndefined();
127
+ expect(res.tokenId).toBe(`${res.txid}.0`);
128
+ const { ci, tx } = expectFiling(created, internalized, res.txid);
129
+ const expected = Mandala.deployAuthority({
130
+ lock: await derivedLock(ci),
131
+ payload: { sym: 'STABLE', dec: 2, icon: 1 },
132
+ });
133
+ expect(created[0].outputs?.[0].lockingScript).toBe(expected.lock().toHex());
134
+ const decoded = Mandala.decode(tx.outputs[0].lockingScript);
135
+ expect(decoded?.role).toBe('deploy');
136
+ expect(decoded?.amount).toBe(0n);
137
+ });
138
+ test('an address destination carries no customInstructions', async () => {
139
+ const { ctx, created, internalized } = setup();
140
+ const res = await deployMandala.execute(ctx, {
141
+ amount: '5',
142
+ destination: {
143
+ address: PrivateKey.fromHex('06'.repeat(32)).toPublicKey().toAddress(),
144
+ },
145
+ });
146
+ expect(res.error).toBeUndefined();
147
+ expect(created[0].outputs?.[0].customInstructions).toBeUndefined();
148
+ expect(internalized[0].outputs[0].insertionRemittance?.customInstructions).toBeUndefined();
149
+ });
150
+ test('names: `mandala <txid> <vout>` from {txid, vout}, txid_vout or txid.vout', () => {
151
+ const txid = 'AB'.repeat(32);
152
+ const name = `mandala ${'ab'.repeat(32)} 3`;
153
+ for (const ref of [{ txid, vout: 3 }, `${txid}_3`, `${txid}.3`]) {
154
+ expect(mandalaTokenBasket(ref)).toBe(name);
155
+ expect(mandalaTokenLabel(ref)).toBe(name);
156
+ expect(mandalaProtocol(ref)).toEqual([2, name]);
157
+ }
158
+ expect(() => mandalaProtocol(txid)).toThrow();
159
+ });
160
+ test('parseMandalaName recovers {txid, vout} from basket, label or protocol', () => {
161
+ const txid = 'ab'.repeat(32);
162
+ expect(parseMandalaName(`mandala ${txid} 7`)).toEqual({ txid, vout: 7 });
163
+ expect(parseMandalaName([2, `mandala ${txid} 0`])).toEqual({
164
+ txid,
165
+ vout: 0,
166
+ });
167
+ expect(parseMandalaName('mandala')).toBeUndefined();
168
+ expect(parseMandalaName('mandala deploy')).toBeUndefined();
169
+ expect(parseMandalaName(`mandala ${txid}_0`)).toBeUndefined();
170
+ });
171
+ });
172
+ describe('deployMandala filing retry', () => {
173
+ test('a failed internalize returns txid/tx/error; fileMandalaDeploy re-files from listActions', async () => {
174
+ const { ctx, created, internalized } = setup();
175
+ const internalize = ctx.wallet.internalizeAction;
176
+ let fail = true;
177
+ ctx.wallet.internalizeAction = async (args) => {
178
+ if (fail)
179
+ throw new Error('storage busy');
180
+ return internalize(args);
181
+ };
182
+ const res = await deployMandala.execute(ctx, { amount: '7' });
183
+ expect(res.error).toBe('file-failed: storage busy');
184
+ expect(res.txid).toMatch(/^[0-9a-f]{64}$/);
185
+ expect(res.tokenId).toBe(`${res.txid}.0`);
186
+ expect(internalized).toHaveLength(0);
187
+ const ciString = created[0].outputs?.[0].customInstructions;
188
+ const listCalls = [];
189
+ ctx.wallet.listActions = async (args) => {
190
+ listCalls.push(args);
191
+ return {
192
+ totalActions: 1,
193
+ actions: [
194
+ {
195
+ txid: res.txid,
196
+ satoshis: 0,
197
+ status: 'completed',
198
+ isOutgoing: true,
199
+ description: 'Deploy Mandala token (fixed supply)',
200
+ labels: [MANDALA_LABEL],
201
+ version: 1,
202
+ lockTime: 0,
203
+ outputs: [
204
+ {
205
+ outputIndex: 0,
206
+ satoshis: 1,
207
+ spendable: true,
208
+ tags: [],
209
+ outputDescription: 'Mandala deploy',
210
+ basket: '',
211
+ customInstructions: ciString,
212
+ },
213
+ ],
214
+ },
215
+ ],
216
+ };
217
+ };
218
+ fail = false;
219
+ const filed = await fileMandalaDeploy.execute(ctx, {
220
+ txid: res.txid,
221
+ tx: res.tx,
222
+ });
223
+ expect(filed.error).toBeUndefined();
224
+ expect(filed.tokenId).toBe(`${res.txid}.0`);
225
+ expect(listCalls).toEqual([
226
+ { labels: [MANDALA_LABEL], includeOutputs: true, limit: 10000 },
227
+ ]);
228
+ expectFiling(created, internalized, res.txid);
229
+ });
230
+ test('fileMandalaDeploy: unknown txid', async () => {
231
+ const { ctx } = setup();
232
+ ctx.wallet.listActions = async () => ({ totalActions: 0, actions: [] });
233
+ const filed = await fileMandalaDeploy.execute(ctx, {
234
+ txid: 'cd'.repeat(32),
235
+ });
236
+ expect(filed.error).toBe('deploy-not-found');
237
+ });
238
+ });
239
+ describe('deployMandala overlay', () => {
240
+ const realFetch = globalThis.fetch;
241
+ afterEach(() => {
242
+ globalThis.fetch = realFetch;
243
+ });
244
+ test('creates with noSend and submits to tm_mandala and tm_<txid> before internalizing', async () => {
245
+ const order = [];
246
+ const submits = [];
247
+ globalThis.fetch = (async (url, init) => {
248
+ order.push('submit');
249
+ submits.push({
250
+ url: String(url),
251
+ topics: new Headers(init?.headers).get('x-topics'),
252
+ });
253
+ return new Response(JSON.stringify({
254
+ [MANDALA_TOPIC]: { outputsToAdmit: [0], coinsToRetain: [] },
255
+ }), { status: 200 });
256
+ });
257
+ const { ctx, created, internalized } = setup();
258
+ const internalize = ctx.wallet.internalizeAction;
259
+ ctx.wallet.internalizeAction = async (args) => {
260
+ order.push('internalize');
261
+ return internalize(args);
262
+ };
263
+ const res = await deployMandala.execute(ctx, {
264
+ amount: '1000',
265
+ symbol: 'OVL',
266
+ overlay: 'https://overlay.example/',
267
+ });
268
+ expect(res.error).toBeUndefined();
269
+ expect(res.tokenId).toBe(`${res.txid}.0`);
270
+ expect(created[0].options?.noSend).toBe(true);
271
+ expect(submits).toEqual([
272
+ {
273
+ url: 'https://overlay.example/submit',
274
+ topics: `${MANDALA_TOPIC},tm_${res.txid}`,
275
+ },
276
+ ]);
277
+ expect(order).toEqual(['submit', 'internalize']);
278
+ expectFiling(created, internalized, res.txid);
279
+ });
280
+ });
281
+ //# sourceMappingURL=deploy.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deploy.test.js","sourceRoot":"","sources":["../../src/mandala/deploy.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Mandala (BRC-162) token actions: deploy, send to a BRC-169 handle
3
+ * (delivered per BRC-232), and receive from `mandala_inbox`.
4
+ */
5
+ export * from './deploy.js';
6
+ export * from './send.js';
7
+ export * from './receive.js';
8
+ export declare const mandalaActions: (import("../types.js").Action<import("./deploy.js").DeployMandalaInput, import("./deploy.js").DeployMandalaResponse> | import("../types.js").Action<import("./deploy.js").FileMandalaDeployInput, import("./deploy.js").FileMandalaDeployResponse> | import("../types.js").Action<import("./receive.js").SyncMandalaInboxInput, import("./receive.js").SyncMandalaInboxResult> | import("../types.js").Action<import("./send.js").SendMandalaInput, import("./send.js").SendMandalaResult>)[];
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/mandala/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,cAAc,aAAa,CAAA;AAC3B,cAAc,WAAW,CAAA;AACzB,cAAc,cAAc,CAAA;AAE5B,eAAO,MAAM,cAAc,+dAK1B,CAAA"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Mandala (BRC-162) token actions: deploy, send to a BRC-169 handle
3
+ * (delivered per BRC-232), and receive from `mandala_inbox`.
4
+ */
5
+ import { deployMandala, fileMandalaDeploy } from './deploy.js';
6
+ import { syncMandalaInbox } from './receive.js';
7
+ import { sendMandala } from './send.js';
8
+ export * from './deploy.js';
9
+ export * from './send.js';
10
+ export * from './receive.js';
11
+ export const mandalaActions = [
12
+ deployMandala,
13
+ fileMandalaDeploy,
14
+ sendMandala,
15
+ syncMandalaInbox,
16
+ ];
17
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/mandala/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAC9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAA;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAA;AAEvC,cAAc,aAAa,CAAA;AAC3B,cAAc,WAAW,CAAA;AACzB,cAAc,cAAc,CAAA;AAE5B,MAAM,CAAC,MAAM,cAAc,GAAG;IAC7B,aAAa;IACb,iBAAiB;IACjB,WAAW;IACX,gBAAgB;CAChB,CAAA"}
@@ -0,0 +1,58 @@
1
+ /**
2
+ * Collect BRC-232 transaction deliveries from the wallet's `mandala_inbox`.
3
+ *
4
+ * For each message listed (BRC-231 over BRC-104): decode the BRC-169 §7.3
5
+ * DAG-CBOR envelope, verify its §7.2 signature against `sender.identityKey`,
6
+ * decrypt the BRC-78 `content` with `wallet.decrypt`, check `contentHash`,
7
+ * parse the MIME entity, require `application/vnd.metanet.transaction+cbor`,
8
+ * decode the DAG-CBOR body and internalize its outputs:
9
+ *
10
+ * - `wallet payment` → `paymentRemittance { derivationPrefix,
11
+ * derivationSuffix, senderIdentityKey }`;
12
+ * - `basket insertion` under a `mandala <txid> <vout>` protocol → basket
13
+ * `mandala <txid> <vout>`, customInstructions = the derivation triple as given,
14
+ * labels `mandala` and `mandala <txid> <vout>`, after checking that the output's
15
+ * script names that token.
16
+ *
17
+ * A message is internalized whole or not at all, and acknowledged only after
18
+ * its internalize succeeds. Anything else (an unknown content type or
19
+ * protocolID, a token id mismatch, a bad signature, …) leaves the message
20
+ * unacknowledged and is reported. SPV is `internalizeAction`'s.
21
+ */
22
+ import { type WalletInterface } from '@bsv/sdk';
23
+ import { type InboxSkip } from '../metanet/inbox.js';
24
+ import type { Action } from '../types.js';
25
+ export interface SyncMandalaInboxInput {
26
+ /** MessageBox server URL (default: "https://messagebox.1sat.app") */
27
+ messageboxUrl?: string;
28
+ }
29
+ /** A message left in the box, and why. */
30
+ export type MandalaInboxSkip = InboxSkip;
31
+ /** A message internalized and acknowledged. */
32
+ export interface MandalaInboxReceipt {
33
+ messageId: string;
34
+ txid: string;
35
+ /** Tokens (BRC-36 deploy outpoints `<txid>.<vout>`) of the Mandala outputs received */
36
+ tokenIds: string[];
37
+ }
38
+ export interface SyncMandalaInboxResult {
39
+ received: MandalaInboxReceipt[];
40
+ /** Messages left unacknowledged */
41
+ skipped: MandalaInboxSkip[];
42
+ error?: string;
43
+ }
44
+ /**
45
+ * Internalize one BRC-232 delivery (the DAG-CBOR body of an
46
+ * `application/vnd.metanet.transaction+cbor` MIME entity), whole or not at
47
+ * all.
48
+ *
49
+ * @throws InboxSkipError when the body is malformed, names an unknown
50
+ * protocol or protocolID, or a token protocolID does not match the script;
51
+ * the internalize error when the wallet refuses it
52
+ */
53
+ export declare function internalizeTransactionDelivery(wallet: Pick<WalletInterface, 'internalizeAction'>, body: Uint8Array): Promise<{
54
+ txid: string;
55
+ tokenIds: string[];
56
+ }>;
57
+ export declare const syncMandalaInbox: Action<SyncMandalaInboxInput, SyncMandalaInboxResult>;
58
+ //# sourceMappingURL=receive.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"receive.d.ts","sourceRoot":"","sources":["../../src/mandala/receive.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAWH,OAAO,EAGN,KAAK,eAAe,EAEpB,MAAM,UAAU,CAAA;AAEjB,OAAO,EACN,KAAK,SAAS,EAId,MAAM,qBAAqB,CAAA;AAC5B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAGzC,MAAM,WAAW,qBAAqB;IACrC,qEAAqE;IACrE,aAAa,CAAC,EAAE,MAAM,CAAA;CACtB;AAED,0CAA0C;AAC1C,MAAM,MAAM,gBAAgB,GAAG,SAAS,CAAA;AAExC,+CAA+C;AAC/C,MAAM,WAAW,mBAAmB;IACnC,SAAS,EAAE,MAAM,CAAA;IACjB,IAAI,EAAE,MAAM,CAAA;IACZ,uFAAuF;IACvF,QAAQ,EAAE,MAAM,EAAE,CAAA;CAClB;AAED,MAAM,WAAW,sBAAsB;IACtC,QAAQ,EAAE,mBAAmB,EAAE,CAAA;IAC/B,mCAAmC;IACnC,OAAO,EAAE,gBAAgB,EAAE,CAAA;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAA;CACd;AAyHD;;;;;;;;GAQG;AACH,wBAAsB,8BAA8B,CACnD,MAAM,EAAE,IAAI,CAAC,eAAe,EAAE,mBAAmB,CAAC,EAClD,IAAI,EAAE,UAAU,GACd,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CAW/C;AAED,eAAO,MAAM,gBAAgB,EAAE,MAAM,CACpC,qBAAqB,EACrB,sBAAsB,CAqCtB,CAAA"}
@@ -0,0 +1,162 @@
1
+ /**
2
+ * Collect BRC-232 transaction deliveries from the wallet's `mandala_inbox`.
3
+ *
4
+ * For each message listed (BRC-231 over BRC-104): decode the BRC-169 §7.3
5
+ * DAG-CBOR envelope, verify its §7.2 signature against `sender.identityKey`,
6
+ * decrypt the BRC-78 `content` with `wallet.decrypt`, check `contentHash`,
7
+ * parse the MIME entity, require `application/vnd.metanet.transaction+cbor`,
8
+ * decode the DAG-CBOR body and internalize its outputs:
9
+ *
10
+ * - `wallet payment` → `paymentRemittance { derivationPrefix,
11
+ * derivationSuffix, senderIdentityKey }`;
12
+ * - `basket insertion` under a `mandala <txid> <vout>` protocol → basket
13
+ * `mandala <txid> <vout>`, customInstructions = the derivation triple as given,
14
+ * labels `mandala` and `mandala <txid> <vout>`, after checking that the output's
15
+ * script names that token.
16
+ *
17
+ * A message is internalized whole or not at all, and acknowledged only after
18
+ * its internalize succeeds. Anything else (an unknown content type or
19
+ * protocolID, a token id mismatch, a bad signature, …) leaves the message
20
+ * unacknowledged and is reported. SPV is `internalizeAction`'s.
21
+ */
22
+ import { Mandala } from '@1sat/templates';
23
+ import { MANDALA_INBOX, MANDALA_LABEL, mandalaTokenBasket, mandalaTokenLabel, parseMandalaName, } from '@1sat/types';
24
+ import { TRANSACTION_CBOR_CONTENT_TYPE, mediaType } from '@1sat/utils';
25
+ import { Beef, } from '@bsv/sdk';
26
+ import { decode as dagCborDecode } from '@ipld/dag-cbor';
27
+ import { InboxSkipError as Skip, bytesHex, processInbox, } from '../metanet/inbox.js';
28
+ import { mandalaTokenOf } from './tokenId.js';
29
+ const MANDALA_PREFIX = 'mandala ';
30
+ /** Build the internalize outputs and labels for one delivery, or throw Skip. */
31
+ function planInternalize(body) {
32
+ const txid = bytesHex(body.txid, 32, 'txid');
33
+ if (!(body.beef instanceof Uint8Array))
34
+ throw new Skip('beef must be bytes');
35
+ if (!Array.isArray(body.outputs) || body.outputs.length === 0) {
36
+ throw new Skip('outputs must be a non-empty array');
37
+ }
38
+ const beef = Beef.fromBinary(Array.from(body.beef));
39
+ const subject = beef.findTxid(txid)?.tx;
40
+ if (!subject)
41
+ throw new Skip(`beef does not contain ${txid}`);
42
+ const outputs = [];
43
+ const tokenIds = [];
44
+ const seen = new Set();
45
+ for (const entry of body.outputs) {
46
+ const outputIndex = entry.outputIndex;
47
+ if (typeof outputIndex !== 'number' ||
48
+ !subject.outputs[outputIndex] ||
49
+ seen.has(outputIndex)) {
50
+ throw new Skip(`bad outputIndex ${String(outputIndex)}`);
51
+ }
52
+ seen.add(outputIndex);
53
+ if (entry.protocol === 'wallet payment') {
54
+ if (typeof entry.derivationPrefix !== 'string' ||
55
+ typeof entry.derivationSuffix !== 'string') {
56
+ throw new Skip(`output ${outputIndex}: bad payment remittance`);
57
+ }
58
+ outputs.push({
59
+ outputIndex,
60
+ protocol: 'wallet payment',
61
+ paymentRemittance: {
62
+ derivationPrefix: entry.derivationPrefix,
63
+ derivationSuffix: entry.derivationSuffix,
64
+ senderIdentityKey: bytesHex(entry.senderIdentityKey, 33, 'senderIdentityKey'),
65
+ },
66
+ });
67
+ continue;
68
+ }
69
+ if (entry.protocol !== 'basket insertion') {
70
+ throw new Skip(`output ${outputIndex}: unknown protocol ${String(entry.protocol)}`);
71
+ }
72
+ const protocolID = entry.protocolID;
73
+ const name = Array.isArray(protocolID) ? protocolID[1] : undefined;
74
+ if (typeof name !== 'string' || !name.startsWith(MANDALA_PREFIX)) {
75
+ throw new Skip(`output ${outputIndex}: unknown protocolID ${JSON.stringify(protocolID)}`);
76
+ }
77
+ if (typeof entry.keyID !== 'string') {
78
+ throw new Skip(`output ${outputIndex}: keyID must be a string`);
79
+ }
80
+ const counterparty = bytesHex(entry.counterparty, 33, 'counterparty');
81
+ // The protocol names the token by its deploy outpoint; the script's
82
+ // BRC-162 id must name the same outpoint.
83
+ const named = parseMandalaName(name);
84
+ if (!named) {
85
+ throw new Skip(`output ${outputIndex}: malformed Mandala protocol ${name}`);
86
+ }
87
+ const tokenId = `${named.txid}.${named.vout}`;
88
+ const token = Mandala.decode(subject.outputs[outputIndex].lockingScript);
89
+ const scriptTokenId = token
90
+ ? mandalaTokenOf(token, txid, outputIndex)
91
+ : undefined;
92
+ if (scriptTokenId === undefined || scriptTokenId !== tokenId) {
93
+ throw new Skip(`output ${outputIndex}: token mismatch (protocolID ${tokenId}, script ${scriptTokenId ?? 'none'})`);
94
+ }
95
+ outputs.push({
96
+ outputIndex,
97
+ protocol: 'basket insertion',
98
+ insertionRemittance: {
99
+ basket: mandalaTokenBasket(tokenId),
100
+ customInstructions: JSON.stringify({
101
+ protocolID,
102
+ keyID: entry.keyID,
103
+ counterparty,
104
+ }),
105
+ },
106
+ });
107
+ if (!tokenIds.includes(tokenId))
108
+ tokenIds.push(tokenId);
109
+ }
110
+ const labels = tokenIds.length
111
+ ? [MANDALA_LABEL, ...tokenIds.map(mandalaTokenLabel)]
112
+ : [];
113
+ return { txid, tx: beef.toBinaryAtomic(txid), outputs, labels, tokenIds };
114
+ }
115
+ /**
116
+ * Internalize one BRC-232 delivery (the DAG-CBOR body of an
117
+ * `application/vnd.metanet.transaction+cbor` MIME entity), whole or not at
118
+ * all.
119
+ *
120
+ * @throws InboxSkipError when the body is malformed, names an unknown
121
+ * protocol or protocolID, or a token protocolID does not match the script;
122
+ * the internalize error when the wallet refuses it
123
+ */
124
+ export async function internalizeTransactionDelivery(wallet, body) {
125
+ const plan = planInternalize(dagCborDecode(body));
126
+ await wallet.internalizeAction({
127
+ tx: plan.tx,
128
+ outputs: plan.outputs,
129
+ ...(plan.labels.length && { labels: plan.labels }),
130
+ description: plan.tokenIds.length
131
+ ? 'Receive Mandala tokens'
132
+ : 'Receive delivered outputs',
133
+ });
134
+ return { txid: plan.txid, tokenIds: plan.tokenIds };
135
+ }
136
+ export const syncMandalaInbox = {
137
+ meta: {
138
+ name: 'syncMandalaInbox',
139
+ description: 'Collect BRC-232 transaction deliveries (Mandala tokens, BRC-29 payments) from the mandala_inbox message box and internalize them',
140
+ category: 'sync',
141
+ inputSchema: {
142
+ type: 'object',
143
+ properties: {
144
+ messageboxUrl: {
145
+ type: 'string',
146
+ description: 'MessageBox server URL (default: "https://messagebox.1sat.app")',
147
+ },
148
+ },
149
+ },
150
+ requiresServices: false,
151
+ },
152
+ async execute(ctx, input) {
153
+ return processInbox(ctx.wallet, input.messageboxUrl, MANDALA_INBOX, async ({ entity }, msg) => {
154
+ if (mediaType(entity.contentType) !== TRANSACTION_CBOR_CONTENT_TYPE) {
155
+ throw new Skip(`unsupported content type ${entity.contentType}`);
156
+ }
157
+ const { txid, tokenIds } = await internalizeTransactionDelivery(ctx.wallet, entity.body);
158
+ return { messageId: msg.messageId, txid, tokenIds };
159
+ });
160
+ },
161
+ };
162
+ //# sourceMappingURL=receive.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"receive.js","sourceRoot":"","sources":["../../src/mandala/receive.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,74 @@
1
+ /**
2
+ * Mandala (BRC-162) send to a BRC-169 handle, delivered per BRC-232.
3
+ *
4
+ * 1. Resolve the handle (`resolveHandle`): identity key + messagebox.
5
+ * 2. When no single token output in `mandala <txid> <vout>` holds exactly `amount`,
6
+ * split first: an ordinary, broadcast action spending token outputs into
7
+ * an exact-`amount` output and a remainder, both back to the wallet under
8
+ * `mandalaProtocol(tokenId)` in the token's basket.
9
+ * 3. The protected send: one `createAction` spending only the exact output,
10
+ * with one output, the recipient's token output, locked to the key
11
+ * derived under `mandalaProtocol(tokenId)` with keyID
12
+ * `<derivationPrefix> <derivationSuffix>` (fresh random base64) and
13
+ * counterparty = the recipient. `noSend`, labels `mandala`,
14
+ * `mandala <txid> <vout>` and `p nosend expiry seconds <n>` (BRC-177; the wallet
15
+ * funds it). It is not broadcast: the recipient broadcasts by
16
+ * internalizing (BRC-169 §6.1, BRC-232 rule 4).
17
+ * 4. Delivery: a signed BRC-169 §7.3 envelope (DAG-CBOR, BRC-231 body over
18
+ * BRC-104) to the resolved messagebox, box `mandala_inbox`, `payment:
19
+ * null`. `content` is BRC-78 encryption (via `wallet.encrypt`) of a MIME
20
+ * entity of type `application/vnd.metanet.transaction+cbor` whose DAG-CBOR
21
+ * body is the BRC-232 delivery `{ txid, beef, outputs: [ basket insertion
22
+ * ] }`; `contentHash` is the SHA-256 of the MIME bytes.
23
+ *
24
+ * When delivery fails the result carries the error with `txid` and `tx`, so
25
+ * the caller can retry delivery or `abortAction` the send.
26
+ */
27
+ import { type WalletProtocol } from '@bsv/sdk';
28
+ import type { Action } from '../types.js';
29
+ export interface SendMandalaInput {
30
+ /** Token: the deploy outpoint, BRC-36 `<txid>.<vout>` (`<txid>_<vout>` accepted) */
31
+ tokenId: string;
32
+ /** Amount in raw units */
33
+ amount: bigint | string;
34
+ /** BRC-169 handle: `@handle@domain` or `handle@domain` */
35
+ destination: {
36
+ handle: string;
37
+ };
38
+ /**
39
+ * BRC-177 `nosend expiry seconds` for the protected send (default
40
+ * {@link METANET_SEND_EXPIRY_SECONDS}, one year).
41
+ */
42
+ expirySeconds?: number;
43
+ /** Optional free text carried as the BRC-232 `memo` */
44
+ memo?: string;
45
+ }
46
+ export interface SendMandalaResult {
47
+ txid?: string;
48
+ /** Atomic BEEF of the send */
49
+ tx?: number[];
50
+ /** `envelope`: BRC-169 envelope to the handle's messagebox, not broadcast */
51
+ delivered?: 'envelope';
52
+ /** Messagebox message id */
53
+ messageId?: string;
54
+ error?: string;
55
+ }
56
+ /** A BRC-232 `basket insertion` output entry. */
57
+ export interface MandalaDeliveryOutput {
58
+ outputIndex: number;
59
+ protocol: 'basket insertion';
60
+ protocolID: WalletProtocol;
61
+ keyID: string;
62
+ /** bstr(33): the key the recipient derives against (the sender's identity) */
63
+ counterparty: Uint8Array;
64
+ }
65
+ /** The BRC-232 DAG-CBOR body a Mandala send delivers. */
66
+ export interface MandalaDeliveryBody {
67
+ memo?: string;
68
+ /** bstr(32), display byte order (as in the BRC-95 Atomic BEEF header) */
69
+ txid: Uint8Array;
70
+ beef: Uint8Array;
71
+ outputs: MandalaDeliveryOutput[];
72
+ }
73
+ export declare const sendMandala: Action<SendMandalaInput, SendMandalaResult>;
74
+ //# sourceMappingURL=send.d.ts.map