@bitgo-beta/utxo-core 1.8.1-beta.48 → 1.8.1-beta.480

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 (79) hide show
  1. package/dist/src/bip322/index.d.ts +5 -0
  2. package/dist/src/bip322/index.d.ts.map +1 -0
  3. package/dist/src/bip322/index.js +21 -0
  4. package/dist/src/bip322/toSign.d.ts +25 -0
  5. package/dist/src/bip322/toSign.d.ts.map +1 -0
  6. package/dist/src/bip322/toSign.js +126 -0
  7. package/dist/src/bip322/toSpend.d.ts +22 -0
  8. package/dist/src/bip322/toSpend.d.ts.map +1 -0
  9. package/dist/src/bip322/toSpend.js +72 -0
  10. package/dist/src/bip322/utils.d.ts +18 -0
  11. package/dist/src/bip322/utils.d.ts.map +1 -0
  12. package/dist/src/bip322/utils.js +115 -0
  13. package/dist/src/bip322/verify.d.ts +12 -0
  14. package/dist/src/bip322/verify.d.ts.map +1 -0
  15. package/dist/src/bip322/verify.js +115 -0
  16. package/dist/src/bip32utils.d.ts +16 -0
  17. package/dist/src/bip32utils.d.ts.map +1 -0
  18. package/dist/src/bip32utils.js +71 -0
  19. package/dist/src/descriptor/fromFixedScriptWallet.d.ts +7 -2
  20. package/dist/src/descriptor/fromFixedScriptWallet.d.ts.map +1 -1
  21. package/dist/src/descriptor/fromFixedScriptWallet.js +14 -3
  22. package/dist/src/descriptor/index.d.ts +2 -0
  23. package/dist/src/descriptor/index.d.ts.map +1 -1
  24. package/dist/src/descriptor/index.js +3 -1
  25. package/dist/src/descriptor/parse/PatternMatcher.d.ts +14 -0
  26. package/dist/src/descriptor/parse/PatternMatcher.d.ts.map +1 -0
  27. package/dist/src/descriptor/parse/PatternMatcher.js +60 -0
  28. package/dist/src/descriptor/psbt/createPsbt.d.ts +4 -0
  29. package/dist/src/descriptor/psbt/createPsbt.d.ts.map +1 -1
  30. package/dist/src/descriptor/psbt/createPsbt.js +34 -9
  31. package/dist/src/descriptor/psbt/sign.d.ts +2 -2
  32. package/dist/src/descriptor/psbt/sign.d.ts.map +1 -1
  33. package/dist/src/descriptor/psbt/sign.js +1 -1
  34. package/dist/src/index.d.ts +2 -0
  35. package/dist/src/index.d.ts.map +1 -1
  36. package/dist/src/index.js +4 -2
  37. package/dist/src/paygo/attestation.d.ts +11 -0
  38. package/dist/src/paygo/attestation.d.ts.map +1 -0
  39. package/dist/src/paygo/attestation.js +58 -0
  40. package/dist/src/paygo/index.d.ts +2 -1
  41. package/dist/src/paygo/index.d.ts.map +1 -1
  42. package/dist/src/paygo/index.js +3 -2
  43. package/dist/src/paygo/{ExtractAddressPayGoAttestation.d.ts → parsePayGoAttestation.d.ts} +8 -3
  44. package/dist/src/paygo/parsePayGoAttestation.d.ts.map +1 -0
  45. package/dist/src/paygo/parsePayGoAttestation.js +50 -0
  46. package/dist/src/paygo/psbt/Errors.d.ts +22 -0
  47. package/dist/src/paygo/psbt/Errors.d.ts.map +1 -0
  48. package/dist/src/paygo/psbt/Errors.js +44 -0
  49. package/dist/src/paygo/psbt/index.d.ts +2 -0
  50. package/dist/src/paygo/psbt/index.d.ts.map +1 -0
  51. package/dist/src/paygo/psbt/index.js +18 -0
  52. package/dist/src/paygo/psbt/payGoAddressProof.d.ts +29 -0
  53. package/dist/src/paygo/psbt/payGoAddressProof.d.ts.map +1 -0
  54. package/dist/src/paygo/psbt/payGoAddressProof.js +124 -0
  55. package/dist/src/testutil/descriptor/descriptors.d.ts +4 -1
  56. package/dist/src/testutil/descriptor/descriptors.d.ts.map +1 -1
  57. package/dist/src/testutil/descriptor/descriptors.js +40 -3
  58. package/dist/src/testutil/descriptor/mock.utils.d.ts +3 -1
  59. package/dist/src/testutil/descriptor/mock.utils.d.ts.map +1 -1
  60. package/dist/src/testutil/descriptor/mock.utils.js +2 -1
  61. package/dist/src/testutil/descriptor/psbt.utils.d.ts.map +1 -1
  62. package/dist/src/testutil/descriptor/psbt.utils.js +2 -1
  63. package/dist/src/testutil/generatePayGoAttestationProof.utils.d.ts +1 -1
  64. package/dist/src/testutil/generatePayGoAttestationProof.utils.d.ts.map +1 -1
  65. package/dist/src/testutil/generatePayGoAttestationProof.utils.js +8 -13
  66. package/dist/src/testutil/index.d.ts +1 -0
  67. package/dist/src/testutil/index.d.ts.map +1 -1
  68. package/dist/src/testutil/index.js +2 -1
  69. package/dist/src/testutil/key.utils.d.ts +1 -1
  70. package/dist/src/testutil/key.utils.d.ts.map +1 -1
  71. package/dist/src/testutil/key.utils.js +3 -2
  72. package/dist/src/testutil/toPlainObject.utils.d.ts.map +1 -1
  73. package/dist/src/testutil/toPlainObject.utils.js +16 -2
  74. package/dist/src/testutil/trimMessagePrefix.d.ts +11 -0
  75. package/dist/src/testutil/trimMessagePrefix.d.ts.map +1 -0
  76. package/dist/src/testutil/trimMessagePrefix.js +60 -0
  77. package/package.json +11 -7
  78. package/dist/src/paygo/ExtractAddressPayGoAttestation.d.ts.map +0 -1
  79. package/dist/src/paygo/ExtractAddressPayGoAttestation.js +0 -44
@@ -0,0 +1,5 @@
1
+ export * from './toSpend';
2
+ export * from './toSign';
3
+ export * from './utils';
4
+ export * from './verify';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/bip322/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC;AAC1B,cAAc,UAAU,CAAC;AACzB,cAAc,SAAS,CAAC;AACxB,cAAc,UAAU,CAAC"}
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./toSpend"), exports);
18
+ __exportStar(require("./toSign"), exports);
19
+ __exportStar(require("./utils"), exports);
20
+ __exportStar(require("./verify"), exports);
21
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYmlwMzIyL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSw0Q0FBMEI7QUFDMUIsMkNBQXlCO0FBQ3pCLDBDQUF3QjtBQUN4QiwyQ0FBeUIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL3RvU3BlbmQnO1xuZXhwb3J0ICogZnJvbSAnLi90b1NpZ24nO1xuZXhwb3J0ICogZnJvbSAnLi91dGlscyc7XG5leHBvcnQgKiBmcm9tICcuL3ZlcmlmeSc7XG4iXX0=
@@ -0,0 +1,25 @@
1
+ import { Psbt, bitgo } from '@bitgo-beta/utxo-lib';
2
+ export type AddressDetails = {
3
+ redeemScript?: Buffer;
4
+ witnessScript?: Buffer;
5
+ scriptPubKey: Buffer;
6
+ };
7
+ export declare const MAX_NUM_BIP322_INPUTS = 200;
8
+ /**
9
+ * Create the base PSBT for the to_sign transaction for BIP322 signing.
10
+ * There will be ever 1 output.
11
+ */
12
+ export declare function createBaseToSignPsbt(rootWalletKeys?: bitgo.RootWalletKeys, network?: import("@bitgo-beta/utxo-lib").Network): bitgo.UtxoPsbt;
13
+ /**
14
+ * Add a BIP322 input to the PSBT.
15
+ * Source implementation:
16
+ * https://github.com/bitcoin/bips/blob/master/bip-0322.mediawiki#full
17
+ *
18
+ * @param {string} message - The message that is hashed into the `to_spend` transaction.
19
+ * @param {AddressDetails} addressDetails - The details of the address, including redeemScript and/or witnessScript.
20
+ * @param {string} [tag=BIP322_TAG] - The tag to use for hashing, defaults to BIP322_TAG.
21
+ * @returns {Psbt} - The hex representation of the constructed PSBT.
22
+ */
23
+ export declare function addBip322Input(psbt: Psbt, message: string, addressDetails: AddressDetails, tag?: string): void;
24
+ export declare function addBip322InputWithChainAndIndex(psbt: bitgo.UtxoPsbt, message: string, rootWalletKeys: bitgo.RootWalletKeys, scriptId: bitgo.ScriptId): void;
25
+ //# sourceMappingURL=toSign.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toSign.d.ts","sourceRoot":"","sources":["../../../src/bip322/toSign.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,KAAK,EAAyB,MAAM,sBAAsB,CAAC;AAM1E,MAAM,MAAM,cAAc,GAAG;IAC3B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;CACtB,CAAC;AACF,eAAO,MAAM,qBAAqB,MAAM,CAAC;AAEzC;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,cAAc,CAAC,EAAE,KAAK,CAAC,cAAc,EACrC,OAAO,yCAAmB,GACzB,KAAK,CAAC,QAAQ,CAmBhB;AAED;;;;;;;;;GASG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,cAAc,EAAE,GAAG,SAAa,GAAG,IAAI,CA6BlH;AAED,wBAAgB,+BAA+B,CAC7C,IAAI,EAAE,KAAK,CAAC,QAAQ,EACpB,OAAO,EAAE,MAAM,EACf,cAAc,EAAE,KAAK,CAAC,cAAc,EACpC,QAAQ,EAAE,KAAK,CAAC,QAAQ,GACvB,IAAI,CA0EN"}
@@ -0,0 +1,126 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MAX_NUM_BIP322_INPUTS = void 0;
4
+ exports.createBaseToSignPsbt = createBaseToSignPsbt;
5
+ exports.addBip322Input = addBip322Input;
6
+ exports.addBip322InputWithChainAndIndex = addBip322InputWithChainAndIndex;
7
+ const utxo_lib_1 = require("@bitgo-beta/utxo-lib");
8
+ const outputScripts_1 = require("@bitgo-beta/utxo-lib/dist/src/bitgo/outputScripts");
9
+ const utils_1 = require("./utils");
10
+ const toSpend_1 = require("./toSpend");
11
+ exports.MAX_NUM_BIP322_INPUTS = 200;
12
+ /**
13
+ * Create the base PSBT for the to_sign transaction for BIP322 signing.
14
+ * There will be ever 1 output.
15
+ */
16
+ function createBaseToSignPsbt(rootWalletKeys, network = utxo_lib_1.networks.bitcoin) {
17
+ // Create PSBT object for constructing the transaction
18
+ const psbt = utxo_lib_1.bitgo.createPsbtForNetwork({ network });
19
+ // Set default value for nVersion and nLockTime
20
+ psbt.setVersion(0); // nVersion = 0
21
+ psbt.setLocktime(0); // nLockTime = 0
22
+ // Set the output
23
+ psbt.addOutput({
24
+ value: BigInt(0), // vout[0].nValue = 0
25
+ script: Buffer.from([0x6a]), // vout[0].scriptPubKey = OP_RETURN
26
+ });
27
+ // If rootWalletKeys are provided, add them to the PSBT as global xpubs
28
+ if (rootWalletKeys) {
29
+ utxo_lib_1.bitgo.addXpubsToPsbt(psbt, rootWalletKeys);
30
+ }
31
+ return psbt;
32
+ }
33
+ /**
34
+ * Add a BIP322 input to the PSBT.
35
+ * Source implementation:
36
+ * https://github.com/bitcoin/bips/blob/master/bip-0322.mediawiki#full
37
+ *
38
+ * @param {string} message - The message that is hashed into the `to_spend` transaction.
39
+ * @param {AddressDetails} addressDetails - The details of the address, including redeemScript and/or witnessScript.
40
+ * @param {string} [tag=BIP322_TAG] - The tag to use for hashing, defaults to BIP322_TAG.
41
+ * @returns {Psbt} - The hex representation of the constructed PSBT.
42
+ */
43
+ function addBip322Input(psbt, message, addressDetails, tag = toSpend_1.BIP322_TAG) {
44
+ const toSpendTx = (0, toSpend_1.buildToSpendTransaction)(addressDetails.scriptPubKey, message, tag);
45
+ if (psbt.data.inputs.length >= exports.MAX_NUM_BIP322_INPUTS) {
46
+ throw new Error(`Exceeded maximum number of BIP322 inputs (${exports.MAX_NUM_BIP322_INPUTS})`);
47
+ }
48
+ psbt.addInput({
49
+ hash: toSpendTx.getId(), // vin[0].prevout.hash = to_spend.txid
50
+ index: 0, // vin[0].prevout.n = 0
51
+ sequence: 0, // vin[0].nSequence = 0
52
+ nonWitnessUtxo: toSpendTx.toBuffer(), // previous transaction for us to rebuild later to verify
53
+ sighashType: utxo_lib_1.Transaction.SIGHASH_ALL,
54
+ });
55
+ const inputIndex = psbt.data.inputs.length - 1;
56
+ psbt.updateInput(inputIndex, {
57
+ witnessUtxo: { value: BigInt(0), script: addressDetails.scriptPubKey },
58
+ });
59
+ if (addressDetails.redeemScript) {
60
+ psbt.updateInput(inputIndex, { redeemScript: addressDetails.redeemScript });
61
+ }
62
+ if (addressDetails.witnessScript) {
63
+ psbt.updateInput(inputIndex, {
64
+ witnessScript: addressDetails.witnessScript,
65
+ });
66
+ }
67
+ // Add the message as a proprietary key value to the PSBT so we can verify it later
68
+ (0, utils_1.addBip322ProofMessage)(psbt, inputIndex, Buffer.from(message));
69
+ }
70
+ function addBip322InputWithChainAndIndex(psbt, message, rootWalletKeys, scriptId) {
71
+ const scriptType = utxo_lib_1.bitgo.scriptTypeForChain(scriptId.chain);
72
+ const walletKeys = rootWalletKeys.deriveForChainAndIndex(scriptId.chain, scriptId.index);
73
+ const output = utxo_lib_1.bitgo.outputScripts.createOutputScript2of3(walletKeys.publicKeys, utxo_lib_1.bitgo.scriptTypeForChain(scriptId.chain));
74
+ addBip322Input(psbt, message, {
75
+ scriptPubKey: output.scriptPubKey,
76
+ redeemScript: output.redeemScript,
77
+ witnessScript: output.witnessScript,
78
+ });
79
+ const inputIndex = psbt.data.inputs.length - 1;
80
+ // When adding the taproot metadata, we assume that we are NOT using the backup path
81
+ // For script type p2tr, it means that we are using signer and bitgo keys when creating the tap tree
82
+ // spending paths. For p2trMusig2, it means that we are using the taproot key path spending
83
+ const keyNames = ['user', 'bitgo'];
84
+ if (scriptType === 'p2tr') {
85
+ const { controlBlock, witnessScript, leafVersion, leafHash } = utxo_lib_1.bitgo.outputScripts.createSpendScriptP2tr(walletKeys.publicKeys, [walletKeys.user.publicKey, walletKeys.bitgo.publicKey]);
86
+ psbt.updateInput(inputIndex, {
87
+ tapLeafScript: [{ controlBlock, script: witnessScript, leafVersion }],
88
+ });
89
+ psbt.updateInput(inputIndex, {
90
+ tapBip32Derivation: keyNames.map((key) => ({
91
+ leafHashes: [leafHash],
92
+ pubkey: (0, outputScripts_1.toXOnlyPublicKey)(walletKeys[key].publicKey),
93
+ path: rootWalletKeys.getDerivationPath(rootWalletKeys[key], scriptId.chain, scriptId.index),
94
+ masterFingerprint: rootWalletKeys[key].fingerprint,
95
+ })),
96
+ });
97
+ }
98
+ else if (scriptType === 'p2trMusig2') {
99
+ const { internalPubkey: tapInternalKey, outputPubkey: tapOutputKey, taptreeRoot, } = utxo_lib_1.bitgo.outputScripts.createKeyPathP2trMusig2(walletKeys.publicKeys);
100
+ const participantsKeyValData = utxo_lib_1.bitgo.musig2.encodePsbtMusig2Participants({
101
+ tapOutputKey,
102
+ tapInternalKey,
103
+ participantPubKeys: [walletKeys.user.publicKey, walletKeys.bitgo.publicKey],
104
+ });
105
+ utxo_lib_1.bitgo.addProprietaryKeyValuesFromUnknownKeyValues(psbt, 'input', inputIndex, participantsKeyValData);
106
+ psbt.updateInput(inputIndex, {
107
+ tapInternalKey: tapInternalKey,
108
+ });
109
+ psbt.updateInput(inputIndex, {
110
+ tapMerkleRoot: taptreeRoot,
111
+ });
112
+ psbt.updateInput(inputIndex, {
113
+ tapBip32Derivation: keyNames.map((key) => ({
114
+ leafHashes: [],
115
+ pubkey: (0, outputScripts_1.toXOnlyPublicKey)(walletKeys[key].publicKey),
116
+ path: rootWalletKeys.getDerivationPath(rootWalletKeys[key], scriptId.chain, scriptId.index),
117
+ masterFingerprint: rootWalletKeys[key].fingerprint,
118
+ })),
119
+ });
120
+ }
121
+ else {
122
+ // Add bip32 derivation information for the input
123
+ psbt.updateInput(inputIndex, utxo_lib_1.bitgo.getPsbtBip32DerivationOutputUpdate(rootWalletKeys, walletKeys, utxo_lib_1.bitgo.scriptTypeForChain(scriptId.chain)));
124
+ }
125
+ }
126
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9TaWduLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2JpcDMyMi90b1NpZ24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBaUJBLG9EQXNCQztBQVlELHdDQTZCQztBQUVELDBFQStFQztBQWpLRCxtREFBMEU7QUFDMUUscUZBQXFGO0FBRXJGLG1DQUFnRDtBQUNoRCx1Q0FBZ0U7QUFPbkQsUUFBQSxxQkFBcUIsR0FBRyxHQUFHLENBQUM7QUFFekM7OztHQUdHO0FBQ0gsU0FBZ0Isb0JBQW9CLENBQ2xDLGNBQXFDLEVBQ3JDLE9BQU8sR0FBRyxtQkFBUSxDQUFDLE9BQU87SUFFMUIsc0RBQXNEO0lBQ3RELE1BQU0sSUFBSSxHQUFHLGdCQUFLLENBQUMsb0JBQW9CLENBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO0lBQ3JELCtDQUErQztJQUMvQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZTtJQUNuQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCO0lBRXJDLGlCQUFpQjtJQUNqQixJQUFJLENBQUMsU0FBUyxDQUFDO1FBQ2IsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxxQkFBcUI7UUFDdkMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLG1DQUFtQztLQUNqRSxDQUFDLENBQUM7SUFFSCx1RUFBdUU7SUFDdkUsSUFBSSxjQUFjLEVBQUUsQ0FBQztRQUNuQixnQkFBSyxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsY0FBYyxDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUVELE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQztBQUVEOzs7Ozs7Ozs7R0FTRztBQUNILFNBQWdCLGNBQWMsQ0FBQyxJQUFVLEVBQUUsT0FBZSxFQUFFLGNBQThCLEVBQUUsR0FBRyxHQUFHLG9CQUFV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cmtzLCBUcmFuc2FjdGlvbiB9IGZyb20gJ0BiaXRnby1iZXRhL3V0eG8tbGliJztcbmltcG9ydCB7IHRvWE9ubHlQdWJsaWNLZXkgfSBmcm9tICdAYml0Z28tYmV0YS91dHhvLWxpYi9kaXN0L3NyYy9iaXRnby9vdXRwdXRTY3JpcHRzJztcblxuaW1wb3J0IHsgYWRkQmlwMzIyUHJvb2ZNZXNzYWdlIH0gZnJvbSAnLi91dGlscyc7XG5pbXBvcnQgeyBCSVAzMjJfVEFHLCBidWlsZFRvU3BlbmRUcmFuc2FjdGlvbiB9IGZyb20gJy4vdG9TcGVuZCc7XG5cbmV4cG9ydCB0eXBlIEFkZHJlc3NEZXRhaWxzID0ge1xuICByZWRlZW1TY3JpcHQ/OiBCdWZmZXI7XG4gIHdpdG5lc3NTY3JpcHQ/OiBCdWZmZXI7XG4gIHNjcmlwdFB1YktleTogQnVmZmVyO1xufTtcbmV4cG9ydCBjb25zdCBNQVhfTlVNX0JJUDMyMl9JTlBVVFMgPSAyMDA7XG5cbi8qKlxuICogQ3JlYXRlIHRoZSBiYXNlIFBTQlQgZm9yIHRoZSB0b19zaWduIHRyYW5zYWN0aW9uIGZvciBCSVAzMjIgc2lnbmluZy5cbiAqIFRoZXJlIHdpbGwgYmUgZXZlciAxIG91dHB1dC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUJhc2VUb1NpZ25Qc2J0KFxuICByb290V2FsbGV0S2V5cz86IGJpdGdvLlJvb3RXYWxsZXRLZXlzLFxuICBuZXR3b3JrID0gbmV0d29ya3MuYml0Y29pblxuKTogYml0Z28uVXR4b1BzYnQge1xuICAvLyBDcmVhdGUgUFNCVCBvYmplY3QgZm9yIGNvbnN0cnVjdGluZyB0aGUgdHJhbnNhY3Rpb25cbiAgY29uc3QgcHNidCA9IGJpdGdvLmNyZWF0ZVBzYnRGb3JOZXR3b3JrKHsgbmV0d29yayB9KTtcbiAgLy8gU2V0IGRlZmF1bHQgdmFsdWUgZm9yIG5WZXJzaW9uIGFuZCBuTG9ja1RpbWVcbiAgcHNidC5zZXRWZXJzaW9uKDApOyAvLyBuVmVyc2lvbiA9IDBcbiAgcHNidC5zZXRMb2NrdGltZSgwKTsgLy8gbkxvY2tUaW1lID0gMFxuXG4gIC8vIFNldCB0aGUgb3V0cHV0XG4gIHBzYnQuYWRkT3V0cHV0KHtcbiAgICB2YWx1ZTogQmlnSW50KDApLCAvLyB2b3V0WzBdLm5WYWx1ZSA9IDBcbiAgICBzY3JpcHQ6IEJ1ZmZlci5mcm9tKFsweDZhXSksIC8vIHZvdXRbMF0uc2NyaXB0UHViS2V5ID0gT1BfUkVUVVJOXG4gIH0pO1xuXG4gIC8vIElmIHJvb3RXYWxsZXRLZXlzIGFyZSBwcm92aWRlZCwgYWRkIHRoZW0gdG8gdGhlIFBTQlQgYXMgZ2xvYmFsIHhwdWJzXG4gIGlmIChyb290V2FsbGV0S2V5cykge1xuICAgIGJpdGdvLmFkZFhwdWJzVG9Qc2J0KHBzYnQsIHJvb3RXYWxsZXRLZXlzKTtcbiAgfVxuXG4gIHJldHVybiBwc2J0O1xufVxuXG4vKipcbiAqIEFkZCBhIEJJUDMyMiBpbnB1dCB0byB0aGUgUFNCVC5cbiAqIFNvdXJjZSBpbXBsZW1lbnRhdGlvbjpcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9iaXRjb2luL2JpcHMvYmxvYi9tYXN0ZXIvYmlwLTAzMjIubWVkaWF3aWtpI2Z1bGxcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZSAtIFRoZSBtZXNzYWdlIHRoYXQgaXMgaGFzaGVkIGludG8gdGhlIGB0b19zcGVuZGAgdHJhbnNhY3Rpb24uXG4gKiBAcGFyYW0ge0FkZHJlc3NEZXRhaWxzfSBhZGRyZXNzRGV0YWlscyAtIFRoZSBkZXRhaWxzIG9mIHRoZSBhZGRyZXNzLCBpbmNsdWRpbmcgcmVkZWVtU2NyaXB0IGFuZC9vciB3aXRuZXNzU2NyaXB0LlxuICogQHBhcmFtIHtzdHJpbmd9IFt0YWc9QklQMzIyX1RBR10gLSBUaGUgdGFnIHRvIHVzZSBmb3IgaGFzaGluZywgZGVmYXVsdHMgdG8gQklQMzIyX1RBRy5cbiAqIEByZXR1cm5zIHtQc2J0fSAtIFRoZSBoZXggcmVwcmVzZW50YXRpb24gb2YgdGhlIGNvbnN0cnVjdGVkIFBTQlQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZGRCaXAzMjJJbnB1dChwc2J0OiBQc2J0LCBtZXNzYWdlOiBzdHJpbmcsIGFkZHJlc3NEZXRhaWxzOiBBZGRyZXNzRGV0YWlscywgdGFnID0gQklQMzIyX1RBRyk6IHZvaWQge1xuICBjb25zdCB0b1NwZW5kVHggPSBidWlsZFRvU3BlbmRUcmFuc2FjdGlvbihhZGRyZXNzRGV0YWlscy5zY3JpcHRQdWJLZXksIG1lc3NhZ2UsIHRhZyk7XG4gIGlmIChwc2J0LmRhdGEuaW5wdXRzLmxlbmd0aCA+PSBNQVhfTlVNX0JJUDMyMl9JTlBVVFMpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEV4Y2VlZGVkIG1heGltdW0gbnVtYmVyIG9mIEJJUDMyMiBpbnB1dHMgKCR7TUFYX05VTV9CSVAzMjJfSU5QVVRTfSlgKTtcbiAgfVxuXG4gIHBzYnQuYWRkSW5wdXQoe1xuICAgIGhhc2g6IHRvU3BlbmRUeC5nZXRJZCgpLCAvLyB2aW5bMF0ucHJldm91dC5oYXNoID0gdG9fc3BlbmQudHhpZFxuICAgIGluZGV4OiAwLCAvLyB2aW5bMF0ucHJldm91dC5uID0gMFxuICAgIHNlcXVlbmNlOiAwLCAvLyB2aW5bMF0ublNlcXVlbmNlID0gMFxuICAgIG5vbldpdG5lc3NVdHhvOiB0b1NwZW5kVHgudG9CdWZmZXIoKSwgLy8gcHJldmlvdXMgdHJhbnNhY3Rpb24gZm9yIHVzIHRvIHJlYnVpbGQgbGF0ZXIgdG8gdmVyaWZ5XG4gICAgc2lnaGFzaFR5cGU6IFRyYW5zYWN0aW9uLlNJR0hBU0hfQUxMLFxuICB9KTtcbiAgY29uc3QgaW5wdXRJbmRleCA9IHBzYnQuZGF0YS5pbnB1dHMubGVuZ3RoIC0gMTtcbiAgcHNidC51cGRhdGVJbnB1dChpbnB1dEluZGV4LCB7XG4gICAgd2l0bmVzc1V0eG86IHsgdmFsdWU6IEJpZ0ludCgwKSwgc2NyaXB0OiBhZGRyZXNzRGV0YWlscy5zY3JpcHRQdWJLZXkgfSxcbiAgfSk7XG5cbiAgaWYgKGFkZHJlc3NEZXRhaWxzLnJlZGVlbVNjcmlwdCkge1xuICAgIHBzYnQudXBkYXRlSW5wdXQoaW5wdXRJbmRleCwgeyByZWRlZW1TY3JpcHQ6IGFkZHJlc3NEZXRhaWxzLnJlZGVlbVNjcmlwdCB9KTtcbiAgfVxuICBpZiAoYWRkcmVzc0RldGFpbHMud2l0bmVzc1NjcmlwdCkge1xuICAgIHBzYnQudXBkYXRlSW5wdXQoaW5wdXRJbmRleCwge1xuICAgICAgd2l0bmVzc1NjcmlwdDogYWRkcmVzc0RldGFpbHMud2l0bmVzc1NjcmlwdCxcbiAgICB9KTtcbiAgfVxuXG4gIC8vIEFkZCB0aGUgbWVzc2FnZSBhcyBhIHByb3ByaWV0YXJ5IGtleSB2YWx1ZSB0byB0aGUgUFNCVCBzbyB3ZSBjYW4gdmVyaWZ5IGl0IGxhdGVyXG4gIGFkZEJpcDMyMlByb29mTWVzc2FnZShwc2J0LCBpbnB1dEluZGV4LCBCdWZmZXIuZnJvbShtZXNzYWdlKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhZGRCaXAzMjJJbnB1dFdpdGhDaGFpbkFuZEluZGV4KFxuICBwc2J0OiBiaXRnby5VdHhvUHNidCxcbiAgbWVzc2FnZTogc3RyaW5nLFxuICByb290V2FsbGV0S2V5czogYml0Z28uUm9vdFdhbGxldEtleXMsXG4gIHNjcmlwdElkOiBiaXRnby5TY3JpcHRJZFxuKTogdm9pZCB7XG4gIGNvbnN0IHNjcmlwdFR5cGUgPSBiaXRnby5zY3JpcHRUeXBlRm9yQ2hhaW4oc2NyaXB0SWQuY2hhaW4pO1xuICBjb25zdCB3YWxsZXRLZXlzID0gcm9vdFdhbGxldEtleXMuZGVyaXZlRm9yQ2hhaW5BbmRJbmRleChzY3JpcHRJZC5jaGFpbiwgc2NyaXB0SWQuaW5kZXgpO1xuICBjb25zdCBvdXRwdXQgPSBiaXRnby5vdXRwdXRTY3JpcHRzLmNyZWF0ZU91dHB1dFNjcmlwdDJvZjMoXG4gICAgd2FsbGV0S2V5cy5wdWJsaWNLZXlzLFxuICAgIGJpdGdvLnNjcmlwdFR5cGVGb3JDaGFpbihzY3JpcHRJZC5jaGFpbilcbiAgKTtcblxuICBhZGRCaXAzMjJJbnB1dChwc2J0IGFzIFBzYnQsIG1lc3NhZ2UsIHtcbiAgICBzY3JpcHRQdWJLZXk6IG91dHB1dC5zY3JpcHRQdWJLZXksXG4gICAgcmVkZWVtU2NyaXB0OiBvdXRwdXQucmVkZWVtU2NyaXB0LFxuICAgIHdpdG5lc3NTY3JpcHQ6IG91dHB1dC53aXRuZXNzU2NyaXB0LFxuICB9KTtcblxuICBjb25zdCBpbnB1dEluZGV4ID0gcHNidC5kYXRhLmlucHV0cy5sZW5ndGggLSAxO1xuXG4gIC8vIFdoZW4gYWRkaW5nIHRoZSB0YXByb290IG1ldGFkYXRhLCB3ZSBhc3N1bWUgdGhhdCB3ZSBhcmUgTk9UIHVzaW5nIHRoZSBiYWNrdXAgcGF0aFxuICAvLyBGb3Igc2NyaXB0IHR5cGUgcDJ0ciwgaXQgbWVhbnMgdGhhdCB3ZSBhcmUgdXNpbmcgc2lnbmVyIGFuZCBiaXRnbyBrZXlzIHdoZW4gY3JlYXRpbmcgdGhlIHRhcCB0cmVlXG4gIC8vIHNwZW5kaW5nIHBhdGhzLiBGb3IgcDJ0ck11c2lnMiwgaXQgbWVhbnMgdGhhdCB3ZSBhcmUgdXNpbmcgdGhlIHRhcHJvb3Qga2V5IHBhdGggc3BlbmRpbmdcbiAgY29uc3Qga2V5TmFtZXMgPSBbJ3VzZXInLCAnYml0Z28nXSBhcyBiaXRnby5LZXlOYW1lW107XG4gIGlmIChzY3JpcHRUeXBlID09PSAncDJ0cicpIHtcbiAgICBjb25zdCB7IGNvbnRyb2xCbG9jaywgd2l0bmVzc1NjcmlwdCwgbGVhZlZlcnNpb24sIGxlYWZIYXNoIH0gPSBiaXRnby5vdXRwdXRTY3JpcHRzLmNyZWF0ZVNwZW5kU2NyaXB0UDJ0cihcbiAgICAgIHdhbGxldEtleXMucHVibGljS2V5cyxcbiAgICAgIFt3YWxsZXRLZXlzLnVzZXIucHVibGljS2V5LCB3YWxsZXRLZXlzLmJpdGdvLnB1YmxpY0tleV1cbiAgICApO1xuICAgIHBzYnQudXBkYXRlSW5wdXQoaW5wdXRJbmRleCwge1xuICAgICAgdGFwTGVhZlNjcmlwdDogW3sgY29udHJvbEJsb2NrLCBzY3JpcHQ6IHdpdG5lc3NTY3JpcHQsIGxlYWZWZXJzaW9uIH1dLFxuICAgIH0pO1xuXG4gICAgcHNidC51cGRhdGVJbnB1dChpbnB1dEluZGV4LCB7XG4gICAgICB0YXBCaXAzMkRlcml2YXRpb246IGtleU5hbWVzLm1hcCgoa2V5KSA9PiAoe1xuICAgICAgICBsZWFmSGFzaGVzOiBbbGVhZkhhc2hdLFxuICAgICAgICBwdWJrZXk6IHRvWE9ubHlQdWJsaWNLZXkod2FsbGV0S2V5c1trZXldLnB1YmxpY0tleSksXG4gICAgICAgIHBhdGg6IHJvb3RXYWxsZXRLZXlzLmdldERlcml2YXRpb25QYXRoKHJvb3RXYWxsZXRLZXlzW2tleV0sIHNjcmlwdElkLmNoYWluLCBzY3JpcHRJZC5pbmRleCksXG4gICAgICAgIG1hc3RlckZpbmdlcnByaW50OiByb290V2FsbGV0S2V5c1trZXldLmZpbmdlcnByaW50LFxuICAgICAgfSkpLFxuICAgIH0pO1xuICB9IGVsc2UgaWYgKHNjcmlwdFR5cGUgPT09ICdwMnRyTXVzaWcyJykge1xuICAgIGNvbnN0IHtcbiAgICAgIGludGVybmFsUHVia2V5OiB0YXBJbnRlcm5hbEtleSxcbiAgICAgIG91dHB1dFB1YmtleTogdGFwT3V0cHV0S2V5LFxuICAgICAgdGFwdHJlZVJvb3QsXG4gICAgfSA9IGJpdGdvLm91dHB1dFNjcmlwdHMuY3JlYXRlS2V5UGF0aFAydHJNdXNpZzIod2FsbGV0S2V5cy5wdWJsaWNLZXlzKTtcblxuICAgIGNvbnN0IHBhcnRpY2lwYW50c0tleVZhbERhdGEgPSBiaXRnby5tdXNpZzIuZW5jb2RlUHNidE11c2lnMlBhcnRpY2lwYW50cyh7XG4gICAgICB0YXBPdXRwdXRLZXksXG4gICAgICB0YXBJbnRlcm5hbEtleSxcbiAgICAgIHBhcnRpY2lwYW50UHViS2V5czogW3dhbGxldEtleXMudXNlci5wdWJsaWNLZXksIHdhbGxldEtleXMuYml0Z28ucHVibGljS2V5XSxcbiAgICB9KTtcbiAgICBiaXRnby5hZGRQcm9wcmlldGFyeUtleVZhbHVlc0Zyb21Vbmtub3duS2V5VmFsdWVzKHBzYnQsICdpbnB1dCcsIGlucHV0SW5kZXgsIHBhcnRpY2lwYW50c0tleVZhbERhdGEpO1xuXG4gICAgcHNidC51cGRhdGVJbnB1dChpbnB1dEluZGV4LCB7XG4gICAgICB0YXBJbnRlcm5hbEtleTogdGFwSW50ZXJuYWxLZXksXG4gICAgfSk7XG5cbiAgICBwc2J0LnVwZGF0ZUlucHV0KGlucHV0SW5kZXgsIHtcbiAgICAgIHRhcE1lcmtsZVJvb3Q6IHRhcHRyZWVSb290LFxuICAgIH0pO1xuXG4gICAgcHNidC51cGRhdGVJbnB1dChpbnB1dEluZGV4LCB7XG4gICAgICB0YXBCaXAzMkRlcml2YXRpb246IGtleU5hbWVzLm1hcCgoa2V5KSA9PiAoe1xuICAgICAgICBsZWFmSGFzaGVzOiBbXSxcbiAgICAgICAgcHVia2V5OiB0b1hPbmx5UHVibGljS2V5KHdhbGxldEtleXNba2V5XS5wdWJsaWNLZXkpLFxuICAgICAgICBwYXRoOiByb290V2FsbGV0S2V5cy5nZXREZXJpdmF0aW9uUGF0aChyb290V2FsbGV0S2V5c1trZXldLCBzY3JpcHRJZC5jaGFpbiwgc2NyaXB0SWQuaW5kZXgpLFxuICAgICAgICBtYXN0ZXJGaW5nZXJwcmludDogcm9vdFdhbGxldEtleXNba2V5XS5maW5nZXJwcmludCxcbiAgICAgIH0pKSxcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICAvLyBBZGQgYmlwMzIgZGVyaXZhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIGlucHV0XG4gICAgcHNidC51cGRhdGVJbnB1dChcbiAgICAgIGlucHV0SW5kZXgsXG4gICAgICBiaXRnby5nZXRQc2J0QmlwMzJEZXJpdmF0aW9uT3V0cHV0VXBkYXRlKHJvb3RXYWxsZXRLZXlzLCB3YWxsZXRLZXlzLCBiaXRnby5zY3JpcHRUeXBlRm9yQ2hhaW4oc2NyaXB0SWQuY2hhaW4pKVxuICAgICk7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,22 @@
1
+ import { Transaction, bitgo } from '@bitgo-beta/utxo-lib';
2
+ export declare const BIP322_TAG = "BIP0322-signed-message";
3
+ /**
4
+ * Perform a tagged hash
5
+ *
6
+ * @param {string | Buffer} message - The message to hash as a Buffer or utf-8 string
7
+ * @param {Buffer} [tag=BIP322_TAG] - The tag to use for hashing, defaults to BIP322_TAG.
8
+ * @returns {Buffer} - The resulting hash of the message with the tag.
9
+ */
10
+ export declare function hashMessageWithTag(message: string | Buffer, tag?: string): Buffer;
11
+ /**
12
+ * Build a BIP322 "to spend" transaction
13
+ * Source: https://github.com/bitcoin/bips/blob/master/bip-0322.mediawiki#full
14
+ *
15
+ * @param {Buffer} scriptPubKey - The scriptPubKey to use for the output
16
+ * @param {string | Buffer} message - The message to include in the transaction
17
+ * @param {Buffer} [tag=BIP322_TAG] - The tag to use for hashing, defaults to BIP322_TAG.
18
+ * @returns {Transaction} - The constructed transaction
19
+ */
20
+ export declare function buildToSpendTransaction(scriptPubKey: Buffer, message: string | Buffer, tag?: string): Transaction<bigint>;
21
+ export declare function buildToSpendTransactionFromChainAndIndex(rootWalletKeys: bitgo.RootWalletKeys, chain: bitgo.ChainCode, index: number, message: string | Buffer, tag?: string): Transaction<bigint>;
22
+ //# sourceMappingURL=toSpend.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toSpend.d.ts","sourceRoot":"","sources":["../../../src/bip322/toSpend.ts"],"names":[],"mappings":"AACA,OAAO,EAAQ,WAAW,EAAE,KAAK,EAAY,MAAM,sBAAsB,CAAC;AAE1E,eAAO,MAAM,UAAU,2BAA2B,CAAC;AAEnD;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAa,GAAG,MAAM,CAYrF;AAED;;;;;;;;GAQG;AACH,wBAAgB,uBAAuB,CACrC,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,MAAM,GAAG,MAAM,EACxB,GAAG,SAAa,GACf,WAAW,CAAC,MAAM,CAAC,CA4BrB;AAED,wBAAgB,wCAAwC,CACtD,cAAc,EAAE,KAAK,CAAC,cAAc,EACpC,KAAK,EAAE,KAAK,CAAC,SAAS,EACtB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,GAAG,MAAM,EACxB,GAAG,SAAa,GACf,WAAW,CAAC,MAAM,CAAC,CAOrB"}
@@ -0,0 +1,72 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BIP322_TAG = void 0;
4
+ exports.hashMessageWithTag = hashMessageWithTag;
5
+ exports.buildToSpendTransaction = buildToSpendTransaction;
6
+ exports.buildToSpendTransactionFromChainAndIndex = buildToSpendTransactionFromChainAndIndex;
7
+ const fast_sha256_1 = require("fast-sha256");
8
+ const utxo_lib_1 = require("@bitgo-beta/utxo-lib");
9
+ exports.BIP322_TAG = 'BIP0322-signed-message';
10
+ /**
11
+ * Perform a tagged hash
12
+ *
13
+ * @param {string | Buffer} message - The message to hash as a Buffer or utf-8 string
14
+ * @param {Buffer} [tag=BIP322_TAG] - The tag to use for hashing, defaults to BIP322_TAG.
15
+ * @returns {Buffer} - The resulting hash of the message with the tag.
16
+ */
17
+ function hashMessageWithTag(message, tag = exports.BIP322_TAG) {
18
+ // Compute the message hash - SHA256(SHA256(tag) || SHA256(tag) || message)
19
+ // Reference: https://github.com/bitcoin/bips/blob/master/bip-0322.mediawiki#full
20
+ const tagHasher = new fast_sha256_1.Hash();
21
+ tagHasher.update(Buffer.from(exports.BIP322_TAG));
22
+ const tagHash = tagHasher.digest();
23
+ const messageHasher = new fast_sha256_1.Hash();
24
+ messageHasher.update(tagHash);
25
+ messageHasher.update(tagHash);
26
+ messageHasher.update(Buffer.from(message));
27
+ const messageHash = messageHasher.digest();
28
+ return Buffer.from(messageHash);
29
+ }
30
+ /**
31
+ * Build a BIP322 "to spend" transaction
32
+ * Source: https://github.com/bitcoin/bips/blob/master/bip-0322.mediawiki#full
33
+ *
34
+ * @param {Buffer} scriptPubKey - The scriptPubKey to use for the output
35
+ * @param {string | Buffer} message - The message to include in the transaction
36
+ * @param {Buffer} [tag=BIP322_TAG] - The tag to use for hashing, defaults to BIP322_TAG.
37
+ * @returns {Transaction} - The constructed transaction
38
+ */
39
+ function buildToSpendTransaction(scriptPubKey, message, tag = exports.BIP322_TAG) {
40
+ // Create PSBT object for constructing the transaction
41
+ const psbt = new utxo_lib_1.Psbt();
42
+ // Set default value for nVersion and nLockTime
43
+ psbt.setVersion(0); // nVersion = 0
44
+ psbt.setLocktime(0); // nLockTime = 0
45
+ // Compute the message hash - SHA256(SHA256(tag) || SHA256(tag) || message)
46
+ const messageHash = hashMessageWithTag(message, tag);
47
+ // Construct the scriptSig - OP_0 PUSH32[ message_hash ]
48
+ const scriptSigPartOne = new Uint8Array([0x00, 0x20]); // OP_0 PUSH32
49
+ const scriptSig = new Uint8Array(scriptSigPartOne.length + messageHash.length);
50
+ scriptSig.set(scriptSigPartOne);
51
+ scriptSig.set(messageHash, scriptSigPartOne.length);
52
+ // Set the input
53
+ psbt.addInput({
54
+ hash: '0'.repeat(64), // vin[0].prevout.hash = 0000...000
55
+ index: 0xffffffff, // vin[0].prevout.n = 0xFFFFFFFF
56
+ sequence: 0, // vin[0].nSequence = 0
57
+ finalScriptSig: Buffer.from(scriptSig), // vin[0].scriptSig = OP_0 PUSH32[ message_hash ]
58
+ witnessScript: Buffer.from([]), // vin[0].scriptWitness = []
59
+ });
60
+ // Set the output
61
+ psbt.addOutput({
62
+ value: BigInt(0), // vout[0].nValue = 0
63
+ script: scriptPubKey, // vout[0].scriptPubKey = message_challenge
64
+ });
65
+ // Return transaction
66
+ return psbt.extractTransaction();
67
+ }
68
+ function buildToSpendTransactionFromChainAndIndex(rootWalletKeys, chain, index, message, tag = exports.BIP322_TAG) {
69
+ const outputScript = utxo_lib_1.bitgo.outputScripts.createOutputScript2of3(rootWalletKeys.deriveForChainAndIndex(chain, index).publicKeys, utxo_lib_1.bitgo.scriptTypeForChain(chain), utxo_lib_1.networks.bitcoin);
70
+ return buildToSpendTransaction(outputScript.scriptPubKey, message, tag);
71
+ }
72
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9TcGVuZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9iaXAzMjIvdG9TcGVuZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFZQSxnREFZQztBQVdELDBEQWdDQztBQUVELDRGQWFDO0FBbEZELDZDQUFtQztBQUNuQyxtREFBMEU7QUFFN0QsUUFBQSxVQUFVLEdBQUcsd0JBQXdCLENBQUM7QUFFbkQ7Ozs7OztHQU1HO0FBQ0gsU0FBZ0Isa0JBQWtCLENBQUMsT0FBd0IsRUFBRSxHQUFHLEdBQUcsa0JBQVU7SUFDM0UsMkVBQTJFO0lBQzNFLGlGQUFpRjtJQUNqRixNQUFNLFNBQVMsR0FBRyxJQUFJLGtCQUFJLEVBQUUsQ0FBQztJQUM3QixTQUFTLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsa0JBQVUsQ0FBQyxDQUFDLENBQUM7SUFDMUMsTUFBTSxPQUFPLEdBQUcsU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBQ25DLE1BQU0sYUFBYSxHQUFHLElBQUksa0JBQUksRUFBRSxDQUFDO0lBQ2pDLGFBQWEsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDOUIsYUFBYSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUM5QixhQUFhLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztJQUMzQyxNQUFNLFdBQVcsR0FBRyxhQUFhLENBQUMsTUFBTSxFQUFFLENBQUM7SUFDM0MsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0FBQ2xDLENBQUM7QUFFRDs7Ozs7Ozs7R0FRRztBQUNILFNBQWdCLHVCQUF1QixDQUNyQyxZQUFvQixFQUNwQixPQUF3QixFQUN4QixHQUFHLEdBQUcsa0JBQVU7SUFFaEIsc0RBQXNEO0lBQ3RELE1BQU0sSUFBSSxHQUFHLElBQUksZUFBSSxFQUFFLENBQUM7SUFDeEIsK0NBQStDO0lBQy9DLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxlQUFlO0lBQ25DLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0I7SUFDckMsMkVBQTJFO0lBQzNFLE1BQU0sV0FBVyxHQUFHLGtCQUFrQixDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsQ0FBQztJQUNyRCx3REFBd0Q7SUFDeEQsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLFVBQVUsQ0FBQyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYztJQUNyRSxNQUFNLFNBQVMsR0FBRyxJQUFJLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLEdBQUcsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQy9FLFNBQVMsQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUNoQyxTQUFTLENBQUMsR0FBRyxDQUFDLFdBQVcsRUFBRSxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNwRCxnQkFBZ0I7SUFDaEIsSUFBSSxDQUFDLFFBQVEsQ0FBQztRQUNaLElBQUksRUFBRSxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxFQUFFLG1DQUFtQztRQUN6RCxLQUFLLEVBQUUsVUFBVSxFQUFFLGdDQUFnQztRQUNuRCxRQUFRLEVBQUUsQ0FBQyxFQUFFLHVCQUF1QjtRQUNwQyxjQUFjLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxpREFBaUQ7UUFDekYsYUFBYSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsNEJBQTRCO0tBQzdELENBQUMsQ0FBQztJQUNILGlCQUFpQjtJQUNqQixJQUFJLENBQUMsU0FBUyxDQUFDO1FBQ2IsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxxQkFBcUI7UUFDdkMsTUFBTSxFQUFFLFlBQVksRUFBRSwyQ0FBMkM7S0FDbEUsQ0FBQyxDQUFDO0lBQ0gscUJBQXFCO0lBQ3JCLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7QUFDbkMsQ0FBQztBQUVELFNBQWdCLHdDQUF3QyxDQUN0RCxjQUFvQyxFQUNwQyxLQUFzQixFQUN0QixLQUFhLEVBQ2IsT0FBd0IsRUFDeEIsR0FBRyxHQUFHLGtCQUFVO0lBRWhCLE1BQU0sWUFBWSxHQUFHLGdCQUFLLENBQUMsYUFBYSxDQUFDLHNCQUFzQixDQUM3RCxjQUFjLENBQUMsc0JBQXNCLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDLFVBQVUsRUFDOUQsZ0JBQUssQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsRUFDL0IsbUJBQVEsQ0FBQyxPQUFPLENBQ2pCLENBQUM7SUFDRixPQUFPLHVCQUF1QixDQUFDLFlBQVksQ0FBQyxZQUFZLEVBQUUsT0FBTyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQzFFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBIYXNoIH0gZnJvbSAnZmFzdC1zaGEyNTYnO1xuaW1wb3J0IHsgUHNidCwgVHJhbnNhY3Rpb24sIGJpdGdvLCBuZXR3b3JrcyB9IGZyb20gJ0BiaXRnby1iZXRhL3V0eG8tbGliJztcblxuZXhwb3J0IGNvbnN0IEJJUDMyMl9UQUcgPSAnQklQMDMyMi1zaWduZWQtbWVzc2FnZSc7XG5cbi8qKlxuICogUGVyZm9ybSBhIHRhZ2dlZCBoYXNoXG4gKlxuICogQHBhcmFtIHtzdHJpbmcgfCBCdWZmZXJ9IG1lc3NhZ2UgLSBUaGUgbWVzc2FnZSB0byBoYXNoIGFzIGEgQnVmZmVyIG9yIHV0Zi04IHN0cmluZ1xuICogQHBhcmFtIHtCdWZmZXJ9IFt0YWc9QklQMzIyX1RBR10gLSBUaGUgdGFnIHRvIHVzZSBmb3IgaGFzaGluZywgZGVmYXVsdHMgdG8gQklQMzIyX1RBRy5cbiAqIEByZXR1cm5zIHtCdWZmZXJ9IC0gVGhlIHJlc3VsdGluZyBoYXNoIG9mIHRoZSBtZXNzYWdlIHdpdGggdGhlIHRhZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc2hNZXNzYWdlV2l0aFRhZyhtZXNzYWdlOiBzdHJpbmcgfCBCdWZmZXIsIHRhZyA9IEJJUDMyMl9UQUcpOiBCdWZmZXIge1xuICAvLyBDb21wdXRlIHRoZSBtZXNzYWdlIGhhc2ggLSBTSEEyNTYoU0hBMjU2KHRhZykgfHwgU0hBMjU2KHRhZykgfHwgbWVzc2FnZSlcbiAgLy8gUmVmZXJlbmNlOiBodHRwczovL2dpdGh1Yi5jb20vYml0Y29pbi9iaXBzL2Jsb2IvbWFzdGVyL2JpcC0wMzIyLm1lZGlhd2lraSNmdWxsXG4gIGNvbnN0IHRhZ0hhc2hlciA9IG5ldyBIYXNoKCk7XG4gIHRhZ0hhc2hlci51cGRhdGUoQnVmZmVyLmZyb20oQklQMzIyX1RBRykpO1xuICBjb25zdCB0YWdIYXNoID0gdGFnSGFzaGVyLmRpZ2VzdCgpO1xuICBjb25zdCBtZXNzYWdlSGFzaGVyID0gbmV3IEhhc2goKTtcbiAgbWVzc2FnZUhhc2hlci51cGRhdGUodGFnSGFzaCk7XG4gIG1lc3NhZ2VIYXNoZXIudXBkYXRlKHRhZ0hhc2gpO1xuICBtZXNzYWdlSGFzaGVyLnVwZGF0ZShCdWZmZXIuZnJvbShtZXNzYWdlKSk7XG4gIGNvbnN0IG1lc3NhZ2VIYXNoID0gbWVzc2FnZUhhc2hlci5kaWdlc3QoKTtcbiAgcmV0dXJuIEJ1ZmZlci5mcm9tKG1lc3NhZ2VIYXNoKTtcbn1cblxuLyoqXG4gKiBCdWlsZCBhIEJJUDMyMiBcInRvIHNwZW5kXCIgdHJhbnNhY3Rpb25cbiAqIFNvdXJjZTogaHR0cHM6Ly9naXRodWIuY29tL2JpdGNvaW4vYmlwcy9ibG9iL21hc3Rlci9iaXAtMDMyMi5tZWRpYXdpa2kjZnVsbFxuICpcbiAqIEBwYXJhbSB7QnVmZmVyfSBzY3JpcHRQdWJLZXkgLSBUaGUgc2NyaXB0UHViS2V5IHRvIHVzZSBmb3IgdGhlIG91dHB1dFxuICogQHBhcmFtIHtzdHJpbmcgfCBCdWZmZXJ9IG1lc3NhZ2UgLSBUaGUgbWVzc2FnZSB0byBpbmNsdWRlIGluIHRoZSB0cmFuc2FjdGlvblxuICogQHBhcmFtIHtCdWZmZXJ9IFt0YWc9QklQMzIyX1RBR10gLSBUaGUgdGFnIHRvIHVzZSBmb3IgaGFzaGluZywgZGVmYXVsdHMgdG8gQklQMzIyX1RBRy5cbiAqIEByZXR1cm5zIHtUcmFuc2FjdGlvbn0gLSBUaGUgY29uc3RydWN0ZWQgdHJhbnNhY3Rpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkVG9TcGVuZFRyYW5zYWN0aW9uKFxuICBzY3JpcHRQdWJLZXk6IEJ1ZmZlcixcbiAgbWVzc2FnZTogc3RyaW5nIHwgQnVmZmVyLFxuICB0YWcgPSBCSVAzMjJfVEFHXG4pOiBUcmFuc2FjdGlvbjxiaWdpbnQ+IHtcbiAgLy8gQ3JlYXRlIFBTQlQgb2JqZWN0IGZvciBjb25zdHJ1Y3RpbmcgdGhlIHRyYW5zYWN0aW9uXG4gIGNvbnN0IHBzYnQgPSBuZXcgUHNidCgpO1xuICAvLyBTZXQgZGVmYXVsdCB2YWx1ZSBmb3IgblZlcnNpb24gYW5kIG5Mb2NrVGltZVxuICBwc2J0LnNldFZlcnNpb24oMCk7IC8vIG5WZXJzaW9uID0gMFxuICBwc2J0LnNldExvY2t0aW1lKDApOyAvLyBuTG9ja1RpbWUgPSAwXG4gIC8vIENvbXB1dGUgdGhlIG1lc3NhZ2UgaGFzaCAtIFNIQTI1NihTSEEyNTYodGFnKSB8fCBTSEEyNTYodGFnKSB8fCBtZXNzYWdlKVxuICBjb25zdCBtZXNzYWdlSGFzaCA9IGhhc2hNZXNzYWdlV2l0aFRhZyhtZXNzYWdlLCB0YWcpO1xuICAvLyBDb25zdHJ1Y3QgdGhlIHNjcmlwdFNpZyAtIE9QXzAgUFVTSDMyWyBtZXNzYWdlX2hhc2ggXVxuICBjb25zdCBzY3JpcHRTaWdQYXJ0T25lID0gbmV3IFVpbnQ4QXJyYXkoWzB4MDAsIDB4MjBdKTsgLy8gT1BfMCBQVVNIMzJcbiAgY29uc3Qgc2NyaXB0U2lnID0gbmV3IFVpbnQ4QXJyYXkoc2NyaXB0U2lnUGFydE9uZS5sZW5ndGggKyBtZXNzYWdlSGFzaC5sZW5ndGgpO1xuICBzY3JpcHRTaWcuc2V0KHNjcmlwdFNpZ1BhcnRPbmUpO1xuICBzY3JpcHRTaWcuc2V0KG1lc3NhZ2VIYXNoLCBzY3JpcHRTaWdQYXJ0T25lLmxlbmd0aCk7XG4gIC8vIFNldCB0aGUgaW5wdXRcbiAgcHNidC5hZGRJbnB1dCh7XG4gICAgaGFzaDogJzAnLnJlcGVhdCg2NCksIC8vIHZpblswXS5wcmV2b3V0Lmhhc2ggPSAwMDAwLi4uMDAwXG4gICAgaW5kZXg6IDB4ZmZmZmZmZmYsIC8vIHZpblswXS5wcmV2b3V0Lm4gPSAweEZGRkZGRkZGXG4gICAgc2VxdWVuY2U6IDAsIC8vIHZpblswXS5uU2VxdWVuY2UgPSAwXG4gICAgZmluYWxTY3JpcHRTaWc6IEJ1ZmZlci5mcm9tKHNjcmlwdFNpZyksIC8vIHZpblswXS5zY3JpcHRTaWcgPSBPUF8wIFBVU0gzMlsgbWVzc2FnZV9oYXNoIF1cbiAgICB3aXRuZXNzU2NyaXB0OiBCdWZmZXIuZnJvbShbXSksIC8vIHZpblswXS5zY3JpcHRXaXRuZXNzID0gW11cbiAgfSk7XG4gIC8vIFNldCB0aGUgb3V0cHV0XG4gIHBzYnQuYWRkT3V0cHV0KHtcbiAgICB2YWx1ZTogQmlnSW50KDApLCAvLyB2b3V0WzBdLm5WYWx1ZSA9IDBcbiAgICBzY3JpcHQ6IHNjcmlwdFB1YktleSwgLy8gdm91dFswXS5zY3JpcHRQdWJLZXkgPSBtZXNzYWdlX2NoYWxsZW5nZVxuICB9KTtcbiAgLy8gUmV0dXJuIHRyYW5zYWN0aW9uXG4gIHJldHVybiBwc2J0LmV4dHJhY3RUcmFuc2FjdGlvbigpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRUb1NwZW5kVHJhbnNhY3Rpb25Gcm9tQ2hhaW5BbmRJbmRleChcbiAgcm9vdFdhbGxldEtleXM6IGJpdGdvLlJvb3RXYWxsZXRLZXlzLFxuICBjaGFpbjogYml0Z28uQ2hhaW5Db2RlLFxuICBpbmRleDogbnVtYmVyLFxuICBtZXNzYWdlOiBzdHJpbmcgfCBCdWZmZXIsXG4gIHRhZyA9IEJJUDMyMl9UQUdcbik6IFRyYW5zYWN0aW9uPGJpZ2ludD4ge1xuICBjb25zdCBvdXRwdXRTY3JpcHQgPSBiaXRnby5vdXRwdXRTY3JpcHRzLmNyZWF0ZU91dHB1dFNjcmlwdDJvZjMoXG4gICAgcm9vdFdhbGxldEtleXMuZGVyaXZlRm9yQ2hhaW5BbmRJbmRleChjaGFpbiwgaW5kZXgpLnB1YmxpY0tleXMsXG4gICAgYml0Z28uc2NyaXB0VHlwZUZvckNoYWluKGNoYWluKSxcbiAgICBuZXR3b3Jrcy5iaXRjb2luXG4gICk7XG4gIHJldHVybiBidWlsZFRvU3BlbmRUcmFuc2FjdGlvbihvdXRwdXRTY3JpcHQuc2NyaXB0UHViS2V5LCBtZXNzYWdlLCB0YWcpO1xufVxuIl19
@@ -0,0 +1,18 @@
1
+ import * as utxolib from '@bitgo-beta/utxo-lib';
2
+ export declare function addBip322ProofMessage(psbt: utxolib.Psbt, inputIndex: number, message: Buffer): void;
3
+ /**
4
+ * Get the BIP322 proof message at a specific input index of the PSBT
5
+ * @param psbt
6
+ * @param inputIndex
7
+ * @returns The BIP322 proof message as a Buffer, or undefined if not found
8
+ */
9
+ export declare function getBip322ProofMessageAtIndex(psbt: utxolib.Psbt, inputIndex: number): Buffer | undefined;
10
+ /**
11
+ * checks if the transaction contains a BIP322 proof
12
+ * does not check if the proof is valid
13
+ * Source: https://github.com/bitcoin/bips/blob/master/bip-0322.mediawiki#user-content-Full
14
+ * @params tx The transaction or the PSBT to check
15
+ * @returns boolean
16
+ */
17
+ export declare function isBip322ProofCheck(tx: utxolib.bitgo.UtxoPsbt | utxolib.bitgo.UtxoTransaction<bigint>): boolean;
18
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/bip322/utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,sBAAsB,CAAC;AAEhD,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CASnG;AAED;;;;;GAKG;AACH,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAevG;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,OAAO,CAAC,KAAK,CAAC,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,eAAe,CAAC,MAAM,CAAC,GAAG,OAAO,CAmC9G"}
@@ -0,0 +1,115 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.addBip322ProofMessage = addBip322ProofMessage;
37
+ exports.getBip322ProofMessageAtIndex = getBip322ProofMessageAtIndex;
38
+ exports.isBip322ProofCheck = isBip322ProofCheck;
39
+ const utxolib = __importStar(require("@bitgo-beta/utxo-lib"));
40
+ function addBip322ProofMessage(psbt, inputIndex, message) {
41
+ utxolib.bitgo.addProprietaryKeyValuesFromUnknownKeyValues(psbt, 'input', inputIndex, {
42
+ key: {
43
+ identifier: utxolib.bitgo.PSBT_PROPRIETARY_IDENTIFIER,
44
+ subtype: utxolib.bitgo.ProprietaryKeySubtype.BIP322_MESSAGE,
45
+ keydata: Buffer.alloc(0),
46
+ },
47
+ value: message,
48
+ });
49
+ }
50
+ /**
51
+ * Get the BIP322 proof message at a specific input index of the PSBT
52
+ * @param psbt
53
+ * @param inputIndex
54
+ * @returns The BIP322 proof message as a Buffer, or undefined if not found
55
+ */
56
+ function getBip322ProofMessageAtIndex(psbt, inputIndex) {
57
+ if (psbt.data.inputs.length <= inputIndex) {
58
+ throw new Error(`Input index ${inputIndex} is out of bounds for the PSBT`);
59
+ }
60
+ const input = psbt.data.inputs[inputIndex];
61
+ const proprietaryKeyVals = utxolib.bitgo.getPsbtInputProprietaryKeyVals(input, {
62
+ identifier: utxolib.bitgo.PSBT_PROPRIETARY_IDENTIFIER,
63
+ subtype: utxolib.bitgo.ProprietaryKeySubtype.BIP322_MESSAGE,
64
+ });
65
+ if (proprietaryKeyVals.length === 0) {
66
+ return undefined;
67
+ }
68
+ else if (proprietaryKeyVals.length > 1) {
69
+ throw new Error(`Multiple BIP322 messages found at input index ${inputIndex}`);
70
+ }
71
+ return Buffer.from(proprietaryKeyVals[0].value);
72
+ }
73
+ /**
74
+ * checks if the transaction contains a BIP322 proof
75
+ * does not check if the proof is valid
76
+ * Source: https://github.com/bitcoin/bips/blob/master/bip-0322.mediawiki#user-content-Full
77
+ * @params tx The transaction or the PSBT to check
78
+ * @returns boolean
79
+ */
80
+ function isBip322ProofCheck(tx) {
81
+ if (tx instanceof utxolib.bitgo.UtxoPsbt) {
82
+ if (tx.version !== 0 || tx.locktime !== 0 || tx.data.outputs.length !== 1) {
83
+ return false;
84
+ }
85
+ const output = tx.txOutputs[0];
86
+ if (output.script.toString('hex') !== '6a' || output.value !== 0n) {
87
+ return false;
88
+ }
89
+ // Return true if there is a message encoded in every input in the proprietary field
90
+ return tx.data.inputs.every((input, index) => getBip322ProofMessageAtIndex(tx, index) !== undefined);
91
+ }
92
+ else if (tx instanceof utxolib.bitgo.UtxoTransaction) {
93
+ if (tx.version !== 0 || tx.locktime !== 0 || tx.outs.length !== 1) {
94
+ return false;
95
+ }
96
+ if (tx.outs.length !== 1) {
97
+ return false;
98
+ }
99
+ const output = tx.outs[0];
100
+ // check that the only output is an OP_RETURN with 0 value
101
+ if (output.script.toString('hex') !== '6a' || output.value !== 0n) {
102
+ return false;
103
+ }
104
+ for (const input of tx.ins) {
105
+ if (input.index !== 0 || input.sequence !== 0) {
106
+ return false;
107
+ }
108
+ }
109
+ return true;
110
+ }
111
+ else {
112
+ throw new Error('Unsupported transaction type for BIP322 proof check');
113
+ }
114
+ }
115
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYmlwMzIyL3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRUEsc0RBU0M7QUFRRCxvRUFlQztBQVNELGdEQW1DQztBQTlFRCw4REFBZ0Q7QUFFaEQsU0FBZ0IscUJBQXFCLENBQUMsSUFBa0IsRUFBRSxVQUFrQixFQUFFLE9BQWU7SUFDM0YsT0FBTyxDQUFDLEtBQUssQ0FBQywyQ0FBMkMsQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRTtRQUNuRixHQUFHLEVBQUU7WUFDSCxVQUFVLEVBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQywyQkFBMkI7WUFDckQsT0FBTyxFQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMscUJBQXFCLENBQUMsY0FBYztZQUMzRCxPQUFPLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7U0FDekI7UUFDRCxLQUFLLEVBQUUsT0FBTztLQUNmLENBQUMsQ0FBQztBQUNMLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILFNBQWdCLDRCQUE0QixDQUFDLElBQWtCLEVBQUUsVUFBa0I7SUFDakYsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLElBQUksVUFBVSxFQUFFLENBQUM7UUFDMUMsTUFBTSxJQUFJLEtBQUssQ0FBQyxlQUFlLFVBQVUsZ0NBQWdDLENBQUMsQ0FBQztJQUM3RSxDQUFDO0lBQ0QsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDM0MsTUFBTSxrQkFBa0IsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLDhCQUE4QixDQUFDLEtBQUssRUFBRTtRQUM3RSxVQUFVLEVBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQywyQkFBMkI7UUFDckQsT0FBTyxFQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMscUJBQXFCLENBQUMsY0FBYztLQUM1RCxDQUFDLENBQUM7SUFDSCxJQUFJLGtCQUFrQixDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUNwQyxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO1NBQU0sSUFBSSxrQkFBa0IsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDekMsTUFBTSxJQUFJLEtBQUssQ0FBQyxpREFBaUQsVUFBVSxFQUFFLENBQUMsQ0FBQztJQUNqRixDQUFDO0lBQ0QsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ2xELENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxTQUFnQixrQkFBa0IsQ0FBQyxFQUFrRTtJQUNuRyxJQUFJLEVBQUUsWUFBWSxPQUFPLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ3pDLElBQUksRUFBRSxDQUFDLE9BQU8sS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLFFBQVEsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQzFFLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztRQUNELE1BQU0sTUFBTSxHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDL0IsSUFBSSxNQUFNLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsS0FBSyxJQUFJLElBQUksTUFBTSxDQUFDLEtBQUssS0FBSyxFQUFFLEVBQUUsQ0FBQztZQUNsRSxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7UUFFRCxvRkFBb0Y7UUFDcEYsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyw0QkFBNEIsQ0FBQyxFQUFFLEVBQUUsS0FBSyxDQUFDLEtBQUssU0FBUyxDQUFDLENBQUM7SUFDdkcsQ0FBQztTQUFNLElBQUksRUFBRSxZQUFZLE9BQU8sQ0FBQyxLQUFLLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDdkQsSUFBSSxFQUFFLENBQUMsT0FBTyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsUUFBUSxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUNsRSxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7UUFDRCxJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3pCLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztRQUNELE1BQU0sTUFBTSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDMUIsMERBQTBEO1FBQzFELElBQUksTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEtBQUssSUFBSSxJQUFJLE1BQU0sQ0FBQyxLQUFLLEtBQUssRUFBRSxFQUFFLENBQUM7WUFDbEUsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO1FBRUQsS0FBSyxNQUFNLEtBQUssSUFBSSxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDM0IsSUFBSSxLQUFLLENBQUMsS0FBSyxLQUFLLENBQUMsSUFBSSxLQUFLLENBQUMsUUFBUSxLQUFLLENBQUMsRUFBRSxDQUFDO2dCQUM5QyxPQUFPLEtBQUssQ0FBQztZQUNmLENBQUM7UUFDSCxDQUFDO1FBRUQsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO1NBQU0sQ0FBQztRQUNOLE1BQU0sSUFBSSxLQUFLLENBQUMscURBQXFELENBQUMsQ0FBQztJQUN6RSxDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIHV0eG9saWIgZnJvbSAnQGJpdGdvLWJldGEvdXR4by1saWInO1xuXG5leHBvcnQgZnVuY3Rpb24gYWRkQmlwMzIyUHJvb2ZNZXNzYWdlKHBzYnQ6IHV0eG9saWIuUHNidCwgaW5wdXRJbmRleDogbnVtYmVyLCBtZXNzYWdlOiBCdWZmZXIpOiB2b2lkIHtcbiAgdXR4b2xpYi5iaXRnby5hZGRQcm9wcmlldGFyeUtleVZhbHVlc0Zyb21Vbmtub3duS2V5VmFsdWVzKHBzYnQsICdpbnB1dCcsIGlucHV0SW5kZXgsIHtcbiAgICBrZXk6IHtcbiAgICAgIGlkZW50aWZpZXI6IHV0eG9saWIuYml0Z28uUFNCVF9QUk9QUklFVEFSWV9JREVOVElGSUVSLFxuICAgICAgc3VidHlwZTogdXR4b2xpYi5iaXRnby5Qcm9wcmlldGFyeUtleVN1YnR5cGUuQklQMzIyX01FU1NBR0UsXG4gICAgICBrZXlkYXRhOiBCdWZmZXIuYWxsb2MoMCksXG4gICAgfSxcbiAgICB2YWx1ZTogbWVzc2FnZSxcbiAgfSk7XG59XG5cbi8qKlxuICogR2V0IHRoZSBCSVAzMjIgcHJvb2YgbWVzc2FnZSBhdCBhIHNwZWNpZmljIGlucHV0IGluZGV4IG9mIHRoZSBQU0JUXG4gKiBAcGFyYW0gcHNidFxuICogQHBhcmFtIGlucHV0SW5kZXhcbiAqIEByZXR1cm5zIFRoZSBCSVAzMjIgcHJvb2YgbWVzc2FnZSBhcyBhIEJ1ZmZlciwgb3IgdW5kZWZpbmVkIGlmIG5vdCBmb3VuZFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0QmlwMzIyUHJvb2ZNZXNzYWdlQXRJbmRleChwc2J0OiB1dHhvbGliLlBzYnQsIGlucHV0SW5kZXg6IG51bWJlcik6IEJ1ZmZlciB8IHVuZGVmaW5lZCB7XG4gIGlmIChwc2J0LmRhdGEuaW5wdXRzLmxlbmd0aCA8PSBpbnB1dEluZGV4KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnB1dCBpbmRleCAke2lucHV0SW5kZXh9IGlzIG91dCBvZiBib3VuZHMgZm9yIHRoZSBQU0JUYCk7XG4gIH1cbiAgY29uc3QgaW5wdXQgPSBwc2J0LmRhdGEuaW5wdXRzW2lucHV0SW5kZXhdO1xuICBjb25zdCBwcm9wcmlldGFyeUtleVZhbHMgPSB1dHhvbGliLmJpdGdvLmdldFBzYnRJbnB1dFByb3ByaWV0YXJ5S2V5VmFscyhpbnB1dCwge1xuICAgIGlkZW50aWZpZXI6IHV0eG9saWIuYml0Z28uUFNCVF9QUk9QUklFVEFSWV9JREVOVElGSUVSLFxuICAgIHN1YnR5cGU6IHV0eG9saWIuYml0Z28uUHJvcHJpZXRhcnlLZXlTdWJ0eXBlLkJJUDMyMl9NRVNTQUdFLFxuICB9KTtcbiAgaWYgKHByb3ByaWV0YXJ5S2V5VmFscy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9IGVsc2UgaWYgKHByb3ByaWV0YXJ5S2V5VmFscy5sZW5ndGggPiAxKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBNdWx0aXBsZSBCSVAzMjIgbWVzc2FnZXMgZm91bmQgYXQgaW5wdXQgaW5kZXggJHtpbnB1dEluZGV4fWApO1xuICB9XG4gIHJldHVybiBCdWZmZXIuZnJvbShwcm9wcmlldGFyeUtleVZhbHNbMF0udmFsdWUpO1xufVxuXG4vKipcbiAqIGNoZWNrcyBpZiB0aGUgdHJhbnNhY3Rpb24gY29udGFpbnMgYSBCSVAzMjIgcHJvb2ZcbiAqIGRvZXMgbm90IGNoZWNrIGlmIHRoZSBwcm9vZiBpcyB2YWxpZFxuICogU291cmNlOiBodHRwczovL2dpdGh1Yi5jb20vYml0Y29pbi9iaXBzL2Jsb2IvbWFzdGVyL2JpcC0wMzIyLm1lZGlhd2lraSN1c2VyLWNvbnRlbnQtRnVsbFxuICogQHBhcmFtcyB0eCBUaGUgdHJhbnNhY3Rpb24gb3IgdGhlIFBTQlQgdG8gY2hlY2tcbiAqIEByZXR1cm5zIGJvb2xlYW5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQmlwMzIyUHJvb2ZDaGVjayh0eDogdXR4b2xpYi5iaXRnby5VdHhvUHNidCB8IHV0eG9saWIuYml0Z28uVXR4b1RyYW5zYWN0aW9uPGJpZ2ludD4pOiBib29sZWFuIHtcbiAgaWYgKHR4IGluc3RhbmNlb2YgdXR4b2xpYi5iaXRnby5VdHhvUHNidCkge1xuICAgIGlmICh0eC52ZXJzaW9uICE9PSAwIHx8IHR4LmxvY2t0aW1lICE9PSAwIHx8IHR4LmRhdGEub3V0cHV0cy5sZW5ndGggIT09IDEpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3Qgb3V0cHV0ID0gdHgudHhPdXRwdXRzWzBdO1xuICAgIGlmIChvdXRwdXQuc2NyaXB0LnRvU3RyaW5nKCdoZXgnKSAhPT0gJzZhJyB8fCBvdXRwdXQudmFsdWUgIT09IDBuKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gUmV0dXJuIHRydWUgaWYgdGhlcmUgaXMgYSBtZXNzYWdlIGVuY29kZWQgaW4gZXZlcnkgaW5wdXQgaW4gdGhlIHByb3ByaWV0YXJ5IGZpZWxkXG4gICAgcmV0dXJuIHR4LmRhdGEuaW5wdXRzLmV2ZXJ5KChpbnB1dCwgaW5kZXgpID0+IGdldEJpcDMyMlByb29mTWVzc2FnZUF0SW5kZXgodHgsIGluZGV4KSAhPT0gdW5kZWZpbmVkKTtcbiAgfSBlbHNlIGlmICh0eCBpbnN0YW5jZW9mIHV0eG9saWIuYml0Z28uVXR4b1RyYW5zYWN0aW9uKSB7XG4gICAgaWYgKHR4LnZlcnNpb24gIT09IDAgfHwgdHgubG9ja3RpbWUgIT09IDAgfHwgdHgub3V0cy5sZW5ndGggIT09IDEpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKHR4Lm91dHMubGVuZ3RoICE9PSAxKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IG91dHB1dCA9IHR4Lm91dHNbMF07XG4gICAgLy8gY2hlY2sgdGhhdCB0aGUgb25seSBvdXRwdXQgaXMgYW4gT1BfUkVUVVJOIHdpdGggMCB2YWx1ZVxuICAgIGlmIChvdXRwdXQuc2NyaXB0LnRvU3RyaW5nKCdoZXgnKSAhPT0gJzZhJyB8fCBvdXRwdXQudmFsdWUgIT09IDBuKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBpbnB1dCBvZiB0eC5pbnMpIHtcbiAgICAgIGlmIChpbnB1dC5pbmRleCAhPT0gMCB8fCBpbnB1dC5zZXF1ZW5jZSAhPT0gMCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdVbnN1cHBvcnRlZCB0cmFuc2FjdGlvbiB0eXBlIGZvciBCSVAzMjIgcHJvb2YgY2hlY2snKTtcbiAgfVxufVxuIl19
@@ -0,0 +1,12 @@
1
+ import * as utxolib from '@bitgo-beta/utxo-lib';
2
+ export type MessageInfo = {
3
+ address: string;
4
+ message: string;
5
+ pubkeys: string[];
6
+ scriptType: utxolib.bitgo.outputScripts.ScriptType2Of3;
7
+ };
8
+ export declare function assertBaseTx(tx: utxolib.bitgo.UtxoTransaction<bigint>): void;
9
+ export declare function assertTxInput(tx: utxolib.bitgo.UtxoTransaction<bigint>, inputIndex: number, prevOuts: utxolib.TxOutput<bigint>[], info: MessageInfo, checkSignature: boolean): void;
10
+ export declare function assertBip322TxProof(tx: utxolib.bitgo.UtxoTransaction<bigint>, messageInfo: MessageInfo[]): void;
11
+ export declare function assertBip322PsbtProof(psbt: utxolib.bitgo.UtxoPsbt, messageInfo: MessageInfo[]): void;
12
+ //# sourceMappingURL=verify.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verify.d.ts","sourceRoot":"","sources":["../../../src/bip322/verify.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,OAAO,MAAM,sBAAsB,CAAC;AAIhD,MAAM,MAAM,WAAW,GAAG;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAEhB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,UAAU,EAAE,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC,cAAc,CAAC;CACxD,CAAC;AAEF,wBAAgB,YAAY,CAAC,EAAE,EAAE,OAAO,CAAC,KAAK,CAAC,eAAe,CAAC,MAAM,CAAC,GAAG,IAAI,CAM5E;AAED,wBAAgB,aAAa,CAC3B,EAAE,EAAE,OAAO,CAAC,KAAK,CAAC,eAAe,CAAC,MAAM,CAAC,EACzC,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,EACpC,IAAI,EAAE,WAAW,EACjB,cAAc,EAAE,OAAO,GACtB,IAAI,CA8CN;AAED,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,OAAO,CAAC,KAAK,CAAC,eAAe,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,WAAW,EAAE,GAAG,IAAI,CAkB/G;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,WAAW,EAAE,WAAW,EAAE,GAAG,IAAI,CA2CpG"}