@bitgo-beta/sdk-core 8.2.1-beta.180 → 8.2.1-beta.1801
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/src/account-lib/baseCoin/baseTransaction.d.ts +0 -1
- package/dist/src/account-lib/baseCoin/baseTransaction.d.ts.map +1 -1
- package/dist/src/account-lib/baseCoin/baseTransactionBuilder.d.ts +3 -3
- package/dist/src/account-lib/baseCoin/baseTransactionBuilder.d.ts.map +1 -1
- package/dist/src/account-lib/baseCoin/baseTransactionBuilder.js +4 -3
- package/dist/src/account-lib/baseCoin/ed25519KeyPair.d.ts +1 -0
- package/dist/src/account-lib/baseCoin/ed25519KeyPair.d.ts.map +1 -1
- package/dist/src/account-lib/baseCoin/ed25519KeyPair.js +41 -29
- package/dist/src/account-lib/baseCoin/enum.d.ts +50 -5
- package/dist/src/account-lib/baseCoin/enum.d.ts.map +1 -1
- package/dist/src/account-lib/baseCoin/enum.js +90 -10
- package/dist/src/account-lib/baseCoin/errors.d.ts +3 -0
- package/dist/src/account-lib/baseCoin/errors.d.ts.map +1 -1
- package/dist/src/account-lib/baseCoin/errors.js +8 -2
- package/dist/src/account-lib/baseCoin/iface.d.ts +19 -35
- package/dist/src/account-lib/baseCoin/iface.d.ts.map +1 -1
- package/dist/src/account-lib/baseCoin/iface.js +26 -18
- package/dist/src/account-lib/baseCoin/index.d.ts +1 -1
- package/dist/src/account-lib/baseCoin/index.d.ts.map +1 -1
- package/dist/src/account-lib/baseCoin/index.js +8 -5
- package/dist/src/account-lib/baseCoin/messages/baseMessage.d.ts +88 -0
- package/dist/src/account-lib/baseCoin/messages/baseMessage.d.ts.map +1 -0
- package/dist/src/account-lib/baseCoin/messages/baseMessage.js +154 -0
- package/dist/src/account-lib/baseCoin/messages/baseMessageBuilder.d.ts +67 -0
- package/dist/src/account-lib/baseCoin/messages/baseMessageBuilder.d.ts.map +1 -0
- package/dist/src/account-lib/baseCoin/messages/baseMessageBuilder.js +144 -0
- package/dist/src/account-lib/baseCoin/messages/baseMessageBuilderFactory.d.ts +33 -0
- package/dist/src/account-lib/baseCoin/messages/baseMessageBuilderFactory.d.ts.map +1 -0
- package/dist/src/account-lib/baseCoin/messages/baseMessageBuilderFactory.js +45 -0
- package/dist/src/account-lib/baseCoin/messages/iface.d.ts +164 -0
- package/dist/src/account-lib/baseCoin/messages/iface.d.ts.map +1 -0
- package/dist/src/account-lib/baseCoin/messages/iface.js +3 -0
- package/dist/src/account-lib/baseCoin/messages/index.d.ts +6 -0
- package/dist/src/account-lib/baseCoin/messages/index.d.ts.map +1 -0
- package/dist/src/account-lib/baseCoin/messages/index.js +22 -0
- package/dist/src/account-lib/baseCoin/messages/simple/index.d.ts +3 -0
- package/dist/src/account-lib/baseCoin/messages/simple/index.d.ts.map +1 -0
- package/dist/src/account-lib/baseCoin/messages/simple/index.js +19 -0
- package/dist/src/account-lib/baseCoin/messages/simple/simpleMessage.d.ts +13 -0
- package/dist/src/account-lib/baseCoin/messages/simple/simpleMessage.d.ts.map +1 -0
- package/dist/src/account-lib/baseCoin/messages/simple/simpleMessage.js +28 -0
- package/dist/src/account-lib/baseCoin/messages/simple/simpleMessageBuilder.d.ts +21 -0
- package/dist/src/account-lib/baseCoin/messages/simple/simpleMessageBuilder.d.ts.map +1 -0
- package/dist/src/account-lib/baseCoin/messages/simple/simpleMessageBuilder.js +28 -0
- package/dist/src/account-lib/baseCoin/secp256k1ExtendedKeyPair.d.ts +1 -2
- package/dist/src/account-lib/baseCoin/secp256k1ExtendedKeyPair.d.ts.map +1 -1
- package/dist/src/account-lib/baseCoin/secp256k1ExtendedKeyPair.js +38 -26
- package/dist/src/account-lib/index.js +23 -9
- package/dist/src/account-lib/mpc/index.d.ts +1 -1
- package/dist/src/account-lib/mpc/index.d.ts.map +1 -1
- package/dist/src/account-lib/mpc/index.js +6 -2
- package/dist/src/account-lib/mpc/tss/ecdsa/ecdsa.d.ts +2 -3
- package/dist/src/account-lib/mpc/tss/ecdsa/ecdsa.d.ts.map +1 -1
- package/dist/src/account-lib/mpc/tss/ecdsa/ecdsa.js +376 -354
- package/dist/src/account-lib/mpc/tss/ecdsa/index.js +23 -9
- package/dist/src/account-lib/mpc/tss/ecdsa/rangeproof.d.ts +2 -2
- package/dist/src/account-lib/mpc/tss/ecdsa/rangeproof.d.ts.map +1 -1
- package/dist/src/account-lib/mpc/tss/ecdsa/rangeproof.js +3 -3
- package/dist/src/account-lib/mpc/tss/ecdsa/types.d.ts +46 -53
- package/dist/src/account-lib/mpc/tss/ecdsa/types.d.ts.map +1 -1
- package/dist/src/account-lib/mpc/tss/ecdsa/types.js +1 -1
- package/dist/src/account-lib/mpc/tss/eddsa/eddsa.d.ts +0 -1
- package/dist/src/account-lib/mpc/tss/eddsa/eddsa.d.ts.map +1 -1
- package/dist/src/account-lib/mpc/tss/eddsa/eddsa.js +66 -69
- package/dist/src/account-lib/mpc/tss/eddsa/index.js +23 -9
- package/dist/src/account-lib/mpc/tss/eddsa/types.d.ts +1 -1
- package/dist/src/account-lib/mpc/tss/eddsa/types.d.ts.map +1 -1
- package/dist/src/account-lib/mpc/tss/eddsa/types.js +1 -1
- package/dist/src/account-lib/mpc/tss/index.js +23 -9
- package/dist/src/account-lib/mpc/util.d.ts +7 -1
- package/dist/src/account-lib/mpc/util.d.ts.map +1 -1
- package/dist/src/account-lib/mpc/util.js +24 -1
- package/dist/src/account-lib/staking/index.js +6 -2
- package/dist/src/account-lib/staking/utils.js +3 -3
- package/dist/src/account-lib/util/crypto.d.ts +8 -2
- package/dist/src/account-lib/util/crypto.d.ts.map +1 -1
- package/dist/src/account-lib/util/crypto.js +69 -38
- package/dist/src/account-lib/util/ed25519KeyDeriver.d.ts +2 -1
- package/dist/src/account-lib/util/ed25519KeyDeriver.d.ts.map +1 -1
- package/dist/src/account-lib/util/ed25519KeyDeriver.js +5 -3
- package/dist/src/api/bip32path.js +2 -3
- package/dist/src/api/index.js +6 -2
- package/dist/src/api/types.d.ts +30 -0
- package/dist/src/api/types.d.ts.map +1 -1
- package/dist/src/api/types.js +1 -1
- package/dist/src/bitgo/address-book/address-book.d.ts +61 -0
- package/dist/src/bitgo/address-book/address-book.d.ts.map +1 -0
- package/dist/src/bitgo/address-book/address-book.js +139 -0
- package/dist/src/bitgo/address-book/index.d.ts +3 -0
- package/dist/src/bitgo/address-book/index.d.ts.map +1 -0
- package/dist/src/bitgo/address-book/index.js +19 -0
- package/dist/src/bitgo/address-book/types.d.ts +170 -0
- package/dist/src/bitgo/address-book/types.d.ts.map +1 -0
- package/dist/src/bitgo/address-book/types.js +3 -0
- package/dist/src/bitgo/baseCoin/baseCoin.d.ts +99 -11
- package/dist/src/bitgo/baseCoin/baseCoin.d.ts.map +1 -1
- package/dist/src/bitgo/baseCoin/baseCoin.js +168 -16
- package/dist/src/bitgo/baseCoin/iBaseCoin.d.ts +192 -28
- package/dist/src/bitgo/baseCoin/iBaseCoin.d.ts.map +1 -1
- package/dist/src/bitgo/baseCoin/iBaseCoin.js +14 -3
- package/dist/src/bitgo/baseCoin/index.js +6 -2
- package/dist/src/bitgo/bip32util.d.ts +3 -16
- package/dist/src/bitgo/bip32util.d.ts.map +1 -1
- package/dist/src/bitgo/bip32util.js +4 -56
- package/dist/src/bitgo/bitcoin.d.ts +0 -1
- package/dist/src/bitgo/bitcoin.d.ts.map +1 -1
- package/dist/src/bitgo/bitcoin.js +26 -13
- package/dist/src/bitgo/bitgoBase.d.ts +8 -1
- package/dist/src/bitgo/bitgoBase.d.ts.map +1 -1
- package/dist/src/bitgo/bitgoBase.js +1 -1
- package/dist/src/bitgo/coinFactory.d.ts +17 -3
- package/dist/src/bitgo/coinFactory.d.ts.map +1 -1
- package/dist/src/bitgo/coinFactory.js +26 -3
- package/dist/src/bitgo/config.d.ts +3 -95
- package/dist/src/bitgo/config.d.ts.map +1 -1
- package/dist/src/bitgo/config.js +26 -15
- package/dist/src/bitgo/ecdh.d.ts +0 -1
- package/dist/src/bitgo/ecdh.d.ts.map +1 -1
- package/dist/src/bitgo/ecdh.js +26 -13
- package/dist/src/bitgo/enterprise/enterprise.d.ts +3 -4
- package/dist/src/bitgo/enterprise/enterprise.d.ts.map +1 -1
- package/dist/src/bitgo/enterprise/enterprise.js +39 -21
- package/dist/src/bitgo/enterprise/enterprises.js +27 -13
- package/dist/src/bitgo/enterprise/iEnterprise.d.ts +2 -3
- package/dist/src/bitgo/enterprise/iEnterprise.d.ts.map +1 -1
- package/dist/src/bitgo/enterprise/iEnterprise.js +1 -1
- package/dist/src/bitgo/enterprise/index.js +6 -2
- package/dist/src/bitgo/environments.d.ts +69 -5
- package/dist/src/bitgo/environments.d.ts.map +1 -1
- package/dist/src/bitgo/environments.js +403 -40
- package/dist/src/bitgo/errors.d.ts +175 -0
- package/dist/src/bitgo/errors.d.ts.map +1 -1
- package/dist/src/bitgo/errors.js +166 -2
- package/dist/src/bitgo/evm/evmUtils.d.ts +26 -0
- package/dist/src/bitgo/evm/evmUtils.d.ts.map +1 -0
- package/dist/src/bitgo/evm/evmUtils.js +50 -0
- package/dist/src/bitgo/index.d.ts +3 -1
- package/dist/src/bitgo/index.d.ts.map +1 -1
- package/dist/src/bitgo/index.js +29 -11
- package/dist/src/bitgo/inscriptionBuilder/iInscriptionBuilder.d.ts +3 -3
- package/dist/src/bitgo/inscriptionBuilder/iInscriptionBuilder.d.ts.map +1 -1
- package/dist/src/bitgo/inscriptionBuilder/iInscriptionBuilder.js +1 -1
- package/dist/src/bitgo/inscriptionBuilder/index.js +6 -2
- package/dist/src/bitgo/internal/index.js +6 -2
- package/dist/src/bitgo/internal/internal.js +5 -6
- package/dist/src/bitgo/internal/keycard.d.ts +18 -6
- package/dist/src/bitgo/internal/keycard.d.ts.map +1 -1
- package/dist/src/bitgo/internal/keycard.js +102 -44
- package/dist/src/bitgo/keychain/decryptKeychain.d.ts +24 -0
- package/dist/src/bitgo/keychain/decryptKeychain.d.ts.map +1 -0
- package/dist/src/bitgo/keychain/decryptKeychain.js +67 -0
- package/dist/src/bitgo/keychain/iKeychains.d.ts +93 -8
- package/dist/src/bitgo/keychain/iKeychains.d.ts.map +1 -1
- package/dist/src/bitgo/keychain/iKeychains.js +2 -2
- package/dist/src/bitgo/keychain/index.d.ts +1 -0
- package/dist/src/bitgo/keychain/index.d.ts.map +1 -1
- package/dist/src/bitgo/keychain/index.js +7 -2
- package/dist/src/bitgo/keychain/keychains.d.ts +48 -6
- package/dist/src/bitgo/keychain/keychains.d.ts.map +1 -1
- package/dist/src/bitgo/keychain/keychains.js +244 -46
- package/dist/src/bitgo/keychain/ovcJsonCodec.d.ts +3 -3
- package/dist/src/bitgo/keychain/ovcJsonCodec.d.ts.map +1 -1
- package/dist/src/bitgo/keychain/ovcJsonCodec.js +23 -9
- package/dist/src/bitgo/legacyBitcoin.d.ts +0 -1
- package/dist/src/bitgo/legacyBitcoin.d.ts.map +1 -1
- package/dist/src/bitgo/legacyBitcoin.js +27 -13
- package/dist/src/bitgo/lightning/lightningWalletUtil.d.ts +7 -0
- package/dist/src/bitgo/lightning/lightningWalletUtil.d.ts.map +1 -0
- package/dist/src/bitgo/lightning/lightningWalletUtil.js +25 -0
- package/dist/src/bitgo/market/iMarkets.d.ts +2 -2
- package/dist/src/bitgo/market/iMarkets.d.ts.map +1 -1
- package/dist/src/bitgo/market/index.js +6 -2
- package/dist/src/bitgo/market/markets.js +23 -9
- package/dist/src/bitgo/pendingApproval/iPendingApproval.d.ts +1 -0
- package/dist/src/bitgo/pendingApproval/iPendingApproval.d.ts.map +1 -1
- package/dist/src/bitgo/pendingApproval/iPendingApproval.js +4 -4
- package/dist/src/bitgo/pendingApproval/index.js +6 -2
- package/dist/src/bitgo/pendingApproval/pendingApproval.d.ts +20 -8
- package/dist/src/bitgo/pendingApproval/pendingApproval.d.ts.map +1 -1
- package/dist/src/bitgo/pendingApproval/pendingApproval.js +228 -110
- package/dist/src/bitgo/pendingApproval/pendingApprovals.js +23 -9
- package/dist/src/bitgo/proofs/WalletProofs.d.ts +19 -0
- package/dist/src/bitgo/proofs/WalletProofs.d.ts.map +1 -0
- package/dist/src/bitgo/proofs/WalletProofs.js +37 -0
- package/dist/src/bitgo/proofs/index.d.ts +2 -0
- package/dist/src/bitgo/proofs/index.d.ts.map +1 -0
- package/dist/src/bitgo/proofs/index.js +6 -0
- package/dist/src/bitgo/proofs/types.d.ts +80 -0
- package/dist/src/bitgo/proofs/types.d.ts.map +1 -0
- package/dist/src/bitgo/proofs/types.js +80 -0
- package/dist/src/bitgo/recovery/index.js +6 -2
- package/dist/src/bitgo/recovery/initiate.d.ts +24 -1
- package/dist/src/bitgo/recovery/initiate.d.ts.map +1 -1
- package/dist/src/bitgo/recovery/initiate.js +88 -40
- package/dist/src/bitgo/staking/goStakingInterfaces.d.ts +132 -0
- package/dist/src/bitgo/staking/goStakingInterfaces.d.ts.map +1 -0
- package/dist/src/bitgo/staking/goStakingInterfaces.js +3 -0
- package/dist/src/bitgo/staking/goStakingWallet.d.ts +62 -0
- package/dist/src/bitgo/staking/goStakingWallet.d.ts.map +1 -0
- package/dist/src/bitgo/staking/goStakingWallet.js +141 -0
- package/dist/src/bitgo/staking/iGoStakingWallet.d.ts +17 -0
- package/dist/src/bitgo/staking/iGoStakingWallet.d.ts.map +1 -0
- package/dist/src/bitgo/staking/iGoStakingWallet.js +3 -0
- package/dist/src/bitgo/staking/iStakingWallet.d.ts +173 -7
- package/dist/src/bitgo/staking/iStakingWallet.d.ts.map +1 -1
- package/dist/src/bitgo/staking/iStakingWallet.js +2 -2
- package/dist/src/bitgo/staking/index.d.ts +3 -0
- package/dist/src/bitgo/staking/index.d.ts.map +1 -1
- package/dist/src/bitgo/staking/index.js +9 -2
- package/dist/src/bitgo/staking/stakingWallet.d.ts +21 -8
- package/dist/src/bitgo/staking/stakingWallet.d.ts.map +1 -1
- package/dist/src/bitgo/staking/stakingWallet.js +140 -7
- package/dist/src/bitgo/trading/iTradingAccount.d.ts +15 -1
- package/dist/src/bitgo/trading/iTradingAccount.d.ts.map +1 -1
- package/dist/src/bitgo/trading/iTradingAccount.js +1 -1
- package/dist/src/bitgo/trading/index.d.ts +1 -0
- package/dist/src/bitgo/trading/index.d.ts.map +1 -1
- package/dist/src/bitgo/trading/index.js +7 -2
- package/dist/src/bitgo/trading/network/decrypt-aes-gcm.d.ts +8 -0
- package/dist/src/bitgo/trading/network/decrypt-aes-gcm.d.ts.map +1 -0
- package/dist/src/bitgo/trading/network/decrypt-aes-gcm.js +31 -0
- package/dist/src/bitgo/trading/network/decrypt-rsa.d.ts +8 -0
- package/dist/src/bitgo/trading/network/decrypt-rsa.d.ts.map +1 -0
- package/dist/src/bitgo/trading/network/decrypt-rsa.js +23 -0
- package/dist/src/bitgo/trading/network/decrypt.d.ts +14 -0
- package/dist/src/bitgo/trading/network/decrypt.d.ts.map +1 -0
- package/dist/src/bitgo/trading/network/decrypt.js +23 -0
- package/dist/src/bitgo/trading/network/encrypt-aes-gcm.d.ts +8 -0
- package/dist/src/bitgo/trading/network/encrypt-aes-gcm.d.ts.map +1 -0
- package/dist/src/bitgo/trading/network/encrypt-aes-gcm.js +25 -0
- package/dist/src/bitgo/trading/network/encrypt-rsa-browser.d.ts +8 -0
- package/dist/src/bitgo/trading/network/encrypt-rsa-browser.d.ts.map +1 -0
- package/dist/src/bitgo/trading/network/encrypt-rsa-browser.js +65 -0
- package/dist/src/bitgo/trading/network/encrypt-rsa.d.ts +8 -0
- package/dist/src/bitgo/trading/network/encrypt-rsa.d.ts.map +1 -0
- package/dist/src/bitgo/trading/network/encrypt-rsa.js +23 -0
- package/dist/src/bitgo/trading/network/encrypt.d.ts +37 -0
- package/dist/src/bitgo/trading/network/encrypt.d.ts.map +1 -0
- package/dist/src/bitgo/trading/network/encrypt.js +58 -0
- package/dist/src/bitgo/trading/network/index.d.ts +5 -0
- package/dist/src/bitgo/trading/network/index.d.ts.map +1 -0
- package/dist/src/bitgo/trading/network/index.js +21 -0
- package/dist/src/bitgo/trading/network/network.d.ts +36 -0
- package/dist/src/bitgo/trading/network/network.d.ts.map +1 -0
- package/dist/src/bitgo/trading/network/network.js +99 -0
- package/dist/src/bitgo/trading/network/types.d.ts +277 -0
- package/dist/src/bitgo/trading/network/types.d.ts.map +1 -0
- package/dist/src/bitgo/trading/network/types.js +3 -0
- package/dist/src/bitgo/trading/network/utils.d.ts +20 -0
- package/dist/src/bitgo/trading/network/utils.d.ts.map +1 -0
- package/dist/src/bitgo/trading/network/utils.js +54 -0
- package/dist/src/bitgo/trading/tradingAccount.d.ts +22 -1
- package/dist/src/bitgo/trading/tradingAccount.d.ts.map +1 -1
- package/dist/src/bitgo/trading/tradingAccount.js +64 -7
- package/dist/src/bitgo/tss/bitgoPubKeys.d.ts +38 -0
- package/dist/src/bitgo/tss/bitgoPubKeys.d.ts.map +1 -0
- package/dist/src/bitgo/tss/bitgoPubKeys.js +72 -0
- package/dist/src/bitgo/tss/common.d.ts +39 -6
- package/dist/src/bitgo/tss/common.d.ts.map +1 -1
- package/dist/src/bitgo/tss/common.js +112 -17
- package/dist/src/bitgo/tss/ecdsa/ecdsa.d.ts +6 -4
- package/dist/src/bitgo/tss/ecdsa/ecdsa.d.ts.map +1 -1
- package/dist/src/bitgo/tss/ecdsa/ecdsa.js +78 -66
- package/dist/src/bitgo/tss/ecdsa/ecdsaMPCv2.d.ts +15 -0
- package/dist/src/bitgo/tss/ecdsa/ecdsaMPCv2.d.ts.map +1 -0
- package/dist/src/bitgo/tss/ecdsa/ecdsaMPCv2.js +167 -0
- package/dist/src/bitgo/tss/ecdsa/index.d.ts +1 -0
- package/dist/src/bitgo/tss/ecdsa/index.d.ts.map +1 -1
- package/dist/src/bitgo/tss/ecdsa/index.js +25 -10
- package/dist/src/bitgo/tss/ecdsa/types.d.ts +27 -27
- package/dist/src/bitgo/tss/ecdsa/types.d.ts.map +1 -1
- package/dist/src/bitgo/tss/ecdsa/types.js +3 -3
- package/dist/src/bitgo/tss/eddsa/eddsa.d.ts +15 -6
- package/dist/src/bitgo/tss/eddsa/eddsa.d.ts.map +1 -1
- package/dist/src/bitgo/tss/eddsa/eddsa.js +47 -40
- package/dist/src/bitgo/tss/eddsa/eddsaMPCv2.d.ts +37 -0
- package/dist/src/bitgo/tss/eddsa/eddsaMPCv2.d.ts.map +1 -0
- package/dist/src/bitgo/tss/eddsa/eddsaMPCv2.js +95 -0
- package/dist/src/bitgo/tss/eddsa/index.js +23 -9
- package/dist/src/bitgo/tss/eddsa/types.d.ts +4 -4
- package/dist/src/bitgo/tss/eddsa/types.d.ts.map +1 -1
- package/dist/src/bitgo/tss/index.d.ts +3 -2
- package/dist/src/bitgo/tss/index.d.ts.map +1 -1
- package/dist/src/bitgo/tss/index.js +26 -10
- package/dist/src/bitgo/tss/types.d.ts +3 -3
- package/dist/src/bitgo/tss/types.d.ts.map +1 -1
- package/dist/src/bitgo/tss/types.js +2 -2
- package/dist/src/bitgo/types.d.ts +3 -3
- package/dist/src/bitgo/types.d.ts.map +1 -1
- package/dist/src/bitgo/utils/abstractUtxoCoinUtil.d.ts +8 -0
- package/dist/src/bitgo/utils/abstractUtxoCoinUtil.d.ts.map +1 -1
- package/dist/src/bitgo/utils/abstractUtxoCoinUtil.js +55 -13
- package/dist/src/bitgo/utils/codecProps.js +24 -11
- package/dist/src/bitgo/utils/codecs.d.ts +11 -0
- package/dist/src/bitgo/utils/codecs.d.ts.map +1 -0
- package/dist/src/bitgo/utils/codecs.js +59 -0
- package/dist/src/bitgo/utils/decode.d.ts.map +1 -1
- package/dist/src/bitgo/utils/decode.js +30 -16
- package/dist/src/bitgo/utils/index.d.ts +4 -2
- package/dist/src/bitgo/utils/index.d.ts.map +1 -1
- package/dist/src/bitgo/utils/index.js +27 -11
- package/dist/src/bitgo/utils/messageTypes.d.ts +38 -0
- package/dist/src/bitgo/utils/messageTypes.d.ts.map +1 -0
- package/dist/src/bitgo/utils/messageTypes.js +15 -0
- package/dist/src/bitgo/utils/mpcUtils.d.ts +4 -4
- package/dist/src/bitgo/utils/mpcUtils.d.ts.map +1 -1
- package/dist/src/bitgo/utils/mpcUtils.js +109 -14
- package/dist/src/bitgo/utils/notEmpty.d.ts +2 -0
- package/dist/src/bitgo/utils/notEmpty.d.ts.map +1 -0
- package/dist/src/bitgo/utils/notEmpty.js +7 -0
- package/dist/src/bitgo/utils/opengpgUtils.d.ts +12 -9
- package/dist/src/bitgo/utils/opengpgUtils.d.ts.map +1 -1
- package/dist/src/bitgo/utils/opengpgUtils.js +77 -64
- package/dist/src/bitgo/utils/postWithCodec.d.ts.map +1 -1
- package/dist/src/bitgo/utils/postWithCodec.js +4 -38
- package/dist/src/bitgo/utils/promise-utils.d.ts +1 -1
- package/dist/src/bitgo/utils/promise-utils.d.ts.map +1 -1
- package/dist/src/bitgo/utils/promise-utils.js +2 -3
- package/dist/src/bitgo/utils/transactionUtils.d.ts +9 -0
- package/dist/src/bitgo/utils/transactionUtils.d.ts.map +1 -0
- package/dist/src/bitgo/utils/transactionUtils.js +29 -0
- package/dist/src/bitgo/utils/triple.d.ts +1 -1
- package/dist/src/bitgo/utils/triple.d.ts.map +1 -1
- package/dist/src/bitgo/utils/triple.js +2 -3
- package/dist/src/bitgo/utils/tss/addressVerification.d.ts +37 -0
- package/dist/src/bitgo/utils/tss/addressVerification.d.ts.map +1 -0
- package/dist/src/bitgo/utils/tss/addressVerification.js +82 -0
- package/dist/src/bitgo/utils/tss/baseTSSUtils.d.ts +90 -17
- package/dist/src/bitgo/utils/tss/baseTSSUtils.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/baseTSSUtils.js +278 -45
- package/dist/src/bitgo/utils/tss/baseTypes.d.ts +367 -44
- package/dist/src/bitgo/utils/tss/baseTypes.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/baseTypes.js +47 -22
- package/dist/src/bitgo/utils/tss/ecdsa/SMC/utils.d.ts +23 -0
- package/dist/src/bitgo/utils/tss/ecdsa/SMC/utils.d.ts.map +1 -0
- package/dist/src/bitgo/utils/tss/ecdsa/SMC/utils.js +157 -0
- package/dist/src/bitgo/utils/tss/ecdsa/base.d.ts +28 -0
- package/dist/src/bitgo/utils/tss/ecdsa/base.d.ts.map +1 -0
- package/dist/src/bitgo/utils/tss/ecdsa/base.js +53 -0
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsa.d.ts +21 -51
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsa.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsa.js +162 -246
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2.d.ts +203 -0
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2.d.ts.map +1 -0
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2.js +1075 -0
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2KeyGenSender.d.ts +8 -0
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2KeyGenSender.d.ts.map +1 -0
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2KeyGenSender.js +13 -0
- package/dist/src/bitgo/utils/tss/ecdsa/index.d.ts +4 -0
- package/dist/src/bitgo/utils/tss/ecdsa/index.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/ecdsa/index.js +10 -2
- package/dist/src/bitgo/utils/tss/ecdsa/types.d.ts +7 -10
- package/dist/src/bitgo/utils/tss/ecdsa/types.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/ecdsa/types.js +1 -1
- package/dist/src/bitgo/utils/tss/ecdsa/typesMPCv2.d.ts +107 -0
- package/dist/src/bitgo/utils/tss/ecdsa/typesMPCv2.d.ts.map +1 -0
- package/dist/src/bitgo/utils/tss/ecdsa/typesMPCv2.js +55 -0
- package/dist/src/bitgo/utils/tss/eddsa/SMC/utils.d.ts +21 -0
- package/dist/src/bitgo/utils/tss/eddsa/SMC/utils.d.ts.map +1 -0
- package/dist/src/bitgo/utils/tss/eddsa/SMC/utils.js +118 -0
- package/dist/src/bitgo/utils/tss/eddsa/base.d.ts +18 -0
- package/dist/src/bitgo/utils/tss/eddsa/base.d.ts.map +1 -0
- package/dist/src/bitgo/utils/tss/eddsa/base.js +64 -0
- package/dist/src/bitgo/utils/tss/eddsa/eddsa.d.ts +28 -11
- package/dist/src/bitgo/utils/tss/eddsa/eddsa.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/eddsa/eddsa.js +208 -103
- package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2.d.ts +88 -0
- package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2.d.ts.map +1 -0
- package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2.js +565 -0
- package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2KeyGenSender.d.ts +6 -0
- package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2KeyGenSender.d.ts.map +1 -0
- package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2KeyGenSender.js +13 -0
- package/dist/src/bitgo/utils/tss/eddsa/index.d.ts +4 -0
- package/dist/src/bitgo/utils/tss/eddsa/index.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/eddsa/index.js +29 -8
- package/dist/src/bitgo/utils/tss/eddsa/types.d.ts +7 -7
- package/dist/src/bitgo/utils/tss/eddsa/types.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/eddsa/typesEddsaMPCv2.d.ts +40 -0
- package/dist/src/bitgo/utils/tss/eddsa/typesEddsaMPCv2.d.ts.map +1 -0
- package/dist/src/bitgo/utils/tss/eddsa/typesEddsaMPCv2.js +44 -0
- package/dist/src/bitgo/utils/tss/index.d.ts +1 -0
- package/dist/src/bitgo/utils/tss/index.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/index.js +24 -9
- package/dist/src/bitgo/utils/txRequest.d.ts +10 -0
- package/dist/src/bitgo/utils/txRequest.d.ts.map +1 -0
- package/dist/src/bitgo/utils/txRequest.js +49 -0
- package/dist/src/bitgo/utils/util.js +24 -10
- package/dist/src/bitgo/utils/wallet.d.ts +7 -0
- package/dist/src/bitgo/utils/wallet.d.ts.map +1 -0
- package/dist/src/bitgo/utils/wallet.js +48 -0
- package/dist/src/bitgo/wallet/BuildParams.d.ts +50 -1
- package/dist/src/bitgo/wallet/BuildParams.d.ts.map +1 -1
- package/dist/src/bitgo/wallet/BuildParams.js +58 -11
- package/dist/src/bitgo/wallet/iWallet.d.ts +474 -21
- package/dist/src/bitgo/wallet/iWallet.d.ts.map +1 -1
- package/dist/src/bitgo/wallet/iWallet.js +1 -1
- package/dist/src/bitgo/wallet/iWallets.d.ts +145 -19
- package/dist/src/bitgo/wallet/iWallets.d.ts.map +1 -1
- package/dist/src/bitgo/wallet/iWallets.js +63 -3
- package/dist/src/bitgo/wallet/index.js +6 -2
- package/dist/src/bitgo/wallet/wallet.d.ts +363 -24
- package/dist/src/bitgo/wallet/wallet.d.ts.map +1 -1
- package/dist/src/bitgo/wallet/wallet.js +1957 -415
- package/dist/src/bitgo/wallet/wallets.d.ts +100 -9
- package/dist/src/bitgo/wallet/wallets.d.ts.map +1 -1
- package/dist/src/bitgo/wallet/wallets.js +1043 -206
- package/dist/src/bitgo/walletUtil/iMessageProvider.d.ts +12 -0
- package/dist/src/bitgo/walletUtil/iMessageProvider.d.ts.map +1 -0
- package/dist/src/bitgo/walletUtil/iMessageProvider.js +3 -0
- package/dist/src/bitgo/walletUtil/index.d.ts +3 -0
- package/dist/src/bitgo/walletUtil/index.d.ts.map +1 -0
- package/dist/src/bitgo/walletUtil/index.js +19 -0
- package/dist/src/bitgo/walletUtil/midnightMessageProvider.d.ts +22 -0
- package/dist/src/bitgo/walletUtil/midnightMessageProvider.d.ts.map +1 -0
- package/dist/src/bitgo/walletUtil/midnightMessageProvider.js +95 -0
- package/dist/src/bitgo/walletUtil/signAccountBasedMidnightClaimMessages.d.ts +9 -0
- package/dist/src/bitgo/walletUtil/signAccountBasedMidnightClaimMessages.d.ts.map +1 -0
- package/dist/src/bitgo/walletUtil/signAccountBasedMidnightClaimMessages.js +72 -0
- package/dist/src/bitgo/walletUtil/utxoMessageProof.d.ts +15 -0
- package/dist/src/bitgo/walletUtil/utxoMessageProof.d.ts.map +1 -0
- package/dist/src/bitgo/walletUtil/utxoMessageProof.js +40 -0
- package/dist/src/bitgo/webhook/index.js +6 -2
- package/dist/src/bitgo/webhook/webhooks.js +23 -9
- package/dist/src/coins/fiat.d.ts +45 -0
- package/dist/src/coins/fiat.d.ts.map +1 -0
- package/dist/src/coins/fiat.js +94 -0
- package/dist/src/coins/index.d.ts +1 -6
- package/dist/src/coins/index.d.ts.map +1 -1
- package/dist/src/coins/index.js +7 -8
- package/dist/src/coins/ofc.d.ts +17 -2
- package/dist/src/coins/ofc.d.ts.map +1 -1
- package/dist/src/coins/ofc.js +13 -2
- package/dist/src/coins/ofcToken.d.ts +15 -4
- package/dist/src/coins/ofcToken.d.ts.map +1 -1
- package/dist/src/coins/ofcToken.js +43 -5
- package/dist/src/coins/susd.d.ts +3 -2
- package/dist/src/coins/susd.d.ts.map +1 -1
- package/dist/src/coins/susd.js +5 -1
- package/dist/src/common.js +27 -13
- package/dist/src/index.d.ts +6 -1
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +32 -11
- package/dist/src/lightning.d.ts +20 -0
- package/dist/src/lightning.d.ts.map +1 -0
- package/dist/src/lightning.js +13 -0
- package/dist/src/units.js +5 -6
- package/dist/test/unit/account-lib/baseCoin/messages/baseMessage.d.ts +2 -0
- package/dist/test/unit/account-lib/baseCoin/messages/baseMessage.d.ts.map +1 -0
- package/dist/test/unit/account-lib/baseCoin/messages/baseMessage.js +207 -0
- package/dist/test/unit/account-lib/baseCoin/messages/baseMessageBuilder.d.ts +2 -0
- package/dist/test/unit/account-lib/baseCoin/messages/baseMessageBuilder.d.ts.map +1 -0
- package/dist/test/unit/account-lib/baseCoin/messages/baseMessageBuilder.js +174 -0
- package/dist/test/unit/account-lib/baseCoin/messages/baseMessageBuilderFactory.d.ts +2 -0
- package/dist/test/unit/account-lib/baseCoin/messages/baseMessageBuilderFactory.d.ts.map +1 -0
- package/dist/test/unit/account-lib/baseCoin/messages/baseMessageBuilderFactory.js +108 -0
- package/dist/test/unit/account-lib/baseCoin/messages/fixtures.d.ts +46 -0
- package/dist/test/unit/account-lib/baseCoin/messages/fixtures.d.ts.map +1 -0
- package/dist/test/unit/account-lib/baseCoin/messages/fixtures.js +69 -0
- package/dist/test/unit/account-lib/mpc/tss/ecdsa/ecdsa.js +91 -29
- package/dist/test/unit/account-lib/mpc/util.d.ts +2 -0
- package/dist/test/unit/account-lib/mpc/util.d.ts.map +1 -0
- package/dist/test/unit/account-lib/mpc/util.js +53 -0
- package/dist/test/unit/bitgo/environment.d.ts +2 -0
- package/dist/test/unit/bitgo/environment.d.ts.map +1 -0
- package/dist/test/unit/bitgo/environment.js +38 -0
- package/dist/test/unit/bitgo/errors.d.ts +2 -0
- package/dist/test/unit/bitgo/errors.d.ts.map +1 -0
- package/dist/test/unit/bitgo/errors.js +262 -0
- package/dist/test/unit/bitgo/recovery/initiate.d.ts +2 -0
- package/dist/test/unit/bitgo/recovery/initiate.d.ts.map +1 -0
- package/dist/test/unit/bitgo/recovery/initiate.js +230 -0
- package/dist/test/unit/bitgo/trading/network/encrypt.d.ts +2 -0
- package/dist/test/unit/bitgo/trading/network/encrypt.d.ts.map +1 -0
- package/dist/test/unit/bitgo/trading/network/encrypt.js +71 -0
- package/dist/test/unit/bitgo/trading/tradingAccount.d.ts +2 -0
- package/dist/test/unit/bitgo/trading/tradingAccount.d.ts.map +1 -0
- package/dist/test/unit/bitgo/trading/tradingAccount.js +192 -0
- package/dist/test/unit/bitgo/utils/abstractUtxoCoinUtil.js +24 -4
- package/dist/test/unit/bitgo/utils/messageTypes.d.ts +2 -0
- package/dist/test/unit/bitgo/utils/messageTypes.d.ts.map +1 -0
- package/dist/test/unit/bitgo/utils/messageTypes.js +64 -0
- package/dist/test/unit/bitgo/utils/notEmpty.d.ts +2 -0
- package/dist/test/unit/bitgo/utils/notEmpty.d.ts.map +1 -0
- package/dist/test/unit/bitgo/utils/notEmpty.js +15 -0
- package/dist/test/unit/bitgo/utils/postWithCodec.js +32 -38
- package/dist/test/unit/bitgo/utils/tss/addressVerification.d.ts +2 -0
- package/dist/test/unit/bitgo/utils/tss/addressVerification.d.ts.map +1 -0
- package/dist/test/unit/bitgo/utils/tss/addressVerification.js +203 -0
- package/dist/test/unit/bitgo/utils/tss/baseTSSUtils.d.ts +2 -0
- package/dist/test/unit/bitgo/utils/tss/baseTSSUtils.d.ts.map +1 -0
- package/dist/test/unit/bitgo/utils/tss/baseTSSUtils.js +316 -0
- package/dist/test/unit/bitgo/utils/tss/ecdsa/ecdsaMPCv2.d.ts +2 -0
- package/dist/test/unit/bitgo/utils/tss/ecdsa/ecdsaMPCv2.d.ts.map +1 -0
- package/dist/test/unit/bitgo/utils/tss/ecdsa/ecdsaMPCv2.js +826 -0
- package/dist/test/unit/bitgo/utils/tss/ecdsa/gpgKeys.d.ts +5 -0
- package/dist/test/unit/bitgo/utils/tss/ecdsa/gpgKeys.d.ts.map +1 -0
- package/dist/test/unit/bitgo/utils/tss/ecdsa/gpgKeys.js +36 -0
- package/dist/test/unit/bitgo/utils/tss/eddsa/eddsaMPCv2.d.ts +2 -0
- package/dist/test/unit/bitgo/utils/tss/eddsa/eddsaMPCv2.d.ts.map +1 -0
- package/dist/test/unit/bitgo/utils/tss/eddsa/eddsaMPCv2.js +1185 -0
- package/dist/test/unit/bitgo/utils/tss/eddsa/smcUtil.d.ts +2 -0
- package/dist/test/unit/bitgo/utils/tss/eddsa/smcUtil.d.ts.map +1 -0
- package/dist/test/unit/bitgo/utils/tss/eddsa/smcUtil.js +311 -0
- package/dist/test/unit/bitgo/utils/txRequest.d.ts +2 -0
- package/dist/test/unit/bitgo/utils/txRequest.d.ts.map +1 -0
- package/dist/test/unit/bitgo/utils/txRequest.js +179 -0
- package/dist/test/unit/bitgo/wallet/BuildParams.d.ts +2 -0
- package/dist/test/unit/bitgo/wallet/BuildParams.d.ts.map +1 -0
- package/dist/test/unit/bitgo/wallet/BuildParams.js +97 -0
- package/dist/test/unit/bitgo/wallet/SendTransactionRequest.js +23 -9
- package/dist/test/unit/bitgo/wallet/getAccountResources.d.ts +2 -0
- package/dist/test/unit/bitgo/wallet/getAccountResources.d.ts.map +1 -0
- package/dist/test/unit/bitgo/wallet/getAccountResources.js +133 -0
- package/dist/test/unit/bitgo/wallet/getResourceDelegations.d.ts +2 -0
- package/dist/test/unit/bitgo/wallet/getResourceDelegations.d.ts.map +1 -0
- package/dist/test/unit/bitgo/wallet/getResourceDelegations.js +118 -0
- package/dist/test/unit/bitgo/wallet/ofcWalletSignTransaction.d.ts +2 -0
- package/dist/test/unit/bitgo/wallet/ofcWalletSignTransaction.d.ts.map +1 -0
- package/dist/test/unit/bitgo/wallet/ofcWalletSignTransaction.js +185 -0
- package/dist/test/unit/bitgo/wallet/resourceManagement.d.ts +3 -0
- package/dist/test/unit/bitgo/wallet/resourceManagement.d.ts.map +1 -0
- package/dist/test/unit/bitgo/wallet/resourceManagement.js +441 -0
- package/dist/test/unit/bitgo/wallet/tokenApproval.d.ts +2 -0
- package/dist/test/unit/bitgo/wallet/tokenApproval.d.ts.map +1 -0
- package/dist/test/unit/bitgo/wallet/tokenApproval.js +135 -0
- package/dist/test/unit/bitgo/wallet/walletEvmAddressCreation.d.ts +2 -0
- package/dist/test/unit/bitgo/wallet/walletEvmAddressCreation.d.ts.map +1 -0
- package/dist/test/unit/bitgo/wallet/walletEvmAddressCreation.js +181 -0
- package/dist/test/unit/bitgo/wallet/walletOptionsCodecs.d.ts +2 -0
- package/dist/test/unit/bitgo/wallet/walletOptionsCodecs.d.ts.map +1 -0
- package/dist/test/unit/bitgo/wallet/walletOptionsCodecs.js +43 -0
- package/dist/test/unit/bitgo/wallet/walletTssAddressVerification.d.ts +2 -0
- package/dist/test/unit/bitgo/wallet/walletTssAddressVerification.d.ts.map +1 -0
- package/dist/test/unit/bitgo/wallet/walletTssAddressVerification.js +320 -0
- package/dist/test/unit/bitgo/wallet/walletsEvmKeyring.d.ts +2 -0
- package/dist/test/unit/bitgo/wallet/walletsEvmKeyring.d.ts.map +1 -0
- package/dist/test/unit/bitgo/wallet/walletsEvmKeyring.js +216 -0
- package/dist/test/unit/bitgo/wallet/walletsWebauthn.d.ts +2 -0
- package/dist/test/unit/bitgo/wallet/walletsWebauthn.d.ts.map +1 -0
- package/dist/test/unit/bitgo/wallet/walletsWebauthn.js +200 -0
- package/dist/test/unit/coins/ofc.d.ts +2 -0
- package/dist/test/unit/coins/ofc.d.ts.map +1 -0
- package/dist/test/unit/coins/ofc.js +124 -0
- package/dist/test/unit/lightning.d.ts +2 -0
- package/dist/test/unit/lightning.d.ts.map +1 -0
- package/dist/test/unit/lightning.js +23 -0
- package/dist/test/unit/units.d.ts.map +1 -1
- package/dist/test/unit/units.js +64 -64
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +24 -21
- package/.eslintignore +0 -5
- package/CHANGELOG.md +0 -1433
- package/dist/src/account-lib/baseCoin/blsKeyPair.d.ts +0 -77
- package/dist/src/account-lib/baseCoin/blsKeyPair.d.ts.map +0 -1
- package/dist/src/account-lib/baseCoin/blsKeyPair.js +0 -209
- package/dist/src/bitgo/lightning/iLightning.d.ts +0 -186
- package/dist/src/bitgo/lightning/iLightning.d.ts.map +0 -1
- package/dist/src/bitgo/lightning/iLightning.js +0 -106
- package/dist/src/bitgo/lightning/index.d.ts +0 -5
- package/dist/src/bitgo/lightning/index.d.ts.map +0 -1
- package/dist/src/bitgo/lightning/index.js +0 -17
- package/dist/src/bitgo/lightning/lightning.d.ts +0 -25
- package/dist/src/bitgo/lightning/lightning.d.ts.map +0 -1
- package/dist/src/bitgo/lightning/lightning.js +0 -111
- package/dist/src/bitgo/lightning/lightningUtils.d.ts +0 -46
- package/dist/src/bitgo/lightning/lightningUtils.d.ts.map +0 -1
- package/dist/src/bitgo/lightning/lightningUtils.js +0 -133
- package/dist/src/bitgo/lightning/lnurlCodec.d.ts +0 -3
- package/dist/src/bitgo/lightning/lnurlCodec.d.ts.map +0 -1
- package/dist/src/bitgo/lightning/lnurlCodec.js +0 -28
- package/dist/src/bitgo/utils/blsUtils.d.ts +0 -52
- package/dist/src/bitgo/utils/blsUtils.d.ts.map +0 -1
- package/dist/src/bitgo/utils/blsUtils.js +0 -237
- package/dist/src/bitgo/utils/iBlsUtils.d.ts +0 -14
- package/dist/src/bitgo/utils/iBlsUtils.d.ts.map +0 -1
- package/dist/src/bitgo/utils/iBlsUtils.js +0 -3
- package/dist/src/coins/fiateur.d.ts +0 -31
- package/dist/src/coins/fiateur.d.ts.map +0 -1
- package/dist/src/coins/fiateur.js +0 -57
- package/dist/src/coins/fiatgbp.d.ts +0 -31
- package/dist/src/coins/fiatgbp.d.ts.map +0 -1
- package/dist/src/coins/fiatgbp.js +0 -57
- package/dist/src/coins/fiatusd.d.ts +0 -31
- package/dist/src/coins/fiatusd.d.ts.map +0 -1
- package/dist/src/coins/fiatusd.js +0 -57
- package/dist/src/coins/tfiateur.d.ts +0 -11
- package/dist/src/coins/tfiateur.d.ts.map +0 -1
- package/dist/src/coins/tfiateur.js +0 -17
- package/dist/src/coins/tfiatgbp.d.ts +0 -11
- package/dist/src/coins/tfiatgbp.d.ts.map +0 -1
- package/dist/src/coins/tfiatgbp.js +0 -17
- package/dist/src/coins/tfiatusd.d.ts +0 -11
- package/dist/src/coins/tfiatusd.d.ts.map +0 -1
- package/dist/src/coins/tfiatusd.js +0 -17
- package/dist/src/openssl/index.d.ts +0 -5
- package/dist/src/openssl/index.d.ts.map +0 -1
- package/dist/src/openssl/index.js +0 -9
- package/dist/test/unit/openssl.d.ts +0 -2
- package/dist/test/unit/openssl.d.ts.map +0 -1
- package/dist/test/unit/openssl.js +0 -39
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
require("should");
|
|
37
|
+
const sinon = __importStar(require("sinon"));
|
|
38
|
+
const sjcl = __importStar(require("@bitgo-beta/sjcl"));
|
|
39
|
+
const initiate_1 = require("../../../../src/bitgo/recovery/initiate");
|
|
40
|
+
// A deterministic xprv used across all tests.
|
|
41
|
+
const TEST_XPRV = 'xprv9s21ZrQH143K2fJ91S4BRsupcYrE6mmY96fcX5HkhoTrrwmwjd16Cn87cWinJjByrfpojjx7ezsJLx7TAKLT8m8hM5Kax9YcoxnBeJZ3t2k';
|
|
42
|
+
const TEST_XPUB = 'xpub661MyMwAqRbcF9Nc7TbBo1rZAagiWEVPWKbDKThNG8zqjk76HAKLkaSbTn6dK2dQPfuD7xjicxCZVWvj67fP5nQ9W7QURmoMVAX8m6jZsGp';
|
|
43
|
+
/**
|
|
44
|
+
* Encrypt plaintext with SJCL (same algorithm as BitGoAPI.encrypt).
|
|
45
|
+
*/
|
|
46
|
+
function sjclEncrypt(password, input) {
|
|
47
|
+
return sjcl.encrypt(password, input);
|
|
48
|
+
}
|
|
49
|
+
function makeMockBitGo(decryptImpl) {
|
|
50
|
+
return {
|
|
51
|
+
decrypt: sinon.stub().callsFake(decryptImpl),
|
|
52
|
+
decryptAsync: sinon.stub().callsFake(async (params) => decryptImpl(params)),
|
|
53
|
+
encrypt: sinon.stub(),
|
|
54
|
+
encryptAsync: sinon.stub(),
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
describe('validateKey', () => {
|
|
58
|
+
afterEach(() => {
|
|
59
|
+
sinon.restore();
|
|
60
|
+
});
|
|
61
|
+
it('returns a BIP32 node directly when key starts with xprv (bypasses decrypt)', () => {
|
|
62
|
+
const bitgo = makeMockBitGo(() => {
|
|
63
|
+
throw new Error('should not be called');
|
|
64
|
+
});
|
|
65
|
+
const node = (0, initiate_1.validateKey)(bitgo, {
|
|
66
|
+
key: TEST_XPRV,
|
|
67
|
+
source: 'user',
|
|
68
|
+
passphrase: 'secret',
|
|
69
|
+
isUnsignedSweep: false,
|
|
70
|
+
isKrsRecovery: false,
|
|
71
|
+
});
|
|
72
|
+
node.toBase58().should.equal(TEST_XPRV);
|
|
73
|
+
bitgo.decrypt.callCount.should.equal(0);
|
|
74
|
+
});
|
|
75
|
+
it('calls decrypt and returns BIP32 node when key is encrypted (not xprv)', () => {
|
|
76
|
+
const passphrase = 'hunter2';
|
|
77
|
+
const encryptedKey = sjclEncrypt(passphrase, TEST_XPRV);
|
|
78
|
+
const bitgo = makeMockBitGo(({ password, input }) => {
|
|
79
|
+
if (input === encryptedKey && password === passphrase)
|
|
80
|
+
return TEST_XPRV;
|
|
81
|
+
throw new Error('unexpected decrypt call');
|
|
82
|
+
});
|
|
83
|
+
const node = (0, initiate_1.validateKey)(bitgo, {
|
|
84
|
+
key: encryptedKey,
|
|
85
|
+
source: 'user',
|
|
86
|
+
passphrase,
|
|
87
|
+
isUnsignedSweep: false,
|
|
88
|
+
isKrsRecovery: false,
|
|
89
|
+
});
|
|
90
|
+
node.toBase58().should.equal(TEST_XPRV);
|
|
91
|
+
bitgo.decrypt.callCount.should.equal(1);
|
|
92
|
+
});
|
|
93
|
+
it('throws with friendly message when decrypt fails (wrong passphrase)', () => {
|
|
94
|
+
const bitgo = makeMockBitGo(() => {
|
|
95
|
+
throw new Error('sjcl: ccm: tag does not match');
|
|
96
|
+
});
|
|
97
|
+
(() => (0, initiate_1.validateKey)(bitgo, {
|
|
98
|
+
key: 'notAnXprv',
|
|
99
|
+
source: 'user',
|
|
100
|
+
passphrase: 'wrong',
|
|
101
|
+
isUnsignedSweep: false,
|
|
102
|
+
isKrsRecovery: false,
|
|
103
|
+
})).should.throw('Failed to decrypt user key with passcode - try again!');
|
|
104
|
+
});
|
|
105
|
+
});
|
|
106
|
+
describe('validateKeyAsync', () => {
|
|
107
|
+
afterEach(() => {
|
|
108
|
+
sinon.restore();
|
|
109
|
+
});
|
|
110
|
+
it('returns a BIP32 node directly when key starts with xprv (bypasses decryptAsync)', async () => {
|
|
111
|
+
const bitgo = makeMockBitGo(() => {
|
|
112
|
+
throw new Error('should not be called');
|
|
113
|
+
});
|
|
114
|
+
const node = await (0, initiate_1.validateKeyAsync)(bitgo, {
|
|
115
|
+
key: TEST_XPRV,
|
|
116
|
+
source: 'user',
|
|
117
|
+
passphrase: 'secret',
|
|
118
|
+
isUnsignedSweep: false,
|
|
119
|
+
isKrsRecovery: false,
|
|
120
|
+
});
|
|
121
|
+
node.toBase58().should.equal(TEST_XPRV);
|
|
122
|
+
bitgo.decryptAsync.callCount.should.equal(0);
|
|
123
|
+
});
|
|
124
|
+
it('calls decryptAsync and returns BIP32 node when key is encrypted (not xprv)', async () => {
|
|
125
|
+
const passphrase = 'hunter2';
|
|
126
|
+
const encryptedKey = sjclEncrypt(passphrase, TEST_XPRV);
|
|
127
|
+
const bitgo = makeMockBitGo(({ password, input }) => {
|
|
128
|
+
if (input === encryptedKey && password === passphrase)
|
|
129
|
+
return TEST_XPRV;
|
|
130
|
+
throw new Error('unexpected decrypt call');
|
|
131
|
+
});
|
|
132
|
+
const node = await (0, initiate_1.validateKeyAsync)(bitgo, {
|
|
133
|
+
key: encryptedKey,
|
|
134
|
+
source: 'user',
|
|
135
|
+
passphrase,
|
|
136
|
+
isUnsignedSweep: false,
|
|
137
|
+
isKrsRecovery: false,
|
|
138
|
+
});
|
|
139
|
+
node.toBase58().should.equal(TEST_XPRV);
|
|
140
|
+
bitgo.decryptAsync.callCount.should.equal(1);
|
|
141
|
+
});
|
|
142
|
+
it('rejects with friendly message when decryptAsync fails (wrong passphrase)', async () => {
|
|
143
|
+
const bitgo = makeMockBitGo(() => {
|
|
144
|
+
throw new Error('sjcl: ccm: tag does not match');
|
|
145
|
+
});
|
|
146
|
+
await (0, initiate_1.validateKeyAsync)(bitgo, {
|
|
147
|
+
key: 'notAnXprv',
|
|
148
|
+
source: 'user',
|
|
149
|
+
passphrase: 'wrong',
|
|
150
|
+
isUnsignedSweep: false,
|
|
151
|
+
isKrsRecovery: false,
|
|
152
|
+
}).should.be.rejectedWith('Failed to decrypt user key with passcode - try again!');
|
|
153
|
+
});
|
|
154
|
+
it('skips decryptAsync for unsigned sweep (isUnsignedSweep = true)', async () => {
|
|
155
|
+
const bitgo = makeMockBitGo(() => {
|
|
156
|
+
throw new Error('should not be called');
|
|
157
|
+
});
|
|
158
|
+
const node = await (0, initiate_1.validateKeyAsync)(bitgo, {
|
|
159
|
+
key: TEST_XPUB,
|
|
160
|
+
source: 'user',
|
|
161
|
+
passphrase: 'secret',
|
|
162
|
+
isUnsignedSweep: true,
|
|
163
|
+
isKrsRecovery: false,
|
|
164
|
+
});
|
|
165
|
+
node.neutered().toBase58().should.equal(TEST_XPUB);
|
|
166
|
+
bitgo.decryptAsync.callCount.should.equal(0);
|
|
167
|
+
});
|
|
168
|
+
});
|
|
169
|
+
describe('getBip32Keys', () => {
|
|
170
|
+
afterEach(() => {
|
|
171
|
+
sinon.restore();
|
|
172
|
+
});
|
|
173
|
+
it('returns [userKey, backupKey] when both are provided as xprv', () => {
|
|
174
|
+
const bitgo = makeMockBitGo(() => {
|
|
175
|
+
throw new Error('should not be called');
|
|
176
|
+
});
|
|
177
|
+
const keys = (0, initiate_1.getBip32Keys)(bitgo, { userKey: TEST_XPRV, backupKey: TEST_XPRV, recoveryDestination: 'addr' }, { requireBitGoXpub: false });
|
|
178
|
+
keys.should.have.length(2);
|
|
179
|
+
keys[0].toBase58().should.equal(TEST_XPRV);
|
|
180
|
+
keys[1].toBase58().should.equal(TEST_XPRV);
|
|
181
|
+
});
|
|
182
|
+
it('throws when requireBitGoXpub is true but bitgoKey is missing', () => {
|
|
183
|
+
const bitgo = makeMockBitGo(() => {
|
|
184
|
+
throw new Error('should not be called');
|
|
185
|
+
});
|
|
186
|
+
(() => (0, initiate_1.getBip32Keys)(bitgo, { userKey: TEST_XPRV, backupKey: TEST_XPRV, recoveryDestination: 'addr' }, { requireBitGoXpub: true })).should.throw('BitGo xpub required but not provided');
|
|
187
|
+
});
|
|
188
|
+
});
|
|
189
|
+
describe('getBip32KeysAsync', () => {
|
|
190
|
+
afterEach(() => {
|
|
191
|
+
sinon.restore();
|
|
192
|
+
});
|
|
193
|
+
it('returns [userKey, backupKey] when both are provided as xprv', async () => {
|
|
194
|
+
const bitgo = makeMockBitGo(() => {
|
|
195
|
+
throw new Error('should not be called');
|
|
196
|
+
});
|
|
197
|
+
const keys = await (0, initiate_1.getBip32KeysAsync)(bitgo, { userKey: TEST_XPRV, backupKey: TEST_XPRV, recoveryDestination: 'addr' }, { requireBitGoXpub: false });
|
|
198
|
+
keys.should.have.length(2);
|
|
199
|
+
keys[0].toBase58().should.equal(TEST_XPRV);
|
|
200
|
+
keys[1].toBase58().should.equal(TEST_XPRV);
|
|
201
|
+
});
|
|
202
|
+
it('returns three keys when requireBitGoXpub is true and bitgoKey is valid', async () => {
|
|
203
|
+
const bitgo = makeMockBitGo(() => {
|
|
204
|
+
throw new Error('should not be called');
|
|
205
|
+
});
|
|
206
|
+
const keys = await (0, initiate_1.getBip32KeysAsync)(bitgo, { userKey: TEST_XPRV, backupKey: TEST_XPRV, bitgoKey: TEST_XPUB, recoveryDestination: 'addr' }, { requireBitGoXpub: true });
|
|
207
|
+
keys.should.have.length(3);
|
|
208
|
+
keys[2].neutered().toBase58().should.equal(TEST_XPUB);
|
|
209
|
+
});
|
|
210
|
+
it('calls decryptAsync for encrypted user key', async () => {
|
|
211
|
+
const passphrase = 'pass1';
|
|
212
|
+
const encryptedUserKey = sjclEncrypt(passphrase, TEST_XPRV);
|
|
213
|
+
const bitgo = makeMockBitGo(({ password, input }) => {
|
|
214
|
+
if (input === encryptedUserKey && password === passphrase)
|
|
215
|
+
return TEST_XPRV;
|
|
216
|
+
throw new Error('unexpected decrypt call');
|
|
217
|
+
});
|
|
218
|
+
const keys = await (0, initiate_1.getBip32KeysAsync)(bitgo, { userKey: encryptedUserKey, backupKey: TEST_XPRV, walletPassphrase: passphrase, recoveryDestination: 'addr' }, { requireBitGoXpub: false });
|
|
219
|
+
keys.should.have.length(2);
|
|
220
|
+
keys[0].toBase58().should.equal(TEST_XPRV);
|
|
221
|
+
bitgo.decryptAsync.callCount.should.equal(1);
|
|
222
|
+
});
|
|
223
|
+
it('rejects when requireBitGoXpub is true but bitgoKey is missing', async () => {
|
|
224
|
+
const bitgo = makeMockBitGo(() => {
|
|
225
|
+
throw new Error('should not be called');
|
|
226
|
+
});
|
|
227
|
+
await (0, initiate_1.getBip32KeysAsync)(bitgo, { userKey: TEST_XPRV, backupKey: TEST_XPRV, recoveryDestination: 'addr' }, { requireBitGoXpub: true }).should.be.rejectedWith('BitGo xpub required but not provided');
|
|
228
|
+
});
|
|
229
|
+
});
|
|
230
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5pdGlhdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi90ZXN0L3VuaXQvYml0Z28vcmVjb3ZlcnkvaW5pdGlhdGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxrQkFBZ0I7QUFDaEIsNkNBQStCO0FBQy9CLHVEQUF5QztBQUN6QyxzRUFLaUQ7QUFHakQsOENBQThDO0FBQzlDLE1BQU0sU0FBUyxHQUNiLGlIQUFpSCxDQUFDO0FBQ3BILE1BQU0sU0FBUyxHQUNiLGlIQUFpSCxDQUFDO0FBRXBIOztHQUVHO0FBQ0gsU0FBUyxXQUFXLENBQUMsUUFBZ0IsRUFBRSxLQUFhO0lBQ2xELE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFzQixDQUFDO0FBQzVELENBQUM7QUFFRCxTQUFTLGFBQWEsQ0FBQyxXQUFxRTtJQUMxRixPQUFPO1FBQ0wsT0FBTyxFQUFFLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDO1FBQzVDLFlBQVksRUFBRSxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxNQUE0QyxFQUFFLEVBQUUsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDakgsT0FBTyxFQUFFLEtBQUssQ0FBQyxJQUFJLEVBQUU7UUFDckIsWUFBWSxFQUFFLEtBQUssQ0FBQyxJQUFJLEVBQUU7S0FDSCxDQUFDO0FBQzVCLENBQUM7QUFFRCxRQUFRLENBQUMsYUFBYSxFQUFFLEdBQUcsRUFBRTtJQUMzQixTQUFTLENBQUMsR0FBRyxFQUFFO1FBQ2IsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ2xCLENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLDRFQUE0RSxFQUFFLEdBQUcsRUFBRTtRQUNwRixNQUFNLEtBQUssR0FBRyxhQUFhLENBQUMsR0FBRyxFQUFFO1lBQy9CLE1BQU0sSUFBSSxLQUFLLENBQUMsc0JBQXNCLENBQUMsQ0FBQztRQUMxQyxDQUFDLENBQUMsQ0FBQztRQUNILE1BQU0sSUFBSSxHQUFHLElBQUEsc0JBQVcsRUFBQyxLQUFLLEVBQUU7WUFDOUIsR0FBRyxFQUFFLFNBQVM7WUFDZCxNQUFNLEVBQUUsTUFBTTtZQUNkLFVBQVUsRUFBRSxRQUFRO1lBQ3BCLGVBQWUsRUFBRSxLQUFLO1lBQ3RCLGFBQWEsRUFBRSxLQUFLO1NBQ3JCLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3ZDLEtBQUssQ0FBQyxPQUEyQixDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQy9ELENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLHVFQUF1RSxFQUFFLEdBQUcsRUFBRTtRQUMvRSxNQUFNLFVBQVUsR0FBRyxTQUFTLENBQUM7UUFDN0IsTUFBTSxZQUFZLEdBQUcsV0FBVyxDQUFDLFVBQVUsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUN4RCxNQUFNLEtBQUssR0FBRyxhQUFhLENBQUMsQ0FBQyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFO1lBQ2xELElBQUksS0FBSyxLQUFLLFlBQVksSUFBSSxRQUFRLEtBQUssVUFBVTtnQkFBRSxPQUFPLFNBQVMsQ0FBQztZQUN4RSxNQUFNLElBQUksS0FBSyxDQUFDLHlCQUF5QixDQUFDLENBQUM7UUFDN0MsQ0FBQyxDQUFDLENBQUM7UUFDSCxNQUFNLElBQUksR0FBRyxJQUFBLHNCQUFXLEVBQUMsS0FBSyxFQUFFO1lBQzlCLEdBQUcsRUFBRSxZQUFZO1lBQ2pCLE1BQU0sRUFBRSxNQUFNO1lBQ2QsVUFBVTtZQUNWLGVBQWUsRUFBRSxLQUFLO1lBQ3RCLGFBQWEsRUFBRSxLQUFLO1NBQ3JCLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3ZDLEtBQUssQ0FBQyxPQUEyQixDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQy9ELENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLG9FQUFvRSxFQUFFLEdBQUcsRUFBRTtRQUM1RSxNQUFNLEtBQUssR0FBRyxhQUFhLENBQUMsR0FBRyxFQUFFO1lBQy9CLE1BQU0sSUFBSSxLQUFLLENBQUMsK0JBQStCLENBQUMsQ0FBQztRQUNuRCxDQUFDLENBQUMsQ0FBQztRQUNILENBQUMsR0FBRyxFQUFFLENBQ0osSUFBQSxzQkFBVyxFQUFDLEtBQUssRUFBRTtZQUNqQixHQUFHLEVBQUUsV0FBVztZQUNoQixNQUFNLEVBQUUsTUFBTTtZQUNkLFVBQVUsRUFBRSxPQUFPO1lBQ25CLGVBQWUsRUFBRSxLQUFLO1lBQ3RCLGFBQWEsRUFBRSxLQUFLO1NBQ3JCLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsdURBQXVELENBQUMsQ0FBQztJQUM5RSxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDO0FBRUgsUUFBUSxDQUFDLGtCQUFrQixFQUFFLEdBQUcsRUFBRTtJQUNoQyxTQUFTLENBQUMsR0FBRyxFQUFFO1FBQ2IsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ2xCLENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLGlGQUFpRixFQUFFLEtBQUssSUFBSSxFQUFFO1FBQy9GLE1BQU0sS0FBSyxHQUFHLGFBQWEsQ0FBQyxHQUFHLEVBQUU7WUFDL0IsTUFBTSxJQUFJLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1FBQzFDLENBQUMsQ0FBQyxDQUFDO1FBQ0gsTUFBTSxJQUFJLEdBQUcsTUFBTSxJQUFBLDJCQUFnQixFQUFDLEtBQUssRUFBRTtZQUN6QyxHQUFHLEVBQUUsU0FBUztZQUNkLE1BQU0sRUFBRSxNQUFNO1lBQ2QsVUFBVSxFQUFFLFFBQVE7WUFDcEIsZUFBZSxFQUFFLEtBQUs7WUFDdEIsYUFBYSxFQUFFLEtBQUs7U0FDckIsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDdkMsS0FBSyxDQUFDLFlBQWdDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDcEUsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsNEVBQTRFLEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDMUYsTUFBTSxVQUFVLEdBQUcsU0FBUyxDQUFDO1FBQzdCLE1BQU0sWUFBWSxHQUFHLFdBQVcsQ0FBQyxVQUFVLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDeEQsTUFBTSxLQUFLLEdBQUcsYUFBYSxDQUFDLENBQUMsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRTtZQUNsRCxJQUFJLEtBQUssS0FBSyxZQUFZLElBQUksUUFBUSxLQUFLLFVBQVU7Z0JBQUUsT0FBTyxTQUFTLENBQUM7WUFDeEUsTUFBTSxJQUFJLEtBQUssQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO1FBQzdDLENBQUMsQ0FBQyxDQUFDO1FBQ0gsTUFBTSxJQUFJLEdBQUcsTUFBTSxJQUFBLDJCQUFnQixFQUFDLEtBQUssRUFBRTtZQUN6QyxHQUFHLEVBQUUsWUFBWTtZQUNqQixNQUFNLEVBQUUsTUFBTTtZQUNkLFVBQVU7WUFDVixlQUFlLEVBQUUsS0FBSztZQUN0QixhQUFhLEVBQUUsS0FBSztTQUNyQixDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN2QyxLQUFLLENBQUMsWUFBZ0MsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNwRSxDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQywwRUFBMEUsRUFBRSxLQUFLLElBQUksRUFBRTtRQUN4RixNQUFNLEtBQUssR0FBRyxhQUFhLENBQUMsR0FBRyxFQUFFO1lBQy9CLE1BQU0sSUFBSSxLQUFLLENBQUMsK0JBQStCLENBQUMsQ0FBQztRQUNuRCxDQUFDLENBQUMsQ0FBQztRQUNILE1BQU0sSUFBQSwyQkFBZ0IsRUFBQyxLQUFLLEVBQUU7WUFDNUIsR0FBRyxFQUFFLFdBQVc7WUFDaEIsTUFBTSxFQUFFLE1BQU07WUFDZCxVQUFVLEVBQUUsT0FBTztZQUNuQixlQUFlLEVBQUUsS0FBSztZQUN0QixhQUFhLEVBQUUsS0FBSztTQUNyQixDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsdURBQXVELENBQUMsQ0FBQztJQUNyRixDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyxnRUFBZ0UsRUFBRSxLQUFLLElBQUksRUFBRTtRQUM5RSxNQUFNLEtBQUssR0FBRyxhQUFhLENBQUMsR0FBRyxFQUFFO1lBQy9CLE1BQU0sSUFBSSxLQUFLLENBQUMsc0JBQXNCLENBQUMsQ0FBQztRQUMxQyxDQUFDLENBQUMsQ0FBQztRQUNILE1BQU0sSUFBSSxHQUFHLE1BQU0sSUFBQSwyQkFBZ0IsRUFBQyxLQUFLLEVBQUU7WUFDekMsR0FBRyxFQUFFLFNBQVM7WUFDZCxNQUFNLEVBQUUsTUFBTTtZQUNkLFVBQVUsRUFBRSxRQUFRO1lBQ3BCLGVBQWUsRUFBRSxJQUFJO1lBQ3JCLGFBQWEsRUFBRSxLQUFLO1NBQ3JCLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ2xELEtBQUssQ0FBQyxZQUFnQyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3BFLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUM7QUFFSCxRQUFRLENBQUMsY0FBYyxFQUFFLEdBQUcsRUFBRTtJQUM1QixTQUFTLENBQUMsR0FBRyxFQUFFO1FBQ2IsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ2xCLENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLDZEQUE2RCxFQUFFLEdBQUcsRUFBRTtRQUNyRSxNQUFNLEtBQUssR0FBRyxhQUFhLENBQUMsR0FBRyxFQUFFO1lBQy9CLE1BQU0sSUFBSSxLQUFLLENBQUMsc0JBQXNCLENBQUMsQ0FBQztRQUMxQyxDQUFDLENBQUMsQ0FBQztRQUNILE1BQU0sSUFBSSxHQUFHLElBQUEsdUJBQVksRUFDdkIsS0FBSyxFQUNMLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sRUFBRSxFQUN6RSxFQUFFLGdCQUFnQixFQUFFLEtBQUssRUFBRSxDQUM1QixDQUFDO1FBQ0YsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzNCLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzNDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQzdDLENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLDhEQUE4RCxFQUFFLEdBQUcsRUFBRTtRQUN0RSxNQUFNLEtBQUssR0FBRyxhQUFhLENBQUMsR0FBRyxFQUFFO1lBQy9CLE1BQU0sSUFBSSxLQUFLLENBQUMsc0JBQXNCLENBQUMsQ0FBQztRQUMxQyxDQUFDLENBQUMsQ0FBQztRQUNILENBQUMsR0FBRyxFQUFFLENBQ0osSUFBQSx1QkFBWSxFQUNWLEtBQUssRUFDTCxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLEVBQUUsRUFDekUsRUFBRSxnQkFBZ0IsRUFBRSxJQUFJLEVBQUUsQ0FDM0IsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsc0NBQXNDLENBQUMsQ0FBQztJQUM1RCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDO0FBRUgsUUFBUSxDQUFDLG1CQUFtQixFQUFFLEdBQUcsRUFBRTtJQUNqQyxTQUFTLENBQUMsR0FBRyxFQUFFO1FBQ2IsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ2xCLENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLDZEQUE2RCxFQUFFLEtBQUssSUFBSSxFQUFFO1FBQzNFLE1BQU0sS0FBSyxHQUFHLGFBQWEsQ0FBQyxHQUFHLEVBQUU7WUFDL0IsTUFBTSxJQUFJLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1FBQzFDLENBQUMsQ0FBQyxDQUFDO1FBQ0gsTUFBTSxJQUFJLEdBQUcsTUFBTSxJQUFBLDRCQUFpQixFQUNsQyxLQUFLLEVBQ0wsRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxFQUFFLEVBQ3pFLEVBQUUsZ0JBQWdCLEVBQUUsS0FBSyxFQUFFLENBQzVCLENBQUM7UUFDRixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDM0IsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDM0MsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDN0MsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsd0VBQXdFLEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDdEYsTUFBTSxLQUFLLEdBQUcsYUFBYSxDQUFDLEdBQUcsRUFBRTtZQUMvQixNQUFNLElBQUksS0FBSyxDQUFDLHNCQUFzQixDQUFDLENBQUM7UUFDMUMsQ0FBQyxDQUFDLENBQUM7UUFDSCxNQUFNLElBQUksR0FBRyxNQUFNLElBQUEsNEJBQWlCLEVBQ2xDLEtBQUssRUFDTCxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sRUFBRSxFQUM5RixFQUFFLGdCQUFnQixFQUFFLElBQUksRUFBRSxDQUMzQixDQUFDO1FBQ0YsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzNCLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3hELENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLDJDQUEyQyxFQUFFLEtBQUssSUFBSSxFQUFFO1FBQ3pELE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQztRQUMzQixNQUFNLGdCQUFnQixHQUFHLFdBQVcsQ0FBQyxVQUFVLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDNUQsTUFBTSxLQUFLLEdBQUcsYUFBYSxDQUFDLENBQUMsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRTtZQUNsRCxJQUFJLEtBQUssS0FBSyxnQkFBZ0IsSUFBSSxRQUFRLEtBQUssVUFBVTtnQkFBRSxPQUFPLFNBQVMsQ0FBQztZQUM1RSxNQUFNLElBQUksS0FBSyxDQUFDLHlCQUF5QixDQUFDLENBQUM7UUFDN0MsQ0FBQyxDQUFDLENBQUM7UUFDSCxNQUFNLElBQUksR0FBRyxNQUFNLElBQUEsNEJBQWlCLEVBQ2xDLEtBQUssRUFDTCxFQUFFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFFLFVBQVUsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLEVBQUUsRUFDOUcsRUFBRSxnQkFBZ0IsRUFBRSxLQUFLLEVBQUUsQ0FDNUIsQ0FBQztRQUNGLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMzQixJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUMxQyxLQUFLLENBQUMsWUFBZ0MsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNwRSxDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQywrREFBK0QsRUFBRSxLQUFLLElBQUksRUFBRTtRQUM3RSxNQUFNLEtBQUssR0FBRyxhQUFhLENBQUMsR0FBRyxFQUFFO1lBQy9CLE1BQU0sSUFBSSxLQUFLLENBQUMsc0JBQXNCLENBQUMsQ0FBQztRQUMxQyxDQUFDLENBQUMsQ0FBQztRQUNILE1BQU0sSUFBQSw0QkFBaUIsRUFDckIsS0FBSyxFQUNMLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sRUFBRSxFQUN6RSxFQUFFLGdCQUFnQixFQUFFLElBQUksRUFBRSxDQUMzQixDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLHNDQUFzQyxDQUFDLENBQUM7SUFDbkUsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAnc2hvdWxkJztcbmltcG9ydCAqIGFzIHNpbm9uIGZyb20gJ3Npbm9uJztcbmltcG9ydCAqIGFzIHNqY2wgZnJvbSAnQGJpdGdvLWJldGEvc2pjbCc7XG5pbXBvcnQge1xuICB2YWxpZGF0ZUtleSxcbiAgdmFsaWRhdGVLZXlBc3luYyxcbiAgZ2V0QmlwMzJLZXlzLFxuICBnZXRCaXAzMktleXNBc3luYyxcbn0gZnJvbSAnLi4vLi4vLi4vLi4vc3JjL2JpdGdvL3JlY292ZXJ5L2luaXRpYXRlJztcbmltcG9ydCB7IEJpdEdvQmFzZSB9IGZyb20gJy4uLy4uLy4uLy4uL3NyYy9iaXRnby9iaXRnb0Jhc2UnO1xuXG4vLyBBIGRldGVybWluaXN0aWMgeHBydiB1c2VkIGFjcm9zcyBhbGwgdGVzdHMuXG5jb25zdCBURVNUX1hQUlYgPVxuICAneHBydjlzMjFaclFIMTQzSzJmSjkxUzRCUnN1cGNZckU2bW1ZOTZmY1g1SGtob1Rycndtd2pkMTZDbjg3Y1dpbkpqQnlyZnBvamp4N2V6c0pMeDdUQUtMVDhtOGhNNUtheDlZY294bkJlSlozdDJrJztcbmNvbnN0IFRFU1RfWFBVQiA9XG4gICd4cHViNjYxTXlNd0FxUmJjRjlOYzdUYkJvMXJaQWFnaVdFVlBXS2JES1RoTkc4enFqazc2SEFLTGthU2JUbjZkSzJkUVBmdUQ3eGppY3hDWlZXdmo2N2ZQNW5ROVc3UVVSbW9NVkFYOG02alpzR3AnO1xuXG4vKipcbiAqIEVuY3J5cHQgcGxhaW50ZXh0IHdpdGggU0pDTCAoc2FtZSBhbGdvcml0aG0gYXMgQml0R29BUEkuZW5jcnlwdCkuXG4gKi9cbmZ1bmN0aW9uIHNqY2xFbmNyeXB0KHBhc3N3b3JkOiBzdHJpbmcsIGlucHV0OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gc2pjbC5lbmNyeXB0KHBhc3N3b3JkLCBpbnB1dCkgYXMgdW5rbm93biBhcyBzdHJpbmc7XG59XG5cbmZ1bmN0aW9uIG1ha2VNb2NrQml0R28oZGVjcnlwdEltcGw6IChwYXJhbXM6IHsgcGFzc3dvcmQ/OiBzdHJpbmc7IGlucHV0OiBzdHJpbmcgfSkgPT4gc3RyaW5nKTogQml0R29CYXNlIHtcbiAgcmV0dXJuIHtcbiAgICBkZWNyeXB0OiBzaW5vbi5zdHViKCkuY2FsbHNGYWtlKGRlY3J5cHRJbXBsKSxcbiAgICBkZWNyeXB0QXN5bmM6IHNpbm9uLnN0dWIoKS5jYWxsc0Zha2UoYXN5bmMgKHBhcmFtczogeyBwYXNzd29yZD86IHN0cmluZzsgaW5wdXQ6IHN0cmluZyB9KSA9PiBkZWNyeXB0SW1wbChwYXJhbXMpKSxcbiAgICBlbmNyeXB0OiBzaW5vbi5zdHViKCksXG4gICAgZW5jcnlwdEFzeW5jOiBzaW5vbi5zdHViKCksXG4gIH0gYXMgdW5rbm93biBhcyBCaXRHb0Jhc2U7XG59XG5cbmRlc2NyaWJlKCd2YWxpZGF0ZUtleScsICgpID0+IHtcbiAgYWZ0ZXJFYWNoKCgpID0+IHtcbiAgICBzaW5vbi5yZXN0b3JlKCk7XG4gIH0pO1xuXG4gIGl0KCdyZXR1cm5zIGEgQklQMzIgbm9kZSBkaXJlY3RseSB3aGVuIGtleSBzdGFydHMgd2l0aCB4cHJ2IChieXBhc3NlcyBkZWNyeXB0KScsICgpID0+IHtcbiAgICBjb25zdCBiaXRnbyA9IG1ha2VNb2NrQml0R28oKCkgPT4ge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdzaG91bGQgbm90IGJlIGNhbGxlZCcpO1xuICAgIH0pO1xuICAgIGNvbnN0IG5vZGUgPSB2YWxpZGF0ZUtleShiaXRnbywge1xuICAgICAga2V5OiBURVNUX1hQUlYsXG4gICAgICBzb3VyY2U6ICd1c2VyJyxcbiAgICAgIHBhc3NwaHJhc2U6ICdzZWNyZXQnLFxuICAgICAgaXNVbnNpZ25lZFN3ZWVwOiBmYWxzZSxcbiAgICAgIGlzS3JzUmVjb3Zlcnk6IGZhbHNlLFxuICAgIH0pO1xuICAgIG5vZGUudG9CYXNlNTgoKS5zaG91bGQuZXF1YWwoVEVTVF9YUFJWKTtcbiAgICAoYml0Z28uZGVjcnlwdCBhcyBzaW5vbi5TaW5vblN0dWIpLmNhbGxDb3VudC5zaG91bGQuZXF1YWwoMCk7XG4gIH0pO1xuXG4gIGl0KCdjYWxscyBkZWNyeXB0IGFuZCByZXR1cm5zIEJJUDMyIG5vZGUgd2hlbiBrZXkgaXMgZW5jcnlwdGVkIChub3QgeHBydiknLCAoKSA9PiB7XG4gICAgY29uc3QgcGFzc3BocmFzZSA9ICdodW50ZXIyJztcbiAgICBjb25zdCBlbmNyeXB0ZWRLZXkgPSBzamNsRW5jcnlwdChwYXNzcGhyYXNlLCBURVNUX1hQUlYpO1xuICAgIGNvbnN0IGJpdGdvID0gbWFrZU1vY2tCaXRHbygoeyBwYXNzd29yZCwgaW5wdXQgfSkgPT4ge1xuICAgICAgaWYgKGlucHV0ID09PSBlbmNyeXB0ZWRLZXkgJiYgcGFzc3dvcmQgPT09IHBhc3NwaHJhc2UpIHJldHVybiBURVNUX1hQUlY7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3VuZXhwZWN0ZWQgZGVjcnlwdCBjYWxsJyk7XG4gICAgfSk7XG4gICAgY29uc3Qgbm9kZSA9IHZhbGlkYXRlS2V5KGJpdGdvLCB7XG4gICAgICBrZXk6IGVuY3J5cHRlZEtleSxcbiAgICAgIHNvdXJjZTogJ3VzZXInLFxuICAgICAgcGFzc3BocmFzZSxcbiAgICAgIGlzVW5zaWduZWRTd2VlcDogZmFsc2UsXG4gICAgICBpc0tyc1JlY292ZXJ5OiBmYWxzZSxcbiAgICB9KTtcbiAgICBub2RlLnRvQmFzZTU4KCkuc2hvdWxkLmVxdWFsKFRFU1RfWFBSVik7XG4gICAgKGJpdGdvLmRlY3J5cHQgYXMgc2lub24uU2lub25TdHViKS5jYWxsQ291bnQuc2hvdWxkLmVxdWFsKDEpO1xuICB9KTtcblxuICBpdCgndGhyb3dzIHdpdGggZnJpZW5kbHkgbWVzc2FnZSB3aGVuIGRlY3J5cHQgZmFpbHMgKHdyb25nIHBhc3NwaHJhc2UpJywgKCkgPT4ge1xuICAgIGNvbnN0IGJpdGdvID0gbWFrZU1vY2tCaXRHbygoKSA9PiB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3NqY2w6IGNjbTogdGFnIGRvZXMgbm90IG1hdGNoJyk7XG4gICAgfSk7XG4gICAgKCgpID0+XG4gICAgICB2YWxpZGF0ZUtleShiaXRnbywge1xuICAgICAgICBrZXk6ICdub3RBblhwcnYnLFxuICAgICAgICBzb3VyY2U6ICd1c2VyJyxcbiAgICAgICAgcGFzc3BocmFzZTogJ3dyb25nJyxcbiAgICAgICAgaXNVbnNpZ25lZFN3ZWVwOiBmYWxzZSxcbiAgICAgICAgaXNLcnNSZWNvdmVyeTogZmFsc2UsXG4gICAgICB9KSkuc2hvdWxkLnRocm93KCdGYWlsZWQgdG8gZGVjcnlwdCB1c2VyIGtleSB3aXRoIHBhc3Njb2RlIC0gdHJ5IGFnYWluIScpO1xuICB9KTtcbn0pO1xuXG5kZXNjcmliZSgndmFsaWRhdGVLZXlBc3luYycsICgpID0+IHtcbiAgYWZ0ZXJFYWNoKCgpID0+IHtcbiAgICBzaW5vbi5yZXN0b3JlKCk7XG4gIH0pO1xuXG4gIGl0KCdyZXR1cm5zIGEgQklQMzIgbm9kZSBkaXJlY3RseSB3aGVuIGtleSBzdGFydHMgd2l0aCB4cHJ2IChieXBhc3NlcyBkZWNyeXB0QXN5bmMpJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGJpdGdvID0gbWFrZU1vY2tCaXRHbygoKSA9PiB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Nob3VsZCBub3QgYmUgY2FsbGVkJyk7XG4gICAgfSk7XG4gICAgY29uc3Qgbm9kZSA9IGF3YWl0IHZhbGlkYXRlS2V5QXN5bmMoYml0Z28sIHtcbiAgICAgIGtleTogVEVTVF9YUFJWLFxuICAgICAgc291cmNlOiAndXNlcicsXG4gICAgICBwYXNzcGhyYXNlOiAnc2VjcmV0JyxcbiAgICAgIGlzVW5zaWduZWRTd2VlcDogZmFsc2UsXG4gICAgICBpc0tyc1JlY292ZXJ5OiBmYWxzZSxcbiAgICB9KTtcbiAgICBub2RlLnRvQmFzZTU4KCkuc2hvdWxkLmVxdWFsKFRFU1RfWFBSVik7XG4gICAgKGJpdGdvLmRlY3J5cHRBc3luYyBhcyBzaW5vbi5TaW5vblN0dWIpLmNhbGxDb3VudC5zaG91bGQuZXF1YWwoMCk7XG4gIH0pO1xuXG4gIGl0KCdjYWxscyBkZWNyeXB0QXN5bmMgYW5kIHJldHVybnMgQklQMzIgbm9kZSB3aGVuIGtleSBpcyBlbmNyeXB0ZWQgKG5vdCB4cHJ2KScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBwYXNzcGhyYXNlID0gJ2h1bnRlcjInO1xuICAgIGNvbnN0IGVuY3J5cHRlZEtleSA9IHNqY2xFbmNyeXB0KHBhc3NwaHJhc2UsIFRFU1RfWFBSVik7XG4gICAgY29uc3QgYml0Z28gPSBtYWtlTW9ja0JpdEdvKCh7IHBhc3N3b3JkLCBpbnB1dCB9KSA9PiB7XG4gICAgICBpZiAoaW5wdXQgPT09IGVuY3J5cHRlZEtleSAmJiBwYXNzd29yZCA9PT0gcGFzc3BocmFzZSkgcmV0dXJuIFRFU1RfWFBSVjtcbiAgICAgIHRocm93IG5ldyBFcnJvcigndW5leHBlY3RlZCBkZWNyeXB0IGNhbGwnKTtcbiAgICB9KTtcbiAgICBjb25zdCBub2RlID0gYXdhaXQgdmFsaWRhdGVLZXlBc3luYyhiaXRnbywge1xuICAgICAga2V5OiBlbmNyeXB0ZWRLZXksXG4gICAgICBzb3VyY2U6ICd1c2VyJyxcbiAgICAgIHBhc3NwaHJhc2UsXG4gICAgICBpc1Vuc2lnbmVkU3dlZXA6IGZhbHNlLFxuICAgICAgaXNLcnNSZWNvdmVyeTogZmFsc2UsXG4gICAgfSk7XG4gICAgbm9kZS50b0Jhc2U1OCgpLnNob3VsZC5lcXVhbChURVNUX1hQUlYpO1xuICAgIChiaXRnby5kZWNyeXB0QXN5bmMgYXMgc2lub24uU2lub25TdHViKS5jYWxsQ291bnQuc2hvdWxkLmVxdWFsKDEpO1xuICB9KTtcblxuICBpdCgncmVqZWN0cyB3aXRoIGZyaWVuZGx5IG1lc3NhZ2Ugd2hlbiBkZWNyeXB0QXN5bmMgZmFpbHMgKHdyb25nIHBhc3NwaHJhc2UpJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGJpdGdvID0gbWFrZU1vY2tCaXRHbygoKSA9PiB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3NqY2w6IGNjbTogdGFnIGRvZXMgbm90IG1hdGNoJyk7XG4gICAgfSk7XG4gICAgYXdhaXQgdmFsaWRhdGVLZXlBc3luYyhiaXRnbywge1xuICAgICAga2V5OiAnbm90QW5YcHJ2JyxcbiAgICAgIHNvdXJjZTogJ3VzZXInLFxuICAgICAgcGFzc3BocmFzZTogJ3dyb25nJyxcbiAgICAgIGlzVW5zaWduZWRTd2VlcDogZmFsc2UsXG4gICAgICBpc0tyc1JlY292ZXJ5OiBmYWxzZSxcbiAgICB9KS5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKCdGYWlsZWQgdG8gZGVjcnlwdCB1c2VyIGtleSB3aXRoIHBhc3Njb2RlIC0gdHJ5IGFnYWluIScpO1xuICB9KTtcblxuICBpdCgnc2tpcHMgZGVjcnlwdEFzeW5jIGZvciB1bnNpZ25lZCBzd2VlcCAoaXNVbnNpZ25lZFN3ZWVwID0gdHJ1ZSknLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgYml0Z28gPSBtYWtlTW9ja0JpdEdvKCgpID0+IHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignc2hvdWxkIG5vdCBiZSBjYWxsZWQnKTtcbiAgICB9KTtcbiAgICBjb25zdCBub2RlID0gYXdhaXQgdmFsaWRhdGVLZXlBc3luYyhiaXRnbywge1xuICAgICAga2V5OiBURVNUX1hQVUIsXG4gICAgICBzb3VyY2U6ICd1c2VyJyxcbiAgICAgIHBhc3NwaHJhc2U6ICdzZWNyZXQnLFxuICAgICAgaXNVbnNpZ25lZFN3ZWVwOiB0cnVlLFxuICAgICAgaXNLcnNSZWNvdmVyeTogZmFsc2UsXG4gICAgfSk7XG4gICAgbm9kZS5uZXV0ZXJlZCgpLnRvQmFzZTU4KCkuc2hvdWxkLmVxdWFsKFRFU1RfWFBVQik7XG4gICAgKGJpdGdvLmRlY3J5cHRBc3luYyBhcyBzaW5vbi5TaW5vblN0dWIpLmNhbGxDb3VudC5zaG91bGQuZXF1YWwoMCk7XG4gIH0pO1xufSk7XG5cbmRlc2NyaWJlKCdnZXRCaXAzMktleXMnLCAoKSA9PiB7XG4gIGFmdGVyRWFjaCgoKSA9PiB7XG4gICAgc2lub24ucmVzdG9yZSgpO1xuICB9KTtcblxuICBpdCgncmV0dXJucyBbdXNlcktleSwgYmFja3VwS2V5XSB3aGVuIGJvdGggYXJlIHByb3ZpZGVkIGFzIHhwcnYnLCAoKSA9PiB7XG4gICAgY29uc3QgYml0Z28gPSBtYWtlTW9ja0JpdEdvKCgpID0+IHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignc2hvdWxkIG5vdCBiZSBjYWxsZWQnKTtcbiAgICB9KTtcbiAgICBjb25zdCBrZXlzID0gZ2V0QmlwMzJLZXlzKFxuICAgICAgYml0Z28sXG4gICAgICB7IHVzZXJLZXk6IFRFU1RfWFBSViwgYmFja3VwS2V5OiBURVNUX1hQUlYsIHJlY292ZXJ5RGVzdGluYXRpb246ICdhZGRyJyB9LFxuICAgICAgeyByZXF1aXJlQml0R29YcHViOiBmYWxzZSB9XG4gICAgKTtcbiAgICBrZXlzLnNob3VsZC5oYXZlLmxlbmd0aCgyKTtcbiAgICBrZXlzWzBdLnRvQmFzZTU4KCkuc2hvdWxkLmVxdWFsKFRFU1RfWFBSVik7XG4gICAga2V5c1sxXS50b0Jhc2U1OCgpLnNob3VsZC5lcXVhbChURVNUX1hQUlYpO1xuICB9KTtcblxuICBpdCgndGhyb3dzIHdoZW4gcmVxdWlyZUJpdEdvWHB1YiBpcyB0cnVlIGJ1dCBiaXRnb0tleSBpcyBtaXNzaW5nJywgKCkgPT4ge1xuICAgIGNvbnN0IGJpdGdvID0gbWFrZU1vY2tCaXRHbygoKSA9PiB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Nob3VsZCBub3QgYmUgY2FsbGVkJyk7XG4gICAgfSk7XG4gICAgKCgpID0+XG4gICAgICBnZXRCaXAzMktleXMoXG4gICAgICAgIGJpdGdvLFxuICAgICAgICB7IHVzZXJLZXk6IFRFU1RfWFBSViwgYmFja3VwS2V5OiBURVNUX1hQUlYsIHJlY292ZXJ5RGVzdGluYXRpb246ICdhZGRyJyB9LFxuICAgICAgICB7IHJlcXVpcmVCaXRHb1hwdWI6IHRydWUgfVxuICAgICAgKSkuc2hvdWxkLnRocm93KCdCaXRHbyB4cHViIHJlcXVpcmVkIGJ1dCBub3QgcHJvdmlkZWQnKTtcbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoJ2dldEJpcDMyS2V5c0FzeW5jJywgKCkgPT4ge1xuICBhZnRlckVhY2goKCkgPT4ge1xuICAgIHNpbm9uLnJlc3RvcmUoKTtcbiAgfSk7XG5cbiAgaXQoJ3JldHVybnMgW3VzZXJLZXksIGJhY2t1cEtleV0gd2hlbiBib3RoIGFyZSBwcm92aWRlZCBhcyB4cHJ2JywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGJpdGdvID0gbWFrZU1vY2tCaXRHbygoKSA9PiB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Nob3VsZCBub3QgYmUgY2FsbGVkJyk7XG4gICAgfSk7XG4gICAgY29uc3Qga2V5cyA9IGF3YWl0IGdldEJpcDMyS2V5c0FzeW5jKFxuICAgICAgYml0Z28sXG4gICAgICB7IHVzZXJLZXk6IFRFU1RfWFBSViwgYmFja3VwS2V5OiBURVNUX1hQUlYsIHJlY292ZXJ5RGVzdGluYXRpb246ICdhZGRyJyB9LFxuICAgICAgeyByZXF1aXJlQml0R29YcHViOiBmYWxzZSB9XG4gICAgKTtcbiAgICBrZXlzLnNob3VsZC5oYXZlLmxlbmd0aCgyKTtcbiAgICBrZXlzWzBdLnRvQmFzZTU4KCkuc2hvdWxkLmVxdWFsKFRFU1RfWFBSVik7XG4gICAga2V5c1sxXS50b0Jhc2U1OCgpLnNob3VsZC5lcXVhbChURVNUX1hQUlYpO1xuICB9KTtcblxuICBpdCgncmV0dXJucyB0aHJlZSBrZXlzIHdoZW4gcmVxdWlyZUJpdEdvWHB1YiBpcyB0cnVlIGFuZCBiaXRnb0tleSBpcyB2YWxpZCcsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBiaXRnbyA9IG1ha2VNb2NrQml0R28oKCkgPT4ge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdzaG91bGQgbm90IGJlIGNhbGxlZCcpO1xuICAgIH0pO1xuICAgIGNvbnN0IGtleXMgPSBhd2FpdCBnZXRCaXAzMktleXNBc3luYyhcbiAgICAgIGJpdGdvLFxuICAgICAgeyB1c2VyS2V5OiBURVNUX1hQUlYsIGJhY2t1cEtleTogVEVTVF9YUFJWLCBiaXRnb0tleTogVEVTVF9YUFVCLCByZWNvdmVyeURlc3RpbmF0aW9uOiAnYWRkcicgfSxcbiAgICAgIHsgcmVxdWlyZUJpdEdvWHB1YjogdHJ1ZSB9XG4gICAgKTtcbiAgICBrZXlzLnNob3VsZC5oYXZlLmxlbmd0aCgzKTtcbiAgICBrZXlzWzJdLm5ldXRlcmVkKCkudG9CYXNlNTgoKS5zaG91bGQuZXF1YWwoVEVTVF9YUFVCKTtcbiAgfSk7XG5cbiAgaXQoJ2NhbGxzIGRlY3J5cHRBc3luYyBmb3IgZW5jcnlwdGVkIHVzZXIga2V5JywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHBhc3NwaHJhc2UgPSAncGFzczEnO1xuICAgIGNvbnN0IGVuY3J5cHRlZFVzZXJLZXkgPSBzamNsRW5jcnlwdChwYXNzcGhyYXNlLCBURVNUX1hQUlYpO1xuICAgIGNvbnN0IGJpdGdvID0gbWFrZU1vY2tCaXRHbygoeyBwYXNzd29yZCwgaW5wdXQgfSkgPT4ge1xuICAgICAgaWYgKGlucHV0ID09PSBlbmNyeXB0ZWRVc2VyS2V5ICYmIHBhc3N3b3JkID09PSBwYXNzcGhyYXNlKSByZXR1cm4gVEVTVF9YUFJWO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd1bmV4cGVjdGVkIGRlY3J5cHQgY2FsbCcpO1xuICAgIH0pO1xuICAgIGNvbnN0IGtleXMgPSBhd2FpdCBnZXRCaXAzMktleXNBc3luYyhcbiAgICAgIGJpdGdvLFxuICAgICAgeyB1c2VyS2V5OiBlbmNyeXB0ZWRVc2VyS2V5LCBiYWNrdXBLZXk6IFRFU1RfWFBSViwgd2FsbGV0UGFzc3BocmFzZTogcGFzc3BocmFzZSwgcmVjb3ZlcnlEZXN0aW5hdGlvbjogJ2FkZHInIH0sXG4gICAgICB7IHJlcXVpcmVCaXRHb1hwdWI6IGZhbHNlIH1cbiAgICApO1xuICAgIGtleXMuc2hvdWxkLmhhdmUubGVuZ3RoKDIpO1xuICAgIGtleXNbMF0udG9CYXNlNTgoKS5zaG91bGQuZXF1YWwoVEVTVF9YUFJWKTtcbiAgICAoYml0Z28uZGVjcnlwdEFzeW5jIGFzIHNpbm9uLlNpbm9uU3R1YikuY2FsbENvdW50LnNob3VsZC5lcXVhbCgxKTtcbiAgfSk7XG5cbiAgaXQoJ3JlamVjdHMgd2hlbiByZXF1aXJlQml0R29YcHViIGlzIHRydWUgYnV0IGJpdGdvS2V5IGlzIG1pc3NpbmcnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgYml0Z28gPSBtYWtlTW9ja0JpdEdvKCgpID0+IHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignc2hvdWxkIG5vdCBiZSBjYWxsZWQnKTtcbiAgICB9KTtcbiAgICBhd2FpdCBnZXRCaXAzMktleXNBc3luYyhcbiAgICAgIGJpdGdvLFxuICAgICAgeyB1c2VyS2V5OiBURVNUX1hQUlYsIGJhY2t1cEtleTogVEVTVF9YUFJWLCByZWNvdmVyeURlc3RpbmF0aW9uOiAnYWRkcicgfSxcbiAgICAgIHsgcmVxdWlyZUJpdEdvWHB1YjogdHJ1ZSB9XG4gICAgKS5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKCdCaXRHbyB4cHViIHJlcXVpcmVkIGJ1dCBub3QgcHJvdmlkZWQnKTtcbiAgfSk7XG59KTtcbiJdfQ==
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"encrypt.d.ts","sourceRoot":"","sources":["../../../../../../test/unit/bitgo/trading/network/encrypt.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const assert_1 = __importDefault(require("assert"));
|
|
7
|
+
const crypto_1 = __importDefault(require("crypto"));
|
|
8
|
+
const fs_1 = __importDefault(require("fs"));
|
|
9
|
+
const path_1 = __importDefault(require("path"));
|
|
10
|
+
const decrypt_rsa_1 = require("../../../../../src/bitgo/trading/network/decrypt-rsa");
|
|
11
|
+
const encrypt_rsa_1 = require("../../../../../src/bitgo/trading/network/encrypt-rsa");
|
|
12
|
+
const encrypt_rsa_browser_1 = require("../../../../../src/bitgo/trading/network/encrypt-rsa-browser");
|
|
13
|
+
const decrypt_aes_gcm_1 = require("../../../../../src/bitgo/trading/network/decrypt-aes-gcm");
|
|
14
|
+
const encrypt_aes_gcm_1 = require("../../../../../src/bitgo/trading/network/encrypt-aes-gcm");
|
|
15
|
+
const network_1 = require("../../../../../src/bitgo/trading/network");
|
|
16
|
+
describe('network encrypt', () => {
|
|
17
|
+
const privateKey = fs_1.default.readFileSync(path_1.default.resolve(__dirname, './private-key.pem'));
|
|
18
|
+
const publicKey = fs_1.default.readFileSync(path_1.default.resolve(__dirname, './public-key.pub'));
|
|
19
|
+
const password = 'password';
|
|
20
|
+
let encryptedRsa;
|
|
21
|
+
let decryptedRsa;
|
|
22
|
+
let encryptedBrowserRsa;
|
|
23
|
+
it('should encrypt the string with a rsa public key', async () => {
|
|
24
|
+
encryptedRsa = await (0, encrypt_rsa_1._encryptRsa)(publicKey.toString(), password);
|
|
25
|
+
(0, assert_1.default)(encryptedRsa);
|
|
26
|
+
});
|
|
27
|
+
it('should decrypt the string with a rsa public key', async () => {
|
|
28
|
+
decryptedRsa = await (0, decrypt_rsa_1._decryptRsa)(privateKey.toString(), encryptedRsa);
|
|
29
|
+
(0, assert_1.default)(decryptedRsa);
|
|
30
|
+
assert_1.default.strictEqual(decryptedRsa, password);
|
|
31
|
+
});
|
|
32
|
+
it('should encrypt the string with a rsa public key for the browser', async () => {
|
|
33
|
+
encryptedBrowserRsa = await (0, encrypt_rsa_browser_1._encryptBrowserRsa)(publicKey.toString(), password);
|
|
34
|
+
(0, assert_1.default)(encryptedBrowserRsa);
|
|
35
|
+
});
|
|
36
|
+
it('should encrypt and decrypt aes-gcm', async () => {
|
|
37
|
+
// Use encryptAesGcm and decryptAesGcm
|
|
38
|
+
const text = 'secret';
|
|
39
|
+
const gcmKey = crypto_1.default.randomBytes(32).toString('base64');
|
|
40
|
+
const encrypted = await (0, encrypt_aes_gcm_1._encryptAesGcm)(gcmKey, text);
|
|
41
|
+
const decrypted = await (0, decrypt_aes_gcm_1._decryptAesGcm)(gcmKey, encrypted);
|
|
42
|
+
assert_1.default.strictEqual(decrypted, text);
|
|
43
|
+
});
|
|
44
|
+
let encryptedRsaWithAesGcm;
|
|
45
|
+
let decryptedRsaWithAesGcm;
|
|
46
|
+
let encryptedBrowserRsaWithAesGcm;
|
|
47
|
+
let decryptedBrowserRsaWithAesGcm;
|
|
48
|
+
it('should encrypt and decrypt RsaWithAesGcm', async () => {
|
|
49
|
+
encryptedRsaWithAesGcm = await (0, network_1.encryptRsaWithAesGcm)(publicKey.toString(), password);
|
|
50
|
+
decryptedRsaWithAesGcm = await (0, network_1.decryptRsaWithAesGcm)(privateKey.toString(), encryptedRsaWithAesGcm);
|
|
51
|
+
(0, assert_1.default)(encryptedRsaWithAesGcm);
|
|
52
|
+
(0, assert_1.default)(decryptedRsaWithAesGcm);
|
|
53
|
+
});
|
|
54
|
+
it('should encrypt and decrypt RsaWithAesGcm for the browser', async () => {
|
|
55
|
+
encryptedBrowserRsaWithAesGcm = await (0, network_1.encryptBrowserRsaWithAesGcm)(publicKey.toString(), password);
|
|
56
|
+
decryptedBrowserRsaWithAesGcm = await (0, network_1.decryptRsaWithAesGcm)(privateKey.toString(), encryptedBrowserRsaWithAesGcm);
|
|
57
|
+
assert_1.default.strictEqual(decryptedBrowserRsaWithAesGcm, password);
|
|
58
|
+
assert_1.default.strictEqual(decryptedRsaWithAesGcm, decryptedBrowserRsaWithAesGcm);
|
|
59
|
+
});
|
|
60
|
+
it('should check that the encryptions for node and browser work with each other', async () => {
|
|
61
|
+
// We only care about browser and node encryption working with node decryption
|
|
62
|
+
// We will never decrypt in the browser
|
|
63
|
+
const browserEncrypted = await (0, encrypt_rsa_browser_1._encryptBrowserRsa)(publicKey.toString(), password);
|
|
64
|
+
const nodeDecrypted = await (0, decrypt_rsa_1._decryptRsa)(privateKey.toString(), browserEncrypted);
|
|
65
|
+
assert_1.default.strictEqual(nodeDecrypted, password);
|
|
66
|
+
const browserEncryptedWithAesGcm = await (0, network_1.encryptBrowserRsaWithAesGcm)(publicKey.toString(), password);
|
|
67
|
+
const nodeDecryptedWithAesGcm = await (0, network_1.decryptRsaWithAesGcm)(privateKey.toString(), browserEncryptedWithAesGcm);
|
|
68
|
+
assert_1.default.strictEqual(nodeDecryptedWithAesGcm, password);
|
|
69
|
+
});
|
|
70
|
+
});
|
|
71
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5jcnlwdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Rlc3QvdW5pdC9iaXRnby90cmFkaW5nL25ldHdvcmsvZW5jcnlwdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLG9EQUE0QjtBQUM1QixvREFBNEI7QUFDNUIsNENBQW9CO0FBQ3BCLGdEQUF3QjtBQUN4QixzRkFBbUY7QUFDbkYsc0ZBQW1GO0FBQ25GLHNHQUFrRztBQUNsRyw4RkFBMEY7QUFDMUYsOEZBQTBGO0FBQzFGLHNFQUlrRDtBQUVsRCxRQUFRLENBQUMsaUJBQWlCLEVBQUUsR0FBRyxFQUFFO0lBQy9CLE1BQU0sVUFBVSxHQUFHLFlBQUUsQ0FBQyxZQUFZLENBQUMsY0FBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsbUJBQW1CLENBQUMsQ0FBQyxDQUFDO0lBQ2pGLE1BQU0sU0FBUyxHQUFHLFlBQUUsQ0FBQyxZQUFZLENBQUMsY0FBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsa0JBQWtCLENBQUMsQ0FBQyxDQUFDO0lBRS9FLE1BQU0sUUFBUSxHQUFHLFVBQVUsQ0FBQztJQUU1QixJQUFJLFlBQVksQ0FBQztJQUNqQixJQUFJLFlBQVksQ0FBQztJQUNqQixJQUFJLG1CQUFtQixDQUFDO0lBRXhCLEVBQUUsQ0FBQyxpREFBaUQsRUFBRSxLQUFLLElBQUksRUFBRTtRQUMvRCxZQUFZLEdBQUcsTUFBTSxJQUFBLHlCQUFXLEVBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ2pFLElBQUEsZ0JBQU0sRUFBQyxZQUFZLENBQUMsQ0FBQztJQUN2QixDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyxpREFBaUQsRUFBRSxLQUFLLElBQUksRUFBRTtRQUMvRCxZQUFZLEdBQUcsTUFBTSxJQUFBLHlCQUFXLEVBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSxFQUFFLFlBQVksQ0FBQyxDQUFDO1FB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QSw4QkFBb0IsRUFBQyxVQUFVLENBQUMsUUFBUSxFQUFFLEVBQUUsMEJBQTBCLENBQUMsQ0FBQztRQUM5RyxnQkFBTSxDQUFDLFdBQVcsQ0FBQyx1QkFBdUIsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUN4RCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0IGNyeXB0byBmcm9tICdjcnlwdG8nO1xuaW1wb3J0IGZzIGZyb20gJ2ZzJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgX2RlY3J5cHRSc2EgfSBmcm9tICcuLi8uLi8uLi8uLi8uLi9zcmMvYml0Z28vdHJhZGluZy9uZXR3b3JrL2RlY3J5cHQtcnNhJztcbmltcG9ydCB7IF9lbmNyeXB0UnNhIH0gZnJvbSAnLi4vLi4vLi4vLi4vLi4vc3JjL2JpdGdvL3RyYWRpbmcvbmV0d29yay9lbmNyeXB0LXJzYSc7XG5pbXBvcnQgeyBfZW5jcnlwdEJyb3dzZXJSc2EgfSBmcm9tICcuLi8uLi8uLi8uLi8uLi9zcmMvYml0Z28vdHJhZGluZy9uZXR3b3JrL2VuY3J5cHQtcnNhLWJyb3dzZXInO1xuaW1wb3J0IHsgX2RlY3J5cHRBZXNHY20gfSBmcm9tICcuLi8uLi8uLi8uLi8uLi9zcmMvYml0Z28vdHJhZGluZy9uZXR3b3JrL2RlY3J5cHQtYWVzLWdjbSc7XG5pbXBvcnQgeyBfZW5jcnlwdEFlc0djbSB9IGZyb20gJy4uLy4uLy4uLy4uLy4uL3NyYy9iaXRnby90cmFkaW5nL25ldHdvcmsvZW5jcnlwdC1hZXMtZ2NtJztcbmltcG9ydCB7XG4gIGRlY3J5cHRSc2FXaXRoQWVzR2NtLFxuICBlbmNyeXB0QnJvd3NlclJzYVdpdGhBZXNHY20sXG4gIGVuY3J5cHRSc2FXaXRoQWVzR2NtLFxufSBmcm9tICcuLi8uLi8uLi8uLi8uLi9zcmMvYml0Z28vdHJhZGluZy9uZXR3b3JrJztcblxuZGVzY3JpYmUoJ25ldHdvcmsgZW5jcnlwdCcsICgpID0+IHtcbiAgY29uc3QgcHJpdmF0ZUtleSA9IGZzLnJlYWRGaWxlU3luYyhwYXRoLnJlc29sdmUoX19kaXJuYW1lLCAnLi9wcml2YXRlLWtleS5wZW0nKSk7XG4gIGNvbnN0IHB1YmxpY0tleSA9IGZzLnJlYWRGaWxlU3luYyhwYXRoLnJlc29sdmUoX19kaXJuYW1lLCAnLi9wdWJsaWMta2V5LnB1YicpKTtcblxuICBjb25zdCBwYXNzd29yZCA9ICdwYXNzd29yZCc7XG5cbiAgbGV0IGVuY3J5cHRlZFJzYTtcbiAgbGV0IGRlY3J5cHRlZFJzYTtcbiAgbGV0IGVuY3J5cHRlZEJyb3dzZXJSc2E7XG5cbiAgaXQoJ3Nob3VsZCBlbmNyeXB0IHRoZSBzdHJpbmcgd2l0aCBhIHJzYSBwdWJsaWMga2V5JywgYXN5bmMgKCkgPT4ge1xuICAgIGVuY3J5cHRlZFJzYSA9IGF3YWl0IF9lbmNyeXB0UnNhKHB1YmxpY0tleS50b1N0cmluZygpLCBwYXNzd29yZCk7XG4gICAgYXNzZXJ0KGVuY3J5cHRlZFJzYSk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgZGVjcnlwdCB0aGUgc3RyaW5nIHdpdGggYSByc2EgcHVibGljIGtleScsIGFzeW5jICgpID0+IHtcbiAgICBkZWNyeXB0ZWRSc2EgPSBhd2FpdCBfZGVjcnlwdFJzYShwcml2YXRlS2V5LnRvU3RyaW5nKCksIGVuY3J5cHRlZFJzYSk7XG4gICAgYXNzZXJ0KGRlY3J5cHRlZFJzYSk7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKGRlY3J5cHRlZFJzYSwgcGFzc3dvcmQpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGVuY3J5cHQgdGhlIHN0cmluZyB3aXRoIGEgcnNhIHB1YmxpYyBrZXkgZm9yIHRoZSBicm93c2VyJywgYXN5bmMgKCkgPT4ge1xuICAgIGVuY3J5cHRlZEJyb3dzZXJSc2EgPSBhd2FpdCBfZW5jcnlwdEJyb3dzZXJSc2EocHVibGljS2V5LnRvU3RyaW5nKCksIHBhc3N3b3JkKTtcbiAgICBhc3NlcnQoZW5jcnlwdGVkQnJvd3NlclJzYSk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgZW5jcnlwdCBhbmQgZGVjcnlwdCBhZXMtZ2NtJywgYXN5bmMgKCkgPT4ge1xuICAgIC8vIFVzZSBlbmNyeXB0QWVzR2NtIGFuZCBkZWNyeXB0QWVzR2NtXG4gICAgY29uc3QgdGV4dCA9ICdzZWNyZXQnO1xuICAgIGNvbnN0IGdjbUtleSA9IGNyeXB0by5yYW5kb21CeXRlcygzMikudG9TdHJpbmcoJ2Jhc2U2NCcpO1xuICAgIGNvbnN0IGVuY3J5cHRlZCA9IGF3YWl0IF9lbmNyeXB0QWVzR2NtKGdjbUtleSwgdGV4dCk7XG4gICAgY29uc3QgZGVjcnlwdGVkID0gYXdhaXQgX2RlY3J5cHRBZXNHY20oZ2NtS2V5LCBlbmNyeXB0ZWQpO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbChkZWNyeXB0ZWQsIHRleHQpO1xuICB9KTtcblxuICBsZXQgZW5jcnlwdGVkUnNhV2l0aEFlc0djbTtcbiAgbGV0IGRlY3J5cHRlZFJzYVdpdGhBZXNHY207XG4gIGxldCBlbmNyeXB0ZWRCcm93c2VyUnNhV2l0aEFlc0djbTtcbiAgbGV0IGRlY3J5cHRlZEJyb3dzZXJSc2FXaXRoQWVzR2NtO1xuXG4gIGl0KCdzaG91bGQgZW5jcnlwdCBhbmQgZGVjcnlwdCBSc2FXaXRoQWVzR2NtJywgYXN5bmMgKCkgPT4ge1xuICAgIGVuY3J5cHRlZFJzYVdpdGhBZXNHY20gPSBhd2FpdCBlbmNyeXB0UnNhV2l0aEFlc0djbShwdWJsaWNLZXkudG9TdHJpbmcoKSwgcGFzc3dvcmQpO1xuICAgIGRlY3J5cHRlZFJzYVdpdGhBZXNHY20gPSBhd2FpdCBkZWNyeXB0UnNhV2l0aEFlc0djbShwcml2YXRlS2V5LnRvU3RyaW5nKCksIGVuY3J5cHRlZFJzYVdpdGhBZXNHY20pO1xuICAgIGFzc2VydChlbmNyeXB0ZWRSc2FXaXRoQWVzR2NtKTtcbiAgICBhc3NlcnQoZGVjcnlwdGVkUnNhV2l0aEFlc0djbSk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgZW5jcnlwdCBhbmQgZGVjcnlwdCBSc2FXaXRoQWVzR2NtIGZvciB0aGUgYnJvd3NlcicsIGFzeW5jICgpID0+IHtcbiAgICBlbmNyeXB0ZWRCcm93c2VyUnNhV2l0aEFlc0djbSA9IGF3YWl0IGVuY3J5cHRCcm93c2VyUnNhV2l0aEFlc0djbShwdWJsaWNLZXkudG9TdHJpbmcoKSwgcGFzc3dvcmQpO1xuICAgIGRlY3J5cHRlZEJyb3dzZXJSc2FXaXRoQWVzR2NtID0gYXdhaXQgZGVjcnlwdFJzYVdpdGhBZXNHY20ocHJpdmF0ZUtleS50b1N0cmluZygpLCBlbmNyeXB0ZWRCcm93c2VyUnNhV2l0aEFlc0djbSk7XG5cbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwoZGVjcnlwdGVkQnJvd3NlclJzYVdpdGhBZXNHY20sIHBhc3N3b3JkKTtcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwoZGVjcnlwdGVkUnNhV2l0aEFlc0djbSwgZGVjcnlwdGVkQnJvd3NlclJzYVdpdGhBZXNHY20pO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGNoZWNrIHRoYXQgdGhlIGVuY3J5cHRpb25zIGZvciBub2RlIGFuZCBicm93c2VyIHdvcmsgd2l0aCBlYWNoIG90aGVyJywgYXN5bmMgKCkgPT4ge1xuICAgIC8vIFdlIG9ubHkgY2FyZSBhYm91dCBicm93c2VyIGFuZCBub2RlIGVuY3J5cHRpb24gd29ya2luZyB3aXRoIG5vZGUgZGVjcnlwdGlvblxuICAgIC8vIFdlIHdpbGwgbmV2ZXIgZGVjcnlwdCBpbiB0aGUgYnJvd3NlclxuXG4gICAgY29uc3QgYnJvd3NlckVuY3J5cHRlZCA9IGF3YWl0IF9lbmNyeXB0QnJvd3NlclJzYShwdWJsaWNLZXkudG9TdHJpbmcoKSwgcGFzc3dvcmQpO1xuICAgIGNvbnN0IG5vZGVEZWNyeXB0ZWQgPSBhd2FpdCBfZGVjcnlwdFJzYShwcml2YXRlS2V5LnRvU3RyaW5nKCksIGJyb3dzZXJFbmNyeXB0ZWQpO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbChub2RlRGVjcnlwdGVkLCBwYXNzd29yZCk7XG5cbiAgICBjb25zdCBicm93c2VyRW5jcnlwdGVkV2l0aEFlc0djbSA9IGF3YWl0IGVuY3J5cHRCcm93c2VyUnNhV2l0aEFlc0djbShwdWJsaWNLZXkudG9TdHJpbmcoKSwgcGFzc3dvcmQpO1xuICAgIGNvbnN0IG5vZGVEZWNyeXB0ZWRXaXRoQWVzR2NtID0gYXdhaXQgZGVjcnlwdFJzYVdpdGhBZXNHY20ocHJpdmF0ZUtleS50b1N0cmluZygpLCBicm93c2VyRW5jcnlwdGVkV2l0aEFlc0djbSk7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKG5vZGVEZWNyeXB0ZWRXaXRoQWVzR2NtLCBwYXNzd29yZCk7XG4gIH0pO1xufSk7XG4iXX0=
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tradingAccount.d.ts","sourceRoot":"","sources":["../../../../../test/unit/bitgo/trading/tradingAccount.ts"],"names":[],"mappings":"AAIA,OAAO,QAAQ,CAAC"}
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
/**
|
|
7
|
+
* @prettier
|
|
8
|
+
*/
|
|
9
|
+
const sinon_1 = __importDefault(require("sinon"));
|
|
10
|
+
require("should");
|
|
11
|
+
const tradingAccount_1 = require("../../../../src/bitgo/trading/tradingAccount");
|
|
12
|
+
describe('TradingAccount', function () {
|
|
13
|
+
let tradingAccount;
|
|
14
|
+
let userKeyRequiredTradingAccount;
|
|
15
|
+
let mockBitGo;
|
|
16
|
+
let mockWallet;
|
|
17
|
+
let mockUserKeyRequiredWallet;
|
|
18
|
+
let mockBaseCoin;
|
|
19
|
+
let sendStub;
|
|
20
|
+
const enterpriseId = 'test-enterprise-id';
|
|
21
|
+
const walletPassphrase = 'test-passphrase';
|
|
22
|
+
const encryptedPrv = 'encrypted-prv';
|
|
23
|
+
const decryptedPrv = 'decrypted-prv';
|
|
24
|
+
const signature = 'aabbccdd';
|
|
25
|
+
const payload = { data: 'test-payload' };
|
|
26
|
+
const payloadString = JSON.stringify(payload);
|
|
27
|
+
beforeEach(function () {
|
|
28
|
+
sendStub = sinon_1.default.stub();
|
|
29
|
+
sendStub.withArgs({ payload: payloadString }).returns({ result: sinon_1.default.stub().resolves({ signature }) });
|
|
30
|
+
mockBitGo = {
|
|
31
|
+
post: sinon_1.default.stub().returns({ send: sendStub }),
|
|
32
|
+
coin: sinon_1.default.stub().callsFake((coin) => ({
|
|
33
|
+
url: sinon_1.default.stub().callsFake((url) => `https://app.bitgo-staging.com/api/v2/${coin}${url}`),
|
|
34
|
+
})),
|
|
35
|
+
decryptAsync: sinon_1.default
|
|
36
|
+
.stub()
|
|
37
|
+
.callsFake(async ({ input, password }) => input === encryptedPrv && password === walletPassphrase ? decryptedPrv : undefined),
|
|
38
|
+
};
|
|
39
|
+
mockBaseCoin = {
|
|
40
|
+
keychains: sinon_1.default.stub().returns({
|
|
41
|
+
get: sinon_1.default.stub().resolves({ encryptedPrv }),
|
|
42
|
+
}),
|
|
43
|
+
signMessage: sinon_1.default.stub().callsFake(async (key) => {
|
|
44
|
+
if (key.prv === decryptedPrv) {
|
|
45
|
+
return Buffer.from(signature, 'hex');
|
|
46
|
+
}
|
|
47
|
+
throw new Error(`signMessage called with unexpected prv: ${key.prv}`);
|
|
48
|
+
}),
|
|
49
|
+
};
|
|
50
|
+
mockWallet = {
|
|
51
|
+
id: sinon_1.default.stub().returns('test-wallet-id'),
|
|
52
|
+
keyIds: sinon_1.default.stub().returns(['user-key-id', 'bitgo-key-id']),
|
|
53
|
+
toJSON: sinon_1.default.stub().returns({
|
|
54
|
+
id: 'test-wallet-id',
|
|
55
|
+
keys: ['user-key-id', 'backup-key-id', 'bitgo-key-id'],
|
|
56
|
+
coinSpecific: {
|
|
57
|
+
userKeySigningRequired: false,
|
|
58
|
+
},
|
|
59
|
+
}),
|
|
60
|
+
baseCoin: mockBaseCoin,
|
|
61
|
+
bitgo: mockBitGo,
|
|
62
|
+
};
|
|
63
|
+
mockUserKeyRequiredWallet = {
|
|
64
|
+
...mockWallet,
|
|
65
|
+
toJSON: sinon_1.default.stub().returns({
|
|
66
|
+
id: 'test-wallet-id',
|
|
67
|
+
keys: ['user-key-id', 'backup-key-id', 'bitgo-key-id'],
|
|
68
|
+
coinSpecific: {
|
|
69
|
+
userKeySigningRequired: true,
|
|
70
|
+
},
|
|
71
|
+
}),
|
|
72
|
+
};
|
|
73
|
+
tradingAccount = new tradingAccount_1.TradingAccount(enterpriseId, mockWallet, mockBitGo);
|
|
74
|
+
userKeyRequiredTradingAccount = new tradingAccount_1.TradingAccount(enterpriseId, mockUserKeyRequiredWallet, mockBitGo);
|
|
75
|
+
});
|
|
76
|
+
afterEach(function () {
|
|
77
|
+
sinon_1.default.restore();
|
|
78
|
+
});
|
|
79
|
+
describe('id', function () {
|
|
80
|
+
it('should return the wallet id', function () {
|
|
81
|
+
tradingAccount.id.should.equal('test-wallet-id');
|
|
82
|
+
mockWallet.id.calledOnce.should.be.true();
|
|
83
|
+
});
|
|
84
|
+
});
|
|
85
|
+
describe('signPayload', function () {
|
|
86
|
+
it('should call the right url', async function () {
|
|
87
|
+
const expectedUrl = `https://app.bitgo-staging.com/api/v2/ofc/wallet/test-wallet-id/tx/sign`;
|
|
88
|
+
await tradingAccount.signPayload({ payload });
|
|
89
|
+
mockBitGo.post.calledWith(expectedUrl).should.be.true();
|
|
90
|
+
});
|
|
91
|
+
describe('without walletPassphrase or prv (BitGo remote signing)', function () {
|
|
92
|
+
it('should sign using the BitGo key remotely when no passphrase is provided', async function () {
|
|
93
|
+
const result = await tradingAccount.signPayload({ payload });
|
|
94
|
+
mockBitGo.post.calledOnce.should.be.true();
|
|
95
|
+
sendStub.calledWith({ payload: JSON.stringify(payload) }).should.be.true();
|
|
96
|
+
result.should.equal(signature);
|
|
97
|
+
});
|
|
98
|
+
it('should sign a string payload remotely when no passphrase is provided', async function () {
|
|
99
|
+
const result = await tradingAccount.signPayload({ payload: payloadString });
|
|
100
|
+
sendStub.calledWith({ payload: payloadString }).should.be.true();
|
|
101
|
+
result.should.equal(signature);
|
|
102
|
+
});
|
|
103
|
+
it('should throw if coinSpecific.userKeySigningRequired is true and no passphrase and prv are provided', async function () {
|
|
104
|
+
await userKeyRequiredTradingAccount
|
|
105
|
+
.signPayload({ payload })
|
|
106
|
+
.should.be.rejectedWith('Wallet must use user key to sign ofc transaction, please provide the wallet passphrase, the private key, or visit your wallet settings page to configure one.');
|
|
107
|
+
});
|
|
108
|
+
it('should fall back to top-level userKeySigningRequired when coinSpecific does not carry it', async function () {
|
|
109
|
+
await userKeyRequiredTradingAccount
|
|
110
|
+
.signPayload({ payload })
|
|
111
|
+
.should.be.rejectedWith('Wallet must use user key to sign ofc transaction, please provide the wallet passphrase, the private key, or visit your wallet settings page to configure one.');
|
|
112
|
+
});
|
|
113
|
+
it('should prefer coinSpecific.userKeySigningRequired over top-level when both are present', async function () {
|
|
114
|
+
mockWallet.toJSON.onCall(mockWallet.toJSON.callCount).returns({
|
|
115
|
+
id: 'test-wallet-id',
|
|
116
|
+
keys: ['user-key-id', 'backup-key-id', 'bitgo-key-id'],
|
|
117
|
+
coinSpecific: { userKeySigningRequired: false },
|
|
118
|
+
userKeySigningRequired: true,
|
|
119
|
+
});
|
|
120
|
+
const result = await tradingAccount.signPayload({ payload });
|
|
121
|
+
result.should.equal(signature);
|
|
122
|
+
});
|
|
123
|
+
it('should throw if wallet has fewer than 2 keys and no passphrase and prv are provided', async function () {
|
|
124
|
+
mockWallet.toJSON.onCall(mockWallet.toJSON.callCount).returns({
|
|
125
|
+
id: 'test-wallet-id',
|
|
126
|
+
keys: ['user-key-id'],
|
|
127
|
+
coinSpecific: {},
|
|
128
|
+
});
|
|
129
|
+
await tradingAccount
|
|
130
|
+
.signPayload({ payload })
|
|
131
|
+
.should.be.rejectedWith('Wallet does not support BitGo signing. Please reach out to support@bitgo.com to resolve this issue.');
|
|
132
|
+
});
|
|
133
|
+
});
|
|
134
|
+
describe('with walletPassphrase (local user key signing)', function () {
|
|
135
|
+
it('should decrypt the user key and sign the payload locally', async function () {
|
|
136
|
+
const result = await tradingAccount.signPayload({ payload, walletPassphrase });
|
|
137
|
+
mockBaseCoin.keychains().get.calledWith({ id: 'user-key-id' }).should.be.true();
|
|
138
|
+
mockBitGo.decryptAsync.calledWith({ input: encryptedPrv, password: walletPassphrase }).should.be.true();
|
|
139
|
+
mockBaseCoin.signMessage.calledOnce.should.be.true();
|
|
140
|
+
result.should.equal(Buffer.from(signature, 'hex').toString('hex'));
|
|
141
|
+
});
|
|
142
|
+
it('should stringify a Record payload before signing locally', async function () {
|
|
143
|
+
await tradingAccount.signPayload({ payload, walletPassphrase });
|
|
144
|
+
const signMessageCall = mockBaseCoin.signMessage.getCall(0);
|
|
145
|
+
signMessageCall.args[1].should.equal(JSON.stringify(payload));
|
|
146
|
+
});
|
|
147
|
+
it('should pass a string payload directly to signMessage', async function () {
|
|
148
|
+
await tradingAccount.signPayload({ payload: payloadString, walletPassphrase });
|
|
149
|
+
const signMessageCall = mockBaseCoin.signMessage.getCall(0);
|
|
150
|
+
signMessageCall.args[1].should.equal(payloadString);
|
|
151
|
+
});
|
|
152
|
+
});
|
|
153
|
+
describe('with both walletPassphrase and prv', function () {
|
|
154
|
+
it('should use prv directly and not call decrypt when both are provided', async function () {
|
|
155
|
+
await tradingAccount.signPayload({ payload, walletPassphrase, prv: decryptedPrv });
|
|
156
|
+
mockBitGo.decryptAsync.called.should.be.false();
|
|
157
|
+
mockBaseCoin.keychains.called.should.be.false();
|
|
158
|
+
const signMessageCall = mockBaseCoin.signMessage.getCall(0);
|
|
159
|
+
signMessageCall.args[0].should.deepEqual({ prv: decryptedPrv });
|
|
160
|
+
});
|
|
161
|
+
});
|
|
162
|
+
describe('with prv (local user key signing without decryption)', function () {
|
|
163
|
+
it('should sign using the provided prv without calling decrypt', async function () {
|
|
164
|
+
const result = await tradingAccount.signPayload({ payload, prv: decryptedPrv });
|
|
165
|
+
mockBitGo.decryptAsync.called.should.be.false();
|
|
166
|
+
mockBaseCoin.keychains.called.should.be.false();
|
|
167
|
+
mockBaseCoin.signMessage.calledOnce.should.be.true();
|
|
168
|
+
result.should.equal(Buffer.from(signature, 'hex').toString('hex'));
|
|
169
|
+
});
|
|
170
|
+
it('should not use BitGo remote signing when prv is provided', async function () {
|
|
171
|
+
await tradingAccount.signPayload({ payload, prv: decryptedPrv });
|
|
172
|
+
mockBitGo.post.called.should.be.false();
|
|
173
|
+
});
|
|
174
|
+
it('should pass the prv directly to signMessage', async function () {
|
|
175
|
+
await tradingAccount.signPayload({ payload, prv: decryptedPrv });
|
|
176
|
+
const signMessageCall = mockBaseCoin.signMessage.getCall(0);
|
|
177
|
+
signMessageCall.args[0].should.deepEqual({ prv: decryptedPrv });
|
|
178
|
+
});
|
|
179
|
+
it('should stringify a Record payload before signing with prv', async function () {
|
|
180
|
+
await tradingAccount.signPayload({ payload, prv: decryptedPrv });
|
|
181
|
+
const signMessageCall = mockBaseCoin.signMessage.getCall(0);
|
|
182
|
+
signMessageCall.args[1].should.equal(JSON.stringify(payload));
|
|
183
|
+
});
|
|
184
|
+
it('should pass a string payload directly to signMessage when signing with prv', async function () {
|
|
185
|
+
await tradingAccount.signPayload({ payload: payloadString, prv: decryptedPrv });
|
|
186
|
+
const signMessageCall = mockBaseCoin.signMessage.getCall(0);
|
|
187
|
+
signMessageCall.args[1].should.equal(payloadString);
|
|
188
|
+
});
|
|
189
|
+
});
|
|
190
|
+
});
|
|
191
|
+
});
|
|
192
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhZGluZ0FjY291bnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi90ZXN0L3VuaXQvYml0Z28vdHJhZGluZy90cmFkaW5nQWNjb3VudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBOztHQUVHO0FBQ0gsa0RBQTBCO0FBQzFCLGtCQUFnQjtBQUNoQixpRkFBOEU7QUFFOUUsUUFBUSxDQUFDLGdCQUFnQixFQUFFO0lBQ3pCLElBQUksY0FBOEIsQ0FBQztJQUNuQyxJQUFJLDZCQUE2QyxDQUFDO0lBQ2xELElBQUksU0FBYyxDQUFDO0lBQ25CLElBQUksVUFBZSxDQUFDO0lBQ3BCLElBQUkseUJBQThCLENBQUM7SUFDbkMsSUFBSSxZQUFpQixDQUFDO0lBQ3RCLElBQUksUUFBeUIsQ0FBQztJQUU5QixNQUFNLFlBQVksR0FBRyxvQkFBb0IsQ0FBQztJQUMxQyxNQUFNLGdCQUFnQixHQUFHLGlCQUFpQixDQUFDO0lBQzNDLE1BQU0sWUFBWSxHQUFHLGVBQWUsQ0FBQztJQUNyQyxNQUFNLFlBQVksR0FBRyxlQUFlLENBQUM7SUFDckMsTUFBTSxTQUFTLEdBQUcsVUFBVSxDQUFDO0lBQzdCLE1BQU0sT0FBTyxHQUFHLEVBQUUsSUFBSSxFQUFFLGNBQWMsRUFBRSxDQUFDO0lBQ3pDLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUM7SUFFOUMsVUFBVSxDQUFDO1FBQ1QsUUFBUSxHQUFHLGVBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUN4QixRQUFRLENBQUMsUUFBUSxDQUFDLEVBQUUsT0FBTyxFQUFFLGFBQWEsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsTUFBTSxFQUFFLGVBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxRQUFRLENBQUMsRUFBRSxTQUFTLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUV4RyxTQUFTLEdBQUc7WUFDVixJQUFJLEVBQUUsZUFB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LENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLENBQUM7WUFDdEQsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBwcmV0dGllclxuICovXG5pbXBvcnQgc2lub24gZnJvbSAnc2lub24nO1xuaW1wb3J0ICdzaG91bGQnO1xuaW1wb3J0IHsgVHJhZGluZ0FjY291bnQgfSBmcm9tICcuLi8uLi8uLi8uLi9zcmMvYml0Z28vdHJhZGluZy90cmFkaW5nQWNjb3VudCc7XG5cbmRlc2NyaWJlKCdUcmFkaW5nQWNjb3VudCcsIGZ1bmN0aW9uICgpIHtcbiAgbGV0IHRyYWRpbmdBY2NvdW50OiBUcmFkaW5nQWNjb3VudDtcbiAgbGV0IHVzZXJLZXlSZXF1aXJlZFRyYWRpbmdBY2NvdW50OiBUcmFkaW5nQWNjb3VudDtcbiAgbGV0IG1vY2tCaXRHbzogYW55O1xuICBsZXQgbW9ja1dhbGxldDogYW55O1xuICBsZXQgbW9ja1VzZXJLZXlSZXF1aXJlZFdhbGxldDogYW55O1xuICBsZXQgbW9ja0Jhc2VDb2luOiBhbnk7XG4gIGxldCBzZW5kU3R1Yjogc2lub24uU2lub25TdHViO1xuXG4gIGNvbnN0IGVudGVycHJpc2VJZCA9ICd0ZXN0LWVudGVycHJpc2UtaWQnO1xuICBjb25zdCB3YWxsZXRQYXNzcGhyYXNlID0gJ3Rlc3QtcGFzc3BocmFzZSc7XG4gIGNvbnN0IGVuY3J5cHRlZFBydiA9ICdlbmNyeXB0ZWQtcHJ2JztcbiAgY29uc3QgZGVjcnlwdGVkUHJ2ID0gJ2RlY3J5cHRlZC1wcnYnO1xuICBjb25zdCBzaWduYXR1cmUgPSAnYWFiYmNjZGQnO1xuICBjb25zdCBwYXlsb2FkID0geyBkYXRhOiAndGVzdC1wYXlsb2FkJyB9O1xuICBjb25zdCBwYXlsb2FkU3RyaW5nID0gSlNPTi5zdHJpbmdpZnkocGF5bG9hZCk7XG5cbiAgYmVmb3JlRWFjaChmdW5jdGlvbiAoKSB7XG4gICAgc2VuZFN0dWIgPSBzaW5vbi5zdHViKCk7XG4gICAgc2VuZFN0dWIud2l0aEFyZ3MoeyBwYXlsb2FkOiBwYXlsb2FkU3RyaW5nIH0pLnJldHVybnMoeyByZXN1bHQ6IHNpbm9uLnN0dWIoKS5yZXNvbHZlcyh7IHNpZ25hdHVyZSB9KSB9KTtcblxuICAgIG1vY2tCaXRHbyA9IHtcbiAgICAgIHBvc3Q6IHNpbm9uLnN0dWIoKS5yZXR1cm5zKHsgc2VuZDogc2VuZFN0dWIgfSksXG4gICAgICBjb2luOiBzaW5vbi5zdHViKCkuY2FsbHNGYWtlKChjb2luOiBzdHJpbmcpID0+ICh7XG4gICAgICAgIHVybDogc2lub24uc3R1YigpLmNhbGxzRmFrZSgodXJsOiBzdHJpbmcpID0+IGBodHRwczovL2FwcC5iaXRnby1zdGFnaW5nLmNvbS9hcGkvdjIvJHtjb2lufSR7dXJsfWApLFxuICAgICAgfSkpLFxuICAgICAgZGVjcnlwdEFzeW5jOiBzaW5vblxuICAgICAgICAuc3R1YigpXG4gICAgICAgIC5jYWxsc0Zha2UoYXN5bmMgKHsgaW5wdXQsIHBhc3N3b3JkIH0pID0+XG4gICAgICAgICAgaW5wdXQgPT09IGVuY3J5cHRlZFBydiAmJiBwYXNzd29yZCA9PT0gd2FsbGV0UGFzc3BocmFzZSA/IGRlY3J5cHRlZFBydiA6IHVuZGVmaW5lZFxuICAgICAgICApLFxuICAgIH07XG5cbiAgICBtb2NrQmFzZUNvaW4gPSB7XG4gICAgICBrZXljaGFpbnM6IHNpbm9uLnN0dWIoKS5yZXR1cm5zKHtcbiAgICAgICAgZ2V0OiBzaW5vbi5zdHViKCkucmVzb2x2ZXMoeyBlbmNyeXB0ZWRQcnYgfSksXG4gICAgICB9KSxcbiAgICAgIHNpZ25NZXNzYWdlOiBzaW5vbi5zdHViKCkuY2FsbHNGYWtlKGFzeW5jIChrZXk6IHsgcHJ2OiBzdHJpbmcgfSkgPT4ge1xuICAgICAgICBpZiAoa2V5LnBydiA9PT0gZGVjcnlwdGVkUHJ2KSB7XG4gICAgICAgICAgcmV0dXJuIEJ1ZmZlci5mcm9tKHNpZ25hdHVyZSwgJ2hleCcpO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgc2lnbk1lc3NhZ2UgY2FsbGVkIHdpdGggdW5leHBlY3RlZCBwcnY6ICR7a2V5LnBydn1gKTtcbiAgICAgIH0pLFxuICAgIH07XG5cbiAgICBtb2NrV2FsbGV0ID0ge1xuICAgICAgaWQ6IHNpbm9uLnN0dWIoKS5yZXR1cm5zKCd0ZXN0LXdhbGxldC1pZCcpLFxuICAgICAga2V5SWRzOiBzaW5vbi5zdHViKCkucmV0dXJucyhbJ3VzZXIta2V5LWlkJywgJ2JpdGdvLWtleS1pZCddKSxcbiAgICAgIHRvSlNPTjogc2lub24uc3R1YigpLnJldHVybnMoe1xuICAgICAgICBpZDogJ3Rlc3Qtd2FsbGV0LWlkJyxcbiAgICAgICAga2V5czogWyd1c2VyLWtleS1pZCcsICdiYWNrdXAta2V5LWlkJywgJ2JpdGdvLWtleS1pZCddLFxuICAgICAgICBjb2luU3BlY2lmaWM6IHtcbiAgICAgICAgICB1c2VyS2V5U2lnbmluZ1JlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICAgIH0pLFxuICAgICAgYmFzZUNvaW46IG1vY2tCYXNlQ29pbixcbiAgICAgIGJpdGdvOiBtb2NrQml0R28sXG4gICAgfTtcblxuICAgIG1vY2tVc2VyS2V5UmVxdWlyZWRXYWxsZXQgPSB7XG4gICAgICAuLi5tb2NrV2FsbGV0LFxuICAgICAgdG9KU09OOiBzaW5vbi5zdHViKCkucmV0dXJucyh7XG4gICAgICAgIGlkOiAndGVzdC13YWxsZXQtaWQnLFxuICAgICAgICBrZXlzOiBbJ3VzZXIta2V5LWlkJywgJ2JhY2t1cC1rZXktaWQnLCAnYml0Z28ta2V5LWlkJ10sXG4gICAgICAgIGNvaW5TcGVjaWZpYzoge1xuICAgICAgICAgIHVzZXJLZXlTaWduaW5nUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgIH0sXG4gICAgICB9KSxcbiAgICB9O1xuXG4gICAgdHJhZGluZ0FjY291bnQgPSBuZXcgVHJhZGluZ0FjY291bnQoZW50ZXJwcmlzZUlkLCBtb2NrV2FsbGV0LCBtb2NrQml0R28pO1xuICAgIHVzZXJLZXlSZXF1aXJlZFRyYWRpbmdBY2NvdW50ID0gbmV3IFRyYWRpbmdBY2NvdW50KGVudGVycHJpc2VJZCwgbW9ja1VzZXJLZXlSZXF1aXJlZFdhbGxldCwgbW9ja0JpdEdvKTtcbiAgfSk7XG5cbiAgYWZ0ZXJFYWNoKGZ1bmN0aW9uICgpIHtcbiAgICBzaW5vbi5yZXN0b3JlKCk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdpZCcsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIHJldHVybiB0aGUgd2FsbGV0IGlkJywgZnVuY3Rpb24gKCkge1xuICAgICAgdHJhZGluZ0FjY291bnQuaWQuc2hvdWxkLmVxdWFsKCd0ZXN0LXdhbGxldC1pZCcpO1xuICAgICAgbW9ja1dhbGxldC5pZC5jYWxsZWRPbmNlLnNob3VsZC5iZS50cnVlKCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdzaWduUGF5bG9hZCcsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIGNhbGwgdGhlIHJpZ2h0IHVybCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGV4cGVjdGVkVXJsID0gYGh0dHBzOi8vYXBwLmJpdGdvLXN0YWdpbmcuY29tL2FwaS92Mi9vZmMvd2FsbGV0L3Rlc3Qtd2FsbGV0LWlkL3R4L3NpZ25gO1xuICAgICAgYXdhaXQgdHJhZGluZ0FjY291bnQuc2lnblBheWxvYWQoeyBwYXlsb2FkIH0pO1xuICAgICAgbW9ja0JpdEdvLnBvc3QuY2FsbGVkV2l0aChleHBlY3RlZFVybCkuc2hvdWxkLmJlLnRydWUoKTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCd3aXRob3V0IHdhbGxldFBhc3NwaHJhc2Ugb3IgcHJ2IChCaXRHbyByZW1vdGUgc2lnbmluZyknLCBmdW5jdGlvbiAoKSB7XG4gICAgICBpdCgnc2hvdWxkIHNpZ24gdXNpbmcgdGhlIEJpdEdvIGtleSByZW1vdGVseSB3aGVuIG5vIHBhc3NwaHJhc2UgaXMgcHJvdmlkZWQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRyYWRpbmdBY2NvdW50LnNpZ25QYXlsb2FkKHsgcGF5bG9hZCB9KTtcblxuICAgICAgICBtb2NrQml0R28ucG9zdC5jYWxsZWRPbmNlLnNob3VsZC5iZS50cnVlKCk7XG4gICAgICAgIHNlbmRTdHViLmNhbGxlZFdpdGgoeyBwYXlsb2FkOiBKU09OLnN0cmluZ2lmeShwYXlsb2FkKSB9KS5zaG91bGQuYmUudHJ1ZSgpO1xuICAgICAgICByZXN1bHQuc2hvdWxkLmVxdWFsKHNpZ25hdHVyZSk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBzaWduIGEgc3RyaW5nIHBheWxvYWQgcmVtb3RlbHkgd2hlbiBubyBwYXNzcGhyYXNlIGlzIHByb3ZpZGVkJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0cmFkaW5nQWNjb3VudC5zaWduUGF5bG9hZCh7IHBheWxvYWQ6IHBheWxvYWRTdHJpbmcgfSk7XG4gICAgICAgIHNlbmRTdHViLmNhbGxlZFdpdGgoeyBwYXlsb2FkOiBwYXlsb2FkU3RyaW5nIH0pLnNob3VsZC5iZS50cnVlKCk7XG4gICAgICAgIHJlc3VsdC5zaG91bGQuZXF1YWwoc2lnbmF0dXJlKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIHRocm93IGlmIGNvaW5TcGVjaWZpYy51c2VyS2V5U2lnbmluZ1JlcXVpcmVkIGlzIHRydWUgYW5kIG5vIHBhc3NwaHJhc2UgYW5kIHBydiBhcmUgcHJvdmlkZWQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGF3YWl0IHVzZXJLZXlSZXF1aXJlZFRyYWRpbmdBY2NvdW50XG4gICAgICAgICAgLnNpZ25QYXlsb2FkKHsgcGF5bG9hZCB9KVxuICAgICAgICAgIC5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKFxuICAgICAgICAgICAgJ1dhbGxldCBtdXN0IHVzZSB1c2VyIGtleSB0byBzaWduIG9mYyB0cmFuc2FjdGlvbiwgcGxlYXNlIHByb3ZpZGUgdGhlIHdhbGxldCBwYXNzcGhyYXNlLCB0aGUgcHJpdmF0ZSBrZXksIG9yIHZpc2l0IHlvdXIgd2FsbGV0IHNldHRpbmdzIHBhZ2UgdG8gY29uZmlndXJlIG9uZS4nXG4gICAgICAgICAgKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIGZhbGwgYmFjayB0byB0b3AtbGV2ZWwgdXNlcktleVNpZ25pbmdSZXF1aXJlZCB3aGVuIGNvaW5TcGVjaWZpYyBkb2VzIG5vdCBjYXJyeSBpdCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgYXdhaXQgdXNlcktleVJlcXVpcmVkVHJhZGluZ0FjY291bnRcbiAgICAgICAgICAuc2lnblBheWxvYWQoeyBwYXlsb2FkIH0pXG4gICAgICAgICAgLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoXG4gICAgICAgICAgICAnV2FsbGV0IG11c3QgdXNlIHVzZXIga2V5IHRvIHNpZ24gb2ZjIHRyYW5zYWN0aW9uLCBwbGVhc2UgcHJvdmlkZSB0aGUgd2FsbGV0IHBhc3NwaHJhc2UsIHRoZSBwcml2YXRlIGtleSwgb3IgdmlzaXQgeW91ciB3YWxsZXQgc2V0dGluZ3MgcGFnZSB0byBjb25maWd1cmUgb25lLidcbiAgICAgICAgICApO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgcHJlZmVyIGNvaW5TcGVjaWZpYy51c2VyS2V5U2lnbmluZ1JlcXVpcmVkIG92ZXIgdG9wLWxldmVsIHdoZW4gYm90aCBhcmUgcHJlc2VudCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgbW9ja1dhbGxldC50b0pTT04ub25DYWxsKG1vY2tXYWxsZXQudG9KU09OLmNhbGxDb3VudCkucmV0dXJucyh7XG4gICAgICAgICAgaWQ6ICd0ZXN0LXdhbGxldC1pZCcsXG4gICAgICAgICAga2V5czogWyd1c2VyLWtleS1pZCcsICdiYWNrdXAta2V5LWlkJywgJ2JpdGdvLWtleS1pZCddLFxuICAgICAgICAgIGNvaW5TcGVjaWZpYzogeyB1c2VyS2V5U2lnbmluZ1JlcXVpcmVkOiBmYWxzZSB9LFxuICAgICAgICAgIHVzZXJLZXlTaWduaW5nUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRyYWRpbmdBY2NvdW50LnNpZ25QYXlsb2FkKHsgcGF5bG9hZCB9KTtcbiAgICAgICAgcmVzdWx0LnNob3VsZC5lcXVhbChzaWduYXR1cmUpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgdGhyb3cgaWYgd2FsbGV0IGhhcyBmZXdlciB0aGFuIDIga2V5cyBhbmQgbm8gcGFzc3BocmFzZSBhbmQgcHJ2IGFyZSBwcm92aWRlZCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgbW9ja1dhbGxldC50b0pTT04ub25DYWxsKG1vY2tXYWxsZXQudG9KU09OLmNhbGxDb3VudCkucmV0dXJucyh7XG4gICAgICAgICAgaWQ6ICd0ZXN0LXdhbGxldC1pZCcsXG4gICAgICAgICAga2V5czogWyd1c2VyLWtleS1pZCddLFxuICAgICAgICAgIGNvaW5TcGVjaWZpYzoge30sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGF3YWl0IHRyYWRpbmdBY2NvdW50XG4gICAgICAgICAgLnNpZ25QYXlsb2FkKHsgcGF5bG9hZCB9KVxuICAgICAgICAgIC5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKFxuICAgICAgICAgICAgJ1dhbGxldCBkb2VzIG5vdCBzdXBwb3J0IEJpdEdvIHNpZ25pbmcuIFBsZWFzZSByZWFjaCBvdXQgdG8gc3VwcG9ydEBiaXRnby5jb20gdG8gcmVzb2x2ZSB0aGlzIGlzc3VlLidcbiAgICAgICAgICApO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnd2l0aCB3YWxsZXRQYXNzcGhyYXNlIChsb2NhbCB1c2VyIGtleSBzaWduaW5nKScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGl0KCdzaG91bGQgZGVjcnlwdCB0aGUgdXNlciBrZXkgYW5kIHNpZ24gdGhlIHBheWxvYWQgbG9jYWxseScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdHJhZGluZ0FjY291bnQuc2lnblBheWxvYWQoeyBwYXlsb2FkLCB3YWxsZXRQYXNzcGhyYXNlIH0pO1xuXG4gICAgICAgIG1vY2tCYXNlQ29pbi5rZXljaGFpbnMoKS5nZXQuY2FsbGVkV2l0aCh7IGlkOiAndXNlci1rZXktaWQnIH0pLnNob3VsZC5iZS50cnVlKCk7XG4gICAgICAgIG1vY2tCaXRHby5kZWNyeXB0QXN5bmMuY2FsbGVkV2l0aCh7IGlucHV0OiBlbmNyeXB0ZWRQcnYsIHBhc3N3b3JkOiB3YWxsZXRQYXNzcGhyYXNlIH0pLnNob3VsZC5iZS50cnVlKCk7XG4gICAgICAgIG1vY2tCYXNlQ29pbi5zaWduTWVzc2FnZS5jYWxsZWRPbmNlLnNob3VsZC5iZS50cnVlKCk7XG4gICAgICAgIHJlc3VsdC5zaG91bGQuZXF1YWwoQnVmZmVyLmZyb20oc2lnbmF0dXJlLCAnaGV4JykudG9TdHJpbmcoJ2hleCcpKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIHN0cmluZ2lmeSBhIFJlY29yZCBwYXlsb2FkIGJlZm9yZSBzaWduaW5nIGxvY2FsbHknLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGF3YWl0IHRyYWRpbmdBY2NvdW50LnNpZ25QYXlsb2FkKHsgcGF5bG9hZCwgd2FsbGV0UGFzc3BocmFzZSB9KTtcblxuICAgICAgICBjb25zdCBzaWduTWVzc2FnZUNhbGwgPSBtb2NrQmFzZUNvaW4uc2lnbk1lc3NhZ2UuZ2V0Q2FsbCgwKTtcbiAgICAgICAgc2lnbk1lc3NhZ2VDYWxsLmFyZ3NbMV0uc2hvdWxkLmVxdWFsKEpTT04uc3RyaW5naWZ5KHBheWxvYWQpKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIHBhc3MgYSBzdHJpbmcgcGF5bG9hZCBkaXJlY3RseSB0byBzaWduTWVzc2FnZScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgYXdhaXQgdHJhZGluZ0FjY291bnQuc2lnblBheWxvYWQoeyBwYXlsb2FkOiBwYXlsb2FkU3RyaW5nLCB3YWxsZXRQYXNzcGhyYXNlIH0pO1xuXG4gICAgICAgIGNvbnN0IHNpZ25NZXNzYWdlQ2FsbCA9IG1vY2tCYXNlQ29pbi5zaWduTWVzc2FnZS5nZXRDYWxsKDApO1xuICAgICAgICBzaWduTWVzc2FnZUNhbGwuYXJnc1sxXS5zaG91bGQuZXF1YWwocGF5bG9hZFN0cmluZyk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCd3aXRoIGJvdGggd2FsbGV0UGFzc3BocmFzZSBhbmQgcHJ2JywgZnVuY3Rpb24gKCkge1xuICAgICAgaXQoJ3Nob3VsZCB1c2UgcHJ2IGRpcmVjdGx5IGFuZCBub3QgY2FsbCBkZWNyeXB0IHdoZW4gYm90aCBhcmUgcHJvdmlkZWQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGF3YWl0IHRyYWRpbmdBY2NvdW50LnNpZ25QYXlsb2FkKHsgcGF5bG9hZCwgd2FsbGV0UGFzc3BocmFzZSwgcHJ2OiBkZWNyeXB0ZWRQcnYgfSk7XG5cbiAgICAgICAgbW9ja0JpdEdvLmRlY3J5cHRBc3luYy5jYWxsZWQuc2hvdWxkLmJlLmZhbHNlKCk7XG4gICAgICAgIG1vY2tCYXNlQ29pbi5rZXljaGFpbnMuY2FsbGVkLnNob3VsZC5iZS5mYWxzZSgpO1xuICAgICAgICBjb25zdCBzaWduTWVzc2FnZUNhbGwgPSBtb2NrQmFzZUNvaW4uc2lnbk1lc3NhZ2UuZ2V0Q2FsbCgwKTtcbiAgICAgICAgc2lnbk1lc3NhZ2VDYWxsLmFyZ3NbMF0uc2hvdWxkLmRlZXBFcXVhbCh7IHBydjogZGVjcnlwdGVkUHJ2IH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnd2l0aCBwcnYgKGxvY2FsIHVzZXIga2V5IHNpZ25pbmcgd2l0aG91dCBkZWNyeXB0aW9uKScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGl0KCdzaG91bGQgc2lnbiB1c2luZyB0aGUgcHJvdmlkZWQgcHJ2IHdpdGhvdXQgY2FsbGluZyBkZWNyeXB0JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0cmFkaW5nQWNjb3VudC5zaWduUGF5bG9hZCh7IHBheWxvYWQsIHBydjogZGVjcnlwdGVkUHJ2IH0pO1xuXG4gICAgICAgIG1vY2tCaXRHby5kZWNyeXB0QXN5bmMuY2FsbGVkLnNob3VsZC5iZS5mYWxzZSgpO1xuICAgICAgICBtb2NrQmFzZUNvaW4ua2V5Y2hhaW5zLmNhbGxlZC5zaG91bGQuYmUuZmFsc2UoKTtcbiAgICAgICAgbW9ja0Jhc2VDb2luLnNpZ25NZXNzYWdlLmNhbGxlZE9uY2Uuc2hvdWxkLmJlLnRydWUoKTtcbiAgICAgICAgcmVzdWx0LnNob3VsZC5lcXVhbChCdWZmZXIuZnJvbShzaWduYXR1cmUsICdoZXgnKS50b1N0cmluZygnaGV4JykpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgbm90IHVzZSBCaXRHbyByZW1vdGUgc2lnbmluZyB3aGVuIHBydiBpcyBwcm92aWRlZCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgYXdhaXQgdHJhZGluZ0FjY291bnQuc2lnblBheWxvYWQoeyBwYXlsb2FkLCBwcnY6IGRlY3J5cHRlZFBydiB9KTtcblxuICAgICAgICBtb2NrQml0R28ucG9zdC5jYWxsZWQuc2hvdWxkLmJlLmZhbHNlKCk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBwYXNzIHRoZSBwcnYgZGlyZWN0bHkgdG8gc2lnbk1lc3NhZ2UnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGF3YWl0IHRyYWRpbmdBY2NvdW50LnNpZ25QYXlsb2FkKHsgcGF5bG9hZCwgcHJ2OiBkZWNyeXB0ZWRQcnYgfSk7XG5cbiAgICAgICAgY29uc3Qgc2lnbk1lc3NhZ2VDYWxsID0gbW9ja0Jhc2VDb2luLnNpZ25NZXNzYWdlLmdldENhbGwoMCk7XG4gICAgICAgIHNpZ25NZXNzYWdlQ2FsbC5hcmdzWzBdLnNob3VsZC5kZWVwRXF1YWwoeyBwcnY6IGRlY3J5cHRlZFBydiB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIHN0cmluZ2lmeSBhIFJlY29yZCBwYXlsb2FkIGJlZm9yZSBzaWduaW5nIHdpdGggcHJ2JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBhd2FpdCB0cmFkaW5nQWNjb3VudC5zaWduUGF5bG9hZCh7IHBheWxvYWQsIHBydjogZGVjcnlwdGVkUHJ2IH0pO1xuXG4gICAgICAgIGNvbnN0IHNpZ25NZXNzYWdlQ2FsbCA9IG1vY2tCYXNlQ29pbi5zaWduTWVzc2FnZS5nZXRDYWxsKDApO1xuICAgICAgICBzaWduTWVzc2FnZUNhbGwuYXJnc1sxXS5zaG91bGQuZXF1YWwoSlNPTi5zdHJpbmdpZnkocGF5bG9hZCkpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgcGFzcyBhIHN0cmluZyBwYXlsb2FkIGRpcmVjdGx5IHRvIHNpZ25NZXNzYWdlIHdoZW4gc2lnbmluZyB3aXRoIHBydicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgYXdhaXQgdHJhZGluZ0FjY291bnQuc2lnblBheWxvYWQoeyBwYXlsb2FkOiBwYXlsb2FkU3RyaW5nLCBwcnY6IGRlY3J5cHRlZFBydiB9KTtcblxuICAgICAgICBjb25zdCBzaWduTWVzc2FnZUNhbGwgPSBtb2NrQmFzZUNvaW4uc2lnbk1lc3NhZ2UuZ2V0Q2FsbCgwKTtcbiAgICAgICAgc2lnbk1lc3NhZ2VDYWxsLmFyZ3NbMV0uc2hvdWxkLmVxdWFsKHBheWxvYWRTdHJpbmcpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=
|