@bitgo-beta/utxo-core 1.0.1-alpha.2 → 1.0.1-alpha.200
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 +43 -0
- 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 +125 -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 +113 -0
- package/dist/cjs/src/bip32utils.d.ts +12 -0
- package/dist/cjs/src/bip32utils.d.ts.map +1 -0
- package/dist/cjs/src/bip32utils.js +15 -0
- package/dist/cjs/src/bip65/index.d.ts +2 -0
- package/dist/cjs/src/bip65/index.d.ts.map +1 -0
- package/dist/{src/testutil → cjs/src/bip65}/index.js +2 -4
- package/dist/cjs/src/bip65/locktime.d.ts +8 -0
- 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/cjs/src/descriptor/Output.d.ts +23 -0
- 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 +3 -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 +2 -2
- package/dist/cjs/src/descriptor/address.d.ts.map +1 -0
- package/dist/{src → cjs/src}/descriptor/address.js +2 -2
- package/dist/cjs/src/descriptor/derive.d.ts +13 -0
- package/dist/cjs/src/descriptor/derive.d.ts.map +1 -0
- package/dist/cjs/src/descriptor/derive.js +45 -0
- package/dist/cjs/src/descriptor/fromFixedScriptWallet.d.ts +16 -0
- package/dist/cjs/src/descriptor/fromFixedScriptWallet.d.ts.map +1 -0
- package/dist/cjs/src/descriptor/fromFixedScriptWallet.js +88 -0
- package/dist/cjs/src/descriptor/index.d.ts +11 -0
- package/dist/cjs/src/descriptor/index.d.ts.map +1 -0
- package/dist/cjs/src/descriptor/index.js +27 -0
- 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/cjs/src/descriptor/psbt/createPsbt.d.ts +23 -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 +7 -3
- package/dist/cjs/src/descriptor/psbt/findDescriptors.d.ts.map +1 -0
- package/dist/cjs/src/descriptor/psbt/findDescriptors.js +98 -0
- package/dist/{src → cjs/src}/descriptor/psbt/index.d.ts +1 -0
- package/dist/cjs/src/descriptor/psbt/index.d.ts.map +1 -0
- package/dist/{src → cjs/src}/descriptor/psbt/index.js +2 -1
- package/dist/{src → cjs/src}/descriptor/psbt/parse.d.ts +2 -2
- package/dist/cjs/src/descriptor/psbt/parse.d.ts.map +1 -0
- package/dist/cjs/src/descriptor/psbt/parse.js +87 -0
- package/dist/cjs/src/descriptor/psbt/sign.d.ts +26 -0
- 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 +4 -0
- package/dist/cjs/src/dustThreshold.d.ts.map +1 -0
- package/dist/cjs/src/dustThreshold.js +134 -0
- package/dist/cjs/src/index.d.ts +10 -0
- package/dist/cjs/src/index.d.ts.map +1 -0
- package/dist/{src → cjs/src}/index.js +12 -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/cjs/src/paygo/parsePayGoAttestation.d.ts +16 -0
- 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/cjs/src/paygo/psbt/index.js +18 -0
- 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 +5 -2
- 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 +6 -4
- 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/cjs/src/testutil/generatePayGoAttestationProof.utils.d.ts +12 -0
- package/dist/cjs/src/testutil/generatePayGoAttestationProof.utils.d.ts.map +1 -0
- package/dist/cjs/src/testutil/generatePayGoAttestationProof.utils.js +38 -0
- package/dist/cjs/src/testutil/index.d.ts +6 -0
- package/dist/cjs/src/testutil/index.d.ts.map +1 -0
- package/dist/cjs/src/testutil/index.js +22 -0
- 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 +2 -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.d.ts.map +1 -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 +119 -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 +74 -0
- package/dist/esm/bip32utils.d.ts +12 -0
- package/dist/esm/bip32utils.d.ts.map +1 -0
- package/dist/esm/bip32utils.js +12 -0
- package/dist/esm/bip65/index.d.ts +2 -0
- package/dist/esm/bip65/index.d.ts.map +1 -0
- package/dist/esm/bip65/index.js +2 -0
- package/dist/esm/bip65/locktime.d.ts +8 -0
- package/dist/esm/bip65/locktime.d.ts.map +1 -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/esm/descriptor/Output.d.ts.map +1 -0
- package/dist/esm/descriptor/Output.js +32 -0
- package/dist/esm/descriptor/VirtualSize.d.ts +23 -0
- package/dist/esm/descriptor/VirtualSize.d.ts.map +1 -0
- package/dist/esm/descriptor/VirtualSize.js +94 -0
- package/dist/esm/descriptor/address.d.ts +5 -0
- package/dist/esm/descriptor/address.d.ts.map +1 -0
- package/dist/esm/descriptor/address.js +11 -0
- package/dist/esm/descriptor/derive.d.ts +13 -0
- package/dist/esm/descriptor/derive.d.ts.map +1 -0
- package/dist/esm/descriptor/derive.js +38 -0
- package/dist/esm/descriptor/fromFixedScriptWallet.d.ts +16 -0
- package/dist/esm/descriptor/fromFixedScriptWallet.d.ts.map +1 -0
- package/dist/esm/descriptor/fromFixedScriptWallet.js +51 -0
- package/dist/esm/descriptor/index.d.ts +11 -0
- package/dist/esm/descriptor/index.d.ts.map +1 -0
- 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/esm/descriptor/psbt/findDescriptors.d.ts.map +1 -0
- package/dist/esm/descriptor/psbt/findDescriptors.js +94 -0
- package/dist/esm/descriptor/psbt/index.d.ts +7 -0
- package/dist/{src → esm}/descriptor/psbt/index.d.ts.map +1 -1
- package/dist/esm/descriptor/psbt/index.js +7 -0
- package/dist/esm/descriptor/psbt/parse.d.ts +27 -0
- package/dist/esm/descriptor/psbt/parse.d.ts.map +1 -0
- 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.d.ts.map +1 -0
- package/dist/esm/dustThreshold.js +97 -0
- package/dist/esm/index.d.ts +10 -0
- package/dist/esm/index.d.ts.map +1 -0
- 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.d.ts.map +1 -0
- package/dist/esm/xOnlyPubkey.js +15 -0
- package/package.json +51 -22
- package/dist/src/descriptor/DescriptorMap.js +0 -12
- package/dist/src/descriptor/Output.d.ts +0 -24
- package/dist/src/descriptor/Output.d.ts.map +0 -1
- package/dist/src/descriptor/Output.js +0 -22
- package/dist/src/descriptor/VirtualSize.d.ts.map +0 -1
- package/dist/src/descriptor/VirtualSize.js +0 -87
- package/dist/src/descriptor/address.d.ts.map +0 -1
- package/dist/src/descriptor/index.d.ts +0 -9
- package/dist/src/descriptor/index.d.ts.map +0 -1
- package/dist/src/descriptor/index.js +0 -49
- package/dist/src/descriptor/psbt/assertSatisfiable.js +0 -74
- package/dist/src/descriptor/psbt/createPsbt.d.ts +0 -15
- 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.d.ts.map +0 -1
- package/dist/src/descriptor/psbt/findDescriptors.js +0 -85
- package/dist/src/descriptor/psbt/parse.d.ts.map +0 -1
- package/dist/src/descriptor/psbt/parse.js +0 -87
- package/dist/src/descriptor/psbt/wrap.js +0 -76
- package/dist/src/index.d.ts +0 -3
- package/dist/src/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 -105
- package/dist/src/testutil/descriptor/mock.utils.d.ts.map +0 -1
- package/dist/src/testutil/descriptor/mock.utils.js +0 -87
- package/dist/src/testutil/descriptor/psbt.utils.js +0 -20
- package/dist/src/testutil/index.d.ts +0 -4
- package/dist/src/testutil/key.utils.js +0 -59
- package/dist/src/testutil/toPlainObject.utils.js +0 -75
- /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 → esm}/testutil/descriptor/index.d.ts.map +0 -0
- /package/dist/{src → esm}/testutil/fixtures.utils.d.ts.map +0 -0
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const assert_1 = __importDefault(require("assert"));
|
|
7
|
+
const utxo_lib_1 = require("@bitgo-beta/utxo-lib");
|
|
8
|
+
const bip322_1 = require("../../src/bip322");
|
|
9
|
+
const bip322_utils_1 = require("./bip322.utils");
|
|
10
|
+
describe('to_spend', function () {
|
|
11
|
+
describe('Message hashing', function () {
|
|
12
|
+
// Test vectors from BIP322
|
|
13
|
+
// Source: https://github.com/bitcoin/bips/blob/master/bip-0322.mediawiki#message-hashing
|
|
14
|
+
const fixtures = [
|
|
15
|
+
{
|
|
16
|
+
message: '',
|
|
17
|
+
hash: 'c90c269c4f8fcbe6880f72a721ddfbf1914268a794cbb21cfafee13770ae19f1',
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
message: 'Hello World',
|
|
21
|
+
hash: 'f0eb03b1a75ac6d9847f55c624a99169b5dccba2a31f5b23bea77ba270de0a7a',
|
|
22
|
+
},
|
|
23
|
+
];
|
|
24
|
+
fixtures.forEach(({ message, hash }) => {
|
|
25
|
+
it(`should hash the message "${message}"`, function () {
|
|
26
|
+
const result = (0, bip322_1.hashMessageWithTag)(Buffer.from(message));
|
|
27
|
+
assert_1.default.deepStrictEqual(result.toString('hex'), hash, `Hash for message "${message}" does not match expected value`);
|
|
28
|
+
});
|
|
29
|
+
});
|
|
30
|
+
});
|
|
31
|
+
describe('build to_spend transaction', function () {
|
|
32
|
+
const scriptPubKey = bip322_utils_1.BIP322_PAYMENT_P2WPKH_FIXTURE.output;
|
|
33
|
+
// Source: https://github.com/bitcoin/bips/blob/master/bip-0322.mediawiki#transaction-hashes
|
|
34
|
+
const fixtures = [
|
|
35
|
+
{
|
|
36
|
+
message: '',
|
|
37
|
+
txid: 'c5680aa69bb8d860bf82d4e9cd3504b55dde018de765a91bb566283c545a99a7',
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
message: 'Hello World',
|
|
41
|
+
txid: 'b79d196740ad5217771c1098fc4a4b51e0535c32236c71f1ea4d61a2d603352b',
|
|
42
|
+
},
|
|
43
|
+
];
|
|
44
|
+
fixtures.forEach(({ message, txid }) => {
|
|
45
|
+
it(`should build a to_spend transaction for message "${message}"`, function () {
|
|
46
|
+
const result = (0, bip322_1.buildToSpendTransaction)(scriptPubKey, Buffer.from(message));
|
|
47
|
+
const computedTxid = result.getId();
|
|
48
|
+
assert_1.default.strictEqual(computedTxid, txid, `Transaction ID for message "${message}" does not match expected value`);
|
|
49
|
+
});
|
|
50
|
+
});
|
|
51
|
+
});
|
|
52
|
+
describe('buildToSpendTransactionFromChainAndIndex', function () {
|
|
53
|
+
describe('should build a to_spend transaction for a non-Taproot chain', function () {
|
|
54
|
+
function run(chain) {
|
|
55
|
+
it(`scriptType: ${utxo_lib_1.bitgo.scriptTypeForChain(chain)}, chain ${chain}`, function () {
|
|
56
|
+
const tx = (0, bip322_1.buildToSpendTransactionFromChainAndIndex)(utxo_lib_1.testutil.getDefaultWalletKeys(), 20, 0, Buffer.from('Hello World'));
|
|
57
|
+
const expectedScriptPubKey = utxo_lib_1.bitgo.outputScripts
|
|
58
|
+
.createOutputScript2of3(utxo_lib_1.testutil.getDefaultWalletKeys().deriveForChainAndIndex(20, 0).publicKeys, 'p2wsh')
|
|
59
|
+
.scriptPubKey.toString();
|
|
60
|
+
const scriptPubKeyFromTx = tx.outs[0].script.toString();
|
|
61
|
+
assert_1.default.deepStrictEqual(scriptPubKeyFromTx, expectedScriptPubKey, 'ScriptPubKey does not match expected value');
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
[0, 1, 10, 11, 20, 21].forEach((chain) => {
|
|
65
|
+
run(chain);
|
|
66
|
+
});
|
|
67
|
+
});
|
|
68
|
+
});
|
|
69
|
+
});
|
|
70
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9TcGVuZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Rlc3QvYmlwMzIyL3RvU3BlbmQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxvREFBNEI7QUFFNUIsbURBQXVEO0FBRXZELDZDQUkwQjtBQUUxQixpREFBK0Q7QUFFL0QsUUFBUSxDQUFDLFVBQVUsRUFBRTtJQUNuQixRQUFRLENBQUMsaUJBQWlCLEVBQUU7UUFDMUIsMkJBQTJCO1FBQzNCLHlGQUF5RjtRQUN6RixNQUFNLFFBQVEsR0FBRztZQUNmO2dCQUNFLE9BQU8sRUFBRSxFQUFFO2dCQUNYLElBQUksRUFBRSxrRUFBa0U7YUFDekU7WUFDRDtnQkFDRSxPQUFPLEVBQUUsYUFBYTtnQkFDdEIsSUFBSSxFQUFFLGtFQUFrRTthQUN6RTtTQUNGLENBQUM7UUFDRixRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRTtZQUNyQyxFQUFFLENBQUMsNEJBQTRCLE9BQU8sR0FBRyxFQUFFO2dCQUN6QyxNQUFNLE1BQU0sR0FBRyxJQUFBLDJCQUFrQixFQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztnQkFDeEQsZ0JBQU0sQ0FBQyxlQUFlLENBQ3BCLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQ3RCLElBQUksRUFDSixxQkFBcUIsT0FBTyxpQ0FBaUMsQ0FDOUQsQ0FBQztZQUNKLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILFFBQVEsQ0FBQyw0QkFBNEIsRUFBRTtRQUNyQyxNQUFNLFlBQVksR0FBRyw0Q0FBNkIsQ0FBQyxNQUFnQixDQUFDO1FBRXBFLDRGQUE0RjtRQUM1RixNQUFNLFFBQVEsR0FBRztZQUNmO2dCQUNFLE9BQU8sRUFBRSxFQUFFO2dCQUNYLElBQUksRUFBRSxrRUFBa0U7YUFDekU7WUFDRDtnQkFDRSxPQUFPLEVBQUUsYUFBYTtnQkFDdEIsSUFBSSxFQUFFLGtFQUFrRTthQUN6RTtTQUNGLENBQUM7UUFFRixRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRTtZQUNyQyxFQUFFLENBQUMsb0RBQW9ELE9BQU8sR0FBRyxFQUFFO2dCQUNqRSxNQUFNLE1BQU0sR0FBRyxJQUFBLGdDQUF1QixFQUFDLFlBQVksRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7Z0JBQzNFLE1BQU0sWUFBWSxHQUFHLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQztnQkFDcEMsZ0JBQU0sQ0FBQyxXQUFXLENBQUMsWUFBWSxFQUFFLElBQUksRUFBRSwrQkFBK0IsT0FBTyxpQ0FBaUMsQ0FBQyxDQUFDO1lBQ2xILENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILFFBQVEsQ0FBQywwQ0FBMEMsRUFBRTtRQUNuRCxRQUFRLENBQUMsNkRBQTZELEVBQUU7WUFDdEUsU0FBUyxHQUFHLENBQUMsS0FBc0I7Z0JBQ2pDLEVBQUUsQ0FBQyxlQUFlLGdCQUFLLENBQUMsa0JBQWtCLENBQUMsS0FBSyxDQUFDLFdBQVcsS0FBSyxFQUFFLEVBQUU7b0JBQ25FLE1BQU0sRUFBRSxHQUFHLElBQUEsaURBQXdDLEVBQ2pELG1CQUFRLENBQUMsb0JBQW9CLEVBQUUsRUFDL0IsRUFBRSxFQUNGLENBQUMsRUFDRCxNQUFNLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUMzQixDQUFDO29CQUNGLE1BQU0sb0JBQW9CLEdBQUcsZ0JBQUssQ0FBQyxhQUFhO3lCQUM3QyxzQkFBc0IsQ0FBQyxtQkFBUSxDQUFDLG9CQUFvQixFQUFFLENBQUMsc0JBQXNCLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFVBQVUsRUFBRSxPQUFPLENBQUM7eUJBQ3pHLFlBQVksQ0FBQyxRQUFRLEVBQUUsQ0FBQztvQkFDM0IsTUFBTSxrQkFBa0IsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQztvQkFDeEQsZ0JBQU0sQ0FBQyxlQUFlLENBQ3BCLGtCQUFrQixFQUNsQixvQkFBb0IsRUFDcEIsNENBQTRDLENBQzdDLENBQUM7Z0JBQ0osQ0FBQyxDQUFDLENBQUM7WUFDTCxDQUFDO1lBRUEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBdUIsQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtnQkFDOUQsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ2IsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5cbmltcG9ydCB7IHRlc3R1dGlsLCBiaXRnbyB9IGZyb20gJ0BiaXRnby1iZXRhL3V0eG8tbGliJztcblxuaW1wb3J0IHtcbiAgYnVpbGRUb1NwZW5kVHJhbnNhY3Rpb24sXG4gIGhhc2hNZXNzYWdlV2l0aFRhZyxcbiAgYnVpbGRUb1NwZW5kVHJhbnNhY3Rpb25Gcm9tQ2hhaW5BbmRJbmRleCxcbn0gZnJvbSAnLi4vLi4vc3JjL2JpcDMyMic7XG5cbmltcG9ydCB7IEJJUDMyMl9QQVlNRU5UX1AyV1BLSF9GSVhUVVJFIH0gZnJvbSAnLi9iaXAzMjIudXRpbHMnO1xuXG5kZXNjcmliZSgndG9fc3BlbmQnLCBmdW5jdGlvbiAoKSB7XG4gIGRlc2NyaWJlKCdNZXNzYWdlIGhhc2hpbmcnLCBmdW5jdGlvbiAoKSB7XG4gICAgLy8gVGVzdCB2ZWN0b3JzIGZyb20gQklQMzIyXG4gICAgLy8gU291cmNlOiBodHRwczovL2dpdGh1Yi5jb20vYml0Y29pbi9iaXBzL2Jsb2IvbWFzdGVyL2JpcC0wMzIyLm1lZGlhd2lraSNtZXNzYWdlLWhhc2hpbmdcbiAgICBjb25zdCBmaXh0dXJlcyA9IFtcbiAgICAgIHtcbiAgICAgICAgbWVzc2FnZTogJycsXG4gICAgICAgIGhhc2g6ICdjOTBjMjY5YzRmOGZjYmU2ODgwZjcyYTcyMWRkZmJmMTkxNDI2OGE3OTRjYmIyMWNmYWZlZTEzNzcwYWUxOWYxJyxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIG1lc3NhZ2U6ICdIZWxsbyBXb3JsZCcsXG4gICAgICAgIGhhc2g6ICdmMGViMDNiMWE3NWFjNmQ5ODQ3ZjU1YzYyNGE5OTE2OWI1ZGNjYmEyYTMxZjViMjNiZWE3N2JhMjcwZGUwYTdhJyxcbiAgICAgIH0sXG4gICAgXTtcbiAgICBmaXh0dXJlcy5mb3JFYWNoKCh7IG1lc3NhZ2UsIGhhc2ggfSkgPT4ge1xuICAgICAgaXQoYHNob3VsZCBoYXNoIHRoZSBtZXNzYWdlIFwiJHttZXNzYWdlfVwiYCwgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBoYXNoTWVzc2FnZVdpdGhUYWcoQnVmZmVyLmZyb20obWVzc2FnZSkpO1xuICAgICAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKFxuICAgICAgICAgIHJlc3VsdC50b1N0cmluZygnaGV4JyksXG4gICAgICAgICAgaGFzaCxcbiAgICAgICAgICBgSGFzaCBmb3IgbWVzc2FnZSBcIiR7bWVzc2FnZX1cIiBkb2VzIG5vdCBtYXRjaCBleHBlY3RlZCB2YWx1ZWBcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnYnVpbGQgdG9fc3BlbmQgdHJhbnNhY3Rpb24nLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3Qgc2NyaXB0UHViS2V5ID0gQklQMzIyX1BBWU1FTlRfUDJXUEtIX0ZJWFRVUkUub3V0cHV0IGFzIEJ1ZmZlcjtcblxuICAgIC8vIFNvdXJjZTogaHR0cHM6Ly9naXRodWIuY29tL2JpdGNvaW4vYmlwcy9ibG9iL21hc3Rlci9iaXAtMDMyMi5tZWRpYXdpa2kjdHJhbnNhY3Rpb24taGFzaGVzXG4gICAgY29uc3QgZml4dHVyZXMgPSBbXG4gICAgICB7XG4gICAgICAgIG1lc3NhZ2U6ICcnLFxuICAgICAgICB0eGlkOiAnYzU2ODBhYTY5YmI4ZDg2MGJmODJkNGU5Y2QzNTA0YjU1ZGRlMDE4ZGU3NjVhOTFiYjU2NjI4M2M1NDVhOTlhNycsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBtZXNzYWdlOiAnSGVsbG8gV29ybGQnLFxuICAgICAgICB0eGlkOiAnYjc5ZDE5Njc0MGFkNTIxNzc3MWMxMDk4ZmM0YTRiNTFlMDUzNWMzMjIzNmM3MWYxZWE0ZDYxYTJkNjAzMzUyYicsXG4gICAgICB9LFxuICAgIF07XG5cbiAgICBmaXh0dXJlcy5mb3JFYWNoKCh7IG1lc3NhZ2UsIHR4aWQgfSkgPT4ge1xuICAgICAgaXQoYHNob3VsZCBidWlsZCBhIHRvX3NwZW5kIHRyYW5zYWN0aW9uIGZvciBtZXNzYWdlIFwiJHttZXNzYWdlfVwiYCwgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBidWlsZFRvU3BlbmRUcmFuc2FjdGlvbihzY3JpcHRQdWJLZXksIEJ1ZmZlci5mcm9tKG1lc3NhZ2UpKTtcbiAgICAgICAgY29uc3QgY29tcHV0ZWRUeGlkID0gcmVzdWx0LmdldElkKCk7XG4gICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChjb21wdXRlZFR4aWQsIHR4aWQsIGBUcmFuc2FjdGlvbiBJRCBmb3IgbWVzc2FnZSBcIiR7bWVzc2FnZX1cIiBkb2VzIG5vdCBtYXRjaCBleHBlY3RlZCB2YWx1ZWApO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdidWlsZFRvU3BlbmRUcmFuc2FjdGlvbkZyb21DaGFpbkFuZEluZGV4JywgZnVuY3Rpb24gKCkge1xuICAgIGRlc2NyaWJlKCdzaG91bGQgYnVpbGQgYSB0b19zcGVuZCB0cmFuc2FjdGlvbiBmb3IgYSBub24tVGFwcm9vdCBjaGFpbicsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGZ1bmN0aW9uIHJ1bihjaGFpbjogYml0Z28uQ2hhaW5Db2RlKSB7XG4gICAgICAgIGl0KGBzY3JpcHRUeXBlOiAke2JpdGdvLnNjcmlwdFR5cGVGb3JDaGFpbihjaGFpbil9LCBjaGFpbiAke2NoYWlufWAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBjb25zdCB0eCA9IGJ1aWxkVG9TcGVuZFRyYW5zYWN0aW9uRnJvbUNoYWluQW5kSW5kZXgoXG4gICAgICAgICAgICB0ZXN0dXRpbC5nZXREZWZhdWx0V2FsbGV0S2V5cygpLFxuICAgICAgICAgICAgMjAsXG4gICAgICAgICAgICAwLFxuICAgICAgICAgICAgQnVmZmVyLmZyb20oJ0hlbGxvIFdvcmxkJylcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnN0IGV4cGVjdGVkU2NyaXB0UHViS2V5ID0gYml0Z28ub3V0cHV0U2NyaXB0c1xuICAgICAgICAgICAgLmNyZWF0ZU91dHB1dFNjcmlwdDJvZjModGVzdHV0aWwuZ2V0RGVmYXVsdFdhbGxldEtleXMoKS5kZXJpdmVGb3JDaGFpbkFuZEluZGV4KDIwLCAwKS5wdWJsaWNLZXlzLCAncDJ3c2gnKVxuICAgICAgICAgICAgLnNjcmlwdFB1YktleS50b1N0cmluZygpO1xuICAgICAgICAgIGNvbnN0IHNjcmlwdFB1YktleUZyb21UeCA9IHR4Lm91dHNbMF0uc2NyaXB0LnRvU3RyaW5nKCk7XG4gICAgICAgICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChcbiAgICAgICAgICAgIHNjcmlwdFB1YktleUZyb21UeCxcbiAgICAgICAgICAgIGV4cGVjdGVkU2NyaXB0UHViS2V5LFxuICAgICAgICAgICAgJ1NjcmlwdFB1YktleSBkb2VzIG5vdCBtYXRjaCBleHBlY3RlZCB2YWx1ZSdcbiAgICAgICAgICApO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgKFswLCAxLCAxMCwgMTEsIDIwLCAyMV0gYXMgYml0Z28uQ2hhaW5Db2RlW10pLmZvckVhY2goKGNoYWluKSA9PiB7XG4gICAgICAgIHJ1bihjaGFpbik7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../../test/bip322/utils.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
const assert_1 = __importDefault(require("assert"));
|
|
40
|
+
const utxolib = __importStar(require("@bitgo-beta/utxo-lib"));
|
|
41
|
+
const bip322_1 = require("../../src/bip322");
|
|
42
|
+
const bip322_utils_1 = require("./bip322.utils");
|
|
43
|
+
describe('BIP322 Proof utils', function () {
|
|
44
|
+
it('should add a BIP322 proof message to a PSBT input', function () {
|
|
45
|
+
const psbt = utxolib.bitgo.createPsbtFromBuffer(bip322_utils_1.BIP322_FIXTURE_HELLO_WORLD_TOSIGN_PSBT.toBuffer(), utxolib.networks.bitcoin);
|
|
46
|
+
const proprietaryKeyVals = utxolib.bitgo.getPsbtInputProprietaryKeyVals(psbt.data.inputs[0], {
|
|
47
|
+
identifier: utxolib.bitgo.PSBT_PROPRIETARY_IDENTIFIER,
|
|
48
|
+
subtype: utxolib.bitgo.ProprietaryKeySubtype.BIP322_MESSAGE,
|
|
49
|
+
});
|
|
50
|
+
assert_1.default.ok(proprietaryKeyVals.length === 1);
|
|
51
|
+
assert_1.default.ok(proprietaryKeyVals[0].value.equals(Buffer.from('Hello World')));
|
|
52
|
+
assert_1.default.ok(proprietaryKeyVals[0].key.keydata.length === 0); // keydata should be empty
|
|
53
|
+
assert_1.default.ok(proprietaryKeyVals[0].key.identifier === utxolib.bitgo.PSBT_PROPRIETARY_IDENTIFIER);
|
|
54
|
+
assert_1.default.ok(proprietaryKeyVals[0].key.subtype === utxolib.bitgo.ProprietaryKeySubtype.BIP322_MESSAGE);
|
|
55
|
+
});
|
|
56
|
+
it('should return the input index of a BIP322 proof message', function () {
|
|
57
|
+
const psbt = utxolib.bitgo.createPsbtFromBuffer(bip322_utils_1.BIP322_FIXTURE_HELLO_WORLD_TOSIGN_PSBT.toBuffer(), utxolib.networks.bitcoin);
|
|
58
|
+
const messageBuffer = (0, bip322_1.getBip322ProofMessageAtIndex)(psbt, 0);
|
|
59
|
+
assert_1.default.ok(messageBuffer, 'Message buffer should not be undefined');
|
|
60
|
+
assert_1.default.deepStrictEqual(messageBuffer.toString('utf-8'), 'Hello World', 'Message does not match expected value');
|
|
61
|
+
});
|
|
62
|
+
describe('isBip322ProofCheck', function () {
|
|
63
|
+
it('should work for PSBTs', function () {
|
|
64
|
+
const psbt = utxolib.bitgo.createPsbtFromBuffer(bip322_utils_1.BIP322_FIXTURE_HELLO_WORLD_TOSIGN_PSBT.toBuffer(), utxolib.networks.bitcoin);
|
|
65
|
+
assert_1.default.ok((0, bip322_1.isBip322ProofCheck)(psbt), 'Expected PSBT to be a valid BIP322 proof');
|
|
66
|
+
assert_1.default.deepEqual((0, bip322_1.isBip322ProofCheck)(utxolib.testutil.constructPsbt([{ scriptType: 'taprootKeyPathSpend', value: BigInt(1000) }], [{ scriptType: 'p2sh', value: BigInt(900) }], utxolib.networks.bitcoin, utxolib.testutil.getDefaultWalletKeys(), 'unsigned')), false);
|
|
67
|
+
});
|
|
68
|
+
it('should work for Transactions', function () {
|
|
69
|
+
const psbt = utxolib.bitgo.createPsbtFromBuffer(bip322_utils_1.BIP322_FIXTURE_HELLO_WORLD_TOSIGN_PSBT.toBuffer(), utxolib.networks.bitcoin);
|
|
70
|
+
// Cannot extract the transaction because it has no signatures
|
|
71
|
+
const tx = psbt.getUnsignedTx();
|
|
72
|
+
assert_1.default.ok((0, bip322_1.isBip322ProofCheck)(tx), 'Expected Transaction to be a valid BIP322 proof');
|
|
73
|
+
assert_1.default.deepEqual((0, bip322_1.isBip322ProofCheck)(utxolib.testutil
|
|
74
|
+
.constructPsbt([{ scriptType: 'taprootKeyPathSpend', value: BigInt(1000) }], [{ scriptType: 'p2sh', value: BigInt(900) }], utxolib.networks.bitcoin, utxolib.testutil.getDefaultWalletKeys(), 'unsigned')
|
|
75
|
+
.getUnsignedTx()), false);
|
|
76
|
+
});
|
|
77
|
+
});
|
|
78
|
+
});
|
|
79
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90ZXN0L2JpcDMyMi91dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLG9EQUE0QjtBQUU1Qiw4REFBZ0Q7QUFFaEQsNkNBQW9GO0FBRXBGLGlEQUF3RTtBQUV4RSxRQUFRLENBQUMsb0JBQW9CLEVBQUU7SUFDN0IsRUFBRSxDQUFDLG1EQUFtRCxFQUFFO1FBQ3RELE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsb0JBQW9CLENBQzdDLHFEQUFzQyxDQUFDLFFBQVEsRUFBRSxFQUNqRCxPQUFPLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FDekIsQ0FBQztRQUVGLE1BQU0sa0JBQWtCLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyw4QkFBOEIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRTtZQUMzRixVQUFVLEVBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQywyQkFBMkI7WUFDckQsT0FBTyxFQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMscUJBQXFCLENBQUMsY0FBYztTQUM1RCxDQUFDLENBQUM7UUFFSCxnQkFBTSxDQUFDLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDM0MsZ0JBQU0sQ0FBQyxFQUFFLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMxRSxnQkFBTSxDQUFDLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLDBCQUEwQjtRQUNyRixnQkFBTSxDQUFD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QUNBLGFBQWEsRUFBRSxDQUNuQixFQUNELEtBQUssQ0FDTixDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuXG5pbXBvcnQgKiBhcyB1dHhvbGliIGZyb20gJ0BiaXRnby1iZXRhL3V0eG8tbGliJztcblxuaW1wb3J0IHsgZ2V0QmlwMzIyUHJvb2ZNZXNzYWdlQXRJbmRleCwgaXNCaXAzMjJQcm9vZkNoZWNrIH0gZnJvbSAnLi4vLi4vc3JjL2JpcDMyMic7XG5cbmltcG9ydCB7IEJJUDMyMl9GSVhUVVJFX0hFTExPX1dPUkxEX1RPU0lHTl9QU0JUIH0gZnJvbSAnLi9iaXAzMjIudXRpbHMnO1xuXG5kZXNjcmliZSgnQklQMzIyIFByb29mIHV0aWxzJywgZnVuY3Rpb24gKCkge1xuICBpdCgnc2hvdWxkIGFkZCBhIEJJUDMyMiBwcm9vZiBtZXNzYWdlIHRvIGEgUFNCVCBpbnB1dCcsIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBwc2J0ID0gdXR4b2xpYi5iaXRnby5jcmVhdGVQc2J0RnJvbUJ1ZmZlcihcbiAgICAgIEJJUDMyMl9GSVhUVVJFX0hFTExPX1dPUkxEX1RPU0lHTl9QU0JULnRvQnVmZmVyKCksXG4gICAgICB1dHhvbGliLm5ldHdvcmtzLmJpdGNvaW5cbiAgICApO1xuXG4gICAgY29uc3QgcHJvcHJpZXRhcnlLZXlWYWxzID0gdXR4b2xpYi5iaXRnby5nZXRQc2J0SW5wdXRQcm9wcmlldGFyeUtleVZhbHMocHNidC5kYXRhLmlucHV0c1swXSwge1xuICAgICAgaWRlbnRpZmllcjogdXR4b2xpYi5iaXRnby5QU0JUX1BST1BSSUVUQVJZX0lERU5USUZJRVIsXG4gICAgICBzdWJ0eXBlOiB1dHhvbGliLmJpdGdvLlByb3ByaWV0YXJ5S2V5U3VidHlwZS5CSVAzMjJfTUVTU0FHRSxcbiAgICB9KTtcblxuICAgIGFzc2VydC5vayhwcm9wcmlldGFyeUtleVZhbHMubGVuZ3RoID09PSAxKTtcbiAgICBhc3NlcnQub2socHJvcHJpZXRhcnlLZXlWYWxzWzBdLnZhbHVlLmVxdWFscyhCdWZmZXIuZnJvbSgnSGVsbG8gV29ybGQnKSkpO1xuICAgIGFzc2VydC5vayhwcm9wcmlldGFyeUtleVZhbHNbMF0ua2V5LmtleWRhdGEubGVuZ3RoID09PSAwKTsgLy8ga2V5ZGF0YSBzaG91bGQgYmUgZW1wdHlcbiAgICBhc3NlcnQub2socHJvcHJpZXRhcnlLZXlWYWxzWzBdLmtleS5pZGVudGlmaWVyID09PSB1dHhvbGliLmJpdGdvLlBTQlRfUFJPUFJJRVRBUllfSURFTlRJRklFUik7XG4gICAgYXNzZXJ0Lm9rKHByb3ByaWV0YXJ5S2V5VmFsc1swXS5rZXkuc3VidHlwZSA9PT0gdXR4b2xpYi5iaXRnby5Qcm9wcmlldGFyeUtleVN1YnR5cGUuQklQMzIyX01FU1NBR0UpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIHJldHVybiB0aGUgaW5wdXQgaW5kZXggb2YgYSBCSVAzMjIgcHJvb2YgbWVzc2FnZScsIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBwc2J0ID0gdXR4b2xpYi5iaXRnby5jcmVhdGVQc2J0RnJvbUJ1ZmZlcihcbiAgICAgIEJJUDMyMl9GSVhUVVJFX0hFTExPX1dPUkxEX1RPU0lHTl9QU0JULnRvQnVmZmVyKCksXG4gICAgICB1dHhvbGliLm5ldHdvcmtzLmJpdGNvaW5cbiAgICApO1xuXG4gICAgY29uc3QgbWVzc2FnZUJ1ZmZlciA9IGdldEJpcDMyMlByb29mTWVzc2FnZUF0SW5kZXgocHNidCwgMCk7XG4gICAgYXNzZXJ0Lm9rKG1lc3NhZ2VCdWZmZXIsICdNZXNzYWdlIGJ1ZmZlciBzaG91bGQgbm90IGJlIHVuZGVmaW5lZCcpO1xuICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwobWVzc2FnZUJ1ZmZlci50b1N0cmluZygndXRmLTgnKSwgJ0hlbGxvIFdvcmxkJywgJ01lc3NhZ2UgZG9lcyBub3QgbWF0Y2ggZXhwZWN0ZWQgdmFsdWUnKTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2lzQmlwMzIyUHJvb2ZDaGVjaycsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIHdvcmsgZm9yIFBTQlRzJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgcHNidCA9IHV0eG9saWIuYml0Z28uY3JlYXRlUHNidEZyb21CdWZmZXIoXG4gICAgICAgIEJJUDMyMl9GSVhUVVJFX0hFTExPX1dPUkxEX1RPU0lHTl9QU0JULnRvQnVmZmVyKCksXG4gICAgICAgIHV0eG9saWIubmV0d29ya3MuYml0Y29pblxuICAgICAgKTtcbiAgICAgIGFzc2VydC5vayhpc0JpcDMyMlByb29mQ2hlY2socHNidCksICdFeHBlY3RlZCBQU0JUIHRvIGJlIGEgdmFsaWQgQklQMzIyIHByb29mJyk7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKFxuICAgICAgICBpc0JpcDMyMlByb29mQ2hlY2soXG4gICAgICAgICAgdXR4b2xpYi50ZXN0dXRpbC5jb25zdHJ1Y3RQc2J0KFxuICAgICAgICAgICAgW3sgc2NyaXB0VHlwZTogJ3RhcHJvb3RLZXlQYXRoU3BlbmQnLCB2YWx1ZTogQmlnSW50KDEwMDApIH1dLFxuICAgICAgICAgICAgW3sgc2NyaXB0VHlwZTogJ3Ayc2gnLCB2YWx1ZTogQmlnSW50KDkwMCkgfV0sXG4gICAgICAgICAgICB1dHhvbGliLm5ldHdvcmtzLmJpdGNvaW4sXG4gICAgICAgICAgICB1dHhvbGliLnRlc3R1dGlsLmdldERlZmF1bHRXYWxsZXRLZXlzKCksXG4gICAgICAgICAgICAndW5zaWduZWQnXG4gICAgICAgICAgKVxuICAgICAgICApLFxuICAgICAgICBmYWxzZVxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgd29yayBmb3IgVHJhbnNhY3Rpb25zJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgcHNidCA9IHV0eG9saWIuYml0Z28uY3JlYXRlUHNidEZyb21CdWZmZXIoXG4gICAgICAgIEJJUDMyMl9GSVhUVVJFX0hFTExPX1dPUkxEX1RPU0lHTl9QU0JULnRvQnVmZmVyKCksXG4gICAgICAgIHV0eG9saWIubmV0d29ya3MuYml0Y29pblxuICAgICAgKTtcbiAgICAgIC8vIENhbm5vdCBleHRyYWN0IHRoZSB0cmFuc2FjdGlvbiBiZWNhdXNlIGl0IGhhcyBubyBzaWduYXR1cmVzXG4gICAgICBjb25zdCB0eCA9IHBzYnQuZ2V0VW5zaWduZWRUeCgpO1xuICAgICAgYXNzZXJ0Lm9rKGlzQmlwMzIyUHJvb2ZDaGVjayh0eCksICdFeHBlY3RlZCBUcmFuc2FjdGlvbiB0byBiZSBhIHZhbGlkIEJJUDMyMiBwcm9vZicpO1xuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChcbiAgICAgICAgaXNCaXAzMjJQcm9vZkNoZWNrKFxuICAgICAgICAgIHV0eG9saWIudGVzdHV0aWxcbiAgICAgICAgICAgIC5jb25zdHJ1Y3RQc2J0KFxuICAgICAgICAgICAgICBbeyBzY3JpcHRUeXBlOiAndGFwcm9vdEtleVBhdGhTcGVuZCcsIHZhbHVlOiBCaWdJbnQoMTAwMCkgfV0sXG4gICAgICAgICAgICAgIFt7IHNjcmlwdFR5cGU6ICdwMnNoJywgdmFsdWU6IEJpZ0ludCg5MDApIH1dLFxuICAgICAgICAgICAgICB1dHhvbGliLm5ldHdvcmtzLmJpdGNvaW4sXG4gICAgICAgICAgICAgIHV0eG9saWIudGVzdHV0aWwuZ2V0RGVmYXVsdFdhbGxldEtleXMoKSxcbiAgICAgICAgICAgICAgJ3Vuc2lnbmVkJ1xuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLmdldFVuc2lnbmVkVHgoKVxuICAgICAgICApLFxuICAgICAgICBmYWxzZVxuICAgICAgKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verify.d.ts","sourceRoot":"","sources":["../../../../test/bip322/verify.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,293 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
const assert = __importStar(require("assert"));
|
|
37
|
+
const utxolib = __importStar(require("@bitgo-beta/utxo-lib"));
|
|
38
|
+
const bip322 = __importStar(require("../../src/bip322"));
|
|
39
|
+
const testutils = __importStar(require("./bip322.utils"));
|
|
40
|
+
const opReturnOutput = { value: 0n, script: Buffer.from('6a', 'hex') };
|
|
41
|
+
describe('Verify BIP322 proofs', function () {
|
|
42
|
+
describe('assertBaseTx', function () {
|
|
43
|
+
it('should pass for a valid bip322 transaction', function () {
|
|
44
|
+
assert.doesNotThrow(() => bip322.assertBaseTx(testutils.BIP322_FIXTURE_HELLO_WORLD_TOSIGN_PSBT.getUnsignedTx()));
|
|
45
|
+
});
|
|
46
|
+
it('should reject if the outputs are not conformed correctly', function () {
|
|
47
|
+
let psbt = utxolib.bitgo.createPsbtForNetwork({
|
|
48
|
+
network: utxolib.networks.bitcoin,
|
|
49
|
+
});
|
|
50
|
+
psbt.addOutput(opReturnOutput);
|
|
51
|
+
psbt.addOutput({ value: 1n, script: Buffer.from('6a', 'hex') });
|
|
52
|
+
psbt.setVersion(0);
|
|
53
|
+
psbt.setLocktime(0);
|
|
54
|
+
assert.throws(() => bip322.assertBaseTx(psbt.getUnsignedTx()), /Transaction must have exactly 1 output./);
|
|
55
|
+
psbt = utxolib.bitgo.createPsbtForNetwork({
|
|
56
|
+
network: utxolib.networks.bitcoin,
|
|
57
|
+
});
|
|
58
|
+
psbt.setVersion(0);
|
|
59
|
+
psbt.setLocktime(0);
|
|
60
|
+
psbt.addOutput({ value: 1n, script: Buffer.from('6a', 'hex') });
|
|
61
|
+
assert.throws(() => bip322.assertBaseTx(psbt.getUnsignedTx()), /Transaction output value must be 0./);
|
|
62
|
+
psbt = utxolib.bitgo.createPsbtForNetwork({
|
|
63
|
+
network: utxolib.networks.bitcoin,
|
|
64
|
+
});
|
|
65
|
+
psbt.setVersion(0);
|
|
66
|
+
psbt.setLocktime(0);
|
|
67
|
+
psbt.addOutput({
|
|
68
|
+
value: 0n,
|
|
69
|
+
script: utxolib.bitgo.outputScripts.createOutputScript2of3(utxolib.testutil.getDefaultWalletKeys().deriveForChainAndIndex(0, 0).publicKeys, 'p2wsh', utxolib.networks.bitcoin).scriptPubKey,
|
|
70
|
+
});
|
|
71
|
+
assert.throws(() => bip322.assertBaseTx(psbt.getUnsignedTx()), /Transaction output script must be OP_RETURN./);
|
|
72
|
+
});
|
|
73
|
+
it('should reject if version is not 0', function () {
|
|
74
|
+
const psbt = utxolib.bitgo.createPsbtForNetwork({
|
|
75
|
+
network: utxolib.networks.bitcoin,
|
|
76
|
+
});
|
|
77
|
+
psbt.addOutput({ value: 1n, script: Buffer.from('6a', 'hex') });
|
|
78
|
+
psbt.setVersion(1);
|
|
79
|
+
assert.throws(() => bip322.assertBaseTx(psbt.getUnsignedTx()), /Transaction version must be 0./);
|
|
80
|
+
});
|
|
81
|
+
it('should reject if locktime is not 0', function () {
|
|
82
|
+
const psbt = utxolib.bitgo.createPsbtForNetwork({
|
|
83
|
+
network: utxolib.networks.bitcoin,
|
|
84
|
+
});
|
|
85
|
+
psbt.setVersion(0);
|
|
86
|
+
psbt.addOutput({ value: 1n, script: Buffer.from('6a', 'hex') });
|
|
87
|
+
psbt.setLocktime(1);
|
|
88
|
+
assert.throws(() => bip322.assertBaseTx(psbt.getUnsignedTx()), /Transaction locktime must be 0./);
|
|
89
|
+
});
|
|
90
|
+
});
|
|
91
|
+
describe('assertTxInput', function () {
|
|
92
|
+
it('should fail if input index is out of range', function () {
|
|
93
|
+
const tx = utxolib.bitgo.createPsbtForNetwork({ network: utxolib.networks.bitcoin }).getUnsignedTx();
|
|
94
|
+
assert.throws(() => bip322.assertTxInput(tx, 1, [], { address: '', message: '', pubkeys: [], scriptType: 'p2wsh' }, false), /inputIndex 1 is out of range for tx with 0 inputs./);
|
|
95
|
+
});
|
|
96
|
+
it('should fail if txInput index is not 0', function () {
|
|
97
|
+
const psbt = utxolib.bitgo.createPsbtForNetwork({
|
|
98
|
+
network: utxolib.networks.bitcoin,
|
|
99
|
+
});
|
|
100
|
+
psbt.setVersion(0);
|
|
101
|
+
psbt.setLocktime(0);
|
|
102
|
+
psbt.addOutput(opReturnOutput);
|
|
103
|
+
psbt.addInput({
|
|
104
|
+
index: 1,
|
|
105
|
+
hash: Buffer.alloc(32),
|
|
106
|
+
});
|
|
107
|
+
assert.throws(() => bip322.assertTxInput(psbt.getUnsignedTx(), 0, [], { address: '', message: '', pubkeys: [], scriptType: 'p2wsh' }, false), /transaction input 0 must have index=0./);
|
|
108
|
+
});
|
|
109
|
+
it('should fail if txInput sequence is not 0', function () {
|
|
110
|
+
const psbt = utxolib.bitgo.createPsbtForNetwork({
|
|
111
|
+
network: utxolib.networks.bitcoin,
|
|
112
|
+
});
|
|
113
|
+
psbt.setVersion(0);
|
|
114
|
+
psbt.setLocktime(0);
|
|
115
|
+
psbt.addOutput(opReturnOutput);
|
|
116
|
+
psbt.addInput({
|
|
117
|
+
index: 0,
|
|
118
|
+
hash: Buffer.alloc(32),
|
|
119
|
+
sequence: 1,
|
|
120
|
+
});
|
|
121
|
+
assert.throws(() => bip322.assertTxInput(psbt.getUnsignedTx(), 0, [], { address: '', message: '', pubkeys: [], scriptType: 'p2wsh' }, false), /transaction input 0 sequence must be 0./);
|
|
122
|
+
});
|
|
123
|
+
it('should fail if the scriptPubKey created by the public keys does not match the address provided in the messageInfo', function () {
|
|
124
|
+
const rootWalletKeys = utxolib.testutil.getDefaultWalletKeys();
|
|
125
|
+
const psbt = bip322.createBaseToSignPsbt(rootWalletKeys);
|
|
126
|
+
const message = 'to be or not to be';
|
|
127
|
+
bip322.addBip322InputWithChainAndIndex(psbt, message, rootWalletKeys, {
|
|
128
|
+
chain: 20,
|
|
129
|
+
index: 0,
|
|
130
|
+
});
|
|
131
|
+
assert.ok(psbt.data.inputs[0]?.witnessUtxo?.script);
|
|
132
|
+
const address = utxolib.address.fromOutputScript(psbt.data.inputs[0].witnessUtxo.script, utxolib.networks.bitcoin);
|
|
133
|
+
const wrongPublicKeys = rootWalletKeys.deriveForChainAndIndex(20, 1).publicKeys.map((p) => p.toString('hex'));
|
|
134
|
+
assert.throws(() => bip322.assertTxInput(psbt.getUnsignedTx(), 0, [], { address, message, pubkeys: wrongPublicKeys, scriptType: 'p2wsh' }, false), /Address does not match derived scriptPubKey for input 0./);
|
|
135
|
+
});
|
|
136
|
+
it('should fail if the txid of the input does not match the derived to_spend transaction', function () {
|
|
137
|
+
const rootWalletKeys = utxolib.testutil.getDefaultWalletKeys();
|
|
138
|
+
const psbt = bip322.createBaseToSignPsbt(rootWalletKeys);
|
|
139
|
+
const message = 'to be or not to be';
|
|
140
|
+
const output = utxolib.bitgo.outputScripts.createOutputScript2of3(rootWalletKeys.deriveForChainAndIndex(20, 0).publicKeys, 'p2wsh', psbt.network);
|
|
141
|
+
bip322.addBip322Input(psbt, message, output);
|
|
142
|
+
assert.ok(psbt.data.inputs[0]?.witnessUtxo?.script);
|
|
143
|
+
const address = utxolib.address.fromOutputScript(output.scriptPubKey, utxolib.networks.bitcoin);
|
|
144
|
+
const pubkeys = rootWalletKeys.deriveForChainAndIndex(20, 0).publicKeys.map((p) => p.toString('hex'));
|
|
145
|
+
assert.throws(() => bip322.assertTxInput(psbt.getUnsignedTx(), 0, [], {
|
|
146
|
+
address,
|
|
147
|
+
message: 'that is the question',
|
|
148
|
+
pubkeys,
|
|
149
|
+
scriptType: 'p2wsh',
|
|
150
|
+
}, false));
|
|
151
|
+
});
|
|
152
|
+
describe('checkSignature=true', function () {
|
|
153
|
+
it('should fail if the scriptType is not a 2of3 script', function () {
|
|
154
|
+
const rootWalletKeys = utxolib.testutil.getDefaultWalletKeys();
|
|
155
|
+
const psbt = bip322.createBaseToSignPsbt(rootWalletKeys);
|
|
156
|
+
const message = 'to be or not to be';
|
|
157
|
+
const derivedWalletKeys = rootWalletKeys.deriveForChainAndIndex(20, 0).publicKeys;
|
|
158
|
+
const output = utxolib.payments.p2pkh({
|
|
159
|
+
pubkey: rootWalletKeys.publicKeys[0],
|
|
160
|
+
network: psbt.network,
|
|
161
|
+
}).output;
|
|
162
|
+
assert.ok(output);
|
|
163
|
+
bip322.addBip322Input(psbt, message, {
|
|
164
|
+
scriptPubKey: Buffer.from(output),
|
|
165
|
+
});
|
|
166
|
+
psbt.signAllInputs(rootWalletKeys.user);
|
|
167
|
+
assert.throws(() => bip322.assertTxInput(psbt.getUnsignedTx(), 0, [], {
|
|
168
|
+
// Make the messageInfo self consistent, but not match the non-2of3 address in the PSBT
|
|
169
|
+
address: utxolib.address.fromOutputScript(utxolib.bitgo.outputScripts.createOutputScript2of3(derivedWalletKeys, 'p2wsh', psbt.network)
|
|
170
|
+
.scriptPubKey, psbt.network),
|
|
171
|
+
message,
|
|
172
|
+
pubkeys: derivedWalletKeys.map((k) => k.toString('hex')),
|
|
173
|
+
scriptType: 'p2wsh',
|
|
174
|
+
}, false));
|
|
175
|
+
});
|
|
176
|
+
utxolib.bitgo.outputScripts.scriptTypes2Of3.forEach((scriptType) => {
|
|
177
|
+
describe(scriptType + ' address', function () {
|
|
178
|
+
it('should pass with a full signed tx', function () {
|
|
179
|
+
const rootWalletKeys = utxolib.testutil.getDefaultWalletKeys();
|
|
180
|
+
const psbt = bip322.createBaseToSignPsbt(rootWalletKeys);
|
|
181
|
+
const message = 'to be or not to be';
|
|
182
|
+
const chainCode = utxolib.bitgo.getExternalChainCode(scriptType);
|
|
183
|
+
const derivedWalletKeys = rootWalletKeys.deriveForChainAndIndex(chainCode, 0).publicKeys;
|
|
184
|
+
const address = utxolib.address.fromOutputScript(utxolib.bitgo.outputScripts.createOutputScript2of3(derivedWalletKeys, scriptType, psbt.network)
|
|
185
|
+
.scriptPubKey, psbt.network);
|
|
186
|
+
bip322.addBip322InputWithChainAndIndex(psbt, message, rootWalletKeys, { chain: chainCode, index: 0 });
|
|
187
|
+
if (scriptType === 'p2trMusig2') {
|
|
188
|
+
psbt.setAllInputsMusig2NonceHD(rootWalletKeys.user);
|
|
189
|
+
psbt.setAllInputsMusig2NonceHD(rootWalletKeys.bitgo);
|
|
190
|
+
}
|
|
191
|
+
psbt.signAllInputsHD(rootWalletKeys.user);
|
|
192
|
+
psbt.signAllInputsHD(rootWalletKeys.bitgo);
|
|
193
|
+
psbt.validateSignaturesOfAllInputs();
|
|
194
|
+
psbt.finalizeAllInputs();
|
|
195
|
+
const tx = psbt.extractTransaction();
|
|
196
|
+
assert.doesNotThrow(() => bip322.assertTxInput(tx, 0, [
|
|
197
|
+
{
|
|
198
|
+
value: 0n,
|
|
199
|
+
script: utxolib.address.toOutputScript(address, psbt.network),
|
|
200
|
+
},
|
|
201
|
+
], {
|
|
202
|
+
// Make the messageInfo self consistent, but not match the non-2of3 address in the PSBT
|
|
203
|
+
address,
|
|
204
|
+
message,
|
|
205
|
+
pubkeys: derivedWalletKeys.map((k) => k.toString('hex')),
|
|
206
|
+
scriptType,
|
|
207
|
+
}, true));
|
|
208
|
+
});
|
|
209
|
+
});
|
|
210
|
+
});
|
|
211
|
+
});
|
|
212
|
+
describe('checkSignature=false', function () {
|
|
213
|
+
it('should not throw if the input is not signed', function () {
|
|
214
|
+
const rootWalletKeys = utxolib.testutil.getDefaultWalletKeys();
|
|
215
|
+
const psbt = bip322.createBaseToSignPsbt(rootWalletKeys);
|
|
216
|
+
const message = 'to be or not to be';
|
|
217
|
+
const output = utxolib.bitgo.outputScripts.createOutputScript2of3(rootWalletKeys.deriveForChainAndIndex(20, 0).publicKeys, 'p2wsh', psbt.network);
|
|
218
|
+
bip322.addBip322Input(psbt, message, output);
|
|
219
|
+
const address = utxolib.address.fromOutputScript(output.scriptPubKey, utxolib.networks.bitcoin);
|
|
220
|
+
assert.doesNotThrow(() => bip322.assertTxInput(psbt.getUnsignedTx(), 0, [], {
|
|
221
|
+
address,
|
|
222
|
+
message,
|
|
223
|
+
pubkeys: rootWalletKeys.deriveForChainAndIndex(20, 0).publicKeys.map((p) => p.toString('hex')),
|
|
224
|
+
scriptType: 'p2wsh',
|
|
225
|
+
}, false));
|
|
226
|
+
});
|
|
227
|
+
});
|
|
228
|
+
});
|
|
229
|
+
describe('assertBip322TxProof', function () {
|
|
230
|
+
const messageInfo = [];
|
|
231
|
+
let tx;
|
|
232
|
+
before(function () {
|
|
233
|
+
const rootWalletKeys = utxolib.testutil.getDefaultWalletKeys();
|
|
234
|
+
const psbt = bip322.createBaseToSignPsbt(rootWalletKeys);
|
|
235
|
+
utxolib.bitgo.outputScripts.scriptTypes2Of3.forEach((scriptType, index) => {
|
|
236
|
+
const chain = utxolib.bitgo.getExternalChainCode(scriptType);
|
|
237
|
+
const message = `message for ${scriptType}`;
|
|
238
|
+
const derivedKeys = rootWalletKeys.deriveForChainAndIndex(chain, index).publicKeys;
|
|
239
|
+
messageInfo.push({
|
|
240
|
+
address: utxolib.address.fromOutputScript(utxolib.bitgo.outputScripts.createOutputScript2of3(derivedKeys, scriptType, psbt.network).scriptPubKey, psbt.network),
|
|
241
|
+
message,
|
|
242
|
+
pubkeys: derivedKeys.map((p) => p.toString('hex')),
|
|
243
|
+
scriptType,
|
|
244
|
+
});
|
|
245
|
+
bip322.addBip322InputWithChainAndIndex(psbt, message, rootWalletKeys, { chain, index });
|
|
246
|
+
});
|
|
247
|
+
psbt.setAllInputsMusig2NonceHD(rootWalletKeys.user);
|
|
248
|
+
psbt.setAllInputsMusig2NonceHD(rootWalletKeys.bitgo);
|
|
249
|
+
psbt.signAllInputsHD(rootWalletKeys.user);
|
|
250
|
+
psbt.signAllInputsHD(rootWalletKeys.bitgo);
|
|
251
|
+
assert.ok(psbt.validateSignaturesOfAllInputs(), `All signatures on the inputs should be valid`);
|
|
252
|
+
psbt.finalizeAllInputs();
|
|
253
|
+
tx = psbt.extractTransaction();
|
|
254
|
+
});
|
|
255
|
+
it('should pass if the messageInfo matches the transaction', function () {
|
|
256
|
+
assert.doesNotThrow(() => bip322.assertBip322TxProof(tx, messageInfo));
|
|
257
|
+
});
|
|
258
|
+
it('should fail if the messageInfo does not match the transaction', function () {
|
|
259
|
+
assert.throws(() => bip322.assertBip322TxProof(tx, messageInfo.map((m) => ({ ...m, message: m.message + ' altered' }))));
|
|
260
|
+
});
|
|
261
|
+
});
|
|
262
|
+
describe('assertBip322PsbtProof', function () {
|
|
263
|
+
const messageInfo = [];
|
|
264
|
+
const rootWalletKeys = utxolib.testutil.getDefaultWalletKeys();
|
|
265
|
+
const psbt = bip322.createBaseToSignPsbt(rootWalletKeys);
|
|
266
|
+
before(function () {
|
|
267
|
+
utxolib.bitgo.outputScripts.scriptTypes2Of3.forEach((scriptType, index) => {
|
|
268
|
+
const chain = utxolib.bitgo.getExternalChainCode(scriptType);
|
|
269
|
+
const message = `message for ${scriptType}`;
|
|
270
|
+
const derivedKeys = rootWalletKeys.deriveForChainAndIndex(chain, index).publicKeys;
|
|
271
|
+
messageInfo.push({
|
|
272
|
+
address: utxolib.address.fromOutputScript(utxolib.bitgo.outputScripts.createOutputScript2of3(derivedKeys, scriptType, psbt.network).scriptPubKey, psbt.network),
|
|
273
|
+
message,
|
|
274
|
+
pubkeys: derivedKeys.map((p) => p.toString('hex')),
|
|
275
|
+
scriptType,
|
|
276
|
+
});
|
|
277
|
+
bip322.addBip322InputWithChainAndIndex(psbt, message, rootWalletKeys, { chain, index });
|
|
278
|
+
});
|
|
279
|
+
psbt.setAllInputsMusig2NonceHD(rootWalletKeys.user);
|
|
280
|
+
psbt.setAllInputsMusig2NonceHD(rootWalletKeys.bitgo);
|
|
281
|
+
psbt.signAllInputsHD(rootWalletKeys.user);
|
|
282
|
+
psbt.signAllInputsHD(rootWalletKeys.bitgo);
|
|
283
|
+
assert.ok(psbt.validateSignaturesOfAllInputs(), `All signatures on the inputs should be valid`);
|
|
284
|
+
});
|
|
285
|
+
it('should work when the message info matches what is in the PSBT', function () {
|
|
286
|
+
assert.doesNotThrow(() => bip322.assertBip322PsbtProof(psbt, messageInfo));
|
|
287
|
+
});
|
|
288
|
+
it('should fail when the message info does not match what is in the PSBT', function () {
|
|
289
|
+
assert.throws(() => bip322.assertBip322PsbtProof(psbt, messageInfo.map((m) => ({ ...m, message: m.message + ' altered' }))));
|
|
290
|
+
});
|
|
291
|
+
});
|
|
292
|
+
});
|
|
293
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyaWZ5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdGVzdC9iaXAzMjIvdmVyaWZ5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsK0NBQWlDO0FBRWpDLDhEQUFnRDtBQUVoRCx5REFBMkM7QUFFM0MsMERBQTRDO0FBRTVDLE1BQU0sY0FBYyxHQUFHLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLEVBQUUsQ0FBQztBQUV2RSxRQUFRLENBQUMsc0JBQXNCLEVBQUU7SUFDL0IsUUFBUSxDQUFDLGNBQWMsRUFBRTtRQUN2QixFQUFFLENBQUMsNENBQTRDLEVBQUU7WUFDL0MsTUFBTSxDQUFDLFlBQVksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxzQ0FBc0MsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDbkgsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsMERBQTBELEVBQUU7WUFDN0QsSUFBSSxJQUFJLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQztnQkFDNUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxRQUFRLENBQUMsT0FBTzthQUNsQyxDQUFDLENBQUM7WUFDSCxJQUFJLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBQy9CLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDaEUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNuQixJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lB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cyBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcblxuaW1wb3J0ICogYXMgdXR4b2xpYiBmcm9tICdAYml0Z28tYmV0YS91dHhvLWxpYic7XG5cbmltcG9ydCAqIGFzIGJpcDMyMiBmcm9tICcuLi8uLi9zcmMvYmlwMzIyJztcblxuaW1wb3J0ICogYXMgdGVzdHV0aWxzIGZyb20gJy4vYmlwMzIyLnV0aWxzJztcblxuY29uc3Qgb3BSZXR1cm5PdXRwdXQgPSB7IHZhbHVlOiAwbiwgc2NyaXB0OiBCdWZmZXIuZnJvbSgnNmEnLCAnaGV4JykgfTtcblxuZGVzY3JpYmUoJ1ZlcmlmeSBCSVAzMjIgcHJvb2ZzJywgZnVuY3Rpb24gKCkge1xuICBkZXNjcmliZSgnYXNzZXJ0QmFzZVR4JywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgcGFzcyBmb3IgYSB2YWxpZCBiaXAzMjIgdHJhbnNhY3Rpb24nLCBmdW5jdGlvbiAoKSB7XG4gICAgICBhc3NlcnQuZG9lc05vdFRocm93KCgpID0+IGJpcDMyMi5hc3NlcnRCYXNlVHgodGVzdHV0aWxzLkJJUDMyMl9GSVhUVVJFX0hFTExPX1dPUkxEX1RPU0lHTl9QU0JULmdldFVuc2lnbmVkVHgoKSkpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZWplY3QgaWYgdGhlIG91dHB1dHMgYXJlIG5vdCBjb25mb3JtZWQgY29ycmVjdGx5JywgZnVuY3Rpb24gKCkge1xuICAgICAgbGV0IHBzYnQgPSB1dHhvbGliLmJpdGdvLmNyZWF0ZVBzYnRGb3JOZXR3b3JrKHtcbiAgICAgICAgbmV0d29yazogdXR4b2xpYi5uZXR3b3Jrcy5iaXRjb2luLFxuICAgICAgfSk7XG4gICAgICBwc2J0LmFkZE91dHB1dChvcFJldHVybk91dHB1dCk7XG4gICAgICBwc2J0LmFkZE91dHB1dCh7IHZhbHVlOiAxbiwgc2NyaXB0OiBCdWZmZXIuZnJvbSgnNmEnLCAnaGV4JykgfSk7XG4gICAgICBwc2J0LnNldFZlcnNpb24oMCk7XG4gICAgICBwc2J0LnNldExvY2t0aW1lKDApO1xuICAgICAgYXNzZXJ0LnRocm93cygoKSA9PiBiaXAzMjIuYXNzZXJ0QmFzZVR4KHBzYnQuZ2V0VW5zaWduZWRUeCgpKSwgL1RyYW5zYWN0aW9uIG11c3QgaGF2ZSBleGFjdGx5IDEgb3V0cHV0Li8pO1xuXG4gICAgICBwc2J0ID0gdXR4b2xpYi5iaXRnby5jcmVhdGVQc2J0Rm9yTmV0d29yayh7XG4gICAgICAgIG5ldHdvcms6IHV0eG9saWIubmV0d29ya3MuYml0Y29pbixcbiAgICAgIH0pO1xuICAgICAgcHNidC5zZXRWZXJzaW9uKDApO1xuICAgICAgcHNidC5zZXRMb2NrdGltZSgwKTtcbiAgICAgIHBzYnQuYWRkT3V0cHV0KHsgdmFsdWU6IDFuLCBzY3JpcHQ6IEJ1ZmZlci5mcm9tKCc2YScsICdoZXgnKSB9KTtcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4gYmlwMzIyLmFzc2VydEJhc2VUeChwc2J0LmdldFVuc2lnbmVkVHgoKSksIC9UcmFuc2FjdGlvbiBvdXRwdXQgdmFsdWUgbXVzdCBiZSAwLi8pO1xuXG4gICAgICBwc2J0ID0gdXR4b2xpYi5iaXRnby5jcmVhdGVQc2J0Rm9yTmV0d29yayh7XG4gICAgICAgIG5ldHdvcms6IHV0eG9saWIubmV0d29ya3MuYml0Y29pbixcbiAgICAgIH0pO1xuICAgICAgcHNidC5zZXRWZXJzaW9uKDApO1xuICAgICAgcHNidC5zZXRMb2NrdGltZSgwKTtcbiAgICAgIHBzYnQuYWRkT3V0cHV0KHtcbiAgICAgICAgdmFsdWU6IDBuLFxuICAgICAgICBzY3JpcHQ6IHV0eG9saWIuYml0Z28ub3V0cHV0U2NyaXB0cy5jcmVhdGVPdXRwdXRTY3JpcHQyb2YzKFxuICAgICAgICAgIHV0eG9saWIudGVzdHV0aWwuZ2V0RGVmYXVsdFdhbGxldEtleXMoKS5kZXJpdmVGb3JDaGFpbkFuZEluZGV4KDAsIDApLnB1YmxpY0tleXMsXG4gICAgICAgICAgJ3Ayd3NoJyxcbiAgICAgICAgICB1dHhvbGliLm5ldHdvcmtzLmJpdGNvaW5cbiAgICAgICAgKS5zY3JpcHRQdWJLZXksXG4gICAgICB9KTtcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4gYmlwMzIyLmFzc2VydEJhc2VUeChwc2J0LmdldFVuc2lnbmVkVHgoKSksIC9UcmFuc2FjdGlvbiBvdXRwdXQgc2NyaXB0IG11c3QgYmUgT1BfUkVUVVJOLi8pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZWplY3QgaWYgdmVyc2lvbiBpcyBub3QgMCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHBzYnQgPSB1dHhvbGliLmJpdGdvLmNyZWF0ZVBzYnRGb3JOZXR3b3JrKHtcbiAgICAgICAgbmV0d29yazogdXR4b2xpYi5uZXR3b3Jrcy5iaXRjb2luLFxuICAgICAgfSk7XG4gICAgICBwc2J0LmFkZE91dHB1dCh7IHZhbHVlOiAxbiwgc2NyaXB0OiBCdWZmZXIuZnJvbSgnNmEnLCAnaGV4JykgfSk7XG4gICAgICBwc2J0LnNldFZlcnNpb24oMSk7XG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IGJpcDMyMi5hc3NlcnRCYXNlVHgocHNidC5nZXRVbnNpZ25lZFR4KCkpLCAvVHJhbnNhY3Rpb24gdmVyc2lvbiBtdXN0IGJlIDAuLyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlamVjdCBpZiBsb2NrdGltZSBpcyBub3QgMCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHBzYnQgPSB1dHhvbGliLmJpdGdvLmNyZWF0ZVBzYnRGb3JOZXR3b3JrKHtcbiAgICAgICAgbmV0d29yazogdXR4b2xpYi5uZXR3b3Jrcy5iaXRjb2luLFxuICAgICAgfSk7XG4gICAgICBwc2J0LnNldFZlcnNpb24oMCk7XG4gICAgICBwc2J0LmFkZE91dHB1dCh7IHZhbHVlOiAxbiwgc2NyaXB0OiBCdWZmZXIuZnJvbSgnNmEnLCAnaGV4JykgfSk7XG4gICAgICBwc2J0LnNldExvY2t0aW1lKDEpO1xuICAgICAgYXNzZXJ0LnRocm93cygoKSA9PiBiaXAzMjIuYXNzZXJ0QmFzZVR4KHBzYnQuZ2V0VW5zaWduZWRUeCgpKSwgL1RyYW5zYWN0aW9uIGxvY2t0aW1lIG11c3QgYmUgMC4vKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2Fzc2VydFR4SW5wdXQnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBmYWlsIGlmIGlucHV0IGluZGV4IGlzIG91dCBvZiByYW5nZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4ID0gdXR4b2xpYi5iaXRnby5jcmVhdGVQc2J0Rm9yTmV0d29yayh7IG5ldHdvcms6IHV0eG9saWIubmV0d29ya3MuYml0Y29pbiB9KS5nZXRVbnNpZ25lZFR4KCk7XG4gICAgICBhc3NlcnQudGhyb3dzKFxuICAgICAgICAoKSA9PiBiaXAzMjIuYXNzZXJ0VHhJbnB1dCh0eCwgMSwgW10sIHsgYWRkcmVzczogJycsIG1lc3NhZ2U6ICcnLCBwdWJrZXlzOiBbXSwgc2NyaXB0VHlwZTogJ3Ayd3NoJyB9LCBmYWxzZSksXG4gICAgICAgIC9pbnB1dEluZGV4IDEgaXMgb3V0IG9mIHJhbmdlIGZvciB0eCB3aXRoIDAgaW5wdXRzLi9cbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGZhaWwgaWYgdHhJbnB1dCBpbmRleCBpcyBub3QgMCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHBzYnQgPSB1dHhvbGliLmJpdGdvLmNyZWF0ZVBzYnRGb3JOZXR3b3JrKHtcbiAgICAgICAgbmV0d29yazogdXR4b2xpYi5uZXR3b3Jrcy5iaXRjb2luLFxuICAgICAgfSk7XG4gICAgICBwc2J0LnNldFZlcnNpb24oMCk7XG4gICAgICBwc2J0LnNldExvY2t0aW1lKDApO1xuICAgICAgcHNidC5hZGRPdXRwdXQob3BSZXR1cm5PdXRwdXQpO1xuICAgICAgcHNidC5hZGRJbnB1dCh7XG4gICAgICAgIGluZGV4OiAxLFxuICAgICAgICBoYXNoOiBCdWZmZXIuYWxsb2MoMzIpLFxuICAgICAgfSk7XG4gICAgICBhc3NlcnQudGhyb3dzKFxuICAgICAgICAoKSA9PlxuICAgICAgICAgIGJpcDMyMi5hc3NlcnRUeElucHV0KFxuICAgICAgICAgICAgcHNidC5nZXRVbnNpZ25lZFR4KCksXG4gICAgICAgICAgICAwLFxuICAgICAgICAgICAgW10sXG4gICAgICAgICAgICB7IGFkZHJlc3M6ICcnLCBtZXNzYWdlOiAnJywgcHVia2V5czogW10sIHNjcmlwdFR5cGU6ICdwMndzaCcgfSxcbiAgICAgICAgICAgIGZhbHNlXG4gICAgICAgICAgKSxcbiAgICAgICAgL3RyYW5zYWN0aW9uIGlucHV0IDAgbXVzdCBoYXZlIGluZGV4PTAuL1xuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZmFpbCBpZiB0eElucHV0IHNlcXVlbmNlIGlzIG5vdCAwJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgcHNidCA9IHV0eG9saWIuYml0Z28uY3JlYXRlUHNidEZvck5ldHdvcmsoe1xuICAgICAgICBuZXR3b3JrOiB1dHhvbGliLm5ldHdvcmtzLmJpdGNvaW4sXG4gICAgICB9KTtcbiAgICAgIHBzYnQuc2V0VmVyc2lvbigwKTtcbiAgICAgIHBzYnQuc2V0TG9ja3RpbWUoMCk7XG4gICAgICBwc2J0LmFkZE91dHB1dChvcFJldHVybk91dHB1dCk7XG4gICAgICBwc2J0LmFkZElucHV0KHtcbiAgICAgICAgaW5kZXg6IDAsXG4gICAgICAgIGhhc2g6IEJ1ZmZlci5hbGxvYygzMiksXG4gICAgICAgIHNlcXVlbmNlOiAxLFxuICAgICAgfSk7XG4gICAgICBhc3NlcnQudGhyb3dzKFxuICAgICAgICAoKSA9PlxuICAgICAgICAgIGJpcDMyMi5hc3NlcnRUeElucHV0KFxuICAgICAgICAgICAgcHNidC5nZXRVbnNpZ25lZFR4KCksXG4gICAgICAgICAgICAwLFxuICAgICAgICAgICAgW10sXG4gICAgICAgICAgICB7IGFkZHJlc3M6ICcnLCBtZXNzYWdlOiAnJywgcHVia2V5czogW10sIHNjcmlwdFR5cGU6ICdwMndzaCcgfSxcbiAgICAgICAgICAgIGZhbHNlXG4gICAgICAgICAgKSxcbiAgICAgICAgL3RyYW5zYWN0aW9uIGlucHV0IDAgc2VxdWVuY2UgbXVzdCBiZSAwLi9cbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGZhaWwgaWYgdGhlIHNjcmlwdFB1YktleSBjcmVhdGVkIGJ5IHRoZSBwdWJsaWMga2V5cyBkb2VzIG5vdCBtYXRjaCB0aGUgYWRkcmVzcyBwcm92aWRlZCBpbiB0aGUgbWVzc2FnZUluZm8nLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCByb290V2FsbGV0S2V5cyA9IHV0eG9saWIudGVzdHV0aWwuZ2V0RGVmYXVsdFdhbGxldEtleXMoKTtcbiAgICAgIGNvbnN0IHBzYnQgPSBiaXAzMjIuY3JlYXRlQmFzZVRvU2lnblBzYnQocm9vdFdhbGxldEtleXMpO1xuICAgICAgY29uc3QgbWVzc2FnZSA9ICd0byBiZSBvciBub3QgdG8gYmUnO1xuICAgICAgYmlwMzIyLmFkZEJpcDMyMklucHV0V2l0aENoYWluQW5kSW5kZXgocHNidCwgbWVzc2FnZSwgcm9vdFdhbGxldEtleXMsIHtcbiAgICAgICAgY2hhaW46IDIwLFxuICAgICAgICBpbmRleDogMCxcbiAgICAgIH0pO1xuICAgICAgYXNzZXJ0Lm9rKHBzYnQuZGF0YS5pbnB1dHNbMF0/LndpdG5lc3NVdHhvPy5zY3JpcHQpO1xuICAgICAgY29uc3QgYWRkcmVzcyA9IHV0eG9saWIuYWRkcmVzcy5mcm9tT3V0cHV0U2NyaXB0KFxuICAgICAgICBwc2J0LmRhdGEuaW5wdXRzWzBdLndpdG5lc3NVdHhvLnNjcmlwdCxcbiAgICAgICAgdXR4b2xpYi5uZXR3b3Jrcy5iaXRjb2luXG4gICAgICApO1xuICAgICAgY29uc3Qgd3JvbmdQdWJsaWNLZXlzID0gcm9vdFdhbGxldEtleXMuZGVyaXZlRm9yQ2hhaW5BbmRJbmRleCgyMCwgMSkucHVibGljS2V5cy5tYXAoKHApID0+IHAudG9TdHJpbmcoJ2hleCcpKTtcbiAgICAgIGFzc2VydC50aHJvd3MoXG4gICAgICAgICgpID0+XG4gICAgICAgICAgYmlwMzIyLmFzc2VydFR4SW5wdXQoXG4gICAgICAgICAgICBwc2J0LmdldFVuc2lnbmVkVHgoKSxcbiAgICAgICAgICAgIDAsXG4gICAgICAgICAgICBbXSxcbiAgICAgICAgICAgIHsgYWRkcmVzcywgbWVzc2FnZSwgcHVia2V5czogd3JvbmdQdWJsaWNLZXlzLCBzY3JpcHRUeXBlOiAncDJ3c2gnIH0sXG4gICAgICAgICAgICBmYWxzZVxuICAgICAgICAgICksXG4gICAgICAgIC9BZGRyZXNzIGRvZXMgbm90IG1hdGNoIGRlcml2ZWQgc2NyaXB0UHViS2V5IGZvciBpbnB1dCAwLi9cbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGZhaWwgaWYgdGhlIHR4aWQgb2YgdGhlIGlucHV0IGRvZXMgbm90IG1hdGNoIHRoZSBkZXJpdmVkIHRvX3NwZW5kIHRyYW5zYWN0aW9uJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qgcm9vdFdhbGxldEtleXMgPSB1dHhvbGliLnRlc3R1dGlsLmdldERlZmF1bHRXYWxsZXRLZXlzKCk7XG4gICAgICBjb25zdCBwc2J0ID0gYmlwMzIyLmNyZWF0ZUJhc2VUb1NpZ25Qc2J0KHJvb3RXYWxsZXRLZXlzKTtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSAndG8gYmUgb3Igbm90IHRvIGJlJztcblxuICAgICAgY29uc3Qgb3V0cHV0ID0gdXR4b2xpYi5iaXRnby5vdXRwdXRTY3JpcHRzLmNyZWF0ZU91dHB1dFNjcmlwdDJvZjMoXG4gICAgICAgIHJvb3RXYWxsZXRLZXlzLmRlcml2ZUZvckNoYWluQW5kSW5kZXgoMjAsIDApLnB1YmxpY0tleXMsXG4gICAgICAgICdwMndzaCcsXG4gICAgICAgIHBzYnQubmV0d29ya1xuICAgICAgKTtcbiAgICAgIGJpcDMyMi5hZGRCaXAzMjJJbnB1dChwc2J0LCBtZXNzYWdlLCBvdXRwdXQpO1xuICAgICAgYXNzZXJ0Lm9rKHBzYnQuZGF0YS5pbnB1dHNbMF0/LndpdG5lc3NVdHhvPy5zY3JpcHQpO1xuICAgICAgY29uc3QgYWRkcmVzcyA9IHV0eG9saWIuYWRkcmVzcy5mcm9tT3V0cHV0U2NyaXB0KG91dHB1dC5zY3JpcHRQdWJLZXksIHV0eG9saWIubmV0d29ya3MuYml0Y29pbik7XG4gICAgICBjb25zdCBwdWJrZXlzID0gcm9vdFdhbGxldEtleXMuZGVyaXZlRm9yQ2hhaW5BbmRJbmRleCgyMCwgMCkucHVibGljS2V5cy5tYXAoKHApID0+IHAudG9TdHJpbmcoJ2hleCcpKTtcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT5cbiAgICAgICAgYmlwMzIyLmFzc2VydFR4SW5wdXQoXG4gICAgICAgICAgcHNidC5nZXRVbnNpZ25lZFR4KCksXG4gICAgICAgICAgMCxcbiAgICAgICAgICBbXSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhZGRyZXNzLFxuICAgICAgICAgICAgbWVzc2FnZTogJ3RoYXQgaXMgdGhlIHF1ZXN0aW9uJyxcbiAgICAgICAgICAgIHB1YmtleXMsXG4gICAgICAgICAgICBzY3JpcHRUeXBlOiAncDJ3c2gnLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgZmFsc2VcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdjaGVja1NpZ25hdHVyZT10cnVlJywgZnVuY3Rpb24gKCkge1xuICAgICAgaXQoJ3Nob3VsZCBmYWlsIGlmIHRoZSBzY3JpcHRUeXBlIGlzIG5vdCBhIDJvZjMgc2NyaXB0JywgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCByb290V2FsbGV0S2V5cyA9IHV0eG9saWIudGVzdHV0aWwuZ2V0RGVmYXVsdFdhbGxldEtleXMoKTtcbiAgICAgICAgY29uc3QgcHNidCA9IGJpcDMyMi5jcmVhdGVCYXNlVG9TaWduUHNidChyb290V2FsbGV0S2V5cyk7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSAndG8gYmUgb3Igbm90IHRvIGJlJztcbiAgICAgICAgY29uc3QgZGVyaXZlZFdhbGxldEtleXMgPSByb290V2FsbGV0S2V5cy5kZXJpdmVGb3JDaGFpbkFuZEluZGV4KDIwLCAwKS5wdWJsaWNLZXlzO1xuXG4gICAgICAgIGNvbnN0IG91dHB1dCA9IHV0eG9saWIucGF5bWVudHMucDJwa2goe1xuICAgICAgICAgIHB1YmtleTogcm9vdFdhbGxldEtleXMucHVibGljS2V5c1swXSxcbiAgICAgICAgICBuZXR3b3JrOiBwc2J0Lm5ldHdvcmssXG4gICAgICAgIH0pLm91dHB1dDtcbiAgICAgICAgYXNzZXJ0Lm9rKG91dHB1dCk7XG4gICAgICAgIGJpcDMyMi5hZGRCaXAzMjJJbnB1dChwc2J0LCBtZXNzYWdlLCB7XG4gICAgICAgICAgc2NyaXB0UHViS2V5OiBCdWZmZXIuZnJvbShvdXRwdXQpLFxuICAgICAgICB9KTtcbiAgICAgICAgcHNidC5zaWduQWxsSW5wdXRzKHJvb3RXYWxsZXRLZXlzLnVzZXIpO1xuICAgICAgICBhc3NlcnQudGhyb3dzKCgpID0+XG4gICAgICAgICAgYmlwMzIyLmFzc2VydFR4SW5wdXQoXG4gICAgICAgICAgICBwc2J0LmdldFVuc2lnbmVkVHgoKSxcbiAgICAgICAgICAgIDAsXG4gICAgICAgICAgICBbXSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgLy8gTWFrZSB0aGUgbWVzc2FnZUluZm8gc2VsZiBjb25zaXN0ZW50LCBidXQgbm90IG1hdGNoIHRoZSBub24tMm9mMyBhZGRyZXNzIGluIHRoZSBQU0JUXG4gICAgICAgICAgICAgIGFkZHJlc3M6IHV0eG9saWIuYWRkcmVzcy5mcm9tT3V0cHV0U2NyaXB0KFxuICAgICAgICAgICAgICAgIHV0eG9saWIuYml0Z28ub3V0cHV0U2NyaXB0cy5jcmVhdGVPdXRwdXRTY3JpcHQyb2YzKGRlcml2ZWRXYWxsZXRLZXlzLCAncDJ3c2gnLCBwc2J0Lm5ldHdvcmspXG4gICAgICAgICAgICAgICAgICAuc2NyaXB0UHViS2V5LFxuICAgICAgICAgICAgICAgIHBzYnQubmV0d29ya1xuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICBtZXNzYWdlLFxuICAgICAgICAgICAgICBwdWJrZXlzOiBkZXJpdmVkV2FsbGV0S2V5cy5tYXAoKGspID0+IGsudG9TdHJpbmcoJ2hleCcpKSxcbiAgICAgICAgICAgICAgc2NyaXB0VHlwZTogJ3Ayd3NoJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBmYWxzZVxuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuXG4gICAgICB1dHhvbGliLmJpdGdvLm91dHB1dFNjcmlwdHMuc2NyaXB0VHlwZXMyT2YzLmZvckVhY2goKHNjcmlwdFR5cGUpID0+IHtcbiAgICAgICAgZGVzY3JpYmUoc2NyaXB0VHlwZSArICcgYWRkcmVzcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBpdCgnc2hvdWxkIHBhc3Mgd2l0aCBhIGZ1bGwgc2lnbmVkIHR4JywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgY29uc3Qgcm9vdFdhbGxldEtleXMgPSB1dHhvbGliLnRlc3R1dGlsLmdldERlZmF1bHRXYWxsZXRLZXlzKCk7XG4gICAgICAgICAgICBjb25zdCBwc2J0ID0gYmlwMzIyLmNyZWF0ZUJhc2VUb1NpZ25Qc2J0KHJvb3RXYWxsZXRLZXlzKTtcbiAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSAndG8gYmUgb3Igbm90IHRvIGJlJztcbiAgICAgICAgICAgIGNvbnN0IGNoYWluQ29kZSA9IHV0eG9saWIuYml0Z28uZ2V0RXh0ZXJuYWxDaGFpbkNvZGUoc2NyaXB0VHlwZSk7XG4gICAgICAgICAgICBjb25zdCBkZXJpdmVkV2FsbGV0S2V5cyA9IHJvb3RXYWxsZXRLZXlzLmRlcml2ZUZvckNoYWluQW5kSW5kZXgoY2hhaW5Db2RlLCAwKS5wdWJsaWNLZXlzO1xuICAgICAgICAgICAgY29uc3QgYWRkcmVzcyA9IHV0eG9saWIuYWRkcmVzcy5mcm9tT3V0cHV0U2NyaXB0KFxuICAgICAgICAgICAgICB1dHhvbGliLmJpdGdvLm91dHB1dFNjcmlwdHMuY3JlYXRlT3V0cHV0U2NyaXB0Mm9mMyhkZXJpdmVkV2FsbGV0S2V5cywgc2NyaXB0VHlwZSwgcHNidC5uZXR3b3JrKVxuICAgICAgICAgICAgICAgIC5zY3JpcHRQdWJLZXksXG4gICAgICAgICAgICAgIHBzYnQubmV0d29ya1xuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgYmlwMzIyLmFkZEJpcDMyMklucHV0V2l0aENoYWluQW5kSW5kZXgocHNidCwgbWVzc2FnZSwgcm9vdFdhbGxldEtleXMsIHsgY2hhaW46IGNoYWluQ29kZSwgaW5kZXg6IDAgfSk7XG4gICAgICAgICAgICBpZiAoc2NyaXB0VHlwZSA9PT0gJ3AydHJNdXNpZzInKSB7XG4gICAgICAgICAgICAgIHBzYnQuc2V0QWxsSW5wdXRzTXVzaWcyTm9uY2VIRChyb290V2FsbGV0S2V5cy51c2VyKTtcbiAgICAgICAgICAgICAgcHNidC5zZXRBbGxJbnB1dHNNdXNpZzJOb25jZUhEKHJvb3RXYWxsZXRLZXlzLmJpdGdvKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHBzYnQuc2lnbkFsbElucHV0c0hEKHJvb3RXYWxsZXRLZXlzLnVzZXIpO1xuICAgICAgICAgICAgcHNidC5zaWduQWxsSW5wdXRzSEQocm9vdFdhbGxldEtleXMuYml0Z28pO1xuXG4gICAgICAgICAgICBwc2J0LnZhbGlkYXRlU2lnbmF0dXJlc09mQWxsSW5wdXRzKCk7XG4gICAgICAgICAgICBwc2J0LmZpbmFsaXplQWxsSW5wdXRzKCk7XG4gICAgICAgICAgICBjb25zdCB0eCA9IHBzYnQuZXh0cmFjdFRyYW5zYWN0aW9uKCk7XG5cbiAgICAgICAgICAgIGFzc2VydC5kb2VzTm90VGhyb3coKCkgPT5cbiAgICAgICAgICAgICAgYmlwMzIyLmFzc2VydFR4SW5wdXQoXG4gICAgICAgICAgICAgICAgdHgsXG4gICAgICAgICAgICAgICAgMCxcbiAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiAwbixcbiAgICAgICAgICAgICAgICAgICAgc2NyaXB0OiB1dHhvbGliLmFkZHJlc3MudG9PdXRwdXRTY3JpcHQoYWRkcmVzcywgcHNidC5uZXR3b3JrKSxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAvLyBNYWtlIHRoZSBtZXNzYWdlSW5mbyBzZWxmIGNvbnNpc3RlbnQsIGJ1dCBub3QgbWF0Y2ggdGhlIG5vbi0yb2YzIGFkZHJlc3MgaW4gdGhlIFBTQlRcbiAgICAgICAgICAgICAgICAgIGFkZHJlc3MsXG4gICAgICAgICAgICAgICAgICBtZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgcHVia2V5czogZGVyaXZlZFdhbGxldEtleXMubWFwKChrKSA9PiBrLnRvU3RyaW5nKCdoZXgnKSksXG4gICAgICAgICAgICAgICAgICBzY3JpcHRUeXBlLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgdHJ1ZVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ2NoZWNrU2lnbmF0dXJlPWZhbHNlJywgZnVuY3Rpb24gKCkge1xuICAgICAgaXQoJ3Nob3VsZCBub3QgdGhyb3cgaWYgdGhlIGlucHV0IGlzIG5vdCBzaWduZWQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IHJvb3RXYWxsZXRLZXlzID0gdXR4b2xpYi50ZXN0dXRpbC5nZXREZWZhdWx0V2FsbGV0S2V5cygpO1xuICAgICAgICBjb25zdCBwc2J0ID0gYmlwMzIyLmNyZWF0ZUJhc2VUb1NpZ25Qc2J0KHJvb3RXYWxsZXRLZXlzKTtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9ICd0byBiZSBvciBub3QgdG8gYmUnO1xuXG4gICAgICAgIGNvbnN0IG91dHB1dCA9IHV0eG9saWIuYml0Z28ub3V0cHV0U2NyaXB0cy5jcmVhdGVPdXRwdXRTY3JpcHQyb2YzKFxuICAgICAgICAgIHJvb3RXYWxsZXRLZXlzLmRlcml2ZUZvckNoYWluQW5kSW5kZXgoMjAsIDApLnB1YmxpY0tleXMsXG4gICAgICAgICAgJ3Ayd3NoJyxcbiAgICAgICAgICBwc2J0Lm5ldHdvcmtcbiAgICAgICAgKTtcbiAgICAgICAgYmlwMzIyLmFkZEJpcDMyMklucHV0KHBzYnQsIG1lc3NhZ2UsIG91dHB1dCk7XG4gICAgICAgIGNvbnN0IGFkZHJlc3MgPSB1dHhvbGliLmFkZHJlc3MuZnJvbU91dHB1dFNjcmlwdChvdXRwdXQuc2NyaXB0UHViS2V5LCB1dHhvbGliLm5ldHdvcmtzLmJpdGNvaW4pO1xuICAgICAgICBhc3NlcnQuZG9lc05vdFRocm93KCgpID0+XG4gICAgICAgICAgYmlwMzIyLmFzc2VydFR4SW5wdXQoXG4gICAgICAgICAgICBwc2J0LmdldFVuc2lnbmVkVHgoKSxcbiAgICAgICAgICAgIDAsXG4gICAgICAgICAgICBbXSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgYWRkcmVzcyxcbiAgICAgICAgICAgICAgbWVzc2FnZSxcbiAgICAgICAgICAgICAgcHVia2V5czogcm9vdFdhbGxldEtleXMuZGVyaXZlRm9yQ2hhaW5BbmRJbmRleCgyMCwgMCkucHVibGljS2V5cy5tYXAoKHApID0+IHAudG9TdHJpbmcoJ2hleCcpKSxcbiAgICAgICAgICAgICAgc2NyaXB0VHlwZTogJ3Ayd3NoJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBmYWxzZVxuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnYXNzZXJ0QmlwMzIyVHhQcm9vZicsIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBtZXNzYWdlSW5mbzogYmlwMzIyLk1lc3NhZ2VJbmZvW10gPSBbXTtcbiAgICBsZXQgdHg6IHV0eG9saWIuYml0Z28uVXR4b1RyYW5zYWN0aW9uPGJpZ2ludD47XG4gICAgYmVmb3JlKGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHJvb3RXYWxsZXRLZXlzID0gdXR4b2xpYi50ZXN0dXRpbC5nZXREZWZhdWx0V2FsbGV0S2V5cygpO1xuICAgICAgY29uc3QgcHNidCA9IGJpcDMyMi5jcmVhdGVCYXNlVG9TaWduUHNidChyb290V2FsbGV0S2V5cyk7XG4gICAgICB1dHhvbGliLmJpdGdvLm91dHB1dFNjcmlwdHMuc2NyaXB0VHlwZXMyT2YzLmZvckVhY2goKHNjcmlwdFR5cGUsIGluZGV4KSA9PiB7XG4gICAgICAgIGNvbnN0IGNoYWluID0gdXR4b2xpYi5iaXRnby5nZXRFeHRlcm5hbENoYWluQ29kZShzY3JpcHRUeXBlKTtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGBtZXNzYWdlIGZvciAke3NjcmlwdFR5cGV9YDtcbiAgICAgICAgY29uc3QgZGVyaXZlZEtleXMgPSByb290V2FsbGV0S2V5cy5kZXJpdmVGb3JDaGFpbkFuZEluZGV4KGNoYWluLCBpbmRleCkucHVibGljS2V5cztcbiAgICAgICAgbWVzc2FnZUluZm8ucHVzaCh7XG4gICAgICAgICAgYWRkcmVzczogdXR4b2xpYi5hZGRyZXNzLmZyb21PdXRwdXRTY3JpcHQoXG4gICAgICAgICAgICB1dHhvbGliLmJpdGdvLm91dHB1dFNjcmlwdHMuY3JlYXRlT3V0cHV0U2NyaXB0Mm9mMyhkZXJpdmVkS2V5cywgc2NyaXB0VHlwZSwgcHNidC5uZXR3b3JrKS5zY3JpcHRQdWJLZXksXG4gICAgICAgICAgICBwc2J0Lm5ldHdvcmtcbiAgICAgICAgICApLFxuICAgICAgICAgIG1lc3NhZ2UsXG4gICAgICAgICAgcHVia2V5czogZGVyaXZlZEtleXMubWFwKChwKSA9PiBwLnRvU3RyaW5nKCdoZXgnKSksXG4gICAgICAgICAgc2NyaXB0VHlwZSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgYmlwMzIyLmFkZEJpcDMyMklucHV0V2l0aENoYWluQW5kSW5kZXgocHNidCwgbWVzc2FnZSwgcm9vdFdhbGxldEtleXMsIHsgY2hhaW4sIGluZGV4IH0pO1xuICAgICAgfSk7XG5cbiAgICAgIHBzYnQuc2V0QWxsSW5wdXRzTXVzaWcyTm9uY2VIRChyb290V2FsbGV0S2V5cy51c2VyKTtcbiAgICAgIHBzYnQuc2V0QWxsSW5wdXRzTXVzaWcyTm9uY2VIRChyb290V2FsbGV0S2V5cy5iaXRnbyk7XG4gICAgICBwc2J0LnNpZ25BbGxJbnB1dHNIRChyb290V2FsbGV0S2V5cy51c2VyKTtcbiAgICAgIHBzYnQuc2lnbkFsbElucHV0c0hEKHJvb3RXYWxsZXRLZXlzLmJpdGdvKTtcbiAgICAgIGFzc2VydC5vayhwc2J0LnZhbGlkYXRlU2lnbmF0dXJlc09mQWxsSW5wdXRzKCksIGBBbGwgc2lnbmF0dXJlcyBvbiB0aGUgaW5wdXRzIHNob3VsZCBiZSB2YWxpZGApO1xuICAgICAgcHNidC5maW5hbGl6ZUFsbElucHV0cygpO1xuICAgICAgdHggPSBwc2J0LmV4dHJhY3RUcmFuc2FjdGlvbigpO1xuICAgIH0pO1xuICAgIGl0KCdzaG91bGQgcGFzcyBpZiB0aGUgbWVzc2FnZUluZm8gbWF0Y2hlcyB0aGUgdHJhbnNhY3Rpb24nLCBmdW5jdGlvbiAoKSB7XG4gICAgICBhc3NlcnQuZG9lc05vdFRocm93KCgpID0+IGJpcDMyMi5hc3NlcnRCaXAzMjJUeFByb29mKHR4LCBtZXNzYWdlSW5mbykpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmYWlsIGlmIHRoZSBtZXNzYWdlSW5mbyBkb2VzIG5vdCBtYXRjaCB0aGUgdHJhbnNhY3Rpb24nLCBmdW5jdGlvbiAoKSB7XG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+XG4gICAgICAgIGJpcDMyMi5hc3NlcnRCaXAzMjJUeFByb29mKFxuICAgICAgICAgIHR4LFxuICAgICAgICAgIG1lc3NhZ2VJbmZvLm1hcCgobSkgPT4gKHsgLi4ubSwgbWVzc2FnZTogbS5tZXNzYWdlICsgJyBhbHRlcmVkJyB9KSlcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2Fzc2VydEJpcDMyMlBzYnRQcm9vZicsIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBtZXNzYWdlSW5mbzogYmlwMzIyLk1lc3NhZ2VJbmZvW10gPSBbXTtcbiAgICBjb25zdCByb290V2FsbGV0S2V5cyA9IHV0eG9saWIudGVzdHV0aWwuZ2V0RGVmYXVsdFdhbGxldEtleXMoKTtcbiAgICBjb25zdCBwc2J0ID0gYmlwMzIyLmNyZWF0ZUJhc2VUb1NpZ25Qc2J0KHJvb3RXYWxsZXRLZXlzKTtcbiAgICBiZWZvcmUoZnVuY3Rpb24gKCkge1xuICAgICAgdXR4b2xpYi5iaXRnby5vdXRwdXRTY3JpcHRzLnNjcmlwdFR5cGVzMk9mMy5mb3JFYWNoKChzY3JpcHRUeXBlLCBpbmRleCkgPT4ge1xuICAgICAgICBjb25zdCBjaGFpbiA9IHV0eG9saWIuYml0Z28uZ2V0RXh0ZXJuYWxDaGFpbkNvZGUoc2NyaXB0VHlwZSk7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBgbWVzc2FnZSBmb3IgJHtzY3JpcHRUeXBlfWA7XG4gICAgICAgIGNvbnN0IGRlcml2ZWRLZXlzID0gcm9vdFdhbGxldEtleXMuZGVyaXZlRm9yQ2hhaW5BbmRJbmRleChjaGFpbiwgaW5kZXgpLnB1YmxpY0tleXM7XG4gICAgICAgIG1lc3NhZ2VJbmZvLnB1c2goe1xuICAgICAgICAgIGFkZHJlc3M6IHV0eG9saWIuYWRkcmVzcy5mcm9tT3V0cHV0U2NyaXB0KFxuICAgICAgICAgICAgdXR4b2xpYi5iaXRnby5vdXRwdXRTY3JpcHRzLmNyZWF0ZU91dHB1dFNjcmlwdDJvZjMoZGVyaXZlZEtleXMsIHNjcmlwdFR5cGUsIHBzYnQubmV0d29yaykuc2NyaXB0UHViS2V5LFxuICAgICAgICAgICAgcHNidC5uZXR3b3JrXG4gICAgICAgICAgKSxcbiAgICAgICAgICBtZXNzYWdlLFxuICAgICAgICAgIHB1YmtleXM6IGRlcml2ZWRLZXlzLm1hcCgocCkgPT4gcC50b1N0cmluZygnaGV4JykpLFxuICAgICAgICAgIHNjcmlwdFR5cGUsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGJpcDMyMi5hZGRCaXAzMjJJbnB1dFdpdGhDaGFpbkFuZEluZGV4KHBzYnQsIG1lc3NhZ2UsIHJvb3RXYWxsZXRLZXlzLCB7IGNoYWluLCBpbmRleCB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBwc2J0LnNldEFsbElucHV0c011c2lnMk5vbmNlSEQocm9vdFdhbGxldEtleXMudXNlcik7XG4gICAgICBwc2J0LnNldEFsbElucHV0c011c2lnMk5vbmNlSEQocm9vdFdhbGxldEtleXMuYml0Z28pO1xuICAgICAgcHNidC5zaWduQWxsSW5wdXRzSEQocm9vdFdhbGxldEtleXMudXNlcik7XG4gICAgICBwc2J0LnNpZ25BbGxJbnB1dHNIRChyb290V2FsbGV0S2V5cy5iaXRnbyk7XG4gICAgICBhc3NlcnQub2socHNidC52YWxpZGF0ZVNpZ25hdHVyZXNPZkFsbElucHV0cygpLCBgQWxsIHNpZ25hdHVyZXMgb24gdGhlIGlucHV0cyBzaG91bGQgYmUgdmFsaWRgKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgd29yayB3aGVuIHRoZSBtZXNzYWdlIGluZm8gbWF0Y2hlcyB3aGF0IGlzIGluIHRoZSBQU0JUJywgZnVuY3Rpb24gKCkge1xuICAgICAgYXNzZXJ0LmRvZXNOb3RUaHJvdygoKSA9PiBiaXAzMjIuYXNzZXJ0QmlwMzIyUHNidFByb29mKHBzYnQsIG1lc3NhZ2VJbmZvKSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGZhaWwgd2hlbiB0aGUgbWVzc2FnZSBpbmZvIGRvZXMgbm90IG1hdGNoIHdoYXQgaXMgaW4gdGhlIFBTQlQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+XG4gICAgICAgIGJpcDMyMi5hc3NlcnRCaXAzMjJQc2J0UHJvb2YoXG4gICAgICAgICAgcHNidCxcbiAgICAgICAgICBtZXNzYWdlSW5mby5tYXAoKG0pID0+ICh7IC4uLm0sIG1lc3NhZ2U6IG0ubWVzc2FnZSArICcgYWx0ZXJlZCcgfSkpXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bip32utils.d.ts","sourceRoot":"","sources":["../../../test/bip32utils.ts"],"names":[],"mappings":""}
|