@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,69 @@
|
|
|
1
|
+
import * as utxolib from '@bitgo-beta/utxo-lib';
|
|
2
|
+
import { toUtxoPsbt, toWrappedPsbt } from './wrap';
|
|
3
|
+
import { assertSatisfiable } from './assertSatisfiable';
|
|
4
|
+
/**
|
|
5
|
+
* Non-Final (Replaceable)
|
|
6
|
+
* Reference: https://github.com/bitcoin/bitcoin/blob/v25.1/src/rpc/rawtransaction_util.cpp#L49
|
|
7
|
+
* */
|
|
8
|
+
export const MAX_BIP125_RBF_SEQUENCE = 0xffffffff - 2;
|
|
9
|
+
export function findTapLeafScript(input, script) {
|
|
10
|
+
if (!Buffer.isBuffer(script)) {
|
|
11
|
+
script = Buffer.from(script.encode());
|
|
12
|
+
}
|
|
13
|
+
const matches = input.filter((leaf) => {
|
|
14
|
+
return leaf.script.equals(script);
|
|
15
|
+
});
|
|
16
|
+
if (matches.length === 0) {
|
|
17
|
+
throw new Error(`No tapLeafScript found for script: ${script.toString('hex')}`);
|
|
18
|
+
}
|
|
19
|
+
if (matches.length > 1) {
|
|
20
|
+
throw new Error(`Multiple tapLeafScripts found for script: ${script.toString('hex')}`);
|
|
21
|
+
}
|
|
22
|
+
return matches[0];
|
|
23
|
+
}
|
|
24
|
+
function updateInputsWithDescriptors(psbt, inputParams) {
|
|
25
|
+
if (psbt.txInputs.length !== inputParams.length) {
|
|
26
|
+
throw new Error(`Input count mismatch (psbt=${psbt.txInputs.length}, inputParams=${inputParams.length})`);
|
|
27
|
+
}
|
|
28
|
+
const wrappedPsbt = toWrappedPsbt(psbt);
|
|
29
|
+
for (const [inputIndex, v] of inputParams.entries()) {
|
|
30
|
+
assertSatisfiable(psbt, inputIndex, v.descriptor);
|
|
31
|
+
wrappedPsbt.updateInputWithDescriptor(inputIndex, v.descriptor);
|
|
32
|
+
}
|
|
33
|
+
const unwrappedPsbt = toUtxoPsbt(wrappedPsbt, psbt.network);
|
|
34
|
+
for (const inputIndex in psbt.txInputs) {
|
|
35
|
+
const preparedInput = unwrappedPsbt.data.inputs[inputIndex];
|
|
36
|
+
const v = inputParams[inputIndex];
|
|
37
|
+
if (v.selectTapLeafScript && preparedInput.tapLeafScript) {
|
|
38
|
+
const selected = findTapLeafScript(preparedInput.tapLeafScript, v.selectTapLeafScript);
|
|
39
|
+
preparedInput.tapLeafScript = [selected];
|
|
40
|
+
}
|
|
41
|
+
psbt.data.inputs[inputIndex] = preparedInput;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
function updateOutputsWithDescriptors(psbt, descriptors) {
|
|
45
|
+
const wrappedPsbt = toWrappedPsbt(psbt);
|
|
46
|
+
for (const [outputIndex, { descriptor }] of descriptors.entries()) {
|
|
47
|
+
if (descriptor) {
|
|
48
|
+
wrappedPsbt.updateOutputWithDescriptor(outputIndex, descriptor);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
const unwrappedPsbt = toUtxoPsbt(wrappedPsbt, psbt.network);
|
|
52
|
+
for (const outputIndex in psbt.txOutputs) {
|
|
53
|
+
psbt.data.outputs[outputIndex] = unwrappedPsbt.data.outputs[outputIndex];
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
export function createPsbt(params, inputs, outputs) {
|
|
57
|
+
const psbt = utxolib.bitgo.UtxoPsbt.createPsbt({ network: params.network });
|
|
58
|
+
psbt.setVersion(params.version ?? 2);
|
|
59
|
+
psbt.setLocktime(params.locktime ?? 0);
|
|
60
|
+
psbt.addInputs(inputs.map((i) => ({ ...i, sequence: i.sequence ?? params.sequence ?? MAX_BIP125_RBF_SEQUENCE })));
|
|
61
|
+
psbt.addOutputs(outputs);
|
|
62
|
+
updateInputsWithDescriptors(psbt, inputs.map(({ descriptor, selectTapLeafScript }) => ({
|
|
63
|
+
descriptor,
|
|
64
|
+
selectTapLeafScript,
|
|
65
|
+
})));
|
|
66
|
+
updateOutputsWithDescriptors(psbt, outputs);
|
|
67
|
+
return psbt;
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlUHNidC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9kZXNjcmlwdG9yL3BzYnQvY3JlYXRlUHNidC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEtBQUssT0FBTyxNQUFNLHNCQUFzQixDQUFDO0FBTWhELE9BQU8sRUFBRSxVQUFVLEVBQUUsYUFBYSxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRXhEOzs7S0FHSztBQUNMLE1BQU0sQ0FBQyxNQUFNLHVCQUF1QixHQUFHLFVBQVUsR0FBRyxDQUFDLENBQUM7QUFFdEQsTUFBTSxVQUFVLGlCQUFpQixDQUFDLEtBQXNCLEVBQUUsTUFBMkI7SUFDbkYsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztRQUM3QixNQUFNLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBQ0QsTUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO1FBQ3BDLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDcEMsQ0FBQyxDQUFDLENBQUM7SUFDSCxJQUFJLE9BQU8sQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDekIsTUFBTSxJQUFJLEtBQUssQ0FBQyxzQ0FBc0MsTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDbEYsQ0FBQztJQUNELElBQUksT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUN2QixNQUFNLElBQUksS0FBSyxDQUFDLDZDQUE2QyxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUN6RixDQUFDO0lBQ0QsT0FBTyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDcEIsQ0FBQztBQUVELFNBQVMsMkJBQTJCLENBQ2xDLElBQTRCLEVBQzVCLFdBQWdGO0lBRWhGLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEtBQUssV0FBVyxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ2hELE1BQU0sSUFBSSxLQUFLLENBQUMsOEJBQThCLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxpQkFBaUIsV0FBVyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFDNUcsQ0FBQztJQUNELE1BQU0sV0FBVyxHQUFHLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN4QyxLQUFLLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLElBQUksV0FBVyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUM7UUFDcEQsaUJBQWlCLENBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDbEQsV0FBVyxDQUFDLHlCQUF5QixDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDbEUsQ0FBQztJQUNELE1BQU0sYUFBYSxHQUFHLFVBQVUsQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzVELEtBQUssTUFBTSxVQUFVLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ3ZDLE1BQU0sYUFBYSxHQUFHLGFBQWEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzVELE1BQU0sQ0FBQyxHQUFHLFdBQVcsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNsQyxJQUFJLENBQUMsQ0FBQyxtQkFBbUIsSUFBSSxhQUFhLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDekQsTUFBTSxRQUFRLEdBQUcsaUJBQWlCLENBQUMsYUFBYSxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUMsbUJBQW1CLENBQUMsQ0FBQztZQUN2RixhQUFhLENBQUMsYUFBYSxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDM0MsQ0FBQztRQUNELElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxHQUFHLGFBQWEsQ0FBQztJQUMvQyxDQUFDO0FBQ0gsQ0FBQztBQUVELFNBQVMsNEJBQTRCLENBQUMsSUFBNEIsRUFBRSxXQUF3QztJQUMxRyxNQUFNLFdBQVcsR0FBRyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDeEMsS0FBSyxNQUFNLENBQUMsV0FBVyxFQUFFLEVBQUUsVUFBVSxFQUFFLENBQUMsSUFBSSxXQUFXLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQztRQUNsRSxJQUFJLFVBQVUsRUFBRSxDQUFDO1lBQ2YsV0FBVyxDQUFDLDBCQUEwQixDQUFDLFdBQVcsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUNsRSxDQUFDO0lBQ0gsQ0FBQztJQUNELE1BQU0sYUFBYSxHQUFHLFVBQVUsQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzVELEtBQUssTUFBTSxXQUFXLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ3pDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxHQUFHLGFBQWEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQzNFLENBQUM7QUFDSCxDQUFDO0FBY0QsTUFBTSxVQUFVLFVBQVUsQ0FDeEIsTUFBa0IsRUFDbEIsTUFBMkMsRUFDM0MsT0FBb0M7SUFFcEMsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLEVBQUUsT0FBTyxFQUFFLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO0lBQzVFLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLE9BQU8sSUFBSSxDQUFDLENBQUMsQ0FBQztJQUNyQyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxRQUFRLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDdkMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQyxRQUFRLElBQUksTUFBTSxDQUFDLFFBQVEsSUFBSSx1QkFBdUIsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2xILElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDekIsMkJBQTJCLENBQ3pCLElBQUksRUFDSixNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxVQUFVLEVBQUUsbUJBQW1CLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNuRCxVQUFVO1FBQ1YsbUJBQW1CO0tBQ3BCLENBQUMsQ0FBQyxDQUNKLENBQUM7SUFDRiw0QkFBNEIsQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDNUMsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVGFwTGVhZlNjcmlwdCB9IGZyb20gJ2JpcDE3NC9zcmMvbGliL2ludGVyZmFjZXMnO1xuaW1wb3J0ICogYXMgdXR4b2xpYiBmcm9tICdAYml0Z28tYmV0YS91dHhvLWxpYic7XG5pbXBvcnQgeyBEZXNjcmlwdG9yLCBNaW5pc2NyaXB0IH0gZnJvbSAnQGJpdGdvL3dhc20tdXR4byc7XG5cbmltcG9ydCB7IERlcml2ZWREZXNjcmlwdG9yV2FsbGV0T3V0cHV0LCBXaXRoT3B0RGVzY3JpcHRvciB9IGZyb20gJy4uL091dHB1dCc7XG5pbXBvcnQgeyBPdXRwdXQgfSBmcm9tICcuLi8uLi9PdXRwdXQnO1xuXG5pbXBvcnQgeyB0b1V0eG9Qc2J0LCB0b1dyYXBwZWRQc2J0IH0gZnJvbSAnLi93cmFwJztcbmltcG9ydCB7IGFzc2VydFNhdGlzZmlhYmxlIH0gZnJvbSAnLi9hc3NlcnRTYXRpc2ZpYWJsZSc7XG5cbi8qKlxuICogTm9uLUZpbmFsIChSZXBsYWNlYWJsZSlcbiAqIFJlZmVyZW5jZTogaHR0cHM6Ly9naXRodWIuY29tL2JpdGNvaW4vYml0Y29pbi9ibG9iL3YyNS4xL3NyYy9ycGMvcmF3dHJhbnNhY3Rpb25fdXRpbC5jcHAjTDQ5XG4gKiAqL1xuZXhwb3J0IGNvbnN0IE1BWF9CSVAxMjVfUkJGX1NFUVVFTkNFID0gMHhmZmZmZmZmZiAtIDI7XG5cbmV4cG9ydCBmdW5jdGlvbiBmaW5kVGFwTGVhZlNjcmlwdChpbnB1dDogVGFwTGVhZlNjcmlwdFtdLCBzY3JpcHQ6IEJ1ZmZlciB8IE1pbmlzY3JpcHQpOiBUYXBMZWFmU2NyaXB0IHtcbiAgaWYgKCFCdWZmZXIuaXNCdWZmZXIoc2NyaXB0KSkge1xuICAgIHNjcmlwdCA9IEJ1ZmZlci5mcm9tKHNjcmlwdC5lbmNvZGUoKSk7XG4gIH1cbiAgY29uc3QgbWF0Y2hlcyA9IGlucHV0LmZpbHRlcigobGVhZikgPT4ge1xuICAgIHJldHVybiBsZWFmLnNjcmlwdC5lcXVhbHMoc2NyaXB0KTtcbiAgfSk7XG4gIGlmIChtYXRjaGVzLmxlbmd0aCA9PT0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgTm8gdGFwTGVhZlNjcmlwdCBmb3VuZCBmb3Igc2NyaXB0OiAke3NjcmlwdC50b1N0cmluZygnaGV4Jyl9YCk7XG4gIH1cbiAgaWYgKG1hdGNoZXMubGVuZ3RoID4gMSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgTXVsdGlwbGUgdGFwTGVhZlNjcmlwdHMgZm91bmQgZm9yIHNjcmlwdDogJHtzY3JpcHQudG9TdHJpbmcoJ2hleCcpfWApO1xuICB9XG4gIHJldHVybiBtYXRjaGVzWzBdO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVJbnB1dHNXaXRoRGVzY3JpcHRvcnMoXG4gIHBzYnQ6IHV0eG9saWIuYml0Z28uVXR4b1BzYnQsXG4gIGlucHV0UGFyYW1zOiBBcnJheTx7IGRlc2NyaXB0b3I6IERlc2NyaXB0b3I7IHNlbGVjdFRhcExlYWZTY3JpcHQ/OiBNaW5pc2NyaXB0IH0+XG4pIHtcbiAgaWYgKHBzYnQudHhJbnB1dHMubGVuZ3RoICE9PSBpbnB1dFBhcmFtcy5sZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYElucHV0IGNvdW50IG1pc21hdGNoIChwc2J0PSR7cHNidC50eElucHV0cy5sZW5ndGh9LCBpbnB1dFBhcmFtcz0ke2lucHV0UGFyYW1zLmxlbmd0aH0pYCk7XG4gIH1cbiAgY29uc3Qgd3JhcHBlZFBzYnQgPSB0b1dyYXBwZWRQc2J0KHBzYnQpO1xuICBmb3IgKGNvbnN0IFtpbnB1dEluZGV4LCB2XSBvZiBpbnB1dFBhcmFtcy5lbnRyaWVzKCkpIHtcbiAgICBhc3NlcnRTYXRpc2ZpYWJsZShwc2J0LCBpbnB1dEluZGV4LCB2LmRlc2NyaXB0b3IpO1xuICAgIHdyYXBwZWRQc2J0LnVwZGF0ZUlucHV0V2l0aERlc2NyaXB0b3IoaW5wdXRJbmRleCwgdi5kZXNjcmlwdG9yKTtcbiAgfVxuICBjb25zdCB1bndyYXBwZWRQc2J0ID0gdG9VdHhvUHNidCh3cmFwcGVkUHNidCwgcHNidC5uZXR3b3JrKTtcbiAgZm9yIChjb25zdCBpbnB1dEluZGV4IGluIHBzYnQudHhJbnB1dHMpIHtcbiAgICBjb25zdCBwcmVwYXJlZElucHV0ID0gdW53cmFwcGVkUHNidC5kYXRhLmlucHV0c1tpbnB1dEluZGV4XTtcbiAgICBjb25zdCB2ID0gaW5wdXRQYXJhbXNbaW5wdXRJbmRleF07XG4gICAgaWYgKHYuc2VsZWN0VGFwTGVhZlNjcmlwdCAmJiBwcmVwYXJlZElucHV0LnRhcExlYWZTY3JpcHQpIHtcbiAgICAgIGNvbnN0IHNlbGVjdGVkID0gZmluZFRhcExlYWZTY3JpcHQocHJlcGFyZWRJbnB1dC50YXBMZWFmU2NyaXB0LCB2LnNlbGVjdFRhcExlYWZTY3JpcHQpO1xuICAgICAgcHJlcGFyZWRJbnB1dC50YXBMZWFmU2NyaXB0ID0gW3NlbGVjdGVkXTtcbiAgICB9XG4gICAgcHNidC5kYXRhLmlucHV0c1tpbnB1dEluZGV4XSA9IHByZXBhcmVkSW5wdXQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gdXBkYXRlT3V0cHV0c1dpdGhEZXNjcmlwdG9ycyhwc2J0OiB1dHhvbGliLmJpdGdvLlV0eG9Qc2J0LCBkZXNjcmlwdG9yczogV2l0aE9wdERlc2NyaXB0b3I8T3V0cHV0PltdKSB7XG4gIGNvbnN0IHdyYXBwZWRQc2J0ID0gdG9XcmFwcGVkUHNidChwc2J0KTtcbiAgZm9yIChjb25zdCBbb3V0cHV0SW5kZXgsIHsgZGVzY3JpcHRvciB9XSBvZiBkZXNjcmlwdG9ycy5lbnRyaWVzKCkpIHtcbiAgICBpZiAoZGVzY3JpcHRvcikge1xuICAgICAgd3JhcHBlZFBzYnQudXBkYXRlT3V0cHV0V2l0aERlc2NyaXB0b3Iob3V0cHV0SW5kZXgsIGRlc2NyaXB0b3IpO1xuICAgIH1cbiAgfVxuICBjb25zdCB1bndyYXBwZWRQc2J0ID0gdG9VdHhvUHNidCh3cmFwcGVkUHNidCwgcHNidC5uZXR3b3JrKTtcbiAgZm9yIChjb25zdCBvdXRwdXRJbmRleCBpbiBwc2J0LnR4T3V0cHV0cykge1xuICAgIHBzYnQuZGF0YS5vdXRwdXRzW291dHB1dEluZGV4XSA9IHVud3JhcHBlZFBzYnQuZGF0YS5vdXRwdXRzW291dHB1dEluZGV4XTtcbiAgfVxufVxuXG5leHBvcnQgdHlwZSBQc2J0UGFyYW1zID0ge1xuICBuZXR3b3JrOiB1dHhvbGliLk5ldHdvcms7XG4gIHZlcnNpb24/OiBudW1iZXI7XG4gIGxvY2t0aW1lPzogbnVtYmVyO1xuICBzZXF1ZW5jZT86IG51bWJlcjtcbn07XG5cbmV4cG9ydCB0eXBlIERlcml2ZWREZXNjcmlwdG9yVHJhbnNhY3Rpb25JbnB1dCA9IERlcml2ZWREZXNjcmlwdG9yV2FsbGV0T3V0cHV0ICYge1xuICBzZWxlY3RUYXBMZWFmU2NyaXB0PzogTWluaXNjcmlwdDtcbiAgc2VxdWVuY2U/OiBudW1iZXI7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUHNidChcbiAgcGFyYW1zOiBQc2J0UGFyYW1zLFxuICBpbnB1dHM6IERlcml2ZWREZXNjcmlwdG9yVHJhbnNhY3Rpb25JbnB1dFtdLFxuICBvdXRwdXRzOiBXaXRoT3B0RGVzY3JpcHRvcjxPdXRwdXQ+W11cbik6IHV0eG9saWIuYml0Z28uVXR4b1BzYnQge1xuICBjb25zdCBwc2J0ID0gdXR4b2xpYi5iaXRnby5VdHhvUHNidC5jcmVhdGVQc2J0KHsgbmV0d29yazogcGFyYW1zLm5ldHdvcmsgfSk7XG4gIHBzYnQuc2V0VmVyc2lvbihwYXJhbXMudmVyc2lvbiA/PyAyKTtcbiAgcHNidC5zZXRMb2NrdGltZShwYXJhbXMubG9ja3RpbWUgPz8gMCk7XG4gIHBzYnQuYWRkSW5wdXRzKGlucHV0cy5tYXAoKGkpID0+ICh7IC4uLmksIHNlcXVlbmNlOiBpLnNlcXVlbmNlID8/IHBhcmFtcy5zZXF1ZW5jZSA/PyBNQVhfQklQMTI1X1JCRl9TRVFVRU5DRSB9KSkpO1xuICBwc2J0LmFkZE91dHB1dHMob3V0cHV0cyk7XG4gIHVwZGF0ZUlucHV0c1dpdGhEZXNjcmlwdG9ycyhcbiAgICBwc2J0LFxuICAgIGlucHV0cy5tYXAoKHsgZGVzY3JpcHRvciwgc2VsZWN0VGFwTGVhZlNjcmlwdCB9KSA9PiAoe1xuICAgICAgZGVzY3JpcHRvcixcbiAgICAgIHNlbGVjdFRhcExlYWZTY3JpcHQsXG4gICAgfSkpXG4gICk7XG4gIHVwZGF0ZU91dHB1dHNXaXRoRGVzY3JpcHRvcnMocHNidCwgb3V0cHV0cyk7XG4gIHJldHVybiBwc2J0O1xufVxuIl19
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { PsbtInput, PsbtOutput } from 'bip174/src/lib/interfaces';
|
|
2
|
+
import { Descriptor } from '@bitgo/wasm-utxo';
|
|
3
|
+
import { DescriptorMap } from '../DescriptorMap';
|
|
4
|
+
type DescriptorWithoutIndex = {
|
|
5
|
+
descriptor: Descriptor;
|
|
6
|
+
index: undefined;
|
|
7
|
+
};
|
|
8
|
+
type DescriptorWithIndex = {
|
|
9
|
+
descriptor: Descriptor;
|
|
10
|
+
index: number;
|
|
11
|
+
};
|
|
12
|
+
/**
|
|
13
|
+
* @param input
|
|
14
|
+
* @param descriptorMap
|
|
15
|
+
* @returns DescriptorWithIndex for the input if found, undefined otherwise
|
|
16
|
+
*/
|
|
17
|
+
export declare function findDescriptorForInput(input: PsbtInput, descriptorMap: DescriptorMap): DescriptorWithIndex | DescriptorWithoutIndex | undefined;
|
|
18
|
+
/**
|
|
19
|
+
* @param script - the output script
|
|
20
|
+
* @param output - the PSBT output
|
|
21
|
+
* @param descriptorMap
|
|
22
|
+
* @returns DescriptorWithIndex for the output if found, undefined otherwise
|
|
23
|
+
*/
|
|
24
|
+
export declare function findDescriptorForOutput(script: Buffer, output: PsbtOutput, descriptorMap: DescriptorMap): DescriptorWithIndex | DescriptorWithoutIndex | undefined;
|
|
25
|
+
export {};
|
|
26
|
+
//# sourceMappingURL=findDescriptors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"findDescriptors.d.ts","sourceRoot":"","sources":["../../../../src/descriptor/psbt/findDescriptors.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEjD,KAAK,sBAAsB,GAAG;IAAE,UAAU,EAAE,UAAU,CAAC;IAAC,KAAK,EAAE,SAAS,CAAA;CAAE,CAAC;AAsB3E,KAAK,mBAAmB,GAAG;IAAE,UAAU,EAAE,UAAU,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAsErE;;;;GAIG;AACH,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,SAAS,EAChB,aAAa,EAAE,aAAa,GAC3B,mBAAmB,GAAG,sBAAsB,GAAG,SAAS,CAU1D;AAED;;;;;GAKG;AACH,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,UAAU,EAClB,aAAa,EAAE,aAAa,GAC3B,mBAAmB,GAAG,sBAAsB,GAAG,SAAS,CAQ1D"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Find a definite descriptor in the descriptor map that matches the given script.
|
|
3
|
+
* @param script
|
|
4
|
+
* @param descriptorMap
|
|
5
|
+
*/
|
|
6
|
+
function findDescriptorWithoutDerivation(script, descriptorMap) {
|
|
7
|
+
for (const descriptor of descriptorMap.values()) {
|
|
8
|
+
if (!descriptor.hasWildcard()) {
|
|
9
|
+
if (Buffer.from(descriptor.scriptPubkey()).equals(script)) {
|
|
10
|
+
return { descriptor, index: undefined };
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
return undefined;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Find a descriptor in the descriptor map that matches the given script and derivation index.
|
|
18
|
+
* @param script
|
|
19
|
+
* @param index
|
|
20
|
+
* @param descriptorMap
|
|
21
|
+
* @returns DescriptorWithIndex if found, undefined otherwise
|
|
22
|
+
*/
|
|
23
|
+
function findDescriptorForDerivationIndex(script, index, descriptorMap) {
|
|
24
|
+
for (const descriptor of descriptorMap.values()) {
|
|
25
|
+
if (descriptor.hasWildcard() && Buffer.from(descriptor.atDerivationIndex(index).scriptPubkey()).equals(script)) {
|
|
26
|
+
return { descriptor, index };
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
return undefined;
|
|
30
|
+
}
|
|
31
|
+
function getDerivationIndexFromPath(path) {
|
|
32
|
+
const indexStr = path.split('/').pop();
|
|
33
|
+
if (!indexStr) {
|
|
34
|
+
throw new Error(`Invalid derivation path ${path}`);
|
|
35
|
+
}
|
|
36
|
+
const index = parseInt(indexStr, 10);
|
|
37
|
+
if (index.toString() !== indexStr) {
|
|
38
|
+
throw new Error(`Invalid derivation path ${path}`);
|
|
39
|
+
}
|
|
40
|
+
return index;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Wrapper around findDescriptorForDerivationPath that tries multiple derivation paths.
|
|
44
|
+
* @param script
|
|
45
|
+
* @param derivationPaths
|
|
46
|
+
* @param descriptorMap
|
|
47
|
+
*/
|
|
48
|
+
function findDescriptorForAnyDerivationPath(script, derivationPaths, descriptorMap) {
|
|
49
|
+
const derivationIndexSet = new Set(derivationPaths.map((p) => getDerivationIndexFromPath(p)));
|
|
50
|
+
for (const index of [...derivationIndexSet]) {
|
|
51
|
+
const desc = findDescriptorForDerivationIndex(script, index, descriptorMap);
|
|
52
|
+
if (desc) {
|
|
53
|
+
return desc;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
return undefined;
|
|
57
|
+
}
|
|
58
|
+
function getDerivationPaths(v) {
|
|
59
|
+
if ('bip32Derivation' in v && v.bip32Derivation) {
|
|
60
|
+
return v.bip32Derivation.map((v) => v.path);
|
|
61
|
+
}
|
|
62
|
+
if ('tapBip32Derivation' in v && v.tapBip32Derivation) {
|
|
63
|
+
return v.tapBip32Derivation.map((v) => v.path).filter((v) => v !== '' && v !== 'm');
|
|
64
|
+
}
|
|
65
|
+
return undefined;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* @param input
|
|
69
|
+
* @param descriptorMap
|
|
70
|
+
* @returns DescriptorWithIndex for the input if found, undefined otherwise
|
|
71
|
+
*/
|
|
72
|
+
export function findDescriptorForInput(input, descriptorMap) {
|
|
73
|
+
const script = input.witnessUtxo?.script;
|
|
74
|
+
if (!script) {
|
|
75
|
+
throw new Error('Missing script');
|
|
76
|
+
}
|
|
77
|
+
const derivationPaths = getDerivationPaths(input) ?? [];
|
|
78
|
+
return (findDescriptorWithoutDerivation(script, descriptorMap) ??
|
|
79
|
+
findDescriptorForAnyDerivationPath(script, derivationPaths, descriptorMap));
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* @param script - the output script
|
|
83
|
+
* @param output - the PSBT output
|
|
84
|
+
* @param descriptorMap
|
|
85
|
+
* @returns DescriptorWithIndex for the output if found, undefined otherwise
|
|
86
|
+
*/
|
|
87
|
+
export function findDescriptorForOutput(script, output, descriptorMap) {
|
|
88
|
+
const derivationPaths = getDerivationPaths(output);
|
|
89
|
+
return (findDescriptorWithoutDerivation(script, descriptorMap) ??
|
|
90
|
+
(derivationPaths === undefined
|
|
91
|
+
? undefined
|
|
92
|
+
: findDescriptorForAnyDerivationPath(script, derivationPaths, descriptorMap)));
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmluZERlc2NyaXB0b3JzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2Rlc2NyaXB0b3IvcHNidC9maW5kRGVzY3JpcHRvcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBa0JBOzs7O0dBSUc7QUFDSCxTQUFTLCtCQUErQixDQUN0QyxNQUFjLEVBQ2QsYUFBNEI7SUFFNUIsS0FBSyxNQUFNLFVBQVUsSUFBSSxhQUFhLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQztRQUNoRCxJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUM7WUFDOUIsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO2dCQUMxRCxPQUFPLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsQ0FBQztZQUMxQyxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRCxPQUFPLFNBQVMsQ0FBQztBQUNuQixDQUFDO0FBSUQ7Ozs7OztHQU1HO0FBQ0gsU0FBUyxnQ0FBZ0MsQ0FDdkMsTUFBYyxFQUNkLEtBQWEsRUFDYixhQUE0QjtJQUU1QixLQUFLLE1BQU0sVUFBVSxJQUFJLGFBQWEsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDO1FBQ2hELElBQUksVUFBVSxDQUFDLFdBQVcsRUFBRSxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7WUFDL0csT0FBTyxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsQ0FBQztRQUMvQixDQUFDO0lBQ0gsQ0FBQztJQUVELE9BQU8sU0FBUyxDQUFDO0FBQ25CLENBQUM7QUFFRCxTQUFTLDBCQUEwQixDQUFDLElBQVk7SUFDOUMsTUFBTSxR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QUFTO1lBQ1gsQ0FBQyxDQUFDLGtDQUFrQyxDQUFDLE1BQU0sRUFBRSxlQUFlLEVBQUUsYUFBYSxDQUFDLENBQUMsQ0FDaEYsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuXG5VdGlsaXRpZXMgZm9yIG1hcHBpbmcgYmFjayBmcm9tIFBTQlQgaW5wdXRzIHRvIGRlc2NyaXB0b3JzLlxuXG5UaGlzIGlzIGEgc29tZXdoYXQgYnJ1dGUtZm9yY2UgYXR0ZW1wdCB0aGF0IHJlbGllcyBvbiB0aGUgYGJpcDMyRGVyaXZhdGlvbmAgZmllbGQgdG8gYmUgc2V0LlxuXG5JdCB3aWxsIHByb2JhYmx5IG9ubHkgd29yayBjb3JyZWN0bHkgaWYgYWxsIHhwdWJzIGluIHRoZSBkZXNjcmlwdG9yIGFyZSBkZXJpdmFibGUuXG5cbldlIHNob3VsZCB0YWtlIGEgbG9vayBhdCBhIG1vcmUgcm9idXN0IGFuZCBzdGFuZGFyZCBhcHByb2FjaCBsaWtlIHRoaXM6IGh0dHBzOi8vZ2l0aHViLmNvbS9iaXRjb2luL2JpcHMvcHVsbC8xNTQ4XG5cbiAqL1xuaW1wb3J0IHsgUHNidElucHV0LCBQc2J0T3V0cHV0IH0gZnJvbSAnYmlwMTc0L3NyYy9saWIvaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBEZXNjcmlwdG9yIH0gZnJvbSAnQGJpdGdvL3dhc20tdXR4byc7XG5cbmltcG9ydCB7IERlc2NyaXB0b3JNYXAgfSBmcm9tICcuLi9EZXNjcmlwdG9yTWFwJztcblxudHlwZSBEZXNjcmlwdG9yV2l0aG91dEluZGV4ID0geyBkZXNjcmlwdG9yOiBEZXNjcmlwdG9yOyBpbmRleDogdW5kZWZpbmVkIH07XG5cbi8qKlxuICogRmluZCBhIGRlZmluaXRlIGRlc2NyaXB0b3IgaW4gdGhlIGRlc2NyaXB0b3IgbWFwIHRoYXQgbWF0Y2hlcyB0aGUgZ2l2ZW4gc2NyaXB0LlxuICogQHBhcmFtIHNjcmlwdFxuICogQHBhcmFtIGRlc2NyaXB0b3JNYXBcbiAqL1xuZnVuY3Rpb24gZmluZERlc2NyaXB0b3JXaXRob3V0RGVyaXZhdGlvbihcbiAgc2NyaXB0OiBCdWZmZXIsXG4gIGRlc2NyaXB0b3JNYXA6IERlc2NyaXB0b3JNYXBcbik6IERlc2NyaXB0b3JXaXRob3V0SW5kZXggfCB1bmRlZmluZWQge1xuICBmb3IgKGNvbnN0IGRlc2NyaXB0b3Igb2YgZGVzY3JpcHRvck1hcC52YWx1ZXMoKSkge1xuICAgIGlmICghZGVzY3JpcHRvci5oYXNXaWxkY2FyZCgpKSB7XG4gICAgICBpZiAoQnVmZmVyLmZyb20oZGVzY3JpcHRvci5zY3JpcHRQdWJrZXkoKSkuZXF1YWxzKHNjcmlwdCkpIHtcbiAgICAgICAgcmV0dXJuIHsgZGVzY3JpcHRvciwgaW5kZXg6IHVuZGVmaW5lZCB9O1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbnR5cGUgRGVzY3JpcHRvcldpdGhJbmRleCA9IHsgZGVzY3JpcHRvcjogRGVzY3JpcHRvcjsgaW5kZXg6IG51bWJlciB9O1xuXG4vKipcbiAqIEZpbmQgYSBkZXNjcmlwdG9yIGluIHRoZSBkZXNjcmlwdG9yIG1hcCB0aGF0IG1hdGNoZXMgdGhlIGdpdmVuIHNjcmlwdCBhbmQgZGVyaXZhdGlvbiBpbmRleC5cbiAqIEBwYXJhbSBzY3JpcHRcbiAqIEBwYXJhbSBpbmRleFxuICogQHBhcmFtIGRlc2NyaXB0b3JNYXBcbiAqIEByZXR1cm5zIERlc2NyaXB0b3JXaXRoSW5kZXggaWYgZm91bmQsIHVuZGVmaW5lZCBvdGhlcndpc2VcbiAqL1xuZnVuY3Rpb24gZmluZERlc2NyaXB0b3JGb3JEZXJpdmF0aW9uSW5kZXgoXG4gIHNjcmlwdDogQnVmZmVyLFxuICBpbmRleDogbnVtYmVyLFxuICBkZXNjcmlwdG9yTWFwOiBEZXNjcmlwdG9yTWFwXG4pOiBEZXNjcmlwdG9yV2l0aEluZGV4IHwgdW5kZWZpbmVkIHtcbiAgZm9yIChjb25zdCBkZXNjcmlwdG9yIG9mIGRlc2NyaXB0b3JNYXAudmFsdWVzKCkpIHtcbiAgICBpZiAoZGVzY3JpcHRvci5oYXNXaWxkY2FyZCgpICYmIEJ1ZmZlci5mcm9tKGRlc2NyaXB0b3IuYXREZXJpdmF0aW9uSW5kZXgoaW5kZXgpLnNjcmlwdFB1YmtleSgpKS5lcXVhbHMoc2NyaXB0KSkge1xuICAgICAgcmV0dXJuIHsgZGVzY3JpcHRvciwgaW5kZXggfTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBnZXREZXJpdmF0aW9uSW5kZXhGcm9tUGF0aChwYXRoOiBzdHJpbmcpOiBudW1iZXIge1xuICBjb25zdCBpbmRleFN0ciA9IHBhdGguc3BsaXQoJy8nKS5wb3AoKTtcbiAgaWYgKCFpbmRleFN0cikge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBkZXJpdmF0aW9uIHBhdGggJHtwYXRofWApO1xuICB9XG4gIGNvbnN0IGluZGV4ID0gcGFyc2VJbnQoaW5kZXhTdHIsIDEwKTtcbiAgaWYgKGluZGV4LnRvU3RyaW5nKCkgIT09IGluZGV4U3RyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGRlcml2YXRpb24gcGF0aCAke3BhdGh9YCk7XG4gIH1cbiAgcmV0dXJuIGluZGV4O1xufVxuXG4vKipcbiAqIFdyYXBwZXIgYXJvdW5kIGZpbmREZXNjcmlwdG9yRm9yRGVyaXZhdGlvblBhdGggdGhhdCB0cmllcyBtdWx0aXBsZSBkZXJpdmF0aW9uIHBhdGhzLlxuICogQHBhcmFtIHNjcmlwdFxuICogQHBhcmFtIGRlcml2YXRpb25QYXRoc1xuICogQHBhcmFtIGRlc2NyaXB0b3JNYXBcbiAqL1xuZnVuY3Rpb24gZmluZERlc2NyaXB0b3JGb3JBbnlEZXJpdmF0aW9uUGF0aChcbiAgc2NyaXB0OiBCdWZmZXIsXG4gIGRlcml2YXRpb25QYXRoczogc3RyaW5nW10sXG4gIGRlc2NyaXB0b3JNYXA6IERlc2NyaXB0b3JNYXBcbik6IERlc2NyaXB0b3JXaXRoSW5kZXggfCB1bmRlZmluZWQge1xuICBjb25zdCBkZXJpdmF0aW9uSW5kZXhTZXQgPSBuZXcgU2V0KGRlcml2YXRpb25QYXRocy5tYXAoKHApID0+IGdldERlcml2YXRpb25JbmRleEZyb21QYXRoKHApKSk7XG4gIGZvciAoY29uc3QgaW5kZXggb2YgWy4uLmRlcml2YXRpb25JbmRleFNldF0pIHtcbiAgICBjb25zdCBkZXNjID0gZmluZERlc2NyaXB0b3JGb3JEZXJpdmF0aW9uSW5kZXgoc2NyaXB0LCBpbmRleCwgZGVzY3JpcHRvck1hcCk7XG4gICAgaWYgKGRlc2MpIHtcbiAgICAgIHJldHVybiBkZXNjO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbnR5cGUgV2l0aEJpcDMyRGVyaXZhdGlvbiA9IHsgYmlwMzJEZXJpdmF0aW9uPzogeyBwYXRoOiBzdHJpbmcgfVtdIH07XG50eXBlIFdpdGhUYXBCaXAzMkRlcml2YXRpb24gPSB7IHRhcEJpcDMyRGVyaXZhdGlvbj86IHsgcGF0aDogc3RyaW5nIH1bXSB9O1xuXG5mdW5jdGlvbiBnZXREZXJpdmF0aW9uUGF0aHModjogV2l0aEJpcDMyRGVyaXZhdGlvbiB8IFdpdGhUYXBCaXAzMkRlcml2YXRpb24pOiBzdHJpbmdbXSB8IHVuZGVmaW5lZCB7XG4gIGlmICgnYmlwMzJEZXJpdmF0aW9uJyBpbiB2ICYmIHYuYmlwMzJEZXJpdmF0aW9uKSB7XG4gICAgcmV0dXJuIHYuYmlwMzJEZXJpdmF0aW9uLm1hcCgodikgPT4gdi5wYXRoKTtcbiAgfVxuICBpZiAoJ3RhcEJpcDMyRGVyaXZhdGlvbicgaW4gdiAmJiB2LnRhcEJpcDMyRGVyaXZhdGlvbikge1xuICAgIHJldHVybiB2LnRhcEJpcDMyRGVyaXZhdGlvbi5tYXAoKHYpID0+IHYucGF0aCkuZmlsdGVyKCh2KSA9PiB2ICE9PSAnJyAmJiB2ICE9PSAnbScpO1xuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogQHBhcmFtIGlucHV0XG4gKiBAcGFyYW0gZGVzY3JpcHRvck1hcFxuICogQHJldHVybnMgRGVzY3JpcHRvcldpdGhJbmRleCBmb3IgdGhlIGlucHV0IGlmIGZvdW5kLCB1bmRlZmluZWQgb3RoZXJ3aXNlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5kRGVzY3JpcHRvckZvcklucHV0KFxuICBpbnB1dDogUHNidElucHV0LFxuICBkZXNjcmlwdG9yTWFwOiBEZXNjcmlwdG9yTWFwXG4pOiBEZXNjcmlwdG9yV2l0aEluZGV4IHwgRGVzY3JpcHRvcldpdGhvdXRJbmRleCB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHNjcmlwdCA9IGlucHV0LndpdG5lc3NVdHhvPy5zY3JpcHQ7XG4gIGlmICghc2NyaXB0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIHNjcmlwdCcpO1xuICB9XG4gIGNvbnN0IGRlcml2YXRpb25QYXRocyA9IGdldERlcml2YXRpb25QYXRocyhpbnB1dCkgPz8gW107XG4gIHJldHVybiAoXG4gICAgZmluZERlc2NyaXB0b3JXaXRob3V0RGVyaXZhdGlvbihzY3JpcHQsIGRlc2NyaXB0b3JNYXApID8/XG4gICAgZmluZERlc2NyaXB0b3JGb3JBbnlEZXJpdmF0aW9uUGF0aChzY3JpcHQsIGRlcml2YXRpb25QYXRocywgZGVzY3JpcHRvck1hcClcbiAgKTtcbn1cblxuLyoqXG4gKiBAcGFyYW0gc2NyaXB0IC0gdGhlIG91dHB1dCBzY3JpcHRcbiAqIEBwYXJhbSBvdXRwdXQgLSB0aGUgUFNCVCBvdXRwdXRcbiAqIEBwYXJhbSBkZXNjcmlwdG9yTWFwXG4gKiBAcmV0dXJucyBEZXNjcmlwdG9yV2l0aEluZGV4IGZvciB0aGUgb3V0cHV0IGlmIGZvdW5kLCB1bmRlZmluZWQgb3RoZXJ3aXNlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5kRGVzY3JpcHRvckZvck91dHB1dChcbiAgc2NyaXB0OiBCdWZmZXIsXG4gIG91dHB1dDogUHNidE91dHB1dCxcbiAgZGVzY3JpcHRvck1hcDogRGVzY3JpcHRvck1hcFxuKTogRGVzY3JpcHRvcldpdGhJbmRleCB8IERlc2NyaXB0b3JXaXRob3V0SW5kZXggfCB1bmRlZmluZWQge1xuICBjb25zdCBkZXJpdmF0aW9uUGF0aHMgPSBnZXREZXJpdmF0aW9uUGF0aHMob3V0cHV0KTtcbiAgcmV0dXJuIChcbiAgICBmaW5kRGVzY3JpcHRvcldpdGhvdXREZXJpdmF0aW9uKHNjcmlwdCwgZGVzY3JpcHRvck1hcCkgPz9cbiAgICAoZGVyaXZhdGlvblBhdGhzID09PSB1bmRlZmluZWRcbiAgICAgID8gdW5kZWZpbmVkXG4gICAgICA6IGZpbmREZXNjcmlwdG9yRm9yQW55RGVyaXZhdGlvblBhdGgoc2NyaXB0LCBkZXJpdmF0aW9uUGF0aHMsIGRlc2NyaXB0b3JNYXApKVxuICApO1xufVxuIl19
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/descriptor/psbt/index.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAC;AACpC,cAAc,cAAc,CAAC;AAC7B,cAAc,SAAS,CAAC;AACxB,cAAc,mBAAmB,CAAC;AAClC,cAAc,QAAQ,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/descriptor/psbt/index.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAC;AACpC,cAAc,cAAc,CAAC;AAC7B,cAAc,SAAS,CAAC;AACxB,cAAc,mBAAmB,CAAC;AAClC,cAAc,QAAQ,CAAC;AACvB,cAAc,QAAQ,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export * from './assertSatisfiable';
|
|
2
|
+
export * from './createPsbt';
|
|
3
|
+
export * from './parse';
|
|
4
|
+
export * from './findDescriptors';
|
|
5
|
+
export * from './wrap';
|
|
6
|
+
export * from './sign';
|
|
7
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvZGVzY3JpcHRvci9wc2J0L2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMscUJBQXFCLENBQUM7QUFDcEMsY0FBYyxjQUFjLENBQUM7QUFDN0IsY0FBYyxTQUFTLENBQUM7QUFDeEIsY0FBYyxtQkFBbUIsQ0FBQztBQUNsQyxjQUFjLFFBQVEsQ0FBQztBQUN2QixjQUFjLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vYXNzZXJ0U2F0aXNmaWFibGUnO1xuZXhwb3J0ICogZnJvbSAnLi9jcmVhdGVQc2J0JztcbmV4cG9ydCAqIGZyb20gJy4vcGFyc2UnO1xuZXhwb3J0ICogZnJvbSAnLi9maW5kRGVzY3JpcHRvcnMnO1xuZXhwb3J0ICogZnJvbSAnLi93cmFwJztcbmV4cG9ydCAqIGZyb20gJy4vc2lnbic7XG4iXX0=
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { Descriptor } from '@bitgo/wasm-utxo';
|
|
2
|
+
import * as utxolib from '@bitgo-beta/utxo-lib';
|
|
3
|
+
import { DescriptorMap } from '../DescriptorMap';
|
|
4
|
+
export type ScriptId = {
|
|
5
|
+
descriptor: Descriptor;
|
|
6
|
+
index: number | undefined;
|
|
7
|
+
};
|
|
8
|
+
export type ParsedInput = {
|
|
9
|
+
address: string;
|
|
10
|
+
value: bigint;
|
|
11
|
+
scriptId: ScriptId;
|
|
12
|
+
};
|
|
13
|
+
export type ParsedOutput = {
|
|
14
|
+
address?: string;
|
|
15
|
+
script: Buffer;
|
|
16
|
+
value: bigint;
|
|
17
|
+
scriptId?: ScriptId;
|
|
18
|
+
};
|
|
19
|
+
export type ParsedDescriptorTransaction = {
|
|
20
|
+
inputs: ParsedInput[];
|
|
21
|
+
outputs: ParsedOutput[];
|
|
22
|
+
spendAmount: bigint;
|
|
23
|
+
minerFee: bigint;
|
|
24
|
+
virtualSize: number;
|
|
25
|
+
};
|
|
26
|
+
export declare function parse(psbt: utxolib.Psbt, descriptorMap: DescriptorMap, network: utxolib.Network): ParsedDescriptorTransaction;
|
|
27
|
+
//# sourceMappingURL=parse.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse.d.ts","sourceRoot":"","sources":["../../../../src/descriptor/psbt/parse.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,KAAK,OAAO,MAAM,sBAAsB,CAAC;AAEhD,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAMjD,MAAM,MAAM,QAAQ,GAAG;IAAE,UAAU,EAAE,UAAU,CAAC;IAAC,KAAK,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,CAAC;AAE7E,MAAM,MAAM,WAAW,GAAG;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,QAAQ,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,QAAQ,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,2BAA2B,GAAG;IACxC,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC;AAMF,wBAAgB,KAAK,CACnB,IAAI,EAAE,OAAO,CAAC,IAAI,EAClB,aAAa,EAAE,aAAa,EAC5B,OAAO,EAAE,OAAO,CAAC,OAAO,GACvB,2BAA2B,CA0C7B"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import * as utxolib from '@bitgo-beta/utxo-lib';
|
|
2
|
+
import { getVirtualSize } from '../VirtualSize';
|
|
3
|
+
import { findDescriptorForInput, findDescriptorForOutput } from './findDescriptors';
|
|
4
|
+
import { assertSatisfiable } from './assertSatisfiable';
|
|
5
|
+
function sum(...values) {
|
|
6
|
+
return values.reduce((a, b) => a + b, BigInt(0));
|
|
7
|
+
}
|
|
8
|
+
export function parse(psbt, descriptorMap, network) {
|
|
9
|
+
const inputs = psbt.data.inputs.map((input, inputIndex) => {
|
|
10
|
+
if (!input.witnessUtxo) {
|
|
11
|
+
throw new Error('invalid input: no witnessUtxo');
|
|
12
|
+
}
|
|
13
|
+
if (!input.witnessUtxo.value) {
|
|
14
|
+
throw new Error('invalid input: no value');
|
|
15
|
+
}
|
|
16
|
+
const scriptId = findDescriptorForInput(input, descriptorMap);
|
|
17
|
+
if (!scriptId) {
|
|
18
|
+
throw new Error('invalid input: no descriptor found');
|
|
19
|
+
}
|
|
20
|
+
assertSatisfiable(psbt, inputIndex, scriptId.descriptor);
|
|
21
|
+
return {
|
|
22
|
+
address: utxolib.address.fromOutputScript(input.witnessUtxo.script, network),
|
|
23
|
+
value: input.witnessUtxo.value,
|
|
24
|
+
scriptId,
|
|
25
|
+
};
|
|
26
|
+
});
|
|
27
|
+
const outputs = psbt.txOutputs.map((output, i) => {
|
|
28
|
+
if (output.value === undefined) {
|
|
29
|
+
throw new Error('invalid output: no value');
|
|
30
|
+
}
|
|
31
|
+
const scriptId = findDescriptorForOutput(output.script, psbt.data.outputs[i], descriptorMap);
|
|
32
|
+
return {
|
|
33
|
+
address: output.address,
|
|
34
|
+
script: output.script,
|
|
35
|
+
value: output.value,
|
|
36
|
+
scriptId,
|
|
37
|
+
};
|
|
38
|
+
});
|
|
39
|
+
const inputAmount = sum(...inputs.map((input) => input.value));
|
|
40
|
+
const outputSum = sum(...outputs.map((output) => output.value));
|
|
41
|
+
const spendAmount = sum(...outputs.filter((output) => !output.scriptId).map((output) => output.value));
|
|
42
|
+
const minerFee = inputAmount - outputSum;
|
|
43
|
+
return {
|
|
44
|
+
inputs,
|
|
45
|
+
outputs,
|
|
46
|
+
spendAmount,
|
|
47
|
+
minerFee,
|
|
48
|
+
virtualSize: getVirtualSize({ inputs: inputs.map((i) => i.scriptId.descriptor), outputs }),
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvZGVzY3JpcHRvci9wc2J0L3BhcnNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sS0FBSyxPQUFPLE1BQU0sc0JBQXNCLENBQUM7QUFHaEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRWhELE9BQU8sRUFBRSxzQkFBc0IsRUFBRSx1QkFBdUIsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ3BGLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBeUJ4RCxTQUFTLEdBQUcsQ0FBQyxHQUFHLE1BQWdCO0lBQzlCLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbkQsQ0FBQztBQUVELE1BQU0sVUFBVSxLQUFLLENBQ25CLElBQWtCLEVBQ2xCLGFBQTRCLEVBQzVCLE9BQXdCO0lBRXhCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxVQUFVLEVBQWUsRUFBRTtRQUNyRSxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3ZCLE1BQU0sSUFBSSxLQUFLLENBQUMsK0JBQStCLENBQUMsQ0FBQztRQUNuRCxDQUFDO1FBQ0QsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDN0IsTUFBTSxJQUFJLEtBQUssQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO1FBQzdDLENBQUM7UUFDRCxNQUFNLFFBQVEsR0FBRyxzQkFBc0IsQ0FBQyxLQUFLLEVBQUUsYUFBYSxDQUFDLENBQUM7UUFDOUQsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2QsTUFBTSxJQUFJLEtBQUssQ0FBQyxvQ0FBb0MsQ0FBQyxDQUFDO1FBQ3hELENBQUM7UUFDRCxpQkFBaUIsQ0FBQyxJQUFJLEVBQUUsVUFBVSxFQUFFLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUN6RCxPQUFPO1lBQ0wsT0FBTyxFQUFFLE9BQU8sQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDO1lBQzVFLEtBQUssRUFBRSxLQUFLLENBQUMsV0FBVyxDQUFDLEtBQUs7WUFDOUIsUUFBUTtTQUNULENBQUM7SUFDSixDQUFDLENBQUMsQ0FBQztJQUNILE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBZ0IsRUFBRTtRQUM3RCxJQUFJLE1BQU0sQ0FBQyxLQUFLLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDL0IsTUFBTSxJQUFJLEtBQUssQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO1FBQzlDLENBQUM7UUFDRCxNQUFNLFFBQVEsR0FBRyx1QkFBdUIsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLGFBQWEsQ0FBQyxDQUFDO1FBQzdGLE9BQU87WUFDTCxPQUFPLEVBQUUsTUFBTSxDQUFDLE9BQU87WUFDdkIsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNO1lBQ3JCLEtBQUssRUFBRSxNQUFNLENBQUMsS0FBSztZQUNuQixRQUFRO1NBQ1QsQ0FBQztJQUNKLENBQUMsQ0FBQyxDQUFDO0lBQ0gsTUFBTSxXQUFXLEdBQUcsR0FBRyxDQUFDLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDL0QsTUFBTSxTQUFTLEdBQUcsR0FBRyxDQUFDLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDaEUsTUFBTSxXQUFXLEdBQUcsR0FBRyxDQUFDLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUN2RyxNQUFNLFFBQVEsR0FBRyxXQUFXLEdBQUcsU0FBUyxDQUFDO0lBQ3pDLE9BQU87UUFDTCxNQUFNO1FBQ04sT0FBTztRQUNQLFdBQVc7UUFDWCxRQUFRO1FBQ1IsV0FBVyxFQUFFLGNBQWMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxFQUFFLE9BQU8sRUFBRSxDQUFDO0tBQzNGLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGVzY3JpcHRvciB9IGZyb20gJ0BiaXRnby93YXNtLXV0eG8nO1xuaW1wb3J0ICogYXMgdXR4b2xpYiBmcm9tICdAYml0Z28tYmV0YS91dHhvLWxpYic7XG5cbmltcG9ydCB7IERlc2NyaXB0b3JNYXAgfSBmcm9tICcuLi9EZXNjcmlwdG9yTWFwJztcbmltcG9ydCB7IGdldFZpcnR1YWxTaXplIH0gZnJvbSAnLi4vVmlydHVhbFNpemUnO1xuXG5pbXBvcnQgeyBmaW5kRGVzY3JpcHRvckZvcklucHV0LCBmaW5kRGVzY3JpcHRvckZvck91dHB1dCB9IGZyb20gJy4vZmluZERlc2NyaXB0b3JzJztcbmltcG9ydCB7IGFzc2VydFNhdGlzZmlhYmxlIH0gZnJvbSAnLi9hc3NlcnRTYXRpc2ZpYWJsZSc7XG5cbmV4cG9ydCB0eXBlIFNjcmlwdElkID0geyBkZXNjcmlwdG9yOiBEZXNjcmlwdG9yOyBpbmRleDogbnVtYmVyIHwgdW5kZWZpbmVkIH07XG5cbmV4cG9ydCB0eXBlIFBhcnNlZElucHV0ID0ge1xuICBhZGRyZXNzOiBzdHJpbmc7XG4gIHZhbHVlOiBiaWdpbnQ7XG4gIHNjcmlwdElkOiBTY3JpcHRJZDtcbn07XG5cbmV4cG9ydCB0eXBlIFBhcnNlZE91dHB1dCA9IHtcbiAgYWRkcmVzcz86IHN0cmluZztcbiAgc2NyaXB0OiBCdWZmZXI7XG4gIHZhbHVlOiBiaWdpbnQ7XG4gIHNjcmlwdElkPzogU2NyaXB0SWQ7XG59O1xuXG5leHBvcnQgdHlwZSBQYXJzZWREZXNjcmlwdG9yVHJhbnNhY3Rpb24gPSB7XG4gIGlucHV0czogUGFyc2VkSW5wdXRbXTtcbiAgb3V0cHV0czogUGFyc2VkT3V0cHV0W107XG4gIHNwZW5kQW1vdW50OiBiaWdpbnQ7XG4gIG1pbmVyRmVlOiBiaWdpbnQ7XG4gIHZpcnR1YWxTaXplOiBudW1iZXI7XG59O1xuXG5mdW5jdGlvbiBzdW0oLi4udmFsdWVzOiBiaWdpbnRbXSk6IGJpZ2ludCB7XG4gIHJldHVybiB2YWx1ZXMucmVkdWNlKChhLCBiKSA9PiBhICsgYiwgQmlnSW50KDApKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlKFxuICBwc2J0OiB1dHhvbGliLlBzYnQsXG4gIGRlc2NyaXB0b3JNYXA6IERlc2NyaXB0b3JNYXAsXG4gIG5ldHdvcms6IHV0eG9saWIuTmV0d29ya1xuKTogUGFyc2VkRGVzY3JpcHRvclRyYW5zYWN0aW9uIHtcbiAgY29uc3QgaW5wdXRzID0gcHNidC5kYXRhLmlucHV0cy5tYXAoKGlucHV0LCBpbnB1dEluZGV4KTogUGFyc2VkSW5wdXQgPT4ge1xuICAgIGlmICghaW5wdXQud2l0bmVzc1V0eG8pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBpbnB1dDogbm8gd2l0bmVzc1V0eG8nKTtcbiAgICB9XG4gICAgaWYgKCFpbnB1dC53aXRuZXNzVXR4by52YWx1ZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGlucHV0OiBubyB2YWx1ZScpO1xuICAgIH1cbiAgICBjb25zdCBzY3JpcHRJZCA9IGZpbmREZXNjcmlwdG9yRm9ySW5wdXQoaW5wdXQsIGRlc2NyaXB0b3JNYXApO1xuICAgIGlmICghc2NyaXB0SWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBpbnB1dDogbm8gZGVzY3JpcHRvciBmb3VuZCcpO1xuICAgIH1cbiAgICBhc3NlcnRTYXRpc2ZpYWJsZShwc2J0LCBpbnB1dEluZGV4LCBzY3JpcHRJZC5kZXNjcmlwdG9yKTtcbiAgICByZXR1cm4ge1xuICAgICAgYWRkcmVzczogdXR4b2xpYi5hZGRyZXNzLmZyb21PdXRwdXRTY3JpcHQoaW5wdXQud2l0bmVzc1V0eG8uc2NyaXB0LCBuZXR3b3JrKSxcbiAgICAgIHZhbHVlOiBpbnB1dC53aXRuZXNzVXR4by52YWx1ZSxcbiAgICAgIHNjcmlwdElkLFxuICAgIH07XG4gIH0pO1xuICBjb25zdCBvdXRwdXRzID0gcHNidC50eE91dHB1dHMubWFwKChvdXRwdXQsIGkpOiBQYXJzZWRPdXRwdXQgPT4ge1xuICAgIGlmIChvdXRwdXQudmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIG91dHB1dDogbm8gdmFsdWUnKTtcbiAgICB9XG4gICAgY29uc3Qgc2NyaXB0SWQgPSBmaW5kRGVzY3JpcHRvckZvck91dHB1dChvdXRwdXQuc2NyaXB0LCBwc2J0LmRhdGEub3V0cHV0c1tpXSwgZGVzY3JpcHRvck1hcCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGFkZHJlc3M6IG91dHB1dC5hZGRyZXNzLFxuICAgICAgc2NyaXB0OiBvdXRwdXQuc2NyaXB0LFxuICAgICAgdmFsdWU6IG91dHB1dC52YWx1ZSxcbiAgICAgIHNjcmlwdElkLFxuICAgIH07XG4gIH0pO1xuICBjb25zdCBpbnB1dEFtb3VudCA9IHN1bSguLi5pbnB1dHMubWFwKChpbnB1dCkgPT4gaW5wdXQudmFsdWUpKTtcbiAgY29uc3Qgb3V0cHV0U3VtID0gc3VtKC4uLm91dHB1dHMubWFwKChvdXRwdXQpID0+IG91dHB1dC52YWx1ZSkpO1xuICBjb25zdCBzcGVuZEFtb3VudCA9IHN1bSguLi5vdXRwdXRzLmZpbHRlcigob3V0cHV0KSA9PiAhb3V0cHV0LnNjcmlwdElkKS5tYXAoKG91dHB1dCkgPT4gb3V0cHV0LnZhbHVlKSk7XG4gIGNvbnN0IG1pbmVyRmVlID0gaW5wdXRBbW91bnQgLSBvdXRwdXRTdW07XG4gIHJldHVybiB7XG4gICAgaW5wdXRzLFxuICAgIG91dHB1dHMsXG4gICAgc3BlbmRBbW91bnQsXG4gICAgbWluZXJGZWUsXG4gICAgdmlydHVhbFNpemU6IGdldFZpcnR1YWxTaXplKHsgaW5wdXRzOiBpbnB1dHMubWFwKChpKSA9PiBpLnNjcmlwdElkLmRlc2NyaXB0b3IpLCBvdXRwdXRzIH0pLFxuICB9O1xufVxuIl19
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { BIP32Interface, ECPairInterface } from '@bitgo-beta/secp256k1';
|
|
2
|
+
import { Psbt as WasmPsbt } from '@bitgo/wasm-utxo';
|
|
3
|
+
/** These can be replaced when @bitgo/wasm-utxo is updated */
|
|
4
|
+
export type SignPsbtInputResult = {
|
|
5
|
+
Schnorr: string[];
|
|
6
|
+
} | {
|
|
7
|
+
Ecdsa: string[];
|
|
8
|
+
};
|
|
9
|
+
export type SignPsbtResult = {
|
|
10
|
+
[inputIndex: number]: SignPsbtInputResult;
|
|
11
|
+
};
|
|
12
|
+
/**
|
|
13
|
+
* @param signResult
|
|
14
|
+
* @return the number of new signatures created by the signResult for a single input
|
|
15
|
+
*/
|
|
16
|
+
export declare function getNewSignatureCountForInput(signResult: SignPsbtInputResult): number;
|
|
17
|
+
/**
|
|
18
|
+
* @param signResult
|
|
19
|
+
* @return the number of new signatures created by the signResult
|
|
20
|
+
*/
|
|
21
|
+
export declare function getNewSignatureCount(signResult: SignPsbtResult): number;
|
|
22
|
+
type Key = Buffer | BIP32Interface | ECPairInterface;
|
|
23
|
+
/** Convenience function to sign a PSBT with a key */
|
|
24
|
+
export declare function signWithKey(psbt: WasmPsbt, key: Key): SignPsbtResult;
|
|
25
|
+
export {};
|
|
26
|
+
//# sourceMappingURL=sign.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sign.d.ts","sourceRoot":"","sources":["../../../../src/descriptor/psbt/sign.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxE,OAAO,EAAE,IAAI,IAAI,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAEpD,6DAA6D;AAC7D,MAAM,MAAM,mBAAmB,GAAG;IAAE,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE,GAAG;IAAE,KAAK,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC;AAC9E,MAAM,MAAM,cAAc,GAAG;IAC3B,CAAC,UAAU,EAAE,MAAM,GAAG,mBAAmB,CAAC;CAC3C,CAAC;AAEF;;;GAGG;AACH,wBAAgB,4BAA4B,CAAC,UAAU,EAAE,mBAAmB,GAAG,MAAM,CAQpF;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,cAAc,GAAG,MAAM,CAEvE;AAED,KAAK,GAAG,GAAG,MAAM,GAAG,cAAc,GAAG,eAAe,CAAC;AAErD,qDAAqD;AACrD,wBAAgB,WAAW,CAAC,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAG,GAAG,cAAc,CAUpE"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import assert from 'assert';
|
|
2
|
+
/**
|
|
3
|
+
* @param signResult
|
|
4
|
+
* @return the number of new signatures created by the signResult for a single input
|
|
5
|
+
*/
|
|
6
|
+
export function getNewSignatureCountForInput(signResult) {
|
|
7
|
+
if ('Schnorr' in signResult) {
|
|
8
|
+
return signResult.Schnorr.length;
|
|
9
|
+
}
|
|
10
|
+
if ('Ecdsa' in signResult) {
|
|
11
|
+
return signResult.Ecdsa.length;
|
|
12
|
+
}
|
|
13
|
+
throw new Error(`Unknown signature type ${Object.keys(signResult).join(', ')}`);
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* @param signResult
|
|
17
|
+
* @return the number of new signatures created by the signResult
|
|
18
|
+
*/
|
|
19
|
+
export function getNewSignatureCount(signResult) {
|
|
20
|
+
return Object.values(signResult).reduce((sum, signatures) => sum + getNewSignatureCountForInput(signatures), 0);
|
|
21
|
+
}
|
|
22
|
+
/** Convenience function to sign a PSBT with a key */
|
|
23
|
+
export function signWithKey(psbt, key) {
|
|
24
|
+
// we need to do casting here because the type definitions in wasm-miniscript are a little bit buggy
|
|
25
|
+
if (Buffer.isBuffer(key)) {
|
|
26
|
+
return psbt.signWithPrv(key);
|
|
27
|
+
}
|
|
28
|
+
if ('toBase58' in key) {
|
|
29
|
+
return psbt.signWithXprv(key.toBase58());
|
|
30
|
+
}
|
|
31
|
+
assert(key.privateKey);
|
|
32
|
+
return psbt.signWithPrv(key.privateKey);
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lnbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9kZXNjcmlwdG9yL3BzYnQvc2lnbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLE1BQU0sTUFBTSxRQUFRLENBQUM7QUFXNUI7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLDRCQUE0QixDQUFDLFVBQStCO0lBQzFFLElBQUksU0FBUyxJQUFJLFVBQVUsRUFBRSxDQUFDO1FBQzVCLE9BQU8sVUFBVSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUM7SUFDbkMsQ0FBQztJQUNELElBQUksT0FBTyxJQUFJLFVBQVUsRUFBRSxDQUFDO1FBQzFCLE9BQU8sVUFBVSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUM7SUFDakMsQ0FBQztJQUNELE1BQU0sSUFBSSxLQUFLLENBQUMsMEJBQTBCLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNsRixDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLG9CQUFvQixDQUFDLFVBQTBCO0lBQzdELE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsVUFBVSxFQUFFLEVBQUUsQ0FBQyxHQUFHLEdBQUcsNEJBQTRCLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDbEgsQ0FBQztBQUlELHFEQUFxRDtBQUNyRCxNQUFNLFVBQVUsV0FBVyxDQUFDLElBQWMsRUFBRSxHQUFRO0lBQ2xELG9HQUFvRztJQUNwRyxJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUN6QixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUE4QixDQUFDO0lBQzVELENBQUM7SUFDRCxJQUFJLFVBQVUsSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUN0QixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxDQUE4QixDQUFDO0lBQ3hFLENBQUM7SUFDRCxNQUFNLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ3ZCLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUE4QixDQUFDO0FBQ3ZFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5cbmltcG9ydCB7IEJJUDMySW50ZXJmYWNlLCBFQ1BhaXJJbnRlcmZhY2UgfSBmcm9tICdAYml0Z28tYmV0YS9zZWNwMjU2azEnO1xuaW1wb3J0IHsgUHNidCBhcyBXYXNtUHNidCB9IGZyb20gJ0BiaXRnby93YXNtLXV0eG8nO1xuXG4vKiogVGhlc2UgY2FuIGJlIHJlcGxhY2VkIHdoZW4gQGJpdGdvL3dhc20tdXR4byBpcyB1cGRhdGVkICovXG5leHBvcnQgdHlwZSBTaWduUHNidElucHV0UmVzdWx0ID0geyBTY2hub3JyOiBzdHJpbmdbXSB9IHwgeyBFY2RzYTogc3RyaW5nW10gfTtcbmV4cG9ydCB0eXBlIFNpZ25Qc2J0UmVzdWx0ID0ge1xuICBbaW5wdXRJbmRleDogbnVtYmVyXTogU2lnblBzYnRJbnB1dFJlc3VsdDtcbn07XG5cbi8qKlxuICogQHBhcmFtIHNpZ25SZXN1bHRcbiAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBuZXcgc2lnbmF0dXJlcyBjcmVhdGVkIGJ5IHRoZSBzaWduUmVzdWx0IGZvciBhIHNpbmdsZSBpbnB1dFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TmV3U2lnbmF0dXJlQ291bnRGb3JJbnB1dChzaWduUmVzdWx0OiBTaWduUHNidElucHV0UmVzdWx0KTogbnVtYmVyIHtcbiAgaWYgKCdTY2hub3JyJyBpbiBzaWduUmVzdWx0KSB7XG4gICAgcmV0dXJuIHNpZ25SZXN1bHQuU2Nobm9yci5sZW5ndGg7XG4gIH1cbiAgaWYgKCdFY2RzYScgaW4gc2lnblJlc3VsdCkge1xuICAgIHJldHVybiBzaWduUmVzdWx0LkVjZHNhLmxlbmd0aDtcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gc2lnbmF0dXJlIHR5cGUgJHtPYmplY3Qua2V5cyhzaWduUmVzdWx0KS5qb2luKCcsICcpfWApO1xufVxuXG4vKipcbiAqIEBwYXJhbSBzaWduUmVzdWx0XG4gKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgbmV3IHNpZ25hdHVyZXMgY3JlYXRlZCBieSB0aGUgc2lnblJlc3VsdFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TmV3U2lnbmF0dXJlQ291bnQoc2lnblJlc3VsdDogU2lnblBzYnRSZXN1bHQpOiBudW1iZXIge1xuICByZXR1cm4gT2JqZWN0LnZhbHVlcyhzaWduUmVzdWx0KS5yZWR1Y2UoKHN1bSwgc2lnbmF0dXJlcykgPT4gc3VtICsgZ2V0TmV3U2lnbmF0dXJlQ291bnRGb3JJbnB1dChzaWduYXR1cmVzKSwgMCk7XG59XG5cbnR5cGUgS2V5ID0gQnVmZmVyIHwgQklQMzJJbnRlcmZhY2UgfCBFQ1BhaXJJbnRlcmZhY2U7XG5cbi8qKiBDb252ZW5pZW5jZSBmdW5jdGlvbiB0byBzaWduIGEgUFNCVCB3aXRoIGEga2V5ICovXG5leHBvcnQgZnVuY3Rpb24gc2lnbldpdGhLZXkocHNidDogV2FzbVBzYnQsIGtleTogS2V5KTogU2lnblBzYnRSZXN1bHQge1xuICAvLyB3ZSBuZWVkIHRvIGRvIGNhc3RpbmcgaGVyZSBiZWNhdXNlIHRoZSB0eXBlIGRlZmluaXRpb25zIGluIHdhc20tbWluaXNjcmlwdCBhcmUgYSBsaXR0bGUgYml0IGJ1Z2d5XG4gIGlmIChCdWZmZXIuaXNCdWZmZXIoa2V5KSkge1xuICAgIHJldHVybiBwc2J0LnNpZ25XaXRoUHJ2KGtleSkgYXMgdW5rbm93biBhcyBTaWduUHNidFJlc3VsdDtcbiAgfVxuICBpZiAoJ3RvQmFzZTU4JyBpbiBrZXkpIHtcbiAgICByZXR1cm4gcHNidC5zaWduV2l0aFhwcnYoa2V5LnRvQmFzZTU4KCkpIGFzIHVua25vd24gYXMgU2lnblBzYnRSZXN1bHQ7XG4gIH1cbiAgYXNzZXJ0KGtleS5wcml2YXRlS2V5KTtcbiAgcmV0dXJuIHBzYnQuc2lnbldpdGhQcnYoa2V5LnByaXZhdGVLZXkpIGFzIHVua25vd24gYXMgU2lnblBzYnRSZXN1bHQ7XG59XG4iXX0=
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { Psbt as WasmPsbt } from '@bitgo/wasm-utxo';
|
|
2
|
+
import * as utxolib from '@bitgo-beta/utxo-lib';
|
|
3
|
+
export declare function toWrappedPsbt(psbt: utxolib.bitgo.UtxoPsbt | utxolib.Psbt | Buffer | Uint8Array): WasmPsbt;
|
|
4
|
+
export declare function toUtxoPsbt(psbt: WasmPsbt | Buffer | Uint8Array, network: utxolib.Network): utxolib.bitgo.UtxoPsbt;
|
|
5
|
+
/**
|
|
6
|
+
* Use `wasm-miniscript` to finalize a PSBT.
|
|
7
|
+
* Miniscript based finalization is more powerful than bitcoinjs-lib's / utxo-lib's finalization
|
|
8
|
+
* and can finalize more complex scripts (e.g. miniscript descriptors).
|
|
9
|
+
* @param psbt
|
|
10
|
+
*/
|
|
11
|
+
export declare function finalizePsbt(psbt: utxolib.bitgo.UtxoPsbt): void;
|
|
12
|
+
//# sourceMappingURL=wrap.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wrap.d.ts","sourceRoot":"","sources":["../../../../src/descriptor/psbt/wrap.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,IAAI,QAAQ,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"wrap.d.ts","sourceRoot":"","sources":["../../../../src/descriptor/psbt/wrap.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,IAAI,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,KAAK,OAAO,MAAM,sBAAsB,CAAC;AAEhD,wBAAgB,aAAa,CAAC,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,QAAQ,GAAG,OAAO,CAAC,IAAI,GAAG,MAAM,GAAG,UAAU,GAAG,QAAQ,CAQzG;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,UAAU,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,QAAQ,CAQjH;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,QAAQ,GAAG,IAAI,CAU/D"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { Psbt as WasmPsbt } from '@bitgo/wasm-utxo';
|
|
2
|
+
import * as utxolib from '@bitgo-beta/utxo-lib';
|
|
3
|
+
export function toWrappedPsbt(psbt) {
|
|
4
|
+
if (psbt instanceof utxolib.bitgo.UtxoPsbt || psbt instanceof utxolib.Psbt) {
|
|
5
|
+
psbt = psbt.toBuffer();
|
|
6
|
+
}
|
|
7
|
+
if (psbt instanceof Buffer || psbt instanceof Uint8Array) {
|
|
8
|
+
return WasmPsbt.deserialize(psbt);
|
|
9
|
+
}
|
|
10
|
+
throw new Error('Invalid input');
|
|
11
|
+
}
|
|
12
|
+
export function toUtxoPsbt(psbt, network) {
|
|
13
|
+
if (psbt instanceof WasmPsbt) {
|
|
14
|
+
psbt = psbt.serialize();
|
|
15
|
+
}
|
|
16
|
+
if (psbt instanceof Buffer || psbt instanceof Uint8Array) {
|
|
17
|
+
return utxolib.bitgo.UtxoPsbt.fromBuffer(Buffer.from(psbt), { network });
|
|
18
|
+
}
|
|
19
|
+
throw new Error('Invalid input');
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Use `wasm-miniscript` to finalize a PSBT.
|
|
23
|
+
* Miniscript based finalization is more powerful than bitcoinjs-lib's / utxo-lib's finalization
|
|
24
|
+
* and can finalize more complex scripts (e.g. miniscript descriptors).
|
|
25
|
+
* @param psbt
|
|
26
|
+
*/
|
|
27
|
+
export function finalizePsbt(psbt) {
|
|
28
|
+
if (utxolib.getMainnet(psbt.network) !== utxolib.networks.bitcoin) {
|
|
29
|
+
throw new Error('only bitcoin and testnet are supported');
|
|
30
|
+
}
|
|
31
|
+
const wrappedPsbt = toWrappedPsbt(psbt);
|
|
32
|
+
wrappedPsbt.finalize();
|
|
33
|
+
const unwrappedPsbt = toUtxoPsbt(wrappedPsbt, psbt.network);
|
|
34
|
+
for (let i = 0; i < psbt.data.inputs.length; i++) {
|
|
35
|
+
psbt.data.inputs[i] = unwrappedPsbt.data.inputs[i];
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid3JhcC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9kZXNjcmlwdG9yL3BzYnQvd3JhcC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsSUFBSSxJQUFJLFFBQVEsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ3BELE9BQU8sS0FBSyxPQUFPLE1BQU0sc0JBQXNCLENBQUM7QUFFaEQsTUFBTSxVQUFVLGFBQWEsQ0FBQyxJQUFpRTtJQUM3RixJQUFJLElBQUksWUFBWSxPQUFPLENBQUMsS0FBSyxDQUFDLFFBQVEsSUFBSSxJQUFJLFlBQVksT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQzNFLElBQUksR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDekIsQ0FBQztJQUNELElBQUksSUFBSSxZQUFZLE1BQU0sSUFBSSxJQUFJLFlBQVksVUFBVSxFQUFFLENBQUM7UUFDekQsT0FBTyxRQUFRLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3BDLENBQUM7SUFDRCxNQUFNLElBQUksS0FBSyxDQUFDLGVBQWUsQ0FBQyxDQUFDO0FBQ25DLENBQUM7QUFFRCxNQUFNLFVBQVUsVUFBVSxDQUFDLElBQW9DLEVBQUUsT0FBd0I7SUFDdkYsSUFBSSxJQUFJLFlBQVksUUFBUSxFQUFFLENBQUM7UUFDN0IsSUFBSSxHQUFHLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztJQUMxQixDQUFDO0lBQ0QsSUFBSSxJQUFJLFlBQVksTUFBTSxJQUFJLElBQUksWUFBWSxVQUFVLEVBQUUsQ0FBQztRQUN6RCxPQUFPLE9BQU8sQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQztJQUMzRSxDQUFDO0lBQ0QsTUFBTSxJQUFJLEtBQUssQ0FBQyxlQUFlLENBQUMsQ0FBQztBQUNuQyxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsWUFBWSxDQUFDLElBQTRCO0lBQ3ZELElBQUksT0FBTyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssT0FBTyxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNsRSxNQUFNLElBQUksS0FBSyxDQUFDLHdDQUF3QyxDQUFDLENBQUM7SUFDNUQsQ0FBQztJQUNELE1BQU0sV0FBVyxHQUFHLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN4QyxXQUFXLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDdkIsTUFBTSxhQUFhLEdBQUcsVUFBVSxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDNUQsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQ2pELElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLGFBQWEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3JELENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUHNidCBhcyBXYXNtUHNidCB9IGZyb20gJ0BiaXRnby93YXNtLXV0eG8nO1xuaW1wb3J0ICogYXMgdXR4b2xpYiBmcm9tICdAYml0Z28tYmV0YS91dHhvLWxpYic7XG5cbmV4cG9ydCBmdW5jdGlvbiB0b1dyYXBwZWRQc2J0KHBzYnQ6IHV0eG9saWIuYml0Z28uVXR4b1BzYnQgfCB1dHhvbGliLlBzYnQgfCBCdWZmZXIgfCBVaW50OEFycmF5KTogV2FzbVBzYnQge1xuICBpZiAocHNidCBpbnN0YW5jZW9mIHV0eG9saWIuYml0Z28uVXR4b1BzYnQgfHwgcHNidCBpbnN0YW5jZW9mIHV0eG9saWIuUHNidCkge1xuICAgIHBzYnQgPSBwc2J0LnRvQnVmZmVyKCk7XG4gIH1cbiAgaWYgKHBzYnQgaW5zdGFuY2VvZiBCdWZmZXIgfHwgcHNidCBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIHtcbiAgICByZXR1cm4gV2FzbVBzYnQuZGVzZXJpYWxpemUocHNidCk7XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGlucHV0Jyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0b1V0eG9Qc2J0KHBzYnQ6IFdhc21Qc2J0IHwgQnVmZmVyIHwgVWludDhBcnJheSwgbmV0d29yazogdXR4b2xpYi5OZXR3b3JrKTogdXR4b2xpYi5iaXRnby5VdHhvUHNidCB7XG4gIGlmIChwc2J0IGluc3RhbmNlb2YgV2FzbVBzYnQpIHtcbiAgICBwc2J0ID0gcHNidC5zZXJpYWxpemUoKTtcbiAgfVxuICBpZiAocHNidCBpbnN0YW5jZW9mIEJ1ZmZlciB8fCBwc2J0IGluc3RhbmNlb2YgVWludDhBcnJheSkge1xuICAgIHJldHVybiB1dHhvbGliLmJpdGdvLlV0eG9Qc2J0LmZyb21CdWZmZXIoQnVmZmVyLmZyb20ocHNidCksIHsgbmV0d29yayB9KTtcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgaW5wdXQnKTtcbn1cblxuLyoqXG4gKiBVc2UgYHdhc20tbWluaXNjcmlwdGAgdG8gZmluYWxpemUgYSBQU0JULlxuICogTWluaXNjcmlwdCBiYXNlZCBmaW5hbGl6YXRpb24gaXMgbW9yZSBwb3dlcmZ1bCB0aGFuIGJpdGNvaW5qcy1saWIncyAvIHV0eG8tbGliJ3MgZmluYWxpemF0aW9uXG4gKiBhbmQgY2FuIGZpbmFsaXplIG1vcmUgY29tcGxleCBzY3JpcHRzIChlLmcuIG1pbmlzY3JpcHQgZGVzY3JpcHRvcnMpLlxuICogQHBhcmFtIHBzYnRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbmFsaXplUHNidChwc2J0OiB1dHhvbGliLmJpdGdvLlV0eG9Qc2J0KTogdm9pZCB7XG4gIGlmICh1dHhvbGliLmdldE1haW5uZXQocHNidC5uZXR3b3JrKSAhPT0gdXR4b2xpYi5uZXR3b3Jrcy5iaXRjb2luKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdvbmx5IGJpdGNvaW4gYW5kIHRlc3RuZXQgYXJlIHN1cHBvcnRlZCcpO1xuICB9XG4gIGNvbnN0IHdyYXBwZWRQc2J0ID0gdG9XcmFwcGVkUHNidChwc2J0KTtcbiAgd3JhcHBlZFBzYnQuZmluYWxpemUoKTtcbiAgY29uc3QgdW53cmFwcGVkUHNidCA9IHRvVXR4b1BzYnQod3JhcHBlZFBzYnQsIHBzYnQubmV0d29yayk7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcHNidC5kYXRhLmlucHV0cy5sZW5ndGg7IGkrKykge1xuICAgIHBzYnQuZGF0YS5pbnB1dHNbaV0gPSB1bndyYXBwZWRQc2J0LmRhdGEuaW5wdXRzW2ldO1xuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import * as utxolib from '@bitgo-beta/utxo-lib';
|
|
2
|
+
export declare function getDustThresholdSat(network: utxolib.Network, outputSize: number, isWitness: boolean): number;
|
|
3
|
+
export declare function getDustThresholdSatForOutputScript(network: utxolib.Network, script: Buffer): number;
|
|
4
|
+
//# sourceMappingURL=dustThreshold.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dustThreshold.d.ts","sourceRoot":"","sources":["../../src/dustThreshold.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,sBAAsB,CAAC;AA8IhD,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,GAAG,MAAM,CAU5G;AAED,wBAAgB,kCAAkC,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAEnG"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import * as utxolib from '@bitgo-beta/utxo-lib';
|
|
2
|
+
/**
|
|
3
|
+
* Checks if the output script is a witness script or not
|
|
4
|
+
* @param script
|
|
5
|
+
* @returns true if the script is a witness script
|
|
6
|
+
*/
|
|
7
|
+
function isWitnessOutputScript(script) {
|
|
8
|
+
/**
|
|
9
|
+
* Source: https://github.com/bitcoin/bitcoin/blob/v28.1/src/script/script.cpp#L241-L257
|
|
10
|
+
* A witness program is any valid CScript that consists of a 1-byte push opcode
|
|
11
|
+
* followed by a data push between 2 and 40 bytes.
|
|
12
|
+
*/
|
|
13
|
+
if (script.length < 4 || script.length > 42) {
|
|
14
|
+
return false;
|
|
15
|
+
}
|
|
16
|
+
if (script[0] !== utxolib.opcodes.OP_0 && (script[0] < utxolib.opcodes.OP_1 || script[0] > utxolib.opcodes.OP_16)) {
|
|
17
|
+
return false;
|
|
18
|
+
}
|
|
19
|
+
return script[1] + 2 === script.length;
|
|
20
|
+
}
|
|
21
|
+
function getDustRelayLimit(network) {
|
|
22
|
+
network = utxolib.getMainnet(network);
|
|
23
|
+
switch (network) {
|
|
24
|
+
case utxolib.networks.bitcoin:
|
|
25
|
+
case utxolib.networks.bitcoingold:
|
|
26
|
+
case utxolib.networks.dash:
|
|
27
|
+
// btc: https://github.com/bitcoin/bitcoin/blob/v28.0/src/policy/policy.h#L50-L55
|
|
28
|
+
// btg: https://github.com/BTCGPU/BTCGPU/blob/v0.17.3/src/policy/policy.h#L48
|
|
29
|
+
// dash: https://github.com/dashpay/dash/blob/v22.0.0-beta.1/src/policy/policy.h#L41-L46
|
|
30
|
+
return { feeRateSatKB: 3000 };
|
|
31
|
+
case utxolib.networks.bitcoincash:
|
|
32
|
+
// https://github.com/bitcoin-cash-node/bitcoin-cash-node/blob/v27.1.0/src/policy/policy.h#L76-L83
|
|
33
|
+
// I actually haven't looked at BSV and am depressed that I still need to handle the case here
|
|
34
|
+
return { feeRateSatKB: 1000 };
|
|
35
|
+
case utxolib.networks.dogecoin:
|
|
36
|
+
// https://github.com/dogecoin/dogecoin/blob/v1.14.8/src/policy/policy.h#L65-L81
|
|
37
|
+
// (COIN / 100) / 10;
|
|
38
|
+
return { satAmount: 1000000 };
|
|
39
|
+
case utxolib.networks.litecoin:
|
|
40
|
+
// https://github.com/litecoin-project/litecoin/blob/master/src/policy/policy.h#L47-L52
|
|
41
|
+
return { feeRateSatKB: 30000 };
|
|
42
|
+
case utxolib.networks.zcash:
|
|
43
|
+
// https://github.com/zcash/zcash/blob/master/src/primitives/transaction.h#L396-L399
|
|
44
|
+
// https://github.com/zcash/zcash/blob/v6.0.0/src/policy/policy.h#L43-L89 (I don't quite get it)
|
|
45
|
+
return { satAmount: 300 };
|
|
46
|
+
case utxolib.networks.bitcoinsv:
|
|
47
|
+
throw new Error('deprecated coin');
|
|
48
|
+
default:
|
|
49
|
+
throw new Error('unsupported network');
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
function getSpendSize(network, outputSize, isWitness) {
|
|
53
|
+
network = utxolib.getMainnet(network);
|
|
54
|
+
switch (network) {
|
|
55
|
+
case utxolib.networks.bitcoin:
|
|
56
|
+
case utxolib.networks.bitcoincash:
|
|
57
|
+
case utxolib.networks.bitcoingold:
|
|
58
|
+
case utxolib.networks.litecoin:
|
|
59
|
+
/*
|
|
60
|
+
btc: https://github.com/bitcoin/bitcoin/blob/v28.0/src/policy/policy.cpp#L26-L68
|
|
61
|
+
bch: https://github.com/bitcoin-cash-node/bitcoin-cash-node/blob/v27.1.0/src/policy/policy.cpp#L18-L36 (btc-ish)
|
|
62
|
+
btg: https://github.com/BTCGPU/BTCGPU/blob/v0.17.3/src/policy/policy.cpp#L18-L50 (btc-ish)
|
|
63
|
+
ltc: https://github.com/litecoin-project/litecoin/blob/v0.21.4/src/policy/policy.cpp#L15-L47 (btc-ish)
|
|
64
|
+
|
|
65
|
+
The fixed component here is 69.75 for isWitness=true and 150 for isWitness=false.
|
|
66
|
+
*/
|
|
67
|
+
return outputSize + 32 + 4 + 1 + 107 / (isWitness ? 4 : 1) + 4;
|
|
68
|
+
case utxolib.networks.dash:
|
|
69
|
+
// dash: https://github.com/dashpay/dash/blob/v21.1.1/src/policy/policy.cpp#L14-L30 (btc-ish)
|
|
70
|
+
// how did they end up with 148? I don't know
|
|
71
|
+
return outputSize + 148;
|
|
72
|
+
case utxolib.networks.dogecoin:
|
|
73
|
+
case utxolib.networks.zcash:
|
|
74
|
+
// doge: https://github.com/dogecoin/dogecoin/blob/v1.14.8/src/policy/policy.h#L65-L81 (hardcoded)
|
|
75
|
+
// zec: https://github.com/zcash/zcash/blob/v6.0.0/src/policy/policy.h#L43-L89 (some weird other thing, doge-ish)
|
|
76
|
+
throw new Error('dust limit is size-independent');
|
|
77
|
+
case utxolib.networks.bitcoinsv:
|
|
78
|
+
throw new Error('deprecated coin');
|
|
79
|
+
default:
|
|
80
|
+
throw new Error('unsupported network');
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
export function getDustThresholdSat(network, outputSize, isWitness) {
|
|
84
|
+
const dustLimit = getDustRelayLimit(network);
|
|
85
|
+
if ('satAmount' in dustLimit) {
|
|
86
|
+
return dustLimit.satAmount;
|
|
87
|
+
}
|
|
88
|
+
if ('feeRateSatKB' in dustLimit) {
|
|
89
|
+
const spendSize = getSpendSize(network, outputSize, isWitness);
|
|
90
|
+
return Math.ceil((dustLimit.feeRateSatKB * spendSize) / 1000);
|
|
91
|
+
}
|
|
92
|
+
throw new Error('unexpected dustLimit');
|
|
93
|
+
}
|
|
94
|
+
export function getDustThresholdSatForOutputScript(network, script) {
|
|
95
|
+
return getDustThresholdSat(network, script.length, isWitnessOutputScript(script));
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHVzdFRocmVzaG9sZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kdXN0VGhyZXNob2xkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sc0JBQXNCLENBQUM7QUFFaEQ7Ozs7R0FJRztBQUNILFNBQVMscUJBQXFCLENBQUMsTUFBYztJQUMzQzs7OztPQUlHO0lBQ0gsSUFBSSxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxNQUFNLENBQUMsTUFBTSxHQUFHLEVBQUUsRUFBRSxDQUFDO1FBQzVDLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUNELElBQUksTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDbEgsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBQ0QsT0FBTyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLE1BQU0sQ0FBQyxNQUFNLENBQUM7QUFDekMsQ0FBQztBQTBERCxTQUFTLGlCQUFpQixDQUFDLE9BQXdCO0lBQ2pELE9BQU8sR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3RDLFFBQVEsT0FBTyxFQUFFLENBQUM7UUFDaEIsS0FBSyxPQUFPLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQztRQUM5QixLQUFLLE9BQU8sQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDO1FBQ2xDLEtBQUssT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJO1lBQ3hCLGtGQUFrRjtZQUNsRiw4RUFBOEU7WUFDOUUsd0ZBQXdGO1lBQ3hGLE9BQU8sRUFBRSxZQUFZLEVB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QUFDO0FBQzFDLENBQUM7QUFFRCxNQUFNLFVBQVUsa0NBQWtDLENBQUMsT0FBd0IsRUFBRSxNQUFjO0lBQ3pGLE9BQU8sbUJBQW1CLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxNQUFNLEVBQUUscUJBQXFCLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztBQUNwRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgdXR4b2xpYiBmcm9tICdAYml0Z28tYmV0YS91dHhvLWxpYic7XG5cbi8qKlxuICogQ2hlY2tzIGlmIHRoZSBvdXRwdXQgc2NyaXB0IGlzIGEgd2l0bmVzcyBzY3JpcHQgb3Igbm90XG4gKiBAcGFyYW0gc2NyaXB0XG4gKiBAcmV0dXJucyB0cnVlIGlmIHRoZSBzY3JpcHQgaXMgYSB3aXRuZXNzIHNjcmlwdFxuICovXG5mdW5jdGlvbiBpc1dpdG5lc3NPdXRwdXRTY3JpcHQoc2NyaXB0OiBCdWZmZXIpOiBib29sZWFuIHtcbiAgLyoqXG4gICAqIFNvdXJjZTogaHR0cHM6Ly9naXRodWIuY29tL2JpdGNvaW4vYml0Y29pbi9ibG9iL3YyOC4xL3NyYy9zY3JpcHQvc2NyaXB0LmNwcCNMMjQxLUwyNTdcbiAgICogQSB3aXRuZXNzIHByb2dyYW0gaXMgYW55IHZhbGlkIENTY3JpcHQgdGhhdCBjb25zaXN0cyBvZiBhIDEtYnl0ZSBwdXNoIG9wY29kZVxuICAgKiBmb2xsb3dlZCBieSBhIGRhdGEgcHVzaCBiZXR3ZWVuIDIgYW5kIDQwIGJ5dGVzLlxuICAgKi9cbiAgaWYgKHNjcmlwdC5sZW5ndGggPCA0IHx8IHNjcmlwdC5sZW5ndGggPiA0Mikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAoc2NyaXB0WzBdICE9PSB1dHhvbGliLm9wY29kZXMuT1BfMCAmJiAoc2NyaXB0WzBdIDwgdXR4b2xpYi5vcGNvZGVzLk9QXzEgfHwgc2NyaXB0WzBdID4gdXR4b2xpYi5vcGNvZGVzLk9QXzE2KSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gc2NyaXB0WzFdICsgMiA9PT0gc2NyaXB0Lmxlbmd0aDtcbn1cblxuLypcblxuVGhlIGR1c3QgdGhyZXNob2xkIGZvciBtb3N0IFVUWE8gY29pbnMgaXMgZGVwZW5kZW50IG9uIG11bHRpcGxlIGZhY3RvcnM6XG5cbigxKSBzcGVuZGFiaWxpdHkgb2YgdGhlIG91dHB1dCAoT1BfUkVUVVJOcyBhcmUgYWxsb3dlZCB0byBiZSAwIHNpemVkKVxuKDIpIHdoZXRoZXIgaXQgaXMgYSB3aXRuZXNzIG9yIG5vbi13aXRuZXNzIG91dHB1dFxuKDMpIGEgcGFydGljdWxhciBmZWUgcmF0ZSAoR2V0RGlzY2FyZFJhdGUoKSlcblxuSSB3aWxsIGRvIHRoZSBhbmFseXNpcyBtb3N0bHkgZm9yIGJpdGNvaW4gaGVyZSBhbmQgdGhlbiBnZW5lcmFsaXplLlxuXG5PbiB0aGUgaW5kZXhlciB3ZSB1c2UgYHNlbmRyYXd0cmFuc2FjdGlvbmAsIHdoaWNoIGNhbGxzIGBJc1N0YW5kYXJkVHhgIGxpa2UgdGhpc1xuXG5odHRwczovL2dpdGh1Yi5jb20vYml0Y29pbi9iaXRjb2luL2Jsb2IvdjI4LjAvc3JjL2tlcm5lbC9tZW1wb29sX29wdGlvbnMuaCNMNDdcblxuYGBgXG5pZiAoXG4gIG1fcG9vbC5tX29wdHMucmVxdWlyZV9zdGFuZGFyZCAmJlxuICAgIUlzU3RhbmRhcmRUeCh0eCxcbiAgIG1fcG9vbC5tX29wdHMubWF4X2RhdGFjYXJyaWVyX2J5dGVzLFxuICAgbV9wb29sLm1fb3B0cy5wZXJtaXRfYmFyZV9tdWx0aXNpZyxcbiAgIG1fcG9vbC5tX29wdHMuZHVzdF9yZWxheV9mZWVyYXRlLCByZWFzb24pKVxuYGBgXG5cblRoZSBgZHVzdF9yZWxheV9mZWVyYXRlYCBpbiB0aGlzIGNvbnRleHQgaXMgYSBoYXJkY29kZWQgY29uc3RhbnQ6XG5odHRwczovL2dpdGh1Yi5jb20vYml0Y29pbi9iaXRjb2luL2Jsb2IvdjI4LjAvc3JjL3BvbGljeS9wb2xpY3kuaCNMNTAtTDU1XG5cbih0aGF0IGNhbiBhY3R1YWxseSBiZSBvdmVycmlkZGVuIHdpdGggYSBoaWRkZW4gY29tbWFuZFxubGluZSBwYXJhbWV0ZXI6IGh0dHBzOi8vYml0Y29pbi5zdGFja2V4Y2hhbmdlLmNvbS9hLzQxMDgyLzEzNzYwMSlcblxuVGhlcmUgd2UgY2FsbCBgSXNEdXN0YFxuXG5odHRwczovL2dpdGh1Yi5jb20vYml0Y29pbi9iaXRjb2luL2Jsb2IvdjI4LjAvc3JjL3BvbGljeS9wb2xpY3kuY3BwI0wxNDQtTDE0NlxuXG5gYGBcbmlmIChJc0R1c3QodHhvdXQsIGR1c3RfcmVsYXlfZmVlKSkge1xuICAgIHJlYXNvbiA9IFwiZHVzdFwiO1xuICAgIHJldHVybiBmYWxzZTtcbn1cbmBgYFxuXG5XaGljaCBjYWxscyBgR2V0RHVzdFRocmVzaG9sZGAsXG5cbmh0dHBzOi8vZ2l0aHViLmNvbS9iaXRjb2luL2JpdGNvaW4vYmxvYi92MjguMC9zcmMvcG9saWN5L3BvbGljeS5jcHAjTDY3XG5cblRoZSBpbXBsZW1lbnRhdGlvbiBvZiBgR2V0RHVzdFRocmVzaG9sZGAgY29tcHV0ZXMgdGhlIG1pbmltYWwgdHJhbnNhY3Rpb24gc2l6ZSB0aGF0IGNhbiBzcGVuZCB0aGUgb3V0cHV0LCBhbmQgY29tcHV0ZXNcbmEgbWluaW11bSBmZWUgZm9yIHRoYXQgdHJhbnNhY3Rpb24gc2l6ZSBiYXNlZCBvbiB0aGUgYGR1c3RfcmVsYXlfZmVlYCAoRmVlUmF0ZSkgcGFyYW1ldGVyLlxuXG5UaGUgZGlmZmVyZW50IHV0eG8gaW1wbGVtZW50YXRpb25zIGRpZmZlciBpbiB0aGVzZSB3YXlzOlxuXG4tIHNvbWUgaGF2ZSBhIGZpeGVkLCBzYXRvc2hpIGFtb3VudCBkdXN0IGxpbWl0IChkb2dlLCB6ZWMpXG4tIHNvbWUgaGF2ZSBhIGRpZmZlcmVudCBkdXN0X3JlbGF5X2ZlZVxuXG4qL1xuXG50eXBlIER1c3RMaW1pdCA9IHsgZmVlUmF0ZVNhdEtCOiBudW1iZXIgfSB8IHsgc2F0QW1vdW50OiBudW1iZXIgfTtcblxuZnVuY3Rpb24gZ2V0RHVzdFJlbGF5TGltaXQobmV0d29yazogdXR4b2xpYi5OZXR3b3JrKTogRHVzdExpbWl0IHtcbiAgbmV0d29yayA9IHV0eG9saWIuZ2V0TWFpbm5ldChuZXR3b3JrKTtcbiAgc3dpdGNoIChuZXR3b3JrKSB7XG4gICAgY2FzZSB1dHhvbGliLm5ldHdvcmtzLmJpdGNvaW46XG4gICAgY2FzZSB1dHhvbGliLm5ldHdvcmtzLmJpdGNvaW5nb2xkOlxuICAgIGNhc2UgdXR4b2xpYi5uZXR3b3Jrcy5kYXNoOlxuICAgICAgLy8gYnRjOiAgaHR0cHM6Ly9naXRodWIuY29tL2JpdGNvaW4vYml0Y29pbi9ibG9iL3YyOC4wL3NyYy9wb2xpY3kvcG9saWN5LmgjTDUwLUw1NVxuICAgICAgLy8gYnRnOiAgaHR0cHM6Ly9naXRodWIuY29tL0JUQ0dQVS9CVENHUFUvYmxvYi92MC4xNy4zL3NyYy9wb2xpY3kvcG9saWN5LmgjTDQ4XG4gICAgICAvLyBkYXNoOiBodHRwczovL2dpdGh1Yi5jb20vZGFzaHBheS9kYXNoL2Jsb2IvdjIyLjAuMC1iZXRhLjEvc3JjL3BvbGljeS9wb2xpY3kuaCNMNDEtTDQ2XG4gICAgICByZXR1cm4geyBmZWVSYXRlU2F0S0I6IDMwMDAgfTtcbiAgICBjYXNlIHV0eG9saWIubmV0d29ya3MuYml0Y29pbmNhc2g6XG4gICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYml0Y29pbi1jYXNoLW5vZGUvYml0Y29pbi1jYXNoLW5vZGUvYmxvYi92MjcuMS4wL3NyYy9wb2xpY3kvcG9saWN5LmgjTDc2LUw4M1xuICAgICAgLy8gSSBhY3R1YWxseSBoYXZlbid0IGxvb2tlZCBhdCBCU1YgYW5kIGFtIGRlcHJlc3NlZCB0aGF0IEkgc3RpbGwgbmVlZCB0byBoYW5kbGUgdGhlIGNhc2UgaGVyZVxuICAgICAgcmV0dXJuIHsgZmVlUmF0ZVNhdEtCOiAxMDAwIH07XG4gICAgY2FzZSB1dHhvbGliLm5ldHdvcmtzLmRvZ2Vjb2luOlxuICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2RvZ2Vjb2luL2RvZ2Vjb2luL2Jsb2IvdjEuMTQuOC9zcmMvcG9saWN5L3BvbGljeS5oI0w2NS1MODFcbiAgICAgIC8vIChDT0lOIC8gMTAwKSAvIDEwO1xuICAgICAgcmV0dXJuIHsgc2F0QW1vdW50OiAxXzAwMF8wMDAgfTtcbiAgICBjYXNlIHV0eG9saWIubmV0d29ya3MubGl0ZWNvaW46XG4gICAgICAvLyAgaHR0cHM6Ly9naXRodWIuY29tL2xpdGVjb2luLXByb2plY3QvbGl0ZWNvaW4vYmxvYi9tYXN0ZXIvc3JjL3BvbGljeS9wb2xpY3kuaCNMNDctTDUyXG4gICAgICByZXR1cm4geyBmZWVSYXRlU2F0S0I6IDMwXzAwMCB9O1xuICAgIGNhc2UgdXR4b2xpYi5uZXR3b3Jrcy56Y2FzaDpcbiAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS96Y2FzaC96Y2FzaC9ibG9iL21hc3Rlci9zcmMvcHJpbWl0aXZlcy90cmFuc2FjdGlvbi5oI0wzOTYtTDM5OVxuICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3pjYXNoL3pjYXNoL2Jsb2IvdjYuMC4wL3NyYy9wb2xpY3kvcG9saWN5LmgjTDQzLUw4OSAoSSBkb24ndCBxdWl0ZSBnZXQgaXQpXG4gICAgICByZXR1cm4geyBzYXRBbW91bnQ6IDMwMCB9O1xuICAgIGNhc2UgdXR4b2xpYi5uZXR3b3Jrcy5iaXRjb2luc3Y6XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2RlcHJlY2F0ZWQgY29pbicpO1xuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Vuc3VwcG9ydGVkIG5ldHdvcmsnKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRTcGVuZFNpemUobmV0d29yazogdXR4b2xpYi5OZXR3b3JrLCBvdXRwdXRTaXplOiBudW1iZXIsIGlzV2l0bmVzczogYm9vbGVhbik6IG51bWJlciB7XG4gIG5ldHdvcmsgPSB1dHhvbGliLmdldE1haW5uZXQobmV0d29yayk7XG4gIHN3aXRjaCAobmV0d29yaykge1xuICAgIGNhc2UgdXR4b2xpYi5uZXR3b3Jrcy5iaXRjb2luOlxuICAgIGNhc2UgdXR4b2xpYi5uZXR3b3Jrcy5iaXRjb2luY2FzaDpcbiAgICBjYXNlIHV0eG9saWIubmV0d29ya3MuYml0Y29pbmdvbGQ6XG4gICAgY2FzZSB1dHhvbGliLm5ldHdvcmtzLmxpdGVjb2luOlxuICAgICAgLypcbiAgICAgICAgYnRjOiAgaHR0cHM6Ly9naXRodWIuY29tL2JpdGNvaW4vYml0Y29pbi9ibG9iL3YyOC4wL3NyYy9wb2xpY3kvcG9saWN5LmNwcCNMMjYtTDY4XG4gICAgICAgIGJjaDogIGh0dHBzOi8vZ2l0aHViLmNvbS9iaXRjb2luLWNhc2gtbm9kZS9iaXRjb2luLWNhc2gtbm9kZS9ibG9iL3YyNy4xLjAvc3JjL3BvbGljeS9wb2xpY3kuY3BwI0wxOC1MMzYgKGJ0Yy1pc2gpXG4gICAgICAgIGJ0ZzogIGh0dHBzOi8vZ2l0aHViLmNvbS9CVENHUFUvQlRDR1BVL2Jsb2IvdjAuMTcuMy9zcmMvcG9saWN5L3BvbGljeS5jcHAjTDE4LUw1MCAoYnRjLWlzaClcbiAgICAgICAgbHRjOiAgaHR0cHM6Ly9naXRodWIuY29tL2xpdGVjb2luLXByb2plY3QvbGl0ZWNvaW4vYmxvYi92MC4yMS40L3NyYy9wb2xpY3kvcG9saWN5LmNwcCNMMTUtTDQ3IChidGMtaXNoKVxuXG4gICAgICAgIFRoZSBmaXhlZCBjb21wb25lbnQgaGVyZSBpcyA2OS43NSBmb3IgaXNXaXRuZXNzPXRydWUgYW5kIDE1MCBmb3IgaXNXaXRuZXNzPWZhbHNlLlxuICAgICAgICovXG4gICAgICByZXR1cm4gb3V0cHV0U2l6ZSArIDMyICsgNCArIDEgKyAxMDcgLyAoaXNXaXRuZXNzID8gNCA6IDEpICsgNDtcbiAgICBjYXNlIHV0eG9saWIubmV0d29ya3MuZGFzaDpcbiAgICAgIC8vIGRhc2g6IGh0dHBzOi8vZ2l0aHViLmNvbS9kYXNocGF5L2Rhc2gvYmxvYi92MjEuMS4xL3NyYy9wb2xpY3kvcG9saWN5LmNwcCNMMTQtTDMwIChidGMtaXNoKVxuICAgICAgLy8gaG93IGRpZCB0aGV5IGVuZCB1cCB3aXRoIDE0OD8gSSBkb24ndCBrbm93XG4gICAgICByZXR1cm4gb3V0cHV0U2l6ZSArIDE0ODtcbiAgICBjYXNlIHV0eG9saWIubmV0d29ya3MuZG9nZWNvaW46XG4gICAgY2FzZSB1dHhvbGliLm5ldHdvcmtzLnpjYXNoOlxuICAgICAgLy8gZG9nZTogaHR0cHM6Ly9naXRodWIuY29tL2RvZ2Vjb2luL2RvZ2Vjb2luL2Jsb2IvdjEuMTQuOC9zcmMvcG9saWN5L3BvbGljeS5oI0w2NS1MODEgKGhhcmRjb2RlZClcbiAgICAgIC8vIHplYzogIGh0dHBzOi8vZ2l0aHViLmNvbS96Y2FzaC96Y2FzaC9ibG9iL3Y2LjAuMC9zcmMvcG9saWN5L3BvbGljeS5oI0w0My1MODkgKHNvbWUgd2VpcmQgb3RoZXIgdGhpbmcsIGRvZ2UtaXNoKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdkdXN0IGxpbWl0IGlzIHNpemUtaW5kZXBlbmRlbnQnKTtcbiAgICBjYXNlIHV0eG9saWIubmV0d29ya3MuYml0Y29pbnN2OlxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdkZXByZWNhdGVkIGNvaW4nKTtcbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IEVycm9yKCd1bnN1cHBvcnRlZCBuZXR3b3JrJyk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldER1c3RUaHJlc2hvbGRTYXQobmV0d29yazogdXR4b2xpYi5OZXR3b3JrLCBvdXRwdXRTaXplOiBudW1iZXIsIGlzV2l0bmVzczogYm9vbGVhbik6IG51bWJlciB7XG4gIGNvbnN0IGR1c3RMaW1pdCA9IGdldER1c3RSZWxheUxpbWl0KG5ldHdvcmspO1xuICBpZiAoJ3NhdEFtb3VudCcgaW4gZHVzdExpbWl0KSB7XG4gICAgcmV0dXJuIGR1c3RMaW1pdC5zYXRBbW91bnQ7XG4gIH1cbiAgaWYgKCdmZWVSYXRlU2F0S0InIGluIGR1c3RMaW1pdCkge1xuICAgIGNvbnN0IHNwZW5kU2l6ZSA9IGdldFNwZW5kU2l6ZShuZXR3b3JrLCBvdXRwdXRTaXplLCBpc1dpdG5lc3MpO1xuICAgIHJldHVybiBNYXRoLmNlaWwoKGR1c3RMaW1pdC5mZWVSYXRlU2F0S0IgKiBzcGVuZFNpemUpIC8gMTAwMCk7XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKCd1bmV4cGVjdGVkIGR1c3RMaW1pdCcpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RHVzdFRocmVzaG9sZFNhdEZvck91dHB1dFNjcmlwdChuZXR3b3JrOiB1dHhvbGliLk5ldHdvcmssIHNjcmlwdDogQnVmZmVyKTogbnVtYmVyIHtcbiAgcmV0dXJuIGdldER1c3RUaHJlc2hvbGRTYXQobmV0d29yaywgc2NyaXB0Lmxlbmd0aCwgaXNXaXRuZXNzT3V0cHV0U2NyaXB0KHNjcmlwdCkpO1xufVxuIl19
|