@bitgo-beta/abstract-utxo 1.1.1-beta.182 → 1.1.1-beta.1821
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/README.md +76 -0
- package/dist/cjs/src/abstractUtxoCoin.d.ts +438 -0
- package/dist/cjs/src/abstractUtxoCoin.d.ts.map +1 -0
- package/dist/cjs/src/abstractUtxoCoin.js +658 -0
- package/dist/cjs/src/address/fixedScript.d.ts +44 -0
- package/dist/cjs/src/address/fixedScript.d.ts.map +1 -0
- package/dist/cjs/src/address/fixedScript.js +105 -0
- package/dist/cjs/src/address/index.d.ts +2 -0
- package/dist/cjs/src/address/index.d.ts.map +1 -0
- package/dist/cjs/src/address/index.js +8 -0
- package/dist/cjs/src/config.d.ts.map +1 -0
- package/dist/cjs/src/config.js +14 -0
- package/dist/cjs/src/descriptor/NamedDescriptor.d.ts +20 -0
- package/dist/cjs/src/descriptor/NamedDescriptor.d.ts.map +1 -0
- package/dist/cjs/src/descriptor/NamedDescriptor.js +79 -0
- package/dist/cjs/src/descriptor/assertDescriptorWalletAddress.d.ts +5 -0
- package/dist/cjs/src/descriptor/assertDescriptorWalletAddress.d.ts.map +1 -0
- package/dist/cjs/src/descriptor/assertDescriptorWalletAddress.js +33 -0
- package/dist/cjs/src/descriptor/builder/builder.d.ts +13 -0
- package/dist/cjs/src/descriptor/builder/builder.d.ts.map +1 -0
- package/dist/cjs/src/descriptor/builder/builder.js +37 -0
- package/dist/cjs/src/descriptor/builder/index.d.ts +3 -0
- package/dist/cjs/src/descriptor/builder/index.d.ts.map +1 -0
- package/dist/cjs/src/descriptor/builder/index.js +8 -0
- package/dist/cjs/src/descriptor/builder/parse.d.ts +5 -0
- package/dist/cjs/src/descriptor/builder/parse.d.ts.map +1 -0
- package/dist/cjs/src/descriptor/builder/parse.js +116 -0
- package/dist/cjs/src/descriptor/createWallet/createDescriptorWallet.d.ts +20 -0
- package/dist/cjs/src/descriptor/createWallet/createDescriptorWallet.d.ts.map +1 -0
- package/dist/cjs/src/descriptor/createWallet/createDescriptorWallet.js +41 -0
- package/dist/cjs/src/descriptor/createWallet/createDescriptors.d.ts +12 -0
- package/dist/cjs/src/descriptor/createWallet/createDescriptors.d.ts.map +1 -0
- package/dist/cjs/src/descriptor/createWallet/createDescriptors.js +33 -0
- package/dist/cjs/src/descriptor/createWallet/index.d.ts +3 -0
- package/dist/cjs/src/descriptor/createWallet/index.d.ts.map +1 -0
- package/dist/cjs/src/descriptor/createWallet/index.js +19 -0
- package/dist/cjs/src/descriptor/descriptorWallet.d.ts +19 -0
- package/dist/cjs/src/descriptor/descriptorWallet.d.ts.map +1 -0
- package/dist/cjs/src/descriptor/descriptorWallet.js +54 -0
- package/dist/cjs/src/descriptor/index.d.ts +8 -0
- package/dist/cjs/src/descriptor/index.d.ts.map +1 -0
- package/dist/cjs/src/descriptor/index.js +53 -0
- package/dist/cjs/src/descriptor/validatePolicy.d.ts +22 -0
- package/dist/cjs/src/descriptor/validatePolicy.d.ts.map +1 -0
- package/dist/cjs/src/descriptor/validatePolicy.js +92 -0
- package/dist/cjs/src/impl/bch/bch.d.ts +22 -0
- package/dist/cjs/src/impl/bch/bch.d.ts.map +1 -0
- package/dist/cjs/src/impl/bch/bch.js +75 -0
- package/dist/cjs/src/impl/bch/index.d.ts +3 -0
- package/dist/cjs/src/impl/bch/index.d.ts.map +1 -0
- package/dist/cjs/src/impl/bch/index.js +19 -0
- package/dist/cjs/src/impl/bch/tbch.d.ts +12 -0
- package/dist/cjs/src/impl/bch/tbch.d.ts.map +1 -0
- package/dist/cjs/src/impl/bch/tbch.js +15 -0
- package/dist/cjs/src/impl/bcha/bcha.d.ts +9 -0
- package/dist/cjs/src/impl/bcha/bcha.d.ts.map +1 -0
- package/dist/cjs/src/impl/bcha/bcha.js +15 -0
- package/dist/cjs/src/impl/bcha/index.d.ts +3 -0
- package/dist/cjs/src/impl/bcha/index.d.ts.map +1 -0
- package/dist/cjs/src/impl/bcha/index.js +19 -0
- package/dist/cjs/src/impl/bcha/tbcha.d.ts +12 -0
- package/dist/cjs/src/impl/bcha/tbcha.d.ts.map +1 -0
- package/dist/cjs/src/impl/bcha/tbcha.js +15 -0
- package/dist/cjs/src/impl/bsv/bsv.d.ts +9 -0
- package/dist/cjs/src/impl/bsv/bsv.d.ts.map +1 -0
- package/dist/cjs/src/impl/bsv/bsv.js +15 -0
- package/dist/cjs/src/impl/bsv/index.d.ts +3 -0
- package/dist/cjs/src/impl/bsv/index.d.ts.map +1 -0
- package/dist/cjs/src/impl/bsv/index.js +19 -0
- package/dist/cjs/src/impl/bsv/tbsv.d.ts +12 -0
- package/dist/cjs/src/impl/bsv/tbsv.d.ts.map +1 -0
- package/dist/cjs/src/impl/bsv/tbsv.js +15 -0
- package/dist/cjs/src/impl/btc/btc.d.ts +15 -0
- package/dist/cjs/src/impl/btc/btc.d.ts.map +1 -0
- package/dist/cjs/src/impl/btc/btc.js +22 -0
- package/dist/cjs/src/impl/btc/index.d.ts +7 -0
- package/dist/cjs/src/impl/btc/index.d.ts.map +1 -0
- package/dist/cjs/src/impl/btc/index.js +23 -0
- package/dist/cjs/src/impl/btc/inscriptionBuilder.d.ts +61 -0
- package/dist/cjs/src/impl/btc/inscriptionBuilder.d.ts.map +1 -0
- package/dist/cjs/src/impl/btc/inscriptionBuilder.js +171 -0
- package/dist/cjs/src/impl/btc/tbtc.d.ts +12 -0
- package/dist/cjs/src/impl/btc/tbtc.d.ts.map +1 -0
- package/dist/cjs/src/impl/btc/tbtc.js +15 -0
- package/dist/cjs/src/impl/btc/tbtc4.d.ts +12 -0
- package/dist/cjs/src/impl/btc/tbtc4.d.ts.map +1 -0
- package/dist/cjs/src/impl/btc/tbtc4.js +15 -0
- package/dist/cjs/src/impl/btc/tbtcbgsig.d.ts +12 -0
- package/dist/cjs/src/impl/btc/tbtcbgsig.d.ts.map +1 -0
- package/dist/cjs/src/impl/btc/tbtcbgsig.js +15 -0
- package/dist/cjs/src/impl/btc/tbtcsig.d.ts +12 -0
- package/dist/cjs/src/impl/btc/tbtcsig.d.ts.map +1 -0
- package/dist/cjs/src/impl/btc/tbtcsig.js +15 -0
- package/dist/cjs/src/impl/btg/btg.d.ts +9 -0
- package/dist/cjs/src/impl/btg/btg.d.ts.map +1 -0
- package/dist/cjs/src/impl/btg/btg.js +15 -0
- package/dist/cjs/src/impl/btg/index.d.ts +2 -0
- package/dist/cjs/src/impl/btg/index.d.ts.map +1 -0
- package/dist/cjs/src/impl/btg/index.js +18 -0
- package/dist/cjs/src/impl/dash/dash.d.ts +9 -0
- package/dist/cjs/src/impl/dash/dash.d.ts.map +1 -0
- package/dist/cjs/src/impl/dash/dash.js +15 -0
- package/dist/cjs/src/impl/dash/index.d.ts +3 -0
- package/dist/cjs/src/impl/dash/index.d.ts.map +1 -0
- package/dist/cjs/src/impl/dash/index.js +19 -0
- package/dist/cjs/src/impl/dash/tdash.d.ts +12 -0
- package/dist/cjs/src/impl/dash/tdash.d.ts.map +1 -0
- package/dist/cjs/src/impl/dash/tdash.js +15 -0
- package/dist/cjs/src/impl/doge/doge.d.ts +35 -0
- package/dist/cjs/src/impl/doge/doge.d.ts.map +1 -0
- package/dist/cjs/src/impl/doge/doge.js +79 -0
- package/dist/cjs/src/impl/doge/index.d.ts +3 -0
- package/dist/cjs/src/impl/doge/index.d.ts.map +1 -0
- package/dist/cjs/src/impl/doge/index.js +19 -0
- package/dist/cjs/src/impl/doge/tdoge.d.ts +12 -0
- package/dist/cjs/src/impl/doge/tdoge.d.ts.map +1 -0
- package/dist/cjs/src/impl/doge/tdoge.js +15 -0
- package/dist/cjs/src/impl/index.d.ts +10 -0
- package/dist/cjs/src/impl/index.d.ts.map +1 -0
- package/dist/cjs/src/impl/index.js +46 -0
- package/dist/cjs/src/impl/ltc/index.d.ts +3 -0
- package/dist/cjs/src/impl/ltc/index.d.ts.map +1 -0
- package/dist/cjs/src/impl/ltc/index.js +19 -0
- package/dist/cjs/src/impl/ltc/ltc.d.ts +9 -0
- package/dist/cjs/src/impl/ltc/ltc.d.ts.map +1 -0
- package/dist/cjs/src/impl/ltc/ltc.js +53 -0
- package/dist/cjs/src/impl/ltc/tltc.d.ts +9 -0
- package/dist/cjs/src/impl/ltc/tltc.d.ts.map +1 -0
- package/dist/cjs/src/impl/ltc/tltc.js +52 -0
- package/dist/cjs/src/impl/zec/index.d.ts +3 -0
- package/dist/cjs/src/impl/zec/index.d.ts.map +1 -0
- package/dist/cjs/src/impl/zec/index.js +19 -0
- package/dist/cjs/src/impl/zec/tzec.d.ts +9 -0
- package/dist/cjs/src/impl/zec/tzec.d.ts.map +1 -0
- package/dist/cjs/src/impl/zec/tzec.js +15 -0
- package/dist/cjs/src/impl/zec/zec.d.ts +12 -0
- package/dist/cjs/src/impl/zec/zec.d.ts.map +1 -0
- package/dist/cjs/src/impl/zec/zec.js +15 -0
- package/dist/cjs/src/index.d.ts +23 -0
- package/dist/cjs/src/index.d.ts.map +1 -0
- package/dist/cjs/src/index.js +62 -0
- package/dist/cjs/src/keychains.d.ts +57 -0
- package/dist/cjs/src/keychains.d.ts.map +1 -0
- package/dist/cjs/src/keychains.js +145 -0
- package/dist/cjs/src/names.d.ts +36 -0
- package/dist/cjs/src/names.d.ts.map +1 -0
- package/dist/cjs/src/names.js +231 -0
- package/dist/cjs/src/offlineVault/OfflineVaultHalfSigned.d.ts +9 -0
- package/dist/cjs/src/offlineVault/OfflineVaultHalfSigned.d.ts.map +1 -0
- package/dist/cjs/src/offlineVault/OfflineVaultHalfSigned.js +24 -0
- package/dist/cjs/src/offlineVault/OfflineVaultSignable.d.ts +46 -0
- package/dist/cjs/src/offlineVault/OfflineVaultSignable.d.ts.map +1 -0
- package/dist/cjs/src/offlineVault/OfflineVaultSignable.js +55 -0
- package/dist/cjs/src/offlineVault/TransactionExplanation.d.ts +16 -0
- package/dist/cjs/src/offlineVault/TransactionExplanation.d.ts.map +1 -0
- package/dist/cjs/src/offlineVault/TransactionExplanation.js +15 -0
- package/dist/cjs/src/offlineVault/descriptor/index.d.ts +2 -0
- package/dist/cjs/src/offlineVault/descriptor/index.d.ts.map +1 -0
- package/dist/cjs/src/offlineVault/descriptor/index.js +18 -0
- package/dist/cjs/src/offlineVault/descriptor/transaction.d.ts +40 -0
- package/dist/cjs/src/offlineVault/descriptor/transaction.d.ts.map +1 -0
- package/dist/cjs/src/offlineVault/descriptor/transaction.js +80 -0
- package/dist/cjs/src/offlineVault/index.d.ts +6 -0
- package/dist/cjs/src/offlineVault/index.d.ts.map +1 -0
- package/dist/cjs/src/offlineVault/index.js +44 -0
- package/dist/{src → cjs/src}/recovery/RecoveryProvider.d.ts +1 -3
- package/dist/cjs/src/recovery/RecoveryProvider.d.ts.map +1 -0
- package/dist/cjs/src/recovery/RecoveryProvider.js +22 -0
- package/dist/cjs/src/recovery/backupKeyRecovery.d.ts +90 -0
- package/dist/cjs/src/recovery/backupKeyRecovery.d.ts.map +1 -0
- package/dist/cjs/src/recovery/backupKeyRecovery.js +339 -0
- package/dist/{src → cjs/src}/recovery/baseApi.d.ts +3 -6
- package/dist/cjs/src/recovery/baseApi.d.ts.map +1 -0
- package/dist/cjs/src/recovery/baseApi.js +73 -0
- package/dist/{src → cjs/src}/recovery/coingeckoApi.d.ts +0 -3
- package/dist/cjs/src/recovery/coingeckoApi.d.ts.map +1 -0
- package/dist/cjs/src/recovery/coingeckoApi.js +44 -0
- package/dist/{src → cjs/src}/recovery/crossChainRecovery.d.ts +21 -9
- package/dist/cjs/src/recovery/crossChainRecovery.d.ts.map +1 -0
- package/dist/cjs/src/recovery/crossChainRecovery.js +300 -0
- package/dist/{src → cjs/src}/recovery/index.d.ts +0 -1
- package/dist/cjs/src/recovery/index.d.ts.map +1 -0
- package/dist/{src → cjs/src}/recovery/index.js +6 -3
- package/dist/cjs/src/recovery/mempoolApi.d.ts.map +1 -0
- package/dist/cjs/src/recovery/mempoolApi.js +36 -0
- package/dist/cjs/src/recovery/psbt.d.ts +62 -0
- package/dist/cjs/src/recovery/psbt.d.ts.map +1 -0
- package/dist/cjs/src/recovery/psbt.js +153 -0
- package/dist/cjs/src/tnumber.d.ts +4 -0
- package/dist/cjs/src/tnumber.d.ts.map +1 -0
- package/dist/cjs/src/tnumber.js +12 -0
- package/dist/cjs/src/transaction/bip322.d.ts +27 -0
- package/dist/cjs/src/transaction/bip322.d.ts.map +1 -0
- package/dist/cjs/src/transaction/bip322.js +140 -0
- package/dist/cjs/src/transaction/common/verifyPayGoAmount.d.ts +2 -0
- package/dist/cjs/src/transaction/common/verifyPayGoAmount.d.ts.map +1 -0
- package/dist/cjs/src/transaction/common/verifyPayGoAmount.js +3 -0
- package/dist/cjs/src/transaction/decode.d.ts +12 -0
- package/dist/cjs/src/transaction/decode.d.ts.map +1 -0
- package/dist/cjs/src/transaction/decode.js +84 -0
- package/dist/cjs/src/transaction/descriptor/explainPsbt.d.ts +5 -0
- package/dist/cjs/src/transaction/descriptor/explainPsbt.d.ts.map +1 -0
- package/dist/cjs/src/transaction/descriptor/explainPsbt.js +45 -0
- package/dist/cjs/src/transaction/descriptor/index.d.ts +7 -0
- package/dist/cjs/src/transaction/descriptor/index.d.ts.map +1 -0
- package/dist/cjs/src/transaction/descriptor/index.js +14 -0
- package/dist/cjs/src/transaction/descriptor/parse.d.ts +19 -0
- package/dist/cjs/src/transaction/descriptor/parse.d.ts.map +1 -0
- package/dist/cjs/src/transaction/descriptor/parse.js +90 -0
- package/dist/cjs/src/transaction/descriptor/parseToAmountType.d.ts +14 -0
- package/dist/cjs/src/transaction/descriptor/parseToAmountType.d.ts.map +1 -0
- package/dist/cjs/src/transaction/descriptor/parseToAmountType.js +60 -0
- package/dist/cjs/src/transaction/descriptor/recipient.d.ts +5 -0
- package/dist/cjs/src/transaction/descriptor/recipient.d.ts.map +1 -0
- package/dist/cjs/src/transaction/descriptor/recipient.js +3 -0
- package/dist/cjs/src/transaction/descriptor/signPsbt.d.ts +24 -0
- package/dist/cjs/src/transaction/descriptor/signPsbt.d.ts.map +1 -0
- package/dist/cjs/src/transaction/descriptor/signPsbt.js +44 -0
- package/dist/cjs/src/transaction/descriptor/verifyTransaction.d.ts +37 -0
- package/dist/cjs/src/transaction/descriptor/verifyTransaction.d.ts.map +1 -0
- package/dist/cjs/src/transaction/descriptor/verifyTransaction.js +81 -0
- package/dist/cjs/src/transaction/explainTransaction.d.ts +20 -0
- package/dist/cjs/src/transaction/explainTransaction.d.ts.map +1 -0
- package/dist/cjs/src/transaction/explainTransaction.js +89 -0
- package/dist/cjs/src/transaction/fetchInputs.d.ts +27 -0
- package/dist/cjs/src/transaction/fetchInputs.d.ts.map +1 -0
- package/dist/cjs/src/transaction/fetchInputs.js +111 -0
- package/dist/cjs/src/transaction/fixedScript/SigningError.d.ts +26 -0
- package/dist/cjs/src/transaction/fixedScript/SigningError.d.ts.map +1 -0
- package/dist/cjs/src/transaction/fixedScript/SigningError.js +34 -0
- package/dist/cjs/src/transaction/fixedScript/explainPsbtWasm.d.ts +11 -0
- package/dist/cjs/src/transaction/fixedScript/explainPsbtWasm.d.ts.map +1 -0
- package/dist/cjs/src/transaction/fixedScript/explainPsbtWasm.js +67 -0
- package/dist/cjs/src/transaction/fixedScript/explainTransaction.d.ts +74 -0
- package/dist/cjs/src/transaction/fixedScript/explainTransaction.d.ts.map +1 -0
- package/dist/cjs/src/transaction/fixedScript/explainTransaction.js +342 -0
- package/dist/cjs/src/transaction/fixedScript/index.d.ts +10 -0
- package/dist/cjs/src/transaction/fixedScript/index.d.ts.map +1 -0
- package/dist/cjs/src/transaction/fixedScript/index.js +32 -0
- package/dist/cjs/src/transaction/fixedScript/musig2.d.ts +4 -0
- package/dist/cjs/src/transaction/fixedScript/musig2.d.ts.map +1 -0
- package/dist/cjs/src/transaction/fixedScript/musig2.js +3 -0
- package/dist/cjs/src/transaction/fixedScript/parseOutput.d.ts +28 -0
- package/dist/cjs/src/transaction/fixedScript/parseOutput.d.ts.map +1 -0
- package/dist/cjs/src/transaction/fixedScript/parseOutput.js +216 -0
- package/dist/cjs/src/transaction/fixedScript/parseTransaction.d.ts +8 -0
- package/dist/cjs/src/transaction/fixedScript/parseTransaction.d.ts.map +1 -0
- package/dist/cjs/src/transaction/fixedScript/parseTransaction.js +240 -0
- package/dist/cjs/src/transaction/fixedScript/replayProtection.d.ts +9 -0
- package/dist/cjs/src/transaction/fixedScript/replayProtection.d.ts.map +1 -0
- package/dist/cjs/src/transaction/fixedScript/replayProtection.js +46 -0
- package/dist/cjs/src/transaction/fixedScript/signLegacyTransaction.d.ts +32 -0
- package/dist/cjs/src/transaction/fixedScript/signLegacyTransaction.d.ts.map +1 -0
- package/dist/cjs/src/transaction/fixedScript/signLegacyTransaction.js +155 -0
- package/dist/cjs/src/transaction/fixedScript/signPsbtUtxolib.d.ts +21 -0
- package/dist/cjs/src/transaction/fixedScript/signPsbtUtxolib.d.ts.map +1 -0
- package/dist/cjs/src/transaction/fixedScript/signPsbtUtxolib.js +157 -0
- package/dist/cjs/src/transaction/fixedScript/signPsbtWasm.d.ts +18 -0
- package/dist/cjs/src/transaction/fixedScript/signPsbtWasm.d.ts.map +1 -0
- package/dist/cjs/src/transaction/fixedScript/signPsbtWasm.js +105 -0
- package/dist/cjs/src/transaction/fixedScript/signTransaction.d.ts +26 -0
- package/dist/cjs/src/transaction/fixedScript/signTransaction.d.ts.map +1 -0
- package/dist/cjs/src/transaction/fixedScript/signTransaction.js +104 -0
- package/dist/cjs/src/transaction/fixedScript/verifyTransaction.d.ts +21 -0
- package/dist/cjs/src/transaction/fixedScript/verifyTransaction.d.ts.map +1 -0
- package/dist/cjs/src/transaction/fixedScript/verifyTransaction.js +199 -0
- package/dist/cjs/src/transaction/getPayGoVerificationPubkey.d.ts +9 -0
- package/dist/cjs/src/transaction/getPayGoVerificationPubkey.d.ts.map +1 -0
- package/dist/cjs/src/transaction/getPayGoVerificationPubkey.js +20 -0
- package/dist/cjs/src/transaction/index.d.ts +8 -0
- package/dist/cjs/src/transaction/index.d.ts.map +1 -0
- package/dist/cjs/src/transaction/index.js +50 -0
- package/dist/cjs/src/transaction/outputDifference.d.ts +44 -0
- package/dist/cjs/src/transaction/outputDifference.d.ts.map +1 -0
- package/dist/cjs/src/transaction/outputDifference.js +51 -0
- package/dist/cjs/src/transaction/parseTransaction.d.ts +4 -0
- package/dist/cjs/src/transaction/parseTransaction.d.ts.map +1 -0
- package/dist/cjs/src/transaction/parseTransaction.js +48 -0
- package/dist/cjs/src/transaction/recipient.d.ts +34 -0
- package/dist/cjs/src/transaction/recipient.d.ts.map +1 -0
- package/dist/cjs/src/transaction/recipient.js +104 -0
- package/dist/cjs/src/transaction/signTransaction.d.ts +6 -0
- package/dist/cjs/src/transaction/signTransaction.d.ts.map +1 -0
- package/dist/cjs/src/transaction/signTransaction.js +105 -0
- package/dist/cjs/src/transaction/types.d.ts +49 -0
- package/dist/cjs/src/transaction/types.d.ts.map +1 -0
- package/dist/cjs/src/transaction/types.js +7 -0
- package/dist/cjs/src/transaction/verifyTransaction.d.ts +4 -0
- package/dist/cjs/src/transaction/verifyTransaction.d.ts.map +1 -0
- package/dist/cjs/src/transaction/verifyTransaction.js +50 -0
- package/dist/cjs/src/unspent.d.ts +55 -0
- package/dist/cjs/src/unspent.d.ts.map +1 -0
- package/dist/cjs/src/unspent.js +12 -0
- package/dist/cjs/src/verifyKey.d.ts +29 -0
- package/dist/cjs/src/verifyKey.d.ts.map +1 -0
- package/dist/cjs/src/verifyKey.js +164 -0
- package/dist/cjs/src/wallet.d.ts +15 -0
- package/dist/cjs/src/wallet.d.ts.map +1 -0
- package/dist/cjs/src/wallet.js +8 -0
- package/dist/cjs/src/wasmUtil.d.ts +29 -0
- package/dist/cjs/src/wasmUtil.d.ts.map +1 -0
- package/dist/cjs/src/wasmUtil.js +87 -0
- package/dist/cjs/test/integration/impl/bch/bch.d.ts +2 -0
- package/dist/cjs/test/integration/impl/bch/bch.d.ts.map +1 -0
- package/dist/cjs/test/integration/impl/bch/bch.js +74 -0
- package/dist/cjs/test/unit/address.d.ts +2 -0
- package/dist/cjs/test/unit/address.d.ts.map +1 -0
- package/dist/cjs/test/unit/address.js +182 -0
- package/dist/cjs/test/unit/bip322.d.ts +2 -0
- package/dist/cjs/test/unit/bip322.d.ts.map +1 -0
- package/dist/cjs/test/unit/bip322.js +361 -0
- package/dist/cjs/test/unit/coins.d.ts +2 -0
- package/dist/cjs/test/unit/coins.d.ts.map +1 -0
- package/dist/cjs/test/unit/coins.js +119 -0
- package/dist/cjs/test/unit/customChangeWallet.d.ts +2 -0
- package/dist/cjs/test/unit/customChangeWallet.d.ts.map +1 -0
- package/dist/cjs/test/unit/customChangeWallet.js +154 -0
- package/dist/cjs/test/unit/customSigner.d.ts +3 -0
- package/dist/cjs/test/unit/customSigner.d.ts.map +1 -0
- package/dist/cjs/test/unit/customSigner.js +108 -0
- package/dist/cjs/test/unit/descriptor/NamedDescriptor.d.ts +2 -0
- package/dist/cjs/test/unit/descriptor/NamedDescriptor.d.ts.map +1 -0
- package/dist/cjs/test/unit/descriptor/NamedDescriptor.js +18 -0
- package/dist/cjs/test/unit/descriptor/builder.d.ts +2 -0
- package/dist/cjs/test/unit/descriptor/builder.d.ts.map +1 -0
- package/dist/cjs/test/unit/descriptor/builder.js +72 -0
- package/dist/cjs/test/unit/descriptor/createWallet/createDescriptors.d.ts +2 -0
- package/dist/cjs/test/unit/descriptor/createWallet/createDescriptors.d.ts.map +1 -0
- package/dist/cjs/test/unit/descriptor/createWallet/createDescriptors.js +20 -0
- package/dist/cjs/test/unit/descriptor/descriptorWallet.d.ts +2 -0
- package/dist/cjs/test/unit/descriptor/descriptorWallet.d.ts.map +1 -0
- package/dist/cjs/test/unit/descriptor/descriptorWallet.js +28 -0
- package/dist/cjs/test/unit/descriptorAddress.d.ts +3 -0
- package/dist/cjs/test/unit/descriptorAddress.d.ts.map +1 -0
- package/dist/cjs/test/unit/descriptorAddress.js +103 -0
- package/dist/cjs/test/unit/explainTransaction.d.ts +2 -0
- package/dist/cjs/test/unit/explainTransaction.d.ts.map +1 -0
- package/dist/cjs/test/unit/explainTransaction.js +74 -0
- package/dist/cjs/test/unit/fixtures/bip322/fixtures.d.ts +15 -0
- package/dist/cjs/test/unit/fixtures/bip322/fixtures.d.ts.map +1 -0
- package/dist/cjs/test/unit/fixtures/bip322/fixtures.js +51 -0
- package/dist/cjs/test/unit/fixtures/psbtHexProof.d.ts +4 -0
- package/dist/cjs/test/unit/fixtures/psbtHexProof.d.ts.map +1 -0
- package/dist/cjs/test/unit/fixtures/psbtHexProof.js +9 -0
- package/dist/cjs/test/unit/impl/bch/unit/bch.d.ts +2 -0
- package/dist/cjs/test/unit/impl/bch/unit/bch.d.ts.map +1 -0
- package/dist/cjs/test/unit/impl/bch/unit/bch.js +138 -0
- package/dist/cjs/test/unit/impl/bcha/unit/index.d.ts +2 -0
- package/dist/cjs/test/unit/impl/bcha/unit/index.d.ts.map +1 -0
- package/dist/cjs/test/unit/impl/bcha/unit/index.js +47 -0
- package/dist/cjs/test/unit/impl/bsv/unit/index.d.ts +2 -0
- package/dist/cjs/test/unit/impl/bsv/unit/index.d.ts.map +1 -0
- package/dist/cjs/test/unit/impl/bsv/unit/index.js +32 -0
- package/dist/cjs/test/unit/impl/btc/unit/btc.d.ts +2 -0
- package/dist/cjs/test/unit/impl/btc/unit/btc.d.ts.map +1 -0
- package/dist/cjs/test/unit/impl/btc/unit/btc.js +220 -0
- package/dist/cjs/test/unit/impl/btc/unit/fixtures/btcBackupKey.d.ts +4 -0
- package/dist/cjs/test/unit/impl/btc/unit/fixtures/btcBackupKey.d.ts.map +1 -0
- package/dist/cjs/test/unit/impl/btc/unit/fixtures/btcBackupKey.js +10 -0
- package/dist/cjs/test/unit/impl/btc/unit/fixtures/index.d.ts +2 -0
- package/dist/cjs/test/unit/impl/btc/unit/fixtures/index.d.ts.map +1 -0
- package/dist/cjs/test/unit/impl/btc/unit/fixtures/index.js +18 -0
- package/dist/cjs/test/unit/impl/btg/unit/index.d.ts +2 -0
- package/dist/cjs/test/unit/impl/btg/unit/index.d.ts.map +1 -0
- package/dist/cjs/test/unit/impl/btg/unit/index.js +29 -0
- package/dist/cjs/test/unit/impl/dash/unit/index.d.ts +2 -0
- package/dist/cjs/test/unit/impl/dash/unit/index.d.ts.map +1 -0
- package/dist/cjs/test/unit/impl/dash/unit/index.js +32 -0
- package/dist/cjs/test/unit/impl/doge/unit/index.d.ts +2 -0
- package/dist/cjs/test/unit/impl/doge/unit/index.d.ts.map +1 -0
- package/dist/cjs/test/unit/impl/doge/unit/index.js +32 -0
- package/dist/cjs/test/unit/impl/ltc/unit/index.d.ts +2 -0
- package/dist/cjs/test/unit/impl/ltc/unit/index.d.ts.map +1 -0
- package/dist/cjs/test/unit/impl/ltc/unit/index.js +39 -0
- package/dist/cjs/test/unit/impl/zec/unit/index.d.ts +2 -0
- package/dist/cjs/test/unit/impl/zec/unit/index.d.ts.map +1 -0
- package/dist/cjs/test/unit/impl/zec/unit/index.js +29 -0
- package/dist/cjs/test/unit/keySignatures.d.ts +2 -0
- package/dist/cjs/test/unit/keySignatures.d.ts.map +1 -0
- package/dist/cjs/test/unit/keySignatures.js +54 -0
- package/dist/cjs/test/unit/keychains.d.ts +2 -0
- package/dist/cjs/test/unit/keychains.d.ts.map +1 -0
- package/dist/cjs/test/unit/keychains.js +49 -0
- package/dist/cjs/test/unit/offlineVault/halfSigned.d.ts +2 -0
- package/dist/cjs/test/unit/offlineVault/halfSigned.d.ts.map +1 -0
- package/dist/cjs/test/unit/offlineVault/halfSigned.js +124 -0
- package/dist/cjs/test/unit/parseTransaction.d.ts +2 -0
- package/dist/cjs/test/unit/parseTransaction.d.ts.map +1 -0
- package/dist/cjs/test/unit/parseTransaction.js +125 -0
- package/dist/cjs/test/unit/prebuildAndSign.d.ts +2 -0
- package/dist/cjs/test/unit/prebuildAndSign.d.ts.map +1 -0
- package/dist/cjs/test/unit/prebuildAndSign.js +251 -0
- package/dist/cjs/test/unit/recovery/backupKeyRecovery.d.ts +2 -0
- package/dist/cjs/test/unit/recovery/backupKeyRecovery.d.ts.map +1 -0
- package/dist/cjs/test/unit/recovery/backupKeyRecovery.js +313 -0
- package/dist/cjs/test/unit/recovery/crossChainRecovery.d.ts +2 -0
- package/dist/cjs/test/unit/recovery/crossChainRecovery.d.ts.map +1 -0
- package/dist/cjs/test/unit/recovery/crossChainRecovery.js +304 -0
- package/dist/cjs/test/unit/recovery/mock.d.ts +28 -0
- package/dist/cjs/test/unit/recovery/mock.d.ts.map +1 -0
- package/dist/cjs/test/unit/recovery/mock.js +139 -0
- package/dist/cjs/test/unit/signTransaction.d.ts +2 -0
- package/dist/cjs/test/unit/signTransaction.d.ts.map +1 -0
- package/dist/cjs/test/unit/signTransaction.js +244 -0
- package/dist/cjs/test/unit/transaction/descriptor/explainPsbt.d.ts +2 -0
- package/dist/cjs/test/unit/transaction/descriptor/explainPsbt.d.ts.map +1 -0
- package/dist/cjs/test/unit/transaction/descriptor/explainPsbt.js +32 -0
- package/dist/cjs/test/unit/transaction/descriptor/fixtures.utils.d.ts +6 -0
- package/dist/cjs/test/unit/transaction/descriptor/fixtures.utils.d.ts.map +1 -0
- package/dist/cjs/test/unit/transaction/descriptor/fixtures.utils.js +17 -0
- package/dist/cjs/test/unit/transaction/descriptor/parse.d.ts +2 -0
- package/dist/cjs/test/unit/transaction/descriptor/parse.d.ts.map +1 -0
- package/dist/cjs/test/unit/transaction/descriptor/parse.js +101 -0
- package/dist/cjs/test/unit/transaction/descriptor/sign.d.ts +2 -0
- package/dist/cjs/test/unit/transaction/descriptor/sign.d.ts.map +1 -0
- package/dist/cjs/test/unit/transaction/descriptor/sign.js +44 -0
- package/dist/cjs/test/unit/transaction/descriptor/validatePolicy.d.ts +2 -0
- package/dist/cjs/test/unit/transaction/descriptor/validatePolicy.d.ts.map +1 -0
- package/dist/cjs/test/unit/transaction/descriptor/validatePolicy.js +48 -0
- package/dist/cjs/test/unit/transaction/fixedScript/explainPsbt.d.ts +2 -0
- package/dist/cjs/test/unit/transaction/fixedScript/explainPsbt.d.ts.map +1 -0
- package/dist/cjs/test/unit/transaction/fixedScript/explainPsbt.js +129 -0
- package/dist/cjs/test/unit/transaction/fixedScript/parsePsbt.d.ts +2 -0
- package/dist/cjs/test/unit/transaction/fixedScript/parsePsbt.d.ts.map +1 -0
- package/dist/cjs/test/unit/transaction/fixedScript/parsePsbt.js +287 -0
- package/dist/cjs/test/unit/transaction/fixedScript/replayProtection.d.ts +2 -0
- package/dist/cjs/test/unit/transaction/fixedScript/replayProtection.d.ts.map +1 -0
- package/dist/cjs/test/unit/transaction/fixedScript/replayProtection.js +60 -0
- package/dist/cjs/test/unit/transaction/fixedScript/signPsbt.d.ts +2 -0
- package/dist/cjs/test/unit/transaction/fixedScript/signPsbt.d.ts.map +1 -0
- package/dist/cjs/test/unit/transaction/fixedScript/signPsbt.js +154 -0
- package/dist/cjs/test/unit/transaction/outputDifference.d.ts +2 -0
- package/dist/cjs/test/unit/transaction/outputDifference.d.ts.map +1 -0
- package/dist/cjs/test/unit/transaction/outputDifference.js +117 -0
- package/dist/cjs/test/unit/transaction.d.ts +2 -0
- package/dist/cjs/test/unit/transaction.d.ts.map +1 -0
- package/dist/cjs/test/unit/transaction.js +309 -0
- package/dist/cjs/test/unit/txFormat.d.ts +30 -0
- package/dist/cjs/test/unit/txFormat.d.ts.map +1 -0
- package/dist/cjs/test/unit/txFormat.js +174 -0
- package/dist/cjs/test/unit/util/fixtures.d.ts +14 -0
- package/dist/cjs/test/unit/util/fixtures.d.ts.map +1 -0
- package/dist/cjs/test/unit/util/fixtures.js +102 -0
- package/dist/cjs/test/unit/util/index.d.ts +7 -0
- package/dist/cjs/test/unit/util/index.d.ts.map +1 -0
- package/dist/cjs/test/unit/util/index.js +23 -0
- package/dist/cjs/test/unit/util/keychains.d.ts +26 -0
- package/dist/cjs/test/unit/util/keychains.d.ts.map +1 -0
- package/dist/cjs/test/unit/util/keychains.js +72 -0
- package/dist/cjs/test/unit/util/nockBitGo.d.ts +3 -0
- package/dist/cjs/test/unit/util/nockBitGo.d.ts.map +1 -0
- package/dist/cjs/test/unit/util/nockBitGo.js +11 -0
- package/dist/cjs/test/unit/util/nockIndexerAPI.d.ts +8 -0
- package/dist/cjs/test/unit/util/nockIndexerAPI.d.ts.map +1 -0
- package/dist/cjs/test/unit/util/nockIndexerAPI.js +23 -0
- package/dist/cjs/test/unit/util/transaction.d.ts +27 -0
- package/dist/cjs/test/unit/util/transaction.d.ts.map +1 -0
- package/dist/cjs/test/unit/util/transaction.js +127 -0
- package/dist/cjs/test/unit/util/unspents.d.ts +12 -0
- package/dist/cjs/test/unit/util/unspents.d.ts.map +1 -0
- package/dist/cjs/test/unit/util/unspents.js +108 -0
- package/dist/cjs/test/unit/util/utxoCoins.d.ts +21 -0
- package/dist/cjs/test/unit/util/utxoCoins.d.ts.map +1 -0
- package/dist/cjs/test/unit/util/utxoCoins.js +126 -0
- package/dist/cjs/test/unit/util/wallet.d.ts +4 -0
- package/dist/cjs/test/unit/util/wallet.d.ts.map +1 -0
- package/dist/cjs/test/unit/util/wallet.js +9 -0
- package/dist/cjs/test/unit/verifyTransaction.d.ts +2 -0
- package/dist/cjs/test/unit/verifyTransaction.d.ts.map +1 -0
- package/dist/cjs/test/unit/verifyTransaction.js +327 -0
- package/dist/cjs/test/unit/wallet.d.ts +2 -0
- package/dist/cjs/test/unit/wallet.d.ts.map +1 -0
- package/dist/cjs/test/unit/wallet.js +248 -0
- package/dist/cjs/tsconfig.tsbuildinfo +1 -0
- package/dist/esm/abstractUtxoCoin.d.ts +438 -0
- package/dist/esm/abstractUtxoCoin.d.ts.map +1 -0
- package/dist/esm/abstractUtxoCoin.js +617 -0
- package/dist/esm/address/fixedScript.d.ts +44 -0
- package/dist/esm/address/fixedScript.d.ts.map +1 -0
- package/dist/esm/address/fixedScript.js +97 -0
- package/dist/esm/address/index.d.ts +2 -0
- package/dist/esm/address/index.d.ts.map +1 -0
- package/dist/esm/address/index.js +2 -0
- package/dist/esm/config.d.ts +9 -0
- package/dist/esm/config.js +11 -0
- package/dist/esm/descriptor/NamedDescriptor.d.ts +20 -0
- package/dist/esm/descriptor/NamedDescriptor.d.ts.map +1 -0
- package/dist/esm/descriptor/NamedDescriptor.js +39 -0
- package/dist/esm/descriptor/assertDescriptorWalletAddress.d.ts +5 -0
- package/dist/esm/descriptor/assertDescriptorWalletAddress.d.ts.map +1 -0
- package/dist/esm/descriptor/assertDescriptorWalletAddress.js +27 -0
- package/dist/esm/descriptor/builder/builder.d.ts +13 -0
- package/dist/esm/descriptor/builder/builder.d.ts.map +1 -0
- package/dist/esm/descriptor/builder/builder.js +34 -0
- package/dist/esm/descriptor/builder/index.d.ts +3 -0
- package/dist/esm/descriptor/builder/index.d.ts.map +1 -0
- package/dist/esm/descriptor/builder/index.js +3 -0
- package/dist/esm/descriptor/builder/parse.d.ts +5 -0
- package/dist/esm/descriptor/builder/parse.d.ts.map +1 -0
- package/dist/esm/descriptor/builder/parse.js +112 -0
- package/dist/esm/descriptor/createWallet/createDescriptorWallet.d.ts +20 -0
- package/dist/esm/descriptor/createWallet/createDescriptorWallet.d.ts.map +1 -0
- package/dist/esm/descriptor/createWallet/createDescriptorWallet.js +37 -0
- package/dist/esm/descriptor/createWallet/createDescriptors.d.ts +12 -0
- package/dist/esm/descriptor/createWallet/createDescriptors.d.ts.map +1 -0
- package/dist/esm/descriptor/createWallet/createDescriptors.js +29 -0
- package/dist/esm/descriptor/createWallet/index.d.ts +3 -0
- package/dist/esm/descriptor/createWallet/index.d.ts.map +1 -0
- package/dist/esm/descriptor/createWallet/index.js +3 -0
- package/dist/esm/descriptor/descriptorWallet.d.ts +19 -0
- package/dist/esm/descriptor/descriptorWallet.d.ts.map +1 -0
- package/dist/esm/descriptor/descriptorWallet.js +16 -0
- package/dist/esm/descriptor/index.d.ts +8 -0
- package/dist/esm/descriptor/index.d.ts.map +1 -0
- package/dist/esm/descriptor/index.js +7 -0
- package/dist/esm/descriptor/validatePolicy.d.ts +22 -0
- package/dist/esm/descriptor/validatePolicy.d.ts.map +1 -0
- package/dist/esm/descriptor/validatePolicy.js +80 -0
- package/dist/esm/impl/bch/bch.d.ts +22 -0
- package/dist/esm/impl/bch/bch.d.ts.map +1 -0
- package/dist/esm/impl/bch/bch.js +38 -0
- package/dist/esm/impl/bch/index.d.ts +3 -0
- package/dist/esm/impl/bch/index.d.ts.map +1 -0
- package/dist/esm/impl/bch/index.js +3 -0
- package/dist/esm/impl/bch/tbch.d.ts +12 -0
- package/dist/esm/impl/bch/tbch.d.ts.map +1 -0
- package/dist/esm/impl/bch/tbch.js +11 -0
- package/dist/esm/impl/bcha/bcha.d.ts +9 -0
- package/dist/esm/impl/bcha/bcha.d.ts.map +1 -0
- package/dist/esm/impl/bcha/bcha.js +11 -0
- package/dist/esm/impl/bcha/index.d.ts +3 -0
- package/dist/esm/impl/bcha/index.d.ts.map +1 -0
- package/dist/esm/impl/bcha/index.js +3 -0
- package/dist/esm/impl/bcha/tbcha.d.ts +12 -0
- package/dist/esm/impl/bcha/tbcha.d.ts.map +1 -0
- package/dist/esm/impl/bcha/tbcha.js +11 -0
- package/dist/esm/impl/bsv/bsv.d.ts +9 -0
- package/dist/esm/impl/bsv/bsv.d.ts.map +1 -0
- package/dist/esm/impl/bsv/bsv.js +11 -0
- package/dist/esm/impl/bsv/index.d.ts +3 -0
- package/dist/esm/impl/bsv/index.d.ts.map +1 -0
- package/dist/esm/impl/bsv/index.js +3 -0
- package/dist/esm/impl/bsv/tbsv.d.ts +12 -0
- package/dist/esm/impl/bsv/tbsv.d.ts.map +1 -0
- package/dist/esm/impl/bsv/tbsv.js +11 -0
- package/dist/esm/impl/btc/btc.d.ts +15 -0
- package/dist/esm/impl/btc/btc.d.ts.map +1 -0
- package/dist/esm/impl/btc/btc.js +18 -0
- package/dist/esm/impl/btc/index.d.ts +7 -0
- package/dist/esm/impl/btc/index.d.ts.map +1 -0
- package/dist/esm/impl/btc/index.js +7 -0
- package/dist/esm/impl/btc/inscriptionBuilder.d.ts +61 -0
- package/dist/esm/impl/btc/inscriptionBuilder.d.ts.map +1 -0
- package/dist/esm/impl/btc/inscriptionBuilder.js +164 -0
- package/dist/esm/impl/btc/tbtc.d.ts +12 -0
- package/dist/esm/impl/btc/tbtc.d.ts.map +1 -0
- package/dist/esm/impl/btc/tbtc.js +11 -0
- package/dist/esm/impl/btc/tbtc4.d.ts +12 -0
- package/dist/esm/impl/btc/tbtc4.d.ts.map +1 -0
- package/dist/esm/impl/btc/tbtc4.js +11 -0
- package/dist/esm/impl/btc/tbtcbgsig.d.ts +12 -0
- package/dist/esm/impl/btc/tbtcbgsig.d.ts.map +1 -0
- package/dist/esm/impl/btc/tbtcbgsig.js +11 -0
- package/dist/esm/impl/btc/tbtcsig.d.ts +12 -0
- package/dist/esm/impl/btc/tbtcsig.d.ts.map +1 -0
- package/dist/esm/impl/btc/tbtcsig.js +11 -0
- package/dist/esm/impl/btg/btg.d.ts +9 -0
- package/dist/esm/impl/btg/btg.d.ts.map +1 -0
- package/dist/esm/impl/btg/btg.js +11 -0
- package/dist/esm/impl/btg/index.d.ts +2 -0
- package/dist/esm/impl/btg/index.d.ts.map +1 -0
- package/dist/esm/impl/btg/index.js +2 -0
- package/dist/esm/impl/dash/dash.d.ts +9 -0
- package/dist/esm/impl/dash/dash.d.ts.map +1 -0
- package/dist/esm/impl/dash/dash.js +11 -0
- package/dist/esm/impl/dash/index.d.ts +3 -0
- package/dist/esm/impl/dash/index.d.ts.map +1 -0
- package/dist/esm/impl/dash/index.js +3 -0
- package/dist/esm/impl/dash/tdash.d.ts +12 -0
- package/dist/esm/impl/dash/tdash.d.ts.map +1 -0
- package/dist/esm/impl/dash/tdash.js +11 -0
- package/dist/esm/impl/doge/doge.d.ts +35 -0
- package/dist/esm/impl/doge/doge.d.ts.map +1 -0
- package/dist/esm/impl/doge/doge.js +75 -0
- package/dist/esm/impl/doge/index.d.ts +3 -0
- package/dist/esm/impl/doge/index.d.ts.map +1 -0
- package/dist/esm/impl/doge/index.js +3 -0
- package/dist/esm/impl/doge/tdoge.d.ts +12 -0
- package/dist/esm/impl/doge/tdoge.d.ts.map +1 -0
- package/dist/esm/impl/doge/tdoge.js +11 -0
- package/dist/esm/impl/index.d.ts +10 -0
- package/dist/esm/impl/index.d.ts.map +1 -0
- package/dist/esm/impl/index.js +10 -0
- package/dist/esm/impl/ltc/index.d.ts +3 -0
- package/dist/esm/impl/ltc/index.d.ts.map +1 -0
- package/dist/esm/impl/ltc/index.js +3 -0
- package/dist/esm/impl/ltc/ltc.d.ts +9 -0
- package/dist/esm/impl/ltc/ltc.d.ts.map +1 -0
- package/dist/esm/impl/ltc/ltc.js +16 -0
- package/dist/esm/impl/ltc/tltc.d.ts +9 -0
- package/dist/esm/impl/ltc/tltc.d.ts.map +1 -0
- package/dist/esm/impl/ltc/tltc.js +15 -0
- package/dist/esm/impl/zec/index.d.ts +3 -0
- package/dist/esm/impl/zec/index.d.ts.map +1 -0
- package/dist/esm/impl/zec/index.js +3 -0
- package/dist/esm/impl/zec/tzec.d.ts +9 -0
- package/dist/esm/impl/zec/tzec.d.ts.map +1 -0
- package/dist/esm/impl/zec/tzec.js +11 -0
- package/dist/esm/impl/zec/zec.d.ts +12 -0
- package/dist/esm/impl/zec/zec.d.ts.map +1 -0
- package/dist/esm/impl/zec/zec.js +11 -0
- package/dist/esm/index.d.ts +23 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +23 -0
- package/dist/esm/keychains.d.ts +57 -0
- package/dist/esm/keychains.d.ts.map +1 -0
- package/dist/esm/keychains.js +100 -0
- package/dist/esm/names.d.ts +36 -0
- package/dist/esm/names.d.ts.map +1 -0
- package/dist/esm/names.js +184 -0
- package/dist/esm/offlineVault/OfflineVaultHalfSigned.d.ts +9 -0
- package/dist/esm/offlineVault/OfflineVaultHalfSigned.d.ts.map +1 -0
- package/dist/esm/offlineVault/OfflineVaultHalfSigned.js +21 -0
- package/dist/esm/offlineVault/OfflineVaultSignable.d.ts +46 -0
- package/dist/esm/offlineVault/OfflineVaultSignable.d.ts.map +1 -0
- package/dist/esm/offlineVault/OfflineVaultSignable.js +18 -0
- package/dist/esm/offlineVault/TransactionExplanation.d.ts +16 -0
- package/dist/esm/offlineVault/TransactionExplanation.d.ts.map +1 -0
- package/dist/esm/offlineVault/TransactionExplanation.js +12 -0
- package/dist/esm/offlineVault/descriptor/index.d.ts +2 -0
- package/dist/esm/offlineVault/descriptor/index.d.ts.map +1 -0
- package/dist/esm/offlineVault/descriptor/index.js +2 -0
- package/dist/esm/offlineVault/descriptor/transaction.d.ts +40 -0
- package/dist/esm/offlineVault/descriptor/transaction.d.ts.map +1 -0
- package/dist/esm/offlineVault/descriptor/transaction.js +41 -0
- package/dist/esm/offlineVault/index.d.ts +6 -0
- package/dist/esm/offlineVault/index.d.ts.map +1 -0
- package/dist/esm/offlineVault/index.js +4 -0
- package/dist/esm/recovery/RecoveryProvider.d.ts +20 -0
- package/dist/esm/recovery/RecoveryProvider.d.ts.map +1 -0
- package/dist/esm/recovery/RecoveryProvider.js +19 -0
- package/dist/esm/recovery/backupKeyRecovery.d.ts +90 -0
- package/dist/esm/recovery/backupKeyRecovery.d.ts.map +1 -0
- package/dist/esm/recovery/backupKeyRecovery.js +330 -0
- package/dist/esm/recovery/baseApi.d.ts +24 -0
- package/dist/esm/recovery/baseApi.d.ts.map +1 -0
- package/dist/esm/recovery/baseApi.js +64 -0
- package/dist/esm/recovery/coingeckoApi.d.ts +6 -0
- package/dist/esm/recovery/coingeckoApi.d.ts.map +1 -0
- package/dist/esm/recovery/coingeckoApi.js +40 -0
- package/dist/esm/recovery/crossChainRecovery.d.ts +97 -0
- package/dist/esm/recovery/crossChainRecovery.d.ts.map +1 -0
- package/dist/esm/recovery/crossChainRecovery.js +293 -0
- package/dist/esm/recovery/index.d.ts +7 -0
- package/dist/{src → esm}/recovery/index.d.ts.map +1 -1
- package/dist/esm/recovery/index.js +7 -0
- package/dist/esm/recovery/mempoolApi.d.ts +7 -0
- package/dist/{src → esm}/recovery/mempoolApi.d.ts.map +1 -1
- package/dist/esm/recovery/mempoolApi.js +29 -0
- package/dist/esm/recovery/psbt.d.ts +62 -0
- package/dist/esm/recovery/psbt.d.ts.map +1 -0
- package/dist/esm/recovery/psbt.js +145 -0
- package/dist/esm/tnumber.d.ts +4 -0
- package/dist/esm/tnumber.d.ts.map +1 -0
- package/dist/esm/tnumber.js +9 -0
- package/dist/esm/transaction/bip322.d.ts +27 -0
- package/dist/esm/transaction/bip322.d.ts.map +1 -0
- package/dist/esm/transaction/bip322.js +101 -0
- package/dist/esm/transaction/common/verifyPayGoAmount.d.ts +1 -0
- package/dist/esm/transaction/common/verifyPayGoAmount.d.ts.map +1 -0
- package/dist/esm/transaction/common/verifyPayGoAmount.js +1 -0
- package/dist/esm/transaction/decode.d.ts +12 -0
- package/dist/esm/transaction/decode.d.ts.map +1 -0
- package/dist/esm/transaction/decode.js +46 -0
- package/dist/esm/transaction/descriptor/explainPsbt.d.ts +5 -0
- package/dist/esm/transaction/descriptor/explainPsbt.d.ts.map +1 -0
- package/dist/esm/transaction/descriptor/explainPsbt.js +42 -0
- package/dist/esm/transaction/descriptor/index.d.ts +7 -0
- package/dist/esm/transaction/descriptor/index.d.ts.map +1 -0
- package/dist/esm/transaction/descriptor/index.js +6 -0
- package/dist/esm/transaction/descriptor/parse.d.ts +19 -0
- package/dist/esm/transaction/descriptor/parse.d.ts.map +1 -0
- package/dist/esm/transaction/descriptor/parse.js +86 -0
- package/dist/esm/transaction/descriptor/parseToAmountType.d.ts +14 -0
- package/dist/esm/transaction/descriptor/parseToAmountType.d.ts.map +1 -0
- package/dist/esm/transaction/descriptor/parseToAmountType.js +55 -0
- package/dist/esm/transaction/descriptor/recipient.d.ts +5 -0
- package/dist/esm/transaction/descriptor/recipient.d.ts.map +1 -0
- package/dist/esm/transaction/descriptor/recipient.js +2 -0
- package/dist/esm/transaction/descriptor/signPsbt.d.ts +24 -0
- package/dist/esm/transaction/descriptor/signPsbt.d.ts.map +1 -0
- package/dist/esm/transaction/descriptor/signPsbt.js +39 -0
- package/dist/esm/transaction/descriptor/verifyTransaction.d.ts +37 -0
- package/dist/esm/transaction/descriptor/verifyTransaction.d.ts.map +1 -0
- package/dist/esm/transaction/descriptor/verifyTransaction.js +71 -0
- package/dist/esm/transaction/explainTransaction.d.ts +20 -0
- package/dist/esm/transaction/explainTransaction.d.ts.map +1 -0
- package/dist/esm/transaction/explainTransaction.js +53 -0
- package/dist/esm/transaction/fetchInputs.d.ts +27 -0
- package/dist/esm/transaction/fetchInputs.d.ts.map +1 -0
- package/dist/esm/transaction/fetchInputs.js +74 -0
- package/dist/esm/transaction/fixedScript/SigningError.d.ts +26 -0
- package/dist/esm/transaction/fixedScript/SigningError.d.ts.map +1 -0
- package/dist/esm/transaction/fixedScript/SigningError.js +28 -0
- package/dist/esm/transaction/fixedScript/explainPsbtWasm.d.ts +11 -0
- package/dist/esm/transaction/fixedScript/explainPsbtWasm.d.ts.map +1 -0
- package/dist/esm/transaction/fixedScript/explainPsbtWasm.js +64 -0
- package/dist/esm/transaction/fixedScript/explainTransaction.d.ts +74 -0
- package/dist/esm/transaction/fixedScript/explainTransaction.d.ts.map +1 -0
- package/dist/esm/transaction/fixedScript/explainTransaction.js +305 -0
- package/dist/esm/transaction/fixedScript/index.d.ts +10 -0
- package/dist/esm/transaction/fixedScript/index.d.ts.map +1 -0
- package/dist/esm/transaction/fixedScript/index.js +9 -0
- package/dist/esm/transaction/fixedScript/musig2.d.ts +4 -0
- package/dist/esm/transaction/fixedScript/musig2.d.ts.map +1 -0
- package/dist/esm/transaction/fixedScript/musig2.js +2 -0
- package/dist/esm/transaction/fixedScript/parseOutput.d.ts +28 -0
- package/dist/esm/transaction/fixedScript/parseOutput.d.ts.map +1 -0
- package/dist/esm/transaction/fixedScript/parseOutput.js +209 -0
- package/dist/esm/transaction/fixedScript/parseTransaction.d.ts +8 -0
- package/dist/esm/transaction/fixedScript/parseTransaction.d.ts.map +1 -0
- package/dist/esm/transaction/fixedScript/parseTransaction.js +201 -0
- package/dist/esm/transaction/fixedScript/replayProtection.d.ts +9 -0
- package/dist/esm/transaction/fixedScript/replayProtection.d.ts.map +1 -0
- package/dist/esm/transaction/fixedScript/replayProtection.js +40 -0
- package/dist/esm/transaction/fixedScript/signLegacyTransaction.d.ts +32 -0
- package/dist/esm/transaction/fixedScript/signLegacyTransaction.d.ts.map +1 -0
- package/dist/esm/transaction/fixedScript/signLegacyTransaction.js +115 -0
- package/dist/esm/transaction/fixedScript/signPsbtUtxolib.d.ts +21 -0
- package/dist/esm/transaction/fixedScript/signPsbtUtxolib.d.ts.map +1 -0
- package/dist/esm/transaction/fixedScript/signPsbtUtxolib.js +117 -0
- package/dist/esm/transaction/fixedScript/signPsbtWasm.d.ts +18 -0
- package/dist/esm/transaction/fixedScript/signPsbtWasm.d.ts.map +1 -0
- package/dist/esm/transaction/fixedScript/signPsbtWasm.js +98 -0
- package/dist/esm/transaction/fixedScript/signTransaction.d.ts +26 -0
- package/dist/esm/transaction/fixedScript/signTransaction.d.ts.map +1 -0
- package/dist/esm/transaction/fixedScript/signTransaction.js +64 -0
- package/dist/esm/transaction/fixedScript/verifyTransaction.d.ts +21 -0
- package/dist/esm/transaction/fixedScript/verifyTransaction.d.ts.map +1 -0
- package/dist/esm/transaction/fixedScript/verifyTransaction.js +160 -0
- package/dist/esm/transaction/getPayGoVerificationPubkey.d.ts +9 -0
- package/dist/esm/transaction/getPayGoVerificationPubkey.d.ts.map +1 -0
- package/dist/esm/transaction/getPayGoVerificationPubkey.js +17 -0
- package/dist/esm/transaction/index.d.ts +8 -0
- package/dist/esm/transaction/index.d.ts.map +1 -0
- package/dist/esm/transaction/index.js +8 -0
- package/dist/esm/transaction/outputDifference.d.ts +44 -0
- package/dist/esm/transaction/outputDifference.d.ts.map +1 -0
- package/dist/esm/transaction/outputDifference.js +45 -0
- package/dist/esm/transaction/parseTransaction.d.ts +4 -0
- package/dist/esm/transaction/parseTransaction.d.ts.map +1 -0
- package/dist/esm/transaction/parseTransaction.js +12 -0
- package/dist/esm/transaction/recipient.d.ts +34 -0
- package/dist/esm/transaction/recipient.d.ts.map +1 -0
- package/dist/esm/transaction/recipient.js +63 -0
- package/dist/esm/transaction/signTransaction.d.ts +6 -0
- package/dist/esm/transaction/signTransaction.d.ts.map +1 -0
- package/dist/esm/transaction/signTransaction.js +66 -0
- package/dist/esm/transaction/types.d.ts +49 -0
- package/dist/esm/transaction/types.d.ts.map +1 -0
- package/dist/esm/transaction/types.js +4 -0
- package/dist/esm/transaction/verifyTransaction.d.ts +4 -0
- package/dist/esm/transaction/verifyTransaction.d.ts.map +1 -0
- package/dist/esm/transaction/verifyTransaction.js +14 -0
- package/dist/esm/unspent.d.ts +55 -0
- package/dist/esm/unspent.d.ts.map +1 -0
- package/dist/esm/unspent.js +8 -0
- package/dist/esm/verifyKey.d.ts +29 -0
- package/dist/esm/verifyKey.d.ts.map +1 -0
- package/dist/esm/verifyKey.js +123 -0
- package/dist/esm/wallet.d.ts +15 -0
- package/dist/esm/wallet.d.ts.map +1 -0
- package/dist/esm/wallet.js +5 -0
- package/dist/esm/wasmUtil.d.ts +29 -0
- package/dist/esm/wasmUtil.d.ts.map +1 -0
- package/dist/esm/wasmUtil.js +47 -0
- package/package.json +47 -18
- package/.eslintignore +0 -5
- package/CHANGELOG.md +0 -235
- package/dist/src/abstractUtxoCoin.d.ts +0 -392
- package/dist/src/abstractUtxoCoin.d.ts.map +0 -1
- package/dist/src/abstractUtxoCoin.js +0 -931
- package/dist/src/config.js +0 -14
- package/dist/src/index.d.ts +0 -6
- package/dist/src/index.d.ts.map +0 -1
- package/dist/src/index.js +0 -18
- package/dist/src/parseOutput.d.ts +0 -22
- package/dist/src/parseOutput.d.ts.map +0 -1
- package/dist/src/parseOutput.js +0 -170
- package/dist/src/recovery/RecoveryProvider.d.ts.map +0 -1
- package/dist/src/recovery/RecoveryProvider.js +0 -24
- package/dist/src/recovery/backupKeyRecovery.d.ts +0 -62
- package/dist/src/recovery/backupKeyRecovery.d.ts.map +0 -1
- package/dist/src/recovery/backupKeyRecovery.js +0 -293
- package/dist/src/recovery/baseApi.d.ts.map +0 -1
- package/dist/src/recovery/baseApi.js +0 -73
- package/dist/src/recovery/coingeckoApi.d.ts.map +0 -1
- package/dist/src/recovery/coingeckoApi.js +0 -47
- package/dist/src/recovery/crossChainRecovery.d.ts.map +0 -1
- package/dist/src/recovery/crossChainRecovery.js +0 -294
- package/dist/src/recovery/mempoolApi.js +0 -33
- package/dist/src/recovery/smartbitApi.d.ts +0 -11
- package/dist/src/recovery/smartbitApi.d.ts.map +0 -1
- package/dist/src/recovery/smartbitApi.js +0 -36
- package/dist/src/replayProtection.d.ts +0 -4
- package/dist/src/replayProtection.d.ts.map +0 -1
- package/dist/src/replayProtection.js +0 -21
- package/dist/src/sign.d.ts +0 -31
- package/dist/src/sign.d.ts.map +0 -1
- package/dist/src/sign.js +0 -104
- package/dist/tsconfig.tsbuildinfo +0 -8015
- /package/dist/{src → cjs/src}/config.d.ts +0 -0
- /package/dist/{src → cjs/src}/recovery/mempoolApi.d.ts +0 -0
- /package/dist/{src → esm}/config.d.ts.map +0 -0
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
import debugLib from 'debug';
|
|
2
|
+
import _ from 'lodash';
|
|
3
|
+
import { InvalidAddressDerivationPropertyError, UnexpectedAddressError, } from '@bitgo-beta/sdk-core';
|
|
4
|
+
import { fromExtendedAddressFormatToScript } from '../recipient';
|
|
5
|
+
const debug = debugLib('bitgo:v2:parseoutput');
|
|
6
|
+
export function isWalletOutput(output) {
|
|
7
|
+
return (output.chain !== undefined && output.index !== undefined);
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Check an address which failed initial validation to see if it's the base address of a migrated v1 bch wallet.
|
|
11
|
+
*
|
|
12
|
+
* The wallet in question could be a migrated SafeHD BCH wallet, and the transaction we
|
|
13
|
+
* are currently parsing is trying to spend change back to the v1 wallet base address.
|
|
14
|
+
*
|
|
15
|
+
* It does this since we don't allow new address creation for these wallets,
|
|
16
|
+
* and instead return the base address from the v1 wallet when a new address is requested.
|
|
17
|
+
* If this new address is requested for the purposes of spending change back to the wallet,
|
|
18
|
+
* the change will go to the v1 wallet base address. This address *is* on the wallet,
|
|
19
|
+
* but it will still cause an error to be thrown by verifyAddress, since the derivation path
|
|
20
|
+
* used for this address is non-standard. (I have seen these addresses derived using paths m/0/0 and m/101,
|
|
21
|
+
* whereas the v2 addresses are derived using path m/0/0/${chain}/${index}).
|
|
22
|
+
*
|
|
23
|
+
* This means we need to check for this case explicitly in this catch block, and classify
|
|
24
|
+
* these types of outputs as internal instead of external. Failing to do so would cause the
|
|
25
|
+
* transaction's implicit external outputs (ie, outputs which go to addresses not specified in
|
|
26
|
+
* the recipients array) to add up to more than the 150 basis point limit which we enforce on
|
|
27
|
+
* pay-as-you-go outputs (which should be the only implicit external outputs on our transactions).
|
|
28
|
+
*
|
|
29
|
+
* The 150 basis point limit for implicit external sends is enforced in verifyTransaction,
|
|
30
|
+
* which calls this function to get information on the total external/internal spend amounts
|
|
31
|
+
* for a transaction. The idea here is to protect from the transaction being maliciously modified
|
|
32
|
+
* to add more implicit external spends (eg, to an attacker-controlled wallet).
|
|
33
|
+
*
|
|
34
|
+
* See verifyTransaction for more information on how transaction prebuilds are verified before signing.
|
|
35
|
+
*
|
|
36
|
+
* @param wallet {Wallet} wallet which is making the transaction
|
|
37
|
+
* @param currentAddress {string} address to check for externality relative to v1 wallet base address
|
|
38
|
+
*/
|
|
39
|
+
function isMigratedAddress(wallet, currentAddress) {
|
|
40
|
+
if (_.isString(wallet.migratedFrom()) && wallet.migratedFrom() === currentAddress) {
|
|
41
|
+
debug('found address %s which was migrated from v1 wallet, address is not external', currentAddress);
|
|
42
|
+
return true;
|
|
43
|
+
}
|
|
44
|
+
return false;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Check to see if an address is derived from the given custom change keys
|
|
48
|
+
* @param {VerifyCustomChangeAddressOptions} params
|
|
49
|
+
* @return {boolean}
|
|
50
|
+
*/
|
|
51
|
+
async function verifyCustomChangeAddress(params) {
|
|
52
|
+
const { coin, customChangeKeys, addressDetails, currentAddress } = params;
|
|
53
|
+
try {
|
|
54
|
+
return await coin.verifyAddress(_.extend({}, addressDetails, {
|
|
55
|
+
keychains: customChangeKeys,
|
|
56
|
+
address: currentAddress,
|
|
57
|
+
}));
|
|
58
|
+
}
|
|
59
|
+
catch (e) {
|
|
60
|
+
debug('failed to verify custom change address %s', currentAddress);
|
|
61
|
+
return false;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
async function handleVerifyAddressError({ e, currentAddress, wallet, txParams, customChangeKeys, coin, addressDetails, considerMigratedFromAddressInternal, }) {
|
|
65
|
+
// Todo: name server-side errors to avoid message-based checking [BG-5124]
|
|
66
|
+
const walletAddressNotFound = e.message.includes('wallet address not found');
|
|
67
|
+
const unexpectedAddress = e instanceof UnexpectedAddressError;
|
|
68
|
+
if (walletAddressNotFound || unexpectedAddress) {
|
|
69
|
+
if (unexpectedAddress && !walletAddressNotFound) {
|
|
70
|
+
// check to see if this is a migrated v1 bch address - it could be internal
|
|
71
|
+
const isMigrated = isMigratedAddress(wallet, currentAddress);
|
|
72
|
+
if (isMigrated) {
|
|
73
|
+
return { external: considerMigratedFromAddressInternal === false };
|
|
74
|
+
}
|
|
75
|
+
debug('Address %s was found on wallet but could not be reconstructed', currentAddress);
|
|
76
|
+
// attempt to verify address using custom change address keys if the wallet has that feature enabled
|
|
77
|
+
if (customChangeKeys &&
|
|
78
|
+
(await verifyCustomChangeAddress({ coin, addressDetails, currentAddress, customChangeKeys }))) {
|
|
79
|
+
// address is valid against the custom change keys. Mark address as not external
|
|
80
|
+
// and request signature verification for the custom change keys
|
|
81
|
+
debug('Address %s verified as derived from the custom change keys', currentAddress);
|
|
82
|
+
return { external: false, needsCustomChangeKeySignatureVerification: true };
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
// the address was found, but not on the wallet, which simply means it's external
|
|
86
|
+
debug('Address %s presumed external', currentAddress);
|
|
87
|
+
return { external: true };
|
|
88
|
+
}
|
|
89
|
+
else if (e instanceof InvalidAddressDerivationPropertyError && currentAddress === txParams.changeAddress) {
|
|
90
|
+
// expect to see this error when passing in a custom changeAddress with no chain or index
|
|
91
|
+
return { external: false };
|
|
92
|
+
}
|
|
93
|
+
console.error('Address classification failed for address', currentAddress);
|
|
94
|
+
console.trace(e);
|
|
95
|
+
/**
|
|
96
|
+
* It might be a completely invalid address or a bad validation attempt or something else completely, in
|
|
97
|
+
* which case we do not proceed and rather rethrow the error, which is safer than assuming that the address
|
|
98
|
+
* validation failed simply because it's external to the wallet.
|
|
99
|
+
*/
|
|
100
|
+
throw e;
|
|
101
|
+
}
|
|
102
|
+
async function fetchAddressDetails({ reqId, disableNetworking, addressDetailsPrebuild, addressDetailsVerification, currentAddress, wallet, }) {
|
|
103
|
+
let addressDetails = _.extend({}, addressDetailsPrebuild, addressDetailsVerification);
|
|
104
|
+
debug('Locally available address %s details: %O', currentAddress, addressDetails);
|
|
105
|
+
if (_.isEmpty(addressDetails) && !disableNetworking) {
|
|
106
|
+
addressDetails = await wallet.getAddress({ address: currentAddress, reqId });
|
|
107
|
+
debug('Downloaded address %s details: %O', currentAddress, addressDetails);
|
|
108
|
+
}
|
|
109
|
+
return addressDetails;
|
|
110
|
+
}
|
|
111
|
+
export async function parseOutput({ currentOutput, coin, txPrebuild, verification, keychainArray, wallet, txParams, customChange, reqId, }) {
|
|
112
|
+
const disableNetworking = !!verification.disableNetworking;
|
|
113
|
+
const currentAddress = currentOutput.address;
|
|
114
|
+
if (currentAddress === undefined) {
|
|
115
|
+
// In the case that the address is undefined, it means that the output has a non-encodeable scriptPubkey
|
|
116
|
+
// If this is the case, then we need to check that the amount is 0 and we can skip the rest.
|
|
117
|
+
if (currentOutput.amount.toString() !== '0') {
|
|
118
|
+
throw new Error('output with undefined address must have amount of 0');
|
|
119
|
+
}
|
|
120
|
+
return currentOutput;
|
|
121
|
+
}
|
|
122
|
+
// attempt to grab the address details from either the prebuilt tx, or the verification params.
|
|
123
|
+
// If both of these are empty, then we will try to get the address details from bitgo instead
|
|
124
|
+
const addressDetailsPrebuild = _.get(txPrebuild, `txInfo.walletAddressDetails.${currentAddress}`, {});
|
|
125
|
+
const addressDetailsVerification = verification?.addresses?.[currentAddress] ?? {};
|
|
126
|
+
debug('Parsing address details for %s', currentAddress);
|
|
127
|
+
let currentAddressDetails = undefined;
|
|
128
|
+
const RECIPIENT_THRESHOLD = 1000;
|
|
129
|
+
try {
|
|
130
|
+
// In the case of PSBTs, we can already determine the internal/external status of the output addresses
|
|
131
|
+
// based on the derivation information being included in the PSBT. We can short circuit GET v2.wallet.address
|
|
132
|
+
// and save on network requests. Since we have the derivation information already, we can still verify the address
|
|
133
|
+
if (currentOutput.external !== undefined) {
|
|
134
|
+
// In the case that we have a custom change wallet, we need to verify the address against the custom change keys
|
|
135
|
+
// and not the wallet keys. This check is done in the handleVerifyAddressError function if this error is thrown.
|
|
136
|
+
if (customChange !== undefined) {
|
|
137
|
+
throw new UnexpectedAddressError('`address validation failure');
|
|
138
|
+
}
|
|
139
|
+
// If it is an internal address, we can skip the network request and just verify the address locally with the
|
|
140
|
+
// derivation information we have. Otherwise, if the address is external, which is the only remaining case, we
|
|
141
|
+
// can just return the current output as is without contacting the server.
|
|
142
|
+
if (isWalletOutput(currentOutput)) {
|
|
143
|
+
const res = await coin.isWalletAddress({
|
|
144
|
+
keychains: keychainArray,
|
|
145
|
+
address: currentAddress,
|
|
146
|
+
chain: currentOutput.chain,
|
|
147
|
+
index: currentOutput.index,
|
|
148
|
+
});
|
|
149
|
+
if (!res) {
|
|
150
|
+
throw new UnexpectedAddressError();
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
return currentOutput;
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* For transaction with the legacy transaction format, the only way to
|
|
157
|
+
* determine whether an address is known on the wallet is to initiate a
|
|
158
|
+
* network request and fetch it. Should the request fail and return a 404,
|
|
159
|
+
* it will throw and therefore has to be caught. For that reason, address
|
|
160
|
+
* wallet ownership detection is wrapped in a try/catch. Additionally, once
|
|
161
|
+
* the address details are fetched on the wallet, a local address validation
|
|
162
|
+
* is run, whose errors however are generated client-side and can therefore
|
|
163
|
+
* be analyzed with more granularity and type checking.
|
|
164
|
+
*/
|
|
165
|
+
/**
|
|
166
|
+
* In order to minimize API requests, we assume that explicit recipients are always external when the
|
|
167
|
+
* recipient list is > 1000 This is not always a valid assumption and could lead greater apparent spend (but never lower)
|
|
168
|
+
*/
|
|
169
|
+
if (txParams.recipients !== undefined && txParams.recipients.length > RECIPIENT_THRESHOLD) {
|
|
170
|
+
const isCurrentAddressInRecipients = txParams.recipients.some((recipient) => fromExtendedAddressFormatToScript(recipient.address, coin.name).equals(fromExtendedAddressFormatToScript(currentAddress, coin.name)));
|
|
171
|
+
if (isCurrentAddressInRecipients) {
|
|
172
|
+
return { ...currentOutput };
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
const addressDetails = await fetchAddressDetails({
|
|
176
|
+
reqId,
|
|
177
|
+
addressDetailsVerification,
|
|
178
|
+
addressDetailsPrebuild,
|
|
179
|
+
currentAddress,
|
|
180
|
+
disableNetworking,
|
|
181
|
+
wallet,
|
|
182
|
+
});
|
|
183
|
+
// verify that the address is on the wallet. verifyAddress throws if
|
|
184
|
+
// it fails to correctly rederive the address, meaning it's external
|
|
185
|
+
currentAddressDetails = addressDetails;
|
|
186
|
+
await coin.verifyAddress(_.extend({}, addressDetails, {
|
|
187
|
+
keychains: keychainArray,
|
|
188
|
+
address: currentAddress,
|
|
189
|
+
}));
|
|
190
|
+
debug('Address %s verification passed', currentAddress);
|
|
191
|
+
// verify address succeeded without throwing, so the address was
|
|
192
|
+
// correctly rederived from the wallet keychains, making it not external
|
|
193
|
+
return _.extend({}, currentOutput, addressDetails, { external: false });
|
|
194
|
+
}
|
|
195
|
+
catch (e) {
|
|
196
|
+
debug('Address %s verification threw an error:', currentAddress, e);
|
|
197
|
+
return _.extend({}, currentOutput, await handleVerifyAddressError({
|
|
198
|
+
e,
|
|
199
|
+
coin,
|
|
200
|
+
currentAddress,
|
|
201
|
+
wallet,
|
|
202
|
+
txParams,
|
|
203
|
+
customChangeKeys: customChange && customChange.keys,
|
|
204
|
+
addressDetails: currentAddressDetails,
|
|
205
|
+
considerMigratedFromAddressInternal: verification.considerMigratedFromAddressInternal,
|
|
206
|
+
}));
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyc2VPdXRwdXQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvdHJhbnNhY3Rpb24vZml4ZWRTY3JpcHQvcGFyc2VPdXRwdXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxRQUFRLE1BQU0sT0FBTyxDQUFDO0FBQzdCLE9BQU8sQ0FBQyxNQUFNLFFBQVEsQ0FBQztBQUN2QixPQUFPLEVBR0wscUNBQXFDLEVBR3JDLHNCQUFzQixHQUl2QixNQUFNLHNCQUFzQixDQUFDO0FBSTlCLE9BQU8sRUFBRSxpQ0FBaUMsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUVqRSxNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsc0JBQXNCLENBQUMsQ0FBQztBQUUvQyxNQUFNLFVBQVUsY0FBYyxDQUFDLE1BQWM7SUFDM0MsT0FBTyxDQUNKLE1BQWtDLENBQUMsS0FBSyxLQUFLLFNBQVMsSUFBSyxNQUFrQyxDQUFDLEtBQUssS0FBSyxTQUFTLENBQ25ILENBQUM7QUFDSixDQUFDO0FBT0Q7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBNkJHO0FBQ0gsU0FBUyxpQkFBaUIsQ0FBQyxNQUFlLEVBQUUsY0FBc0I7SUFDaEUsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxZQUFZLEVBQUUsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxZQUFZLEVBQUUsS0FBSyxjQUFjLEVBQUUsQ0FBQztRQUNsRixLQUFLLENBQUMsNkVBQTZFLEVBQUUsY0FBYyxDQUFDLENBQUM7UUFDckcsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDO0FBU0Q7Ozs7R0FJRztBQUNILEtBQUssVUFBVSx5QkFBeUIsQ0FBQyxNQUF3QztJQUMvRSxNQUFNLEVBQUUsSUFBSSxFQUFFLGdCQUFnQixFQUFFLGNBQWMsRUFBRSxjQUFjLEVBQUUsR0FBRyxNQUFNLENBQUM7SUFDMUUsSUFBSSxDQUFDO1FB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bnQiOlsiaW1wb3J0IGRlYnVnTGliIGZyb20gJ2RlYnVnJztcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQge1xuICBBZGRyZXNzVmVyaWZpY2F0aW9uRGF0YSxcbiAgSVJlcXVlc3RUcmFjZXIsXG4gIEludmFsaWRBZGRyZXNzRGVyaXZhdGlvblByb3BlcnR5RXJyb3IsXG4gIElXYWxsZXQsXG4gIFRyYW5zYWN0aW9uUHJlYnVpbGQsXG4gIFVuZXhwZWN0ZWRBZGRyZXNzRXJyb3IsXG4gIFZlcmlmaWNhdGlvbk9wdGlvbnMsXG4gIElUcmFuc2FjdGlvblJlY2lwaWVudCxcbiAgVHJpcGxlLFxufSBmcm9tICdAYml0Z28tYmV0YS9zZGstY29yZSc7XG5cbmltcG9ydCB7IEFic3RyYWN0VXR4b0NvaW4gfSBmcm9tICcuLi8uLi9hYnN0cmFjdFV0eG9Db2luJztcbmltcG9ydCB7IE91dHB1dCwgRml4ZWRTY3JpcHRXYWxsZXRPdXRwdXQgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgeyBmcm9tRXh0ZW5kZWRBZGRyZXNzRm9ybWF0VG9TY3JpcHQgfSBmcm9tICcuLi9yZWNpcGllbnQnO1xuXG5jb25zdCBkZWJ1ZyA9IGRlYnVnTGliKCdiaXRnbzp2MjpwYXJzZW91dHB1dCcpO1xuXG5leHBvcnQgZnVuY3Rpb24gaXNXYWxsZXRPdXRwdXQob3V0cHV0OiBPdXRwdXQpOiBvdXRwdXQgaXMgRml4ZWRTY3JpcHRXYWxsZXRPdXRwdXQge1xuICByZXR1cm4gKFxuICAgIChvdXRwdXQgYXMgRml4ZWRTY3JpcHRXYWxsZXRPdXRwdXQpLmNoYWluICE9PSB1bmRlZmluZWQgJiYgKG91dHB1dCBhcyBGaXhlZFNjcmlwdFdhbGxldE91dHB1dCkuaW5kZXggIT09IHVuZGVmaW5lZFxuICApO1xufVxuXG5pbnRlcmZhY2UgSGFuZGxlVmVyaWZ5QWRkcmVzc0Vycm9yUmVzcG9uc2Uge1xuICBleHRlcm5hbDogYm9vbGVhbjtcbiAgbmVlZHNDdXN0b21DaGFuZ2VLZXlTaWduYXR1cmVWZXJpZmljYXRpb24/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIENoZWNrIGFuIGFkZHJlc3Mgd2hpY2ggZmFpbGVkIGluaXRpYWwgdmFsaWRhdGlvbiB0byBzZWUgaWYgaXQncyB0aGUgYmFzZSBhZGRyZXNzIG9mIGEgbWlncmF0ZWQgdjEgYmNoIHdhbGxldC5cbiAqXG4gKiBUaGUgd2FsbGV0IGluIHF1ZXN0aW9uIGNvdWxkIGJlIGEgbWlncmF0ZWQgU2FmZUhEIEJDSCB3YWxsZXQsIGFuZCB0aGUgdHJhbnNhY3Rpb24gd2VcbiAqIGFyZSBjdXJyZW50bHkgcGFyc2luZyBpcyB0cnlpbmcgdG8gc3BlbmQgY2hhbmdlIGJhY2sgdG8gdGhlIHYxIHdhbGxldCBiYXNlIGFkZHJlc3MuXG4gKlxuICogSXQgZG9lcyB0aGlzIHNpbmNlIHdlIGRvbid0IGFsbG93IG5ldyBhZGRyZXNzIGNyZWF0aW9uIGZvciB0aGVzZSB3YWxsZXRzLFxuICogYW5kIGluc3RlYWQgcmV0dXJuIHRoZSBiYXNlIGFkZHJlc3MgZnJvbSB0aGUgdjEgd2FsbGV0IHdoZW4gYSBuZXcgYWRkcmVzcyBpcyByZXF1ZXN0ZWQuXG4gKiBJZiB0aGlzIG5ldyBhZGRyZXNzIGlzIHJlcXVlc3RlZCBmb3IgdGhlIHB1cnBvc2VzIG9mIHNwZW5kaW5nIGNoYW5nZSBiYWNrIHRvIHRoZSB3YWxsZXQsXG4gKiB0aGUgY2hhbmdlIHdpbGwgZ28gdG8gdGhlIHYxIHdhbGxldCBiYXNlIGFkZHJlc3MuIFRoaXMgYWRkcmVzcyAqaXMqIG9uIHRoZSB3YWxsZXQsXG4gKiBidXQgaXQgd2lsbCBzdGlsbCBjYXVzZSBhbiBlcnJvciB0byBiZSB0aHJvd24gYnkgdmVyaWZ5QWRkcmVzcywgc2luY2UgdGhlIGRlcml2YXRpb24gcGF0aFxuICogdXNlZCBmb3IgdGhpcyBhZGRyZXNzIGlzIG5vbi1zdGFuZGFyZC4gKEkgaGF2ZSBzZWVuIHRoZXNlIGFkZHJlc3NlcyBkZXJpdmVkIHVzaW5nIHBhdGhzIG0vMC8wIGFuZCBtLzEwMSxcbiAqIHdoZXJlYXMgdGhlIHYyIGFkZHJlc3NlcyBhcmUgZGVyaXZlZCB1c2luZyBwYXRoICBtLzAvMC8ke2NoYWlufS8ke2luZGV4fSkuXG4gKlxuICogVGhpcyBtZWFucyB3ZSBuZWVkIHRvIGNoZWNrIGZvciB0aGlzIGNhc2UgZXhwbGljaXRseSBpbiB0aGlzIGNhdGNoIGJsb2NrLCBhbmQgY2xhc3NpZnlcbiAqIHRoZXNlIHR5cGVzIG9mIG91dHB1dHMgYXMgaW50ZXJuYWwgaW5zdGVhZCBvZiBleHRlcm5hbC4gRmFpbGluZyB0byBkbyBzbyB3b3VsZCBjYXVzZSB0aGVcbiAqIHRyYW5zYWN0aW9uJ3MgaW1wbGljaXQgZXh0ZXJuYWwgb3V0cHV0cyAoaWUsIG91dHB1dHMgd2hpY2ggZ28gdG8gYWRkcmVzc2VzIG5vdCBzcGVjaWZpZWQgaW5cbiAqIHRoZSByZWNpcGllbnRzIGFycmF5KSB0byBhZGQgdXAgdG8gbW9yZSB0aGFuIHRoZSAxNTAgYmFzaXMgcG9pbnQgbGltaXQgd2hpY2ggd2UgZW5mb3JjZSBvblxuICogcGF5LWFzLXlvdS1nbyBvdXRwdXRzICh3aGljaCBzaG91bGQgYmUgdGhlIG9ubHkgaW1wbGljaXQgZXh0ZXJuYWwgb3V0cHV0cyBvbiBvdXIgdHJhbnNhY3Rpb25zKS5cbiAqXG4gKiBUaGUgMTUwIGJhc2lzIHBvaW50IGxpbWl0IGZvciBpbXBsaWNpdCBleHRlcm5hbCBzZW5kcyBpcyBlbmZvcmNlZCBpbiB2ZXJpZnlUcmFuc2FjdGlvbixcbiAqIHdoaWNoIGNhbGxzIHRoaXMgZnVuY3Rpb24gdG8gZ2V0IGluZm9ybWF0aW9uIG9uIHRoZSB0b3RhbCBleHRlcm5hbC9pbnRlcm5hbCBzcGVuZCBhbW91bnRzXG4gKiBmb3IgYSB0cmFuc2FjdGlvbi4gVGhlIGlkZWEgaGVyZSBpcyB0byBwcm90ZWN0IGZyb20gdGhlIHRyYW5zYWN0aW9uIGJlaW5nIG1hbGljaW91c2x5IG1vZGlmaWVkXG4gKiB0byBhZGQgbW9yZSBpbXBsaWNpdCBleHRlcm5hbCBzcGVuZHMgKGVnLCB0byBhbiBhdHRhY2tlci1jb250cm9sbGVkIHdhbGxldCkuXG4gKlxuICogU2VlIHZlcmlmeVRyYW5zYWN0aW9uIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIGhvdyB0cmFuc2FjdGlvbiBwcmVidWlsZHMgYXJlIHZlcmlmaWVkIGJlZm9yZSBzaWduaW5nLlxuICpcbiAqIEBwYXJhbSB3YWxsZXQge1dhbGxldH0gd2FsbGV0IHdoaWNoIGlzIG1ha2luZyB0aGUgdHJhbnNhY3Rpb25cbiAqIEBwYXJhbSBjdXJyZW50QWRkcmVzcyB7c3RyaW5nfSBhZGRyZXNzIHRvIGNoZWNrIGZvciBleHRlcm5hbGl0eSByZWxhdGl2ZSB0byB2MSB3YWxsZXQgYmFzZSBhZGRyZXNzXG4gKi9cbmZ1bmN0aW9uIGlzTWlncmF0ZWRBZGRyZXNzKHdhbGxldDogSVdhbGxldCwgY3VycmVudEFkZHJlc3M6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBpZiAoXy5pc1N0cmluZyh3YWxsZXQubWlncmF0ZWRGcm9tKCkpICYmIHdhbGxldC5taWdyYXRlZEZyb20oKSA9PT0gY3VycmVudEFkZHJlc3MpIHtcbiAgICBkZWJ1ZygnZm91bmQgYWRkcmVzcyAlcyB3aGljaCB3YXMgbWlncmF0ZWQgZnJvbSB2MSB3YWxsZXQsIGFkZHJlc3MgaXMgbm90IGV4dGVybmFsJywgY3VycmVudEFkZHJlc3MpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5pbnRlcmZhY2UgVmVyaWZ5Q3VzdG9tQ2hhbmdlQWRkcmVzc09wdGlvbnMge1xuICBjb2luOiBBYnN0cmFjdFV0eG9Db2luO1xuICBjdXN0b21DaGFuZ2VLZXlzOiBIYW5kbGVWZXJpZnlBZGRyZXNzRXJyb3JPcHRpb25zWydjdXN0b21DaGFuZ2VLZXlzJ107XG4gIGFkZHJlc3NEZXRhaWxzOiBIYW5kbGVWZXJpZnlBZGRyZXNzRXJyb3JPcHRpb25zWydhZGRyZXNzRGV0YWlscyddO1xuICBjdXJyZW50QWRkcmVzczogSGFuZGxlVmVyaWZ5QWRkcmVzc0Vycm9yT3B0aW9uc1snY3VycmVudEFkZHJlc3MnXTtcbn1cblxuLyoqXG4gKiBDaGVjayB0byBzZWUgaWYgYW4gYWRkcmVzcyBpcyBkZXJpdmVkIGZyb20gdGhlIGdpdmVuIGN1c3RvbSBjaGFuZ2Uga2V5c1xuICogQHBhcmFtIHtWZXJpZnlDdXN0b21DaGFuZ2VBZGRyZXNzT3B0aW9uc30gcGFyYW1zXG4gKiBAcmV0dXJuIHtib29sZWFufVxuICovXG5hc3luYyBmdW5jdGlvbiB2ZXJpZnlDdXN0b21DaGFuZ2VBZGRyZXNzKHBhcmFtczogVmVyaWZ5Q3VzdG9tQ2hhbmdlQWRkcmVzc09wdGlvbnMpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgY29uc3QgeyBjb2luLCBjdXN0b21DaGFuZ2VLZXlzLCBhZGRyZXNzRGV0YWlscywgY3VycmVudEFkZHJlc3MgfSA9IHBhcmFtcztcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgY29pbi52ZXJpZnlBZGRyZXNzKFxuICAgICAgXy5leHRlbmQoe30sIGFkZHJlc3NEZXRhaWxzLCB7XG4gICAgICAgIGtleWNoYWluczogY3VzdG9tQ2hhbmdlS2V5cyxcbiAgICAgICAgYWRkcmVzczogY3VycmVudEFkZHJlc3MsXG4gICAgICB9KVxuICAgICk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBkZWJ1ZygnZmFpbGVkIHRvIHZlcmlmeSBjdXN0b20gY2hhbmdlIGFkZHJlc3MgJXMnLCBjdXJyZW50QWRkcmVzcyk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmludGVyZmFjZSBIYW5kbGVWZXJpZnlBZGRyZXNzRXJyb3JPcHRpb25zIHtcbiAgZTogRXJyb3I7XG4gIGN1cnJlbnRBZGRyZXNzOiBzdHJpbmc7XG4gIHdhbGxldDogSVdhbGxldDtcbiAgdHhQYXJhbXM6IHtcbiAgICBjaGFuZ2VBZGRyZXNzPzogc3RyaW5nO1xuICB9O1xuICBjdXN0b21DaGFuZ2VLZXlzPzogQ3VzdG9tQ2hhbmdlT3B0aW9uc1sna2V5cyddO1xuICBjb2luOiBBYnN0cmFjdFV0eG9Db2luO1xuICBhZGRyZXNzRGV0YWlscz86IGFueTtcbiAgY29uc2lkZXJNaWdyYXRlZEZyb21BZGRyZXNzSW50ZXJuYWw/OiBib29sZWFuO1xufVxuXG5hc3luYyBmdW5jdGlvbiBoYW5kbGVWZXJpZnlBZGRyZXNzRXJyb3Ioe1xuICBlLFxuICBjdXJyZW50QWRkcmVzcyxcbiAgd2FsbGV0LFxuICB0eFBhcmFtcyxcbiAgY3VzdG9tQ2hhbmdlS2V5cyxcbiAgY29pbixcbiAgYWRkcmVzc0RldGFpbHMsXG4gIGNvbnNpZGVyTWlncmF0ZWRGcm9tQWRkcmVzc0ludGVybmFsLFxufTogSGFuZGxlVmVyaWZ5QWRkcmVzc0Vycm9yT3B0aW9ucyk6IFByb21pc2U8SGFuZGxlVmVyaWZ5QWRkcmVzc0Vycm9yUmVzcG9uc2U+IHtcbiAgLy8gVG9kbzogbmFtZSBzZXJ2ZXItc2lkZSBlcnJvcnMgdG8gYXZvaWQgbWVzc2FnZS1iYXNlZCBjaGVja2luZyBbQkctNTEyNF1cbiAgY29uc3Qgd2FsbGV0QWRkcmVzc05vdEZvdW5kID0gZS5tZXNzYWdlLmluY2x1ZGVzKCd3YWxsZXQgYWRkcmVzcyBub3QgZm91bmQnKTtcbiAgY29uc3QgdW5leHBlY3RlZEFkZHJlc3MgPSBlIGluc3RhbmNlb2YgVW5leHBlY3RlZEFkZHJlc3NFcnJvcjtcbiAgaWYgKHdhbGxldEFkZHJlc3NOb3RGb3VuZCB8fCB1bmV4cGVjdGVkQWRkcmVzcykge1xuICAgIGlmICh1bmV4cGVjdGVkQWRkcmVzcyAmJiAhd2FsbGV0QWRkcmVzc05vdEZvdW5kKSB7XG4gICAgICAvLyBjaGVjayB0byBzZWUgaWYgdGhpcyBpcyBhIG1pZ3JhdGVkIHYxIGJjaCBhZGRyZXNzIC0gaXQgY291bGQgYmUgaW50ZXJuYWxcbiAgICAgIGNvbnN0IGlzTWlncmF0ZWQgPSBpc01pZ3JhdGVkQWRkcmVzcyh3YWxsZXQsIGN1cnJlbnRBZGRyZXNzKTtcbiAgICAgIGlmIChpc01pZ3JhdGVkKSB7XG4gICAgICAgIHJldHVybiB7IGV4dGVybmFsOiBjb25zaWRlck1pZ3JhdGVkRnJvbUFkZHJlc3NJbnRlcm5hbCA9PT0gZmFsc2UgfTtcbiAgICAgIH1cblxuICAgICAgZGVidWcoJ0FkZHJlc3MgJXMgd2FzIGZvdW5kIG9uIHdhbGxldCBidXQgY291bGQgbm90IGJlIHJlY29uc3RydWN0ZWQnLCBjdXJyZW50QWRkcmVzcyk7XG5cbiAgICAgIC8vIGF0dGVtcHQgdG8gdmVyaWZ5IGFkZHJlc3MgdXNpbmcgY3VzdG9tIGNoYW5nZSBhZGRyZXNzIGtleXMgaWYgdGhlIHdhbGxldCBoYXMgdGhhdCBmZWF0dXJlIGVuYWJsZWRcbiAgICAgIGlmIChcbiAgICAgICAgY3VzdG9tQ2hhbmdlS2V5cyAmJlxuICAgICAgICAoYXdhaXQgdmVyaWZ5Q3VzdG9tQ2hhbmdlQWRkcmVzcyh7IGNvaW4sIGFkZHJlc3NEZXRhaWxzLCBjdXJyZW50QWRkcmVzcywgY3VzdG9tQ2hhbmdlS2V5cyB9KSlcbiAgICAgICkge1xuICAgICAgICAvLyBhZGRyZXNzIGlzIHZhbGlkIGFnYWluc3QgdGhlIGN1c3RvbSBjaGFuZ2Uga2V5cy4gTWFyayBhZGRyZXNzIGFzIG5vdCBleHRlcm5hbFxuICAgICAgICAvLyBhbmQgcmVxdWVzdCBzaWduYXR1cmUgdmVyaWZpY2F0aW9uIGZvciB0aGUgY3VzdG9tIGNoYW5nZSBrZXlzXG4gICAgICAgIGRlYnVnKCdBZGRyZXNzICVzIHZlcmlmaWVkIGFzIGRlcml2ZWQgZnJvbSB0aGUgY3VzdG9tIGNoYW5nZSBrZXlzJywgY3VycmVudEFkZHJlc3MpO1xuICAgICAgICByZXR1cm4geyBleHRlcm5hbDogZmFsc2UsIG5lZWRzQ3VzdG9tQ2hhbmdlS2V5U2lnbmF0dXJlVmVyaWZpY2F0aW9uOiB0cnVlIH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gdGhlIGFkZHJlc3Mgd2FzIGZvdW5kLCBidXQgbm90IG9uIHRoZSB3YWxsZXQsIHdoaWNoIHNpbXBseSBtZWFucyBpdCdzIGV4dGVybmFsXG4gICAgZGVidWcoJ0FkZHJlc3MgJXMgcHJlc3VtZWQgZXh0ZXJuYWwnLCBjdXJyZW50QWRkcmVzcyk7XG4gICAgcmV0dXJuIHsgZXh0ZXJuYWw6IHRydWUgfTtcbiAgfSBlbHNlIGlmIChlIGluc3RhbmNlb2YgSW52YWxpZEFkZHJlc3NEZXJpdmF0aW9uUHJvcGVydHlFcnJvciAmJiBjdXJyZW50QWRkcmVzcyA9PT0gdHhQYXJhbXMuY2hhbmdlQWRkcmVzcykge1xuICAgIC8vIGV4cGVjdCB0byBzZWUgdGhpcyBlcnJvciB3aGVuIHBhc3NpbmcgaW4gYSBjdXN0b20gY2hhbmdlQWRkcmVzcyB3aXRoIG5vIGNoYWluIG9yIGluZGV4XG4gICAgcmV0dXJuIHsgZXh0ZXJuYWw6IGZhbHNlIH07XG4gIH1cblxuICBjb25zb2xlLmVycm9yKCdBZGRyZXNzIGNsYXNzaWZpY2F0aW9uIGZhaWxlZCBmb3IgYWRkcmVzcycsIGN1cnJlbnRBZGRyZXNzKTtcbiAgY29uc29sZS50cmFjZShlKTtcbiAgLyoqXG4gICAqIEl0IG1pZ2h0IGJlIGEgY29tcGxldGVseSBpbnZhbGlkIGFkZHJlc3Mgb3IgYSBiYWQgdmFsaWRhdGlvbiBhdHRlbXB0IG9yIHNvbWV0aGluZyBlbHNlIGNvbXBsZXRlbHksIGluXG4gICAqIHdoaWNoIGNhc2Ugd2UgZG8gbm90IHByb2NlZWQgYW5kIHJhdGhlciByZXRocm93IHRoZSBlcnJvciwgd2hpY2ggaXMgc2FmZXIgdGhhbiBhc3N1bWluZyB0aGF0IHRoZSBhZGRyZXNzXG4gICAqIHZhbGlkYXRpb24gZmFpbGVkIHNpbXBseSBiZWNhdXNlIGl0J3MgZXh0ZXJuYWwgdG8gdGhlIHdhbGxldC5cbiAgICovXG4gIHRocm93IGU7XG59XG5cbmludGVyZmFjZSBGZXRjaEFkZHJlc3NEZXRhaWxzT3B0aW9ucyB7XG4gIHJlcUlkPzogSVJlcXVlc3RUcmFjZXI7XG4gIGRpc2FibGVOZXR3b3JraW5nOiBib29sZWFuO1xuICBhZGRyZXNzRGV0YWlsc1ByZWJ1aWxkOiBhbnk7XG4gIGFkZHJlc3NEZXRhaWxzVmVyaWZpY2F0aW9uOiBhbnk7XG4gIGN1cnJlbnRBZGRyZXNzOiBzdHJpbmc7XG4gIHdhbGxldDogSVdhbGxldDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZmV0Y2hBZGRyZXNzRGV0YWlscyh7XG4gIHJlcUlkLFxuICBkaXNhYmxlTmV0d29ya2luZyxcbiAgYWRkcmVzc0RldGFpbHNQcmVidWlsZCxcbiAgYWRkcmVzc0RldGFpbHNWZXJpZmljYXRpb24sXG4gIGN1cnJlbnRBZGRyZXNzLFxuICB3YWxsZXQsXG59OiBGZXRjaEFkZHJlc3NEZXRhaWxzT3B0aW9ucykge1xuICBsZXQgYWRkcmVzc0RldGFpbHMgPSBfLmV4dGVuZCh7fSwgYWRkcmVzc0RldGFpbHNQcmVidWlsZCwgYWRkcmVzc0RldGFpbHNWZXJpZmljYXRpb24pO1xuICBkZWJ1ZygnTG9jYWxseSBhdmFpbGFibGUgYWRkcmVzcyAlcyBkZXRhaWxzOiAlTycsIGN1cnJlbnRBZGRyZXNzLCBhZGRyZXNzRGV0YWlscyk7XG4gIGlmIChfLmlzRW1wdHkoYWRkcmVzc0RldGFpbHMpICYmICFkaXNhYmxlTmV0d29ya2luZykge1xuICAgIGFkZHJlc3NEZXRhaWxzID0gYXdhaXQgd2FsbGV0LmdldEFkZHJlc3MoeyBhZGRyZXNzOiBjdXJyZW50QWRkcmVzcywgcmVxSWQgfSk7XG4gICAgZGVidWcoJ0Rvd25sb2FkZWQgYWRkcmVzcyAlcyBkZXRhaWxzOiAlTycsIGN1cnJlbnRBZGRyZXNzLCBhZGRyZXNzRGV0YWlscyk7XG4gIH1cbiAgcmV0dXJuIGFkZHJlc3NEZXRhaWxzO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEN1c3RvbUNoYW5nZU9wdGlvbnMge1xuICBrZXlzOiBUcmlwbGU8eyBwdWI6IHN0cmluZyB9PjtcbiAgc2lnbmF0dXJlczogVHJpcGxlPHN0cmluZz47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGFyc2VPdXRwdXRPcHRpb25zIHtcbiAgY3VycmVudE91dHB1dDogT3V0cHV0O1xuICBjb2luOiBBYnN0cmFjdFV0eG9Db2luO1xuICB0eFByZWJ1aWxkOiBUcmFuc2FjdGlvblByZWJ1aWxkO1xuICB2ZXJpZmljYXRpb246IFZlcmlmaWNhdGlvbk9wdGlvbnM7XG4gIGtleWNoYWluQXJyYXk6IFRyaXBsZTx7IHB1Yjogc3RyaW5nIH0+O1xuICB3YWxsZXQ6IElXYWxsZXQ7XG4gIHR4UGFyYW1zOiB7XG4gICAgcmVjaXBpZW50czogSVRyYW5zYWN0aW9uUmVjaXBpZW50W107XG4gICAgY2hhbmdlQWRkcmVzcz86IHN0cmluZztcbiAgfTtcbiAgY3VzdG9tQ2hhbmdlPzogQ3VzdG9tQ2hhbmdlT3B0aW9ucztcbiAgcmVxSWQ/OiBJUmVxdWVzdFRyYWNlcjtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHBhcnNlT3V0cHV0KHtcbiAgY3VycmVudE91dHB1dCxcbiAgY29pbixcbiAgdHhQcmVidWlsZCxcbiAgdmVyaWZpY2F0aW9uLFxuICBrZXljaGFpbkFycmF5LFxuICB3YWxsZXQsXG4gIHR4UGFyYW1zLFxuICBjdXN0b21DaGFuZ2UsXG4gIHJlcUlkLFxufTogUGFyc2VPdXRwdXRPcHRpb25zKTogUHJvbWlzZTxPdXRwdXQ+IHtcbiAgY29uc3QgZGlzYWJsZU5ldHdvcmtpbmcgPSAhIXZlcmlmaWNhdGlvbi5kaXNhYmxlTmV0d29ya2luZztcbiAgY29uc3QgY3VycmVudEFkZHJlc3MgPSBjdXJyZW50T3V0cHV0LmFkZHJlc3M7XG5cbiAgaWYgKGN1cnJlbnRBZGRyZXNzID09PSB1bmRlZmluZWQpIHtcbiAgICAvLyBJbiB0aGUgY2FzZSB0aGF0IHRoZSBhZGRyZXNzIGlzIHVuZGVmaW5lZCwgaXQgbWVhbnMgdGhhdCB0aGUgb3V0cHV0IGhhcyBhIG5vbi1lbmNvZGVhYmxlIHNjcmlwdFB1YmtleVxuICAgIC8vIElmIHRoaXMgaXMgdGhlIGNhc2UsIHRoZW4gd2UgbmVlZCB0byBjaGVjayB0aGF0IHRoZSBhbW91bnQgaXMgMCBhbmQgd2UgY2FuIHNraXAgdGhlIHJlc3QuXG4gICAgaWYgKGN1cnJlbnRPdXRwdXQuYW1vdW50LnRvU3RyaW5nKCkgIT09ICcwJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdvdXRwdXQgd2l0aCB1bmRlZmluZWQgYWRkcmVzcyBtdXN0IGhhdmUgYW1vdW50IG9mIDAnKTtcbiAgICB9XG4gICAgcmV0dXJuIGN1cnJlbnRPdXRwdXQ7XG4gIH1cblxuICAvLyBhdHRlbXB0IHRvIGdyYWIgdGhlIGFkZHJlc3MgZGV0YWlscyBmcm9tIGVpdGhlciB0aGUgcHJlYnVpbHQgdHgsIG9yIHRoZSB2ZXJpZmljYXRpb24gcGFyYW1zLlxuICAvLyBJZiBib3RoIG9mIHRoZXNlIGFyZSBlbXB0eSwgdGhlbiB3ZSB3aWxsIHRyeSB0byBnZXQgdGhlIGFkZHJlc3MgZGV0YWlscyBmcm9tIGJpdGdvIGluc3RlYWRcbiAgY29uc3QgYWRkcmVzc0RldGFpbHNQcmVidWlsZCA9IF8uZ2V0KHR4UHJlYnVpbGQsIGB0eEluZm8ud2FsbGV0QWRkcmVzc0RldGFpbHMuJHtjdXJyZW50QWRkcmVzc31gLCB7fSk7XG4gIGNvbnN0IGFkZHJlc3NEZXRhaWxzVmVyaWZpY2F0aW9uOiBBZGRyZXNzVmVyaWZpY2F0aW9uRGF0YSA9IHZlcmlmaWNhdGlvbj8uYWRkcmVzc2VzPy5bY3VycmVudEFkZHJlc3NdID8/IHt9O1xuICBkZWJ1ZygnUGFyc2luZyBhZGRyZXNzIGRldGFpbHMgZm9yICVzJywgY3VycmVudEFkZHJlc3MpO1xuICBsZXQgY3VycmVudEFkZHJlc3NEZXRhaWxzID0gdW5kZWZpbmVkO1xuICBjb25zdCBSRUNJUElFTlRfVEhSRVNIT0xEID0gMTAwMDtcbiAgdHJ5IHtcbiAgICAvLyBJbiB0aGUgY2FzZSBvZiBQU0JUcywgd2UgY2FuIGFscmVhZHkgZGV0ZXJtaW5lIHRoZSBpbnRlcm5hbC9leHRlcm5hbCBzdGF0dXMgb2YgdGhlIG91dHB1dCBhZGRyZXNzZXNcbiAgICAvLyBiYXNlZCBvbiB0aGUgZGVyaXZhdGlvbiBpbmZvcm1hdGlvbiBiZWluZyBpbmNsdWRlZCBpbiB0aGUgUFNCVC4gV2UgY2FuIHNob3J0IGNpcmN1aXQgR0VUIHYyLndhbGxldC5hZGRyZXNzXG4gICAgLy8gYW5kIHNhdmUgb24gbmV0d29yayByZXF1ZXN0cy4gU2luY2Ugd2UgaGF2ZSB0aGUgZGVyaXZhdGlvbiBpbmZvcm1hdGlvbiBhbHJlYWR5LCB3ZSBjYW4gc3RpbGwgdmVyaWZ5IHRoZSBhZGRyZXNzXG4gICAgaWYgKGN1cnJlbnRPdXRwdXQuZXh0ZXJuYWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gSW4gdGhlIGNhc2UgdGhhdCB3ZSBoYXZlIGEgY3VzdG9tIGNoYW5nZSB3YWxsZXQsIHdlIG5lZWQgdG8gdmVyaWZ5IHRoZSBhZGRyZXNzIGFnYWluc3QgdGhlIGN1c3RvbSBjaGFuZ2Uga2V5c1xuICAgICAgLy8gYW5kIG5vdCB0aGUgd2FsbGV0IGtleXMuIFRoaXMgY2hlY2sgaXMgZG9uZSBpbiB0aGUgaGFuZGxlVmVyaWZ5QWRkcmVzc0Vycm9yIGZ1bmN0aW9uIGlmIHRoaXMgZXJyb3IgaXMgdGhyb3duLlxuICAgICAgaWYgKGN1c3RvbUNoYW5nZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkQWRkcmVzc0Vycm9yKCdgYWRkcmVzcyB2YWxpZGF0aW9uIGZhaWx1cmUnKTtcbiAgICAgIH1cbiAgICAgIC8vIElmIGl0IGlzIGFuIGludGVybmFsIGFkZHJlc3MsIHdlIGNhbiBza2lwIHRoZSBuZXR3b3JrIHJlcXVlc3QgYW5kIGp1c3QgdmVyaWZ5IHRoZSBhZGRyZXNzIGxvY2FsbHkgd2l0aCB0aGVcbiAgICAgIC8vIGRlcml2YXRpb24gaW5mb3JtYXRpb24gd2UgaGF2ZS4gT3RoZXJ3aXNlLCBpZiB0aGUgYWRkcmVzcyBpcyBleHRlcm5hbCwgd2hpY2ggaXMgdGhlIG9ubHkgcmVtYWluaW5nIGNhc2UsIHdlXG4gICAgICAvLyBjYW4ganVzdCByZXR1cm4gdGhlIGN1cnJlbnQgb3V0cHV0IGFzIGlzIHdpdGhvdXQgY29udGFjdGluZyB0aGUgc2VydmVyLlxuICAgICAgaWYgKGlzV2FsbGV0T3V0cHV0KGN1cnJlbnRPdXRwdXQpKSB7XG4gICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGNvaW4uaXNXYWxsZXRBZGRyZXNzKHtcbiAgICAgICAgICBrZXljaGFpbnM6IGtleWNoYWluQXJyYXksXG4gICAgICAgICAgYWRkcmVzczogY3VycmVudEFkZHJlc3MsXG4gICAgICAgICAgY2hhaW46IGN1cnJlbnRPdXRwdXQuY2hhaW4sXG4gICAgICAgICAgaW5kZXg6IGN1cnJlbnRPdXRwdXQuaW5kZXgsXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoIXJlcykge1xuICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkQWRkcmVzc0Vycm9yKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBjdXJyZW50T3V0cHV0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBGb3IgdHJhbnNhY3Rpb24gd2l0aCB0aGUgbGVnYWN5IHRyYW5zYWN0aW9uIGZvcm1hdCwgdGhlIG9ubHkgd2F5IHRvXG4gICAgICogZGV0ZXJtaW5lIHdoZXRoZXIgYW4gYWRkcmVzcyBpcyBrbm93biBvbiB0aGUgd2FsbGV0IGlzIHRvIGluaXRpYXRlIGFcbiAgICAgKiBuZXR3b3JrIHJlcXVlc3QgYW5kIGZldGNoIGl0LiBTaG91bGQgdGhlIHJlcXVlc3QgZmFpbCBhbmQgcmV0dXJuIGEgNDA0LFxuICAgICAqIGl0IHdpbGwgdGhyb3cgYW5kIHRoZXJlZm9yZSBoYXMgdG8gYmUgY2F1Z2h0LiBGb3IgdGhhdCByZWFzb24sIGFkZHJlc3NcbiAgICAgKiB3YWxsZXQgb3duZXJzaGlwIGRldGVjdGlvbiBpcyB3cmFwcGVkIGluIGEgdHJ5L2NhdGNoLiBBZGRpdGlvbmFsbHksIG9uY2VcbiAgICAgKiB0aGUgYWRkcmVzcyBkZXRhaWxzIGFyZSBmZXRjaGVkIG9uIHRoZSB3YWxsZXQsIGEgbG9jYWwgYWRkcmVzcyB2YWxpZGF0aW9uXG4gICAgICogaXMgcnVuLCB3aG9zZSBlcnJvcnMgaG93ZXZlciBhcmUgZ2VuZXJhdGVkIGNsaWVudC1zaWRlIGFuZCBjYW4gdGhlcmVmb3JlXG4gICAgICogYmUgYW5hbHl6ZWQgd2l0aCBtb3JlIGdyYW51bGFyaXR5IGFuZCB0eXBlIGNoZWNraW5nLlxuICAgICAqL1xuXG4gICAgLyoqXG4gICAgICogSW4gb3JkZXIgdG8gbWluaW1pemUgQVBJIHJlcXVlc3RzLCB3ZSBhc3N1bWUgdGhhdCBleHBsaWNpdCByZWNpcGllbnRzIGFyZSBhbHdheXMgZXh0ZXJuYWwgd2hlbiB0aGVcbiAgICAgKiByZWNpcGllbnQgbGlzdCBpcyA+IDEwMDAgVGhpcyBpcyBub3QgYWx3YXlzIGEgdmFsaWQgYXNzdW1wdGlvbiBhbmQgY291bGQgbGVhZCBncmVhdGVyIGFwcGFyZW50IHNwZW5kIChidXQgbmV2ZXIgbG93ZXIpXG4gICAgICovXG4gICAgaWYgKHR4UGFyYW1zLnJlY2lwaWVudHMgIT09IHVuZGVmaW5lZCAmJiB0eFBhcmFtcy5yZWNpcGllbnRzLmxlbmd0aCA+IFJFQ0lQSUVOVF9USFJFU0hPTEQpIHtcbiAgICAgIGNvbnN0IGlzQ3VycmVudEFkZHJlc3NJblJlY2lwaWVudHMgPSB0eFBhcmFtcy5yZWNpcGllbnRzLnNvbWUoKHJlY2lwaWVudCkgPT5cbiAgICAgICAgZnJvbUV4dGVuZGVkQWRkcmVzc0Zvcm1hdFRvU2NyaXB0KHJlY2lwaWVudC5hZGRyZXNzLCBjb2luLm5hbWUpLmVxdWFscyhcbiAgICAgICAgICBmcm9tRXh0ZW5kZWRBZGRyZXNzRm9ybWF0VG9TY3JpcHQoY3VycmVudEFkZHJlc3MsIGNvaW4ubmFtZSlcbiAgICAgICAgKVxuICAgICAgKTtcblxuICAgICAgaWYgKGlzQ3VycmVudEFkZHJlc3NJblJlY2lwaWVudHMpIHtcbiAgICAgICAgcmV0dXJuIHsgLi4uY3VycmVudE91dHB1dCB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGFkZHJlc3NEZXRhaWxzID0gYXdhaXQgZmV0Y2hBZGRyZXNzRGV0YWlscyh7XG4gICAgICByZXFJZCxcbiAgICAgIGFkZHJlc3NEZXRhaWxzVmVyaWZpY2F0aW9uLFxuICAgICAgYWRkcmVzc0RldGFpbHNQcmVidWlsZCxcbiAgICAgIGN1cnJlbnRBZGRyZXNzLFxuICAgICAgZGlzYWJsZU5ldHdvcmtpbmcsXG4gICAgICB3YWxsZXQsXG4gICAgfSk7XG4gICAgLy8gdmVyaWZ5IHRoYXQgdGhlIGFkZHJlc3MgaXMgb24gdGhlIHdhbGxldC4gdmVyaWZ5QWRkcmVzcyB0aHJvd3MgaWZcbiAgICAvLyBpdCBmYWlscyB0byBjb3JyZWN0bHkgcmVkZXJpdmUgdGhlIGFkZHJlc3MsIG1lYW5pbmcgaXQncyBleHRlcm5hbFxuICAgIGN1cnJlbnRBZGRyZXNzRGV0YWlscyA9IGFkZHJlc3NEZXRhaWxzO1xuICAgIGF3YWl0IGNvaW4udmVyaWZ5QWRkcmVzcyhcbiAgICAgIF8uZXh0ZW5kKHt9LCBhZGRyZXNzRGV0YWlscywge1xuICAgICAgICBrZXljaGFpbnM6IGtleWNoYWluQXJyYXksXG4gICAgICAgIGFkZHJlc3M6IGN1cnJlbnRBZGRyZXNzLFxuICAgICAgfSlcbiAgICApO1xuICAgIGRlYnVnKCdBZGRyZXNzICVzIHZlcmlmaWNhdGlvbiBwYXNzZWQnLCBjdXJyZW50QWRkcmVzcyk7XG5cbiAgICAvLyB2ZXJpZnkgYWRkcmVzcyBzdWNjZWVkZWQgd2l0aG91dCB0aHJvd2luZywgc28gdGhlIGFkZHJlc3Mgd2FzXG4gICAgLy8gY29ycmVjdGx5IHJlZGVyaXZlZCBmcm9tIHRoZSB3YWxsZXQga2V5Y2hhaW5zLCBtYWtpbmcgaXQgbm90IGV4dGVybmFsXG4gICAgcmV0dXJuIF8uZXh0ZW5kKHt9LCBjdXJyZW50T3V0cHV0LCBhZGRyZXNzRGV0YWlscywgeyBleHRlcm5hbDogZmFsc2UgfSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBkZWJ1ZygnQWRkcmVzcyAlcyB2ZXJpZmljYXRpb24gdGhyZXcgYW4gZXJyb3I6JywgY3VycmVudEFkZHJlc3MsIGUpO1xuICAgIHJldHVybiBfLmV4dGVuZChcbiAgICAgIHt9LFxuICAgICAgY3VycmVudE91dHB1dCxcbiAgICAgIGF3YWl0IGhhbmRsZVZlcmlmeUFkZHJlc3NFcnJvcih7XG4gICAgICAgIGUsXG4gICAgICAgIGNvaW4sXG4gICAgICAgIGN1cnJlbnRBZGRyZXNzLFxuICAgICAgICB3YWxsZXQsXG4gICAgICAgIHR4UGFyYW1zLFxuICAgICAgICBjdXN0b21DaGFuZ2VLZXlzOiBjdXN0b21DaGFuZ2UgJiYgY3VzdG9tQ2hhbmdlLmtleXMsXG4gICAgICAgIGFkZHJlc3NEZXRhaWxzOiBjdXJyZW50QWRkcmVzc0RldGFpbHMsXG4gICAgICAgIGNvbnNpZGVyTWlncmF0ZWRGcm9tQWRkcmVzc0ludGVybmFsOiB2ZXJpZmljYXRpb24uY29uc2lkZXJNaWdyYXRlZEZyb21BZGRyZXNzSW50ZXJuYWwsXG4gICAgICB9KVxuICAgICk7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { AbstractUtxoCoin, ParseTransactionOptions } from '../../abstractUtxoCoin';
|
|
2
|
+
import type { ParsedTransaction } from '../types';
|
|
3
|
+
import { ComparableOutput, ExpectedOutput } from '../outputDifference';
|
|
4
|
+
export type ComparableOutputWithExternal<TValue> = (ComparableOutput<TValue> | ExpectedOutput) & {
|
|
5
|
+
external: boolean | undefined;
|
|
6
|
+
};
|
|
7
|
+
export declare function parseTransaction<TNumber extends bigint | number>(coin: AbstractUtxoCoin, params: ParseTransactionOptions<TNumber>): Promise<ParsedTransaction<TNumber>>;
|
|
8
|
+
//# sourceMappingURL=parseTransaction.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parseTransaction.d.ts","sourceRoot":"","sources":["../../../../src/transaction/fixedScript/parseTransaction.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACxF,OAAO,KAAK,EAAmC,iBAAiB,EAAE,MAAM,UAAU,CAAC;AASnF,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAoB,MAAM,qBAAqB,CAAC;AAKzF,MAAM,MAAM,4BAA4B,CAAC,MAAM,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,GAAG,cAAc,CAAC,GAAG;IAC/F,QAAQ,EAAE,OAAO,GAAG,SAAS,CAAC;CAC/B,CAAC;AA2FF,wBAAsB,gBAAgB,CAAC,OAAO,SAAS,MAAM,GAAG,MAAM,EACpE,IAAI,EAAE,gBAAgB,EACtB,MAAM,EAAE,uBAAuB,CAAC,OAAO,CAAC,GACvC,OAAO,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC,CAiKrC"}
|
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
import assert from 'assert';
|
|
2
|
+
import _ from 'lodash';
|
|
3
|
+
import * as utxolib from '@bitgo-beta/utxo-lib';
|
|
4
|
+
import { fetchKeychains, getKeySignatures, toKeychainTriple, UtxoNamedKeychains } from '../../keychains';
|
|
5
|
+
import { assertValidTransactionRecipient, fromExtendedAddressFormatToScript, isScriptRecipient, toExtendedAddressFormat, toOutputScript, } from '../recipient';
|
|
6
|
+
import { outputDifference } from '../outputDifference';
|
|
7
|
+
import { parseOutput } from './parseOutput';
|
|
8
|
+
function toCanonicalTransactionRecipient(coin, output) {
|
|
9
|
+
const amount = BigInt(output.valueString);
|
|
10
|
+
assertValidTransactionRecipient({ amount, address: output.address });
|
|
11
|
+
assert(output.address, 'address is required');
|
|
12
|
+
if (isScriptRecipient(output.address)) {
|
|
13
|
+
return { amount, address: output.address };
|
|
14
|
+
}
|
|
15
|
+
return { amount, address: coin.canonicalAddress(output.address) };
|
|
16
|
+
}
|
|
17
|
+
async function parseRbfTransaction(coin, params) {
|
|
18
|
+
const { txParams, wallet } = params;
|
|
19
|
+
assert(txParams.rbfTxIds);
|
|
20
|
+
assert(txParams.rbfTxIds.length === 1);
|
|
21
|
+
const txToBeReplaced = await wallet.getTransaction({ txHash: txParams.rbfTxIds[0], includeRbf: true });
|
|
22
|
+
const recipients = txToBeReplaced.outputs.flatMap((output) => {
|
|
23
|
+
// For self-sends, the walletId will be the same as the wallet's id
|
|
24
|
+
if (output.wallet === wallet.id()) {
|
|
25
|
+
return [];
|
|
26
|
+
}
|
|
27
|
+
return [toCanonicalTransactionRecipient(coin, output)];
|
|
28
|
+
});
|
|
29
|
+
// Recurse into parseTransaction with the derived recipients and without rbfTxIds
|
|
30
|
+
return parseTransaction(coin, {
|
|
31
|
+
...params,
|
|
32
|
+
txParams: {
|
|
33
|
+
...txParams,
|
|
34
|
+
recipients,
|
|
35
|
+
rbfTxIds: undefined,
|
|
36
|
+
},
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
function toExpectedOutputs(coin, txParams) {
|
|
40
|
+
// verify that each recipient from txParams has their own output
|
|
41
|
+
const expectedOutputs = (txParams.recipients ?? []).flatMap((output) => {
|
|
42
|
+
if (output.address === undefined) {
|
|
43
|
+
assert('script' in output, 'script is required for non-encodeable scriptPubkeys');
|
|
44
|
+
if (output.amount.toString() !== '0') {
|
|
45
|
+
throw new Error(`Only zero amounts allowed for non-encodeable scriptPubkeys: ${output}`);
|
|
46
|
+
}
|
|
47
|
+
return [
|
|
48
|
+
{
|
|
49
|
+
script: toOutputScript(output, coin.name),
|
|
50
|
+
value: output.amount === 'max' ? 'max' : BigInt(output.amount),
|
|
51
|
+
},
|
|
52
|
+
];
|
|
53
|
+
}
|
|
54
|
+
return [
|
|
55
|
+
{
|
|
56
|
+
script: fromExtendedAddressFormatToScript(output.address, coin.name),
|
|
57
|
+
value: output.amount === 'max' ? 'max' : BigInt(output.amount),
|
|
58
|
+
},
|
|
59
|
+
];
|
|
60
|
+
});
|
|
61
|
+
if (txParams.allowExternalChangeAddress && txParams.changeAddress) {
|
|
62
|
+
expectedOutputs.push({
|
|
63
|
+
script: toOutputScript(txParams.changeAddress, coin.name),
|
|
64
|
+
// When an external change address is explicitly specified, count all outputs going towards that
|
|
65
|
+
// address in the expected outputs (regardless of the output amount)
|
|
66
|
+
value: 'max',
|
|
67
|
+
// Note that the change output is not required to exist, so we mark it as optional.
|
|
68
|
+
optional: true,
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
return expectedOutputs;
|
|
72
|
+
}
|
|
73
|
+
export async function parseTransaction(coin, params) {
|
|
74
|
+
const { txParams, txPrebuild, wallet, verification = {}, reqId } = params;
|
|
75
|
+
// Branch off early for RBF transactions
|
|
76
|
+
if (txParams.rbfTxIds) {
|
|
77
|
+
return parseRbfTransaction(coin, params);
|
|
78
|
+
}
|
|
79
|
+
if (!_.isUndefined(verification.disableNetworking) && !_.isBoolean(verification.disableNetworking)) {
|
|
80
|
+
throw new Error('verification.disableNetworking must be a boolean');
|
|
81
|
+
}
|
|
82
|
+
const disableNetworking = verification.disableNetworking;
|
|
83
|
+
// obtain the keychains and key signatures
|
|
84
|
+
let keychains = verification.keychains;
|
|
85
|
+
if (!keychains) {
|
|
86
|
+
if (disableNetworking) {
|
|
87
|
+
throw new Error('cannot fetch keychains without networking');
|
|
88
|
+
}
|
|
89
|
+
keychains = await fetchKeychains(coin, wallet, reqId);
|
|
90
|
+
}
|
|
91
|
+
if (!UtxoNamedKeychains.is(keychains)) {
|
|
92
|
+
throw new Error('invalid keychains');
|
|
93
|
+
}
|
|
94
|
+
const keychainArray = toKeychainTriple(keychains);
|
|
95
|
+
if (_.isUndefined(txPrebuild.txHex)) {
|
|
96
|
+
throw new Error('missing required txPrebuild property txHex');
|
|
97
|
+
}
|
|
98
|
+
const expectedOutputs = toExpectedOutputs(coin, txParams);
|
|
99
|
+
// get the keychains from the custom change wallet if needed
|
|
100
|
+
let customChange;
|
|
101
|
+
const { customChangeWalletId = undefined } = wallet.coinSpecific() || {};
|
|
102
|
+
if (customChangeWalletId) {
|
|
103
|
+
// fetch keychains from custom change wallet for deriving addresses.
|
|
104
|
+
// These keychains should be signed and this should be verified in verifyTransaction
|
|
105
|
+
const customChangeKeySignatures = wallet._wallet.customChangeKeySignatures;
|
|
106
|
+
const customChangeWallet = await coin.wallets().get({ id: customChangeWalletId });
|
|
107
|
+
const customChangeKeys = await fetchKeychains(coin, customChangeWallet, reqId);
|
|
108
|
+
if (!customChangeKeys) {
|
|
109
|
+
throw new Error('failed to fetch keychains for custom change wallet');
|
|
110
|
+
}
|
|
111
|
+
if (customChangeKeys.user && customChangeKeys.backup && customChangeKeys.bitgo && customChangeWallet) {
|
|
112
|
+
const customChangeKeychains = [
|
|
113
|
+
customChangeKeys.user,
|
|
114
|
+
customChangeKeys.backup,
|
|
115
|
+
customChangeKeys.bitgo,
|
|
116
|
+
];
|
|
117
|
+
customChange = {
|
|
118
|
+
keys: customChangeKeychains,
|
|
119
|
+
signatures: [customChangeKeySignatures.user, customChangeKeySignatures.backup, customChangeKeySignatures.bitgo],
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
// obtain all outputs
|
|
124
|
+
const explanation = await coin.explainTransaction({
|
|
125
|
+
txHex: txPrebuild.txHex,
|
|
126
|
+
txInfo: txPrebuild.txInfo,
|
|
127
|
+
pubs: keychainArray.map((k) => k.pub),
|
|
128
|
+
});
|
|
129
|
+
const allOutputs = [...explanation.outputs, ...explanation.changeOutputs];
|
|
130
|
+
/**
|
|
131
|
+
* Loop through all the outputs and classify each of them as either internal spends
|
|
132
|
+
* or external spends by setting the "external" property to true or false on the output object.
|
|
133
|
+
*/
|
|
134
|
+
const allOutputDetails = await Promise.all(allOutputs.map((currentOutput) => {
|
|
135
|
+
return parseOutput({
|
|
136
|
+
currentOutput,
|
|
137
|
+
coin,
|
|
138
|
+
txPrebuild,
|
|
139
|
+
verification,
|
|
140
|
+
keychainArray: toKeychainTriple(keychains),
|
|
141
|
+
wallet,
|
|
142
|
+
txParams: {
|
|
143
|
+
recipients: txParams.recipients ?? [],
|
|
144
|
+
changeAddress: txParams.changeAddress,
|
|
145
|
+
},
|
|
146
|
+
customChange,
|
|
147
|
+
reqId,
|
|
148
|
+
});
|
|
149
|
+
}));
|
|
150
|
+
const needsCustomChangeKeySignatureVerification = allOutputDetails.some((output) => output?.needsCustomChangeKeySignatureVerification);
|
|
151
|
+
const changeOutputs = _.filter(allOutputDetails, { external: false });
|
|
152
|
+
function toComparableOutputsWithExternal(outputs) {
|
|
153
|
+
return outputs.map((output) => ({
|
|
154
|
+
script: fromExtendedAddressFormatToScript(output.address, coin.name),
|
|
155
|
+
value: output.amount === 'max' ? 'max' : BigInt(output.amount),
|
|
156
|
+
external: output.external,
|
|
157
|
+
}));
|
|
158
|
+
}
|
|
159
|
+
const missingOutputs = outputDifference(expectedOutputs, toComparableOutputsWithExternal(allOutputs));
|
|
160
|
+
const implicitOutputs = outputDifference(toComparableOutputsWithExternal(allOutputDetails), expectedOutputs);
|
|
161
|
+
const explicitOutputs = outputDifference(toComparableOutputsWithExternal(allOutputDetails), implicitOutputs);
|
|
162
|
+
// these are all the non-wallet outputs that had been originally explicitly specified in recipients
|
|
163
|
+
const explicitExternalOutputs = explicitOutputs.filter((output) => output.external);
|
|
164
|
+
// this is the sum of all the originally explicitly specified non-wallet output values
|
|
165
|
+
const explicitExternalSpendAmount = utxolib.bitgo.toTNumber(explicitExternalOutputs.reduce((sum, o) => sum + BigInt(o.value), BigInt(0)), coin.amountType);
|
|
166
|
+
/**
|
|
167
|
+
* The calculation of the implicit external spend amount pertains to verifying the pay-as-you-go-fee BitGo
|
|
168
|
+
* automatically applied to transactions sending money out of the wallet. The logic is fairly straightforward
|
|
169
|
+
* in that we compare the external spend amount that was specified explicitly by the user to the portion
|
|
170
|
+
* that was specified implicitly. To protect customers from people tampering with the transaction outputs, we
|
|
171
|
+
* define a threshold for the maximum percentage of the implicit external spend in relation to the explicit
|
|
172
|
+
* external spend.
|
|
173
|
+
*
|
|
174
|
+
* This has become obsolete with the intoduction of `utxocore.paygo.verifyPayGoAddressProof()`.
|
|
175
|
+
*/
|
|
176
|
+
// make sure that all the extra addresses are change addresses
|
|
177
|
+
// get all the additional external outputs the server added and calculate their values
|
|
178
|
+
const implicitExternalOutputs = implicitOutputs.filter((output) => output.external);
|
|
179
|
+
const implicitExternalSpendAmount = utxolib.bitgo.toTNumber(implicitExternalOutputs.reduce((sum, o) => sum + BigInt(o.value), BigInt(0)), coin.amountType);
|
|
180
|
+
function toOutputs(outputs) {
|
|
181
|
+
return outputs.map((output) => ({
|
|
182
|
+
address: toExtendedAddressFormat(output.script, coin.name),
|
|
183
|
+
amount: output.value.toString(),
|
|
184
|
+
external: output.external,
|
|
185
|
+
}));
|
|
186
|
+
}
|
|
187
|
+
return {
|
|
188
|
+
keychains,
|
|
189
|
+
keySignatures: getKeySignatures(wallet) ?? {},
|
|
190
|
+
outputs: allOutputDetails,
|
|
191
|
+
missingOutputs: toOutputs(missingOutputs),
|
|
192
|
+
explicitExternalOutputs: toOutputs(explicitExternalOutputs),
|
|
193
|
+
implicitExternalOutputs: toOutputs(implicitExternalOutputs),
|
|
194
|
+
changeOutputs,
|
|
195
|
+
explicitExternalSpendAmount,
|
|
196
|
+
implicitExternalSpendAmount,
|
|
197
|
+
needsCustomChangeKeySignatureVerification,
|
|
198
|
+
customChange,
|
|
199
|
+
};
|
|
200
|
+
}
|
|
201
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyc2VUcmFuc2FjdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy90cmFuc2FjdGlvbi9maXhlZFNjcmlwdC9wYXJzZVRyYW5zYWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sTUFBTSxNQUFNLFFBQVEsQ0FBQztBQUU1QixPQUFPLENBQUMsTUFBTSxRQUFRLENBQUM7QUFFdkIsT0FBTyxLQUFLLE9BQU8sTUFBTSxzQkFBc0IsQ0FBQztBQUloRCxPQUFPLEVBQUUsY0FBYyxFQUFFLGdCQUFnQixFQUFFLGdCQUFnQixFQUFnQixrQkFBa0IsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3ZILE9BQU8sRUFDTCwrQkFBK0IsRUFDL0IsaUNBQWlDLEVBQ2pDLGlCQUFpQixFQUNqQix1QkFBdUIsRUFDdkIsY0FBYyxHQUNmLE1BQU0sY0FBYyxDQUFDO0FBQ3RCLE9BQU8sRUFBb0MsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUd6RixPQUFPLEVBQXVCLFdBQVcsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQU1qRSxTQUFTLCtCQUErQixDQUN0QyxJQUFzQixFQUN0QixNQUFpRDtJQUtqRCxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQzFDLCtCQUErQixDQUFDLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztJQUNyRSxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxxQkFBcUIsQ0FBQyxDQUFDO0lBQzlDLElBQUksaUJBQWlCLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7UUFDdEMsT0FBTyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQzdDLENBQUM7SUFDRCxPQUFPLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7QUFDcEUsQ0FBQztBQUVELEtBQUssVUFBVSxtQkFBbUIsQ0FDaEMsSUFBc0IsRUFDdEIsTUFBd0M7SUFFeEMsTUFBTSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsR0FBRyxNQUFNLENBQUM7SUFFcEMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUMxQixNQUFNLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFFdkMsTUFBTSxjQUFjLEdBQUcsTUFBTSxNQUFNLENBQUMsY0FBYyxDQUFDLEVBQUUsTUFBTSxFQUFFLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFDdkcsTUFBTSxVQUFVLEdBQUcsY0FBYyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQy9DLENBQUMsTUFBa0UsRUFBRSxFQUFFO1FBQ3JFLG1FQUFtRTtRQUNuRSxJQUFJLE1BQU0sQ0FBQyxNQUFNLEtBQUssTUFBTSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUM7WUFDbEMsT0FBTyxFQUFFLENBQUM7UUFDWixDQUFDO1FBQ0QsT0FBTyxDQUFDLCtCQUErQixDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQ3pELENBQUMsQ0FDRixDQUFDO0lBRUYsaUZBQWlGO0lBQ2pGLE9BQU8sZ0JBQWdCLENBQUMsSUFBSSxFQUFFO1FBQzVCLEdBQUcsTUFBTTtRQUNULFFBQVEsRUFBRTtZQUNSLEdBQUcsUUFBUTtZQUNYLFVBQVU7WUFDVixRQUFRLEVBQUUsU0FBUztTQUNwQjtLQUNGLENBQUMsQ0FBQztBQUNMLENBQUM7QUFFRCxTQUFTLGlCQUFpQixDQUN4QixJQUFzQixFQUN0QixRQUlDO0lBRUQsZ0VBQWdFO0lBQ2hFLE1BQU0sZUFBZSxHQUFxQixDQUFDLFFBQVEsQ0FBQyxVQUFVLElBQUksRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7UUFDdkYsSUFBSSxNQUFNLENBQUMsT0FBTyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ2pDLE1BQU0sQ0FBQyxRQUFRLElBQUksTUFBTSxFQUFFLHFEQUFxRCxDQUFDLENBQUM7WUFDbEYsSUFBSSxNQUFNLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxLQUFLLEdBQUcsRUFBRSxDQUFDO2dCQUNyQyxNQUFNLElBQUksS0FBSyxDQUFDLCtEQUErRCxNQUFNLEVBQUUsQ0FBQyxDQUFDO1lBQzNGLENBQUM7WUFDRCxPQUFPO2dCQUNMO29CQUNFLE1BQU0sRUFBRSxjQUFjLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUM7b0JBQ3pDLEtBQUssRUFBRSxNQUFNLENBQUMsTUFBTSxLQUFLLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQztpQkFDL0Q7YUFDRixDQUFDO1FBQ0osQ0FBQztRQUNELE9BQU87WUFDTDtnQkFDRSxNQUFNLEVBQUUsaUNBQWlDLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDO2dCQUNwRSxLQUFLLEVBQUUsTUFBTSxDQUFDLE1BQU0sS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUM7YUFDL0Q7U0FDRixDQUFDO0lBQ0osQ0FBQyxDQUFDLENBQUM7SUFDSCxJQUFJLFFBQVEsQ0FBQywwQkFBMEIsSUFBSSxRQUFRLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDbEUsZUFBZSxDQUFDLElBQUksQ0FBQztZQUNuQixNQUFNLEVBQUUsY0FBYyxDQUFDLFFBQVEsQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQztZQUN6RCxnR0FBZ0c7WUFDaEcsb0VBQW9FO1lBQ3BFLEtBQUssRUFBRSxLQUFLO1lBQ1osbUZBQW1GO1lBQ25GLFFBQVEsRUFBRSxJQUFJO1NBQ2YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUNELE9BQU8sZUFBZSxDQUFDO0FBQ3pCLENBQUM7QUFFRCxNQUFNLENBQUMsS0FBSyxVQUFVLGdCQUFnQixDQUNwQyxJQUFzQixFQUN0QixNQUF3QztJQUV4QyxNQUFNLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsWUFBWSxHQUFHLEVBQUUsRUFBRSxLQUFLLEVBQUUsR0FBRyxNQUFNLENBQUM7SUFFMUUsd0NBQXdDO0lBQ3hDLElBQUksUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ3RCLE9BQU8sbUJBQW1CLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQzNDLENBQUM7SUFFRCxJQUFJLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLGlCQUFpQixDQUFDLEVBQUUsQ0FBQztRQUNuRyxNQUFNLElBQUksS0FBSyxDQUFDLGtEQUFrRCxDQUFDLENBQUM7SUFDdEUsQ0FBQztJQUNELE1BQU0saUJBQWlCLEdBQUcsWUFBWSxDQUFDLGlCQUFpQixDQUFDO0lBRXpELDBDQUEwQztJQUMxQyxJQUFJLFNBQVMsR0FBc0UsWUFBWSxDQUFDLFNBQVMsQ0FBQztJQUMxRyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDZixJQUFJLGlCQUFpQixFQUFFLENBQUM7WUFDdEIsTUFBTSxJQUFJLEtBQUssQ0FBQywyQ0FBMkMsQ0FBQyxDQUFDO1FBQy9ELENBQUM7UUFDRCxTQUFTLEdBQUcsTUFBTSxjQUFjLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztJQUN4RCxDQUFDO0lBRUQsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO1FBQ3RDLE1BQU0sSUFBSSxLQUFLLENBQUMsbUJBQW1CLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBRUQsTUFBTSxhQUFhLEdBQXlCLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBRXhFLElBQUksQ0FBQyxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUNwQyxNQUFNLElBQUksS0FBSyxDQUFDLDRDQUE0QyxDQUFDLENBQUM7SUFDaEUsQ0FBQztJQUVELE1BQU0sZUFBZSxHQUFHLGlCQUFpQixDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsQ0FBQztJQUUxRCw0REFBNEQ7SUFDNUQsSUFBSSxZQUE2QyxDQUFDO0lBQ2xELE1BQU0sRUFBRSxvQkFBb0IsR0FBRyxTQUFTLEVBQUUsR0FBRyxNQUFNLENBQUMsWUFBWSxFQUFFLElBQUksRUFBRSxDQUFDO0lBQ3pFLElBQUksb0JBQW9CLEVBQUUsQ0FBQztRQUN6QixvRUFBb0U7UUFDcEUsb0ZBQW9GO1FBQ3BGLE1BQU0seUJBQXlCLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyx5QkFBeUIsQ0FBQztRQUMzRSxNQUFNLGtCQUFrQixHQUFXLE1BQU0sSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxvQkFBb0IsRUFBRSxDQUFDLENBQUM7UUFDMUYsTUFBTSxnQkFBZ0IsR0FBRyxNQUFNLGNBQWMsQ0FBQyxJQUFJLEVBQUUsa0JBQWtCLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFFL0UsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7WUFDdEIsTUFBTSxJQUFJLEtBQUssQ0FBQyxvREFBb0QsQ0FBQyxDQUFDO1FBQ3hFLENBQUM7UUFFRCxJQUFJLGdCQUFnQixDQUFDLElBQUksSUFBSSxnQkFBZ0IsQ0FBQyxNQUFNLElBQUksZ0JBQWdCLENBQUMsS0FBSyxJQUFJLGtCQUFrQixFQUFFLENBQUM7WUFDckcsTUFBTSxxQkFBcUIsR0FBeUI7Z0JBQ2xELGdCQUFnQixDQUFDLElBQUk7Z0JBQ3JCLGdCQUFnQixDQUFDLE1BQU07Z0JBQ3ZCLGdCQUFnQixDQUFDLEtBQUs7YUFDdkIsQ0FBQztZQUVGLFlBQVksR0FBRztnQkFDYixJQUFJLEVBQUUscUJBQXFCO2dCQUMzQixVQUFVLEVBQUUsQ0FBQyx5QkFBeUIsQ0FBQyxJQUFJLEVBQUUseUJBQXlCLENBQUMsTUFBTSxFQUFFLHlCQUF5QixDQUFDLEtBQUssQ0FBQzthQUNoSCxDQUFDO1FBQ0osQ0FBQztJQUNILENBQUM7SUFFRCxxQkFBcUI7SUFDckIsTUFBTSxXQUFXLEdBQTJCLE1BQU0sSUFBSSxDQUFDLGtCQUFrQixDQUFVO1FBQ2pGLEtBQUssRUFBRSxVQUFVLENBQUMsS0FBSztRQUN2QixNQUFNLEVBQUUsVUFBVSxDQUFDLE1BQU07UUFDekIsSUFBSSxFQUFFLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQW1CO0tBQ3hELENBQUMsQ0FBQztJQUVILE1BQU0sVUFBVSxHQUFHLENBQUMsR0FBRyxXQUFXLENBQUMsT0FBTyxFQUFFLEdBQUcsV0FBVyxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBRTFFOzs7T0FHRztJQUNILE1BQU0sZ0JBQWdCLEdBQWEsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUNsRCxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsYUFBYSxFQUFFLEVBQUU7UUFDL0IsT0FBTyxXQUFXLENBQUM7WUFDakIsYUFBYTtZQUNiLElBQUk7WUFDSixVQUFVO1lBQ1YsWUFBWTtZQUNaLGFBQWEsRUFBRSxnQkFBZ0IsQ0FBQyxTQUFTLENBQUM7WUFDMUMsTUFBTTtZQUNOLFFBQVEsRUFBRTtnQkFDUixVQUFVLEVBQUUsUUFBUSxDQUFDLFVBQVUsSUFBSSxFQUFFO2dCQUNyQyxhQUFhLEVBQUUsUUFBUSxDQUFDLGFBQWE7YUFDdEM7WUFDRCxZQUFZO1lBQ1osS0FBSztTQUNOLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUNILENBQUM7SUFFRixNQUFNLHlDQUF5QyxHQUFHLGdCQUFnQixDQUFDLElBQUksQ0FDckUsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFFLE1BQWtDLEVBQUUseUNBQXlDLENBQzNGLENBQUM7SUFFRixNQUFNLGFBQWEsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLGdCQUFnQixFQUFFLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7SUFFdEUsU0FBUywrQkFBK0IsQ0FBQyxPQUFpQjtRQUN4RCxPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDOUIsTUFBTSxFQUFFLGlDQUFpQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQztZQUNwRSxLQUFLLEVBQUUsTUFBTSxDQUFDLE1BQU0sS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQW9CO1lBQ2xGLFFBQVEsRUFBRSxNQUFNLENBQUMsUUFBUTtTQUMxQixDQUFDLENBQUMsQ0FBQztJQUNOLENBQUM7SUFFRCxNQUFNLGNBQWMsR0FBRyxnQkFBZ0IsQ0FBQyxlQUFlLEVBQUUsK0JBQStCLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztJQUV0RyxNQUFNLGVBQWUsR0FBRyxnQkFBZ0IsQ0FBQywrQkFBK0IsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLGVBQWUsQ0FBQyxDQUFDO0lBQzdHLE1BQU0sZUFBZSxHQUFHLGdCQUFnQixDQUFDLCtCQUErQixDQUFDLGdCQUFnQixDQUFDLEVBQUUsZUFBZSxDQUFDLENBQUM7SUFFN0csbUdBQW1HO0lBQ25HLE1BQU0sdUJBQXVCLEdBQUcsZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3BGLHNGQUFzRjtJQUN0RixNQUFNLDJCQUEyQixHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUN6RCx1QkFBdUIsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFXLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQVcsRUFDOUYsSUFBSSxDQUFDLFVBQVUsQ0FDaEIsQ0FBQztJQUVGOzs7Ozs7Ozs7T0FTRztJQUVILDhEQUE4RDtJQUM5RCxzRkFBc0Y7SUFDdEYsTUFBTSx1QkFBdUIsR0FBRyxlQUFlLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDcEYsTUFBTSwyQkFBMkIsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FDekQsdUJBQXVCLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBVyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFXLEVBQzlGLElBQUksQ0FBQyxVQUFVLENBQ2hCLENBQUM7SUFFRixTQUFTLFNBQVMsQ0FBQyxPQUEwRTtRQUMzRixPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDOUIsT0FBTyxFQUFFLHVCQUF1QixDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQztZQUMxRCxNQUFNLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUU7WUFDL0IsUUFBUSxFQUFFLE1BQU0sQ0FBQyxRQUFRO1NBQzFCLENBQUMsQ0FBQyxDQUFDO0lBQ04sQ0FBQztJQUVELE9BQU87UUFDTCxTQUFTO1FBQ1QsYUFBYSxFQUFFLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUU7UUFDN0MsT0FBTyxFQUFFLGdCQUFnQjtRQUN6QixjQUFjLEVBQUUsU0FBUyxDQUFDLGNBQWMsQ0FBQztRQUN6Qyx1QkFBdUIsRUFBRSxTQUFTLENBQUMsdUJBQXVCLENBQUM7UUFDM0QsdUJBQXVCLEVBQUUsU0FBUyxDQUFDLHVCQUF1QixDQUFDO1FBQzNELGFBQWE7UUFDYiwyQkFBMkI7UUFDM0IsMkJBQTJCO1FBQzNCLHlDQUF5QztRQUN6QyxZQUFZO0tBQ2IsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5cbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBJVHJhbnNhY3Rpb25SZWNpcGllbnQsIFRyaXBsZSwgVmVyaWZpY2F0aW9uT3B0aW9ucywgV2FsbGV0IH0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWNvcmUnO1xuaW1wb3J0ICogYXMgdXR4b2xpYiBmcm9tICdAYml0Z28tYmV0YS91dHhvLWxpYic7XG5cbmltcG9ydCB0eXBlIHsgQWJzdHJhY3RVdHhvQ29pbiwgUGFyc2VUcmFuc2FjdGlvbk9wdGlvbnMgfSBmcm9tICcuLi8uLi9hYnN0cmFjdFV0eG9Db2luJztcbmltcG9ydCB0eXBlIHsgRml4ZWRTY3JpcHRXYWxsZXRPdXRwdXQsIE91dHB1dCwgUGFyc2VkVHJhbnNhY3Rpb24gfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgeyBmZXRjaEtleWNoYWlucywgZ2V0S2V5U2lnbmF0dXJlcywgdG9LZXljaGFpblRyaXBsZSwgVXR4b0tleWNoYWluLCBVdHhvTmFtZWRLZXljaGFpbnMgfSBmcm9tICcuLi8uLi9rZXljaGFpbnMnO1xuaW1wb3J0IHtcbiAgYXNzZXJ0VmFsaWRUcmFuc2FjdGlvblJlY2lwaWVudCxcbiAgZnJvbUV4dGVuZGVkQWRkcmVzc0Zvcm1hdFRvU2NyaXB0LFxuICBpc1NjcmlwdFJlY2lwaWVudCxcbiAgdG9FeHRlbmRlZEFkZHJlc3NGb3JtYXQsXG4gIHRvT3V0cHV0U2NyaXB0LFxufSBmcm9tICcuLi9yZWNpcGllbnQnO1xuaW1wb3J0IHsgQ29tcGFyYWJsZU91dHB1dCwgRXhwZWN0ZWRPdXRwdXQsIG91dHB1dERpZmZlcmVuY2UgfSBmcm9tICcuLi9vdXRwdXREaWZmZXJlbmNlJztcblxuaW1wb3J0IHR5cGUgeyBUcmFuc2FjdGlvbkV4cGxhbmF0aW9uIH0gZnJvbSAnLi9leHBsYWluVHJhbnNhY3Rpb24nO1xuaW1wb3J0IHsgQ3VzdG9tQ2hhbmdlT3B0aW9ucywgcGFyc2VPdXRwdXQgfSBmcm9tICcuL3BhcnNlT3V0cHV0JztcblxuZXhwb3J0IHR5cGUgQ29tcGFyYWJsZU91dHB1dFdpdGhFeHRlcm5hbDxUVmFsdWU+ID0gKENvbXBhcmFibGVPdXRwdXQ8VFZhbHVlPiB8IEV4cGVjdGVkT3V0cHV0KSAmIHtcbiAgZXh0ZXJuYWw6IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG59O1xuXG5mdW5jdGlvbiB0b0Nhbm9uaWNhbFRyYW5zYWN0aW9uUmVjaXBpZW50KFxuICBjb2luOiBBYnN0cmFjdFV0eG9Db2luLFxuICBvdXRwdXQ6IHsgdmFsdWVTdHJpbmc6IHN0cmluZzsgYWRkcmVzcz86IHN0cmluZyB9XG4pOiB7XG4gIGFtb3VudDogYmlnaW50O1xuICBhZGRyZXNzOiBzdHJpbmc7XG59IHtcbiAgY29uc3QgYW1vdW50ID0gQmlnSW50KG91dHB1dC52YWx1ZVN0cmluZyk7XG4gIGFzc2VydFZhbGlkVHJhbnNhY3Rpb25SZWNpcGllbnQoeyBhbW91bnQsIGFkZHJlc3M6IG91dHB1dC5hZGRyZXNzIH0pO1xuICBhc3NlcnQob3V0cHV0LmFkZHJlc3MsICdhZGRyZXNzIGlzIHJlcXVpcmVkJyk7XG4gIGlmIChpc1NjcmlwdFJlY2lwaWVudChvdXRwdXQuYWRkcmVzcykpIHtcbiAgICByZXR1cm4geyBhbW91bnQsIGFkZHJlc3M6IG91dHB1dC5hZGRyZXNzIH07XG4gIH1cbiAgcmV0dXJuIHsgYW1vdW50LCBhZGRyZXNzOiBjb2luLmNhbm9uaWNhbEFkZHJlc3Mob3V0cHV0LmFkZHJlc3MpIH07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHBhcnNlUmJmVHJhbnNhY3Rpb248VE51bWJlciBleHRlbmRzIGJpZ2ludCB8IG51bWJlcj4oXG4gIGNvaW46IEFic3RyYWN0VXR4b0NvaW4sXG4gIHBhcmFtczogUGFyc2VUcmFuc2FjdGlvbk9wdGlvbnM8VE51bWJlcj5cbik6IFByb21pc2U8UGFyc2VkVHJhbnNhY3Rpb248VE51bWJlcj4+IHtcbiAgY29uc3QgeyB0eFBhcmFtcywgd2FsbGV0IH0gPSBwYXJhbXM7XG5cbiAgYXNzZXJ0KHR4UGFyYW1zLnJiZlR4SWRzKTtcbiAgYXNzZXJ0KHR4UGFyYW1zLnJiZlR4SWRzLmxlbmd0aCA9PT0gMSk7XG5cbiAgY29uc3QgdHhUb0JlUmVwbGFjZWQgPSBhd2FpdCB3YWxsZXQuZ2V0VHJhbnNhY3Rpb24oeyB0eEhhc2g6IHR4UGFyYW1zLnJiZlR4SWRzWzBdLCBpbmNsdWRlUmJmOiB0cnVlIH0pO1xuICBjb25zdCByZWNpcGllbnRzID0gdHhUb0JlUmVwbGFjZWQub3V0cHV0cy5mbGF0TWFwKFxuICAgIChvdXRwdXQ6IHsgdmFsdWVTdHJpbmc6IHN0cmluZzsgYWRkcmVzcz86IHN0cmluZzsgd2FsbGV0Pzogc3RyaW5nIH0pID0+IHtcbiAgICAgIC8vIEZvciBzZWxmLXNlbmRzLCB0aGUgd2FsbGV0SWQgd2lsbCBiZSB0aGUgc2FtZSBhcyB0aGUgd2FsbGV0J3MgaWRcbiAgICAgIGlmIChvdXRwdXQud2FsbGV0ID09PSB3YWxsZXQuaWQoKSkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICByZXR1cm4gW3RvQ2Fub25pY2FsVHJhbnNhY3Rpb25SZWNpcGllbnQoY29pbiwgb3V0cHV0KV07XG4gICAgfVxuICApO1xuXG4gIC8vIFJlY3Vyc2UgaW50byBwYXJzZVRyYW5zYWN0aW9uIHdpdGggdGhlIGRlcml2ZWQgcmVjaXBpZW50cyBhbmQgd2l0aG91dCByYmZUeElkc1xuICByZXR1cm4gcGFyc2VUcmFuc2FjdGlvbihjb2luLCB7XG4gICAgLi4ucGFyYW1zLFxuICAgIHR4UGFyYW1zOiB7XG4gICAgICAuLi50eFBhcmFtcyxcbiAgICAgIHJlY2lwaWVudHMsXG4gICAgICByYmZUeElkczogdW5kZWZpbmVkLFxuICAgIH0sXG4gIH0pO1xufVxuXG5mdW5jdGlvbiB0b0V4cGVjdGVkT3V0cHV0cyhcbiAgY29pbjogQWJzdHJhY3RVdHhvQ29pbixcbiAgdHhQYXJhbXM6IHtcbiAgICByZWNpcGllbnRzPzogSVRyYW5zYWN0aW9uUmVjaXBpZW50W107XG4gICAgYWxsb3dFeHRlcm5hbENoYW5nZUFkZHJlc3M/OiBib29sZWFuO1xuICAgIGNoYW5nZUFkZHJlc3M/OiBzdHJpbmc7XG4gIH1cbik6IEV4cGVjdGVkT3V0cHV0W10ge1xuICAvLyB2ZXJpZnkgdGhhdCBlYWNoIHJlY2lwaWVudCBmcm9tIHR4UGFyYW1zIGhhcyB0aGVpciBvd24gb3V0cHV0XG4gIGNvbnN0IGV4cGVjdGVkT3V0cHV0czogRXhwZWN0ZWRPdXRwdXRbXSA9ICh0eFBhcmFtcy5yZWNpcGllbnRzID8/IFtdKS5mbGF0TWFwKChvdXRwdXQpID0+IHtcbiAgICBpZiAob3V0cHV0LmFkZHJlc3MgPT09IHVuZGVmaW5lZCkge1xuICAgICAgYXNzZXJ0KCdzY3JpcHQnIGluIG91dHB1dCwgJ3NjcmlwdCBpcyByZXF1aXJlZCBmb3Igbm9uLWVuY29kZWFibGUgc2NyaXB0UHVia2V5cycpO1xuICAgICAgaWYgKG91dHB1dC5hbW91bnQudG9TdHJpbmcoKSAhPT0gJzAnKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgT25seSB6ZXJvIGFtb3VudHMgYWxsb3dlZCBmb3Igbm9uLWVuY29kZWFibGUgc2NyaXB0UHVia2V5czogJHtvdXRwdXR9YCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gW1xuICAgICAgICB7XG4gICAgICAgICAgc2NyaXB0OiB0b091dHB1dFNjcmlwdChvdXRwdXQsIGNvaW4ubmFtZSksXG4gICAgICAgICAgdmFsdWU6IG91dHB1dC5hbW91bnQgPT09ICdtYXgnID8gJ21heCcgOiBCaWdJbnQob3V0cHV0LmFtb3VudCksXG4gICAgICAgIH0sXG4gICAgICBdO1xuICAgIH1cbiAgICByZXR1cm4gW1xuICAgICAge1xuICAgICAgICBzY3JpcHQ6IGZyb21FeHRlbmRlZEFkZHJlc3NGb3JtYXRUb1NjcmlwdChvdXRwdXQuYWRkcmVzcywgY29pbi5uYW1lKSxcbiAgICAgICAgdmFsdWU6IG91dHB1dC5hbW91bnQgPT09ICdtYXgnID8gJ21heCcgOiBCaWdJbnQob3V0cHV0LmFtb3VudCksXG4gICAgICB9LFxuICAgIF07XG4gIH0pO1xuICBpZiAodHhQYXJhbXMuYWxsb3dFeHRlcm5hbENoYW5nZUFkZHJlc3MgJiYgdHhQYXJhbXMuY2hhbmdlQWRkcmVzcykge1xuICAgIGV4cGVjdGVkT3V0cHV0cy5wdXNoKHtcbiAgICAgIHNjcmlwdDogdG9PdXRwdXRTY3JpcHQodHhQYXJhbXMuY2hhbmdlQWRkcmVzcywgY29pbi5uYW1lKSxcbiAgICAgIC8vIFdoZW4gYW4gZXh0ZXJuYWwgY2hhbmdlIGFkZHJlc3MgaXMgZXhwbGljaXRseSBzcGVjaWZpZWQsIGNvdW50IGFsbCBvdXRwdXRzIGdvaW5nIHRvd2FyZHMgdGhhdFxuICAgICAgLy8gYWRkcmVzcyBpbiB0aGUgZXhwZWN0ZWQgb3V0cHV0cyAocmVnYXJkbGVzcyBvZiB0aGUgb3V0cHV0IGFtb3VudClcbiAgICAgIHZhbHVlOiAnbWF4JyxcbiAgICAgIC8vIE5vdGUgdGhhdCB0aGUgY2hhbmdlIG91dHB1dCBpcyBub3QgcmVxdWlyZWQgdG8gZXhpc3QsIHNvIHdlIG1hcmsgaXQgYXMgb3B0aW9uYWwuXG4gICAgICBvcHRpb25hbDogdHJ1ZSxcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gZXhwZWN0ZWRPdXRwdXRzO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcGFyc2VUcmFuc2FjdGlvbjxUTnVtYmVyIGV4dGVuZHMgYmlnaW50IHwgbnVtYmVyPihcbiAgY29pbjogQWJzdHJhY3RVdHhvQ29pbixcbiAgcGFyYW1zOiBQYXJzZVRyYW5zYWN0aW9uT3B0aW9uczxUTnVtYmVyPlxuKTogUHJvbWlzZTxQYXJzZWRUcmFuc2FjdGlvbjxUTnVtYmVyPj4ge1xuICBjb25zdCB7IHR4UGFyYW1zLCB0eFByZWJ1aWxkLCB3YWxsZXQsIHZlcmlmaWNhdGlvbiA9IHt9LCByZXFJZCB9ID0gcGFyYW1zO1xuXG4gIC8vIEJyYW5jaCBvZmYgZWFybHkgZm9yIFJCRiB0cmFuc2FjdGlvbnNcbiAgaWYgKHR4UGFyYW1zLnJiZlR4SWRzKSB7XG4gICAgcmV0dXJuIHBhcnNlUmJmVHJhbnNhY3Rpb24oY29pbiwgcGFyYW1zKTtcbiAgfVxuXG4gIGlmICghXy5pc1VuZGVmaW5lZCh2ZXJpZmljYXRpb24uZGlzYWJsZU5ldHdvcmtpbmcpICYmICFfLmlzQm9vbGVhbih2ZXJpZmljYXRpb24uZGlzYWJsZU5ldHdvcmtpbmcpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCd2ZXJpZmljYXRpb24uZGlzYWJsZU5ldHdvcmtpbmcgbXVzdCBiZSBhIGJvb2xlYW4nKTtcbiAgfVxuICBjb25zdCBkaXNhYmxlTmV0d29ya2luZyA9IHZlcmlmaWNhdGlvbi5kaXNhYmxlTmV0d29ya2luZztcblxuICAvLyBvYnRhaW4gdGhlIGtleWNoYWlucyBhbmQga2V5IHNpZ25hdHVyZXNcbiAgbGV0IGtleWNoYWluczogVXR4b05hbWVkS2V5Y2hhaW5zIHwgVmVyaWZpY2F0aW9uT3B0aW9uc1sna2V5Y2hhaW5zJ10gfCB1bmRlZmluZWQgPSB2ZXJpZmljYXRpb24ua2V5Y2hhaW5zO1xuICBpZiAoIWtleWNoYWlucykge1xuICAgIGlmIChkaXNhYmxlTmV0d29ya2luZykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdjYW5ub3QgZmV0Y2gga2V5Y2hhaW5zIHdpdGhvdXQgbmV0d29ya2luZycpO1xuICAgIH1cbiAgICBrZXljaGFpbnMgPSBhd2FpdCBmZXRjaEtleWNoYWlucyhjb2luLCB3YWxsZXQsIHJlcUlkKTtcbiAgfVxuXG4gIGlmICghVXR4b05hbWVkS2V5Y2hhaW5zLmlzKGtleWNoYWlucykpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQga2V5Y2hhaW5zJyk7XG4gIH1cblxuICBjb25zdCBrZXljaGFpbkFycmF5OiBUcmlwbGU8VXR4b0tleWNoYWluPiA9IHRvS2V5Y2hhaW5UcmlwbGUoa2V5Y2hhaW5zKTtcblxuICBpZiAoXy5pc1VuZGVmaW5lZCh0eFByZWJ1aWxkLnR4SGV4KSkge1xuICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyByZXF1aXJlZCB0eFByZWJ1aWxkIHByb3BlcnR5IHR4SGV4Jyk7XG4gIH1cblxuICBjb25zdCBleHBlY3RlZE91dHB1dHMgPSB0b0V4cGVjdGVkT3V0cHV0cyhjb2luLCB0eFBhcmFtcyk7XG5cbiAgLy8gZ2V0IHRoZSBrZXljaGFpbnMgZnJvbSB0aGUgY3VzdG9tIGNoYW5nZSB3YWxsZXQgaWYgbmVlZGVkXG4gIGxldCBjdXN0b21DaGFuZ2U6IEN1c3RvbUNoYW5nZU9wdGlvbnMgfCB1bmRlZmluZWQ7XG4gIGNvbnN0IHsgY3VzdG9tQ2hhbmdlV2FsbGV0SWQgPSB1bmRlZmluZWQgfSA9IHdhbGxldC5jb2luU3BlY2lmaWMoKSB8fCB7fTtcbiAgaWYgKGN1c3RvbUNoYW5nZVdhbGxldElkKSB7XG4gICAgLy8gZmV0Y2gga2V5Y2hhaW5zIGZyb20gY3VzdG9tIGNoYW5nZSB3YWxsZXQgZm9yIGRlcml2aW5nIGFkZHJlc3Nlcy5cbiAgICAvLyBUaGVzZSBrZXljaGFpbnMgc2hvdWxkIGJlIHNpZ25lZCBhbmQgdGhpcyBzaG91bGQgYmUgdmVyaWZpZWQgaW4gdmVyaWZ5VHJhbnNhY3Rpb25cbiAgICBjb25zdCBjdXN0b21DaGFuZ2VLZXlTaWduYXR1cmVzID0gd2FsbGV0Ll93YWxsZXQuY3VzdG9tQ2hhbmdlS2V5U2lnbmF0dXJlcztcbiAgICBjb25zdCBjdXN0b21DaGFuZ2VXYWxsZXQ6IFdhbGxldCA9IGF3YWl0IGNvaW4ud2FsbGV0cygpLmdldCh7IGlkOiBjdXN0b21DaGFuZ2VXYWxsZXRJZCB9KTtcbiAgICBjb25zdCBjdXN0b21DaGFuZ2VLZXlzID0gYXdhaXQgZmV0Y2hLZXljaGFpbnMoY29pbiwgY3VzdG9tQ2hhbmdlV2FsbGV0LCByZXFJZCk7XG5cbiAgICBpZiAoIWN1c3RvbUNoYW5nZUtleXMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignZmFpbGVkIHRvIGZldGNoIGtleWNoYWlucyBmb3IgY3VzdG9tIGNoYW5nZSB3YWxsZXQnKTtcbiAgICB9XG5cbiAgICBpZiAoY3VzdG9tQ2hhbmdlS2V5cy51c2VyICYmIGN1c3RvbUNoYW5nZUtleXMuYmFja3VwICYmIGN1c3RvbUNoYW5nZUtleXMuYml0Z28gJiYgY3VzdG9tQ2hhbmdlV2FsbGV0KSB7XG4gICAgICBjb25zdCBjdXN0b21DaGFuZ2VLZXljaGFpbnM6IFRyaXBsZTxVdHhvS2V5Y2hhaW4+ID0gW1xuICAgICAgICBjdXN0b21DaGFuZ2VLZXlzLnVzZXIsXG4gICAgICAgIGN1c3RvbUNoYW5nZUtleXMuYmFja3VwLFxuICAgICAgICBjdXN0b21DaGFuZ2VLZXlzLmJpdGdvLFxuICAgICAgXTtcblxuICAgICAgY3VzdG9tQ2hhbmdlID0ge1xuICAgICAgICBrZXlzOiBjdXN0b21DaGFuZ2VLZXljaGFpbnMsXG4gICAgICAgIHNpZ25hdHVyZXM6IFtjdXN0b21DaGFuZ2VLZXlTaWduYXR1cmVzLnVzZXIsIGN1c3RvbUNoYW5nZUtleVNpZ25hdHVyZXMuYmFja3VwLCBjdXN0b21DaGFuZ2VLZXlTaWduYXR1cmVzLmJpdGdvXSxcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgLy8gb2J0YWluIGFsbCBvdXRwdXRzXG4gIGNvbnN0IGV4cGxhbmF0aW9uOiBUcmFuc2FjdGlvbkV4cGxhbmF0aW9uID0gYXdhaXQgY29pbi5leHBsYWluVHJhbnNhY3Rpb248VE51bWJlcj4oe1xuICAgIHR4SGV4OiB0eFByZWJ1aWxkLnR4SGV4LFxuICAgIHR4SW5mbzogdHhQcmVidWlsZC50eEluZm8sXG4gICAgcHViczoga2V5Y2hhaW5BcnJheS5tYXAoKGspID0+IGsucHViKSBhcyBUcmlwbGU8c3RyaW5nPixcbiAgfSk7XG5cbiAgY29uc3QgYWxsT3V0cHV0cyA9IFsuLi5leHBsYW5hdGlvbi5vdXRwdXRzLCAuLi5leHBsYW5hdGlvbi5jaGFuZ2VPdXRwdXRzXTtcblxuICAvKipcbiAgICogTG9vcCB0aHJvdWdoIGFsbCB0aGUgb3V0cHV0cyBhbmQgY2xhc3NpZnkgZWFjaCBvZiB0aGVtIGFzIGVpdGhlciBpbnRlcm5hbCBzcGVuZHNcbiAgICogb3IgZXh0ZXJuYWwgc3BlbmRzIGJ5IHNldHRpbmcgdGhlIFwiZXh0ZXJuYWxcIiBwcm9wZXJ0eSB0byB0cnVlIG9yIGZhbHNlIG9uIHRoZSBvdXRwdXQgb2JqZWN0LlxuICAgKi9cbiAgY29uc3QgYWxsT3V0cHV0RGV0YWlsczogT3V0cHV0W10gPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICBhbGxPdXRwdXRzLm1hcCgoY3VycmVudE91dHB1dCkgPT4ge1xuICAgICAgcmV0dXJuIHBhcnNlT3V0cHV0KHtcbiAgICAgICAgY3VycmVudE91dHB1dCxcbiAgICAgICAgY29pbixcbiAgICAgICAgdHhQcmVidWlsZCxcbiAgICAgICAgdmVyaWZpY2F0aW9uLFxuICAgICAgICBrZXljaGFpbkFycmF5OiB0b0tleWNoYWluVHJpcGxlKGtleWNoYWlucyksXG4gICAgICAgIHdhbGxldCxcbiAgICAgICAgdHhQYXJhbXM6IHtcbiAgICAgICAgICByZWNpcGllbnRzOiB0eFBhcmFtcy5yZWNpcGllbnRzID8/IFtdLFxuICAgICAgICAgIGNoYW5nZUFkZHJlc3M6IHR4UGFyYW1zLmNoYW5nZUFkZHJlc3MsXG4gICAgICAgIH0sXG4gICAgICAgIGN1c3RvbUNoYW5nZSxcbiAgICAgICAgcmVxSWQsXG4gICAgICB9KTtcbiAgICB9KVxuICApO1xuXG4gIGNvbnN0IG5lZWRzQ3VzdG9tQ2hhbmdlS2V5U2lnbmF0dXJlVmVyaWZpY2F0aW9uID0gYWxsT3V0cHV0RGV0YWlscy5zb21lKFxuICAgIChvdXRwdXQpID0+IChvdXRwdXQgYXMgRml4ZWRTY3JpcHRXYWxsZXRPdXRwdXQpPy5uZWVkc0N1c3RvbUNoYW5nZUtleVNpZ25hdHVyZVZlcmlmaWNhdGlvblxuICApO1xuXG4gIGNvbnN0IGNoYW5nZU91dHB1dHMgPSBfLmZpbHRlcihhbGxPdXRwdXREZXRhaWxzLCB7IGV4dGVybmFsOiBmYWxzZSB9KTtcblxuICBmdW5jdGlvbiB0b0NvbXBhcmFibGVPdXRwdXRzV2l0aEV4dGVybmFsKG91dHB1dHM6IE91dHB1dFtdKTogQ29tcGFyYWJsZU91dHB1dFdpdGhFeHRlcm5hbDxiaWdpbnQgfCAnbWF4Jz5bXSB7XG4gICAgcmV0dXJuIG91dHB1dHMubWFwKChvdXRwdXQpID0+ICh7XG4gICAgICBzY3JpcHQ6IGZyb21FeHRlbmRlZEFkZHJlc3NGb3JtYXRUb1NjcmlwdChvdXRwdXQuYWRkcmVzcywgY29pbi5uYW1lKSxcbiAgICAgIHZhbHVlOiBvdXRwdXQuYW1vdW50ID09PSAnbWF4JyA/ICdtYXgnIDogKEJpZ0ludChvdXRwdXQuYW1vdW50KSBhcyBiaWdpbnQgfCAnbWF4JyksXG4gICAgICBleHRlcm5hbDogb3V0cHV0LmV4dGVybmFsLFxuICAgIH0pKTtcbiAgfVxuXG4gIGNvbnN0IG1pc3NpbmdPdXRwdXRzID0gb3V0cHV0RGlmZmVyZW5jZShleHBlY3RlZE91dHB1dHMsIHRvQ29tcGFyYWJsZU91dHB1dHNXaXRoRXh0ZXJuYWwoYWxsT3V0cHV0cykpO1xuXG4gIGNvbnN0IGltcGxpY2l0T3V0cHV0cyA9IG91dHB1dERpZmZlcmVuY2UodG9Db21wYXJhYmxlT3V0cHV0c1dpdGhFeHRlcm5hbChhbGxPdXRwdXREZXRhaWxzKSwgZXhwZWN0ZWRPdXRwdXRzKTtcbiAgY29uc3QgZXhwbGljaXRPdXRwdXRzID0gb3V0cHV0RGlmZmVyZW5jZSh0b0NvbXBhcmFibGVPdXRwdXRzV2l0aEV4dGVybmFsKGFsbE91dHB1dERldGFpbHMpLCBpbXBsaWNpdE91dHB1dHMpO1xuXG4gIC8vIHRoZXNlIGFyZSBhbGwgdGhlIG5vbi13YWxsZXQgb3V0cHV0cyB0aGF0IGhhZCBiZWVuIG9yaWdpbmFsbHkgZXhwbGljaXRseSBzcGVjaWZpZWQgaW4gcmVjaXBpZW50c1xuICBjb25zdCBleHBsaWNpdEV4dGVybmFsT3V0cHV0cyA9IGV4cGxpY2l0T3V0cHV0cy5maWx0ZXIoKG91dHB1dCkgPT4gb3V0cHV0LmV4dGVybmFsKTtcbiAgLy8gdGhpcyBpcyB0aGUgc3VtIG9mIGFsbCB0aGUgb3JpZ2luYWxseSBleHBsaWNpdGx5IHNwZWNpZmllZCBub24td2FsbGV0IG91dHB1dCB2YWx1ZXNcbiAgY29uc3QgZXhwbGljaXRFeHRlcm5hbFNwZW5kQW1vdW50ID0gdXR4b2xpYi5iaXRnby50b1ROdW1iZXI8VE51bWJlcj4oXG4gICAgZXhwbGljaXRFeHRlcm5hbE91dHB1dHMucmVkdWNlKChzdW06IGJpZ2ludCwgbykgPT4gc3VtICsgQmlnSW50KG8udmFsdWUpLCBCaWdJbnQoMCkpIGFzIGJpZ2ludCxcbiAgICBjb2luLmFtb3VudFR5cGVcbiAgKTtcblxuICAvKipcbiAgICogVGhlIGNhbGN1bGF0aW9uIG9mIHRoZSBpbXBsaWNpdCBleHRlcm5hbCBzcGVuZCBhbW91bnQgcGVydGFpbnMgdG8gdmVyaWZ5aW5nIHRoZSBwYXktYXMteW91LWdvLWZlZSBCaXRHb1xuICAgKiBhdXRvbWF0aWNhbGx5IGFwcGxpZWQgdG8gdHJhbnNhY3Rpb25zIHNlbmRpbmcgbW9uZXkgb3V0IG9mIHRoZSB3YWxsZXQuIFRoZSBsb2dpYyBpcyBmYWlybHkgc3RyYWlnaHRmb3J3YXJkXG4gICAqIGluIHRoYXQgd2UgY29tcGFyZSB0aGUgZXh0ZXJuYWwgc3BlbmQgYW1vdW50IHRoYXQgd2FzIHNwZWNpZmllZCBleHBsaWNpdGx5IGJ5IHRoZSB1c2VyIHRvIHRoZSBwb3J0aW9uXG4gICAqIHRoYXQgd2FzIHNwZWNpZmllZCBpbXBsaWNpdGx5LiBUbyBwcm90ZWN0IGN1c3RvbWVycyBmcm9tIHBlb3BsZSB0YW1wZXJpbmcgd2l0aCB0aGUgdHJhbnNhY3Rpb24gb3V0cHV0cywgd2VcbiAgICogZGVmaW5lIGEgdGhyZXNob2xkIGZvciB0aGUgbWF4aW11bSBwZXJjZW50YWdlIG9mIHRoZSBpbXBsaWNpdCBleHRlcm5hbCBzcGVuZCBpbiByZWxhdGlvbiB0byB0aGUgZXhwbGljaXRcbiAgICogZXh0ZXJuYWwgc3BlbmQuXG4gICAqXG4gICAqIFRoaXMgaGFzIGJlY29tZSBvYnNvbGV0ZSB3aXRoIHRoZSBpbnRvZHVjdGlvbiBvZiBgdXR4b2NvcmUucGF5Z28udmVyaWZ5UGF5R29BZGRyZXNzUHJvb2YoKWAuXG4gICAqL1xuXG4gIC8vIG1ha2Ugc3VyZSB0aGF0IGFsbCB0aGUgZXh0cmEgYWRkcmVzc2VzIGFyZSBjaGFuZ2UgYWRkcmVzc2VzXG4gIC8vIGdldCBhbGwgdGhlIGFkZGl0aW9uYWwgZXh0ZXJuYWwgb3V0cHV0cyB0aGUgc2VydmVyIGFkZGVkIGFuZCBjYWxjdWxhdGUgdGhlaXIgdmFsdWVzXG4gIGNvbnN0IGltcGxpY2l0RXh0ZXJuYWxPdXRwdXRzID0gaW1wbGljaXRPdXRwdXRzLmZpbHRlcigob3V0cHV0KSA9PiBvdXRwdXQuZXh0ZXJuYWwpO1xuICBjb25zdCBpbXBsaWNpdEV4dGVybmFsU3BlbmRBbW91bnQgPSB1dHhvbGliLmJpdGdvLnRvVE51bWJlcjxUTnVtYmVyPihcbiAgICBpbXBsaWNpdEV4dGVybmFsT3V0cHV0cy5yZWR1Y2UoKHN1bTogYmlnaW50LCBvKSA9PiBzdW0gKyBCaWdJbnQoby52YWx1ZSksIEJpZ0ludCgwKSkgYXMgYmlnaW50LFxuICAgIGNvaW4uYW1vdW50VHlwZVxuICApO1xuXG4gIGZ1bmN0aW9uIHRvT3V0cHV0cyhvdXRwdXRzOiBFeHBlY3RlZE91dHB1dFtdIHwgQ29tcGFyYWJsZU91dHB1dFdpdGhFeHRlcm5hbDxiaWdpbnQgfCAnbWF4Jz5bXSk6IE91dHB1dFtdIHtcbiAgICByZXR1cm4gb3V0cHV0cy5tYXAoKG91dHB1dCkgPT4gKHtcbiAgICAgIGFkZHJlc3M6IHRvRXh0ZW5kZWRBZGRyZXNzRm9ybWF0KG91dHB1dC5zY3JpcHQsIGNvaW4ubmFtZSksXG4gICAgICBhbW91bnQ6IG91dHB1dC52YWx1ZS50b1N0cmluZygpLFxuICAgICAgZXh0ZXJuYWw6IG91dHB1dC5leHRlcm5hbCxcbiAgICB9KSk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGtleWNoYWlucyxcbiAgICBrZXlTaWduYXR1cmVzOiBnZXRLZXlTaWduYXR1cmVzKHdhbGxldCkgPz8ge30sXG4gICAgb3V0cHV0czogYWxsT3V0cHV0RGV0YWlscyxcbiAgICBtaXNzaW5nT3V0cHV0czogdG9PdXRwdXRzKG1pc3NpbmdPdXRwdXRzKSxcbiAgICBleHBsaWNpdEV4dGVybmFsT3V0cHV0czogdG9PdXRwdXRzKGV4cGxpY2l0RXh0ZXJuYWxPdXRwdXRzKSxcbiAgICBpbXBsaWNpdEV4dGVybmFsT3V0cHV0czogdG9PdXRwdXRzKGltcGxpY2l0RXh0ZXJuYWxPdXRwdXRzKSxcbiAgICBjaGFuZ2VPdXRwdXRzLFxuICAgIGV4cGxpY2l0RXh0ZXJuYWxTcGVuZEFtb3VudCxcbiAgICBpbXBsaWNpdEV4dGVybmFsU3BlbmRBbW91bnQsXG4gICAgbmVlZHNDdXN0b21DaGFuZ2VLZXlTaWduYXR1cmVWZXJpZmljYXRpb24sXG4gICAgY3VzdG9tQ2hhbmdlLFxuICB9O1xufVxuIl19
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { UtxoCoinName } from '../../names';
|
|
2
|
+
export declare const pubkeyProd: Buffer<ArrayBuffer>;
|
|
3
|
+
export declare const pubkeyTestnet: Buffer<ArrayBuffer>;
|
|
4
|
+
export declare function getReplayProtectionPubkeys(coinName: UtxoCoinName): Buffer[];
|
|
5
|
+
export declare function getReplayProtectionAddresses(coinName: UtxoCoinName, format?: 'default' | 'cashaddr'): string[];
|
|
6
|
+
export declare function isReplayProtectionUnspent(u: {
|
|
7
|
+
address: string;
|
|
8
|
+
}, coinName: UtxoCoinName): boolean;
|
|
9
|
+
//# sourceMappingURL=replayProtection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"replayProtection.d.ts","sourceRoot":"","sources":["../../../../src/transaction/fixedScript/replayProtection.ts"],"names":[],"mappings":"AAEA,OAAO,EAA0B,YAAY,EAAE,MAAM,aAAa,CAAC;AAEnE,eAAO,MAAM,UAAU,qBAA2F,CAAC;AAEnH,eAAO,MAAM,aAAa,qBAA2F,CAAC;AAEtH,wBAAgB,0BAA0B,CAAC,QAAQ,EAAE,YAAY,GAAG,MAAM,EAAE,CAU3E;AAWD,wBAAgB,4BAA4B,CAC1C,QAAQ,EAAE,YAAY,EACtB,MAAM,GAAE,SAAS,GAAG,UAAsB,GACzC,MAAM,EAAE,CAYV;AAED,wBAAgB,yBAAyB,CAAC,CAAC,EAAE;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,EAAE,QAAQ,EAAE,YAAY,GAAG,OAAO,CAEjG"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { utxolibCompat } from '@bitgo/wasm-utxo';
|
|
2
|
+
import { getNetworkFromCoinName } from '../../names';
|
|
3
|
+
export const pubkeyProd = Buffer.from('0255b9f71ac2c78fffd83e3e37b9e17ae70d5437b7f56d0ed2e93b7de08015aa59', 'hex');
|
|
4
|
+
export const pubkeyTestnet = Buffer.from('0219da48412c2268865fe8c126327d1b12eee350a3b69eb09e3323cc9a11828945', 'hex');
|
|
5
|
+
export function getReplayProtectionPubkeys(coinName) {
|
|
6
|
+
switch (coinName) {
|
|
7
|
+
case 'bch':
|
|
8
|
+
case 'bsv':
|
|
9
|
+
return [pubkeyProd];
|
|
10
|
+
case 'tbsv':
|
|
11
|
+
case 'tbch':
|
|
12
|
+
return [pubkeyTestnet];
|
|
13
|
+
}
|
|
14
|
+
return [];
|
|
15
|
+
}
|
|
16
|
+
// sh(pk(pubkeyProd))
|
|
17
|
+
// 33p1q7mTGyeM5UnZERGiMcVUkY12SCsatA
|
|
18
|
+
// bitcoincash:pqt5x9w0m6z0f3znjkkx79wl3l7ywrszesemp8xgpf
|
|
19
|
+
const replayProtectionScriptsProd = [Buffer.from('a914174315cfde84f4c45395ac6f15df8ffc470e02cc87', 'hex')];
|
|
20
|
+
// sh(pk(pubkeyTestnet))
|
|
21
|
+
// 2MuMnPoSDgWEpNWH28X2nLtYMXQJCyT61eY
|
|
22
|
+
// bchtest:pqtjmnzwqffkrk2349g3cecfwwjwxusvnq87n07cal
|
|
23
|
+
const replayProtectionScriptsTestnet = [Buffer.from('a914172dcc4e025361d951a9511c670973a4e3720c9887', 'hex')];
|
|
24
|
+
export function getReplayProtectionAddresses(coinName, format = 'default') {
|
|
25
|
+
const network = getNetworkFromCoinName(coinName);
|
|
26
|
+
switch (coinName) {
|
|
27
|
+
case 'bch':
|
|
28
|
+
case 'bsv':
|
|
29
|
+
return replayProtectionScriptsProd.map((script) => utxolibCompat.fromOutputScript(script, network, format));
|
|
30
|
+
case 'tbsv':
|
|
31
|
+
case 'tbch':
|
|
32
|
+
return replayProtectionScriptsTestnet.map((script) => utxolibCompat.fromOutputScript(script, network, format));
|
|
33
|
+
default:
|
|
34
|
+
return [];
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
export function isReplayProtectionUnspent(u, coinName) {
|
|
38
|
+
return getReplayProtectionAddresses(coinName).includes(u.address);
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwbGF5UHJvdGVjdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy90cmFuc2FjdGlvbi9maXhlZFNjcmlwdC9yZXBsYXlQcm90ZWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUVqRCxPQUFPLEVBQUUsc0JBQXNCLEVBQWdCLE1BQU0sYUFBYSxDQUFDO0FBRW5FLE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLG9FQUFvRSxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBRW5ILE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLG9FQUFvRSxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBRXRILE1BQU0sVUFBVSwwQkFBMEIsQ0FBQyxRQUFzQjtJQUMvRCxRQUFRLFFBQVEsRUFBRSxDQUFDO1FBQ2pCLEtBQUssS0FBSyxDQUFDO1FBQ1gsS0FBSyxLQUFLO1lBQ1IsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3RCLEtBQUssTUFBTSxDQUFDO1FBQ1osS0FBSyxNQUFNO1lBQ1QsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQzNCLENBQUM7SUFDRCxPQUFPLEVBQUUsQ0FBQztBQUNaLENBQUM7QUFFRCxxQkFBcUI7QUFDckIscUNBQXFDO0FBQ3JDLHlEQUF5RDtBQUN6RCxNQUFNLDJCQUEyQixHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxnREFBZ0QsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO0FBQzNHLHdCQUF3QjtBQUN4QixzQ0FBc0M7QUFDdEMscURBQXFEO0FBQ3JELE1BQU0sOEJBQThCLEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGdEQUFnRCxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFFOUcsTUFBTSxVQUFVLDRCQUE0QixDQUMxQyxRQUFzQixFQUN0QixTQUFpQyxTQUFTO0lBRTFDLE1BQU0sT0FBTyxHQUFHLHNCQUFzQixDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ2pELFFBQVEsUUFBUSxFQUFFLENBQUM7UUFDakIsS0FBSyxLQUFLLENBQUM7UUFDWCxLQUFLLEtBQUs7WUFDUixPQUFPLDJCQUEyQixDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsYUFBYSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQztRQUM5RyxLQUFLLE1BQU0sQ0FBQztRQUNaLEtBQUssTUFBTTtZQUNULE9BQU8sOEJBQThCLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBQ2pIO1lBQ0UsT0FBTyxFQUFFLENBQUM7SUFDZCxDQUFDO0FBQ0gsQ0FBQztBQUVELE1BQU0sVUFBVSx5QkFBeUIsQ0FBQyxDQUFzQixFQUFFLFFBQXNCO0lBQ3RGLE9BQU8sNEJBQTRCLENBQUMsUUFBUSxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUNwRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdXR4b2xpYkNvbXBhdCB9IGZyb20gJ0BiaXRnby93YXNtLXV0eG8nO1xuXG5pbXBvcnQgeyBnZXROZXR3b3JrRnJvbUNvaW5OYW1lLCBVdHhvQ29pbk5hbWUgfSBmcm9tICcuLi8uLi9uYW1lcyc7XG5cbmV4cG9ydCBjb25zdCBwdWJrZXlQcm9kID0gQnVmZmVyLmZyb20oJzAyNTViOWY3MWFjMmM3OGZmZmQ4M2UzZTM3YjllMTdhZTcwZDU0MzdiN2Y1NmQwZWQyZTkzYjdkZTA4MDE1YWE1OScsICdoZXgnKTtcblxuZXhwb3J0IGNvbnN0IHB1YmtleVRlc3RuZXQgPSBCdWZmZXIuZnJvbSgnMDIxOWRhNDg0MTJjMjI2ODg2NWZlOGMxMjYzMjdkMWIxMmVlZTM1MGEzYjY5ZWIwOWUzMzIzY2M5YTExODI4OTQ1JywgJ2hleCcpO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0UmVwbGF5UHJvdGVjdGlvblB1YmtleXMoY29pbk5hbWU6IFV0eG9Db2luTmFtZSk6IEJ1ZmZlcltdIHtcbiAgc3dpdGNoIChjb2luTmFtZSkge1xuICAgIGNhc2UgJ2JjaCc6XG4gICAgY2FzZSAnYnN2JzpcbiAgICAgIHJldHVybiBbcHVia2V5UHJvZF07XG4gICAgY2FzZSAndGJzdic6XG4gICAgY2FzZSAndGJjaCc6XG4gICAgICByZXR1cm4gW3B1YmtleVRlc3RuZXRdO1xuICB9XG4gIHJldHVybiBbXTtcbn1cblxuLy8gc2gocGsocHVia2V5UHJvZCkpXG4vLyAzM3AxcTdtVEd5ZU01VW5aRVJHaU1jVlVrWTEyU0NzYXRBXG4vLyBiaXRjb2luY2FzaDpwcXQ1eDl3MG02ejBmM3puamtreDc5d2wzbDd5d3JzemVzZW1wOHhncGZcbmNvbnN0IHJlcGxheVByb3RlY3Rpb25TY3JpcHRzUHJvZCA9IFtCdWZmZXIuZnJvbSgnYTkxNDE3NDMxNWNmZGU4NGY0YzQ1Mzk1YWM2ZjE1ZGY4ZmZjNDcwZTAyY2M4NycsICdoZXgnKV07XG4vLyBzaChwayhwdWJrZXlUZXN0bmV0KSlcbi8vIDJNdU1uUG9TRGdXRXBOV0gyOFgybkx0WU1YUUpDeVQ2MWVZXG4vLyBiY2h0ZXN0OnBxdGptbnp3cWZma3JrMjM0OWczY2VjZnd3and4dXN2bnE4N24wN2NhbFxuY29uc3QgcmVwbGF5UHJvdGVjdGlvblNjcmlwdHNUZXN0bmV0ID0gW0J1ZmZlci5mcm9tKCdhOTE0MTcyZGNjNGUwMjUzNjFkOTUxYTk1MTFjNjcwOTczYTRlMzcyMGM5ODg3JywgJ2hleCcpXTtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldFJlcGxheVByb3RlY3Rpb25BZGRyZXNzZXMoXG4gIGNvaW5OYW1lOiBVdHhvQ29pbk5hbWUsXG4gIGZvcm1hdDogJ2RlZmF1bHQnIHwgJ2Nhc2hhZGRyJyA9ICdkZWZhdWx0J1xuKTogc3RyaW5nW10ge1xuICBjb25zdCBuZXR3b3JrID0gZ2V0TmV0d29ya0Zyb21Db2luTmFtZShjb2luTmFtZSk7XG4gIHN3aXRjaCAoY29pbk5hbWUpIHtcbiAgICBjYXNlICdiY2gnOlxuICAgIGNhc2UgJ2Jzdic6XG4gICAgICByZXR1cm4gcmVwbGF5UHJvdGVjdGlvblNjcmlwdHNQcm9kLm1hcCgoc2NyaXB0KSA9PiB1dHhvbGliQ29tcGF0LmZyb21PdXRwdXRTY3JpcHQoc2NyaXB0LCBuZXR3b3JrLCBmb3JtYXQpKTtcbiAgICBjYXNlICd0YnN2JzpcbiAgICBjYXNlICd0YmNoJzpcbiAgICAgIHJldHVybiByZXBsYXlQcm90ZWN0aW9uU2NyaXB0c1Rlc3RuZXQubWFwKChzY3JpcHQpID0+IHV0eG9saWJDb21wYXQuZnJvbU91dHB1dFNjcmlwdChzY3JpcHQsIG5ldHdvcmssIGZvcm1hdCkpO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gW107XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzUmVwbGF5UHJvdGVjdGlvblVuc3BlbnQodTogeyBhZGRyZXNzOiBzdHJpbmcgfSwgY29pbk5hbWU6IFV0eG9Db2luTmFtZSk6IGJvb2xlYW4ge1xuICByZXR1cm4gZ2V0UmVwbGF5UHJvdGVjdGlvbkFkZHJlc3Nlcyhjb2luTmFtZSkuaW5jbHVkZXModS5hZGRyZXNzKTtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import * as utxolib from '@bitgo-beta/utxo-lib';
|
|
2
|
+
import { BIP32Interface } from '@bitgo-beta/secp256k1';
|
|
3
|
+
import { UtxoCoinName } from '../../names';
|
|
4
|
+
import type { Unspent } from '../../unspent';
|
|
5
|
+
type RootWalletKeys = utxolib.bitgo.RootWalletKeys;
|
|
6
|
+
/**
|
|
7
|
+
* Sign all inputs of a wallet transaction and verify signatures after signing.
|
|
8
|
+
* Collects and logs signing errors and verification errors, throws error in the end if any of them
|
|
9
|
+
* failed.
|
|
10
|
+
*
|
|
11
|
+
* @param transaction - wallet transaction (builder) to be signed
|
|
12
|
+
* @param unspents - transaction unspents
|
|
13
|
+
* @param walletSigner - signing parameters
|
|
14
|
+
* @param coinName - coin name for network-specific logic
|
|
15
|
+
* @param isLastSignature - Returns full-signed transaction when true. Builds half-signed when false.
|
|
16
|
+
* @param replayProtectionAddresses - List of replay protection addresses to skip signing
|
|
17
|
+
*/
|
|
18
|
+
export declare function signAndVerifyWalletTransaction<TNumber extends number | bigint>(transaction: utxolib.bitgo.UtxoTransaction<TNumber> | utxolib.bitgo.UtxoTransactionBuilder<TNumber>, unspents: Unspent<TNumber>[], walletSigner: utxolib.bitgo.WalletUnspentSigner<RootWalletKeys>, coinName: UtxoCoinName, { isLastSignature, replayProtectionAddresses, }: {
|
|
19
|
+
isLastSignature: boolean;
|
|
20
|
+
replayProtectionAddresses?: string[];
|
|
21
|
+
}): utxolib.bitgo.UtxoTransaction<TNumber>;
|
|
22
|
+
export declare function signLegacyTransaction<TNumber extends number | bigint>(tx: utxolib.bitgo.UtxoTransaction<TNumber>, signerKeychain: BIP32Interface | undefined, coinName: UtxoCoinName, params: {
|
|
23
|
+
isLastSignature: boolean;
|
|
24
|
+
signingStep: 'signerNonce' | 'cosignerNonce' | 'signerSignature' | undefined;
|
|
25
|
+
txInfo: {
|
|
26
|
+
unspents?: Unspent<TNumber>[];
|
|
27
|
+
} | undefined;
|
|
28
|
+
pubs: string[] | undefined;
|
|
29
|
+
cosignerPub: string | undefined;
|
|
30
|
+
}): utxolib.bitgo.UtxoTransaction<TNumber>;
|
|
31
|
+
export {};
|
|
32
|
+
//# sourceMappingURL=signLegacyTransaction.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signLegacyTransaction.d.ts","sourceRoot":"","sources":["../../../../src/transaction/fixedScript/signLegacyTransaction.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,OAAO,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAS,MAAM,uBAAuB,CAAC;AAK9D,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,KAAK,EAAE,OAAO,EAAiB,MAAM,eAAe,CAAC;AAS5D,KAAK,cAAc,GAAG,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC;AAEnD;;;;;;;;;;;GAWG;AACH,wBAAgB,8BAA8B,CAAC,OAAO,SAAS,MAAM,GAAG,MAAM,EAC5E,WAAW,EAAE,OAAO,CAAC,KAAK,CAAC,eAAe,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,sBAAsB,CAAC,OAAO,CAAC,EACnG,QAAQ,EAAE,OAAO,CAAC,OAAO,CAAC,EAAE,EAC5B,YAAY,EAAE,OAAO,CAAC,KAAK,CAAC,mBAAmB,CAAC,cAAc,CAAC,EAC/D,QAAQ,EAAE,YAAY,EACtB,EACE,eAAe,EACf,yBAAyB,GAC1B,EAAE;IACD,eAAe,EAAE,OAAO,CAAC;IACzB,yBAAyB,CAAC,EAAE,MAAM,EAAE,CAAC;CACtC,GACA,OAAO,CAAC,KAAK,CAAC,eAAe,CAAC,OAAO,CAAC,CA0ExC;AAED,wBAAgB,qBAAqB,CAAC,OAAO,SAAS,MAAM,GAAG,MAAM,EACnE,EAAE,EAAE,OAAO,CAAC,KAAK,CAAC,eAAe,CAAC,OAAO,CAAC,EAC1C,cAAc,EAAE,cAAc,GAAG,SAAS,EAC1C,QAAQ,EAAE,YAAY,EACtB,MAAM,EAAE;IACN,eAAe,EAAE,OAAO,CAAC;IACzB,WAAW,EAAE,aAAa,GAAG,eAAe,GAAG,iBAAiB,GAAG,SAAS,CAAC;IAC7E,MAAM,EAAE;QAAE,QAAQ,CAAC,EAAE,OAAO,CAAC,OAAO,CAAC,EAAE,CAAA;KAAE,GAAG,SAAS,CAAC;IACtD,IAAI,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;IAC3B,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;CACjC,GACA,OAAO,CAAC,KAAK,CAAC,eAAe,CAAC,OAAO,CAAC,CA4BxC"}
|