@bitgo-beta/abstract-utxo 1.1.1-beta.21 → 1.1.1-beta.2100
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 +461 -0
- package/dist/cjs/src/abstractUtxoCoin.d.ts.map +1 -0
- package/dist/cjs/src/abstractUtxoCoin.js +651 -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 +108 -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/{src → cjs/src}/config.d.ts +1 -0
- package/dist/cjs/src/config.d.ts.map +1 -0
- package/dist/cjs/src/config.js +14 -0
- package/dist/cjs/src/deriveKeyWithSeed.d.ts +12 -0
- package/dist/cjs/src/deriveKeyWithSeed.d.ts.map +1 -0
- package/dist/cjs/src/deriveKeyWithSeed.js +17 -0
- package/dist/cjs/src/descriptor/NamedDescriptor.d.ts +19 -0
- package/dist/cjs/src/descriptor/NamedDescriptor.d.ts.map +1 -0
- package/dist/cjs/src/descriptor/NamedDescriptor.js +77 -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 +17 -0
- package/dist/cjs/src/descriptor/builder/builder.d.ts.map +1 -0
- package/dist/cjs/src/descriptor/builder/builder.js +54 -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 +148 -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 +9 -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 +94 -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 +43 -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 +170 -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 +33 -0
- package/dist/cjs/src/impl/doge/doge.d.ts.map +1 -0
- package/dist/cjs/src/impl/doge/doge.js +76 -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 +8 -0
- package/dist/cjs/src/impl/ltc/ltc.d.ts.map +1 -0
- package/dist/cjs/src/impl/ltc/ltc.js +15 -0
- package/dist/cjs/src/impl/ltc/tltc.d.ts +8 -0
- package/dist/cjs/src/impl/ltc/tltc.d.ts.map +1 -0
- package/dist/cjs/src/impl/ltc/tltc.js +15 -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 +22 -0
- package/dist/cjs/src/index.d.ts.map +1 -0
- package/dist/cjs/src/index.js +61 -0
- package/dist/cjs/src/keychains.d.ts +55 -0
- package/dist/cjs/src/keychains.d.ts.map +1 -0
- package/dist/cjs/src/keychains.js +143 -0
- package/dist/cjs/src/names.d.ts +13 -0
- package/dist/cjs/src/names.d.ts.map +1 -0
- package/dist/cjs/src/names.js +93 -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 +22 -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 +39 -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 +6 -7
- 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 +158 -0
- package/dist/cjs/src/recovery/backupKeyRecovery.d.ts.map +1 -0
- package/dist/cjs/src/recovery/backupKeyRecovery.js +411 -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 +30 -30
- package/dist/cjs/src/recovery/crossChainRecovery.d.ts.map +1 -0
- package/dist/cjs/src/recovery/crossChainRecovery.js +299 -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 +139 -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 +21 -0
- package/dist/cjs/src/transaction/decode.d.ts.map +1 -0
- package/dist/cjs/src/transaction/decode.js +45 -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 +47 -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 +18 -0
- package/dist/cjs/src/transaction/descriptor/parse.d.ts.map +1 -0
- package/dist/cjs/src/transaction/descriptor/parse.js +86 -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 +25 -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 +36 -0
- package/dist/cjs/src/transaction/descriptor/verifyTransaction.d.ts.map +1 -0
- package/dist/cjs/src/transaction/descriptor/verifyTransaction.js +90 -0
- package/dist/cjs/src/transaction/explainTransaction.d.ts +18 -0
- package/dist/cjs/src/transaction/explainTransaction.d.ts.map +1 -0
- package/dist/cjs/src/transaction/explainTransaction.js +84 -0
- package/dist/cjs/src/transaction/fixedScript/SigningError.d.ts +24 -0
- package/dist/cjs/src/transaction/fixedScript/SigningError.d.ts.map +1 -0
- package/dist/cjs/src/transaction/fixedScript/SigningError.js +32 -0
- package/dist/cjs/src/transaction/fixedScript/explainPsbtWasm.d.ts +45 -0
- package/dist/cjs/src/transaction/fixedScript/explainPsbtWasm.d.ts.map +1 -0
- package/dist/cjs/src/transaction/fixedScript/explainPsbtWasm.js +149 -0
- package/dist/cjs/src/transaction/fixedScript/explainTransaction.d.ts +47 -0
- package/dist/cjs/src/transaction/fixedScript/explainTransaction.d.ts.map +1 -0
- package/dist/cjs/src/transaction/fixedScript/explainTransaction.js +3 -0
- package/dist/cjs/src/transaction/fixedScript/index.d.ts +8 -0
- package/dist/cjs/src/transaction/fixedScript/index.d.ts.map +1 -0
- package/dist/cjs/src/transaction/fixedScript/index.js +30 -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 +227 -0
- package/dist/cjs/src/transaction/fixedScript/replayProtection.d.ts +10 -0
- package/dist/cjs/src/transaction/fixedScript/replayProtection.d.ts.map +1 -0
- package/dist/cjs/src/transaction/fixedScript/replayProtection.js +44 -0
- package/dist/cjs/src/transaction/fixedScript/signPsbtWasm.d.ts +20 -0
- package/dist/cjs/src/transaction/fixedScript/signPsbtWasm.d.ts.map +1 -0
- package/dist/cjs/src/transaction/fixedScript/signPsbtWasm.js +118 -0
- package/dist/cjs/src/transaction/fixedScript/signTransaction.d.ts +22 -0
- package/dist/cjs/src/transaction/fixedScript/signTransaction.d.ts.map +1 -0
- package/dist/cjs/src/transaction/fixedScript/signTransaction.js +46 -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 +182 -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 +9 -0
- package/dist/cjs/src/transaction/index.d.ts.map +1 -0
- package/dist/cjs/src/transaction/index.js +52 -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 +69 -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 +47 -0
- package/dist/cjs/src/transaction/types.d.ts.map +1 -0
- package/dist/cjs/src/transaction/types.js +3 -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 +59 -0
- package/dist/cjs/src/unspent.d.ts.map +1 -0
- package/dist/cjs/src/unspent.js +20 -0
- package/dist/cjs/src/verifyKey.d.ts +26 -0
- package/dist/cjs/src/verifyKey.d.ts.map +1 -0
- package/dist/cjs/src/verifyKey.js +125 -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/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 +76 -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 +201 -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 +481 -0
- package/dist/cjs/test/unit/buildSignSendLegacyFormat.d.ts +2 -0
- package/dist/cjs/test/unit/buildSignSendLegacyFormat.d.ts.map +1 -0
- package/dist/cjs/test/unit/buildSignSendLegacyFormat.js +99 -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 +161 -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 +204 -0
- package/dist/cjs/test/unit/customChangeWalletFixtures.d.ts +2 -0
- package/dist/cjs/test/unit/customChangeWalletFixtures.d.ts.map +1 -0
- package/dist/cjs/test/unit/customChangeWalletFixtures.js +53 -0
- package/dist/cjs/test/unit/customSigner.d.ts +2 -0
- package/dist/cjs/test/unit/customSigner.d.ts.map +1 -0
- package/dist/cjs/test/unit/customSigner.js +99 -0
- package/dist/cjs/test/unit/deriveKeyWithSeed.d.ts +2 -0
- package/dist/cjs/test/unit/deriveKeyWithSeed.d.ts.map +1 -0
- package/dist/cjs/test/unit/deriveKeyWithSeed.js +56 -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 +51 -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 +92 -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 +53 -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 +62 -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 +37 -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 +71 -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 +41 -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 +34 -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 +33 -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 +34 -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 +34 -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 +30 -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 +87 -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 +155 -0
- package/dist/cjs/test/unit/pendingApprovalTxHexPsbt.d.ts +2 -0
- package/dist/cjs/test/unit/pendingApprovalTxHexPsbt.d.ts.map +1 -0
- package/dist/cjs/test/unit/pendingApprovalTxHexPsbt.js +99 -0
- package/dist/cjs/test/unit/postProcessPrebuild.d.ts +2 -0
- package/dist/cjs/test/unit/postProcessPrebuild.d.ts.map +1 -0
- package/dist/cjs/test/unit/postProcessPrebuild.js +65 -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 +218 -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 +136 -0
- package/dist/cjs/test/unit/recovery/backupKeyRecoveryUnspentGathering.d.ts +2 -0
- package/dist/cjs/test/unit/recovery/backupKeyRecoveryUnspentGathering.d.ts.map +1 -0
- package/dist/cjs/test/unit/recovery/backupKeyRecoveryUnspentGathering.js +144 -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 +297 -0
- package/dist/cjs/test/unit/recovery/formatBackupKeyRecoveryResult.d.ts +2 -0
- package/dist/cjs/test/unit/recovery/formatBackupKeyRecoveryResult.d.ts.map +1 -0
- package/dist/cjs/test/unit/recovery/formatBackupKeyRecoveryResult.js +189 -0
- package/dist/cjs/test/unit/recovery/mock.d.ts +37 -0
- package/dist/cjs/test/unit/recovery/mock.d.ts.map +1 -0
- package/dist/cjs/test/unit/recovery/mock.js +111 -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 +223 -0
- package/dist/cjs/test/unit/testSpoofTransaction.d.ts +2 -0
- package/dist/cjs/test/unit/testSpoofTransaction.d.ts.map +1 -0
- package/dist/cjs/test/unit/testSpoofTransaction.js +114 -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 +64 -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 +51 -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 +138 -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 +76 -0
- package/dist/cjs/test/unit/transaction/descriptor/signTransactionE2E.d.ts +2 -0
- package/dist/cjs/test/unit/transaction/descriptor/signTransactionE2E.d.ts.map +1 -0
- package/dist/cjs/test/unit/transaction/descriptor/signTransactionE2E.js +100 -0
- package/dist/cjs/test/unit/transaction/descriptor/signTransactionGuard.d.ts +2 -0
- package/dist/cjs/test/unit/transaction/descriptor/signTransactionGuard.d.ts.map +1 -0
- package/dist/cjs/test/unit/transaction/descriptor/signTransactionGuard.js +84 -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 +81 -0
- package/dist/cjs/test/unit/transaction/descriptor/verifyTransactionQr.d.ts +2 -0
- package/dist/cjs/test/unit/transaction/descriptor/verifyTransactionQr.d.ts.map +1 -0
- package/dist/cjs/test/unit/transaction/descriptor/verifyTransactionQr.js +102 -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 +171 -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 +222 -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 +98 -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/recipient.d.ts +2 -0
- package/dist/cjs/test/unit/transaction/recipient.d.ts.map +1 -0
- package/dist/cjs/test/unit/transaction/recipient.js +52 -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 +301 -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 +161 -0
- package/dist/cjs/test/unit/util/address.d.ts +13 -0
- package/dist/cjs/test/unit/util/address.d.ts.map +1 -0
- package/dist/cjs/test/unit/util/address.js +15 -0
- package/dist/cjs/test/unit/util/assert.d.ts +3 -0
- package/dist/cjs/test/unit/util/assert.d.ts.map +1 -0
- package/dist/cjs/test/unit/util/assert.js +24 -0
- package/dist/cjs/test/unit/util/fixtures.d.ts +13 -0
- package/dist/cjs/test/unit/util/fixtures.d.ts.map +1 -0
- package/dist/cjs/test/unit/util/fixtures.js +105 -0
- package/dist/cjs/test/unit/util/index.d.ts +11 -0
- package/dist/cjs/test/unit/util/index.d.ts.map +1 -0
- package/dist/cjs/test/unit/util/index.js +27 -0
- package/dist/cjs/test/unit/util/keychains.d.ts +55 -0
- package/dist/cjs/test/unit/util/keychains.d.ts.map +1 -0
- package/dist/cjs/test/unit/util/keychains.js +122 -0
- package/dist/cjs/test/unit/util/nockBitGo.d.ts +10 -0
- package/dist/cjs/test/unit/util/nockBitGo.d.ts.map +1 -0
- package/dist/cjs/test/unit/util/nockBitGo.js +27 -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/psbt.d.ts +19 -0
- package/dist/cjs/test/unit/util/psbt.d.ts.map +1 -0
- package/dist/cjs/test/unit/util/psbt.js +21 -0
- package/dist/cjs/test/unit/util/transaction.d.ts +28 -0
- package/dist/cjs/test/unit/util/transaction.d.ts.map +1 -0
- package/dist/cjs/test/unit/util/transaction.js +131 -0
- package/dist/cjs/test/unit/util/unspents.d.ts +71 -0
- package/dist/cjs/test/unit/util/unspents.d.ts.map +1 -0
- package/dist/cjs/test/unit/util/unspents.js +224 -0
- package/dist/cjs/test/unit/util/utxoCoins.d.ts +30 -0
- package/dist/cjs/test/unit/util/utxoCoins.d.ts.map +1 -0
- package/dist/cjs/test/unit/util/utxoCoins.js +175 -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 +536 -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 +251 -0
- package/dist/cjs/test/unit/webauthn.d.ts +2 -0
- package/dist/cjs/test/unit/webauthn.d.ts.map +1 -0
- package/dist/cjs/test/unit/webauthn.js +73 -0
- package/dist/cjs/tsconfig.tsbuildinfo +1 -0
- package/dist/esm/abstractUtxoCoin.d.ts +461 -0
- package/dist/esm/abstractUtxoCoin.d.ts.map +1 -0
- package/dist/esm/abstractUtxoCoin.js +643 -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 +100 -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/{src → esm}/config.d.ts.map +1 -1
- package/dist/esm/config.js +11 -0
- package/dist/esm/deriveKeyWithSeed.d.ts +12 -0
- package/dist/esm/deriveKeyWithSeed.d.ts.map +1 -0
- package/dist/esm/deriveKeyWithSeed.js +14 -0
- package/dist/esm/descriptor/NamedDescriptor.d.ts +19 -0
- package/dist/esm/descriptor/NamedDescriptor.d.ts.map +1 -0
- package/dist/esm/descriptor/NamedDescriptor.js +37 -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 +17 -0
- package/dist/esm/descriptor/builder/builder.d.ts.map +1 -0
- package/dist/esm/descriptor/builder/builder.js +51 -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 +144 -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 +9 -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 +82 -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 +39 -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 +163 -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 +33 -0
- package/dist/esm/impl/doge/doge.d.ts.map +1 -0
- package/dist/esm/impl/doge/doge.js +72 -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 +8 -0
- package/dist/esm/impl/ltc/ltc.d.ts.map +1 -0
- package/dist/esm/impl/ltc/ltc.js +11 -0
- package/dist/esm/impl/ltc/tltc.d.ts +8 -0
- package/dist/esm/impl/ltc/tltc.d.ts.map +1 -0
- package/dist/esm/impl/ltc/tltc.js +11 -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 +22 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +22 -0
- package/dist/esm/keychains.d.ts +55 -0
- package/dist/esm/keychains.d.ts.map +1 -0
- package/dist/esm/keychains.js +98 -0
- package/dist/esm/names.d.ts +13 -0
- package/dist/esm/names.d.ts.map +1 -0
- package/dist/esm/names.js +83 -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 +19 -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 +39 -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 +158 -0
- package/dist/esm/recovery/backupKeyRecovery.d.ts.map +1 -0
- package/dist/esm/recovery/backupKeyRecovery.js +400 -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 +292 -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 +100 -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 +21 -0
- package/dist/esm/transaction/decode.d.ts.map +1 -0
- package/dist/esm/transaction/decode.js +39 -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 +44 -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 +18 -0
- package/dist/esm/transaction/descriptor/parse.d.ts.map +1 -0
- package/dist/esm/transaction/descriptor/parse.js +82 -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 +25 -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 +36 -0
- package/dist/esm/transaction/descriptor/verifyTransaction.d.ts.map +1 -0
- package/dist/esm/transaction/descriptor/verifyTransaction.js +80 -0
- package/dist/esm/transaction/explainTransaction.d.ts +18 -0
- package/dist/esm/transaction/explainTransaction.d.ts.map +1 -0
- package/dist/esm/transaction/explainTransaction.js +48 -0
- package/dist/esm/transaction/fixedScript/SigningError.d.ts +24 -0
- package/dist/esm/transaction/fixedScript/SigningError.d.ts.map +1 -0
- package/dist/esm/transaction/fixedScript/SigningError.js +26 -0
- package/dist/esm/transaction/fixedScript/explainPsbtWasm.d.ts +45 -0
- package/dist/esm/transaction/fixedScript/explainPsbtWasm.d.ts.map +1 -0
- package/dist/esm/transaction/fixedScript/explainPsbtWasm.js +144 -0
- package/dist/esm/transaction/fixedScript/explainTransaction.d.ts +47 -0
- package/dist/esm/transaction/fixedScript/explainTransaction.d.ts.map +1 -0
- package/dist/esm/transaction/fixedScript/explainTransaction.js +2 -0
- package/dist/esm/transaction/fixedScript/index.d.ts +8 -0
- package/dist/esm/transaction/fixedScript/index.d.ts.map +1 -0
- package/dist/esm/transaction/fixedScript/index.js +7 -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 +221 -0
- package/dist/esm/transaction/fixedScript/replayProtection.d.ts +10 -0
- package/dist/esm/transaction/fixedScript/replayProtection.d.ts.map +1 -0
- package/dist/esm/transaction/fixedScript/replayProtection.js +38 -0
- package/dist/esm/transaction/fixedScript/signPsbtWasm.d.ts +20 -0
- package/dist/esm/transaction/fixedScript/signPsbtWasm.d.ts.map +1 -0
- package/dist/esm/transaction/fixedScript/signPsbtWasm.js +111 -0
- package/dist/esm/transaction/fixedScript/signTransaction.d.ts +22 -0
- package/dist/esm/transaction/fixedScript/signTransaction.d.ts.map +1 -0
- package/dist/esm/transaction/fixedScript/signTransaction.js +39 -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 +176 -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 +9 -0
- package/dist/esm/transaction/index.d.ts.map +1 -0
- package/dist/esm/transaction/index.js +9 -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 +61 -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 +47 -0
- package/dist/esm/transaction/types.d.ts.map +1 -0
- package/dist/esm/transaction/types.js +2 -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 +59 -0
- package/dist/esm/unspent.d.ts.map +1 -0
- package/dist/esm/unspent.js +15 -0
- package/dist/esm/verifyKey.d.ts +26 -0
- package/dist/esm/verifyKey.d.ts.map +1 -0
- package/dist/esm/verifyKey.js +116 -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/package.json +50 -20
- package/.eslintignore +0 -5
- package/CHANGELOG.md +0 -106
- package/dist/src/abstractUtxoCoin.d.ts +0 -383
- package/dist/src/abstractUtxoCoin.d.ts.map +0 -1
- package/dist/src/abstractUtxoCoin.js +0 -960
- package/dist/src/config.js +0 -13
- 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 -169
- 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 -59
- package/dist/src/recovery/backupKeyRecovery.d.ts.map +0 -1
- package/dist/src/recovery/backupKeyRecovery.js +0 -290
- 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 -338
- 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 -7600
- /package/dist/{src → cjs/src}/recovery/mempoolApi.d.ts +0 -0
|
@@ -0,0 +1,536 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
const assert_1 = __importDefault(require("assert"));
|
|
40
|
+
const sinon = __importStar(require("sinon"));
|
|
41
|
+
const sdk_core_1 = require("@bitgo-beta/sdk-core");
|
|
42
|
+
const util_1 = require("./util");
|
|
43
|
+
describe('Verify Transaction', function () {
|
|
44
|
+
const coin = (0, util_1.getUtxoCoin)('tbtc');
|
|
45
|
+
const userKeychain = coin.keychains().create();
|
|
46
|
+
const otherKeychain = coin.keychains().create();
|
|
47
|
+
const changeKeys = {
|
|
48
|
+
user: coin.keychains().create(),
|
|
49
|
+
backup: coin.keychains().create(),
|
|
50
|
+
bitgo: coin.keychains().create(),
|
|
51
|
+
};
|
|
52
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
53
|
+
const sign = async (key, keychain) => (await coin.signMessage(keychain, key.pub)).toString('hex');
|
|
54
|
+
const signUser = (key) => sign(key, userKeychain);
|
|
55
|
+
const signOther = (key) => sign(key, otherKeychain);
|
|
56
|
+
const passphrase = 'test_passphrase';
|
|
57
|
+
const stubData = {
|
|
58
|
+
unsignedSendingWallet: {
|
|
59
|
+
keyIds: sinon.stub().returns(['0', '1', '2']),
|
|
60
|
+
},
|
|
61
|
+
parseTransactionData: {
|
|
62
|
+
badKey: {
|
|
63
|
+
keychains: {
|
|
64
|
+
// user public key swapped out
|
|
65
|
+
user: {
|
|
66
|
+
pub: otherKeychain.pub,
|
|
67
|
+
encryptedPrv: util_1.defaultBitGo.encrypt({
|
|
68
|
+
input: userKeychain.prv,
|
|
69
|
+
password: passphrase,
|
|
70
|
+
}),
|
|
71
|
+
},
|
|
72
|
+
},
|
|
73
|
+
needsCustomChangeKeySignatureVerification: true,
|
|
74
|
+
},
|
|
75
|
+
noCustomChange: {
|
|
76
|
+
keychains: { user: userKeychain },
|
|
77
|
+
needsCustomChangeKeySignatureVerification: true,
|
|
78
|
+
},
|
|
79
|
+
emptyCustomChange: {
|
|
80
|
+
keychains: { user: userKeychain },
|
|
81
|
+
needsCustomChangeKeySignatureVerification: true,
|
|
82
|
+
customChange: {},
|
|
83
|
+
},
|
|
84
|
+
// needs to be async function to create signatures
|
|
85
|
+
badSigs: async () => ({
|
|
86
|
+
keychains: { user: userKeychain },
|
|
87
|
+
needsCustomChangeKeySignatureVerification: true,
|
|
88
|
+
customChange: {
|
|
89
|
+
keys: [changeKeys.user, changeKeys.backup, changeKeys.bitgo],
|
|
90
|
+
signatures: [
|
|
91
|
+
await signOther(changeKeys.user),
|
|
92
|
+
await signOther(changeKeys.backup),
|
|
93
|
+
await signOther(changeKeys.bitgo),
|
|
94
|
+
],
|
|
95
|
+
},
|
|
96
|
+
}),
|
|
97
|
+
goodSigs: async () => ({
|
|
98
|
+
keychains: { user: userKeychain },
|
|
99
|
+
needsCustomChangeKeySignatureVerification: true,
|
|
100
|
+
customChange: {
|
|
101
|
+
keys: [changeKeys.user, changeKeys.backup, changeKeys.bitgo],
|
|
102
|
+
signatures: [
|
|
103
|
+
await signUser(changeKeys.user),
|
|
104
|
+
await signUser(changeKeys.backup),
|
|
105
|
+
await signUser(changeKeys.bitgo),
|
|
106
|
+
],
|
|
107
|
+
},
|
|
108
|
+
missingOutputs: 1,
|
|
109
|
+
}),
|
|
110
|
+
},
|
|
111
|
+
};
|
|
112
|
+
const unsignedSendingWallet = sinon.createStubInstance(sdk_core_1.Wallet, stubData.unsignedSendingWallet);
|
|
113
|
+
it('should fail if the user private key cannot be verified to match the user public key', async () => {
|
|
114
|
+
sinon.stub(coin, 'parseTransaction').resolves(stubData.parseTransactionData.badKey);
|
|
115
|
+
const verifyWallet = sinon.createStubInstance(sdk_core_1.Wallet, {});
|
|
116
|
+
await assert_1.default.rejects(coin.verifyTransaction({
|
|
117
|
+
txParams: {
|
|
118
|
+
walletPassphrase: passphrase,
|
|
119
|
+
},
|
|
120
|
+
txPrebuild: {},
|
|
121
|
+
wallet: verifyWallet,
|
|
122
|
+
verification: {},
|
|
123
|
+
}), /transaction requires verification of user public key, but it was unable to be verified/);
|
|
124
|
+
coin.parseTransaction.restore();
|
|
125
|
+
});
|
|
126
|
+
it('should fail if the custom change verification data is required but missing', async () => {
|
|
127
|
+
sinon.stub(coin, 'parseTransaction').resolves(stubData.parseTransactionData.noCustomChange);
|
|
128
|
+
await assert_1.default.rejects(coin.verifyTransaction({
|
|
129
|
+
txParams: {
|
|
130
|
+
walletPassphrase: passphrase,
|
|
131
|
+
},
|
|
132
|
+
txPrebuild: {},
|
|
133
|
+
wallet: unsignedSendingWallet,
|
|
134
|
+
verification: {},
|
|
135
|
+
}), /parsed transaction is missing required custom change verification data/);
|
|
136
|
+
coin.parseTransaction.restore();
|
|
137
|
+
});
|
|
138
|
+
it('should fail if the custom change keys or key signatures are missing', async () => {
|
|
139
|
+
sinon.stub(coin, 'parseTransaction').resolves(stubData.parseTransactionData.emptyCustomChange);
|
|
140
|
+
await assert_1.default.rejects(coin.verifyTransaction({
|
|
141
|
+
txParams: {
|
|
142
|
+
walletPassphrase: passphrase,
|
|
143
|
+
},
|
|
144
|
+
txPrebuild: {},
|
|
145
|
+
wallet: unsignedSendingWallet,
|
|
146
|
+
verification: {},
|
|
147
|
+
}), /customChange property is missing keys or signatures/);
|
|
148
|
+
coin.parseTransaction.restore();
|
|
149
|
+
});
|
|
150
|
+
it('should fail if the custom change key signatures cannot be verified', async () => {
|
|
151
|
+
sinon.stub(coin, 'parseTransaction').resolves((await stubData.parseTransactionData.badSigs()));
|
|
152
|
+
await assert_1.default.rejects(coin.verifyTransaction({
|
|
153
|
+
txParams: {
|
|
154
|
+
walletPassphrase: passphrase,
|
|
155
|
+
},
|
|
156
|
+
txPrebuild: {},
|
|
157
|
+
wallet: unsignedSendingWallet,
|
|
158
|
+
verification: {},
|
|
159
|
+
}), /transaction requires verification of custom change key signatures, but they were unable to be verified/);
|
|
160
|
+
coin.parseTransaction.restore();
|
|
161
|
+
});
|
|
162
|
+
it('should successfully verify a custom change transaction when change keys and signatures are valid', async () => {
|
|
163
|
+
sinon.stub(coin, 'parseTransaction').resolves((await stubData.parseTransactionData.goodSigs()));
|
|
164
|
+
// if verify transaction gets rejected with the outputs missing error message,
|
|
165
|
+
// then we know that the verification of the custom change key signatures was successful
|
|
166
|
+
await assert_1.default.rejects(coin.verifyTransaction({
|
|
167
|
+
txParams: {
|
|
168
|
+
walletPassphrase: passphrase,
|
|
169
|
+
},
|
|
170
|
+
txPrebuild: {},
|
|
171
|
+
wallet: unsignedSendingWallet,
|
|
172
|
+
verification: {},
|
|
173
|
+
}), /expected outputs missing in transaction prebuild/);
|
|
174
|
+
coin.parseTransaction.restore();
|
|
175
|
+
});
|
|
176
|
+
it('should not allow more than 150 basis points of implicit external outputs (for paygo outputs)', async () => {
|
|
177
|
+
const coinMock = sinon.stub(coin, 'parseTransaction').resolves({
|
|
178
|
+
keychains: {},
|
|
179
|
+
keySignatures: {},
|
|
180
|
+
outputs: [],
|
|
181
|
+
missingOutputs: [],
|
|
182
|
+
explicitExternalOutputs: [],
|
|
183
|
+
implicitExternalOutputs: [],
|
|
184
|
+
changeOutputs: [],
|
|
185
|
+
explicitExternalSpendAmount: 10000,
|
|
186
|
+
implicitExternalSpendAmount: 151,
|
|
187
|
+
needsCustomChangeKeySignatureVerification: false,
|
|
188
|
+
});
|
|
189
|
+
await assert_1.default.rejects(coin.verifyTransaction({
|
|
190
|
+
txParams: {
|
|
191
|
+
walletPassphrase: passphrase,
|
|
192
|
+
},
|
|
193
|
+
txPrebuild: {},
|
|
194
|
+
wallet: unsignedSendingWallet,
|
|
195
|
+
}), /prebuild attempts to spend to unintended external recipients/);
|
|
196
|
+
coinMock.restore();
|
|
197
|
+
});
|
|
198
|
+
it('should allow 150 basis points of implicit external outputs (for paygo outputs)', async () => {
|
|
199
|
+
const coinMock = sinon.stub(coin, 'parseTransaction').resolves({
|
|
200
|
+
keychains: {},
|
|
201
|
+
keySignatures: {},
|
|
202
|
+
outputs: [],
|
|
203
|
+
missingOutputs: [],
|
|
204
|
+
explicitExternalOutputs: [],
|
|
205
|
+
implicitExternalOutputs: [],
|
|
206
|
+
changeOutputs: [],
|
|
207
|
+
explicitExternalSpendAmount: 1000,
|
|
208
|
+
implicitExternalSpendAmount: 15,
|
|
209
|
+
needsCustomChangeKeySignatureVerification: false,
|
|
210
|
+
});
|
|
211
|
+
const result = await coin.verifyTransaction({
|
|
212
|
+
txParams: {
|
|
213
|
+
walletPassphrase: passphrase,
|
|
214
|
+
},
|
|
215
|
+
txPrebuild: {
|
|
216
|
+
txHex: '00',
|
|
217
|
+
},
|
|
218
|
+
wallet: unsignedSendingWallet,
|
|
219
|
+
});
|
|
220
|
+
assert_1.default.strictEqual(result, true);
|
|
221
|
+
coinMock.restore();
|
|
222
|
+
});
|
|
223
|
+
it('should not allow any implicit external outputs if paygo outputs are disallowed', async () => {
|
|
224
|
+
const coinMock = sinon.stub(coin, 'parseTransaction').resolves({
|
|
225
|
+
keychains: {},
|
|
226
|
+
keySignatures: {},
|
|
227
|
+
outputs: [],
|
|
228
|
+
missingOutputs: [],
|
|
229
|
+
explicitExternalOutputs: [],
|
|
230
|
+
implicitExternalOutputs: [],
|
|
231
|
+
changeOutputs: [],
|
|
232
|
+
explicitExternalSpendAmount: 0,
|
|
233
|
+
implicitExternalSpendAmount: 10,
|
|
234
|
+
needsCustomChangeKeySignatureVerification: false,
|
|
235
|
+
});
|
|
236
|
+
await assert_1.default.rejects(coin.verifyTransaction({
|
|
237
|
+
txParams: {
|
|
238
|
+
walletPassphrase: passphrase,
|
|
239
|
+
},
|
|
240
|
+
txPrebuild: {
|
|
241
|
+
txHex: '00',
|
|
242
|
+
},
|
|
243
|
+
wallet: unsignedSendingWallet,
|
|
244
|
+
verification: {
|
|
245
|
+
allowPaygoOutput: false,
|
|
246
|
+
},
|
|
247
|
+
}), /prebuild attempts to spend to unintended external recipients/);
|
|
248
|
+
coinMock.restore();
|
|
249
|
+
});
|
|
250
|
+
it('should allow paygo outputs if empty verification object is passed', async () => {
|
|
251
|
+
const coinMock = sinon.stub(coin, 'parseTransaction').resolves({
|
|
252
|
+
keychains: {},
|
|
253
|
+
keySignatures: {},
|
|
254
|
+
outputs: [],
|
|
255
|
+
missingOutputs: [],
|
|
256
|
+
explicitExternalOutputs: [],
|
|
257
|
+
implicitExternalOutputs: [],
|
|
258
|
+
changeOutputs: [],
|
|
259
|
+
explicitExternalSpendAmount: 1000,
|
|
260
|
+
implicitExternalSpendAmount: 15,
|
|
261
|
+
needsCustomChangeKeySignatureVerification: false,
|
|
262
|
+
});
|
|
263
|
+
const result = await coin.verifyTransaction({
|
|
264
|
+
txParams: {
|
|
265
|
+
walletPassphrase: passphrase,
|
|
266
|
+
},
|
|
267
|
+
txPrebuild: {
|
|
268
|
+
txHex: '00',
|
|
269
|
+
},
|
|
270
|
+
wallet: unsignedSendingWallet,
|
|
271
|
+
verification: {},
|
|
272
|
+
});
|
|
273
|
+
assert_1.default.strictEqual(result, true);
|
|
274
|
+
coinMock.restore();
|
|
275
|
+
});
|
|
276
|
+
it('should verify a bridging transaction whose implicit external output matches the bridge amount', async () => {
|
|
277
|
+
// Bridging intents (e.g. BTC -> sBTC peg-in) carry no recipients; the single external output
|
|
278
|
+
// is the bridge deposit address computed server-side. With explicitExternalSpendAmount 0 the
|
|
279
|
+
// paygo limit is 0, so any implicit external output would normally be rejected as an
|
|
280
|
+
// "unintended external recipient". For type: 'bridging' we instead verify that the implicit
|
|
281
|
+
// external spend equals bridgingParams.sbtc.amount.
|
|
282
|
+
const coinMock = sinon.stub(coin, 'parseTransaction').resolves({
|
|
283
|
+
keychains: {},
|
|
284
|
+
keySignatures: {},
|
|
285
|
+
outputs: [],
|
|
286
|
+
missingOutputs: [],
|
|
287
|
+
explicitExternalOutputs: [],
|
|
288
|
+
implicitExternalOutputs: [
|
|
289
|
+
{
|
|
290
|
+
address: 'sbtc_deposit_address',
|
|
291
|
+
amount: '22000',
|
|
292
|
+
},
|
|
293
|
+
],
|
|
294
|
+
changeOutputs: [],
|
|
295
|
+
explicitExternalSpendAmount: 0,
|
|
296
|
+
implicitExternalSpendAmount: 22000,
|
|
297
|
+
needsCustomChangeKeySignatureVerification: false,
|
|
298
|
+
});
|
|
299
|
+
const result = await coin.verifyTransaction({
|
|
300
|
+
txParams: {
|
|
301
|
+
walletPassphrase: passphrase,
|
|
302
|
+
type: 'bridging',
|
|
303
|
+
bridgingParams: { sbtc: { amount: '22000', stacksRecipient: 'SM1X', maxFee: '1000', lockTime: 100 } },
|
|
304
|
+
},
|
|
305
|
+
txPrebuild: {
|
|
306
|
+
txHex: '00',
|
|
307
|
+
},
|
|
308
|
+
wallet: unsignedSendingWallet,
|
|
309
|
+
verification: {},
|
|
310
|
+
});
|
|
311
|
+
assert_1.default.strictEqual(result, true);
|
|
312
|
+
coinMock.restore();
|
|
313
|
+
});
|
|
314
|
+
it('should reject a bridging transaction whose implicit external output does not match the bridge amount', async () => {
|
|
315
|
+
const coinMock = sinon.stub(coin, 'parseTransaction').resolves({
|
|
316
|
+
keychains: {},
|
|
317
|
+
keySignatures: {},
|
|
318
|
+
outputs: [],
|
|
319
|
+
missingOutputs: [],
|
|
320
|
+
explicitExternalOutputs: [],
|
|
321
|
+
implicitExternalOutputs: [
|
|
322
|
+
{
|
|
323
|
+
address: 'sbtc_deposit_address',
|
|
324
|
+
amount: '50000',
|
|
325
|
+
},
|
|
326
|
+
],
|
|
327
|
+
changeOutputs: [],
|
|
328
|
+
explicitExternalSpendAmount: 0,
|
|
329
|
+
implicitExternalSpendAmount: 50000,
|
|
330
|
+
needsCustomChangeKeySignatureVerification: false,
|
|
331
|
+
});
|
|
332
|
+
await assert_1.default.rejects(coin.verifyTransaction({
|
|
333
|
+
txParams: {
|
|
334
|
+
walletPassphrase: passphrase,
|
|
335
|
+
type: 'bridging',
|
|
336
|
+
bridgingParams: { sbtc: { amount: '22000', stacksRecipient: 'SM1X', maxFee: '1000', lockTime: 100 } },
|
|
337
|
+
},
|
|
338
|
+
txPrebuild: {
|
|
339
|
+
txHex: '00',
|
|
340
|
+
},
|
|
341
|
+
wallet: unsignedSendingWallet,
|
|
342
|
+
verification: {},
|
|
343
|
+
}), /bridging output amount \(50000\) does not match intended bridge amount \(22000\)/);
|
|
344
|
+
coinMock.restore();
|
|
345
|
+
});
|
|
346
|
+
it('should reject a bridging transaction that is missing bridgingParams.sbtc.amount', async () => {
|
|
347
|
+
const coinMock = sinon.stub(coin, 'parseTransaction').resolves({
|
|
348
|
+
keychains: {},
|
|
349
|
+
keySignatures: {},
|
|
350
|
+
outputs: [],
|
|
351
|
+
missingOutputs: [],
|
|
352
|
+
explicitExternalOutputs: [],
|
|
353
|
+
implicitExternalOutputs: [
|
|
354
|
+
{
|
|
355
|
+
address: 'sbtc_deposit_address',
|
|
356
|
+
amount: '22000',
|
|
357
|
+
},
|
|
358
|
+
],
|
|
359
|
+
changeOutputs: [],
|
|
360
|
+
explicitExternalSpendAmount: 0,
|
|
361
|
+
implicitExternalSpendAmount: 22000,
|
|
362
|
+
needsCustomChangeKeySignatureVerification: false,
|
|
363
|
+
});
|
|
364
|
+
await assert_1.default.rejects(coin.verifyTransaction({
|
|
365
|
+
txParams: {
|
|
366
|
+
walletPassphrase: passphrase,
|
|
367
|
+
type: 'bridging',
|
|
368
|
+
},
|
|
369
|
+
txPrebuild: {
|
|
370
|
+
txHex: '00',
|
|
371
|
+
},
|
|
372
|
+
wallet: unsignedSendingWallet,
|
|
373
|
+
verification: {},
|
|
374
|
+
}), /bridging transaction is missing bridgingParams.sbtc.amount/);
|
|
375
|
+
coinMock.restore();
|
|
376
|
+
});
|
|
377
|
+
it('should still reject the same implicit external output when the intent is not bridging', async () => {
|
|
378
|
+
// Same shape as the bridging test above, but without type: 'bridging' the implicit external
|
|
379
|
+
// output is treated as an unintended external recipient and rejected.
|
|
380
|
+
const coinMock = sinon.stub(coin, 'parseTransaction').resolves({
|
|
381
|
+
keychains: {},
|
|
382
|
+
keySignatures: {},
|
|
383
|
+
outputs: [],
|
|
384
|
+
missingOutputs: [],
|
|
385
|
+
explicitExternalOutputs: [],
|
|
386
|
+
implicitExternalOutputs: [
|
|
387
|
+
{
|
|
388
|
+
address: 'sbtc_deposit_address',
|
|
389
|
+
amount: '22000',
|
|
390
|
+
},
|
|
391
|
+
],
|
|
392
|
+
changeOutputs: [],
|
|
393
|
+
explicitExternalSpendAmount: 0,
|
|
394
|
+
implicitExternalSpendAmount: 22000,
|
|
395
|
+
needsCustomChangeKeySignatureVerification: false,
|
|
396
|
+
});
|
|
397
|
+
await assert_1.default.rejects(coin.verifyTransaction({
|
|
398
|
+
txParams: {
|
|
399
|
+
walletPassphrase: passphrase,
|
|
400
|
+
},
|
|
401
|
+
txPrebuild: {
|
|
402
|
+
txHex: '00',
|
|
403
|
+
},
|
|
404
|
+
wallet: unsignedSendingWallet,
|
|
405
|
+
verification: {},
|
|
406
|
+
}), /prebuild attempts to spend to unintended external recipients/);
|
|
407
|
+
coinMock.restore();
|
|
408
|
+
});
|
|
409
|
+
describe('quantum-resistant sweep (qr: true)', function () {
|
|
410
|
+
it('should reject when explicit external outputs are present', async () => {
|
|
411
|
+
const coinMock = sinon.stub(coin, 'parseTransaction').resolves({
|
|
412
|
+
keychains: {},
|
|
413
|
+
keySignatures: {},
|
|
414
|
+
outputs: [],
|
|
415
|
+
missingOutputs: [],
|
|
416
|
+
explicitExternalOutputs: [{ address: 'external_addr', amount: '5000' }],
|
|
417
|
+
implicitExternalOutputs: [],
|
|
418
|
+
changeOutputs: [{ address: 'change_addr', amount: '4000' }],
|
|
419
|
+
explicitExternalSpendAmount: 5000,
|
|
420
|
+
implicitExternalSpendAmount: 0,
|
|
421
|
+
needsCustomChangeKeySignatureVerification: false,
|
|
422
|
+
});
|
|
423
|
+
await assert_1.default.rejects(coin.verifyTransaction({
|
|
424
|
+
txParams: { walletPassphrase: passphrase, qr: true },
|
|
425
|
+
txPrebuild: {},
|
|
426
|
+
wallet: unsignedSendingWallet,
|
|
427
|
+
verification: {},
|
|
428
|
+
}), /quantum-resistant sweep transactions must only contain wallet-internal outputs/);
|
|
429
|
+
coinMock.restore();
|
|
430
|
+
});
|
|
431
|
+
it('should reject when implicit external outputs are present', async () => {
|
|
432
|
+
const coinMock = sinon.stub(coin, 'parseTransaction').resolves({
|
|
433
|
+
keychains: {},
|
|
434
|
+
keySignatures: {},
|
|
435
|
+
outputs: [],
|
|
436
|
+
missingOutputs: [],
|
|
437
|
+
explicitExternalOutputs: [],
|
|
438
|
+
implicitExternalOutputs: [{ address: 'paygo_addr', amount: '100' }],
|
|
439
|
+
changeOutputs: [{ address: 'change_addr', amount: '9900' }],
|
|
440
|
+
explicitExternalSpendAmount: 0,
|
|
441
|
+
implicitExternalSpendAmount: 100,
|
|
442
|
+
needsCustomChangeKeySignatureVerification: false,
|
|
443
|
+
});
|
|
444
|
+
await assert_1.default.rejects(coin.verifyTransaction({
|
|
445
|
+
txParams: { walletPassphrase: passphrase, qr: true },
|
|
446
|
+
txPrebuild: {},
|
|
447
|
+
wallet: unsignedSendingWallet,
|
|
448
|
+
verification: {},
|
|
449
|
+
}), /quantum-resistant sweep transactions must only contain wallet-internal outputs/);
|
|
450
|
+
coinMock.restore();
|
|
451
|
+
});
|
|
452
|
+
it('should pass when all outputs are internal (change only)', async () => {
|
|
453
|
+
const coinMock = sinon.stub(coin, 'parseTransaction').resolves({
|
|
454
|
+
keychains: {},
|
|
455
|
+
keySignatures: {},
|
|
456
|
+
outputs: [{ address: 'change_addr', amount: '10000' }],
|
|
457
|
+
missingOutputs: [],
|
|
458
|
+
explicitExternalOutputs: [],
|
|
459
|
+
implicitExternalOutputs: [],
|
|
460
|
+
changeOutputs: [{ address: 'change_addr', amount: '10000' }],
|
|
461
|
+
explicitExternalSpendAmount: 0,
|
|
462
|
+
implicitExternalSpendAmount: 0,
|
|
463
|
+
needsCustomChangeKeySignatureVerification: false,
|
|
464
|
+
});
|
|
465
|
+
const result = await coin.verifyTransaction({
|
|
466
|
+
txParams: { walletPassphrase: passphrase, qr: true },
|
|
467
|
+
txPrebuild: {},
|
|
468
|
+
wallet: unsignedSendingWallet,
|
|
469
|
+
verification: {},
|
|
470
|
+
});
|
|
471
|
+
assert_1.default.strictEqual(result, true);
|
|
472
|
+
coinMock.restore();
|
|
473
|
+
});
|
|
474
|
+
it('should not apply qr check when qr is not set', async () => {
|
|
475
|
+
const coinMock = sinon.stub(coin, 'parseTransaction').resolves({
|
|
476
|
+
keychains: {},
|
|
477
|
+
keySignatures: {},
|
|
478
|
+
outputs: [],
|
|
479
|
+
missingOutputs: [],
|
|
480
|
+
explicitExternalOutputs: [{ address: 'external_addr', amount: '5000' }],
|
|
481
|
+
implicitExternalOutputs: [],
|
|
482
|
+
changeOutputs: [],
|
|
483
|
+
explicitExternalSpendAmount: 5000,
|
|
484
|
+
implicitExternalSpendAmount: 0,
|
|
485
|
+
needsCustomChangeKeySignatureVerification: false,
|
|
486
|
+
});
|
|
487
|
+
const result = await coin.verifyTransaction({
|
|
488
|
+
txParams: { walletPassphrase: passphrase },
|
|
489
|
+
txPrebuild: { txHex: '00' },
|
|
490
|
+
wallet: unsignedSendingWallet,
|
|
491
|
+
verification: {},
|
|
492
|
+
});
|
|
493
|
+
assert_1.default.strictEqual(result, true);
|
|
494
|
+
coinMock.restore();
|
|
495
|
+
});
|
|
496
|
+
});
|
|
497
|
+
it('should work with bigint amounts', async () => {
|
|
498
|
+
// need a coin that uses bigint
|
|
499
|
+
const bigintCoin = (0, util_1.getUtxoCoin)('tdoge');
|
|
500
|
+
const coinMock = sinon.stub(bigintCoin, 'parseTransaction').resolves({
|
|
501
|
+
keychains: {},
|
|
502
|
+
keySignatures: {},
|
|
503
|
+
outputs: [],
|
|
504
|
+
missingOutputs: [],
|
|
505
|
+
explicitExternalOutputs: [
|
|
506
|
+
{
|
|
507
|
+
address: 'external_address',
|
|
508
|
+
amount: '10000',
|
|
509
|
+
},
|
|
510
|
+
],
|
|
511
|
+
implicitExternalOutputs: [
|
|
512
|
+
{
|
|
513
|
+
address: 'external_address_2',
|
|
514
|
+
amount: '15',
|
|
515
|
+
},
|
|
516
|
+
],
|
|
517
|
+
changeOutputs: [],
|
|
518
|
+
explicitExternalSpendAmount: BigInt(10000),
|
|
519
|
+
implicitExternalSpendAmount: BigInt(15),
|
|
520
|
+
needsCustomChangeKeySignatureVerification: false,
|
|
521
|
+
});
|
|
522
|
+
const result = await bigintCoin.verifyTransaction({
|
|
523
|
+
txParams: {
|
|
524
|
+
walletPassphrase: passphrase,
|
|
525
|
+
},
|
|
526
|
+
txPrebuild: {
|
|
527
|
+
txHex: '00',
|
|
528
|
+
},
|
|
529
|
+
wallet: unsignedSendingWallet,
|
|
530
|
+
verification: {},
|
|
531
|
+
});
|
|
532
|
+
assert_1.default.strictEqual(result, true);
|
|
533
|
+
coinMock.restore();
|
|
534
|
+
});
|
|
535
|
+
});
|
|
536
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyaWZ5VHJhbnNhY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90ZXN0L3VuaXQvdmVyaWZ5VHJhbnNhY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxvREFBNEI7QUFFNUIsNkNBQStCO0FBQy9CLG1EQUE4QztBQUU5QyxpQ0FBbUQ7QUFFbkQsUUFBUSxDQUFDLG9CQUFvQixFQUFFO0lBQzdCLE1BQU0sSUFBSSxHQUFHLElBQUEsa0JBQVcsRUFBQyxNQUFNLENBQUMsQ0FBQztJQUVqQyxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUM7SUFDL0MsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBRWhELE1BQU0sVUFBVSxHQUFHO1FBQ2pCLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsTUFBTSxFQUFFO1FBQy9CLE1BQU0sRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsTUFBTSxFQUFFO1FBQ2pDLEtBQUssRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsTUFBTSxFQUFFO0tBQ2pDLENBQUM7SUFFRixvRUFBb0U7SUFDcEUsTUFBTSxJQUFJLEdBQUcsS0FBSyxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsRUFBRSxDQUFDLENBQUMsTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsR0FBSSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDbkcsTUFBTSxRQUFRLEdBQUcsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsWUFBWSxDQUFDLENBQUM7SUFDbEQsTUFBTSxTQUFTLEdBQUcsQ0FBQyxHQUFHLEVBQUUs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QUU7WUFDbEIsdUJBQXVCLEVBQUU7Z0JBQ3ZCO29CQUNFLE9BQU8sRUFBRSxrQkFBa0I7b0JBQzNCLE1BQU0sRUFBRSxPQUFPO2lCQUNoQjthQUNGO1lBQ0QsdUJBQXVCLEVBQUU7Z0JBQ3ZCO29CQUNFLE9BQU8sRUFBRSxvQkFBb0I7b0JBQzdCLE1BQU0sRUFBRSxJQUFJO2lCQUNiO2FBQ0Y7WUFDRCxhQUFhLEVBQUUsRUFBRTtZQUNqQiwyQkFBMkIsRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDO1lBQzFDLDJCQUEyQixFQUFFLE1BQU0sQ0FBQyxFQUFFLENBQUM7WUFDdkMseUNBQXlDLEVBQUUsS0FBSztTQUNqRCxDQUFDLENBQUM7UUFFSCxNQUFNLE1BQU0sR0FBRyxNQUFNLFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQztZQUNoRCxRQUFRLEVBQUU7Z0JBQ1IsZ0JBQWdCLEVBQUUsVUFBVTthQUM3QjtZQUNELFVBQVUsRUFBRTtnQkFDVixLQUFLLEVBQUUsSUFBSTthQUNaO1lBQ0QsTUFBTSxFQUFFLHFCQUE0QjtZQUNwQyxZQUFZLEVBQUUsRUFBRTtTQUNqQixDQUFDLENBQUM7UUFFSCxnQkFBTSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFFakMsUUFBUSxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ3JCLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5cbmltcG9ydCAqIGFzIHNpbm9uIGZyb20gJ3Npbm9uJztcbmltcG9ydCB7IFdhbGxldCB9IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1jb3JlJztcblxuaW1wb3J0IHsgZGVmYXVsdEJpdEdvLCBnZXRVdHhvQ29pbiB9IGZyb20gJy4vdXRpbCc7XG5cbmRlc2NyaWJlKCdWZXJpZnkgVHJhbnNhY3Rpb24nLCBmdW5jdGlvbiAoKSB7XG4gIGNvbnN0IGNvaW4gPSBnZXRVdHhvQ29pbigndGJ0YycpO1xuXG4gIGNvbnN0IHVzZXJLZXljaGFpbiA9IGNvaW4ua2V5Y2hhaW5zKCkuY3JlYXRlKCk7XG4gIGNvbnN0IG90aGVyS2V5Y2hhaW4gPSBjb2luLmtleWNoYWlucygpLmNyZWF0ZSgpO1xuXG4gIGNvbnN0IGNoYW5nZUtleXMgPSB7XG4gICAgdXNlcjogY29pbi5rZXljaGFpbnMoKS5jcmVhdGUoKSxcbiAgICBiYWNrdXA6IGNvaW4ua2V5Y2hhaW5zKCkuY3JlYXRlKCksXG4gICAgYml0Z286IGNvaW4ua2V5Y2hhaW5zKCkuY3JlYXRlKCksXG4gIH07XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1ub24tbnVsbC1hc3NlcnRpb25cbiAgY29uc3Qgc2lnbiA9IGFzeW5jIChrZXksIGtleWNoYWluKSA9PiAoYXdhaXQgY29pbi5zaWduTWVzc2FnZShrZXljaGFpbiwga2V5LnB1YiEpKS50b1N0cmluZygnaGV4Jyk7XG4gIGNvbnN0IHNpZ25Vc2VyID0gKGtleSkgPT4gc2lnbihrZXksIHVzZXJLZXljaGFpbik7XG4gIGNvbnN0IHNpZ25PdGhlciA9IChrZXkpID0+IHNpZ24oa2V5LCBvdGhlcktleWNoYWluKTtcbiAgY29uc3QgcGFzc3BocmFzZSA9ICd0ZXN0X3Bhc3NwaHJhc2UnO1xuXG4gIGNvbnN0IHN0dWJEYXRhID0ge1xuICAgIHVuc2lnbmVkU2VuZGluZ1dhbGxldDoge1xuICAgICAga2V5SWRzOiBzaW5vbi5zdHViKCkucmV0dXJucyhbJzAnLCAnMScsICcyJ10pLFxuICAgIH0sXG4gICAgcGFyc2VUcmFuc2FjdGlvbkRhdGE6IHtcbiAgICAgIGJhZEtleToge1xuICAgICAgICBrZXljaGFpbnM6IHtcbiAgICAgICAgICAvLyB1c2VyIHB1YmxpYyBrZXkgc3dhcHBlZCBvdXRcbiAgICAgICAgICB1c2VyOiB7XG4gICAgICAgICAgICBwdWI6IG90aGVyS2V5Y2hhaW4ucHViLFxuICAgICAgICAgICAgZW5jcnlwdGVkUHJ2OiBkZWZhdWx0Qml0R28uZW5jcnlwdCh7XG4gICAgICAgICAgICAgIGlucHV0OiB1c2VyS2V5Y2hhaW4ucHJ2LFxuICAgICAgICAgICAgICBwYXNzd29yZDogcGFzc3BocmFzZSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIG5lZWRzQ3VzdG9tQ2hhbmdlS2V5U2lnbmF0dXJlVmVyaWZpY2F0aW9uOiB0cnVlLFxuICAgICAgfSxcbiAgICAgIG5vQ3VzdG9tQ2hhbmdlOiB7XG4gICAgICAgIGtleWNoYWluczogeyB1c2VyOiB1c2VyS2V5Y2hhaW4gfSxcbiAgICAgICAgbmVlZHNDdXN0b21DaGFuZ2VLZXlTaWduYXR1cmVWZXJpZmljYXRpb246IHRydWUsXG4gICAgICB9LFxuICAgICAgZW1wdHlDdXN0b21DaGFuZ2U6IHtcbiAgICAgICAga2V5Y2hhaW5zOiB7IHVzZXI6IHVzZXJLZXljaGFpbiB9LFxuICAgICAgICBuZWVkc0N1c3RvbUNoYW5nZUtleVNpZ25hdHVyZVZlcmlmaWNhdGlvbjogdHJ1ZSxcbiAgICAgICAgY3VzdG9tQ2hhbmdlOiB7fSxcbiAgICAgIH0sXG4gICAgICAvLyBuZWVkcyB0byBiZSBhc3luYyBmdW5jdGlvbiB0byBjcmVhdGUgc2lnbmF0dXJlc1xuICAgICAgYmFkU2lnczogYXN5bmMgKCkgPT4gKHtcbiAgICAgICAga2V5Y2hhaW5zOiB7IHVzZXI6IHVzZXJLZXljaGFpbiB9LFxuICAgICAgICBuZWVkc0N1c3RvbUNoYW5nZUtleVNpZ25hdHVyZVZlcmlmaWNhdGlvbjogdHJ1ZSxcbiAgICAgICAgY3VzdG9tQ2hhbmdlOiB7XG4gICAgICAgICAga2V5czogW2NoYW5nZUtleXMudXNlciwgY2hhbmdlS2V5cy5iYWNrdXAsIGNoYW5nZUtleXMuYml0Z29dLFxuICAgICAgICAgIHNpZ25hdHVyZXM6IFtcbiAgICAgICAgICAgIGF3YWl0IHNpZ25PdGhlcihjaGFuZ2VLZXlzLnVzZXIpLFxuICAgICAgICAgICAgYXdhaXQgc2lnbk90aGVyKGNoYW5nZUtleXMuYmFja3VwKSxcbiAgICAgICAgICAgIGF3YWl0IHNpZ25PdGhlcihjaGFuZ2VLZXlzLmJpdGdvKSxcbiAgICAgICAgICBdLFxuICAgICAgICB9LFxuICAgICAgfSksXG4gICAgICBnb29kU2lnczogYXN5bmMgKCkgPT4gKHtcbiAgICAgICAga2V5Y2hhaW5zOiB7IHVzZXI6IHVzZXJLZXljaGFpbiB9LFxuICAgICAgICBuZWVkc0N1c3RvbUNoYW5nZUtleVNpZ25hdHVyZVZlcmlmaWNhdGlvbjogdHJ1ZSxcbiAgICAgICAgY3VzdG9tQ2hhbmdlOiB7XG4gICAgICAgICAga2V5czogW2NoYW5nZUtleXMudXNlciwgY2hhbmdlS2V5cy5iYWNrdXAsIGNoYW5nZUtleXMuYml0Z29dLFxuICAgICAgICAgIHNpZ25hdHVyZXM6IFtcbiAgICAgICAgICAgIGF3YWl0IHNpZ25Vc2VyKGNoYW5nZUtleXMudXNlciksXG4gICAgICAgICAgICBhd2FpdCBzaWduVXNlcihjaGFuZ2VLZXlzLmJhY2t1cCksXG4gICAgICAgICAgICBhd2FpdCBzaWduVXNlcihjaGFuZ2VLZXlzLmJpdGdvKSxcbiAgICAgICAgICBdLFxuICAgICAgICB9LFxuICAgICAgICBtaXNzaW5nT3V0cHV0czogMSxcbiAgICAgIH0pLFxuICAgIH0sXG4gIH07XG5cbiAgY29uc3QgdW5zaWduZWRTZW5kaW5nV2FsbGV0ID0gc2lub24uY3JlYXRlU3R1Ykluc3RhbmNlKFdhbGxldCwgc3R1YkRhdGEudW5zaWduZWRTZW5kaW5nV2FsbGV0IGFzIGFueSk7XG5cbiAgaXQoJ3Nob3VsZCBmYWlsIGlmIHRoZSB1c2VyIHByaXZhdGUga2V5IGNhbm5vdCBiZSB2ZXJpZmllZCB0byBtYXRjaCB0aGUgdXNlciBwdWJsaWMga2V5JywgYXN5bmMgKCkgPT4ge1xuICAgIHNpbm9uLnN0dWIoY29pbiwgJ3BhcnNlVHJhbnNhY3Rpb24nKS5yZXNvbHZlcyhzdHViRGF0YS5wYXJzZVRyYW5zYWN0aW9uRGF0YS5iYWRLZXkgYXMgYW55KTtcbiAgICBjb25zdCB2ZXJpZnlXYWxsZXQgPSBzaW5vbi5jcmVhdGVTdHViSW5zdGFuY2UoV2FsbGV0LCB7fSk7XG5cbiAgICBhd2FpdCBhc3NlcnQucmVqZWN0cyhcbiAgICAgIGNvaW4udmVyaWZ5VHJhbnNhY3Rpb24oe1xuICAgICAgICB0eFBhcmFtczoge1xuICAgICAgICAgIHdhbGxldFBhc3NwaHJhc2U6IHBhc3NwaHJhc2UsXG4gICAgICAgIH0sXG4gICAgICAgIHR4UHJlYnVpbGQ6IHt9LFxuICAgICAgICB3YWxsZXQ6IHZlcmlmeVdhbGxldCBhcyBhbnksXG4gICAgICAgIHZlcmlmaWNhdGlvbjoge30sXG4gICAgICB9KSxcbiAgICAgIC90cmFuc2FjdGlvbiByZXF1aXJlcyB2ZXJpZmljYXRpb24gb2YgdXNlciBwdWJsaWMga2V5LCBidXQgaXQgd2FzIHVuYWJsZSB0byBiZSB2ZXJpZmllZC9cbiAgICApO1xuXG4gICAgKGNvaW4ucGFyc2VUcmFuc2FjdGlvbiBhcyBhbnkpLnJlc3RvcmUoKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBmYWlsIGlmIHRoZSBjdXN0b20gY2hhbmdlIHZlcmlmaWNhdGlvbiBkYXRhIGlzIHJlcXVpcmVkIGJ1dCBtaXNzaW5nJywgYXN5bmMgKCkgPT4ge1xuICAgIHNpbm9uLnN0dWIoY29pbiwgJ3BhcnNlVHJhbnNhY3Rpb24nKS5yZXNvbHZlcyhzdHViRGF0YS5wYXJzZVRyYW5zYWN0aW9uRGF0YS5ub0N1c3RvbUNoYW5nZSBhcyBhbnkpO1xuXG4gICAgYXdhaXQgYXNzZXJ0LnJlamVjdHMoXG4gICAgICBjb2luLnZlcmlmeVRyYW5zYWN0aW9uKHtcbiAgICAgICAgdHhQYXJhbXM6IHtcbiAgICAgICAgICB3YWxsZXRQYXNzcGhyYXNlOiBwYXNzcGhyYXNlLFxuICAgICAgICB9LFxuICAgICAgICB0eFByZWJ1aWxkOiB7fSxcbiAgICAgICAgd2FsbGV0OiB1bnNpZ25lZFNlbmRpbmdXYWxsZXQgYXMgYW55LFxuICAgICAgICB2ZXJpZmljYXRpb246IHt9LFxuICAgICAgfSksXG4gICAgICAvcGFyc2VkIHRyYW5zYWN0aW9uIGlzIG1pc3NpbmcgcmVxdWlyZWQgY3VzdG9tIGNoYW5nZSB2ZXJpZmljYXRpb24gZGF0YS9cbiAgICApO1xuXG4gICAgKGNvaW4ucGFyc2VUcmFuc2FjdGlvbiBhcyBhbnkpLnJlc3RvcmUoKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBmYWlsIGlmIHRoZSBjdXN0b20gY2hhbmdlIGtleXMgb3Iga2V5IHNpZ25hdHVyZXMgYXJlIG1pc3NpbmcnLCBhc3luYyAoKSA9PiB7XG4gICAgc2lub24uc3R1Yihjb2luLCAncGFyc2VUcmFuc2FjdGlvbicpLnJlc29sdmVzKHN0dWJEYXRhLnBhcnNlVHJhbnNhY3Rpb25EYXRhLmVtcHR5Q3VzdG9tQ2hhbmdlIGFzIGFueSk7XG5cbiAgICBhd2FpdCBhc3NlcnQucmVqZWN0cyhcbiAgICAgIGNvaW4udmVyaWZ5VHJhbnNhY3Rpb24oe1xuICAgICAgICB0eFBhcmFtczoge1xuICAgICAgICAgIHdhbGxldFBhc3NwaHJhc2U6IHBhc3NwaHJhc2UsXG4gICAgICAgIH0sXG4gICAgICAgIHR4UHJlYnVpbGQ6IHt9LFxuICAgICAgICB3YWxsZXQ6IHVuc2lnbmVkU2VuZGluZ1dhbGxldCBhcyBhbnksXG4gICAgICAgIHZlcmlmaWNhdGlvbjoge30sXG4gICAgICB9KSxcbiAgICAgIC9jdXN0b21DaGFuZ2UgcHJvcGVydHkgaXMgbWlzc2luZyBrZXlzIG9yIHNpZ25hdHVyZXMvXG4gICAgKTtcblxuICAgIChjb2luLnBhcnNlVHJhbnNhY3Rpb24gYXMgYW55KS5yZXN0b3JlKCk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgZmFpbCBpZiB0aGUgY3VzdG9tIGNoYW5nZSBrZXkgc2lnbmF0dXJlcyBjYW5ub3QgYmUgdmVyaWZpZWQnLCBhc3luYyAoKSA9PiB7XG4gICAgc2lub24uc3R1Yihjb2luLCAncGFyc2VUcmFuc2FjdGlvbicpLnJlc29sdmVzKChhd2FpdCBzdHViRGF0YS5wYXJzZVRyYW5zYWN0aW9uRGF0YS5iYWRTaWdzKCkpIGFzIGFueSk7XG5cbiAgICBhd2FpdCBhc3NlcnQucmVqZWN0cyhcbiAgICAgIGNvaW4udmVyaWZ5VHJhbnNhY3Rpb24oe1xuICAgICAgICB0eFBhcmFtczoge1xuICAgICAgICAgIHdhbGxldFBhc3NwaHJhc2U6IHBhc3NwaHJhc2UsXG4gICAgICAgIH0sXG4gICAgICAgIHR4UHJlYnVpbGQ6IHt9LFxuICAgICAgICB3YWxsZXQ6IHVuc2lnbmVkU2VuZGluZ1dhbGxldCBhcyBhbnksXG4gICAgICAgIHZlcmlmaWNhdGlvbjoge30sXG4gICAgICB9KSxcbiAgICAgIC90cmFuc2FjdGlvbiByZXF1aXJlcyB2ZXJpZmljYXRpb24gb2YgY3VzdG9tIGNoYW5nZSBrZXkgc2lnbmF0dXJlcywgYnV0IHRoZXkgd2VyZSB1bmFibGUgdG8gYmUgdmVyaWZpZWQvXG4gICAgKTtcblxuICAgIChjb2luLnBhcnNlVHJhbnNhY3Rpb24gYXMgYW55KS5yZXN0b3JlKCk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgc3VjY2Vzc2Z1bGx5IHZlcmlmeSBhIGN1c3RvbSBjaGFuZ2UgdHJhbnNhY3Rpb24gd2hlbiBjaGFuZ2Uga2V5cyBhbmQgc2lnbmF0dXJlcyBhcmUgdmFsaWQnLCBhc3luYyAoKSA9PiB7XG4gICAgc2lub24uc3R1Yihjb2luLCAncGFyc2VUcmFuc2FjdGlvbicpLnJlc29sdmVzKChhd2FpdCBzdHViRGF0YS5wYXJzZVRyYW5zYWN0aW9uRGF0YS5nb29kU2lncygpKSBhcyBhbnkpO1xuXG4gICAgLy8gaWYgdmVyaWZ5IHRyYW5zYWN0aW9uIGdldHMgcmVqZWN0ZWQgd2l0aCB0aGUgb3V0cHV0cyBtaXNzaW5nIGVycm9yIG1lc3NhZ2UsXG4gICAgLy8gdGhlbiB3ZSBrbm93IHRoYXQgdGhlIHZlcmlmaWNhdGlvbiBvZiB0aGUgY3VzdG9tIGNoYW5nZSBrZXkgc2lnbmF0dXJlcyB3YXMgc3VjY2Vzc2Z1bFxuICAgIGF3YWl0IGFzc2VydC5yZWplY3RzKFxuICAgICAgY29pbi52ZXJpZnlUcmFuc2FjdGlvbih7XG4gICAgICAgIHR4UGFyYW1zOiB7XG4gICAgICAgICAgd2FsbGV0UGFzc3BocmFzZTogcGFzc3BocmFzZSxcbiAgICAgICAgfSxcbiAgICAgICAgdHhQcmVidWlsZDoge30sXG4gICAgICAgIHdhbGxldDogdW5zaWduZWRTZW5kaW5nV2FsbGV0IGFzIGFueSxcbiAgICAgICAgdmVyaWZpY2F0aW9uOiB7fSxcbiAgICAgIH0pLFxuICAgICAgL2V4cGVjdGVkIG91dHB1dHMgbWlzc2luZyBpbiB0cmFuc2FjdGlvbiBwcmVidWlsZC9cbiAgICApO1xuXG4gICAgKGNvaW4ucGFyc2VUcmFuc2FjdGlvbiBhcyBhbnkpLnJlc3RvcmUoKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBub3QgYWxsb3cgbW9yZSB0aGFuIDE1MCBiYXNpcyBwb2ludHMgb2YgaW1wbGljaXQgZXh0ZXJuYWwgb3V0cHV0cyAoZm9yIHBheWdvIG91dHB1dHMpJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGNvaW5Nb2NrID0gc2lub24uc3R1Yihjb2luLCAncGFyc2VUcmFuc2FjdGlvbicpLnJlc29sdmVzKHtcbiAgICAgIGtleWNoYWluczoge30gYXMgYW55LFxuICAgICAga2V5U2lnbmF0dXJlczoge30sXG4gICAgICBvdXRwdXRzOiBbXSxcbiAgICAgIG1pc3NpbmdPdXRwdXRzOiBbXSxcbiAgICAgIGV4cGxpY2l0RXh0ZXJuYWxPdXRwdXRzOiBbXSxcbiAgICAgIGltcGxpY2l0RXh0ZXJuYWxPdXRwdXRzOiBbXSxcbiAgICAgIGNoYW5nZU91dHB1dHM6IFtdLFxuICAgICAgZXhwbGljaXRFeHRlcm5hbFNwZW5kQW1vdW50OiAxMDAwMCxcbiAgICAgIGltcGxpY2l0RXh0ZXJuYWxTcGVuZEFtb3VudDogMTUxLFxuICAgICAgbmVlZHNDdXN0b21DaGFuZ2VLZXlTaWduYXR1cmVWZXJpZmljYXRpb246IGZhbHNlLFxuICAgIH0pO1xuXG4gICAgYXdhaXQgYXNzZXJ0LnJlamVjdHMoXG4gICAgICBjb2luLnZlcmlmeVRyYW5zYWN0aW9uKHtcbiAgICAgICAgdHhQYXJhbXM6IHtcbiAgICAgICAgICB3YWxsZXRQYXNzcGhyYXNlOiBwYXNzcGhyYXNlLFxuICAgICAgICB9LFxuICAgICAgICB0eFByZWJ1aWxkOiB7fSxcbiAgICAgICAgd2FsbGV0OiB1bnNpZ25lZFNlbmRpbmdXYWxsZXQgYXMgYW55LFxuICAgICAgfSksXG4gICAgICAvcHJlYnVpbGQgYXR0ZW1wdHMgdG8gc3BlbmQgdG8gdW5pbnRlbmRlZCBleHRlcm5hbCByZWNpcGllbnRzL1xuICAgICk7XG5cbiAgICBjb2luTW9jay5yZXN0b3JlKCk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgYWxsb3cgMTUwIGJhc2lzIHBvaW50cyBvZiBpbXBsaWNpdCBleHRlcm5hbCBvdXRwdXRzIChmb3IgcGF5Z28gb3V0cHV0cyknLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgY29pbk1vY2sgPSBzaW5vbi5zdHViKGNvaW4sICdwYXJzZVRyYW5zYWN0aW9uJykucmVzb2x2ZXMoe1xuICAgICAga2V5Y2hhaW5zOiB7fSBhcyBhbnksXG4gICAgICBrZXlTaWduYXR1cmVzOiB7fSxcbiAgICAgIG91dHB1dHM6IFtdLFxuICAgICAgbWlzc2luZ091dHB1dHM6IFtdLFxuICAgICAgZXhwbGljaXRFeHRlcm5hbE91dHB1dHM6IFtdLFxuICAgICAgaW1wbGljaXRFeHRlcm5hbE91dHB1dHM6IFtdLFxuICAgICAgY2hhbmdlT3V0cHV0czogW10sXG4gICAgICBleHBsaWNpdEV4dGVybmFsU3BlbmRBbW91bnQ6IDEwMDAsXG4gICAgICBpbXBsaWNpdEV4dGVybmFsU3BlbmRBbW91bnQ6IDE1LFxuICAgICAgbmVlZHNDdXN0b21DaGFuZ2VLZXlTaWduYXR1cmVWZXJpZmljYXRpb246IGZhbHNlLFxuICAgIH0pO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY29pbi52ZXJpZnlUcmFuc2FjdGlvbih7XG4gICAgICB0eFBhcmFtczoge1xuICAgICAgICB3YWxsZXRQYXNzcGhyYXNlOiBwYXNzcGhyYXNlLFxuICAgICAgfSxcbiAgICAgIHR4UHJlYnVpbGQ6IHtcbiAgICAgICAgdHhIZXg6ICcwMCcsXG4gICAgICB9LFxuICAgICAgd2FsbGV0OiB1bnNpZ25lZFNlbmRpbmdXYWxsZXQgYXMgYW55LFxuICAgIH0pO1xuXG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKHJlc3VsdCwgdHJ1ZSk7XG5cbiAgICBjb2luTW9jay5yZXN0b3JlKCk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgbm90IGFsbG93IGFueSBpbXBsaWNpdCBleHRlcm5hbCBvdXRwdXRzIGlmIHBheWdvIG91dHB1dHMgYXJlIGRpc2FsbG93ZWQnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgY29pbk1vY2sgPSBzaW5vbi5zdHViKGNvaW4sICdwYXJzZVRyYW5zYWN0aW9uJykucmVzb2x2ZXMoe1xuICAgICAga2V5Y2hhaW5zOiB7fSBhcyBhbnksXG4gICAgICBrZXlTaWduYXR1cmVzOiB7fSxcbiAgICAgIG91dHB1dHM6IFtdLFxuICAgICAgbWlzc2luZ091dHB1dHM6IFtdLFxuICAgICAgZXhwbGljaXRFeHRlcm5hbE91dHB1dHM6IFtdLFxuICAgICAgaW1wbGljaXRFeHRlcm5hbE91dHB1dHM6IFtdLFxuICAgICAgY2hhbmdlT3V0cHV0czogW10sXG4gICAgICBleHBsaWNpdEV4dGVybmFsU3BlbmRBbW91bnQ6IDAsXG4gICAgICBpbXBsaWNpdEV4dGVybmFsU3BlbmRBbW91bnQ6IDEwLFxuICAgICAgbmVlZHNDdXN0b21DaGFuZ2VLZXlTaWduYXR1cmVWZXJpZmljYXRpb246IGZhbHNlLFxuICAgIH0pO1xuXG4gICAgYXdhaXQgYXNzZXJ0LnJlamVjdHMoXG4gICAgICBjb2luLnZlcmlmeVRyYW5zYWN0aW9uKHtcbiAgICAgICAgdHhQYXJhbXM6IHtcbiAgICAgICAgICB3YWxsZXRQYXNzcGhyYXNlOiBwYXNzcGhyYXNlLFxuICAgICAgICB9LFxuICAgICAgICB0eFByZWJ1aWxkOiB7XG4gICAgICAgICAgdHhIZXg6ICcwMCcsXG4gICAgICAgIH0sXG4gICAgICAgIHdhbGxldDogdW5zaWduZWRTZW5kaW5nV2FsbGV0IGFzIGFueSxcbiAgICAgICAgdmVyaWZpY2F0aW9uOiB7XG4gICAgICAgICAgYWxsb3dQYXlnb091dHB1dDogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgICB9KSxcbiAgICAgIC9wcmVidWlsZCBhdHRlbXB0cyB0byBzcGVuZCB0byB1bmludGVuZGVkIGV4dGVybmFsIHJlY2lwaWVudHMvXG4gICAgKTtcblxuICAgIGNvaW5Nb2NrLnJlc3RvcmUoKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBhbGxvdyBwYXlnbyBvdXRwdXRzIGlmIGVtcHR5IHZlcmlmaWNhdGlvbiBvYmplY3QgaXMgcGFzc2VkJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGNvaW5Nb2NrID0gc2lub24uc3R1Yihjb2luLCAncGFyc2VUcmFuc2FjdGlvbicpLnJlc29sdmVzKHtcbiAgICAgIGtleWNoYWluczoge30gYXMgYW55LFxuICAgICAga2V5U2lnbmF0dXJlczoge30sXG4gICAgICBvdXRwdXRzOiBbXSxcbiAgICAgIG1pc3NpbmdPdXRwdXRzOiBbXSxcbiAgICAgIGV4cGxpY2l0RXh0ZXJuYWxPdXRwdXRzOiBbXSxcbiAgICAgIGltcGxpY2l0RXh0ZXJuYWxPdXRwdXRzOiBbXSxcbiAgICAgIGNoYW5nZU91dHB1dHM6IFtdLFxuICAgICAgZXhwbGljaXRFeHRlcm5hbFNwZW5kQW1vdW50OiAxMDAwLFxuICAgICAgaW1wbGljaXRFeHRlcm5hbFNwZW5kQW1vdW50OiAxNSxcbiAgICAgIG5lZWRzQ3VzdG9tQ2hhbmdlS2V5U2lnbmF0dXJlVmVyaWZpY2F0aW9uOiBmYWxzZSxcbiAgICB9KTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNvaW4udmVyaWZ5VHJhbnNhY3Rpb24oe1xuICAgICAgdHhQYXJhbXM6IHtcbiAgICAgICAgd2FsbGV0UGFzc3BocmFzZTogcGFzc3BocmFzZSxcbiAgICAgIH0sXG4gICAgICB0eFByZWJ1aWxkOiB7XG4gICAgICAgIHR4SGV4OiAnMDAnLFxuICAgICAgfSxcbiAgICAgIHdhbGxldDogdW5zaWduZWRTZW5kaW5nV2FsbGV0IGFzIGFueSxcbiAgICAgIHZlcmlmaWNhdGlvbjoge30sXG4gICAgfSk7XG5cbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwocmVzdWx0LCB0cnVlKTtcblxuICAgIGNvaW5Nb2NrLnJlc3RvcmUoKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCB2ZXJpZnkgYSBicmlkZ2luZyB0cmFuc2FjdGlvbiB3aG9zZSBpbXBsaWNpdCBleHRlcm5hbCBvdXRwdXQgbWF0Y2hlcyB0aGUgYnJpZGdlIGFtb3VudCcsIGFzeW5jICgpID0+IHtcbiAgICAvLyBCcmlkZ2luZyBpbnRlbnRzIChlLmcuIEJUQyAtPiBzQlRDIHBlZy1pbikgY2Fycnkgbm8gcmVjaXBpZW50czsgdGhlIHNpbmdsZSBleHRlcm5hbCBvdXRwdXRcbiAgICAvLyBpcyB0aGUgYnJpZGdlIGRlcG9zaXQgYWRkcmVzcyBjb21wdXRlZCBzZXJ2ZXItc2lkZS4gV2l0aCBleHBsaWNpdEV4dGVybmFsU3BlbmRBbW91bnQgMCB0aGVcbiAgICAvLyBwYXlnbyBsaW1pdCBpcyAwLCBzbyBhbnkgaW1wbGljaXQgZXh0ZXJuYWwgb3V0cHV0IHdvdWxkIG5vcm1hbGx5IGJlIHJlamVjdGVkIGFzIGFuXG4gICAgLy8gXCJ1bmludGVuZGVkIGV4dGVybmFsIHJlY2lwaWVudFwiLiBGb3IgdHlwZTogJ2JyaWRnaW5nJyB3ZSBpbnN0ZWFkIHZlcmlmeSB0aGF0IHRoZSBpbXBsaWNpdFxuICAgIC8vIGV4dGVybmFsIHNwZW5kIGVxdWFscyBicmlkZ2luZ1BhcmFtcy5zYnRjLmFtb3VudC5cbiAgICBjb25zdCBjb2luTW9jayA9IHNpbm9uLnN0dWIoY29pbiwgJ3BhcnNlVHJhbnNhY3Rpb24nKS5yZXNvbHZlcyh7XG4gICAgICBrZXljaGFpbnM6IHt9IGFzIGFueSxcbiAgICAgIGtleVNpZ25hdHVyZXM6IHt9LFxuICAgICAgb3V0cHV0czogW10sXG4gICAgICBtaXNzaW5nT3V0cHV0czogW10sXG4gICAgICBleHBsaWNpdEV4dGVybmFsT3V0cHV0czogW10sXG4gICAgICBpbXBsaWNpdEV4dGVybmFsT3V0cHV0czogW1xuICAgICAgICB7XG4gICAgICAgICAgYWRkcmVzczogJ3NidGNfZGVwb3NpdF9hZGRyZXNzJyxcbiAgICAgICAgICBhbW91bnQ6ICcyMjAwMCcsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgY2hhbmdlT3V0cHV0czogW10sXG4gICAgICBleHBsaWNpdEV4dGVybmFsU3BlbmRBbW91bnQ6IDAsXG4gICAgICBpbXBsaWNpdEV4dGVybmFsU3BlbmRBbW91bnQ6IDIyMDAwLFxuICAgICAgbmVlZHNDdXN0b21DaGFuZ2VLZXlTaWduYXR1cmVWZXJpZmljYXRpb246IGZhbHNlLFxuICAgIH0pO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY29pbi52ZXJpZnlUcmFuc2FjdGlvbih7XG4gICAgICB0eFBhcmFtczoge1xuICAgICAgICB3YWxsZXRQYXNzcGhyYXNlOiBwYXNzcGhyYXNlLFxuICAgICAgICB0eXBlOiAnYnJpZGdpbmcnLFxuICAgICAgICBicmlkZ2luZ1BhcmFtczogeyBzYnRjOiB7IGFtb3VudDogJzIyMDAwJywgc3RhY2tzUmVjaXBpZW50OiAnU00xWCcsIG1heEZlZTogJzEwMDAnLCBsb2NrVGltZTogMTAwIH0gfSxcbiAgICAgIH0sXG4gICAgICB0eFByZWJ1aWxkOiB7XG4gICAgICAgIHR4SGV4OiAnMDAnLFxuICAgICAgfSxcbiAgICAgIHdhbGxldDogdW5zaWduZWRTZW5kaW5nV2FsbGV0IGFzIGFueSxcbiAgICAgIHZlcmlmaWNhdGlvbjoge30sXG4gICAgfSk7XG5cbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwocmVzdWx0LCB0cnVlKTtcblxuICAgIGNvaW5Nb2NrLnJlc3RvcmUoKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCByZWplY3QgYSBicmlkZ2luZyB0cmFuc2FjdGlvbiB3aG9zZSBpbXBsaWNpdCBleHRlcm5hbCBvdXRwdXQgZG9lcyBub3QgbWF0Y2ggdGhlIGJyaWRnZSBhbW91bnQnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgY29pbk1vY2sgPSBzaW5vbi5zdHViKGNvaW4sICdwYXJzZVRyYW5zYWN0aW9uJykucmVzb2x2ZXMoe1xuICAgICAga2V5Y2hhaW5zOiB7fSBhcyBhbnksXG4gICAgICBrZXlTaWduYXR1cmVzOiB7fSxcbiAgICAgIG91dHB1dHM6IFtdLFxuICAgICAgbWlzc2luZ091dHB1dHM6IFtdLFxuICAgICAgZXhwbGljaXRFeHRlcm5hbE91dHB1dHM6IFtdLFxuICAgICAgaW1wbGljaXRFeHRlcm5hbE91dHB1dHM6IFtcbiAgICAgICAge1xuICAgICAgICAgIGFkZHJlc3M6ICdzYnRjX2RlcG9zaXRfYWRkcmVzcycsXG4gICAgICAgICAgYW1vdW50OiAnNTAwMDAnLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICAgIGNoYW5nZU91dHB1dHM6IFtdLFxuICAgICAgZXhwbGljaXRFeHRlcm5hbFNwZW5kQW1vdW50OiAwLFxuICAgICAgaW1wbGljaXRFeHRlcm5hbFNwZW5kQW1vdW50OiA1MDAwMCxcbiAgICAgIG5lZWRzQ3VzdG9tQ2hhbmdlS2V5U2lnbmF0dXJlVmVyaWZpY2F0aW9uOiBmYWxzZSxcbiAgICB9KTtcblxuICAgIGF3YWl0IGFzc2VydC5yZWplY3RzKFxuICAgICAgY29pbi52ZXJpZnlUcmFuc2FjdGlvbih7XG4gICAgICAgIHR4UGFyYW1zOiB7XG4gICAgICAgICAgd2FsbGV0UGFzc3BocmFzZTogcGFzc3BocmFzZSxcbiAgICAgICAgICB0eXBlOiAnYnJpZGdpbmcnLFxuICAgICAgICAgIGJyaWRnaW5nUGFyYW1zOiB7IHNidGM6IHsgYW1vdW50OiAnMjIwMDAnLCBzdGFja3NSZWNpcGllbnQ6ICdTTTFYJywgbWF4RmVlOiAnMTAwMCcsIGxvY2tUaW1lOiAxMDAgfSB9LFxuICAgICAgICB9LFxuICAgICAgICB0eFByZWJ1aWxkOiB7XG4gICAgICAgICAgdHhIZXg6ICcwMCcsXG4gICAgICAgIH0sXG4gICAgICAgIHdhbGxldDogdW5zaWduZWRTZW5kaW5nV2FsbGV0IGFzIGFueSxcbiAgICAgICAgdmVyaWZpY2F0aW9uOiB7fSxcbiAgICAgIH0pLFxuICAgICAgL2JyaWRnaW5nIG91dHB1dCBhbW91bnQgXFwoNTAwMDBcXCkgZG9lcyBub3QgbWF0Y2ggaW50ZW5kZWQgYnJpZGdlIGFtb3VudCBcXCgyMjAwMFxcKS9cbiAgICApO1xuXG4gICAgY29pbk1vY2sucmVzdG9yZSgpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIHJlamVjdCBhIGJyaWRnaW5nIHRyYW5zYWN0aW9uIHRoYXQgaXMgbWlzc2luZyBicmlkZ2luZ1BhcmFtcy5zYnRjLmFtb3VudCcsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBjb2luTW9jayA9IHNpbm9uLnN0dWIoY29pbiwgJ3BhcnNlVHJhbnNhY3Rpb24nKS5yZXNvbHZlcyh7XG4gICAgICBrZXljaGFpbnM6IHt9IGFzIGFueSxcbiAgICAgIGtleVNpZ25hdHVyZXM6IHt9LFxuICAgICAgb3V0cHV0czogW10sXG4gICAgICBtaXNzaW5nT3V0cHV0czogW10sXG4gICAgICBleHBsaWNpdEV4dGVybmFsT3V0cHV0czogW10sXG4gICAgICBpbXBsaWNpdEV4dGVybmFsT3V0cHV0czogW1xuICAgICAgICB7XG4gICAgICAgICAgYWRkcmVzczogJ3NidGNfZGVwb3NpdF9hZGRyZXNzJyxcbiAgICAgICAgICBhbW91bnQ6ICcyMjAwMCcsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgY2hhbmdlT3V0cHV0czogW10sXG4gICAgICBleHBsaWNpdEV4dGVybmFsU3BlbmRBbW91bnQ6IDAsXG4gICAgICBpbXBsaWNpdEV4dGVybmFsU3BlbmRBbW91bnQ6IDIyMDAwLFxuICAgICAgbmVlZHNDdXN0b21DaGFuZ2VLZXlTaWduYXR1cmVWZXJpZmljYXRpb246IGZhbHNlLFxuICAgIH0pO1xuXG4gICAgYXdhaXQgYXNzZXJ0LnJlamVjdHMoXG4gICAgICBjb2luLnZlcmlmeVRyYW5zYWN0aW9uKHtcbiAgICAgICAgdHhQYXJhbXM6IHtcbiAgICAgICAgICB3YWxsZXRQYXNzcGhyYXNlOiBwYXNzcGhyYXNlLFxuICAgICAgICAgIHR5cGU6ICdicmlkZ2luZycsXG4gICAgICAgIH0sXG4gICAgICAgIHR4UHJlYnVpbGQ6IHtcbiAgICAgICAgICB0eEhleDogJzAwJyxcbiAgICAgICAgfSxcbiAgICAgICAgd2FsbGV0OiB1bnNpZ25lZFNlbmRpbmdXYWxsZXQgYXMgYW55LFxuICAgICAgICB2ZXJpZmljYXRpb246IHt9LFxuICAgICAgfSksXG4gICAgICAvYnJpZGdpbmcgdHJhbnNhY3Rpb24gaXMgbWlzc2luZyBicmlkZ2luZ1BhcmFtcy5zYnRjLmFtb3VudC9cbiAgICApO1xuXG4gICAgY29pbk1vY2sucmVzdG9yZSgpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIHN0aWxsIHJlamVjdCB0aGUgc2FtZSBpbXBsaWNpdCBleHRlcm5hbCBvdXRwdXQgd2hlbiB0aGUgaW50ZW50IGlzIG5vdCBicmlkZ2luZycsIGFzeW5jICgpID0+IHtcbiAgICAvLyBTYW1lIHNoYXBlIGFzIHRoZSBicmlkZ2luZyB0ZXN0IGFib3ZlLCBidXQgd2l0aG91dCB0eXBlOiAnYnJpZGdpbmcnIHRoZSBpbXBsaWNpdCBleHRlcm5hbFxuICAgIC8vIG91dHB1dCBpcyB0cmVhdGVkIGFzIGFuIHVuaW50ZW5kZWQgZXh0ZXJuYWwgcmVjaXBpZW50IGFuZCByZWplY3RlZC5cbiAgICBjb25zdCBjb2luTW9jayA9IHNpbm9uLnN0dWIoY29pbiwgJ3BhcnNlVHJhbnNhY3Rpb24nKS5yZXNvbHZlcyh7XG4gICAgICBrZXljaGFpbnM6IHt9IGFzIGFueSxcbiAgICAgIGtleVNpZ25hdHVyZXM6IHt9LFxuICAgICAgb3V0cHV0czogW10sXG4gICAgICBtaXNzaW5nT3V0cHV0czogW10sXG4gICAgICBleHBsaWNpdEV4dGVybmFsT3V0cHV0czogW10sXG4gICAgICBpbXBsaWNpdEV4dGVybmFsT3V0cHV0czogW1xuICAgICAgICB7XG4gICAgICAgICAgYWRkcmVzczogJ3NidGNfZGVwb3NpdF9hZGRyZXNzJyxcbiAgICAgICAgICBhbW91bnQ6ICcyMjAwMCcsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgY2hhbmdlT3V0cHV0czogW10sXG4gICAgICBleHBsaWNpdEV4dGVybmFsU3BlbmRBbW91bnQ6IDAsXG4gICAgICBpbXBsaWNpdEV4dGVybmFsU3BlbmRBbW91bnQ6IDIyMDAwLFxuICAgICAgbmVlZHNDdXN0b21DaGFuZ2VLZXlTaWduYXR1cmVWZXJpZmljYXRpb246IGZhbHNlLFxuICAgIH0pO1xuXG4gICAgYXdhaXQgYXNzZXJ0LnJlamVjdHMoXG4gICAgICBjb2luLnZlcmlmeVRyYW5zYWN0aW9uKHtcbiAgICAgICAgdHhQYXJhbXM6IHtcbiAgICAgICAgICB3YWxsZXRQYXNzcGhyYXNlOiBwYXNzcGhyYXNlLFxuICAgICAgICB9LFxuICAgICAgICB0eFByZWJ1aWxkOiB7XG4gICAgICAgICAgdHhIZXg6ICcwMCcsXG4gICAgICAgIH0sXG4gICAgICAgIHdhbGxldDogdW5zaWduZWRTZW5kaW5nV2FsbGV0IGFzIGFueSxcbiAgICAgICAgdmVyaWZpY2F0aW9uOiB7fSxcbiAgICAgIH0pLFxuICAgICAgL3ByZWJ1aWxkIGF0dGVtcHRzIHRvIHNwZW5kIHRvIHVuaW50ZW5kZWQgZXh0ZXJuYWwgcmVjaXBpZW50cy9cbiAgICApO1xuXG4gICAgY29pbk1vY2sucmVzdG9yZSgpO1xuICB9KTtcblxuICBkZXNjcmliZSgncXVhbnR1bS1yZXNpc3RhbnQgc3dlZXAgKHFyOiB0cnVlKScsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIHJlamVjdCB3aGVuIGV4cGxpY2l0IGV4dGVybmFsIG91dHB1dHMgYXJlIHByZXNlbnQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBjb2luTW9jayA9IHNpbm9uLnN0dWIoY29pbiwgJ3BhcnNlVHJhbnNhY3Rpb24nKS5yZXNvbHZlcyh7XG4gICAgICAgIGtleWNoYWluczoge30gYXMgYW55LFxuICAgICAgICBrZXlTaWduYXR1cmVzOiB7fSxcbiAgICAgICAgb3V0cHV0czogW10sXG4gICAgICAgIG1pc3NpbmdPdXRwdXRzOiBbXSxcbiAgICAgICAgZXhwbGljaXRFeHRlcm5hbE91dHB1dHM6IFt7IGFkZHJlc3M6ICdleHRlcm5hbF9hZGRyJywgYW1vdW50OiAnNTAwMCcgfV0sXG4gICAgICAgIGltcGxpY2l0RXh0ZXJuYWxPdXRwdXRzOiBbXSxcbiAgICAgICAgY2hhbmdlT3V0cHV0czogW3sgYWRkcmVzczogJ2NoYW5nZV9hZGRyJywgYW1vdW50OiAnNDAwMCcgfV0sXG4gICAgICAgIGV4cGxpY2l0RXh0ZXJuYWxTcGVuZEFtb3VudDogNTAwMCxcbiAgICAgICAgaW1wbGljaXRFeHRlcm5hbFNwZW5kQW1vdW50OiAwLFxuICAgICAgICBuZWVkc0N1c3RvbUNoYW5nZUtleVNpZ25hdHVyZVZlcmlmaWNhdGlvbjogZmFsc2UsXG4gICAgICB9KTtcblxuICAgICAgYXdhaXQgYXNzZXJ0LnJlamVjdHMoXG4gICAgICAgIGNvaW4udmVyaWZ5VHJhbnNhY3Rpb24oe1xuICAgICAgICAgIHR4UGFyYW1zOiB7IHdhbGxldFBhc3NwaHJhc2U6IHBhc3NwaHJhc2UsIHFyOiB0cnVlIH0sXG4gICAgICAgICAgdHhQcmVidWlsZDoge30sXG4gICAgICAgICAgd2FsbGV0OiB1bnNpZ25lZFNlbmRpbmdXYWxsZXQgYXMgYW55LFxuICAgICAgICAgIHZlcmlmaWNhdGlvbjoge30sXG4gICAgICAgIH0pLFxuICAgICAgICAvcXVhbnR1bS1yZXNpc3RhbnQgc3dlZXAgdHJhbnNhY3Rpb25zIG11c3Qgb25seSBjb250YWluIHdhbGxldC1pbnRlcm5hbCBvdXRwdXRzL1xuICAgICAgKTtcblxuICAgICAgY29pbk1vY2sucmVzdG9yZSgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZWplY3Qgd2hlbiBpbXBsaWNpdCBleHRlcm5hbCBvdXRwdXRzIGFyZSBwcmVzZW50JywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgY29pbk1vY2sgPSBzaW5vbi5zdHViKGNvaW4sICdwYXJzZVRyYW5zYWN0aW9uJykucmVzb2x2ZXMoe1xuICAgICAgICBrZXljaGFpbnM6IHt9IGFzIGFueSxcbiAgICAgICAga2V5U2lnbmF0dXJlczoge30sXG4gICAgICAgIG91dHB1dHM6IFtdLFxuICAgICAgICBtaXNzaW5nT3V0cHV0czogW10sXG4gICAgICAgIGV4cGxpY2l0RXh0ZXJuYWxPdXRwdXRzOiBbXSxcbiAgICAgICAgaW1wbGljaXRFeHRlcm5hbE91dHB1dHM6IFt7IGFkZHJlc3M6ICdwYXlnb19hZGRyJywgYW1vdW50OiAnMTAwJyB9XSxcbiAgICAgICAgY2hhbmdlT3V0cHV0czogW3sgYWRkcmVzczogJ2NoYW5nZV9hZGRyJywgYW1vdW50OiAnOTkwMCcgfV0sXG4gICAgICAgIGV4cGxpY2l0RXh0ZXJuYWxTcGVuZEFtb3VudDogMCxcbiAgICAgICAgaW1wbGljaXRFeHRlcm5hbFNwZW5kQW1vdW50OiAxMDAsXG4gICAgICAgIG5lZWRzQ3VzdG9tQ2hhbmdlS2V5U2lnbmF0dXJlVmVyaWZpY2F0aW9uOiBmYWxzZSxcbiAgICAgIH0pO1xuXG4gICAgICBhd2FpdCBhc3NlcnQucmVqZWN0cyhcbiAgICAgICAgY29pbi52ZXJpZnlUcmFuc2FjdGlvbih7XG4gICAgICAgICAgdHhQYXJhbXM6IHsgd2FsbGV0UGFzc3BocmFzZTogcGFzc3BocmFzZSwgcXI6IHRydWUgfSxcbiAgICAgICAgICB0eFByZWJ1aWxkOiB7fSxcbiAgICAgICAgICB3YWxsZXQ6IHVuc2lnbmVkU2VuZGluZ1dhbGxldCBhcyBhbnksXG4gICAgICAgICAgdmVyaWZpY2F0aW9uOiB7fSxcbiAgICAgICAgfSksXG4gICAgICAgIC9xdWFudHVtLXJlc2lzdGFudCBzd2VlcCB0cmFuc2FjdGlvbnMgbXVzdCBvbmx5IGNvbnRhaW4gd2FsbGV0LWludGVybmFsIG91dHB1dHMvXG4gICAgICApO1xuXG4gICAgICBjb2luTW9jay5yZXN0b3JlKCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHBhc3Mgd2hlbiBhbGwgb3V0cHV0cyBhcmUgaW50ZXJuYWwgKGNoYW5nZSBvbmx5KScsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGNvaW5Nb2NrID0gc2lub24uc3R1Yihjb2luLCAncGFyc2VUcmFuc2FjdGlvbicpLnJlc29sdmVzKHtcbiAgICAgICAga2V5Y2hhaW5zOiB7fSBhcyBhbnksXG4gICAgICAgIGtleVNpZ25hdHVyZXM6IHt9LFxuICAgICAgICBvdXRwdXRzOiBbeyBhZGRyZXNzOiAnY2hhbmdlX2FkZHInLCBhbW91bnQ6ICcxMDAwMCcgfV0sXG4gICAgICAgIG1pc3NpbmdPdXRwdXRzOiBbXSxcbiAgICAgICAgZXhwbGljaXRFeHRlcm5hbE91dHB1dHM6IFtdLFxuICAgICAgICBpbXBsaWNpdEV4dGVybmFsT3V0cHV0czogW10sXG4gICAgICAgIGNoYW5nZU91dHB1dHM6IFt7IGFkZHJlc3M6ICdjaGFuZ2VfYWRkcicsIGFtb3VudDogJzEwMDAwJyB9XSxcbiAgICAgICAgZXhwbGljaXRFeHRlcm5hbFNwZW5kQW1vdW50OiAwLFxuICAgICAgICBpbXBsaWNpdEV4dGVybmFsU3BlbmRBbW91bnQ6IDAsXG4gICAgICAgIG5lZWRzQ3VzdG9tQ2hhbmdlS2V5U2lnbmF0dXJlVmVyaWZpY2F0aW9uOiBmYWxzZSxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBjb2luLnZlcmlmeVRyYW5zYWN0aW9uKHtcbiAgICAgICAgdHhQYXJhbXM6IHsgd2FsbGV0UGFzc3BocmFzZTogcGFzc3BocmFzZSwgcXI6IHRydWUgfSxcbiAgICAgICAgdHhQcmVidWlsZDoge30sXG4gICAgICAgIHdhbGxldDogdW5zaWduZWRTZW5kaW5nV2FsbGV0IGFzIGFueSxcbiAgICAgICAgdmVyaWZpY2F0aW9uOiB7fSxcbiAgICAgIH0pO1xuXG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwocmVzdWx0LCB0cnVlKTtcblxuICAgICAgY29pbk1vY2sucmVzdG9yZSgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBub3QgYXBwbHkgcXIgY2hlY2sgd2hlbiBxciBpcyBub3Qgc2V0JywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgY29pbk1vY2sgPSBzaW5vbi5zdHViKGNvaW4sICdwYXJzZVRyYW5zYWN0aW9uJykucmVzb2x2ZXMoe1xuICAgICAgICBrZXljaGFpbnM6IHt9IGFzIGFueSxcbiAgICAgICAga2V5U2lnbmF0dXJlczoge30sXG4gICAgICAgIG91dHB1dHM6IFtdLFxuICAgICAgICBtaXNzaW5nT3V0cHV0czogW10sXG4gICAgICAgIGV4cGxpY2l0RXh0ZXJuYWxPdXRwdXRzOiBbeyBhZGRyZXNzOiAnZXh0ZXJuYWxfYWRkcicsIGFtb3VudDogJzUwMDAnIH1dLFxuICAgICAgICBpbXBsaWNpdEV4dGVybmFsT3V0cHV0czogW10sXG4gICAgICAgIGNoYW5nZU91dHB1dHM6IFtdLFxuICAgICAgICBleHBsaWNpdEV4dGVybmFsU3BlbmRBbW91bnQ6IDUwMDAsXG4gICAgICAgIGltcGxpY2l0RXh0ZXJuYWxTcGVuZEFtb3VudDogMCxcbiAgICAgICAgbmVlZHNDdXN0b21DaGFuZ2VLZXlTaWduYXR1cmVWZXJpZmljYXRpb246IGZhbHNlLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNvaW4udmVyaWZ5VHJhbnNhY3Rpb24oe1xuICAgICAgICB0eFBhcmFtczogeyB3YWxsZXRQYXNzcGhyYXNlOiBwYXNzcGhyYXNlIH0sXG4gICAgICAgIHR4UHJlYnVpbGQ6IHsgdHhIZXg6ICcwMCcgfSxcbiAgICAgICAgd2FsbGV0OiB1bnNpZ25lZFNlbmRpbmdXYWxsZXQgYXMgYW55LFxuICAgICAgICB2ZXJpZmljYXRpb246IHt9LFxuICAgICAgfSk7XG5cbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChyZXN1bHQsIHRydWUpO1xuXG4gICAgICBjb2luTW9jay5yZXN0b3JlKCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgd29yayB3aXRoIGJpZ2ludCBhbW91bnRzJywgYXN5bmMgKCkgPT4ge1xuICAgIC8vIG5lZWQgYSBjb2luIHRoYXQgdXNlcyBiaWdpbnRcbiAgICBjb25zdCBiaWdpbnRDb2luID0gZ2V0VXR4b0NvaW4oJ3Rkb2dlJyk7XG5cbiAgICBjb25zdCBjb2luTW9jayA9IHNpbm9uLnN0dWIoYmlnaW50Q29pbiwgJ3BhcnNlVHJhbnNhY3Rpb24nKS5yZXNvbHZlcyh7XG4gICAgICBrZXljaGFpbnM6IHt9IGFzIGFueSxcbiAgICAgIGtleVNpZ25hdHVyZXM6IHt9LFxuICAgICAgb3V0cHV0czogW10sXG4gICAgICBtaXNzaW5nT3V0cHV0czogW10sXG4gICAgICBleHBsaWNpdEV4dGVybmFsT3V0cHV0czogW1xuICAgICAgICB7XG4gICAgICAgICAgYWRkcmVzczogJ2V4dGVybmFsX2FkZHJlc3MnLFxuICAgICAgICAgIGFtb3VudDogJzEwMDAwJyxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgICBpbXBsaWNpdEV4dGVybmFsT3V0cHV0czogW1xuICAgICAgICB7XG4gICAgICAgICAgYWRkcmVzczogJ2V4dGVybmFsX2FkZHJlc3NfMicsXG4gICAgICAgICAgYW1vdW50OiAnMTUnLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICAgIGNoYW5nZU91dHB1dHM6IFtdLFxuICAgICAgZXhwbGljaXRFeHRlcm5hbFNwZW5kQW1vdW50OiBCaWdJbnQoMTAwMDApLFxuICAgICAgaW1wbGljaXRFeHRlcm5hbFNwZW5kQW1vdW50OiBCaWdJbnQoMTUpLFxuICAgICAgbmVlZHNDdXN0b21DaGFuZ2VLZXlTaWduYXR1cmVWZXJpZmljYXRpb246IGZhbHNlLFxuICAgIH0pO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgYmlnaW50Q29pbi52ZXJpZnlUcmFuc2FjdGlvbih7XG4gICAgICB0eFBhcmFtczoge1xuICAgICAgICB3YWxsZXRQYXNzcGhyYXNlOiBwYXNzcGhyYXNlLFxuICAgICAgfSxcbiAgICAgIHR4UHJlYnVpbGQ6IHtcbiAgICAgICAgdHhIZXg6ICcwMCcsXG4gICAgICB9LFxuICAgICAgd2FsbGV0OiB1bnNpZ25lZFNlbmRpbmdXYWxsZXQgYXMgYW55LFxuICAgICAgdmVyaWZpY2F0aW9uOiB7fSxcbiAgICB9KTtcblxuICAgIGFzc2VydC5zdHJpY3RFcXVhbChyZXN1bHQsIHRydWUpO1xuXG4gICAgY29pbk1vY2sucmVzdG9yZSgpO1xuICB9KTtcbn0pO1xuIl19
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wallet.d.ts","sourceRoot":"","sources":["../../../../test/unit/wallet.ts"],"names":[],"mappings":""}
|