@1sat/actions 0.0.114 → 0.0.116

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 (40) hide show
  1. package/dist/constants.d.ts +1 -1
  2. package/dist/constants.d.ts.map +1 -1
  3. package/dist/constants.js +1 -1
  4. package/dist/constants.js.map +1 -1
  5. package/dist/cosign/finalize.d.ts +15 -0
  6. package/dist/cosign/finalize.d.ts.map +1 -0
  7. package/dist/cosign/finalize.js +123 -0
  8. package/dist/cosign/finalize.js.map +1 -0
  9. package/dist/cosign/index.d.ts +15 -0
  10. package/dist/cosign/index.d.ts.map +1 -0
  11. package/dist/cosign/index.js +15 -0
  12. package/dist/cosign/index.js.map +1 -0
  13. package/dist/cosign/prepare.d.ts +21 -0
  14. package/dist/cosign/prepare.d.ts.map +1 -0
  15. package/dist/cosign/prepare.js +282 -0
  16. package/dist/cosign/prepare.js.map +1 -0
  17. package/dist/cosign/types.d.ts +171 -0
  18. package/dist/cosign/types.d.ts.map +1 -0
  19. package/dist/cosign/types.js +37 -0
  20. package/dist/cosign/types.js.map +1 -0
  21. package/dist/index.d.ts +1 -0
  22. package/dist/index.d.ts.map +1 -1
  23. package/dist/index.js +2 -0
  24. package/dist/index.js.map +1 -1
  25. package/dist/inscriptions/index.d.ts +3 -0
  26. package/dist/inscriptions/index.d.ts.map +1 -1
  27. package/dist/inscriptions/index.js +30 -27
  28. package/dist/inscriptions/index.js.map +1 -1
  29. package/dist/tokens/index.d.ts +80 -7
  30. package/dist/tokens/index.d.ts.map +1 -1
  31. package/dist/tokens/index.js +585 -41
  32. package/dist/tokens/index.js.map +1 -1
  33. package/dist/utils/internalizeBeef.d.ts.map +1 -1
  34. package/dist/utils/internalizeBeef.js +2 -1
  35. package/dist/utils/internalizeBeef.js.map +1 -1
  36. package/dist/utils/resolveDestination.d.ts +39 -0
  37. package/dist/utils/resolveDestination.d.ts.map +1 -0
  38. package/dist/utils/resolveDestination.js +43 -0
  39. package/dist/utils/resolveDestination.js.map +1 -0
  40. package/package.json +3 -3
@@ -1,2 +1,2 @@
1
- export { BAP_BASKET, BAP_BITCOM_ADDRESS, BAP_KEY_ID, BAP_PROTOCOL_ID, BSV21_BASKET, BSV21_FEE_SATS, BSV21_PROTOCOL, EXCHANGE_RATE_CACHE_TTL, FUNDING_BASKET, LOCK_BASKET, LOCK_PREFIX, LOCK_SUFFIX, MAX_INSCRIPTION_BYTES, MESSAGE_SIGNING_PROTOCOL, ONESAT_MAINNET_CONTENT_URL, ONESAT_MAINNET_URL, ONESAT_PROTOCOL, ONESAT_TESTNET_CONTENT_URL, ONESAT_TESTNET_URL, OPNS_BASKET, ORDINALS_BASKET, BSOCIAL_BASKET, SIGMA_BASKET, ORD_LOCK_PREFIX, ORD_LOCK_SUFFIX, WOC_MAINNET_URL, WOC_TESTNET_URL, } from '@1sat/types';
1
+ export { BAP_BASKET, BAP_BITCOM_ADDRESS, BAP_KEY_ID, BAP_PROTOCOL_ID, BSV21_AUTH_BASKET, BSV21_BASKET, BSV21_DEPLOY_FUNDING_BASKET, BSV21_FEE_SATS, BSV21_PROTOCOL, EXCHANGE_RATE_CACHE_TTL, FUNDING_BASKET, LOCK_BASKET, LOCK_PREFIX, LOCK_SUFFIX, MAX_INSCRIPTION_BYTES, MESSAGE_SIGNING_PROTOCOL, ONESAT_MAINNET_CONTENT_URL, ONESAT_MAINNET_URL, ONESAT_PROTOCOL, ONESAT_TESTNET_CONTENT_URL, ONESAT_TESTNET_URL, OPNS_BASKET, ORDINALS_BASKET, BSOCIAL_BASKET, SIGMA_BASKET, ORD_LOCK_PREFIX, ORD_LOCK_SUFFIX, WOC_MAINNET_URL, WOC_TESTNET_URL, } from '@1sat/types';
2
2
  //# sourceMappingURL=constants.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,UAAU,EACV,kBAAkB,EAClB,UAAU,EACV,eAAe,EACf,YAAY,EACZ,cAAc,EACd,cAAc,EACd,uBAAuB,EACvB,cAAc,EACd,WAAW,EACX,WAAW,EACX,WAAW,EACX,qBAAqB,EACrB,wBAAwB,EACxB,0BAA0B,EAC1B,kBAAkB,EAClB,eAAe,EACf,0BAA0B,EAC1B,kBAAkB,EAClB,WAAW,EACX,eAAe,EACf,cAAc,EACd,YAAY,EACZ,eAAe,EACf,eAAe,EACf,eAAe,EACf,eAAe,GACf,MAAM,aAAa,CAAA"}
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,UAAU,EACV,kBAAkB,EAClB,UAAU,EACV,eAAe,EACf,iBAAiB,EACjB,YAAY,EACZ,2BAA2B,EAC3B,cAAc,EACd,cAAc,EACd,uBAAuB,EACvB,cAAc,EACd,WAAW,EACX,WAAW,EACX,WAAW,EACX,qBAAqB,EACrB,wBAAwB,EACxB,0BAA0B,EAC1B,kBAAkB,EAClB,eAAe,EACf,0BAA0B,EAC1B,kBAAkB,EAClB,WAAW,EACX,eAAe,EACf,cAAc,EACd,YAAY,EACZ,eAAe,EACf,eAAe,EACf,eAAe,EACf,eAAe,GACf,MAAM,aAAa,CAAA"}
package/dist/constants.js CHANGED
@@ -1,2 +1,2 @@
1
- export { BAP_BASKET, BAP_BITCOM_ADDRESS, BAP_KEY_ID, BAP_PROTOCOL_ID, BSV21_BASKET, BSV21_FEE_SATS, BSV21_PROTOCOL, EXCHANGE_RATE_CACHE_TTL, FUNDING_BASKET, LOCK_BASKET, LOCK_PREFIX, LOCK_SUFFIX, MAX_INSCRIPTION_BYTES, MESSAGE_SIGNING_PROTOCOL, ONESAT_MAINNET_CONTENT_URL, ONESAT_MAINNET_URL, ONESAT_PROTOCOL, ONESAT_TESTNET_CONTENT_URL, ONESAT_TESTNET_URL, OPNS_BASKET, ORDINALS_BASKET, BSOCIAL_BASKET, SIGMA_BASKET, ORD_LOCK_PREFIX, ORD_LOCK_SUFFIX, WOC_MAINNET_URL, WOC_TESTNET_URL, } from '@1sat/types';
1
+ export { BAP_BASKET, BAP_BITCOM_ADDRESS, BAP_KEY_ID, BAP_PROTOCOL_ID, BSV21_AUTH_BASKET, BSV21_BASKET, BSV21_DEPLOY_FUNDING_BASKET, BSV21_FEE_SATS, BSV21_PROTOCOL, EXCHANGE_RATE_CACHE_TTL, FUNDING_BASKET, LOCK_BASKET, LOCK_PREFIX, LOCK_SUFFIX, MAX_INSCRIPTION_BYTES, MESSAGE_SIGNING_PROTOCOL, ONESAT_MAINNET_CONTENT_URL, ONESAT_MAINNET_URL, ONESAT_PROTOCOL, ONESAT_TESTNET_CONTENT_URL, ONESAT_TESTNET_URL, OPNS_BASKET, ORDINALS_BASKET, BSOCIAL_BASKET, SIGMA_BASKET, ORD_LOCK_PREFIX, ORD_LOCK_SUFFIX, WOC_MAINNET_URL, WOC_TESTNET_URL, } from '@1sat/types';
2
2
  //# sourceMappingURL=constants.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,UAAU,EACV,kBAAkB,EAClB,UAAU,EACV,eAAe,EACf,YAAY,EACZ,cAAc,EACd,cAAc,EACd,uBAAuB,EACvB,cAAc,EACd,WAAW,EACX,WAAW,EACX,WAAW,EACX,qBAAqB,EACrB,wBAAwB,EACxB,0BAA0B,EAC1B,kBAAkB,EAClB,eAAe,EACf,0BAA0B,EAC1B,kBAAkB,EAClB,WAAW,EACX,eAAe,EACf,cAAc,EACd,YAAY,EACZ,eAAe,EACf,eAAe,EACf,eAAe,EACf,eAAe,GACf,MAAM,aAAa,CAAA"}
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,UAAU,EACV,kBAAkB,EAClB,UAAU,EACV,eAAe,EACf,iBAAiB,EACjB,YAAY,EACZ,2BAA2B,EAC3B,cAAc,EACd,cAAc,EACd,uBAAuB,EACvB,cAAc,EACd,WAAW,EACX,WAAW,EACX,WAAW,EACX,qBAAqB,EACrB,wBAAwB,EACxB,0BAA0B,EAC1B,kBAAkB,EAClB,eAAe,EACf,0BAA0B,EAC1B,kBAAkB,EAClB,WAAW,EACX,eAAe,EACf,cAAc,EACd,YAAY,EACZ,eAAe,EACf,eAAe,EACf,eAAe,EACf,eAAe,GACf,MAAM,aAAa,CAAA"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * finalizeCosignBsv21Transfer — request 2 of the cosigner-validated transfer flow.
3
+ *
4
+ * Sender returns owner-side signatures over the sighashes given out at prepare
5
+ * time. The cosigner adds its own signature for each cosign-wrapped input,
6
+ * assembles the full unlock <approverSig><ownerSig><ownerPubKey>, calls
7
+ * wallet.signAction to broadcast via its arcade broadcaster, then submits the
8
+ * resulting BEEF to the BSV21 overlay topic.
9
+ *
10
+ * Returns per-recipient delivery payloads — the cosigner backend dispatches
11
+ * these to recipients' MessageBoxes.
12
+ */
13
+ import { type FinalizeCosignBsv21TransferInput, type FinalizeCosignBsv21TransferResult } from './types';
14
+ export declare function finalizeCosignBsv21Transfer(input: FinalizeCosignBsv21TransferInput): Promise<FinalizeCosignBsv21TransferResult>;
15
+ //# sourceMappingURL=finalize.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finalize.d.ts","sourceRoot":"","sources":["../../src/cosign/finalize.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH,OAAO,EAIN,KAAK,gCAAgC,EACrC,KAAK,iCAAiC,EACtC,MAAM,SAAS,CAAA;AAEhB,wBAAsB,2BAA2B,CAChD,KAAK,EAAE,gCAAgC,GACrC,OAAO,CAAC,iCAAiC,CAAC,CA0I5C"}
@@ -0,0 +1,123 @@
1
+ /**
2
+ * finalizeCosignBsv21Transfer — request 2 of the cosigner-validated transfer flow.
3
+ *
4
+ * Sender returns owner-side signatures over the sighashes given out at prepare
5
+ * time. The cosigner adds its own signature for each cosign-wrapped input,
6
+ * assembles the full unlock <approverSig><ownerSig><ownerPubKey>, calls
7
+ * wallet.signAction to broadcast via its arcade broadcaster, then submits the
8
+ * resulting BEEF to the BSV21 overlay topic.
9
+ *
10
+ * Returns per-recipient delivery payloads — the cosigner backend dispatches
11
+ * these to recipients' MessageBoxes.
12
+ */
13
+ import { Cosign } from '@1sat/templates';
14
+ import { Utils } from '@bsv/sdk';
15
+ import { COSIGN_DEFAULT_SIGHASH, COSIGN_PROTOCOL_ID, } from './types';
16
+ export async function finalizeCosignBsv21Transfer(input) {
17
+ const { wallet, services, sessionId, ownerSigs, sessionStore } = input;
18
+ // ----------------------------------------------------------------------
19
+ // 1. Load the session.
20
+ // ----------------------------------------------------------------------
21
+ const session = await sessionStore.load(sessionId);
22
+ if (!session) {
23
+ throw new Error(`finalizeCosignBsv21Transfer: unknown sessionId ${sessionId}`);
24
+ }
25
+ // ----------------------------------------------------------------------
26
+ // 2. Index ownerSigs by inputIndex; ensure every cosign-wrapped input
27
+ // has a matching owner sig.
28
+ // ----------------------------------------------------------------------
29
+ const ownerSigByIndex = new Map();
30
+ for (const os of ownerSigs) {
31
+ ownerSigByIndex.set(os.inputIndex, os);
32
+ }
33
+ for (const meta of session.cosignerInputs) {
34
+ if (!ownerSigByIndex.has(meta.inputIndex)) {
35
+ throw new Error(`finalizeCosignBsv21Transfer: missing ownerSig for input ${meta.inputIndex}`);
36
+ }
37
+ }
38
+ // ----------------------------------------------------------------------
39
+ // 3. For each cosign-wrapped input: cosigner signs the same sighash that
40
+ // the owner signed (captured at prepare time), then assembles the
41
+ // full unlock = <approverSig> <ownerSig> <ownerPubKey>.
42
+ // ----------------------------------------------------------------------
43
+ const spends = {};
44
+ for (const meta of session.cosignerInputs) {
45
+ const ownerSig = ownerSigByIndex.get(meta.inputIndex);
46
+ const ownerSigDER = Utils.toArray(ownerSig.sigHex, 'hex');
47
+ const ownerPubKeyBytes = Utils.toArray(ownerSig.ownerPubkeyHex, 'hex');
48
+ if (ownerPubKeyBytes.length !== 33) {
49
+ throw new Error(`finalizeCosignBsv21Transfer: input ${meta.inputIndex} ownerPubkey is not 33-byte compressed`);
50
+ }
51
+ // Cosigner signs the pinned sighash with BRC-29 derivation that
52
+ // matches its own role (counterparty=self, keyID=identity-marker).
53
+ // We use the cosigner's identity key directly (no per-tx derivation
54
+ // for the cosigner side — only the recipient address is BRC-29-derived).
55
+ const sighashBytes = Utils.toArray(meta.sighashHex, 'hex');
56
+ const { signature: cosignerSigDER } = await wallet.createSignature({
57
+ protocolID: COSIGN_PROTOCOL_ID,
58
+ keyID: 'cosigner', // cosigner-side keyID; distinct from per-session destination keyIDs
59
+ counterparty: 'self',
60
+ hashToDirectlySign: sighashBytes,
61
+ });
62
+ // Owner unlock = <ownerSig+hashtype> <ownerPubKey>
63
+ const ownerUnlock = Cosign.ownerUnlock(ownerSigDER, COSIGN_DEFAULT_SIGHASH, ownerSig.ownerPubkeyHex);
64
+ // Full unlock = <cosignerSig+hashtype> <ownerSig+hashtype> <ownerPubKey>
65
+ const fullUnlock = Cosign.approverUnlock(Array.from(cosignerSigDER), COSIGN_DEFAULT_SIGHASH, ownerUnlock);
66
+ spends[meta.inputIndex] = {
67
+ unlockingScript: fullUnlock.toHex(),
68
+ };
69
+ }
70
+ // ----------------------------------------------------------------------
71
+ // 4. Sign the action — the wallet finalizes its funding-input sigs and
72
+ // broadcasts via its configured arcade broadcaster.
73
+ // ----------------------------------------------------------------------
74
+ const signed = await wallet.signAction({
75
+ reference: session.reference,
76
+ spends,
77
+ });
78
+ if (!signed.txid || !signed.tx) {
79
+ throw new Error('finalizeCosignBsv21Transfer: wallet.signAction did not return txid + tx');
80
+ }
81
+ const beef = Array.isArray(signed.tx) ? signed.tx : Array.from(signed.tx);
82
+ // ----------------------------------------------------------------------
83
+ // 5. Submit BEEF to the BSV21 overlay topic for admission.
84
+ // ----------------------------------------------------------------------
85
+ let overlayStatus = 'BROADCAST';
86
+ try {
87
+ const overlayResult = await services.overlay.submitBsv21(beef, session.tokenId);
88
+ overlayStatus = overlayResult.status ?? overlayStatus;
89
+ }
90
+ catch (err) {
91
+ // Overlay admission is recoverable — the tx is broadcast either way.
92
+ // Surface the failure but don't poison the response; the caller can
93
+ // retry overlay submission separately if needed.
94
+ console.warn(`[finalizeCosignBsv21Transfer] overlay submission failed for ${session.tokenId}:`, err);
95
+ }
96
+ // ----------------------------------------------------------------------
97
+ // 6. Build per-recipient delivery payloads.
98
+ // ----------------------------------------------------------------------
99
+ const recipients = session.destinations.map((d) => ({
100
+ identityKey: d.recipientIdentityKey,
101
+ vout: d.vout,
102
+ amount: d.amount,
103
+ customInstructions: JSON.stringify({
104
+ protocolID: COSIGN_PROTOCOL_ID,
105
+ keyID: session.sessionId,
106
+ counterparty: session.cosignerIdentityKey,
107
+ cosigner: session.cosignerIdentityKey,
108
+ type: 'cosign-bsv21',
109
+ tokenId: session.tokenId,
110
+ }),
111
+ }));
112
+ // ----------------------------------------------------------------------
113
+ // 7. Cleanup: drop the session record once finalized.
114
+ // ----------------------------------------------------------------------
115
+ await sessionStore.delete(sessionId);
116
+ return {
117
+ txid: signed.txid,
118
+ beef,
119
+ overlayStatus,
120
+ recipients,
121
+ };
122
+ }
123
+ //# sourceMappingURL=finalize.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finalize.js","sourceRoot":"","sources":["../../src/cosign/finalize.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Cosigner-validated BSV21 transfer actions.
3
+ *
4
+ * Two-request flow used by a cosigner backend:
5
+ * 1. {@link prepareCosignBsv21Transfer} — backend builds tx, returns sighashes
6
+ * 2. {@link finalizeCosignBsv21Transfer} — backend assembles full unlocks and broadcasts
7
+ *
8
+ * The {@link CosignSessionStore} interface lets the backend supply persistent
9
+ * session storage (e.g. Postgres). {@link InMemoryCosignSessionStore} is the
10
+ * default for tests + ephemeral demo usage.
11
+ */
12
+ export { COSIGN_DEFAULT_SIGHASH, COSIGN_PROTOCOL_ID, type CosignOwnerSig, type CosignRecipientPayload, type CosignSessionDestinationMeta, type CosignSessionInputMeta, type CosignSessionStore, type CosignTokenInput, type CosignTransferBurn, type CosignTransferDestination, type CosignTransferSession, type FinalizeCosignBsv21TransferInput, type FinalizeCosignBsv21TransferResult, InMemoryCosignSessionStore, type PrepareCosignBsv21TransferInput, type PrepareCosignBsv21TransferResult, } from './types';
13
+ export { prepareCosignBsv21Transfer } from './prepare';
14
+ export { finalizeCosignBsv21Transfer } from './finalize';
15
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cosign/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EACN,sBAAsB,EACtB,kBAAkB,EAClB,KAAK,cAAc,EACnB,KAAK,sBAAsB,EAC3B,KAAK,4BAA4B,EACjC,KAAK,sBAAsB,EAC3B,KAAK,kBAAkB,EACvB,KAAK,gBAAgB,EACrB,KAAK,kBAAkB,EACvB,KAAK,yBAAyB,EAC9B,KAAK,qBAAqB,EAC1B,KAAK,gCAAgC,EACrC,KAAK,iCAAiC,EACtC,0BAA0B,EAC1B,KAAK,+BAA+B,EACpC,KAAK,gCAAgC,GACrC,MAAM,SAAS,CAAA;AAChB,OAAO,EAAE,0BAA0B,EAAE,MAAM,WAAW,CAAA;AACtD,OAAO,EAAE,2BAA2B,EAAE,MAAM,YAAY,CAAA"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Cosigner-validated BSV21 transfer actions.
3
+ *
4
+ * Two-request flow used by a cosigner backend:
5
+ * 1. {@link prepareCosignBsv21Transfer} — backend builds tx, returns sighashes
6
+ * 2. {@link finalizeCosignBsv21Transfer} — backend assembles full unlocks and broadcasts
7
+ *
8
+ * The {@link CosignSessionStore} interface lets the backend supply persistent
9
+ * session storage (e.g. Postgres). {@link InMemoryCosignSessionStore} is the
10
+ * default for tests + ephemeral demo usage.
11
+ */
12
+ export { COSIGN_DEFAULT_SIGHASH, COSIGN_PROTOCOL_ID, InMemoryCosignSessionStore, } from './types';
13
+ export { prepareCosignBsv21Transfer } from './prepare';
14
+ export { finalizeCosignBsv21Transfer } from './finalize';
15
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cosign/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EACN,sBAAsB,EACtB,kBAAkB,EAYlB,0BAA0B,GAG1B,MAAM,SAAS,CAAA;AAChB,OAAO,EAAE,0BAA0B,EAAE,MAAM,WAAW,CAAA;AACtD,OAAO,EAAE,2BAA2B,EAAE,MAAM,YAAY,CAAA"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * prepareCosignBsv21Transfer — request 1 of the cosigner-validated transfer flow.
3
+ *
4
+ * The cosigner builds the tx from scratch using destination identity pubkeys
5
+ * (no user-supplied output scripts). This collapses construction risk: the
6
+ * sender can't smuggle a malformed cosign output, and the cosigner is the
7
+ * canonical source for derivation paths.
8
+ */
9
+ import { Transaction } from '@bsv/sdk';
10
+ import { type PrepareCosignBsv21TransferInput, type PrepareCosignBsv21TransferResult } from './types';
11
+ /** Estimated unlocking script length: <approverSig><ownerSig><ownerPubKey> = ~185 bytes. */
12
+ declare const COSIGN_UNLOCK_SCRIPT_LENGTH = 185;
13
+ export declare function prepareCosignBsv21Transfer(input: PrepareCosignBsv21TransferInput): Promise<PrepareCosignBsv21TransferResult>;
14
+ /**
15
+ * Compute the single-SHA256 sighash for a cosign-wrapped input, suitable for
16
+ * passing to ECDSA sign. The script interpreter applies the second SHA-256
17
+ * during verification (see @bsv/sdk's P2PKH unlock for the canonical pattern).
18
+ */
19
+ declare function computeCosignSighash(tx: Transaction, inputIndex: number): number[];
20
+ export { computeCosignSighash, COSIGN_UNLOCK_SCRIPT_LENGTH };
21
+ //# sourceMappingURL=prepare.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prepare.d.ts","sourceRoot":"","sources":["../../src/cosign/prepare.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EAON,WAAW,EAGX,MAAM,UAAU,CAAA;AACjB,OAAO,EAMN,KAAK,+BAA+B,EACpC,KAAK,gCAAgC,EACrC,MAAM,SAAS,CAAA;AAEhB,4FAA4F;AAC5F,QAAA,MAAM,2BAA2B,MAAM,CAAA;AAEvC,wBAAsB,0BAA0B,CAC/C,KAAK,EAAE,+BAA+B,GACpC,OAAO,CAAC,gCAAgC,CAAC,CA4Q3C;AAMD;;;;GAIG;AACH,iBAAS,oBAAoB,CAAC,EAAE,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,EAAE,CAgC3E;AAeD,OAAO,EAAE,oBAAoB,EAAE,2BAA2B,EAAE,CAAA"}
@@ -0,0 +1,282 @@
1
+ /**
2
+ * prepareCosignBsv21Transfer — request 1 of the cosigner-validated transfer flow.
3
+ *
4
+ * The cosigner builds the tx from scratch using destination identity pubkeys
5
+ * (no user-supplied output scripts). This collapses construction risk: the
6
+ * sender can't smuggle a malformed cosign output, and the cosigner is the
7
+ * canonical source for derivation paths.
8
+ */
9
+ import { BSV21, Cosign } from '@1sat/templates';
10
+ import { Beef, Hash, LockingScript, PublicKey, TransactionSignature, Utils, } from '@bsv/sdk';
11
+ import { COSIGN_DEFAULT_SIGHASH, COSIGN_PROTOCOL_ID, } from './types';
12
+ /** Estimated unlocking script length: <approverSig><ownerSig><ownerPubKey> = ~185 bytes. */
13
+ const COSIGN_UNLOCK_SCRIPT_LENGTH = 185;
14
+ export async function prepareCosignBsv21Transfer(input) {
15
+ const { wallet, tokenId, tokenInputs, inputBEEF, destinations, burns, senderIdentityKey, sessionStore, } = input;
16
+ if (tokenInputs.length === 0) {
17
+ throw new Error('prepareCosignBsv21Transfer: at least one tokenInput required');
18
+ }
19
+ if (destinations.length === 0 && (!burns || burns.length === 0)) {
20
+ throw new Error('prepareCosignBsv21Transfer: at least one destination or burn required');
21
+ }
22
+ // ----------------------------------------------------------------------
23
+ // Resolve cosigner identity (used as BRC-29 counterparty for derivations,
24
+ // and as the cosigner pubkey embedded in cosign locking scripts).
25
+ // ----------------------------------------------------------------------
26
+ const cosignerIdentity = await wallet.getPublicKey({ identityKey: true });
27
+ const cosignerIdentityKey = cosignerIdentity.publicKey;
28
+ // ----------------------------------------------------------------------
29
+ // Allocate a sessionId up front — used as keyID for BRC-29 derivations
30
+ // of every recipient's destination address. This means destinations in
31
+ // the same session share a keyID; recipients across sessions get fresh
32
+ // derivations.
33
+ // ----------------------------------------------------------------------
34
+ const sessionId = generateSessionId();
35
+ // ----------------------------------------------------------------------
36
+ // Decode inputBEEF and locate each token input's source output to extract
37
+ // its locking script (so we can pin sourceLockingScriptHex into the
38
+ // session for sighash computation at finalize time).
39
+ // ----------------------------------------------------------------------
40
+ const beef = Beef.fromBinary(inputBEEF);
41
+ const cosignerInputMetaPartial = [];
42
+ for (let i = 0; i < tokenInputs.length; i++) {
43
+ const { outpoint } = tokenInputs[i];
44
+ const [sourceTxid, voutStr] = outpoint.split('.');
45
+ const sourceVout = Number.parseInt(voutStr, 10);
46
+ if (!sourceTxid || Number.isNaN(sourceVout)) {
47
+ throw new Error(`prepareCosignBsv21Transfer: invalid outpoint "${outpoint}" — expected txid.vout`);
48
+ }
49
+ const btx = beef.findTxid(sourceTxid);
50
+ if (!btx?.tx) {
51
+ throw new Error(`prepareCosignBsv21Transfer: source tx ${sourceTxid} missing from inputBEEF`);
52
+ }
53
+ const sourceOutput = btx.tx.outputs[sourceVout];
54
+ if (!sourceOutput) {
55
+ throw new Error(`prepareCosignBsv21Transfer: source ${outpoint} has no output at vout ${sourceVout}`);
56
+ }
57
+ // Sanity-check: source must be a cosign-wrapped output.
58
+ const cosign = Cosign.decode(sourceOutput.lockingScript);
59
+ if (!cosign) {
60
+ throw new Error(`prepareCosignBsv21Transfer: source ${outpoint} is not cosign-wrapped`);
61
+ }
62
+ // And it must match this cosigner.
63
+ if (cosign.cosigner !== cosignerIdentityKey) {
64
+ throw new Error(`prepareCosignBsv21Transfer: source ${outpoint} cosigner pubkey ${cosign.cosigner} does not match this cosigner ${cosignerIdentityKey}`);
65
+ }
66
+ cosignerInputMetaPartial.push({
67
+ inputIndex: i, // assumed equal to position in cosigner's createAction inputs
68
+ sourceTxid,
69
+ sourceVout,
70
+ sourceLockingScriptHex: sourceOutput.lockingScript.toHex(),
71
+ sourceSatoshis: sourceOutput.satoshis ?? 1,
72
+ });
73
+ }
74
+ // ----------------------------------------------------------------------
75
+ // Build cosign-wrapped output scripts for each destination by deriving
76
+ // the recipient's destination pubkey via BRC-29.
77
+ // ----------------------------------------------------------------------
78
+ const destinationMetas = [];
79
+ const outputs = [];
80
+ for (const dest of destinations) {
81
+ const amountBig = BigInt(dest.amount);
82
+ if (amountBig <= 0n) {
83
+ throw new Error(`prepareCosignBsv21Transfer: destination amount must be positive`);
84
+ }
85
+ // Derive the recipient's destination pubkey from cosigner's perspective.
86
+ // counterparty = recipient's identityKey (BRC-29 sender→recipient direction).
87
+ const { publicKey: recipientDestPubKey } = await wallet.getPublicKey({
88
+ protocolID: COSIGN_PROTOCOL_ID,
89
+ keyID: sessionId,
90
+ counterparty: dest.recipientIdentityKey,
91
+ forSelf: false,
92
+ });
93
+ const address = PublicKey.fromString(recipientDestPubKey).toAddress();
94
+ const inscription = BSV21.transfer(tokenId, amountBig);
95
+ // BSV21.lock takes the suffix locking script (the Cosign script) and
96
+ // wraps it as the script-suffix of the inscription envelope.
97
+ const cosignSuffix = Cosign.lock(address, cosignerIdentityKey);
98
+ const lockingScript = inscription.lock(cosignSuffix);
99
+ const vout = outputs.length;
100
+ destinationMetas.push({
101
+ vout,
102
+ recipientIdentityKey: dest.recipientIdentityKey,
103
+ amount: dest.amount,
104
+ address,
105
+ });
106
+ outputs.push({
107
+ lockingScript: lockingScript.toHex(),
108
+ satoshis: 1,
109
+ outputDescription: `Cosign-wrapped BSV21 transfer to ${dest.recipientIdentityKey.slice(0, 8)}…`,
110
+ });
111
+ }
112
+ // ----------------------------------------------------------------------
113
+ // Burn outputs — plain BSV21 op=burn, no cosign suffix (burn outputs are
114
+ // not meant to be spent further as token-bearing UTXOs).
115
+ // ----------------------------------------------------------------------
116
+ const burnMetas = [];
117
+ if (burns) {
118
+ for (const burn of burns) {
119
+ const amountBig = BigInt(burn.amount);
120
+ if (amountBig <= 0n) {
121
+ throw new Error('prepareCosignBsv21Transfer: burn amount must be positive');
122
+ }
123
+ const burnInscription = BSV21.burn(tokenId, amountBig);
124
+ // Lock with no suffix — the inscription itself is the entire output.
125
+ const lockingScript = burnInscription.lock();
126
+ const vout = outputs.length;
127
+ burnMetas.push({ vout, amount: burn.amount });
128
+ outputs.push({
129
+ lockingScript: lockingScript.toHex(),
130
+ satoshis: 1,
131
+ outputDescription: `BSV21 burn ${burn.amount}`,
132
+ });
133
+ }
134
+ }
135
+ // ----------------------------------------------------------------------
136
+ // Build createAction inputs — external token inputs with
137
+ // unlockingScriptLength only (the unlock comes at signAction time).
138
+ // ----------------------------------------------------------------------
139
+ const createActionInputs = tokenInputs.map((ti) => ({
140
+ outpoint: ti.outpoint,
141
+ inputDescription: 'Cosign-wrapped BSV21 token input',
142
+ unlockingScriptLength: COSIGN_UNLOCK_SCRIPT_LENGTH,
143
+ }));
144
+ // ----------------------------------------------------------------------
145
+ // Run createAction(signAndProcess: false) on the cosigner's wallet.
146
+ // Wallet auto-funds + adds change, returns signableTransaction.
147
+ // ----------------------------------------------------------------------
148
+ const actionResult = await wallet.createAction({
149
+ description: `Cosign BSV21 transfer (token ${tokenId.slice(0, 8)}…)`,
150
+ inputs: createActionInputs,
151
+ inputBEEF,
152
+ outputs,
153
+ options: {
154
+ signAndProcess: false,
155
+ randomizeOutputs: false,
156
+ },
157
+ });
158
+ const signable = actionResult.signableTransaction;
159
+ if (!signable?.tx || !signable.reference) {
160
+ throw new Error('prepareCosignBsv21Transfer: wallet.createAction did not return a signableTransaction');
161
+ }
162
+ // ----------------------------------------------------------------------
163
+ // Decode the signable BEEF to find the actual tx, then compute sighashes
164
+ // for each cosign input over the *final* tx structure (so SIGHASH_ALL
165
+ // is committing to the cosigner's funding inputs + change).
166
+ // ----------------------------------------------------------------------
167
+ const signableBeef = Beef.fromBinary(signable.tx);
168
+ const tipTxids = signableBeef.txs
169
+ .filter((b) => b.tx)
170
+ .map((b) => b.tx.id('hex'));
171
+ const finalTxid = tipTxids[tipTxids.length - 1];
172
+ const tipBtx = signableBeef.findTxid(finalTxid);
173
+ if (!tipBtx?.tx) {
174
+ throw new Error('prepareCosignBsv21Transfer: signable BEEF has no tip tx');
175
+ }
176
+ const finalTx = tipBtx.tx;
177
+ // Wire source transactions back into inputs so sighash format works.
178
+ for (const inp of finalTx.inputs) {
179
+ if (!inp.sourceTransaction && inp.sourceTXID) {
180
+ const src = signableBeef.findTxid(inp.sourceTXID) ?? beef.findTxid(inp.sourceTXID);
181
+ if (src?.tx)
182
+ inp.sourceTransaction = src.tx;
183
+ }
184
+ }
185
+ // Match each token input's outpoint to the corresponding input index in
186
+ // the final tx (defensive — wallets may reorder).
187
+ const cosignerInputs = [];
188
+ const sighashes = [];
189
+ for (const meta of cosignerInputMetaPartial) {
190
+ const idx = finalTx.inputs.findIndex((inp) => (inp.sourceTXID ?? inp.sourceTransaction?.id('hex')) ===
191
+ meta.sourceTxid && inp.sourceOutputIndex === meta.sourceVout);
192
+ if (idx < 0) {
193
+ throw new Error(`prepareCosignBsv21Transfer: cannot find input ${meta.sourceTxid}.${meta.sourceVout} in built tx`);
194
+ }
195
+ const sighash = computeCosignSighash(finalTx, idx);
196
+ const sighashHex = Utils.toHex(sighash);
197
+ cosignerInputs.push({
198
+ inputIndex: idx,
199
+ sourceTxid: meta.sourceTxid,
200
+ sourceVout: meta.sourceVout,
201
+ sourceLockingScriptHex: meta.sourceLockingScriptHex,
202
+ sourceSatoshis: meta.sourceSatoshis,
203
+ sighashHex,
204
+ });
205
+ sighashes.push({ inputIndex: idx, sighashHex });
206
+ }
207
+ // ----------------------------------------------------------------------
208
+ // Persist the session.
209
+ // ----------------------------------------------------------------------
210
+ const session = {
211
+ sessionId,
212
+ reference: signable.reference,
213
+ signableBeef: Array.from(signable.tx),
214
+ tokenId,
215
+ senderIdentityKey,
216
+ cosignerIdentityKey,
217
+ cosignerInputs,
218
+ destinations: destinationMetas,
219
+ burns: burnMetas,
220
+ createdAt: Date.now(),
221
+ };
222
+ await sessionStore.save(session);
223
+ return {
224
+ sessionId,
225
+ signableBeef: Array.from(signable.tx),
226
+ reference: signable.reference,
227
+ sighashes,
228
+ };
229
+ }
230
+ // ============================================================================
231
+ // Helpers
232
+ // ============================================================================
233
+ /**
234
+ * Compute the single-SHA256 sighash for a cosign-wrapped input, suitable for
235
+ * passing to ECDSA sign. The script interpreter applies the second SHA-256
236
+ * during verification (see @bsv/sdk's P2PKH unlock for the canonical pattern).
237
+ */
238
+ function computeCosignSighash(tx, inputIndex) {
239
+ const inp = tx.inputs[inputIndex];
240
+ const sourceLockingScript = inp.sourceTransaction?.outputs[inp.sourceOutputIndex]?.lockingScript;
241
+ if (!sourceLockingScript) {
242
+ throw new Error(`computeCosignSighash: missing source locking script for input ${inputIndex}`);
243
+ }
244
+ const sourceSatoshis = inp.sourceTransaction?.outputs[inp.sourceOutputIndex]?.satoshis ?? 1;
245
+ const sourceTXID = inp.sourceTXID ?? inp.sourceTransaction?.id('hex') ?? '';
246
+ const preimage = TransactionSignature.format({
247
+ sourceTXID,
248
+ sourceOutputIndex: inp.sourceOutputIndex,
249
+ sourceSatoshis,
250
+ transactionVersion: tx.version,
251
+ otherInputs: tx.inputs
252
+ .filter((_, i) => i !== inputIndex)
253
+ .map((other) => ({
254
+ sourceTXID: other.sourceTXID ?? other.sourceTransaction?.id('hex') ?? '',
255
+ sourceOutputIndex: other.sourceOutputIndex,
256
+ sequence: other.sequence ?? 0xffffffff,
257
+ })),
258
+ inputIndex,
259
+ outputs: tx.outputs,
260
+ inputSequence: inp.sequence ?? 0xffffffff,
261
+ subscript: sourceLockingScript,
262
+ lockTime: tx.lockTime,
263
+ scope: COSIGN_DEFAULT_SIGHASH,
264
+ });
265
+ return Hash.sha256(preimage);
266
+ }
267
+ /** Generates a random session id (UUIDv4-like, no external dep). */
268
+ function generateSessionId() {
269
+ const random = new Uint8Array(16);
270
+ crypto.getRandomValues(random);
271
+ random[6] = (random[6] & 0x0f) | 0x40;
272
+ random[8] = (random[8] & 0x3f) | 0x80;
273
+ const hex = Array.from(random)
274
+ .map((b) => b.toString(16).padStart(2, '0'))
275
+ .join('');
276
+ return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20, 32)}`;
277
+ }
278
+ // Internal export for finalize.ts to reuse.
279
+ export { computeCosignSighash, COSIGN_UNLOCK_SCRIPT_LENGTH };
280
+ // Suppress unused-import warning for LockingScript when this file is built standalone.
281
+ void LockingScript;
282
+ //# sourceMappingURL=prepare.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prepare.js","sourceRoot":"","sources":["../../src/cosign/prepare.ts"],"names":[],"mappings":"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"}