@bitgo-beta/utxo-core 1.8.1-beta.61 → 1.8.1-beta.610
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.
- package/dist/cjs/src/Output.d.ts.map +1 -0
- package/dist/cjs/src/Output.js +60 -0
- package/dist/cjs/src/bip322/index.d.ts +5 -0
- package/dist/cjs/src/bip322/index.d.ts.map +1 -0
- package/dist/cjs/src/bip322/index.js +21 -0
- package/dist/cjs/src/bip322/toSign.d.ts +25 -0
- package/dist/cjs/src/bip322/toSign.d.ts.map +1 -0
- package/dist/cjs/src/bip322/toSign.js +126 -0
- package/dist/cjs/src/bip322/toSpend.d.ts +22 -0
- package/dist/cjs/src/bip322/toSpend.d.ts.map +1 -0
- package/dist/cjs/src/bip322/toSpend.js +72 -0
- package/dist/cjs/src/bip322/utils.d.ts +18 -0
- package/dist/cjs/src/bip322/utils.d.ts.map +1 -0
- package/dist/cjs/src/bip322/utils.js +115 -0
- package/dist/cjs/src/bip322/verify.d.ts +12 -0
- package/dist/cjs/src/bip322/verify.d.ts.map +1 -0
- package/dist/cjs/src/bip322/verify.js +115 -0
- package/dist/cjs/src/bip32utils.d.ts +16 -0
- package/dist/cjs/src/bip32utils.d.ts.map +1 -0
- package/dist/cjs/src/bip32utils.js +71 -0
- package/dist/cjs/src/bip65/index.d.ts.map +1 -0
- package/dist/{src → cjs/src}/bip65/index.js +1 -1
- package/dist/cjs/src/bip65/locktime.d.ts.map +1 -0
- package/dist/cjs/src/bip65/locktime.js +37 -0
- package/dist/{src → cjs/src}/descriptor/DescriptorMap.d.ts +1 -1
- package/dist/cjs/src/descriptor/DescriptorMap.d.ts.map +1 -0
- package/dist/cjs/src/descriptor/DescriptorMap.js +9 -0
- package/dist/{src → cjs/src}/descriptor/Output.d.ts +1 -1
- package/dist/cjs/src/descriptor/Output.d.ts.map +1 -0
- package/dist/cjs/src/descriptor/Output.js +41 -0
- package/dist/{src → cjs/src}/descriptor/VirtualSize.d.ts +1 -1
- package/dist/cjs/src/descriptor/VirtualSize.d.ts.map +1 -0
- package/dist/cjs/src/descriptor/VirtualSize.js +100 -0
- package/dist/{src → cjs/src}/descriptor/address.d.ts +1 -1
- package/dist/cjs/src/descriptor/address.d.ts.map +1 -0
- package/dist/{src → cjs/src}/descriptor/address.js +1 -1
- package/dist/{src → cjs/src}/descriptor/derive.d.ts +1 -1
- package/dist/cjs/src/descriptor/derive.d.ts.map +1 -0
- package/dist/cjs/src/descriptor/derive.js +45 -0
- package/dist/{src → cjs/src}/descriptor/fromFixedScriptWallet.d.ts +1 -1
- package/dist/cjs/src/descriptor/fromFixedScriptWallet.d.ts.map +1 -0
- package/dist/cjs/src/descriptor/fromFixedScriptWallet.js +88 -0
- package/dist/{src → cjs/src}/descriptor/index.d.ts +1 -0
- package/dist/cjs/src/descriptor/index.d.ts.map +1 -0
- package/dist/{src → cjs/src}/descriptor/index.js +2 -1
- package/dist/cjs/src/descriptor/parse/PatternMatcher.d.ts +14 -0
- package/dist/cjs/src/descriptor/parse/PatternMatcher.d.ts.map +1 -0
- package/dist/cjs/src/descriptor/parse/PatternMatcher.js +60 -0
- package/dist/{src → cjs/src}/descriptor/psbt/assertSatisfiable.d.ts +1 -1
- package/dist/cjs/src/descriptor/psbt/assertSatisfiable.d.ts.map +1 -0
- package/dist/cjs/src/descriptor/psbt/assertSatisfiable.js +74 -0
- package/dist/{src → cjs/src}/descriptor/psbt/createPsbt.d.ts +4 -0
- package/dist/cjs/src/descriptor/psbt/createPsbt.d.ts.map +1 -0
- package/dist/cjs/src/descriptor/psbt/createPsbt.js +107 -0
- package/dist/{src → cjs/src}/descriptor/psbt/findDescriptors.d.ts +1 -1
- package/dist/cjs/src/descriptor/psbt/findDescriptors.d.ts.map +1 -0
- package/dist/cjs/src/descriptor/psbt/findDescriptors.js +98 -0
- package/dist/cjs/src/descriptor/psbt/index.d.ts.map +1 -0
- package/dist/{src → cjs/src}/descriptor/psbt/index.js +1 -1
- package/dist/{src → cjs/src}/descriptor/psbt/parse.d.ts +1 -1
- package/dist/cjs/src/descriptor/psbt/parse.d.ts.map +1 -0
- package/dist/cjs/src/descriptor/psbt/parse.js +87 -0
- package/dist/{src → cjs/src}/descriptor/psbt/sign.d.ts +4 -4
- package/dist/cjs/src/descriptor/psbt/sign.d.ts.map +1 -0
- package/dist/cjs/src/descriptor/psbt/sign.js +42 -0
- package/dist/{src → cjs/src}/descriptor/psbt/wrap.d.ts +1 -1
- package/dist/cjs/src/descriptor/psbt/wrap.d.ts.map +1 -0
- package/dist/cjs/src/descriptor/psbt/wrap.js +76 -0
- package/dist/cjs/src/dustThreshold.d.ts.map +1 -0
- package/dist/cjs/src/dustThreshold.js +134 -0
- package/dist/{src → cjs/src}/index.d.ts +1 -0
- package/dist/cjs/src/index.d.ts.map +1 -0
- package/dist/{src → cjs/src}/index.js +3 -2
- package/dist/cjs/src/paygo/attestation.d.ts +11 -0
- package/dist/cjs/src/paygo/attestation.d.ts.map +1 -0
- package/dist/cjs/src/paygo/attestation.js +58 -0
- package/dist/cjs/src/paygo/index.d.ts +3 -0
- package/dist/cjs/src/paygo/index.d.ts.map +1 -0
- package/dist/cjs/src/paygo/index.js +19 -0
- package/dist/{src/paygo/ExtractAddressPayGoAttestation.d.ts → cjs/src/paygo/parsePayGoAttestation.d.ts} +8 -3
- package/dist/cjs/src/paygo/parsePayGoAttestation.d.ts.map +1 -0
- package/dist/cjs/src/paygo/parsePayGoAttestation.js +50 -0
- package/dist/cjs/src/paygo/psbt/Errors.d.ts +22 -0
- package/dist/cjs/src/paygo/psbt/Errors.d.ts.map +1 -0
- package/dist/cjs/src/paygo/psbt/Errors.js +44 -0
- package/dist/cjs/src/paygo/psbt/index.d.ts +2 -0
- package/dist/cjs/src/paygo/psbt/index.d.ts.map +1 -0
- package/dist/{src/paygo → cjs/src/paygo/psbt}/index.js +2 -2
- package/dist/cjs/src/paygo/psbt/payGoAddressProof.d.ts +29 -0
- package/dist/cjs/src/paygo/psbt/payGoAddressProof.d.ts.map +1 -0
- package/dist/cjs/src/paygo/psbt/payGoAddressProof.js +124 -0
- package/dist/{src → cjs/src}/testutil/descriptor/descriptors.d.ts +4 -1
- package/dist/cjs/src/testutil/descriptor/descriptors.d.ts.map +1 -0
- package/dist/cjs/src/testutil/descriptor/descriptors.js +162 -0
- package/dist/cjs/src/testutil/descriptor/index.d.ts.map +1 -0
- package/dist/{src → cjs/src}/testutil/descriptor/index.js +1 -1
- package/dist/{src → cjs/src}/testutil/descriptor/mock.utils.d.ts +3 -1
- package/dist/cjs/src/testutil/descriptor/mock.utils.d.ts.map +1 -0
- package/dist/cjs/src/testutil/descriptor/mock.utils.js +92 -0
- package/dist/cjs/src/testutil/descriptor/psbt.utils.d.ts.map +1 -0
- package/dist/cjs/src/testutil/descriptor/psbt.utils.js +21 -0
- package/dist/cjs/src/testutil/fixtures.utils.d.ts.map +1 -0
- package/dist/cjs/src/testutil/fixtures.utils.js +127 -0
- package/dist/{src → cjs/src}/testutil/generatePayGoAttestationProof.utils.d.ts +1 -1
- package/dist/cjs/src/testutil/generatePayGoAttestationProof.utils.d.ts.map +1 -0
- package/dist/cjs/src/testutil/generatePayGoAttestationProof.utils.js +38 -0
- package/dist/{src → cjs/src}/testutil/index.d.ts +1 -0
- package/dist/cjs/src/testutil/index.d.ts.map +1 -0
- package/dist/{src → cjs/src}/testutil/index.js +2 -1
- package/dist/{src → cjs/src}/testutil/key.utils.d.ts +1 -1
- package/dist/cjs/src/testutil/key.utils.d.ts.map +1 -0
- package/dist/cjs/src/testutil/key.utils.js +60 -0
- package/dist/cjs/src/testutil/toPlainObject.utils.d.ts.map +1 -0
- package/dist/cjs/src/testutil/toPlainObject.utils.js +89 -0
- package/dist/cjs/src/testutil/trimMessagePrefix.d.ts +11 -0
- package/dist/cjs/src/testutil/trimMessagePrefix.d.ts.map +1 -0
- package/dist/cjs/src/testutil/trimMessagePrefix.js +60 -0
- package/dist/cjs/src/xOnlyPubkey.d.ts.map +1 -0
- package/dist/cjs/src/xOnlyPubkey.js +18 -0
- package/dist/cjs/test/Output.d.ts +2 -0
- package/dist/cjs/test/Output.d.ts.map +1 -0
- package/dist/cjs/test/Output.js +70 -0
- package/dist/cjs/test/bip322/bip322.utils.d.ts +7 -0
- package/dist/cjs/test/bip322/bip322.utils.d.ts.map +1 -0
- package/dist/cjs/test/bip322/bip322.utils.js +16 -0
- package/dist/cjs/test/bip322/toSign.d.ts +2 -0
- package/dist/cjs/test/bip322/toSign.d.ts.map +1 -0
- package/dist/cjs/test/bip322/toSign.js +133 -0
- package/dist/cjs/test/bip322/toSpend.d.ts +2 -0
- package/dist/cjs/test/bip322/toSpend.d.ts.map +1 -0
- package/dist/cjs/test/bip322/toSpend.js +70 -0
- package/dist/cjs/test/bip322/utils.d.ts +2 -0
- package/dist/cjs/test/bip322/utils.d.ts.map +1 -0
- package/dist/cjs/test/bip322/utils.js +79 -0
- package/dist/cjs/test/bip322/verify.d.ts +2 -0
- package/dist/cjs/test/bip322/verify.d.ts.map +1 -0
- package/dist/cjs/test/bip322/verify.js +293 -0
- package/dist/cjs/test/bip32utils.d.ts +2 -0
- package/dist/cjs/test/bip32utils.d.ts.map +1 -0
- package/dist/cjs/test/bip32utils.js +62 -0
- package/dist/cjs/test/bip65/locktime.d.ts +2 -0
- package/dist/cjs/test/bip65/locktime.d.ts.map +1 -0
- package/dist/cjs/test/bip65/locktime.js +22 -0
- package/dist/cjs/test/descriptor/Output.d.ts +2 -0
- package/dist/cjs/test/descriptor/Output.d.ts.map +1 -0
- package/dist/cjs/test/descriptor/Output.js +44 -0
- package/dist/cjs/test/descriptor/derive.d.ts +2 -0
- package/dist/cjs/test/descriptor/derive.d.ts.map +1 -0
- package/dist/cjs/test/descriptor/derive.js +27 -0
- package/dist/cjs/test/descriptor/fromFixedScriptWallet.d.ts +2 -0
- package/dist/cjs/test/descriptor/fromFixedScriptWallet.d.ts.map +1 -0
- package/dist/cjs/test/descriptor/fromFixedScriptWallet.js +145 -0
- package/dist/cjs/test/descriptor/parse/PatternMatcher.d.ts +2 -0
- package/dist/cjs/test/descriptor/parse/PatternMatcher.d.ts.map +1 -0
- package/dist/cjs/test/descriptor/parse/PatternMatcher.js +120 -0
- package/dist/cjs/test/descriptor/psbt/VirtualSize.d.ts +2 -0
- package/dist/cjs/test/descriptor/psbt/VirtualSize.d.ts.map +1 -0
- package/dist/cjs/test/descriptor/psbt/VirtualSize.js +71 -0
- package/dist/cjs/test/descriptor/psbt/assertSatisfiable.d.ts +2 -0
- package/dist/cjs/test/descriptor/psbt/assertSatisfiable.d.ts.map +1 -0
- package/dist/cjs/test/descriptor/psbt/assertSatisfiable.js +56 -0
- package/dist/cjs/test/descriptor/psbt/findDescriptors.d.ts +2 -0
- package/dist/cjs/test/descriptor/psbt/findDescriptors.d.ts.map +1 -0
- package/dist/cjs/test/descriptor/psbt/findDescriptors.js +70 -0
- package/dist/cjs/test/descriptor/psbt/psbt.d.ts +2 -0
- package/dist/cjs/test/descriptor/psbt/psbt.d.ts.map +1 -0
- package/dist/cjs/test/descriptor/psbt/psbt.js +211 -0
- package/dist/cjs/test/dustThreshold.d.ts +2 -0
- package/dist/cjs/test/dustThreshold.d.ts.map +1 -0
- package/dist/cjs/test/dustThreshold.js +110 -0
- package/dist/cjs/test/paygo/attestation.d.ts +2 -0
- package/dist/cjs/test/paygo/attestation.d.ts.map +1 -0
- package/dist/cjs/test/paygo/attestation.js +23 -0
- package/dist/cjs/test/paygo/parsePayGoAttestation.d.ts +2 -0
- package/dist/cjs/test/paygo/parsePayGoAttestation.d.ts.map +1 -0
- package/dist/cjs/test/paygo/parsePayGoAttestation.js +75 -0
- package/dist/cjs/test/paygo/psbt/payGoAddressProof.d.ts +9 -0
- package/dist/cjs/test/paygo/psbt/payGoAddressProof.d.ts.map +1 -0
- package/dist/cjs/test/paygo/psbt/payGoAddressProof.js +163 -0
- package/dist/cjs/test/xOnlyPubkey.d.ts +2 -0
- package/dist/cjs/test/xOnlyPubkey.d.ts.map +1 -0
- package/dist/cjs/test/xOnlyPubkey.js +18 -0
- package/dist/cjs/tsconfig.tsbuildinfo +1 -0
- package/dist/esm/Output.d.ts +43 -0
- package/dist/esm/Output.js +53 -0
- package/dist/esm/bip322/index.d.ts +5 -0
- package/dist/esm/bip322/index.d.ts.map +1 -0
- package/dist/esm/bip322/index.js +5 -0
- package/dist/esm/bip322/toSign.d.ts +25 -0
- package/dist/esm/bip322/toSign.d.ts.map +1 -0
- package/dist/esm/bip322/toSign.js +120 -0
- package/dist/esm/bip322/toSpend.d.ts +22 -0
- package/dist/esm/bip322/toSpend.d.ts.map +1 -0
- package/dist/esm/bip322/toSpend.js +66 -0
- package/dist/esm/bip322/utils.d.ts +18 -0
- package/dist/esm/bip322/utils.d.ts.map +1 -0
- package/dist/esm/bip322/utils.js +77 -0
- package/dist/esm/bip322/verify.d.ts +12 -0
- package/dist/esm/bip322/verify.d.ts.map +1 -0
- package/dist/esm/bip322/verify.js +76 -0
- package/dist/esm/bip32utils.d.ts +16 -0
- package/dist/esm/bip32utils.d.ts.map +1 -0
- package/dist/esm/bip32utils.js +34 -0
- package/dist/esm/bip65/index.d.ts +2 -0
- package/dist/esm/bip65/index.js +2 -0
- package/dist/esm/bip65/locktime.d.ts +8 -0
- package/dist/esm/bip65/locktime.js +34 -0
- package/dist/esm/descriptor/DescriptorMap.d.ts +9 -0
- package/dist/{src → esm}/descriptor/DescriptorMap.d.ts.map +1 -1
- package/dist/esm/descriptor/DescriptorMap.js +6 -0
- package/dist/esm/descriptor/Output.d.ts +23 -0
- package/dist/{src → esm}/descriptor/Output.d.ts.map +1 -1
- package/dist/esm/descriptor/Output.js +32 -0
- package/dist/esm/descriptor/VirtualSize.d.ts +23 -0
- package/dist/{src → esm}/descriptor/VirtualSize.d.ts.map +1 -1
- package/dist/esm/descriptor/VirtualSize.js +94 -0
- package/dist/esm/descriptor/address.d.ts +5 -0
- package/dist/{src → esm}/descriptor/address.d.ts.map +1 -1
- package/dist/esm/descriptor/address.js +11 -0
- package/dist/esm/descriptor/derive.d.ts +13 -0
- package/dist/{src → esm}/descriptor/derive.d.ts.map +1 -1
- package/dist/esm/descriptor/derive.js +38 -0
- package/dist/esm/descriptor/fromFixedScriptWallet.d.ts +16 -0
- package/dist/{src → esm}/descriptor/fromFixedScriptWallet.d.ts.map +1 -1
- package/dist/esm/descriptor/fromFixedScriptWallet.js +51 -0
- package/dist/esm/descriptor/index.d.ts +11 -0
- package/dist/{src → esm}/descriptor/index.d.ts.map +1 -1
- package/dist/esm/descriptor/index.js +11 -0
- package/dist/esm/descriptor/parse/PatternMatcher.d.ts +14 -0
- package/dist/esm/descriptor/parse/PatternMatcher.d.ts.map +1 -0
- package/dist/esm/descriptor/parse/PatternMatcher.js +56 -0
- package/dist/esm/descriptor/psbt/assertSatisfiable.d.ts +20 -0
- package/dist/{src → esm}/descriptor/psbt/assertSatisfiable.d.ts.map +1 -1
- package/dist/esm/descriptor/psbt/assertSatisfiable.js +69 -0
- package/dist/esm/descriptor/psbt/createPsbt.d.ts +23 -0
- package/dist/esm/descriptor/psbt/createPsbt.d.ts.map +1 -0
- package/dist/esm/descriptor/psbt/createPsbt.js +69 -0
- package/dist/esm/descriptor/psbt/findDescriptors.d.ts +26 -0
- package/dist/{src → esm}/descriptor/psbt/findDescriptors.d.ts.map +1 -1
- package/dist/esm/descriptor/psbt/findDescriptors.js +94 -0
- package/dist/esm/descriptor/psbt/index.d.ts +7 -0
- package/dist/esm/descriptor/psbt/index.js +7 -0
- package/dist/esm/descriptor/psbt/parse.d.ts +27 -0
- package/dist/{src → esm}/descriptor/psbt/parse.d.ts.map +1 -1
- package/dist/esm/descriptor/psbt/parse.js +51 -0
- package/dist/esm/descriptor/psbt/sign.d.ts +26 -0
- package/dist/esm/descriptor/psbt/sign.d.ts.map +1 -0
- package/dist/esm/descriptor/psbt/sign.js +34 -0
- package/dist/esm/descriptor/psbt/wrap.d.ts +12 -0
- package/dist/{src → esm}/descriptor/psbt/wrap.d.ts.map +1 -1
- package/dist/esm/descriptor/psbt/wrap.js +38 -0
- package/dist/esm/dustThreshold.d.ts +4 -0
- package/dist/esm/dustThreshold.js +97 -0
- package/dist/esm/index.d.ts +10 -0
- package/dist/{src → esm}/index.d.ts.map +1 -1
- package/dist/esm/index.js +10 -0
- package/dist/esm/paygo/attestation.d.ts +11 -0
- package/dist/esm/paygo/attestation.d.ts.map +1 -0
- package/dist/esm/paygo/attestation.js +18 -0
- package/dist/esm/paygo/index.d.ts +3 -0
- package/dist/esm/paygo/index.d.ts.map +1 -0
- package/dist/esm/paygo/index.js +3 -0
- package/dist/esm/paygo/parsePayGoAttestation.d.ts +16 -0
- package/dist/esm/paygo/parsePayGoAttestation.d.ts.map +1 -0
- package/dist/esm/paygo/parsePayGoAttestation.js +43 -0
- package/dist/esm/paygo/psbt/Errors.d.ts +22 -0
- package/dist/esm/paygo/psbt/Errors.d.ts.map +1 -0
- package/dist/esm/paygo/psbt/Errors.js +35 -0
- package/dist/esm/paygo/psbt/index.d.ts +2 -0
- package/dist/esm/paygo/psbt/index.d.ts.map +1 -0
- package/dist/esm/paygo/psbt/index.js +2 -0
- package/dist/esm/paygo/psbt/payGoAddressProof.d.ts +29 -0
- package/dist/esm/paygo/psbt/payGoAddressProof.d.ts.map +1 -0
- package/dist/esm/paygo/psbt/payGoAddressProof.js +85 -0
- package/dist/esm/testutil/descriptor/descriptors.d.ts +13 -0
- package/dist/esm/testutil/descriptor/descriptors.d.ts.map +1 -0
- package/dist/esm/testutil/descriptor/descriptors.js +150 -0
- package/dist/esm/testutil/descriptor/index.d.ts +4 -0
- package/dist/esm/testutil/descriptor/index.js +4 -0
- package/dist/esm/testutil/descriptor/mock.utils.d.ts +36 -0
- package/dist/esm/testutil/descriptor/mock.utils.d.ts.map +1 -0
- package/dist/esm/testutil/descriptor/mock.utils.js +53 -0
- package/dist/esm/testutil/descriptor/psbt.utils.d.ts +4 -0
- package/dist/{src → esm}/testutil/descriptor/psbt.utils.d.ts.map +1 -1
- package/dist/esm/testutil/descriptor/psbt.utils.js +17 -0
- package/dist/esm/testutil/fixtures.utils.d.ts +15 -0
- package/dist/{src → esm}/testutil/fixtures.utils.js +5 -42
- package/dist/esm/testutil/generatePayGoAttestationProof.utils.d.ts +12 -0
- package/dist/esm/testutil/generatePayGoAttestationProof.utils.d.ts.map +1 -0
- package/dist/esm/testutil/generatePayGoAttestationProof.utils.js +32 -0
- package/dist/esm/testutil/index.d.ts +6 -0
- package/dist/{src → esm}/testutil/index.d.ts.map +1 -1
- package/dist/esm/testutil/index.js +6 -0
- package/dist/esm/testutil/key.utils.d.ts +16 -0
- package/dist/{src → esm}/testutil/key.utils.d.ts.map +1 -1
- package/dist/esm/testutil/key.utils.js +22 -0
- package/dist/esm/testutil/toPlainObject.utils.d.ts +11 -0
- package/dist/{src → esm}/testutil/toPlainObject.utils.d.ts.map +1 -1
- package/dist/esm/testutil/toPlainObject.utils.js +85 -0
- package/dist/esm/testutil/trimMessagePrefix.d.ts +11 -0
- package/dist/esm/testutil/trimMessagePrefix.d.ts.map +1 -0
- package/dist/esm/testutil/trimMessagePrefix.js +24 -0
- package/dist/esm/xOnlyPubkey.d.ts +2 -0
- package/dist/esm/xOnlyPubkey.js +15 -0
- package/package.json +50 -25
- package/dist/src/Output.js +0 -60
- package/dist/src/bip32utils.d.ts +0 -16
- package/dist/src/bip32utils.d.ts.map +0 -1
- package/dist/src/bip32utils.js +0 -72
- package/dist/src/bip65/locktime.js +0 -37
- package/dist/src/descriptor/DescriptorMap.js +0 -9
- package/dist/src/descriptor/Output.js +0 -41
- package/dist/src/descriptor/VirtualSize.js +0 -100
- package/dist/src/descriptor/derive.js +0 -45
- package/dist/src/descriptor/fromFixedScriptWallet.js +0 -88
- package/dist/src/descriptor/psbt/assertSatisfiable.js +0 -74
- package/dist/src/descriptor/psbt/createPsbt.d.ts.map +0 -1
- package/dist/src/descriptor/psbt/createPsbt.js +0 -82
- package/dist/src/descriptor/psbt/findDescriptors.js +0 -98
- package/dist/src/descriptor/psbt/parse.js +0 -87
- package/dist/src/descriptor/psbt/sign.d.ts.map +0 -1
- package/dist/src/descriptor/psbt/sign.js +0 -42
- package/dist/src/descriptor/psbt/wrap.js +0 -76
- package/dist/src/dustThreshold.js +0 -134
- package/dist/src/paygo/ExtractAddressPayGoAttestation.d.ts.map +0 -1
- package/dist/src/paygo/ExtractAddressPayGoAttestation.js +0 -44
- package/dist/src/paygo/index.d.ts +0 -2
- package/dist/src/paygo/index.d.ts.map +0 -1
- package/dist/src/testutil/descriptor/descriptors.d.ts.map +0 -1
- package/dist/src/testutil/descriptor/descriptors.js +0 -125
- package/dist/src/testutil/descriptor/mock.utils.d.ts.map +0 -1
- package/dist/src/testutil/descriptor/mock.utils.js +0 -91
- package/dist/src/testutil/descriptor/psbt.utils.js +0 -20
- package/dist/src/testutil/generatePayGoAttestationProof.utils.d.ts.map +0 -1
- package/dist/src/testutil/generatePayGoAttestationProof.utils.js +0 -43
- package/dist/src/testutil/key.utils.js +0 -59
- package/dist/src/testutil/toPlainObject.utils.js +0 -75
- package/dist/src/xOnlyPubkey.js +0 -18
- /package/dist/{src → cjs/src}/Output.d.ts +0 -0
- /package/dist/{src → cjs/src}/bip65/index.d.ts +0 -0
- /package/dist/{src → cjs/src}/bip65/locktime.d.ts +0 -0
- /package/dist/{src → cjs/src}/descriptor/psbt/index.d.ts +0 -0
- /package/dist/{src → cjs/src}/dustThreshold.d.ts +0 -0
- /package/dist/{src → cjs/src}/testutil/descriptor/index.d.ts +0 -0
- /package/dist/{src → cjs/src}/testutil/descriptor/psbt.utils.d.ts +0 -0
- /package/dist/{src → cjs/src}/testutil/fixtures.utils.d.ts +0 -0
- /package/dist/{src → cjs/src}/testutil/toPlainObject.utils.d.ts +0 -0
- /package/dist/{src → cjs/src}/xOnlyPubkey.d.ts +0 -0
- /package/dist/{src → esm}/Output.d.ts.map +0 -0
- /package/dist/{src → esm}/bip65/index.d.ts.map +0 -0
- /package/dist/{src → esm}/bip65/locktime.d.ts.map +0 -0
- /package/dist/{src → esm}/descriptor/psbt/index.d.ts.map +0 -0
- /package/dist/{src → esm}/dustThreshold.d.ts.map +0 -0
- /package/dist/{src → esm}/testutil/descriptor/index.d.ts.map +0 -0
- /package/dist/{src → esm}/testutil/fixtures.utils.d.ts.map +0 -0
- /package/dist/{src → esm}/xOnlyPubkey.d.ts.map +0 -0
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @return true if the output is a max output
|
|
3
|
+
*/
|
|
4
|
+
export function isMaxOutput(output) {
|
|
5
|
+
return output.value === 'max';
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* @return the max output if there is one
|
|
9
|
+
* @throws if there are multiple max outputs
|
|
10
|
+
*/
|
|
11
|
+
export function getMaxOutput(outputs) {
|
|
12
|
+
const max = outputs.filter((isMaxOutput));
|
|
13
|
+
if (max.length === 0) {
|
|
14
|
+
return undefined;
|
|
15
|
+
}
|
|
16
|
+
if (max.length > 1) {
|
|
17
|
+
throw new Error('Multiple max outputs');
|
|
18
|
+
}
|
|
19
|
+
return max[0];
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* @return the sum of the outputs
|
|
23
|
+
*/
|
|
24
|
+
export function getOutputSum(outputs) {
|
|
25
|
+
return outputs.reduce((sum, output) => sum + output.value, 0n);
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* @return the sum of the outputs that are not 'max'
|
|
29
|
+
*/
|
|
30
|
+
export function getFixedOutputSum(outputs) {
|
|
31
|
+
return getOutputSum(outputs.filter((o) => !isMaxOutput(o)));
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* @param outputs
|
|
35
|
+
* @param params
|
|
36
|
+
* @return the outputs with the 'max' output replaced with the max amount
|
|
37
|
+
*/
|
|
38
|
+
export function toFixedOutputs(outputs, params) {
|
|
39
|
+
// assert that there is at most one max output
|
|
40
|
+
const maxOutput = getMaxOutput(outputs);
|
|
41
|
+
return outputs.map((output) => {
|
|
42
|
+
if (isMaxOutput(output)) {
|
|
43
|
+
if (output !== maxOutput) {
|
|
44
|
+
throw new Error('illegal state');
|
|
45
|
+
}
|
|
46
|
+
return { ...output, value: params.maxAmount };
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
return output;
|
|
50
|
+
}
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiT3V0cHV0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL091dHB1dC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFRQTs7R0FFRztBQUNILE1BQU0sVUFBVSxXQUFXLENBQTRDLE1BQWE7SUFDbEYsT0FBTyxNQUFNLENBQUMsS0FBSyxLQUFLLEtBQUssQ0FBQztBQUNoQyxDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLFlBQVksQ0FBNEMsT0FBa0I7SUFDeEYsTUFBTSxHQUFHLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFBLFdBQWlCLENBQUEsQ0FBQyxDQUFDO0lBQzlDLElBQUksR0FBRyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUNyQixPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBQ0QsSUFBSSxHQUFHLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ25CLE1BQU0sSUFBSSxLQUFLLENBQUMsc0JBQXNCLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBQ0QsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsQ0FBQztBQUVEOztHQUVHO0FBQ0gsTUFBTSxVQUFVLFlBQVksQ0FBQyxPQUFzQjtJQUNqRCxPQUFPLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLEVBQUUsQ0FBQyxHQUFHLEdBQUcsTUFBTSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztBQUNqRSxDQUFDO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLFVBQVUsaUJBQWlCLENBQUMsT0FBbUM7SUFDbkUsT0FBTyxZQUFZLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBZSxFQUFFLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzNFLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLGNBQWMsQ0FDNUIsT0FBa0IsRUFDbEIsTUFBNkI7SUFFN0IsOENBQThDO0lBQzlDLE1BQU0sU0FBUyxHQUFHLFlBQVksQ0FBTyxPQUFPLENBQUMsQ0FBQztJQUM5QyxPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUssRUFBRTtRQUMvQixJQUFJLFdBQVcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1lBQ3hCLElBQUksTUFBTSxLQUFLLFNBQVMsRUFBRSxDQUFDO2dCQUN6QixNQUFNLElBQUksS0FBSyxDQUFDLGVBQWUsQ0FBQyxDQUFDO1lBQ25DLENBQUM7WUFDRCxPQUFPLEVBQUUsR0FBRyxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNoRCxDQUFDO2FBQU0sQ0FBQztZQUNOLE9BQU8sTUFBTSxDQUFDO1FBQ2hCLENBQUM7SUFDSCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgdHlwZSBPdXRwdXQ8VFZhbHVlID0gYmlnaW50PiA9IHtcbiAgc2NyaXB0OiBCdWZmZXI7XG4gIHZhbHVlOiBUVmFsdWU7XG59O1xuZXhwb3J0IHR5cGUgTWF4T3V0cHV0ID0gT3V0cHV0PCdtYXgnPjtcbnR5cGUgVmFsdWVCaWdJbnQgPSB7IHZhbHVlOiBiaWdpbnQgfTtcbnR5cGUgVmFsdWVNYXggPSB7IHZhbHVlOiAnbWF4JyB9O1xuXG4vKipcbiAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgb3V0cHV0IGlzIGEgbWF4IG91dHB1dFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNNYXhPdXRwdXQ8QSBleHRlbmRzIFZhbHVlQmlnSW50LCBCIGV4dGVuZHMgVmFsdWVNYXg+KG91dHB1dDogQSB8IEIpOiBvdXRwdXQgaXMgQiB7XG4gIHJldHVybiBvdXRwdXQudmFsdWUgPT09ICdtYXgnO1xufVxuXG4vKipcbiAqIEByZXR1cm4gdGhlIG1heCBvdXRwdXQgaWYgdGhlcmUgaXMgb25lXG4gKiBAdGhyb3dzIGlmIHRoZXJlIGFyZSBtdWx0aXBsZSBtYXggb3V0cHV0c1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TWF4T3V0cHV0PEEgZXh0ZW5kcyBWYWx1ZUJpZ0ludCwgQiBleHRlbmRzIFZhbHVlTWF4PihvdXRwdXRzOiAoQSB8IEIpW10pOiBCIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgbWF4ID0gb3V0cHV0cy5maWx0ZXIoaXNNYXhPdXRwdXQ8QSwgQj4pO1xuICBpZiAobWF4Lmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgaWYgKG1heC5sZW5ndGggPiAxKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdNdWx0aXBsZSBtYXggb3V0cHV0cycpO1xuICB9XG4gIHJldHVybiBtYXhbMF07XG59XG5cbi8qKlxuICogQHJldHVybiB0aGUgc3VtIG9mIHRoZSBvdXRwdXRzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRPdXRwdXRTdW0ob3V0cHV0czogVmFsdWVCaWdJbnRbXSk6IGJpZ2ludCB7XG4gIHJldHVybiBvdXRwdXRzLnJlZHVjZSgoc3VtLCBvdXRwdXQpID0+IHN1bSArIG91dHB1dC52YWx1ZSwgMG4pO1xufVxuXG4vKipcbiAqIEByZXR1cm4gdGhlIHN1bSBvZiB0aGUgb3V0cHV0cyB0aGF0IGFyZSBub3QgJ21heCdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEZpeGVkT3V0cHV0U3VtKG91dHB1dHM6IChWYWx1ZUJpZ0ludCB8IFZhbHVlTWF4KVtdKTogYmlnaW50IHtcbiAgcmV0dXJuIGdldE91dHB1dFN1bShvdXRwdXRzLmZpbHRlcigobyk6IG8gaXMgT3V0cHV0ID0+ICFpc01heE91dHB1dChvKSkpO1xufVxuXG4vKipcbiAqIEBwYXJhbSBvdXRwdXRzXG4gKiBAcGFyYW0gcGFyYW1zXG4gKiBAcmV0dXJuIHRoZSBvdXRwdXRzIHdpdGggdGhlICdtYXgnIG91dHB1dCByZXBsYWNlZCB3aXRoIHRoZSBtYXggYW1vdW50XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0ZpeGVkT3V0cHV0czxBIGV4dGVuZHMgVmFsdWVCaWdJbnQsIEIgZXh0ZW5kcyBWYWx1ZU1heD4oXG4gIG91dHB1dHM6IChBIHwgQilbXSxcbiAgcGFyYW1zOiB7IG1heEFtb3VudDogYmlnaW50IH1cbik6IEFbXSB7XG4gIC8vIGFzc2VydCB0aGF0IHRoZXJlIGlzIGF0IG1vc3Qgb25lIG1heCBvdXRwdXRcbiAgY29uc3QgbWF4T3V0cHV0ID0gZ2V0TWF4T3V0cHV0PEEsIEI+KG91dHB1dHMpO1xuICByZXR1cm4gb3V0cHV0cy5tYXAoKG91dHB1dCk6IEEgPT4ge1xuICAgIGlmIChpc01heE91dHB1dChvdXRwdXQpKSB7XG4gICAgICBpZiAob3V0cHV0ICE9PSBtYXhPdXRwdXQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbGxlZ2FsIHN0YXRlJyk7XG4gICAgICB9XG4gICAgICByZXR1cm4geyAuLi5vdXRwdXQsIHZhbHVlOiBwYXJhbXMubWF4QW1vdW50IH07XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBvdXRwdXQ7XG4gICAgfVxuICB9KTtcbn1cblxuZXhwb3J0IHR5cGUgUHJldk91dHB1dCA9IHtcbiAgaGFzaDogc3RyaW5nO1xuICBpbmRleDogbnVtYmVyO1xuICB3aXRuZXNzVXR4bzogT3V0cHV0O1xufTtcbiJdfQ==
|
|
@@ -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,5 @@
|
|
|
1
|
+
export * from './toSpend';
|
|
2
|
+
export * from './toSign';
|
|
3
|
+
export * from './utils';
|
|
4
|
+
export * from './verify';
|
|
5
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYmlwMzIyL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsV0FBVyxDQUFDO0FBQzFCLGNBQWMsVUFBVSxDQUFDO0FBQ3pCLGNBQWMsU0FBUyxDQUFDO0FBQ3hCLGNBQWMsVUFBVSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi90b1NwZW5kJztcbmV4cG9ydCAqIGZyb20gJy4vdG9TaWduJztcbmV4cG9ydCAqIGZyb20gJy4vdXRpbHMnO1xuZXhwb3J0ICogZnJvbSAnLi92ZXJpZnknO1xuIl19
|
|
@@ -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,120 @@
|
|
|
1
|
+
import { bitgo, networks, Transaction } from '@bitgo-beta/utxo-lib';
|
|
2
|
+
import { toXOnlyPublicKey } from '@bitgo-beta/utxo-lib/dist/src/bitgo/outputScripts';
|
|
3
|
+
import { addBip322ProofMessage } from './utils';
|
|
4
|
+
import { BIP322_TAG, buildToSpendTransaction } from './toSpend';
|
|
5
|
+
export const MAX_NUM_BIP322_INPUTS = 200;
|
|
6
|
+
/**
|
|
7
|
+
* Create the base PSBT for the to_sign transaction for BIP322 signing.
|
|
8
|
+
* There will be ever 1 output.
|
|
9
|
+
*/
|
|
10
|
+
export function createBaseToSignPsbt(rootWalletKeys, network = networks.bitcoin) {
|
|
11
|
+
// Create PSBT object for constructing the transaction
|
|
12
|
+
const psbt = bitgo.createPsbtForNetwork({ network });
|
|
13
|
+
// Set default value for nVersion and nLockTime
|
|
14
|
+
psbt.setVersion(0); // nVersion = 0
|
|
15
|
+
psbt.setLocktime(0); // nLockTime = 0
|
|
16
|
+
// Set the output
|
|
17
|
+
psbt.addOutput({
|
|
18
|
+
value: BigInt(0), // vout[0].nValue = 0
|
|
19
|
+
script: Buffer.from([0x6a]), // vout[0].scriptPubKey = OP_RETURN
|
|
20
|
+
});
|
|
21
|
+
// If rootWalletKeys are provided, add them to the PSBT as global xpubs
|
|
22
|
+
if (rootWalletKeys) {
|
|
23
|
+
bitgo.addXpubsToPsbt(psbt, rootWalletKeys);
|
|
24
|
+
}
|
|
25
|
+
return psbt;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Add a BIP322 input to the PSBT.
|
|
29
|
+
* Source implementation:
|
|
30
|
+
* https://github.com/bitcoin/bips/blob/master/bip-0322.mediawiki#full
|
|
31
|
+
*
|
|
32
|
+
* @param {string} message - The message that is hashed into the `to_spend` transaction.
|
|
33
|
+
* @param {AddressDetails} addressDetails - The details of the address, including redeemScript and/or witnessScript.
|
|
34
|
+
* @param {string} [tag=BIP322_TAG] - The tag to use for hashing, defaults to BIP322_TAG.
|
|
35
|
+
* @returns {Psbt} - The hex representation of the constructed PSBT.
|
|
36
|
+
*/
|
|
37
|
+
export function addBip322Input(psbt, message, addressDetails, tag = BIP322_TAG) {
|
|
38
|
+
const toSpendTx = buildToSpendTransaction(addressDetails.scriptPubKey, message, tag);
|
|
39
|
+
if (psbt.data.inputs.length >= MAX_NUM_BIP322_INPUTS) {
|
|
40
|
+
throw new Error(`Exceeded maximum number of BIP322 inputs (${MAX_NUM_BIP322_INPUTS})`);
|
|
41
|
+
}
|
|
42
|
+
psbt.addInput({
|
|
43
|
+
hash: toSpendTx.getId(), // vin[0].prevout.hash = to_spend.txid
|
|
44
|
+
index: 0, // vin[0].prevout.n = 0
|
|
45
|
+
sequence: 0, // vin[0].nSequence = 0
|
|
46
|
+
nonWitnessUtxo: toSpendTx.toBuffer(), // previous transaction for us to rebuild later to verify
|
|
47
|
+
sighashType: Transaction.SIGHASH_ALL,
|
|
48
|
+
});
|
|
49
|
+
const inputIndex = psbt.data.inputs.length - 1;
|
|
50
|
+
psbt.updateInput(inputIndex, {
|
|
51
|
+
witnessUtxo: { value: BigInt(0), script: addressDetails.scriptPubKey },
|
|
52
|
+
});
|
|
53
|
+
if (addressDetails.redeemScript) {
|
|
54
|
+
psbt.updateInput(inputIndex, { redeemScript: addressDetails.redeemScript });
|
|
55
|
+
}
|
|
56
|
+
if (addressDetails.witnessScript) {
|
|
57
|
+
psbt.updateInput(inputIndex, {
|
|
58
|
+
witnessScript: addressDetails.witnessScript,
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
// Add the message as a proprietary key value to the PSBT so we can verify it later
|
|
62
|
+
addBip322ProofMessage(psbt, inputIndex, Buffer.from(message));
|
|
63
|
+
}
|
|
64
|
+
export function addBip322InputWithChainAndIndex(psbt, message, rootWalletKeys, scriptId) {
|
|
65
|
+
const scriptType = bitgo.scriptTypeForChain(scriptId.chain);
|
|
66
|
+
const walletKeys = rootWalletKeys.deriveForChainAndIndex(scriptId.chain, scriptId.index);
|
|
67
|
+
const output = bitgo.outputScripts.createOutputScript2of3(walletKeys.publicKeys, bitgo.scriptTypeForChain(scriptId.chain));
|
|
68
|
+
addBip322Input(psbt, message, {
|
|
69
|
+
scriptPubKey: output.scriptPubKey,
|
|
70
|
+
redeemScript: output.redeemScript,
|
|
71
|
+
witnessScript: output.witnessScript,
|
|
72
|
+
});
|
|
73
|
+
const inputIndex = psbt.data.inputs.length - 1;
|
|
74
|
+
// When adding the taproot metadata, we assume that we are NOT using the backup path
|
|
75
|
+
// For script type p2tr, it means that we are using signer and bitgo keys when creating the tap tree
|
|
76
|
+
// spending paths. For p2trMusig2, it means that we are using the taproot key path spending
|
|
77
|
+
const keyNames = ['user', 'bitgo'];
|
|
78
|
+
if (scriptType === 'p2tr') {
|
|
79
|
+
const { controlBlock, witnessScript, leafVersion, leafHash } = bitgo.outputScripts.createSpendScriptP2tr(walletKeys.publicKeys, [walletKeys.user.publicKey, walletKeys.bitgo.publicKey]);
|
|
80
|
+
psbt.updateInput(inputIndex, {
|
|
81
|
+
tapLeafScript: [{ controlBlock, script: witnessScript, leafVersion }],
|
|
82
|
+
});
|
|
83
|
+
psbt.updateInput(inputIndex, {
|
|
84
|
+
tapBip32Derivation: keyNames.map((key) => ({
|
|
85
|
+
leafHashes: [leafHash],
|
|
86
|
+
pubkey: toXOnlyPublicKey(walletKeys[key].publicKey),
|
|
87
|
+
path: rootWalletKeys.getDerivationPath(rootWalletKeys[key], scriptId.chain, scriptId.index),
|
|
88
|
+
masterFingerprint: rootWalletKeys[key].fingerprint,
|
|
89
|
+
})),
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
else if (scriptType === 'p2trMusig2') {
|
|
93
|
+
const { internalPubkey: tapInternalKey, outputPubkey: tapOutputKey, taptreeRoot, } = bitgo.outputScripts.createKeyPathP2trMusig2(walletKeys.publicKeys);
|
|
94
|
+
const participantsKeyValData = bitgo.musig2.encodePsbtMusig2Participants({
|
|
95
|
+
tapOutputKey,
|
|
96
|
+
tapInternalKey,
|
|
97
|
+
participantPubKeys: [walletKeys.user.publicKey, walletKeys.bitgo.publicKey],
|
|
98
|
+
});
|
|
99
|
+
bitgo.addProprietaryKeyValuesFromUnknownKeyValues(psbt, 'input', inputIndex, participantsKeyValData);
|
|
100
|
+
psbt.updateInput(inputIndex, {
|
|
101
|
+
tapInternalKey: tapInternalKey,
|
|
102
|
+
});
|
|
103
|
+
psbt.updateInput(inputIndex, {
|
|
104
|
+
tapMerkleRoot: taptreeRoot,
|
|
105
|
+
});
|
|
106
|
+
psbt.updateInput(inputIndex, {
|
|
107
|
+
tapBip32Derivation: keyNames.map((key) => ({
|
|
108
|
+
leafHashes: [],
|
|
109
|
+
pubkey: toXOnlyPublicKey(walletKeys[key].publicKey),
|
|
110
|
+
path: rootWalletKeys.getDerivationPath(rootWalletKeys[key], scriptId.chain, scriptId.index),
|
|
111
|
+
masterFingerprint: rootWalletKeys[key].fingerprint,
|
|
112
|
+
})),
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
else {
|
|
116
|
+
// Add bip32 derivation information for the input
|
|
117
|
+
psbt.updateInput(inputIndex, bitgo.getPsbtBip32DerivationOutputUpdate(rootWalletKeys, walletKeys, bitgo.scriptTypeForChain(scriptId.chain)));
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9TaWduLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2JpcDMyMi90b1NpZ24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFRLEtBQUssRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDMUUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sbURBQW1ELENBQUM7QUFFckYsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQ2hELE9BQU8sRUFBRSxVQUFVLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFPaEUsTUFBTSxDQUFDLE1BQU0scUJBQXFCLEdBQUcsR0FBRyxDQUFDO0FBRXpDOzs7R0FHRztBQUNILE1BQU0sVUFBVSxvQkFBb0IsQ0FDbEMsY0FBcUMsRUFDckMsT0FBTyxHQUFHLFFBQVEsQ0FBQyxPQUFPO0lBRTFCLHNEQUFzRDtJQUN0RCxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsb0JBQW9CLENBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO0lBQ3JELCtDQUErQztJQUMvQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZTtJQUNuQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCO0lBRXJDLGlCQUFpQjtJQUNqQixJQUFJLENBQUMsU0FBUyxDQUFDO1FBQ2IsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxxQkFBcUI7UUFDdkMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLG1DQUFtQztLQUNqRSxDQUFDLENBQUM7SUFFSCx1RUFBdUU7SUFDdkUsSUFBSSxjQUFjLEVBQUUsQ0FBQztRQUNuQixLQUFLLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxjQUFjLENBQUMsQ0FBQztJQUM3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LENBQUMsS0FBSyxDQUFDLENBQUMsQ0FDL0csQ0FBQztJQUNKLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUHNidCwgYml0Z28sIG5ldHdvcmtzLCBUcmFuc2FjdGlvbiB9IGZyb20gJ0BiaXRnby1iZXRhL3V0eG8tbGliJztcbmltcG9ydCB7IHRvWE9ubHlQdWJsaWNLZXkgfSBmcm9tICdAYml0Z28tYmV0YS91dHhvLWxpYi9kaXN0L3NyYy9iaXRnby9vdXRwdXRTY3JpcHRzJztcblxuaW1wb3J0IHsgYWRkQmlwMzIyUHJvb2ZNZXNzYWdlIH0gZnJvbSAnLi91dGlscyc7XG5pbXBvcnQgeyBCSVAzMjJfVEFHLCBidWlsZFRvU3BlbmRUcmFuc2FjdGlvbiB9IGZyb20gJy4vdG9TcGVuZCc7XG5cbmV4cG9ydCB0eXBlIEFkZHJlc3NEZXRhaWxzID0ge1xuICByZWRlZW1TY3JpcHQ/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,66 @@
|
|
|
1
|
+
import { Hash } from 'fast-sha256';
|
|
2
|
+
import { Psbt, bitgo, networks } from '@bitgo-beta/utxo-lib';
|
|
3
|
+
export const BIP322_TAG = 'BIP0322-signed-message';
|
|
4
|
+
/**
|
|
5
|
+
* Perform a tagged hash
|
|
6
|
+
*
|
|
7
|
+
* @param {string | Buffer} message - The message to hash as a Buffer or utf-8 string
|
|
8
|
+
* @param {Buffer} [tag=BIP322_TAG] - The tag to use for hashing, defaults to BIP322_TAG.
|
|
9
|
+
* @returns {Buffer} - The resulting hash of the message with the tag.
|
|
10
|
+
*/
|
|
11
|
+
export function hashMessageWithTag(message, tag = BIP322_TAG) {
|
|
12
|
+
// Compute the message hash - SHA256(SHA256(tag) || SHA256(tag) || message)
|
|
13
|
+
// Reference: https://github.com/bitcoin/bips/blob/master/bip-0322.mediawiki#full
|
|
14
|
+
const tagHasher = new Hash();
|
|
15
|
+
tagHasher.update(Buffer.from(BIP322_TAG));
|
|
16
|
+
const tagHash = tagHasher.digest();
|
|
17
|
+
const messageHasher = new Hash();
|
|
18
|
+
messageHasher.update(tagHash);
|
|
19
|
+
messageHasher.update(tagHash);
|
|
20
|
+
messageHasher.update(Buffer.from(message));
|
|
21
|
+
const messageHash = messageHasher.digest();
|
|
22
|
+
return Buffer.from(messageHash);
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Build a BIP322 "to spend" transaction
|
|
26
|
+
* Source: https://github.com/bitcoin/bips/blob/master/bip-0322.mediawiki#full
|
|
27
|
+
*
|
|
28
|
+
* @param {Buffer} scriptPubKey - The scriptPubKey to use for the output
|
|
29
|
+
* @param {string | Buffer} message - The message to include in the transaction
|
|
30
|
+
* @param {Buffer} [tag=BIP322_TAG] - The tag to use for hashing, defaults to BIP322_TAG.
|
|
31
|
+
* @returns {Transaction} - The constructed transaction
|
|
32
|
+
*/
|
|
33
|
+
export function buildToSpendTransaction(scriptPubKey, message, tag = BIP322_TAG) {
|
|
34
|
+
// Create PSBT object for constructing the transaction
|
|
35
|
+
const psbt = new Psbt();
|
|
36
|
+
// Set default value for nVersion and nLockTime
|
|
37
|
+
psbt.setVersion(0); // nVersion = 0
|
|
38
|
+
psbt.setLocktime(0); // nLockTime = 0
|
|
39
|
+
// Compute the message hash - SHA256(SHA256(tag) || SHA256(tag) || message)
|
|
40
|
+
const messageHash = hashMessageWithTag(message, tag);
|
|
41
|
+
// Construct the scriptSig - OP_0 PUSH32[ message_hash ]
|
|
42
|
+
const scriptSigPartOne = new Uint8Array([0x00, 0x20]); // OP_0 PUSH32
|
|
43
|
+
const scriptSig = new Uint8Array(scriptSigPartOne.length + messageHash.length);
|
|
44
|
+
scriptSig.set(scriptSigPartOne);
|
|
45
|
+
scriptSig.set(messageHash, scriptSigPartOne.length);
|
|
46
|
+
// Set the input
|
|
47
|
+
psbt.addInput({
|
|
48
|
+
hash: '0'.repeat(64), // vin[0].prevout.hash = 0000...000
|
|
49
|
+
index: 0xffffffff, // vin[0].prevout.n = 0xFFFFFFFF
|
|
50
|
+
sequence: 0, // vin[0].nSequence = 0
|
|
51
|
+
finalScriptSig: Buffer.from(scriptSig), // vin[0].scriptSig = OP_0 PUSH32[ message_hash ]
|
|
52
|
+
witnessScript: Buffer.from([]), // vin[0].scriptWitness = []
|
|
53
|
+
});
|
|
54
|
+
// Set the output
|
|
55
|
+
psbt.addOutput({
|
|
56
|
+
value: BigInt(0), // vout[0].nValue = 0
|
|
57
|
+
script: scriptPubKey, // vout[0].scriptPubKey = message_challenge
|
|
58
|
+
});
|
|
59
|
+
// Return transaction
|
|
60
|
+
return psbt.extractTransaction();
|
|
61
|
+
}
|
|
62
|
+
export function buildToSpendTransactionFromChainAndIndex(rootWalletKeys, chain, index, message, tag = BIP322_TAG) {
|
|
63
|
+
const outputScript = bitgo.outputScripts.createOutputScript2of3(rootWalletKeys.deriveForChainAndIndex(chain, index).publicKeys, bitgo.scriptTypeForChain(chain), networks.bitcoin);
|
|
64
|
+
return buildToSpendTransaction(outputScript.scriptPubKey, message, tag);
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9TcGVuZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9iaXAzMjIvdG9TcGVuZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ25DLE9BQU8sRUFBRSxJQUFJLEVBQWUsS0FBSyxFQUFFLFFBQVEsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRTFFLE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBRyx3QkFBd0IsQ0FBQztBQUVuRDs7Ozs7O0dBTUc7QUFDSCxNQUFNLFVBQVUsa0JBQWtCLENBQUMsT0FBd0IsRUFBRSxHQUFHLEdBQUcsVUFBVTtJQUMzRSwyRUFBMkU7SUFDM0UsaUZBQWlGO0lBQ2pGLE1BQU0sU0FBUyxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7SUFDN0IsU0FBUyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7SUFDMUMsTUFBTSxPQUFPLEdBQUcsU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBQ25DLE1BQU0sYUFBYSxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7SUFDakMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUM5QixhQUFhLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzlCLGFBQWEsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBQzNDLE1BQU0sV0FBVyxHQUFHLGFBQWEsQ0FBQyxNQUFNLEVBQUUsQ0FBQztJQUMzQyxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7QUFDbEMsQ0FBQztBQUVEOzs7Ozs7OztHQVFHO0FBQ0gsTUFBTSxVQUFVLHVCQUF1QixDQUNyQyxZQUFvQixFQUNwQixPQUF3QixFQUN4QixHQUFHLEdBQUcsVUFBVTtJQUVoQixzREFBc0Q7SUFDdEQsTUFBTSxJQUFJLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztJQUN4QiwrQ0FBK0M7SUFDL0MsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGVBQWU7SUFDbkMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGdCQUFnQjtJQUNyQywyRUFBMkU7SUFDM0UsTUFBTSxXQUFXLEdBQUcsa0JBQWtCLENBQUMsT0FBTyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ3JELHdEQUF3RDtJQUN4RCxNQUFNLGdCQUFnQixHQUFHLElBQUksVUFBVSxDQUFDLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjO0lBQ3JFLE1BQU0sU0FBUyxHQUFHLElBQUksVUFBVSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sR0FBRyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDL0UsU0FBUyxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0lBQ2hDLFNBQVMsQ0FBQyxHQUFHLENBQUMsV0FBVyxFQUFFLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3BELGdCQUFnQjtJQUNoQixJQUFJLENBQUMsUUFBUSxDQUFDO1FBQ1osSUFBSSxFQUFFLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLEVBQUUsbUNBQW1DO1FBQ3pELEtBQUssRUFBRSxVQUFVLEVBQUUsZ0NBQWdDO1FBQ25ELFFBQVEsRUFBRSxDQUFDLEVBQUUsdUJBQXVCO1FBQ3BDLGNBQWMsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLGlEQUFpRDtRQUN6RixhQUFhLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSw0QkFBNEI7S0FDN0QsQ0FBQyxDQUFDO0lBQ0gsaUJBQWlCO0lBQ2pCLElBQUksQ0FBQyxTQUFTLENBQUM7UUFDYixLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLHFCQUFxQjtRQUN2QyxNQUFNLEVBQUUsWUFBWSxFQUFFLDJDQUEyQztLQUNsRSxDQUFDLENBQUM7SUFDSCxxQkFBcUI7SUFDckIsT0FBTyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztBQUNuQyxDQUFDO0FBRUQsTUFBTSxVQUFVLHdDQUF3QyxDQUN0RCxjQUFvQyxFQUNwQyxLQUFzQixFQUN0QixLQUFhLEVBQ2IsT0FBd0IsRUFDeEIsR0FBRyxHQUFHLFVBQVU7SUFFaEIsTUFBTSxZQUFZLEdBQUcsS0FBSyxDQUFDLGFBQWEsQ0FBQyxzQkFBc0IsQ0FDN0QsY0FBYyxDQUFDLHNCQUFzQixDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQyxVQUFVLEVBQzlELEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsRUFDL0IsUUFBUSxDQUFDLE9BQU8sQ0FDakIsQ0FBQztJQUNGLE9BQU8sdUJBQXVCLENBQUMsWUFBWSxDQUFDLFlBQVksRUFBRSxPQUFPLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDMUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEhhc2ggfSBmcm9tICdmYXN0LXNoYTI1Nic7XG5pbXBvcnQgeyBQc2J0LCBUcmFuc2FjdGlvbiwgYml0Z28sIG5ldHdvcmtzIH0gZnJvbSAnQGJpdGdvLWJldGEvdXR4by1saWInO1xuXG5leHBvcnQgY29uc3QgQklQMzIyX1RBRyA9ICdCSVAwMzIyLXNpZ25lZC1tZXNzYWdlJztcblxuLyoqXG4gKiBQZXJmb3JtIGEgdGFnZ2VkIGhhc2hcbiAqXG4gKiBAcGFyYW0ge3N0cmluZyB8IEJ1ZmZlcn0gbWVzc2FnZSAtIFRoZSBtZXNzYWdlIHRvIGhhc2ggYXMgYSBCdWZmZXIgb3IgdXRmLTggc3RyaW5nXG4gKiBAcGFyYW0ge0J1ZmZlcn0gW3RhZz1CSVAzMjJfVEFHXSAtIFRoZSB0YWcgdG8gdXNlIGZvciBoYXNoaW5nLCBkZWZhdWx0cyB0byBCSVAzMjJfVEFHLlxuICogQHJldHVybnMge0J1ZmZlcn0gLSBUaGUgcmVzdWx0aW5nIGhhc2ggb2YgdGhlIG1lc3NhZ2Ugd2l0aCB0aGUgdGFnLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaGFzaE1lc3NhZ2VXaXRoVGFnKG1lc3NhZ2U6IHN0cmluZyB8IEJ1ZmZlciwgdGFnID0gQklQMzIyX1RBRyk6IEJ1ZmZlciB7XG4gIC8vIENvbXB1dGUgdGhlIG1lc3NhZ2UgaGFzaCAtIFNIQTI1NihTSEEyNTYodGFnKSB8fCBTSEEyNTYodGFnKSB8fCBtZXNzYWdlKVxuICAvLyBSZWZlcmVuY2U6IGh0dHBzOi8vZ2l0aHViLmNvbS9iaXRjb2luL2JpcHMvYmxvYi9tYXN0ZXIvYmlwLTAzMjIubWVkaWF3aWtpI2Z1bGxcbiAgY29uc3QgdGFnSGFzaGVyID0gbmV3IEhhc2goKTtcbiAgdGFnSGFzaGVyLnVwZGF0ZShCdWZmZXIuZnJvbShCSVAzMjJfVEFHKSk7XG4gIGNvbnN0IHRhZ0hhc2ggPSB0YWdIYXNoZXIuZGlnZXN0KCk7XG4gIGNvbnN0IG1lc3NhZ2VIYXNoZXIgPSBuZXcgSGFzaCgpO1xuICBtZXNzYWdlSGFzaGVyLnVwZGF0ZSh0YWdIYXNoKTtcbiAgbWVzc2FnZUhhc2hlci51cGRhdGUodGFnSGFzaCk7XG4gIG1lc3NhZ2VIYXNoZXIudXBkYXRlKEJ1ZmZlci5mcm9tKG1lc3NhZ2UpKTtcbiAgY29uc3QgbWVzc2FnZUhhc2ggPSBtZXNzYWdlSGFzaGVyLmRpZ2VzdCgpO1xuICByZXR1cm4gQnVmZmVyLmZyb20obWVzc2FnZUhhc2gpO1xufVxuXG4vKipcbiAqIEJ1aWxkIGEgQklQMzIyIFwidG8gc3BlbmRcIiB0cmFuc2FjdGlvblxuICogU291cmNlOiBodHRwczovL2dpdGh1Yi5jb20vYml0Y29pbi9iaXBzL2Jsb2IvbWFzdGVyL2JpcC0wMzIyLm1lZGlhd2lraSNmdWxsXG4gKlxuICogQHBhcmFtIHtCdWZmZXJ9IHNjcmlwdFB1YktleSAtIFRoZSBzY3JpcHRQdWJLZXkgdG8gdXNlIGZvciB0aGUgb3V0cHV0XG4gKiBAcGFyYW0ge3N0cmluZyB8IEJ1ZmZlcn0gbWVzc2FnZSAtIFRoZSBtZXNzYWdlIHRvIGluY2x1ZGUgaW4gdGhlIHRyYW5zYWN0aW9uXG4gKiBAcGFyYW0ge0J1ZmZlcn0gW3RhZz1CSVAzMjJfVEFHXSAtIFRoZSB0YWcgdG8gdXNlIGZvciBoYXNoaW5nLCBkZWZhdWx0cyB0byBCSVAzMjJfVEFHLlxuICogQHJldHVybnMge1RyYW5zYWN0aW9ufSAtIFRoZSBjb25zdHJ1Y3RlZCB0cmFuc2FjdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRUb1NwZW5kVHJhbnNhY3Rpb24oXG4gIHNjcmlwdFB1YktleTogQnVmZmVyLFxuICBtZXNzYWdlOiBzdHJpbmcgfCBCdWZmZXIsXG4gIHRhZyA9IEJJUDMyMl9UQUdcbik6IFRyYW5zYWN0aW9uPGJpZ2ludD4ge1xuICAvLyBDcmVhdGUgUFNCVCBvYmplY3QgZm9yIGNvbnN0cnVjdGluZyB0aGUgdHJhbnNhY3Rpb25cbiAgY29uc3QgcHNidCA9IG5ldyBQc2J0KCk7XG4gIC8vIFNldCBkZWZhdWx0IHZhbHVlIGZvciBuVmVyc2lvbiBhbmQgbkxvY2tUaW1lXG4gIHBzYnQuc2V0VmVyc2lvbigwKTsgLy8gblZlcnNpb24gPSAwXG4gIHBzYnQuc2V0TG9ja3RpbWUoMCk7IC8vIG5Mb2NrVGltZSA9IDBcbiAgLy8gQ29tcHV0ZSB0aGUgbWVzc2FnZSBoYXNoIC0gU0hBMjU2KFNIQTI1Nih0YWcpIHx8IFNIQTI1Nih0YWcpIHx8IG1lc3NhZ2UpXG4gIGNvbnN0IG1lc3NhZ2VIYXNoID0gaGFzaE1lc3NhZ2VXaXRoVGFnKG1lc3NhZ2UsIHRhZyk7XG4gIC8vIENvbnN0cnVjdCB0aGUgc2NyaXB0U2lnIC0gT1BfMCBQVVNIMzJbIG1lc3NhZ2VfaGFzaCBdXG4gIGNvbnN0IHNjcmlwdFNpZ1BhcnRPbmUgPSBuZXcgVWludDhBcnJheShbMHgwMCwgMHgyMF0pOyAvLyBPUF8wIFBVU0gzMlxuICBjb25zdCBzY3JpcHRTaWcgPSBuZXcgVWludDhBcnJheShzY3JpcHRTaWdQYXJ0T25lLmxlbmd0aCArIG1lc3NhZ2VIYXNoLmxlbmd0aCk7XG4gIHNjcmlwdFNpZy5zZXQoc2NyaXB0U2lnUGFydE9uZSk7XG4gIHNjcmlwdFNpZy5zZXQobWVzc2FnZUhhc2gsIHNjcmlwdFNpZ1BhcnRPbmUubGVuZ3RoKTtcbiAgLy8gU2V0IHRoZSBpbnB1dFxuICBwc2J0LmFkZElucHV0KHtcbiAgICBoYXNoOiAnMCcucmVwZWF0KDY0KSwgLy8gdmluWzBdLnByZXZvdXQuaGFzaCA9IDAwMDAuLi4wMDBcbiAgICBpbmRleDogMHhmZmZmZmZmZiwgLy8gdmluWzBdLnByZXZvdXQubiA9IDB4RkZGRkZGRkZcbiAgICBzZXF1ZW5jZTogMCwgLy8gdmluWzBdLm5TZXF1ZW5jZSA9IDBcbiAgICBmaW5hbFNjcmlwdFNpZzogQnVmZmVyLmZyb20oc2NyaXB0U2lnKSwgLy8gdmluWzBdLnNjcmlwdFNpZyA9IE9QXzAgUFVTSDMyWyBtZXNzYWdlX2hhc2ggXVxuICAgIHdpdG5lc3NTY3JpcHQ6IEJ1ZmZlci5mcm9tKFtdKSwgLy8gdmluWzBdLnNjcmlwdFdpdG5lc3MgPSBbXVxuICB9KTtcbiAgLy8gU2V0IHRoZSBvdXRwdXRcbiAgcHNidC5hZGRPdXRwdXQoe1xuICAgIHZhbHVlOiBCaWdJbnQoMCksIC8vIHZvdXRbMF0ublZhbHVlID0gMFxuICAgIHNjcmlwdDogc2NyaXB0UHViS2V5LCAvLyB2b3V0WzBdLnNjcmlwdFB1YktleSA9IG1lc3NhZ2VfY2hhbGxlbmdlXG4gIH0pO1xuICAvLyBSZXR1cm4gdHJhbnNhY3Rpb25cbiAgcmV0dXJuIHBzYnQuZXh0cmFjdFRyYW5zYWN0aW9uKCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFRvU3BlbmRUcmFuc2FjdGlvbkZyb21DaGFpbkFuZEluZGV4KFxuICByb290V2FsbGV0S2V5czogYml0Z28uUm9vdFdhbGxldEtleXMsXG4gIGNoYWluOiBiaXRnby5DaGFpbkNvZGUsXG4gIGluZGV4OiBudW1iZXIsXG4gIG1lc3NhZ2U6IHN0cmluZyB8IEJ1ZmZlcixcbiAgdGFnID0gQklQMzIyX1RBR1xuKTogVHJhbnNhY3Rpb248YmlnaW50PiB7XG4gIGNvbnN0IG91dHB1dFNjcmlwdCA9IGJpdGdvLm91dHB1dFNjcmlwdHMuY3JlYXRlT3V0cHV0U2NyaXB0Mm9mMyhcbiAgICByb290V2FsbGV0S2V5cy5kZXJpdmVGb3JDaGFpbkFuZEluZGV4KGNoYWluLCBpbmRleCkucHVibGljS2V5cyxcbiAgICBiaXRnby5zY3JpcHRUeXBlRm9yQ2hhaW4oY2hhaW4pLFxuICAgIG5ldHdvcmtzLmJpdGNvaW5cbiAgKTtcbiAgcmV0dXJuIGJ1aWxkVG9TcGVuZFRyYW5zYWN0aW9uKG91dHB1dFNjcmlwdC5zY3JpcHRQdWJLZXksIG1lc3NhZ2UsIHRhZyk7XG59XG4iXX0=
|
|
@@ -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,77 @@
|
|
|
1
|
+
import * as utxolib from '@bitgo-beta/utxo-lib';
|
|
2
|
+
export function addBip322ProofMessage(psbt, inputIndex, message) {
|
|
3
|
+
utxolib.bitgo.addProprietaryKeyValuesFromUnknownKeyValues(psbt, 'input', inputIndex, {
|
|
4
|
+
key: {
|
|
5
|
+
identifier: utxolib.bitgo.PSBT_PROPRIETARY_IDENTIFIER,
|
|
6
|
+
subtype: utxolib.bitgo.ProprietaryKeySubtype.BIP322_MESSAGE,
|
|
7
|
+
keydata: Buffer.alloc(0),
|
|
8
|
+
},
|
|
9
|
+
value: message,
|
|
10
|
+
});
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Get the BIP322 proof message at a specific input index of the PSBT
|
|
14
|
+
* @param psbt
|
|
15
|
+
* @param inputIndex
|
|
16
|
+
* @returns The BIP322 proof message as a Buffer, or undefined if not found
|
|
17
|
+
*/
|
|
18
|
+
export function getBip322ProofMessageAtIndex(psbt, inputIndex) {
|
|
19
|
+
if (psbt.data.inputs.length <= inputIndex) {
|
|
20
|
+
throw new Error(`Input index ${inputIndex} is out of bounds for the PSBT`);
|
|
21
|
+
}
|
|
22
|
+
const input = psbt.data.inputs[inputIndex];
|
|
23
|
+
const proprietaryKeyVals = utxolib.bitgo.getPsbtInputProprietaryKeyVals(input, {
|
|
24
|
+
identifier: utxolib.bitgo.PSBT_PROPRIETARY_IDENTIFIER,
|
|
25
|
+
subtype: utxolib.bitgo.ProprietaryKeySubtype.BIP322_MESSAGE,
|
|
26
|
+
});
|
|
27
|
+
if (proprietaryKeyVals.length === 0) {
|
|
28
|
+
return undefined;
|
|
29
|
+
}
|
|
30
|
+
else if (proprietaryKeyVals.length > 1) {
|
|
31
|
+
throw new Error(`Multiple BIP322 messages found at input index ${inputIndex}`);
|
|
32
|
+
}
|
|
33
|
+
return Buffer.from(proprietaryKeyVals[0].value);
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* checks if the transaction contains a BIP322 proof
|
|
37
|
+
* does not check if the proof is valid
|
|
38
|
+
* Source: https://github.com/bitcoin/bips/blob/master/bip-0322.mediawiki#user-content-Full
|
|
39
|
+
* @params tx The transaction or the PSBT to check
|
|
40
|
+
* @returns boolean
|
|
41
|
+
*/
|
|
42
|
+
export function isBip322ProofCheck(tx) {
|
|
43
|
+
if (tx instanceof utxolib.bitgo.UtxoPsbt) {
|
|
44
|
+
if (tx.version !== 0 || tx.locktime !== 0 || tx.data.outputs.length !== 1) {
|
|
45
|
+
return false;
|
|
46
|
+
}
|
|
47
|
+
const output = tx.txOutputs[0];
|
|
48
|
+
if (output.script.toString('hex') !== '6a' || output.value !== 0n) {
|
|
49
|
+
return false;
|
|
50
|
+
}
|
|
51
|
+
// Return true if there is a message encoded in every input in the proprietary field
|
|
52
|
+
return tx.data.inputs.every((input, index) => getBip322ProofMessageAtIndex(tx, index) !== undefined);
|
|
53
|
+
}
|
|
54
|
+
else if (tx instanceof utxolib.bitgo.UtxoTransaction) {
|
|
55
|
+
if (tx.version !== 0 || tx.locktime !== 0 || tx.outs.length !== 1) {
|
|
56
|
+
return false;
|
|
57
|
+
}
|
|
58
|
+
if (tx.outs.length !== 1) {
|
|
59
|
+
return false;
|
|
60
|
+
}
|
|
61
|
+
const output = tx.outs[0];
|
|
62
|
+
// check that the only output is an OP_RETURN with 0 value
|
|
63
|
+
if (output.script.toString('hex') !== '6a' || output.value !== 0n) {
|
|
64
|
+
return false;
|
|
65
|
+
}
|
|
66
|
+
for (const input of tx.ins) {
|
|
67
|
+
if (input.index !== 0 || input.sequence !== 0) {
|
|
68
|
+
return false;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
return true;
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
throw new Error('Unsupported transaction type for BIP322 proof check');
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYmlwMzIyL3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sc0JBQXNCLENBQUM7QUFFaEQsTUFBTSxVQUFVLHFCQUFxQixDQUFDLElBQWtCLEVBQUUsVUFBa0IsRUFBRSxPQUFlO0lBQzNGLE9BQU8sQ0FBQyxLQUFLLENBQUMsMkNBQTJDLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUU7UUFDbkYsR0FBRyxFQUFFO1lBQ0gsVUFBVSxFQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsMkJBQTJCO1lBQ3JELE9BQU8sRUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLHFCQUFxQixDQUFDLGNBQWM7WUFDM0QsT0FBTyxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1NBQ3pCO1FBQ0QsS0FBSyxFQUFFLE9BQU87S0FDZixDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsNEJBQTRCLENBQUMsSUFBa0IsRUFBRSxVQUFrQjtJQUNqRixJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sSUFBSSxVQUFVLEVBQUUsQ0FBQztRQUMxQyxNQUFNLElBQUksS0FBSyxDQUFDLGVBQWUsVUFBVSxnQ0FBZ0MsQ0FBQyxDQUFDO0lBQzdFLENBQUM7SUFDRCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUMzQyxNQUFNLGtCQUFrQixHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsOEJBQThCLENBQUMsS0FBSyxFQUFFO1FBQzdFLFVBQVUsRUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLDJCQUEyQjtRQUNyRCxPQUFPLEVBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQyxxQkFBcUIsQ0FBQyxjQUFjO0tBQzVELENBQUMsQ0FBQztJQUNILElBQUksa0JBQWtCLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ3BDLE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7U0FBTSxJQUFJLGtCQUFrQixDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUN6QyxNQUFNLElBQUksS0FBSyxDQUFDLGlEQUFpRCxVQUFVLEVBQUUsQ0FBQyxDQUFDO0lBQ2pGLENBQUM7SUFDRCxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDbEQsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILE1BQU0sVUFBVSxrQkFBa0IsQ0FBQyxFQUFrRTtJQUNuRyxJQUFJLEVBQUUsWUFBWSxPQUFPLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ3pDLElBQUksRUFBRSxDQUFDLE9BQU8sS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLFFBQVEsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQzFFLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztRQUNELE1BQU0sTUFBTSxHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDL0IsSUFBSSxNQUFNLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsS0FBSyxJQUFJLElBQUksTUFBTSxDQUFDLEtBQUssS0FBSyxFQUFFLEVBQUUsQ0FBQztZQUNsRSxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7UUFFRCxvRkFBb0Y7UUFDcEYsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyw0QkFBNEIsQ0FBQyxFQUFFLEVBQUUsS0FBSyxDQUFDLEtBQUssU0FBUyxDQUFDLENBQUM7SUFDdkcsQ0FBQztTQUFNLElBQUksRUFBRSxZQUFZLE9BQU8sQ0FBQyxLQUFLLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDdkQsSUFBSSxFQUFFLENBQUMsT0FBTyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsUUFBUSxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUNsRSxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7UUFDRCxJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3pCLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztRQUNELE1BQU0sTUFBTSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDMUIsMERBQTBEO1FBQzFELElBQUksTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEtBQUssSUFBSSxJQUFJLE1BQU0sQ0FBQyxLQUFLLEtBQUssRUFBRSxFQUFFLENBQUM7WUFDbEUsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO1FBRUQsS0FBSyxNQUFNLEtBQUssSUFBSSxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDM0IsSUFBSSxLQUFLLENBQUMsS0FBSyxLQUFLLENBQUMsSUFBSSxLQUFLLENBQUMsUUFBUSxLQUFLLENBQUMsRUFBRSxDQUFDO2dCQUM5QyxPQUFPLEtBQUssQ0FBQztZQUNmLENBQUM7UUFDSCxDQUFDO1FBRUQsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO1NBQU0sQ0FBQztRQUNOLE1BQU0sSUFBSSxLQUFLLENBQUMscURBQXFELENBQUMsQ0FBQztJQUN6RSxDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIHV0eG9saWIgZnJvbSAnQGJpdGdvLWJldGEvdXR4by1saWInO1xuXG5leHBvcnQgZnVuY3Rpb24gYWRkQmlwMzIyUHJvb2ZNZXNzYWdlKHBzYnQ6IHV0eG9saWIuUHNidCwgaW5wdXRJbmRleDogbnVtYmVyLCBtZXNzYWdlOiBCdWZmZXIpOiB2b2lkIHtcbiAgdXR4b2xpYi5iaXRnby5hZGRQcm9wcmlldGFyeUtleVZhbHVlc0Zyb21Vbmtub3duS2V5VmFsdWVzKHBzYnQsICdpbnB1dCcsIGlucHV0SW5kZXgsIHtcbiAgICBrZXk6IHtcbiAgICAgIGlkZW50aWZpZXI6IHV0eG9saWIuYml0Z28uUFNCVF9QUk9QUklFVEFSWV9JREVOVElGSUVSLFxuICAgICAgc3VidHlwZTogdXR4b2xpYi5iaXRnby5Qcm9wcmlldGFyeUtleVN1YnR5cGUuQklQMzIyX01FU1NBR0UsXG4gICAgICBrZXlkYXRhOiBCdWZmZXIuYWxsb2MoMCksXG4gICAgfSxcbiAgICB2YWx1ZTogbWVzc2FnZSxcbiAgfSk7XG59XG5cbi8qKlxuICogR2V0IHRoZSBCSVAzMjIgcHJvb2YgbWVzc2FnZSBhdCBhIHNwZWNpZmljIGlucHV0IGluZGV4IG9mIHRoZSBQU0JUXG4gKiBAcGFyYW0gcHNidFxuICogQHBhcmFtIGlucHV0SW5kZXhcbiAqIEByZXR1cm5zIFRoZSBCSVAzMjIgcHJvb2YgbWVzc2FnZSBhcyBhIEJ1ZmZlciwgb3IgdW5kZWZpbmVkIGlmIG5vdCBmb3VuZFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0QmlwMzIyUHJvb2ZNZXNzYWdlQXRJbmRleChwc2J0OiB1dHhvbGliLlBzYnQsIGlucHV0SW5kZXg6IG51bWJlcik6IEJ1ZmZlciB8IHVuZGVmaW5lZCB7XG4gIGlmIChwc2J0LmRhdGEuaW5wdXRzLmxlbmd0aCA8PSBpbnB1dEluZGV4KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnB1dCBpbmRleCAke2lucHV0SW5kZXh9IGlzIG91dCBvZiBib3VuZHMgZm9yIHRoZSBQU0JUYCk7XG4gIH1cbiAgY29uc3QgaW5wdXQgPSBwc2J0LmRhdGEuaW5wdXRzW2lucHV0SW5kZXhdO1xuICBjb25zdCBwcm9wcmlldGFyeUtleVZhbHMgPSB1dHhvbGliLmJpdGdvLmdldFBzYnRJbnB1dFByb3ByaWV0YXJ5S2V5VmFscyhpbnB1dCwge1xuICAgIGlkZW50aWZpZXI6IHV0eG9saWIuYml0Z28uUFNCVF9QUk9QUklFVEFSWV9JREVOVElGSUVSLFxuICAgIHN1YnR5cGU6IHV0eG9saWIuYml0Z28uUHJvcHJpZXRhcnlLZXlTdWJ0eXBlLkJJUDMyMl9NRVNTQUdFLFxuICB9KTtcbiAgaWYgKHByb3ByaWV0YXJ5S2V5VmFscy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9IGVsc2UgaWYgKHByb3ByaWV0YXJ5S2V5VmFscy5sZW5ndGggPiAxKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBNdWx0aXBsZSBCSVAzMjIgbWVzc2FnZXMgZm91bmQgYXQgaW5wdXQgaW5kZXggJHtpbnB1dEluZGV4fWApO1xuICB9XG4gIHJldHVybiBCdWZmZXIuZnJvbShwcm9wcmlldGFyeUtleVZhbHNbMF0udmFsdWUpO1xufVxuXG4vKipcbiAqIGNoZWNrcyBpZiB0aGUgdHJhbnNhY3Rpb24gY29udGFpbnMgYSBCSVAzMjIgcHJvb2ZcbiAqIGRvZXMgbm90IGNoZWNrIGlmIHRoZSBwcm9vZiBpcyB2YWxpZFxuICogU291cmNlOiBodHRwczovL2dpdGh1Yi5jb20vYml0Y29pbi9iaXBzL2Jsb2IvbWFzdGVyL2JpcC0wMzIyLm1lZGlhd2lraSN1c2VyLWNvbnRlbnQtRnVsbFxuICogQHBhcmFtcyB0eCBUaGUgdHJhbnNhY3Rpb24gb3IgdGhlIFBTQlQgdG8gY2hlY2tcbiAqIEByZXR1cm5zIGJvb2xlYW5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQmlwMzIyUHJvb2ZDaGVjayh0eDogdXR4b2xpYi5iaXRnby5VdHhvUHNidCB8IHV0eG9saWIuYml0Z28uVXR4b1RyYW5zYWN0aW9uPGJpZ2ludD4pOiBib29sZWFuIHtcbiAgaWYgKHR4IGluc3RhbmNlb2YgdXR4b2xpYi5iaXRnby5VdHhvUHNidCkge1xuICAgIGlmICh0eC52ZXJzaW9uICE9PSAwIHx8IHR4LmxvY2t0aW1lICE9PSAwIHx8IHR4LmRhdGEub3V0cHV0cy5sZW5ndGggIT09IDEpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3Qgb3V0cHV0ID0gdHgudHhPdXRwdXRzWzBdO1xuICAgIGlmIChvdXRwdXQuc2NyaXB0LnRvU3RyaW5nKCdoZXgnKSAhPT0gJzZhJyB8fCBvdXRwdXQudmFsdWUgIT09IDBuKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gUmV0dXJuIHRydWUgaWYgdGhlcmUgaXMgYSBtZXNzYWdlIGVuY29kZWQgaW4gZXZlcnkgaW5wdXQgaW4gdGhlIHByb3ByaWV0YXJ5IGZpZWxkXG4gICAgcmV0dXJuIHR4LmRhdGEuaW5wdXRzLmV2ZXJ5KChpbnB1dCwgaW5kZXgpID0+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"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import * as assert from 'assert';
|
|
2
|
+
import * as utxolib from '@bitgo-beta/utxo-lib';
|
|
3
|
+
import { buildToSpendTransaction } from './toSpend';
|
|
4
|
+
export function assertBaseTx(tx) {
|
|
5
|
+
assert.deepStrictEqual(tx.version, 0, 'Transaction version must be 0.');
|
|
6
|
+
assert.deepStrictEqual(tx.locktime, 0, 'Transaction locktime must be 0.');
|
|
7
|
+
assert.deepStrictEqual(tx.outs.length, 1, 'Transaction must have exactly 1 output.');
|
|
8
|
+
assert.deepStrictEqual(tx.outs[0].value, BigInt(0), 'Transaction output value must be 0.');
|
|
9
|
+
assert.deepStrictEqual(tx.outs[0].script.toString('hex'), '6a', 'Transaction output script must be OP_RETURN.');
|
|
10
|
+
}
|
|
11
|
+
export function assertTxInput(tx, inputIndex, prevOuts, info, checkSignature) {
|
|
12
|
+
assert.ok(inputIndex < tx.ins.length, `inputIndex ${inputIndex} is out of range for tx with ${tx.ins.length} inputs.`);
|
|
13
|
+
const input = tx.ins[inputIndex];
|
|
14
|
+
assert.deepStrictEqual(input.index, 0, `transaction input ${inputIndex} must have index=0.`);
|
|
15
|
+
assert.deepStrictEqual(input.sequence, 0, `transaction input ${inputIndex} sequence must be 0.`);
|
|
16
|
+
// Make sure that the message is correctly encoded into the input of the transaction and
|
|
17
|
+
// verify that the message info corresponds
|
|
18
|
+
const scriptPubKey = utxolib.bitgo.outputScripts.createOutputScript2of3(info.pubkeys.map((pubkey) => Buffer.from(pubkey, 'hex')), info.scriptType, tx.network).scriptPubKey;
|
|
19
|
+
assert.deepStrictEqual(info.address, utxolib.address.fromOutputScript(scriptPubKey, tx.network).toString(), `Address does not match derived scriptPubKey for input ${inputIndex}.`);
|
|
20
|
+
const txid = utxolib.bitgo.getOutputIdForInput(input).txid;
|
|
21
|
+
const toSpendTx = buildToSpendTransaction(scriptPubKey, info.message);
|
|
22
|
+
assert.deepStrictEqual(txid, toSpendTx.getId(), `Input ${inputIndex} derived to_spend transaction is not encoded in the input.`);
|
|
23
|
+
if (checkSignature) {
|
|
24
|
+
const signatureScript = utxolib.bitgo.parseSignatureScript2Of3(input);
|
|
25
|
+
const scriptType = signatureScript.scriptType === 'taprootKeyPathSpend'
|
|
26
|
+
? 'p2trMusig2'
|
|
27
|
+
: signatureScript.scriptType === 'taprootScriptPathSpend'
|
|
28
|
+
? 'p2tr'
|
|
29
|
+
: signatureScript.scriptType;
|
|
30
|
+
assert.deepStrictEqual(scriptType, info.scriptType, 'Script type does not match.');
|
|
31
|
+
utxolib.bitgo.verifySignatureWithPublicKeys(tx, inputIndex, prevOuts, info.pubkeys.map((pubkey) => Buffer.from(pubkey, 'hex')));
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
export function assertBip322TxProof(tx, messageInfo) {
|
|
35
|
+
assertBaseTx(tx);
|
|
36
|
+
assert.deepStrictEqual(tx.ins.length, messageInfo.length, 'Transaction must have the same number of inputs as messageInfo entries.');
|
|
37
|
+
const prevOuts = messageInfo.map((info) => {
|
|
38
|
+
return {
|
|
39
|
+
value: 0n,
|
|
40
|
+
script: utxolib.bitgo.outputScripts.createOutputScript2of3(info.pubkeys.map((pubkey) => Buffer.from(pubkey, 'hex')), info.scriptType, tx.network).scriptPubKey,
|
|
41
|
+
};
|
|
42
|
+
});
|
|
43
|
+
tx.ins.forEach((input, inputIndex) => assertTxInput(tx, inputIndex, prevOuts, messageInfo[inputIndex], true));
|
|
44
|
+
}
|
|
45
|
+
export function assertBip322PsbtProof(psbt, messageInfo) {
|
|
46
|
+
const unsignedTx = psbt.getUnsignedTx();
|
|
47
|
+
assertBaseTx(unsignedTx);
|
|
48
|
+
assert.deepStrictEqual(psbt.data.inputs.length, messageInfo.length, 'PSBT must have the same number of inputs as messageInfo entries.');
|
|
49
|
+
const prevOuts = psbt.data.inputs.map((input, inputIndex) => {
|
|
50
|
+
assert.ok(input.witnessUtxo, `PSBT input ${inputIndex} is missing witnessUtxo`);
|
|
51
|
+
return input.witnessUtxo;
|
|
52
|
+
});
|
|
53
|
+
psbt.data.inputs.forEach((input, inputIndex) => {
|
|
54
|
+
// Check that the metadata in the PSBT matches the messageInfo, then check the input data
|
|
55
|
+
const info = messageInfo[inputIndex];
|
|
56
|
+
// Check that the to_spend transaction is encoded in the nonWitnessUtxo
|
|
57
|
+
assert.ok(input.nonWitnessUtxo, `PSBT input ${inputIndex} is missing nonWitnessUtxo`);
|
|
58
|
+
const toSpendTx = buildToSpendTransaction(prevOuts[inputIndex].script, info.message);
|
|
59
|
+
assert.deepStrictEqual(input.nonWitnessUtxo.toString('hex'), toSpendTx.toHex());
|
|
60
|
+
if (input.bip32Derivation) {
|
|
61
|
+
input.bip32Derivation.forEach((b) => {
|
|
62
|
+
const pubkey = b.pubkey.toString('hex');
|
|
63
|
+
assert.ok(info.pubkeys.includes(pubkey), `PSBT input ${inputIndex} has a pubkey in (tap)bip32Derivation that is not in messageInfo`);
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
else if (!input.tapBip32Derivation) {
|
|
67
|
+
throw new Error(`PSBT input ${inputIndex} is missing (tap)bip32Derivation when it should have it.`);
|
|
68
|
+
}
|
|
69
|
+
// Verify the signature on the input
|
|
70
|
+
assert.ok(psbt.validateSignaturesOfInputCommon(inputIndex), `PSBT input ${inputIndex} has an invalid signature.`);
|
|
71
|
+
// Do not check the signature when using the PSBT, the signature is not there. We are going
|
|
72
|
+
// to signatures in the PSBT.
|
|
73
|
+
assertTxInput(unsignedTx, inputIndex, prevOuts, info, false);
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyaWZ5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2JpcDMyMi92ZXJpZnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE1BQU0sTUFBTSxRQUFRLENBQUM7QUFFakMsT0FBTyxLQUFLLE9BQU8sTUFBTSxzQkFBc0IsQ0FBQztBQUVoRCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFVcEQsTUFBTSxVQUFVLFlBQVksQ0FBQyxFQUF5QztJQUNwRSxNQUFNLENBQUMsZUFBZSxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxFQUFFLGdDQUFnQyxDQUFDLENBQUM7SUFDeEUsTUFBTSxDQUFDLGVBQWUsQ0FBQyxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUMsRUFBRSxpQ0FBaUMsQ0FBQyxDQUFDO0lBQzFFLE1BQU0sQ0FBQyxlQUFlLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLHlDQUF5QyxDQUFDLENBQUM7SUFDckYsTUFBTSxDQUFDLGVBQWUsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUscUNBQXFDLENBQUMsQ0FBQztJQUMzRixNQUFNLENBQUMsZUFBZSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRSxJQUFJLEVBQUUsOENBQThDLENBQUMsQ0FBQztBQUNsSCxDQUFDO0FBRUQsTUFBTSxVQUFVLGFBQWEsQ0FDM0IsRUFBeUMsRUFDekMsVUFBa0IsRUFDbEIsUUFBb0MsRUFDcEMsSUFBaUIsRUFDakIsY0FBdUI7SUFFdkIsTUFBTSxDQUFDLEVBQUUsQ0FDUCxVQUFVLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQzFCLGNBQWMsVUFBVSxnQ0FBZ0MsRUFBRSxDQUFDLEdBQUcsQ0FBQyxNQUFNLFVBQVUsQ0FDaEYsQ0FBQztJQUNGLE1BQU0sS0FBSyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDakMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUMsRUFBRSxxQkFBcUIsVUFBVSxxQkFBcUIsQ0FBQyxDQUFDO0lBQzdGLE1BQU0sQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDLEVBQUUscUJBQXFCLFVBQVUsc0JBQXNCLENBQUMsQ0FBQztJQUVqRyx3RkFBd0Y7SUFDeEYsMkNBQTJDO0lBQzNDLE1BQU0sWUFBWSxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLHNCQUFzQixDQUNyRSxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUMsRUFDeEQsSUFBSSxDQUFDLFVBQVUsRUFDZixFQUFFLENBQUMsT0FBTyxDQUNYLENBQUMsWUFBWSxDQUFDO0lBQ2YsTUFBTSxDQUFDLGVBQWUsQ0FDcEIsSUFBSSxDQUFDLE9BQU8sRUFDWixPQUFPLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLFlBQVksRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQ3JFLHlEQUF5RCxVQUFVLEdBQUcsQ0FDdkUsQ0FBQztJQUVGLE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsbUJBQW1CLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQzNELE1BQU0sU0FBUyxHQUFHLHVCQUF1QixDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDdEUsTUFBTSxDQUFDLGVBQWUsQ0FDcEIsSUFBSSxFQUNKLFNBQVMsQ0FBQyxLQUFLLEVBQUUsRUFDakIsU0FBUyxVQUFVLDREQUE0RCxDQUNoRixDQUFDO0lBRUYsSUFBSSxjQUFjLEVBQUUsQ0FBQztRQUNuQixNQUFNLGVBQWUsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLHdCQUF3QixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3RFLE1BQU0sVUFBVSxHQUNkLGVBQWUsQ0FBQyxVQUFVLEtBQUsscUJBQXFCO1lBQ2xELENBQUMsQ0FBQyxZQUFZO1lBQ2QsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxVQUFVLEtBQUssd0JBQXdCO2dCQUN6RCxDQUFDLENBQUMsTUFBTTtnQkFDUixDQUFDLENBQUMsZUFBZSxDQUFDLFVBQVUsQ0FBQztRQUNqQyxNQUFNLENBQUMsZUFBZSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLDZCQUE2QixDQUFDLENBQUM7UUFDbkYsT0FBTyxDQUFDLEtBQUssQ0FBQyw2QkFBNkIsQ0FDekMsRUFBRSxFQUNGLFVBQVUsRUFDVixRQUFRLEVBQ1IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQ3pELENBQUM7SUFDSixDQUFDO0FBQ0gsQ0FBQztBQUVELE1BQU0sVUFBVSxtQkFBbUIsQ0FBQyxFQUF5QyxFQUFFLFdBQTBCO0lBQ3ZHLFlBQVksQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNqQixNQUFNLENBQUMsZUFBZSxDQUNwQixFQUFFLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFDYixXQUFXLENBQUMsTUFBTSxFQUNsQix5RUFBeUUsQ0FDMUUsQ0FBQztJQUNGLE1BQU0sUUFBUSxHQUFHLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtRQUN4QyxPQUFPO1lBQ0wsS0FBSyxFQUFFLEVBQUU7WUFDVCxNQUFNLEVBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsc0JBQXNCLENBQ3hELElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQyxFQUN4RCxJQUFJLENBQUMsVUFBVSxFQUNmLEVBQUUsQ0FBQyxPQUFPLENBQ1gsQ0FBQyxZQUFZO1NBQ2YsQ0FBQztJQUNKLENBQUMsQ0FBQyxDQUFDO0lBQ0gsRUFBRSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLEVBQUUsVUFBVSxFQUFFLEVBQUUsQ0FBQyxhQUFhLENBQUMsRUFBRSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsV0FBVyxDQUFDLFVBQVUsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7QUFDaEgsQ0FBQztBQUVELE1BQU0sVUFBVSxxQkFBcUIsQ0FBQyxJQUE0QixFQUFFLFdBQTBCO0lBQzVGLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUV4QyxZQUFZLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDekIsTUFBTSxDQUFDLGVBQWUsQ0FDcEIsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUN2QixXQUFXLENBQUMsTUFBTSxFQUNsQixrRUFBa0UsQ0FDbkUsQ0FBQztJQUVGLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxVQUFVLEVBQUUsRUFBRTtRQUMxRCxNQUFNLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsY0FBYyxVQUFVLHlCQUF5QixDQUFDLENBQUM7UUFDaEYsT0FBTyxLQUFLLENBQUMsV0FBVyxDQUFDO0lBQzNCLENBQUMsQ0FBQyxDQUFDO0lBRUgsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxFQUFFLFVBQVUsRUFBRSxFQUFFO1FBQzdDLHlGQUF5RjtRQUN6RixNQUFNLElBQUksR0FBRyxXQUFXLENBQUMsVUFBVSxDQUFDLENBQUM7UUFFckMsdUVBQXVFO1FBQ3ZFLE1BQU0sQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLGNBQWMsRUFBRSxjQUFjLFVBQVUsNEJBQTRCLENBQUMsQ0FBQztRQUN0RixNQUFNLFNBQVMsR0FBRyx1QkFBdUIsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNyRixNQUFNLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBRWhGLElBQUksS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQzFCLEtBQUssQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7Z0JBQ2xDLE1BQU0sTUFBTSxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUN4QyxNQUFNLENBQUMsRUFBRSxDQUNQLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxFQUM3QixjQUFjLFVBQVUsa0VBQWtFLENBQzNGLENBQUM7WUFDSixDQUFDLENBQUMsQ0FBQztRQUNMLENBQUM7YUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLGtCQUFrQixFQUFFLENBQUM7WUFDckMsTUFBTSxJQUFJLEtBQUssQ0FBQyxjQUFjLFVBQVUsMERBQTBELENBQUMsQ0FBQztRQUN0RyxDQUFDO1FBRUQsb0NBQW9DO1FBQ3BDLE1BQU0sQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLCtCQUErQixDQUFDLFVBQVUsQ0FBQyxFQUFFLGNBQWMsVUFBVSw0QkFBNEIsQ0FBQyxDQUFDO1FBRWxILDJGQUEyRjtRQUMzRiw2QkFBNkI7UUFDN0IsYUFBYSxDQUFDLFVBQVUsRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztJQUMvRCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcblxuaW1wb3J0ICogYXMgdXR4b2xpYiBmcm9tICdAYml0Z28tYmV0YS91dHhvLWxpYic7XG5cbmltcG9ydCB7IGJ1aWxkVG9TcGVuZFRyYW5zYWN0aW9uIH0gZnJvbSAnLi90b1NwZW5kJztcblxuZXhwb3J0IHR5cGUgTWVzc2FnZUluZm8gPSB7XG4gIGFkZHJlc3M6IHN0cmluZztcbiAgbWVzc2FnZTogc3RyaW5nO1xuICAvLyBIZXggZW5jb2RlZCBwdWJrZXlzXG4gIHB1YmtleXM6IHN0cmluZ1tdO1xuICBzY3JpcHRUeXBlOiB1dHhvbGliLmJpdGdvLm91dHB1dFNjcmlwdHMuU2NyaXB0VHlwZTJPZjM7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0QmFzZVR4KHR4OiB1dHhvbGliLmJpdGdvLlV0eG9UcmFuc2FjdGlvbjxiaWdpbnQ+KTogdm9pZCB7XG4gIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwodHgudmVyc2lvbiwgMCwgJ1RyYW5zYWN0aW9uIHZlcnNpb24gbXVzdCBiZSAwLicpO1xuICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKHR4LmxvY2t0aW1lLCAwLCAnVHJhbnNhY3Rpb24gbG9ja3RpbWUgbXVzdCBiZSAwLicpO1xuICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKHR4Lm91dHMubGVuZ3RoLCAxLCAnVHJhbnNhY3Rpb24gbXVzdCBoYXZlIGV4YWN0bHkgMSBvdXRwdXQuJyk7XG4gIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwodHgub3V0c1swXS52YWx1ZSwgQmlnSW50KDApLCAnVHJhbnNhY3Rpb24gb3V0cHV0IHZhbHVlIG11c3QgYmUgMC4nKTtcbiAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbCh0eC5vdXRzWzBdLnNjcmlwdC50b1N0cmluZygnaGV4JyksICc2YScsICdUcmFuc2FjdGlvbiBvdXRwdXQgc2NyaXB0IG11c3QgYmUgT1BfUkVUVVJOLicpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0VHhJbnB1dChcbiAgdHg6IHV0eG9saWIuYml0Z28uVXR4b1RyYW5zYWN0aW9uPGJpZ2ludD4sXG4gIGlucHV0SW5kZXg6IG51bWJlcixcbiAgcHJldk91dHM6IHV0eG9saWIuVHhPdXRwdXQ8YmlnaW50PltdLFxuICBpbmZvOiBNZXNzYWdlSW5mbyxcbiAgY2hlY2tTaWduYXR1cmU6IGJvb2xlYW5cbik6IHZvaWQge1xuICBhc3NlcnQub2soXG4gICAgaW5wdXRJbmRleCA8IHR4Lmlucy5sZW5ndGgsXG4gICAgYGlucHV0SW5kZXggJHtpbnB1dEluZGV4fSBpcyBvdXQgb2YgcmFuZ2UgZm9yIHR4IHdpdGggJHt0eC5pbnMubGVuZ3RofSBpbnB1dHMuYFxuICApO1xuICBjb25zdCBpbnB1dCA9IHR4Lmluc1tpbnB1dEluZGV4XTtcbiAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChpbnB1dC5pbmRleCwgMCwgYHRyYW5zYWN0aW9uIGlucHV0ICR7aW5wdXRJbmRleH0gbXVzdCBoYXZlIGluZGV4PTAuYCk7XG4gIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwoaW5wdXQuc2VxdWVuY2UsIDAsIGB0cmFuc2FjdGlvbiBpbnB1dCAke2lucHV0SW5kZXh9IHNlcXVlbmNlIG11c3QgYmUgMC5gKTtcblxuICAvLyBNYWtlIHN1cmUgdGhhdCB0aGUgbWVzc2FnZSBpcyBjb3JyZWN0bHkgZW5jb2RlZCBpbnRvIHRoZSBpbnB1dCBvZiB0aGUgdHJhbnNhY3Rpb24gYW5kXG4gIC8vIHZlcmlmeSB0aGF0IHRoZSBtZXNzYWdlIGluZm8gY29ycmVzcG9uZHNcbiAgY29uc3Qgc2NyaXB0UHViS2V5ID0gdXR4b2xpYi5iaXRnby5vdXRwdXRTY3JpcHRzLmNyZWF0ZU91dHB1dFNjcmlwdDJvZjMoXG4gICAgaW5mby5wdWJrZXlzLm1hcCgocHVia2V5KSA9PiBCdWZmZXIuZnJvbShwdWJrZXksICdoZXgnKSksXG4gICAgaW5mby5zY3JpcHRUeXBlLFxuICAgIHR4Lm5ldHdvcmtcbiAgKS5zY3JpcHRQdWJLZXk7XG4gIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwoXG4gICAgaW5mby5hZGRyZXNzLFxuICAgIHV0eG9saWIuYWRkcmVzcy5mcm9tT3V0cHV0U2NyaXB0KHNjcmlwdFB1YktleSwgdHgubmV0d29yaykudG9TdHJpbmcoKSxcbiAgICBgQWRkcmVzcyBkb2VzIG5vdCBtYXRjaCBkZXJpdmVkIHNjcmlwdFB1YktleSBmb3IgaW5wdXQgJHtpbnB1dEluZGV4fS5gXG4gICk7XG5cbiAgY29uc3QgdHhpZCA9IHV0eG9saWIuYml0Z28uZ2V0T3V0cHV0SWRGb3JJbnB1dChpbnB1dCkudHhpZDtcbiAgY29uc3QgdG9TcGVuZFR4ID0gYnVpbGRUb1NwZW5kVHJhbnNhY3Rpb24oc2NyaXB0UHViS2V5LCBpbmZvLm1lc3NhZ2UpO1xuICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKFxuICAgIHR4aWQsXG4gICAgdG9TcGVuZFR4LmdldElkKCksXG4gICAgYElucHV0ICR7aW5wdXRJbmRleH0gZGVyaXZlZCB0b19zcGVuZCB0cmFuc2FjdGlvbiBpcyBub3QgZW5jb2RlZCBpbiB0aGUgaW5wdXQuYFxuICApO1xuXG4gIGlmIChjaGVja1NpZ25hdHVyZSkge1xuICAgIGNvbnN0IHNpZ25hdHVyZVNjcmlwdCA9IHV0eG9saWIuYml0Z28ucGFyc2VTaWduYXR1cmVTY3JpcHQyT2YzKGlucHV0KTtcbiAgICBjb25zdCBzY3JpcHRUeXBlID1cbiAgICAgIHNpZ25hdHVyZVNjcmlwdC5zY3JpcHRUeXBlID09PSAndGFwcm9vdEtleVBhdGhTcGVuZCdcbiAgICAgICAgPyAncDJ0ck11c2lnMidcbiAgICAgICAgOiBzaWduYXR1cmVTY3JpcHQuc2NyaXB0VHlwZSA9PT0gJ3RhcHJvb3RTY3JpcHRQYXRoU3BlbmQnXG4gICAgICAgID8gJ3AydHInXG4gICAgICAgIDogc2lnbmF0dXJlU2NyaXB0LnNjcmlwdFR5cGU7XG4gICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChzY3JpcHRUeXBlLCBpbmZvLnNjcmlwdFR5cGUsICdTY3JpcHQgdHlwZSBkb2VzIG5vdCBtYXRjaC4nKTtcbiAgICB1dHhvbGliLmJpdGdvLnZlcmlmeVNpZ25hdHVyZVdpdGhQdWJsaWNLZXlzKFxuICAgICAgdHgsXG4gICAgICBpbnB1dEluZGV4LFxuICAgICAgcHJldk91dHMsXG4gICAgICBpbmZvLnB1YmtleXMubWFwKChwdWJrZXkpID0+IEJ1ZmZlci5mcm9tKHB1YmtleSwgJ2hleCcpKVxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydEJpcDMyMlR4UHJvb2YodHg6IHV0eG9saWIuYml0Z28uVXR4b1RyYW5zYWN0aW9uPGJpZ2ludD4sIG1lc3NhZ2VJbmZvOiBNZXNzYWdlSW5mb1tdKTogdm9pZCB7XG4gIGFzc2VydEJhc2VUeCh0eCk7XG4gIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwoXG4gICAgdHguaW5zLmxlbmd0aCxcbiAgICBtZXNzYWdlSW5mby5sZW5ndGgsXG4gICAgJ1RyYW5zYWN0aW9uIG11c3QgaGF2ZSB0aGUgc2FtZSBudW1iZXIgb2YgaW5wdXRzIGFzIG1lc3NhZ2VJbmZvIGVudHJpZXMuJ1xuICApO1xuICBjb25zdCBwcmV2T3V0cyA9IG1lc3NhZ2VJbmZvLm1hcCgoaW5mbykgPT4ge1xuICAgIHJldHVybiB7XG4gICAgICB2YWx1ZTogMG4sXG4gICAgICBzY3JpcHQ6IHV0eG9saWIuYml0Z28ub3V0cHV0U2NyaXB0cy5jcmVhdGVPdXRwdXRTY3JpcHQyb2YzKFxuICAgICAgICBpbmZvLnB1YmtleXMubWFwKChwdWJrZXkpID0+IEJ1ZmZlci5mcm9tKHB1YmtleSwgJ2hleCcpKSxcbiAgICAgICAgaW5mby5zY3JpcHRUeXBlLFxuICAgICAgICB0eC5uZXR3b3JrXG4gICAgICApLnNjcmlwdFB1YktleSxcbiAgICB9O1xuICB9KTtcbiAgdHguaW5zLmZvckVhY2goKGlucHV0LCBpbnB1dEluZGV4KSA9PiBhc3NlcnRUeElucHV0KHR4LCBpbnB1dEluZGV4LCBwcmV2T3V0cywgbWVzc2FnZUluZm9baW5wdXRJbmRleF0sIHRydWUpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydEJpcDMyMlBzYnRQcm9vZihwc2J0OiB1dHhvbGliLmJpdGdvLlV0eG9Qc2J0LCBtZXNzYWdlSW5mbzogTWVzc2FnZUluZm9bXSk6IHZvaWQge1xuICBjb25zdCB1bnNpZ25lZFR4ID0gcHNidC5nZXRVbnNpZ25lZFR4KCk7XG5cbiAgYXNzZXJ0QmFzZVR4KHVuc2lnbmVkVHgpO1xuICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKFxuICAgIHBzYnQuZGF0YS5pbnB1dHMubGVuZ3RoLFxuICAgIG1lc3NhZ2VJbmZvLmxlbmd0aCxcbiAgICAnUFNCVCBtdXN0IGhhdmUgdGhlIHNhbWUgbnVtYmVyIG9mIGlucHV0cyBhcyBtZXNzYWdlSW5mbyBlbnRyaWVzLidcbiAgKTtcblxuICBjb25zdCBwcmV2T3V0cyA9IHBzYnQuZGF0YS5pbnB1dHMubWFwKChpbnB1dCwgaW5wdXRJbmRleCkgPT4ge1xuICAgIGFzc2VydC5vayhpbnB1dC53aXRuZXNzVXR4bywgYFBTQlQgaW5wdXQgJHtpbnB1dEluZGV4fSBpcyBtaXNzaW5nIHdpdG5lc3NVdHhvYCk7XG4gICAgcmV0dXJuIGlucHV0LndpdG5lc3NVdHhvO1xuICB9KTtcblxuICBwc2J0LmRhdGEuaW5wdXRzLmZvckVhY2goKGlucHV0LCBpbnB1dEluZGV4KSA9PiB7XG4gICAgLy8gQ2hlY2sgdGhhdCB0aGUgbWV0YWRhdGEgaW4gdGhlIFBTQlQgbWF0Y2hlcyB0aGUgbWVzc2FnZUluZm8sIHRoZW4gY2hlY2sgdGhlIGlucHV0IGRhdGFcbiAgICBjb25zdCBpbmZvID0gbWVzc2FnZUluZm9baW5wdXRJbmRleF07XG5cbiAgICAvLyBDaGVjayB0aGF0IHRoZSB0b19zcGVuZCB0cmFuc2FjdGlvbiBpcyBlbmNvZGVkIGluIHRoZSBub25XaXRuZXNzVXR4b1xuICAgIGFzc2VydC5vayhpbnB1dC5ub25XaXRuZXNzVXR4bywgYFBTQlQgaW5wdXQgJHtpbnB1dEluZGV4fSBpcyBtaXNzaW5nIG5vbldpdG5lc3NVdHhvYCk7XG4gICAgY29uc3QgdG9TcGVuZFR4ID0gYnVpbGRUb1NwZW5kVHJhbnNhY3Rpb24ocHJldk91dHNbaW5wdXRJbmRleF0uc2NyaXB0LCBpbmZvLm1lc3NhZ2UpO1xuICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwoaW5wdXQubm9uV2l0bmVzc1V0eG8udG9TdHJpbmcoJ2hleCcpLCB0b1NwZW5kVHgudG9IZXgoKSk7XG5cbiAgICBpZiAoaW5wdXQuYmlwMzJEZXJpdmF0aW9uKSB7XG4gICAgICBpbnB1dC5iaXAzMkRlcml2YXRpb24uZm9yRWFjaCgoYikgPT4ge1xuICAgICAgICBjb25zdCBwdWJrZXkgPSBiLnB1YmtleS50b1N0cmluZygnaGV4Jyk7XG4gICAgICAgIGFzc2VydC5vayhcbiAgICAgICAgICBpbmZvLnB1YmtleXMuaW5jbHVkZXMocHVia2V5KSxcbiAgICAgICAgICBgUFNCVCBpbnB1dCAke2lucHV0SW5kZXh9IGhhcyBhIHB1YmtleSBpbiAodGFwKWJpcDMyRGVyaXZhdGlvbiB0aGF0IGlzIG5vdCBpbiBtZXNzYWdlSW5mb2BcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoIWlucHV0LnRhcEJpcDMyRGVyaXZhdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBQU0JUIGlucHV0ICR7aW5wdXRJbmRleH0gaXMgbWlzc2luZyAodGFwKWJpcDMyRGVyaXZhdGlvbiB3aGVuIGl0IHNob3VsZCBoYXZlIGl0LmApO1xuICAgIH1cblxuICAgIC8vIFZlcmlmeSB0aGUgc2lnbmF0dXJlIG9uIHRoZSBpbnB1dFxuICAgIGFzc2VydC5vayhwc2J0LnZhbGlkYXRlU2lnbmF0dXJlc09mSW5wdXRDb21tb24oaW5wdXRJbmRleCksIGBQU0JUIGlucHV0ICR7aW5wdXRJbmRleH0gaGFzIGFuIGludmFsaWQgc2lnbmF0dXJlLmApO1xuXG4gICAgLy8gRG8gbm90IGNoZWNrIHRoZSBzaWduYXR1cmUgd2hlbiB1c2luZyB0aGUgUFNCVCwgdGhlIHNpZ25hdHVyZSBpcyBub3QgdGhlcmUuIFdlIGFyZSBnb2luZ1xuICAgIC8vIHRvIHNpZ25hdHVyZXMgaW4gdGhlIFBTQlQuXG4gICAgYXNzZXJ0VHhJbnB1dCh1bnNpZ25lZFR4LCBpbnB1dEluZGV4LCBwcmV2T3V0cywgaW5mbywgZmFsc2UpO1xuICB9KTtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { BIP32Interface } from '@bitgo-beta/secp256k1';
|
|
2
|
+
/**
|
|
3
|
+
* bip32-aware wrapper around bitcoin-message package
|
|
4
|
+
* @see {bitcoinMessage.sign}
|
|
5
|
+
*/
|
|
6
|
+
export declare function signMessage(message: string | Buffer, privateKey: BIP32Interface | Buffer, network: {
|
|
7
|
+
messagePrefix: string;
|
|
8
|
+
}): Buffer;
|
|
9
|
+
/**
|
|
10
|
+
* bip32-aware wrapper around bitcoin-message package
|
|
11
|
+
* @see {bitcoinMessage.verify}
|
|
12
|
+
*/
|
|
13
|
+
export declare function verifyMessage(message: string | Buffer, publicKey: BIP32Interface | Buffer, signature: Buffer, network: {
|
|
14
|
+
messagePrefix: string;
|
|
15
|
+
}): boolean;
|
|
16
|
+
//# sourceMappingURL=bip32utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bip32utils.d.ts","sourceRoot":"","sources":["../../src/bip32utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAGvD;;;GAGG;AACH,wBAAgB,WAAW,CACzB,OAAO,EAAE,MAAM,GAAG,MAAM,EACxB,UAAU,EAAE,cAAc,GAAG,MAAM,EACnC,OAAO,EAAE;IAAE,aAAa,EAAE,MAAM,CAAA;CAAE,GACjC,MAAM,CAYR;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAC3B,OAAO,EAAE,MAAM,GAAG,MAAM,EACxB,SAAS,EAAE,cAAc,GAAG,MAAM,EAClC,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE;IAAE,aAAa,EAAE,MAAM,CAAA;CAAE,GACjC,OAAO,CAcT"}
|