@bitgo/sdk-core 36.40.0 → 36.42.0
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/bitgo/baseCoin/iBaseCoin.d.ts +2 -2
- package/dist/src/bitgo/baseCoin/iBaseCoin.d.ts.map +1 -1
- package/dist/src/bitgo/baseCoin/iBaseCoin.js +1 -1
- package/dist/src/bitgo/bitgoBase.d.ts +1 -0
- package/dist/src/bitgo/bitgoBase.d.ts.map +1 -1
- package/dist/src/bitgo/bitgoBase.js +1 -1
- package/dist/src/bitgo/environments.d.ts +1 -0
- package/dist/src/bitgo/environments.d.ts.map +1 -1
- package/dist/src/bitgo/environments.js +9 -1
- package/dist/src/bitgo/keychain/iKeychains.d.ts +7 -0
- package/dist/src/bitgo/keychain/iKeychains.d.ts.map +1 -1
- package/dist/src/bitgo/keychain/iKeychains.js +1 -1
- package/dist/src/bitgo/keychain/keychains.d.ts.map +1 -1
- package/dist/src/bitgo/keychain/keychains.js +11 -19
- package/dist/src/bitgo/pendingApproval/pendingApproval.d.ts.map +1 -1
- package/dist/src/bitgo/pendingApproval/pendingApproval.js +11 -4
- package/dist/src/bitgo/trading/iTradingAccount.d.ts +6 -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/network/network.d.ts +1 -1
- package/dist/src/bitgo/trading/network/network.d.ts.map +1 -1
- package/dist/src/bitgo/trading/network/network.js +3 -5
- package/dist/src/bitgo/trading/network/types.d.ts +1 -1
- package/dist/src/bitgo/trading/network/types.d.ts.map +1 -1
- package/dist/src/bitgo/trading/network/types.js +1 -1
- package/dist/src/bitgo/trading/tradingAccount.d.ts +13 -1
- package/dist/src/bitgo/trading/tradingAccount.d.ts.map +1 -1
- package/dist/src/bitgo/trading/tradingAccount.js +32 -2
- package/dist/src/bitgo/tss/bitgoPubKeys.d.ts +11 -0
- package/dist/src/bitgo/tss/bitgoPubKeys.d.ts.map +1 -1
- package/dist/src/bitgo/tss/bitgoPubKeys.js +15 -1
- package/dist/src/bitgo/tss/ecdsa/ecdsaMPCv2.d.ts.map +1 -1
- package/dist/src/bitgo/tss/ecdsa/ecdsaMPCv2.js +8 -3
- 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/index.d.ts +1 -0
- package/dist/src/bitgo/utils/index.d.ts.map +1 -1
- package/dist/src/bitgo/utils/index.js +2 -1
- package/dist/src/bitgo/utils/opengpgUtils.d.ts +1 -0
- package/dist/src/bitgo/utils/opengpgUtils.d.ts.map +1 -1
- package/dist/src/bitgo/utils/opengpgUtils.js +11 -2
- package/dist/src/bitgo/utils/tss/baseTSSUtils.d.ts +9 -3
- package/dist/src/bitgo/utils/tss/baseTSSUtils.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/baseTSSUtils.js +18 -8
- package/dist/src/bitgo/utils/tss/baseTypes.d.ts +2 -1
- package/dist/src/bitgo/utils/tss/baseTypes.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/baseTypes.js +1 -1
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsa.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsa.js +7 -4
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2.js +9 -4
- 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.map +1 -1
- package/dist/src/bitgo/utils/tss/eddsa/eddsa.js +3 -7
- package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2.d.ts +22 -0
- package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2.d.ts.map +1 -0
- package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2.js +215 -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 +3 -0
- package/dist/src/bitgo/utils/tss/eddsa/index.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/eddsa/index.js +7 -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/recipientUtils.d.ts +20 -0
- package/dist/src/bitgo/utils/tss/recipientUtils.d.ts.map +1 -0
- package/dist/src/bitgo/utils/tss/recipientUtils.js +46 -0
- package/dist/src/bitgo/wallet/iWallet.d.ts +3 -2
- 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 +13 -6
- package/dist/src/bitgo/wallet/iWallets.d.ts.map +1 -1
- package/dist/src/bitgo/wallet/iWallets.js +1 -1
- package/dist/src/bitgo/wallet/wallet.d.ts.map +1 -1
- package/dist/src/bitgo/wallet/wallet.js +18 -5
- package/dist/src/bitgo/wallet/wallets.d.ts.map +1 -1
- package/dist/src/bitgo/wallet/wallets.js +15 -1
- 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 -12
- package/dist/src/coins/index.d.ts.map +1 -1
- package/dist/src/coins/index.js +2 -13
- package/dist/src/coins/ofc.d.ts +15 -1
- package/dist/src/coins/ofc.d.ts.map +1 -1
- package/dist/src/coins/ofc.js +8 -1
- package/dist/src/coins/ofcToken.d.ts +5 -3
- package/dist/src/coins/ofcToken.d.ts.map +1 -1
- package/dist/src/coins/ofcToken.js +14 -4
- 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 +113 -0
- package/dist/test/unit/bitgo/utils/tss/recipientUtils.d.ts +2 -0
- package/dist/test/unit/bitgo/utils/tss/recipientUtils.d.ts.map +1 -0
- package/dist/test/unit/bitgo/utils/tss/recipientUtils.js +137 -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 +70 -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 +197 -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/tsconfig.tsbuildinfo +1 -1
- package/package.json +5 -5
- package/dist/src/coins/fiataed.d.ts +0 -32
- package/dist/src/coins/fiataed.d.ts.map +0 -1
- package/dist/src/coins/fiataed.js +0 -61
- package/dist/src/coins/fiateur.d.ts +0 -32
- package/dist/src/coins/fiateur.d.ts.map +0 -1
- package/dist/src/coins/fiateur.js +0 -61
- package/dist/src/coins/fiatgbp.d.ts +0 -32
- package/dist/src/coins/fiatgbp.d.ts.map +0 -1
- package/dist/src/coins/fiatgbp.js +0 -61
- package/dist/src/coins/fiatinr.d.ts +0 -32
- package/dist/src/coins/fiatinr.d.ts.map +0 -1
- package/dist/src/coins/fiatinr.js +0 -61
- package/dist/src/coins/fiatsgd.d.ts +0 -32
- package/dist/src/coins/fiatsgd.d.ts.map +0 -1
- package/dist/src/coins/fiatsgd.js +0 -61
- package/dist/src/coins/fiatusd.d.ts +0 -32
- package/dist/src/coins/fiatusd.d.ts.map +0 -1
- package/dist/src/coins/fiatusd.js +0 -61
- package/dist/src/coins/tfiataed.d.ts +0 -11
- package/dist/src/coins/tfiataed.d.ts.map +0 -1
- package/dist/src/coins/tfiataed.js +0 -17
- 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/tfiatinr.d.ts +0 -11
- package/dist/src/coins/tfiatinr.d.ts.map +0 -1
- package/dist/src/coins/tfiatinr.js +0 -17
- package/dist/src/coins/tfiatsgd.d.ts +0 -11
- package/dist/src/coins/tfiatsgd.d.ts.map +0 -1
- package/dist/src/coins/tfiatsgd.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
|
@@ -0,0 +1,137 @@
|
|
|
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 assert = __importStar(require("assert"));
|
|
38
|
+
// Import directly from source so no top-level export change is needed
|
|
39
|
+
const getModule = () => require('../../../../../src/bitgo/utils/tss/recipientUtils');
|
|
40
|
+
function makeTxRequest(intentRecipients) {
|
|
41
|
+
return {
|
|
42
|
+
txRequestId: 'test-req-id',
|
|
43
|
+
intent: intentRecipients ? { intentType: 'contractCall', recipients: intentRecipients } : { intentType: 'payment' },
|
|
44
|
+
transactions: [],
|
|
45
|
+
unsignedTxs: [],
|
|
46
|
+
state: 'pendingUserSignature',
|
|
47
|
+
walletType: 'hot',
|
|
48
|
+
walletId: 'walletId',
|
|
49
|
+
policiesChecked: true,
|
|
50
|
+
version: 1,
|
|
51
|
+
userId: 'userId',
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
describe('recipientUtils', function () {
|
|
55
|
+
describe('NO_RECIPIENT_TX_TYPES', function () {
|
|
56
|
+
it('contains exactly the 8 expected exempted types', function () {
|
|
57
|
+
const { NO_RECIPIENT_TX_TYPES } = getModule();
|
|
58
|
+
const expected = [
|
|
59
|
+
'acceleration',
|
|
60
|
+
'fillNonce',
|
|
61
|
+
'transferToken',
|
|
62
|
+
'tokenApproval',
|
|
63
|
+
'consolidate',
|
|
64
|
+
'bridgeFunds',
|
|
65
|
+
'enableToken',
|
|
66
|
+
'customTx',
|
|
67
|
+
];
|
|
68
|
+
expected.forEach((t) => assert.ok(NO_RECIPIENT_TX_TYPES.has(t), `${t} should be in NO_RECIPIENT_TX_TYPES`));
|
|
69
|
+
assert.strictEqual(NO_RECIPIENT_TX_TYPES.size, expected.length);
|
|
70
|
+
});
|
|
71
|
+
});
|
|
72
|
+
describe('resolveEffectiveTxParams', function () {
|
|
73
|
+
it('uses txParams.recipients when provided', function () {
|
|
74
|
+
const { resolveEffectiveTxParams } = getModule();
|
|
75
|
+
const txRequest = makeTxRequest();
|
|
76
|
+
const result = resolveEffectiveTxParams(txRequest, { recipients: [{ address: '0xabc', amount: '100' }] });
|
|
77
|
+
result.recipients[0].address.should.equal('0xabc');
|
|
78
|
+
result.recipients[0].amount.should.equal('100');
|
|
79
|
+
});
|
|
80
|
+
it('falls back to intent.recipients when txParams has no recipients', function () {
|
|
81
|
+
const { resolveEffectiveTxParams } = getModule();
|
|
82
|
+
const txRequest = makeTxRequest([{ address: { address: '0xintent' }, amount: { value: '500' } }]);
|
|
83
|
+
const result = resolveEffectiveTxParams(txRequest, {});
|
|
84
|
+
result.recipients[0].address.should.equal('0xintent');
|
|
85
|
+
result.recipients[0].amount.should.equal('500');
|
|
86
|
+
});
|
|
87
|
+
it('falls back to intent.recipients when txParams is undefined', function () {
|
|
88
|
+
const { resolveEffectiveTxParams } = getModule();
|
|
89
|
+
const txRequest = makeTxRequest([{ address: { address: '0xintent' }, amount: { value: '999' } }]);
|
|
90
|
+
const result = resolveEffectiveTxParams(txRequest, undefined);
|
|
91
|
+
result.recipients[0].address.should.equal('0xintent');
|
|
92
|
+
});
|
|
93
|
+
it('prefers txParams.recipients over intent.recipients when both present', function () {
|
|
94
|
+
const { resolveEffectiveTxParams } = getModule();
|
|
95
|
+
const txRequest = makeTxRequest([{ address: { address: '0xintent' }, amount: { value: '9999' } }]);
|
|
96
|
+
const result = resolveEffectiveTxParams(txRequest, { recipients: [{ address: '0xexplicit', amount: '1' }] });
|
|
97
|
+
result.recipients[0].address.should.equal('0xexplicit');
|
|
98
|
+
});
|
|
99
|
+
it('maps intent.data field through to the recipient', function () {
|
|
100
|
+
const { resolveEffectiveTxParams } = getModule();
|
|
101
|
+
const txRequest = makeTxRequest([
|
|
102
|
+
{ address: { address: '0xcontract' }, amount: { value: '0' }, data: '0xabcdef' },
|
|
103
|
+
]);
|
|
104
|
+
const result = resolveEffectiveTxParams(txRequest, undefined);
|
|
105
|
+
result.recipients[0].data.should.equal('0xabcdef');
|
|
106
|
+
});
|
|
107
|
+
it('throws InvalidTransactionError when no recipients and type is not exempted', function () {
|
|
108
|
+
const { resolveEffectiveTxParams } = getModule();
|
|
109
|
+
const txRequest = makeTxRequest();
|
|
110
|
+
assert.throws(() => resolveEffectiveTxParams(txRequest, {}), /Recipient details are required to verify this transaction before signing/);
|
|
111
|
+
});
|
|
112
|
+
it('throws when txParams is undefined and intent has no recipients', function () {
|
|
113
|
+
const { resolveEffectiveTxParams } = getModule();
|
|
114
|
+
const txRequest = makeTxRequest();
|
|
115
|
+
assert.throws(() => resolveEffectiveTxParams(txRequest, undefined), /Recipient details are required to verify this transaction before signing/);
|
|
116
|
+
});
|
|
117
|
+
const NO_RECIPIENT_TYPES = [
|
|
118
|
+
'acceleration',
|
|
119
|
+
'fillNonce',
|
|
120
|
+
'transferToken',
|
|
121
|
+
'tokenApproval',
|
|
122
|
+
'consolidate',
|
|
123
|
+
'bridgeFunds',
|
|
124
|
+
'enableToken', // TSS wallets do not populate recipients for token enablement
|
|
125
|
+
'customTx', // DeFi/WalletConnect smart contract interactions have no traditional recipients
|
|
126
|
+
];
|
|
127
|
+
NO_RECIPIENT_TYPES.forEach((type) => {
|
|
128
|
+
it(`allows empty recipients for no-recipient tx type: ${type}`, function () {
|
|
129
|
+
const { resolveEffectiveTxParams } = getModule();
|
|
130
|
+
const txRequest = makeTxRequest();
|
|
131
|
+
const result = resolveEffectiveTxParams(txRequest, { type });
|
|
132
|
+
result.type.should.equal(type);
|
|
133
|
+
});
|
|
134
|
+
});
|
|
135
|
+
});
|
|
136
|
+
});
|
|
137
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjaXBpZW50VXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZXN0L3VuaXQvYml0Z28vdXRpbHMvdHNzL3JlY2lwaWVudFV0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsa0JBQWdCO0FBQ2hCLCtDQUFpQztBQUVqQyxzRUFBc0U7QUFDdEUsTUFBTSxTQUFTLEdBQUcsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLG1EQUFtRCxDQUFDLENBQUM7QUFFckYsU0FBUyxhQUFhLENBQ3BCLGdCQUErRjtJQUUvRixPQUFPO1FBQ0wsV0FBVyxFQUFFLGFBQWE7UUFDMUIsTUFBTSxFQUFFLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxFQUFFLFVBQVUsRUFBRSxjQUFjLEVBQUUsVUFBVSxFQUFFLGdCQUFnQixFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRTtRQUNuSCxZQUFZLEVBQUUsRUFBRTtRQUNoQixXQUFXLEVBQUUsRUFBRTtRQUNmLEtBQUssRUFBRSxzQkFBc0I7UUFDN0IsVUFBVSxFQUFFLEtBQUs7UUFDakIsUUFBUSxFQUFFLFVBQVU7UUFDcEIsZUFBZSxFQUFFLElBQUk7UUFDckIsT0FBTyxFQUFFLENBQUM7UUFDVixNQUFNLEVBQUUsUUFBUTtLQUNqQixDQUFDO0FBQ0osQ0FBQztBQUVELFFBQVEsQ0FBQyxnQkFBZ0IsRUFBRTtJQUN6QixRQUFRLENBQUMsdUJBQXVCLEVBQUU7UUFDaEMsRUFBRSxDQUFDLGdEQUFnRCxFQUFFO1lBQ25ELE1BQU0sRUFBRSxxQkFBcUIsRUFBRSxHQUFHLFNBQVMsRUFBRSxDQUFDO1lBQzlDLE1BQU0sUUFBUSxHQUFHO2dCQUNmLGNBQWM7Z0JBQ2QsV0FBVztnQkFDWCxlQUFlO2dCQUNmLGVBQWU7Z0JBQ2YsYUFBYTtnQkFDYixhQUFhO2dCQUNiLGFBQWE7Z0JBQ2Is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QVMsRUFBRSxDQUFDO1lBQ2pELE1BQU0sU0FBUyxHQUFHLGFBQWEsRUFBRSxDQUFDO1lBQ2xDLE1BQU0sQ0FBQyxNQUFNLENBQ1gsR0FBRyxFQUFFLENBQUMsd0JBQXdCLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQyxFQUNwRCwwRUFBMEUsQ0FDM0UsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO1FBRUgsTUFBTSxrQkFBa0IsR0FBRztZQUN6QixjQUFjO1lBQ2QsV0FBVztZQUNYLGVBQWU7WUFDZixlQUFlO1lBQ2YsYUFBYTtZQUNiLGFBQWE7WUFDYixhQUFhLEVBQUUsOERBQThEO1lBQzdFLFVBQVUsRUFBRSxnRkFBZ0Y7U0FDN0YsQ0FBQztRQUVGLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO1lBQ2xDLEVBQUUsQ0FBQyxxREFBcUQsSUFBSSxFQUFFLEVBQUU7Z0JBQzlELE1BQU0sRUFBRSx3QkFBd0IsRUFBRSxHQUFHLFNBQVMsRUFBRSxDQUFDO2dCQUNqRCxNQUFNLFNBQVMsR0FBRyxhQUFhLEVBQUUsQ0FBQztnQkFDbEMsTUFBTSxNQUFNLEdBQUcsd0JBQXdCLENBQUMsU0FBUyxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztnQkFDN0QsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ2pDLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICdzaG91bGQnO1xuaW1wb3J0ICogYXMgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5cbi8vIEltcG9ydCBkaXJlY3RseSBmcm9tIHNvdXJjZSBzbyBubyB0b3AtbGV2ZWwgZXhwb3J0IGNoYW5nZSBpcyBuZWVkZWRcbmNvbnN0IGdldE1vZHVsZSA9ICgpID0+IHJlcXVpcmUoJy4uLy4uLy4uLy4uLy4uL3NyYy9iaXRnby91dGlscy90c3MvcmVjaXBpZW50VXRpbHMnKTtcblxuZnVuY3Rpb24gbWFrZVR4UmVxdWVzdChcbiAgaW50ZW50UmVjaXBpZW50cz86IHsgYWRkcmVzczogeyBhZGRyZXNzOiBzdHJpbmcgfTsgYW1vdW50OiB7IHZhbHVlOiBzdHJpbmcgfTsgZGF0YT86IHN0cmluZyB9W11cbik6IGFueSB7XG4gIHJldHVybiB7XG4gICAgdHhSZXF1ZXN0SWQ6ICd0ZXN0LXJlcS1pZCcsXG4gICAgaW50ZW50OiBpbnRlbnRSZWNpcGllbnRzID8geyBpbnRlbnRUeXBlOiAnY29udHJhY3RDYWxsJywgcmVjaXBpZW50czogaW50ZW50UmVjaXBpZW50cyB9IDogeyBpbnRlbnRUeXBlOiAncGF5bWVudCcgfSxcbiAgICB0cmFuc2FjdGlvbnM6IFtdLFxuICAgIHVuc2lnbmVkVHhzOiBbXSxcbiAgICBzdGF0ZTogJ3BlbmRpbmdVc2VyU2lnbmF0dXJlJyxcbiAgICB3YWxsZXRUeXBlOiAnaG90JyxcbiAgICB3YWxsZXRJZDogJ3dhbGxldElkJyxcbiAgICBwb2xpY2llc0NoZWNrZWQ6IHRydWUsXG4gICAgdmVyc2lvbjogMSxcbiAgICB1c2VySWQ6ICd1c2VySWQnLFxuICB9O1xufVxuXG5kZXNjcmliZSgncmVjaXBpZW50VXRpbHMnLCBmdW5jdGlvbiAoKSB7XG4gIGRlc2NyaWJlKCdOT19SRUNJUElFTlRfVFhfVFlQRVMnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ2NvbnRhaW5zIGV4YWN0bHkgdGhlIDggZXhwZWN0ZWQgZXhlbXB0ZWQgdHlwZXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB7IE5PX1JFQ0lQSUVOVF9UWF9UWVBFUyB9ID0gZ2V0TW9kdWxlKCk7XG4gICAgICBjb25zdCBleHBlY3RlZCA9IFtcbiAgICAgICAgJ2FjY2VsZXJhdGlvbicsXG4gICAgICAgICdmaWxsTm9uY2UnLFxuICAgICAgICAndHJhbnNmZXJUb2tlbicsXG4gICAgICAgICd0b2tlbkFwcHJvdmFsJyxcbiAgICAgICAgJ2NvbnNvbGlkYXRlJyxcbiAgICAgICAgJ2JyaWRnZUZ1bmRzJyxcbiAgICAgICAgJ2VuYWJsZVRva2VuJyxcbiAgICAgICAgJ2N1c3RvbVR4JyxcbiAgICAgIF07XG4gICAgICBleHBlY3RlZC5mb3JFYWNoKCh0KSA9PiBhc3NlcnQub2soTk9fUkVDSVBJRU5UX1RYX1RZUEVTLmhhcyh0KSwgYCR7dH0gc2hvdWxkIGJlIGluIE5PX1JFQ0lQSUVOVF9UWF9UWVBFU2ApKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChOT19SRUNJUElFTlRfVFhfVFlQRVMuc2l6ZSwgZXhwZWN0ZWQubGVuZ3RoKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3Jlc29sdmVFZmZlY3RpdmVUeFBhcmFtcycsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgndXNlcyB0eFBhcmFtcy5yZWNpcGllbnRzIHdoZW4gcHJvdmlkZWQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB7IHJlc29sdmVFZmZlY3RpdmVUeFBhcmFtcyB9ID0gZ2V0TW9kdWxlKCk7XG4gICAgICBjb25zdCB0eFJlcXVlc3QgPSBtYWtlVHhSZXF1ZXN0KCk7XG4gICAgICBjb25zdCByZXN1bHQgPSByZXNvbHZlRWZmZWN0aXZlVHhQYXJhbXModHhSZXF1ZXN0LCB7IHJlY2lwaWVudHM6IFt7IGFkZHJlc3M6ICcweGFiYycsIGFtb3VudDogJzEwMCcgfV0gfSk7XG4gICAgICByZXN1bHQucmVjaXBpZW50c1swXS5hZGRyZXNzLnNob3VsZC5lcXVhbCgnMHhhYmMnKTtcbiAgICAgIHJlc3VsdC5yZWNpcGllbnRzWzBdLmFtb3VudC5zaG91bGQuZXF1YWwoJzEwMCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2ZhbGxzIGJhY2sgdG8gaW50ZW50LnJlY2lwaWVudHMgd2hlbiB0eFBhcmFtcyBoYXMgbm8gcmVjaXBpZW50cycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHsgcmVzb2x2ZUVmZmVjdGl2ZVR4UGFyYW1zIH0gPSBnZXRNb2R1bGUoKTtcbiAgICAgIGNvbnN0IHR4UmVxdWVzdCA9IG1ha2VUeFJlcXVlc3QoW3sgYWRkcmVzczogeyBhZGRyZXNzOiAnMHhpbnRlbnQnIH0sIGFtb3VudDogeyB2YWx1ZTogJzUwMCcgfSB9XSk7XG4gICAgICBjb25zdCByZXN1bHQgPSByZXNvbHZlRWZmZWN0aXZlVHhQYXJhbXModHhSZXF1ZXN0LCB7fSk7XG4gICAgICByZXN1bHQucmVjaXBpZW50c1swXS5hZGRyZXNzLnNob3VsZC5lcXVhbCgnMHhpbnRlbnQnKTtcbiAgICAgIHJlc3VsdC5yZWNpcGllbnRzWzBdLmFtb3VudC5zaG91bGQuZXF1YWwoJzUwMCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2ZhbGxzIGJhY2sgdG8gaW50ZW50LnJlY2lwaWVudHMgd2hlbiB0eFBhcmFtcyBpcyB1bmRlZmluZWQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB7IHJlc29sdmVFZmZlY3RpdmVUeFBhcmFtcyB9ID0gZ2V0TW9kdWxlKCk7XG4gICAgICBjb25zdCB0eFJlcXVlc3QgPSBtYWtlVHhSZXF1ZXN0KFt7IGFkZHJlc3M6IHsgYWRkcmVzczogJzB4aW50ZW50JyB9LCBhbW91bnQ6IHsgdmFsdWU6ICc5OTknIH0gfV0pO1xuICAgICAgY29uc3QgcmVzdWx0ID0gcmVzb2x2ZUVmZmVjdGl2ZVR4UGFyYW1zKHR4UmVxdWVzdCwgdW5kZWZpbmVkKTtcbiAgICAgIHJlc3VsdC5yZWNpcGllbnRzWzBdLmFkZHJlc3Muc2hvdWxkLmVxdWFsKCcweGludGVudCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3ByZWZlcnMgdHhQYXJhbXMucmVjaXBpZW50cyBvdmVyIGludGVudC5yZWNpcGllbnRzIHdoZW4gYm90aCBwcmVzZW50JywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgeyByZXNvbHZlRWZmZWN0aXZlVHhQYXJhbXMgfSA9IGdldE1vZHVsZSgpO1xuICAgICAgY29uc3QgdHhSZXF1ZXN0ID0gbWFrZVR4UmVxdWVzdChbeyBhZGRyZXNzOiB7IGFkZHJlc3M6ICcweGludGVudCcgfSwgYW1vdW50OiB7IHZhbHVlOiAnOTk5OScgfSB9XSk7XG4gICAgICBjb25zdCByZXN1bHQgPSByZXNvbHZlRWZmZWN0aXZlVHhQYXJhbXModHhSZXF1ZXN0LCB7IHJlY2lwaWVudHM6IFt7IGFkZHJlc3M6ICcweGV4cGxpY2l0JywgYW1vdW50OiAnMScgfV0gfSk7XG4gICAgICByZXN1bHQucmVjaXBpZW50c1swXS5hZGRyZXNzLnNob3VsZC5lcXVhbCgnMHhleHBsaWNpdCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ21hcHMgaW50ZW50LmRhdGEgZmllbGQgdGhyb3VnaCB0byB0aGUgcmVjaXBpZW50JywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgeyByZXNvbHZlRWZmZWN0aXZlVHhQYXJhbXMgfSA9IGdldE1vZHVsZSgpO1xuICAgICAgY29uc3QgdHhSZXF1ZXN0ID0gbWFrZVR4UmVxdWVzdChbXG4gICAgICAgIHsgYWRkcmVzczogeyBhZGRyZXNzOiAnMHhjb250cmFjdCcgfSwgYW1vdW50OiB7IHZhbHVlOiAnMCcgfSwgZGF0YTogJzB4YWJjZGVmJyB9LFxuICAgICAgXSk7XG4gICAgICBjb25zdCByZXN1bHQgPSByZXNvbHZlRWZmZWN0aXZlVHhQYXJhbXModHhSZXF1ZXN0LCB1bmRlZmluZWQpO1xuICAgICAgcmVzdWx0LnJlY2lwaWVudHNbMF0uZGF0YS5zaG91bGQuZXF1YWwoJzB4YWJjZGVmJyk7XG4gICAgfSk7XG5cbiAgICBpdCgndGhyb3dzIEludmFsaWRUcmFuc2FjdGlvbkVycm9yIHdoZW4gbm8gcmVjaXBpZW50cyBhbmQgdHlwZSBpcyBub3QgZXhlbXB0ZWQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB7IHJlc29sdmVFZmZlY3RpdmVUeFBhcmFtcyB9ID0gZ2V0TW9kdWxlKCk7XG4gICAgICBjb25zdCB0eFJlcXVlc3QgPSBtYWtlVHhSZXF1ZXN0KCk7XG4gICAgICBhc3NlcnQudGhyb3dzKFxuICAgICAgICAoKSA9PiByZXNvbHZlRWZmZWN0aXZlVHhQYXJhbXModHhSZXF1ZXN0LCB7fSksXG4gICAgICAgIC9SZWNpcGllbnQgZGV0YWlscyBhcmUgcmVxdWlyZWQgdG8gdmVyaWZ5IHRoaXMgdHJhbnNhY3Rpb24gYmVmb3JlIHNpZ25pbmcvXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Rocm93cyB3aGVuIHR4UGFyYW1zIGlzIHVuZGVmaW5lZCBhbmQgaW50ZW50IGhhcyBubyByZWNpcGllbnRzJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgeyByZXNvbHZlRWZmZWN0aXZlVHhQYXJhbXMgfSA9IGdldE1vZHVsZSgpO1xuICAgICAgY29uc3QgdHhSZXF1ZXN0ID0gbWFrZVR4UmVxdWVzdCgpO1xuICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgKCkgPT4gcmVzb2x2ZUVmZmVjdGl2ZVR4UGFyYW1zKHR4UmVxdWVzdCwgdW5kZWZpbmVkKSxcbiAgICAgICAgL1JlY2lwaWVudCBkZXRhaWxzIGFyZSByZXF1aXJlZCB0byB2ZXJpZnkgdGhpcyB0cmFuc2FjdGlvbiBiZWZvcmUgc2lnbmluZy9cbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBjb25zdCBOT19SRUNJUElFTlRfVFlQRVMgPSBbXG4gICAgICAnYWNjZWxlcmF0aW9uJyxcbiAgICAgICdmaWxsTm9uY2UnLFxuICAgICAgJ3RyYW5zZmVyVG9rZW4nLFxuICAgICAgJ3Rva2VuQXBwcm92YWwnLFxuICAgICAgJ2NvbnNvbGlkYXRlJyxcbiAgICAgICdicmlkZ2VGdW5kcycsXG4gICAgICAnZW5hYmxlVG9rZW4nLCAvLyBUU1Mgd2FsbGV0cyBkbyBub3QgcG9wdWxhdGUgcmVjaXBpZW50cyBmb3IgdG9rZW4gZW5hYmxlbWVudFxuICAgICAgJ2N1c3RvbVR4JywgLy8gRGVGaS9XYWxsZXRDb25uZWN0IHNtYXJ0IGNvbnRyYWN0IGludGVyYWN0aW9ucyBoYXZlIG5vIHRyYWRpdGlvbmFsIHJlY2lwaWVudHNcbiAgICBdO1xuXG4gICAgTk9fUkVDSVBJRU5UX1RZUEVTLmZvckVhY2goKHR5cGUpID0+IHtcbiAgICAgIGl0KGBhbGxvd3MgZW1wdHkgcmVjaXBpZW50cyBmb3Igbm8tcmVjaXBpZW50IHR4IHR5cGU6ICR7dHlwZX1gLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IHsgcmVzb2x2ZUVmZmVjdGl2ZVR4UGFyYW1zIH0gPSBnZXRNb2R1bGUoKTtcbiAgICAgICAgY29uc3QgdHhSZXF1ZXN0ID0gbWFrZVR4UmVxdWVzdCgpO1xuICAgICAgICBjb25zdCByZXN1bHQgPSByZXNvbHZlRWZmZWN0aXZlVHhQYXJhbXModHhSZXF1ZXN0LCB7IHR5cGUgfSk7XG4gICAgICAgIHJlc3VsdC50eXBlLnNob3VsZC5lcXVhbCh0eXBlKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ofcWalletSignTransaction.d.ts","sourceRoot":"","sources":["../../../../../test/unit/bitgo/wallet/ofcWalletSignTransaction.ts"],"names":[],"mappings":"AAIA,OAAO,QAAQ,CAAC"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
/**
|
|
7
|
+
* @prettier
|
|
8
|
+
*/
|
|
9
|
+
const sinon_1 = __importDefault(require("sinon"));
|
|
10
|
+
require("should");
|
|
11
|
+
const src_1 = require("../../../../src");
|
|
12
|
+
describe('Wallet - OFC signTransaction', function () {
|
|
13
|
+
let wallet;
|
|
14
|
+
let mockBitGo;
|
|
15
|
+
let mockBaseCoin;
|
|
16
|
+
let mockWalletData;
|
|
17
|
+
beforeEach(function () {
|
|
18
|
+
mockBitGo = {
|
|
19
|
+
url: sinon_1.default.stub().returns('https://test.bitgo.com'),
|
|
20
|
+
post: sinon_1.default.stub(),
|
|
21
|
+
get: sinon_1.default.stub(),
|
|
22
|
+
setRequestTracer: sinon_1.default.stub(),
|
|
23
|
+
};
|
|
24
|
+
mockBaseCoin = {
|
|
25
|
+
getFamily: sinon_1.default.stub().returns('ofc'),
|
|
26
|
+
url: sinon_1.default.stub().returns('https://test.bitgo.com/wallet'),
|
|
27
|
+
keychains: sinon_1.default.stub(),
|
|
28
|
+
supportsTss: sinon_1.default.stub().returns(false),
|
|
29
|
+
getMPCAlgorithm: sinon_1.default.stub(),
|
|
30
|
+
presignTransaction: sinon_1.default.stub().resolvesArg(0),
|
|
31
|
+
keyIdsForSigning: sinon_1.default.stub().returns([0]),
|
|
32
|
+
signTransaction: sinon_1.default.stub().resolves({ halfSigned: { payload: 'test', signature: 'aabbcc' } }),
|
|
33
|
+
};
|
|
34
|
+
mockWalletData = {
|
|
35
|
+
id: 'test-wallet-id',
|
|
36
|
+
coin: 'ofcusdt',
|
|
37
|
+
keys: ['user-key', 'backup-key', 'bitgo-key'],
|
|
38
|
+
multisigType: 'onchain',
|
|
39
|
+
enterprise: 'ent-id',
|
|
40
|
+
};
|
|
41
|
+
wallet = new src_1.Wallet(mockBitGo, mockBaseCoin, mockWalletData);
|
|
42
|
+
});
|
|
43
|
+
afterEach(function () {
|
|
44
|
+
sinon_1.default.restore();
|
|
45
|
+
});
|
|
46
|
+
it('should pass wallet instance to baseCoin.signTransaction', async function () {
|
|
47
|
+
const txPrebuild = { txInfo: { payload: '{"amount":"100"}' } };
|
|
48
|
+
const prv = 'test-prv';
|
|
49
|
+
await wallet.signTransaction({ txPrebuild, prv });
|
|
50
|
+
mockBaseCoin.signTransaction.calledOnce.should.be.true();
|
|
51
|
+
const callArgs = mockBaseCoin.signTransaction.getCall(0).args[0];
|
|
52
|
+
callArgs.wallet.should.equal(wallet);
|
|
53
|
+
});
|
|
54
|
+
it('should pass prv to baseCoin.signTransaction when provided directly', async function () {
|
|
55
|
+
const txPrebuild = { txInfo: { payload: '{"amount":"100"}' } };
|
|
56
|
+
const prv = 'test-prv';
|
|
57
|
+
await wallet.signTransaction({ txPrebuild, prv });
|
|
58
|
+
const callArgs = mockBaseCoin.signTransaction.getCall(0).args[0];
|
|
59
|
+
callArgs.prv.should.equal(prv);
|
|
60
|
+
});
|
|
61
|
+
it('should pass wallet instance to baseCoin.signTransaction even when no prv is available', async function () {
|
|
62
|
+
sinon_1.default.stub(wallet, 'getUserPrv').returns(undefined);
|
|
63
|
+
const txPrebuild = { txInfo: { payload: '{"amount":"100"}' } };
|
|
64
|
+
await wallet.signTransaction({ txPrebuild });
|
|
65
|
+
mockBaseCoin.signTransaction.calledOnce.should.be.true();
|
|
66
|
+
const callArgs = mockBaseCoin.signTransaction.getCall(0).args[0];
|
|
67
|
+
callArgs.wallet.should.equal(wallet);
|
|
68
|
+
});
|
|
69
|
+
});
|
|
70
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2ZjV2FsbGV0U2lnblRyYW5zYWN0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGVzdC91bml0L2JpdGdvL3dhbGxldC9vZmNXYWxsZXRTaWduVHJhbnNhY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQTs7R0FFRztBQUNILGtEQUEwQjtBQUMxQixrQkFBZ0I7QUFDaEIseUNBQXlDO0FBRXpDLFFBQVEsQ0FBQyw4QkFBOEIsRUFBRTtJQUN2QyxJQUFJLE1BQWMsQ0FBQztJQUNuQixJQUFJLFNBQWMsQ0FBQztJQUNuQixJQUFJLFlBQWlCLENBQUM7SUFDdEIsSUFBSSxjQUFtQixDQUFDO0lBRXhCLFVBQVUsQ0FBQztRQUNULFNBQVMsR0FBRztZQUNWLEdBQUcsRUFBRSxlQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsT0FBTyxDQUFDLHdCQUF3QixDQUFDO1lBQ25ELElBQUksRUFBRSxlQUFLLENBQUMsSUFBSSxFQUFFO1lBQ2xCLEdBQUcsRUFBRSxlQUFLLENBQUMsSUFBSSxFQUFFO1lBQ2pCLGdCQUFnQixFQUFFLGVBQUssQ0FBQyxJQUFJLEVBQUU7U0FDL0IsQ0FBQztRQUVGLFlBQVksR0FBRztZQUNiLFNBQVMsRUFBRSxlQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztZQUN0QyxHQUFHLEVBQUUsZUFBSyxDQUFDLElBQUksRUFBRSxDQUFDLE9BQU8sQ0FBQywrQkFBK0IsQ0FBQztZQUMxRCxTQUFTLEVBQUUsZUFBSyxDQUFDLElBQUksRUFBRTtZQUN2QixXQUFXLEVBQUUsZUFBSyxDQUFDLElBQUksRUFBRSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7WUFDeEMsZUFBZSxFQUFFLGVBQUssQ0FBQyxJQUFJLEVBQUU7WUFDN0Isa0JBQWtCLEVBQUUsZUFBSyxDQUFDLElBQUksRUFBRSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7WUFDL0MsZ0JBQWdCLEVB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LENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQHByZXR0aWVyXG4gKi9cbmltcG9ydCBzaW5vbiBmcm9tICdzaW5vbic7XG5pbXBvcnQgJ3Nob3VsZCc7XG5pbXBvcnQgeyBXYWxsZXQgfSBmcm9tICcuLi8uLi8uLi8uLi9zcmMnO1xuXG5kZXNjcmliZSgnV2FsbGV0IC0gT0ZDIHNpZ25UcmFuc2FjdGlvbicsIGZ1bmN0aW9uICgpIHtcbiAgbGV0IHdhbGxldDogV2FsbGV0O1xuICBsZXQgbW9ja0JpdEdvOiBhbnk7XG4gIGxldCBtb2NrQmFzZUNvaW46IGFueTtcbiAgbGV0IG1vY2tXYWxsZXREYXRhOiBhbnk7XG5cbiAgYmVmb3JlRWFjaChmdW5jdGlvbiAoKSB7XG4gICAgbW9ja0JpdEdvID0ge1xuICAgICAgdXJsOiBzaW5vbi5zdHViKCkucmV0dXJucygnaHR0cHM6Ly90ZXN0LmJpdGdvLmNvbScpLFxuICAgICAgcG9zdDogc2lub24uc3R1YigpLFxuICAgICAgZ2V0OiBzaW5vbi5zdHViKCksXG4gICAgICBzZXRSZXF1ZXN0VHJhY2VyOiBzaW5vbi5zdHViKCksXG4gICAgfTtcblxuICAgIG1vY2tCYXNlQ29pbiA9IHtcbiAgICAgIGdldEZhbWlseTogc2lub24uc3R1YigpLnJldHVybnMoJ29mYycpLFxuICAgICAgdXJsOiBzaW5vbi5zdHViKCkucmV0dXJucygnaHR0cHM6Ly90ZXN0LmJpdGdvLmNvbS93YWxsZXQnKSxcbiAgICAgIGtleWNoYWluczogc2lub24uc3R1YigpLFxuICAgICAgc3VwcG9ydHNUc3M6IHNpbm9uLnN0dWIoKS5yZXR1cm5zKGZhbHNlKSxcbiAgICAgIGdldE1QQ0FsZ29yaXRobTogc2lub24uc3R1YigpLFxuICAgICAgcHJlc2lnblRyYW5zYWN0aW9uOiBzaW5vbi5zdHViKCkucmVzb2x2ZXNBcmcoMCksXG4gICAgICBrZXlJZHNGb3JTaWduaW5nOiBzaW5vbi5zdHViKCkucmV0dXJucyhbMF0pLFxuICAgICAgc2lnblRyYW5zYWN0aW9uOiBzaW5vbi5zdHViKCkucmVzb2x2ZXMoeyBoYWxmU2lnbmVkOiB7IHBheWxvYWQ6ICd0ZXN0Jywgc2lnbmF0dXJlOiAnYWFiYmNjJyB9IH0pLFxuICAgIH07XG5cbiAgICBtb2NrV2FsbGV0RGF0YSA9IHtcbiAgICAgIGlkOiAndGVzdC13YWxsZXQtaWQnLFxuICAgICAgY29pbjogJ29mY3VzZHQnLFxuICAgICAga2V5czogWyd1c2VyLWtleScsICdiYWNrdXAta2V5JywgJ2JpdGdvLWtleSddLFxuICAgICAgbXVsdGlzaWdUeXBlOiAnb25jaGFpbicsXG4gICAgICBlbnRlcnByaXNlOiAnZW50LWlkJyxcbiAgICB9O1xuXG4gICAgd2FsbGV0ID0gbmV3IFdhbGxldChtb2NrQml0R28sIG1vY2tCYXNlQ29pbiwgbW9ja1dhbGxldERhdGEpO1xuICB9KTtcblxuICBhZnRlckVhY2goZnVuY3Rpb24gKCkge1xuICAgIHNpbm9uLnJlc3RvcmUoKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBwYXNzIHdhbGxldCBpbnN0YW5jZSB0byBiYXNlQ29pbi5zaWduVHJhbnNhY3Rpb24nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgdHhQcmVidWlsZCA9IHsgdHhJbmZvOiB7IHBheWxvYWQ6ICd7XCJhbW91bnRcIjpcIjEwMFwifScgfSB9IGFzIGFueTtcbiAgICBjb25zdCBwcnYgPSAndGVzdC1wcnYnO1xuXG4gICAgYXdhaXQgd2FsbGV0LnNpZ25UcmFuc2FjdGlvbih7IHR4UHJlYnVpbGQsIHBydiB9KTtcblxuICAgIG1vY2tCYXNlQ29pbi5zaWduVHJhbnNhY3Rpb24uY2FsbGVkT25jZS5zaG91bGQuYmUudHJ1ZSgpO1xuICAgIGNvbnN0IGNhbGxBcmdzID0gbW9ja0Jhc2VDb2luLnNpZ25UcmFuc2FjdGlvbi5nZXRDYWxsKDApLmFyZ3NbMF07XG4gICAgY2FsbEFyZ3Mud2FsbGV0LnNob3VsZC5lcXVhbCh3YWxsZXQpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIHBhc3MgcHJ2IHRvIGJhc2VDb2luLnNpZ25UcmFuc2FjdGlvbiB3aGVuIHByb3ZpZGVkIGRpcmVjdGx5JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHR4UHJlYnVpbGQgPSB7IHR4SW5mbzogeyBwYXlsb2FkOiAne1wiYW1vdW50XCI6XCIxMDBcIn0nIH0gfSBhcyBhbnk7XG4gICAgY29uc3QgcHJ2ID0gJ3Rlc3QtcHJ2JztcblxuICAgIGF3YWl0IHdhbGxldC5zaWduVHJhbnNhY3Rpb24oeyB0eFByZWJ1aWxkLCBwcnYgfSk7XG5cbiAgICBjb25zdCBjYWxsQXJncyA9IG1vY2tCYXNlQ29pbi5zaWduVHJhbnNhY3Rpb24uZ2V0Q2FsbCgwKS5hcmdzWzBdO1xuICAgIGNhbGxBcmdzLnBydi5zaG91bGQuZXF1YWwocHJ2KTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBwYXNzIHdhbGxldCBpbnN0YW5jZSB0byBiYXNlQ29pbi5zaWduVHJhbnNhY3Rpb24gZXZlbiB3aGVuIG5vIHBydiBpcyBhdmFpbGFibGUnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgc2lub24uc3R1Yih3YWxsZXQsICdnZXRVc2VyUHJ2JykucmV0dXJucyh1bmRlZmluZWQgYXMgYW55KTtcbiAgICBjb25zdCB0eFByZWJ1aWxkID0geyB0eEluZm86IHsgcGF5bG9hZDogJ3tcImFtb3VudFwiOlwiMTAwXCJ9JyB9IH0gYXMgYW55O1xuXG4gICAgYXdhaXQgd2FsbGV0LnNpZ25UcmFuc2FjdGlvbih7IHR4UHJlYnVpbGQgfSk7XG5cbiAgICBtb2NrQmFzZUNvaW4uc2lnblRyYW5zYWN0aW9uLmNhbGxlZE9uY2Uuc2hvdWxkLmJlLnRydWUoKTtcbiAgICBjb25zdCBjYWxsQXJncyA9IG1vY2tCYXNlQ29pbi5zaWduVHJhbnNhY3Rpb24uZ2V0Q2FsbCgwKS5hcmdzWzBdO1xuICAgIGNhbGxBcmdzLndhbGxldC5zaG91bGQuZXF1YWwod2FsbGV0KTtcbiAgfSk7XG59KTtcbiJdfQ==
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"walletsWebauthn.d.ts","sourceRoot":"","sources":["../../../../../test/unit/bitgo/wallet/walletsWebauthn.ts"],"names":[],"mappings":"AAEA,OAAO,QAAQ,CAAC"}
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
const assert = __importStar(require("assert"));
|
|
37
|
+
const sinon = __importStar(require("sinon"));
|
|
38
|
+
require("should");
|
|
39
|
+
const wallets_1 = require("../../../../src/bitgo/wallet/wallets");
|
|
40
|
+
describe('Wallets - WebAuthn wallet creation', function () {
|
|
41
|
+
let wallets;
|
|
42
|
+
let mockBitGo;
|
|
43
|
+
let mockBaseCoin;
|
|
44
|
+
let mockKeychains;
|
|
45
|
+
const userPrv = 'xprvSomeUserPrivateKey';
|
|
46
|
+
const userPub = 'xpub661MyMwAqRbcFtXgS5sYJABqqG9YLmC4Q1Rdap9gSE8NqtwybGhePY2gZ29ESFjqJoCu1Rupje8YtGqsefD265TMg7usUDFdp6W1EGMcet8';
|
|
47
|
+
const backupPub = 'xpub661MyMwAqRbcGczjuMoRm6dXaLDEhW1u34gKenbeYqAix21mdUKJyuyu5F1rzYGVxyL6tmgBUAEPrEz92mBXjByMRiJdba9wpnN37RLLAXa';
|
|
48
|
+
const bitgoPub = 'xpub661MyMwAqRbcEYS8w7XLSVeEsBXy79zSzH1J8vCdxAZningWLdN3zgtU6LBpB85b3D2yc8sfvZU521AAwdZafEz7mnzBBsz4wKY5fTtTQBm';
|
|
49
|
+
beforeEach(function () {
|
|
50
|
+
mockKeychains = {
|
|
51
|
+
create: sinon.stub().returns({ pub: userPub, prv: userPrv }),
|
|
52
|
+
add: sinon.stub().resolves({ id: 'user-key-id', pub: userPub, encryptedPrv: 'encrypted-prv' }),
|
|
53
|
+
createBackup: sinon.stub().resolves({ id: 'backup-key-id', pub: backupPub }),
|
|
54
|
+
createBitGo: sinon.stub().resolves({ id: 'bitgo-key-id', pub: bitgoPub }),
|
|
55
|
+
};
|
|
56
|
+
const mockWalletData = { id: 'wallet-id', keys: ['user-key-id', 'backup-key-id', 'bitgo-key-id'] };
|
|
57
|
+
mockBitGo = {
|
|
58
|
+
post: sinon.stub().returns({
|
|
59
|
+
send: sinon.stub().returns({
|
|
60
|
+
result: sinon.stub().resolves(mockWalletData),
|
|
61
|
+
}),
|
|
62
|
+
}),
|
|
63
|
+
encrypt: sinon
|
|
64
|
+
.stub()
|
|
65
|
+
.callsFake(({ password, input }) => `encrypted:${password}:${input}`),
|
|
66
|
+
setRequestTracer: sinon.stub(),
|
|
67
|
+
};
|
|
68
|
+
mockBaseCoin = {
|
|
69
|
+
isEVM: sinon.stub().returns(false),
|
|
70
|
+
supportsTss: sinon.stub().returns(false),
|
|
71
|
+
getFamily: sinon.stub().returns('btc'),
|
|
72
|
+
getDefaultMultisigType: sinon.stub().returns('onchain'),
|
|
73
|
+
keychains: sinon.stub().returns(mockKeychains),
|
|
74
|
+
url: sinon.stub().returns('/test/url'),
|
|
75
|
+
isValidMofNSetup: sinon.stub().returns(true),
|
|
76
|
+
getConfig: sinon.stub().returns({ features: [] }),
|
|
77
|
+
supplementGenerateWallet: sinon.stub().callsFake((params) => Promise.resolve(params)),
|
|
78
|
+
signMessage: sinon.stub().resolves(Buffer.from('aabbcc', 'hex')),
|
|
79
|
+
};
|
|
80
|
+
wallets = new wallets_1.Wallets(mockBitGo, mockBaseCoin);
|
|
81
|
+
});
|
|
82
|
+
afterEach(function () {
|
|
83
|
+
sinon.restore();
|
|
84
|
+
});
|
|
85
|
+
describe('generateWallet with webauthnInfo', function () {
|
|
86
|
+
it('should add webauthnDevices to keychain params when webauthnInfo is provided', async function () {
|
|
87
|
+
const webauthnInfo = {
|
|
88
|
+
otpDeviceId: 'device-123',
|
|
89
|
+
prfSalt: 'salt-abc',
|
|
90
|
+
passphrase: 'prf-derived-passphrase',
|
|
91
|
+
};
|
|
92
|
+
await wallets.generateWallet({
|
|
93
|
+
label: 'Test Wallet',
|
|
94
|
+
passphrase: 'wallet-passphrase',
|
|
95
|
+
webauthnInfo,
|
|
96
|
+
});
|
|
97
|
+
assert.strictEqual(mockKeychains.add.calledOnce, true);
|
|
98
|
+
const addParams = mockKeychains.add.firstCall.args[0];
|
|
99
|
+
addParams.should.have.property('webauthnDevices');
|
|
100
|
+
addParams.webauthnDevices.should.have.length(1);
|
|
101
|
+
addParams.webauthnDevices[0].should.have.property('otpDeviceId', webauthnInfo.otpDeviceId);
|
|
102
|
+
addParams.webauthnDevices[0].should.have.property('prfSalt', webauthnInfo.prfSalt);
|
|
103
|
+
addParams.webauthnDevices[0].should.have.property('encryptedPrv');
|
|
104
|
+
});
|
|
105
|
+
it('should encrypt user private key with the webauthn passphrase', async function () {
|
|
106
|
+
const webauthnPassphrase = 'prf-derived-passphrase';
|
|
107
|
+
await wallets.generateWallet({
|
|
108
|
+
label: 'Test Wallet',
|
|
109
|
+
passphrase: 'wallet-passphrase',
|
|
110
|
+
webauthnInfo: {
|
|
111
|
+
otpDeviceId: 'device-123',
|
|
112
|
+
prfSalt: 'salt-abc',
|
|
113
|
+
passphrase: webauthnPassphrase,
|
|
114
|
+
},
|
|
115
|
+
});
|
|
116
|
+
const addParams = mockKeychains.add.firstCall.args[0];
|
|
117
|
+
const expectedEncryptedPrv = `encrypted:${webauthnPassphrase}:${userPrv}`;
|
|
118
|
+
addParams.webauthnDevices[0].should.have.property('encryptedPrv', expectedEncryptedPrv);
|
|
119
|
+
});
|
|
120
|
+
it('should also encrypt user private key with wallet passphrase when webauthnInfo is provided', async function () {
|
|
121
|
+
const walletPassphrase = 'wallet-passphrase';
|
|
122
|
+
await wallets.generateWallet({
|
|
123
|
+
label: 'Test Wallet',
|
|
124
|
+
passphrase: walletPassphrase,
|
|
125
|
+
webauthnInfo: {
|
|
126
|
+
otpDeviceId: 'device-123',
|
|
127
|
+
prfSalt: 'salt-abc',
|
|
128
|
+
passphrase: 'prf-derived-passphrase',
|
|
129
|
+
},
|
|
130
|
+
});
|
|
131
|
+
const addParams = mockKeychains.add.firstCall.args[0];
|
|
132
|
+
const expectedEncryptedPrv = `encrypted:${walletPassphrase}:${userPrv}`;
|
|
133
|
+
addParams.should.have.property('encryptedPrv', expectedEncryptedPrv);
|
|
134
|
+
});
|
|
135
|
+
it('should use separate encrypt calls for wallet passphrase and webauthn passphrase', async function () {
|
|
136
|
+
const walletPassphrase = 'wallet-passphrase';
|
|
137
|
+
const webauthnPassphrase = 'prf-derived-passphrase';
|
|
138
|
+
await wallets.generateWallet({
|
|
139
|
+
label: 'Test Wallet',
|
|
140
|
+
passphrase: walletPassphrase,
|
|
141
|
+
webauthnInfo: {
|
|
142
|
+
otpDeviceId: 'device-123',
|
|
143
|
+
prfSalt: 'salt-abc',
|
|
144
|
+
passphrase: webauthnPassphrase,
|
|
145
|
+
},
|
|
146
|
+
});
|
|
147
|
+
const encryptCalls = mockBitGo.encrypt.getCalls();
|
|
148
|
+
const passwordsUsed = encryptCalls.map((call) => call.args[0].password);
|
|
149
|
+
passwordsUsed.should.containEql(walletPassphrase);
|
|
150
|
+
passwordsUsed.should.containEql(webauthnPassphrase);
|
|
151
|
+
});
|
|
152
|
+
it('should not add webauthnDevices when webauthnInfo is not provided', async function () {
|
|
153
|
+
await wallets.generateWallet({
|
|
154
|
+
label: 'Test Wallet',
|
|
155
|
+
passphrase: 'wallet-passphrase',
|
|
156
|
+
});
|
|
157
|
+
assert.strictEqual(mockKeychains.add.calledOnce, true);
|
|
158
|
+
const addParams = mockKeychains.add.firstCall.args[0];
|
|
159
|
+
addParams.should.not.have.property('webauthnDevices');
|
|
160
|
+
});
|
|
161
|
+
it('should not add webauthnDevices when userKey is explicitly provided (no prv available)', async function () {
|
|
162
|
+
// When a user-provided public key is used, there is no private key to encrypt, so webauthnDevices is skipped
|
|
163
|
+
await wallets.generateWallet({
|
|
164
|
+
label: 'Test Wallet',
|
|
165
|
+
userKey: userPub,
|
|
166
|
+
backupXpub: backupPub,
|
|
167
|
+
webauthnInfo: {
|
|
168
|
+
otpDeviceId: 'device-123',
|
|
169
|
+
prfSalt: 'salt-abc',
|
|
170
|
+
passphrase: 'prf-derived-passphrase',
|
|
171
|
+
},
|
|
172
|
+
});
|
|
173
|
+
// add is called for both user keychain (pub-only) and backup keychain - neither should have webauthnDevices
|
|
174
|
+
const allAddCalls = mockKeychains.add.getCalls();
|
|
175
|
+
assert.ok(allAddCalls.length > 0, 'expected keychains().add to be called at least once');
|
|
176
|
+
for (const call of allAddCalls) {
|
|
177
|
+
call.args[0].should.not.have.property('webauthnDevices');
|
|
178
|
+
}
|
|
179
|
+
});
|
|
180
|
+
it('should return wallet with keychains when webauthnInfo is provided', async function () {
|
|
181
|
+
const result = await wallets.generateWallet({
|
|
182
|
+
label: 'Test Wallet',
|
|
183
|
+
passphrase: 'wallet-passphrase',
|
|
184
|
+
webauthnInfo: {
|
|
185
|
+
otpDeviceId: 'device-123',
|
|
186
|
+
prfSalt: 'salt-abc',
|
|
187
|
+
passphrase: 'prf-derived-passphrase',
|
|
188
|
+
},
|
|
189
|
+
});
|
|
190
|
+
result.should.have.property('wallet');
|
|
191
|
+
result.should.have.property('userKeychain');
|
|
192
|
+
result.should.have.property('backupKeychain');
|
|
193
|
+
result.should.have.property('bitgoKeychain');
|
|
194
|
+
});
|
|
195
|
+
});
|
|
196
|
+
});
|
|
197
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2FsbGV0c1dlYmF1dGhuLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGVzdC91bml0L2JpdGdvL3dhbGxldC93YWxsZXRzV2ViYXV0aG4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSwrQ0FBaUM7QUFDakMsNkNBQStCO0FBQy9CLGtCQUFnQjtBQUNoQixrRUFBK0Q7QUFFL0QsUUFBUSxDQUFDLG9DQUFvQyxFQUFFO0lBQzdDLElBQUksT0FBZ0IsQ0FBQztJQUNyQixJQUFJLFNBQWMsQ0FBQztJQUNuQixJQUFJLFlBQWlCLENBQUM7SUFDdEIsSUFBSSxhQUFrQixDQUFDO0lBRXZCLE1BQU0sT0FBTyxHQUFHLHdCQUF3QixDQUFDO0lBQ3pDLE1BQU0sT0FBTyxHQUNYLGlIQUFpSCxDQUFDO0lBQ3BILE1BQU0sU0FBUyxHQUNiLGlIQUFpSCxDQUFDO0lBQ3BILE1BQU0sUUFBUSxHQUNaLGlIQUFpSCxDQUFDO0lBRXBILFVBQVUsQ0FBQztRQUNULGFBQWEsR0FBRztZQUNkLE1BQU0sRUFBRSxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsT0FBTyxDQUFDLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsT0FBTyxFQUFFLENBQUM7WUFDNUQsR0FBRyxFQUFFLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFFLEVBQUUsYUFBYSxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsWUFBWSxFQUFFLGVBQWUsRUFBRSxDQUFDO1lBQzlGLFlBQVksRUFBRSxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRSxFQUFFLGVBQWUsRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLENBQUM7WUFDNUUsV0FBVyxFQUFFLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFFLEVB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QyxRQUFRLEVBQUUsQ0FBQztZQUNqRCxNQUFNLENBQUMsRUFBRSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLHFEQUFxRCxDQUFDLENBQUM7WUFDekYsS0FBSyxNQUFNLElBQUksSUFBSSxXQUFXLEVBQUUsQ0FBQztnQkFDL0IsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsaUJBQWlCLENBQUMsQ0FBQztZQUMzRCxDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsbUVBQW1FLEVBQUUsS0FBSztZQUMzRSxNQUFNLE1BQU0sR0FBRyxNQUFNLE9BQU8sQ0FBQyxjQUFjLENBQUM7Z0JBQzFDLEtBQUssRUFBRSxhQUFhO2dCQUNwQixVQUFVLEVBQUUsbUJBQW1CO2dCQUMvQixZQUFZLEVBQUU7b0JBQ1osV0FBVyxFQUFFLFlBQVk7b0JBQ3pCLE9BQU8sRUFBRSxVQUFVO29CQUNuQixVQUFVLEVBQUUsd0JBQXdCO2lCQUNyQzthQUNGLENBQUMsQ0FBQztZQUVILE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUN0QyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLENBQUM7WUFDNUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLENBQUM7WUFDOUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQy9DLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0ICogYXMgc2lub24gZnJvbSAnc2lub24nO1xuaW1wb3J0ICdzaG91bGQnO1xuaW1wb3J0IHsgV2FsbGV0cyB9IGZyb20gJy4uLy4uLy4uLy4uL3NyYy9iaXRnby93YWxsZXQvd2FsbGV0cyc7XG5cbmRlc2NyaWJlKCdXYWxsZXRzIC0gV2ViQXV0aG4gd2FsbGV0IGNyZWF0aW9uJywgZnVuY3Rpb24gKCkge1xuICBsZXQgd2FsbGV0czogV2FsbGV0cztcbiAgbGV0IG1vY2tCaXRHbzogYW55O1xuICBsZXQgbW9ja0Jhc2VDb2luOiBhbnk7XG4gIGxldCBtb2NrS2V5Y2hhaW5zOiBhbnk7XG5cbiAgY29uc3QgdXNlclBydiA9ICd4cHJ2U29tZVVzZXJQcml2YXRlS2V5JztcbiAgY29uc3QgdXNlclB1YiA9XG4gICAgJ3hwdWI2NjFNeU13QXFSYmNGdFhnUzVzWUpBQnFxRzlZTG1DNFExUmRhcDlnU0U4TnF0d3liR2hlUFkyZ1oyOUVTRmpxSm9DdTFSdXBqZThZdEdxc2VmRDI2NVRNZzd1c1VERmRwNlcxRUdNY2V0OCc7XG4gIGNvbnN0IGJhY2t1cFB1YiA9XG4gICAgJ3hwdWI2NjFNeU13QXFSYmNHY3pqdU1vUm02ZFhhTERFaFcxdTM0Z0tlbmJlWXFBaXgyMW1kVUtKeXV5dTVGMXJ6WUdWeHlMNnRtZ0JVQUVQckV6OTJtQlhqQnlNUmlKZGJhOXdwbk4zN1JMTEFYYSc7XG4gIGNvbnN0IGJpdGdvUHViID1cbiAgICAneHB1YjY2MU15TXdBcVJiY0VZUzh3N1hMU1ZlRXNCWHk3OXpTekgxSjh2Q2R4QVpuaW5nV0xkTjN6Z3RVNkxCcEI4NWIzRDJ5YzhzZnZaVTUyMUFBd2RaYWZFejdtbnpCQnN6NHdLWTVmVHRUUUJtJztcblxuICBiZWZvcmVFYWNoKGZ1bmN0aW9uICgpIHtcbiAgICBtb2NrS2V5Y2hhaW5zID0ge1xuICAgICAgY3JlYXRlOiBzaW5vbi5zdHViKCkucmV0dXJucyh7IHB1YjogdXNlclB1YiwgcHJ2OiB1c2VyUHJ2IH0pLFxuICAgICAgYWRkOiBzaW5vbi5zdHViKCkucmVzb2x2ZXMoeyBpZDogJ3VzZXIta2V5LWlkJywgcHViOiB1c2VyUHViLCBlbmNyeXB0ZWRQcnY6ICdlbmNyeXB0ZWQtcHJ2JyB9KSxcbiAgICAgIGNyZWF0ZUJhY2t1cDogc2lub24uc3R1YigpLnJlc29sdmVzKHsgaWQ6ICdiYWNrdXAta2V5LWlkJywgcHViOiBiYWNrdXBQdWIgfSksXG4gICAgICBjcmVhdGVCaXRHbzogc2lub24uc3R1YigpLnJlc29sdmVzKHsgaWQ6ICdiaXRnby1rZXktaWQnLCBwdWI6IGJpdGdvUHViIH0pLFxuICAgIH07XG5cbiAgICBjb25zdCBtb2NrV2FsbGV0RGF0YSA9IHsgaWQ6ICd3YWxsZXQtaWQnLCBrZXlzOiBbJ3VzZXIta2V5LWlkJywgJ2JhY2t1cC1rZXktaWQnLCAnYml0Z28ta2V5LWlkJ10gfTtcblxuICAgIG1vY2tCaXRHbyA9IHtcbiAgICAgIHBvc3Q6IHNpbm9uLnN0dWIoKS5yZXR1cm5zKHtcbiAgICAgICAgc2VuZDogc2lub24uc3R1YigpLnJldHVybnMoe1xuICAgICAgICAgIHJlc3VsdDogc2lub24uc3R1YigpLnJlc29sdmVzKG1vY2tXYWxsZXREYXRhKSxcbiAgICAgICAgfSksXG4gICAgICB9KSxcbiAgICAgIGVuY3J5cHQ6IHNpbm9uXG4gICAgICAgIC5zdHViKClcbiAgICAgICAgLmNhbGxzRmFrZSgoeyBwYXNzd29yZCwgaW5wdXQgfTogeyBwYXNzd29yZDogc3RyaW5nOyBpbnB1dDogc3RyaW5nIH0pID0+IGBlbmNyeXB0ZWQ6JHtwYXNzd29yZH06JHtpbnB1dH1gKSxcbiAgICAgIHNldFJlcXVlc3RUcmFjZXI6IHNpbm9uLnN0dWIoKSxcbiAgICB9O1xuXG4gICAgbW9ja0Jhc2VDb2luID0ge1xuICAgICAgaXNFVk06IHNpbm9uLnN0dWIoKS5yZXR1cm5zKGZhbHNlKSxcbiAgICAgIHN1cHBvcnRzVHNzOiBzaW5vbi5zdHViKCkucmV0dXJucyhmYWxzZSksXG4gICAgICBnZXRGYW1pbHk6IHNpbm9uLnN0dWIoKS5yZXR1cm5zKCdidGMnKSxcbiAgICAgIGdldERlZmF1bHRNdWx0aXNpZ1R5cGU6IHNpbm9uLnN0dWIoKS5yZXR1cm5zKCdvbmNoYWluJyksXG4gICAgICBrZXljaGFpbnM6IHNpbm9uLnN0dWIoKS5yZXR1cm5zKG1vY2tLZXljaGFpbnMpLFxuICAgICAgdXJsOiBzaW5vbi5zdHViKCkucmV0dXJucygnL3Rlc3QvdXJsJyksXG4gICAgICBpc1ZhbGlkTW9mTlNldHVwOiBzaW5vbi5zdHViKCkucmV0dXJucyh0cnVlKSxcbiAgICAgIGdldENvbmZpZzogc2lub24uc3R1YigpLnJldHVybnMoeyBmZWF0dXJlczogW10gfSksXG4gICAgICBzdXBwbGVtZW50R2VuZXJhdGVXYWxsZXQ6IHNpbm9uLnN0dWIoKS5jYWxsc0Zha2UoKHBhcmFtczogYW55KSA9PiBQcm9taXNlLnJlc29sdmUocGFyYW1zKSksXG4gICAgICBzaWduTWVzc2FnZTogc2lub24uc3R1YigpLnJlc29sdmVzKEJ1ZmZlci5mcm9tKCdhYWJiY2MnLCAnaGV4JykpLFxuICAgIH07XG5cbiAgICB3YWxsZXRzID0gbmV3IFdhbGxldHMobW9ja0JpdEdvLCBtb2NrQmFzZUNvaW4pO1xuICB9KTtcblxuICBhZnRlckVhY2goZnVuY3Rpb24gKCkge1xuICAgIHNpbm9uLnJlc3RvcmUoKTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2dlbmVyYXRlV2FsbGV0IHdpdGggd2ViYXV0aG5JbmZvJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgYWRkIHdlYmF1dGhuRGV2aWNlcyB0byBrZXljaGFpbiBwYXJhbXMgd2hlbiB3ZWJhdXRobkluZm8gaXMgcHJvdmlkZWQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB3ZWJhdXRobkluZm8gPSB7XG4gICAgICAgIG90cERldmljZUlkOiAnZGV2aWNlLTEyMycsXG4gICAgICAgIHByZlNhbHQ6ICdzYWx0LWFiYycsXG4gICAgICAgIHBhc3NwaHJhc2U6ICdwcmYtZGVyaXZlZC1wYXNzcGhyYXNlJyxcbiAgICAgIH07XG5cbiAgICAgIGF3YWl0IHdhbGxldHMuZ2VuZXJhdGVXYWxsZXQoe1xuICAgICAgICBsYWJlbDogJ1Rlc3QgV2FsbGV0JyxcbiAgICAgICAgcGFzc3BocmFzZTogJ3dhbGxldC1wYXNzcGhyYXNlJyxcbiAgICAgICAgd2ViYXV0aG5JbmZvLFxuICAgICAgfSk7XG5cbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChtb2NrS2V5Y2hhaW5zLmFkZC5jYWxsZWRPbmNlLCB0cnVlKTtcbiAgICAgIGNvbnN0IGFkZFBhcmFtcyA9IG1vY2tLZXljaGFpbnMuYWRkLmZpcnN0Q2FsbC5hcmdzWzBdO1xuICAgICAgYWRkUGFyYW1zLnNob3VsZC5oYXZlLnByb3BlcnR5KCd3ZWJhdXRobkRldmljZXMnKTtcbiAgICAgIGFkZFBhcmFtcy53ZWJhdXRobkRldmljZXMuc2hvdWxkLmhhdmUubGVuZ3RoKDEpO1xuICAgICAgYWRkUGFyYW1zLndlYmF1dGhuRGV2aWNlc1swXS5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgnb3RwRGV2aWNlSWQnLCB3ZWJhdXRobkluZm8ub3RwRGV2aWNlSWQpO1xuICAgICAgYWRkUGFyYW1zLndlYmF1dGhuRGV2aWNlc1swXS5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgncHJmU2FsdCcsIHdlYmF1dGhuSW5mby5wcmZTYWx0KTtcbiAgICAgIGFkZFBhcmFtcy53ZWJhdXRobkRldmljZXNbMF0uc2hvdWxkLmhhdmUucHJvcGVydHkoJ2VuY3J5cHRlZFBydicpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBlbmNyeXB0IHVzZXIgcHJpdmF0ZSBrZXkgd2l0aCB0aGUgd2ViYXV0aG4gcGFzc3BocmFzZScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHdlYmF1dGhuUGFzc3BocmFzZSA9ICdwcmYtZGVyaXZlZC1wYXNzcGhyYXNlJztcblxuICAgICAgYXdhaXQgd2FsbGV0cy5nZW5lcmF0ZVdhbGxldCh7XG4gICAgICAgIGxhYmVsOiAnVGVzdCBXYWxsZXQnLFxuICAgICAgICBwYXNzcGhyYXNlOiAnd2FsbGV0LXBhc3NwaHJhc2UnLFxuICAgICAgICB3ZWJhdXRobkluZm86IHtcbiAgICAgICAgICBvdHBEZXZpY2VJZDogJ2RldmljZS0xMjMnLFxuICAgICAgICAgIHByZlNhbHQ6ICdzYWx0LWFiYycsXG4gICAgICAgICAgcGFzc3BocmFzZTogd2ViYXV0aG5QYXNzcGhyYXNlLFxuICAgICAgICB9LFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IGFkZFBhcmFtcyA9IG1vY2tLZXljaGFpbnMuYWRkLmZpcnN0Q2FsbC5hcmdzWzBdO1xuICAgICAgY29uc3QgZXhwZWN0ZWRFbmNyeXB0ZWRQcnYgPSBgZW5jcnlwdGVkOiR7d2ViYXV0aG5QYXNzcGhyYXNlfToke3VzZXJQcnZ9YDtcbiAgICAgIGFkZFBhcmFtcy53ZWJhdXRobkRldmljZXNbMF0uc2hvdWxkLmhhdmUucHJvcGVydHkoJ2VuY3J5cHRlZFBydicsIGV4cGVjdGVkRW5jcnlwdGVkUHJ2KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYWxzbyBlbmNyeXB0IHVzZXIgcHJpdmF0ZSBrZXkgd2l0aCB3YWxsZXQgcGFzc3BocmFzZSB3aGVuIHdlYmF1dGhuSW5mbyBpcyBwcm92aWRlZCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHdhbGxldFBhc3NwaHJhc2UgPSAnd2FsbGV0LXBhc3NwaHJhc2UnO1xuXG4gICAgICBhd2FpdCB3YWxsZXRzLmdlbmVyYXRlV2FsbGV0KHtcbiAgICAgICAgbGFiZWw6ICdUZXN0IFdhbGxldCcsXG4gICAgICAgIHBhc3NwaHJhc2U6IHdhbGxldFBhc3NwaHJhc2UsXG4gICAgICAgIHdlYmF1dGhuSW5mbzoge1xuICAgICAgICAgIG90cERldmljZUlkOiAnZGV2aWNlLTEyMycsXG4gICAgICAgICAgcHJmU2FsdDogJ3NhbHQtYWJjJyxcbiAgICAgICAgICBwYXNzcGhyYXNlOiAncHJmLWRlcml2ZWQtcGFzc3BocmFzZScsXG4gICAgICAgIH0sXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgYWRkUGFyYW1zID0gbW9ja0tleWNoYWlucy5hZGQuZmlyc3RDYWxsLmFyZ3NbMF07XG4gICAgICBjb25zdCBleHBlY3RlZEVuY3J5cHRlZFBydiA9IGBlbmNyeXB0ZWQ6JHt3YWxsZXRQYXNzcGhyYXNlfToke3VzZXJQcnZ9YDtcbiAgICAgIGFkZFBhcmFtcy5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgnZW5jcnlwdGVkUHJ2JywgZXhwZWN0ZWRFbmNyeXB0ZWRQcnYpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB1c2Ugc2VwYXJhdGUgZW5jcnlwdCBjYWxscyBmb3Igd2FsbGV0IHBhc3NwaHJhc2UgYW5kIHdlYmF1dGhuIHBhc3NwaHJhc2UnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB3YWxsZXRQYXNzcGhyYXNlID0gJ3dhbGxldC1wYXNzcGhyYXNlJztcbiAgICAgIGNvbnN0IHdlYmF1dGhuUGFzc3BocmFzZSA9ICdwcmYtZGVyaXZlZC1wYXNzcGhyYXNlJztcblxuICAgICAgYXdhaXQgd2FsbGV0cy5nZW5lcmF0ZVdhbGxldCh7XG4gICAgICAgIGxhYmVsOiAnVGVzdCBXYWxsZXQnLFxuICAgICAgICBwYXNzcGhyYXNlOiB3YWxsZXRQYXNzcGhyYXNlLFxuICAgICAgICB3ZWJhdXRobkluZm86IHtcbiAgICAgICAgICBvdHBEZXZpY2VJZDogJ2RldmljZS0xMjMnLFxuICAgICAgICAgIHByZlNhbHQ6ICdzYWx0LWFiYycsXG4gICAgICAgICAgcGFzc3BocmFzZTogd2ViYXV0aG5QYXNzcGhyYXNlLFxuICAgICAgICB9LFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IGVuY3J5cHRDYWxscyA9IG1vY2tCaXRHby5lbmNyeXB0LmdldENhbGxzKCk7XG4gICAgICBjb25zdCBwYXNzd29yZHNVc2VkID0gZW5jcnlwdENhbGxzLm1hcCgoY2FsbDogc2lub24uU2lub25TcHlDYWxsKSA9PiBjYWxsLmFyZ3NbMF0ucGFzc3dvcmQpO1xuICAgICAgcGFzc3dvcmRzVXNlZC5zaG91bGQuY29udGFpbkVxbCh3YWxsZXRQYXNzcGhyYXNlKTtcbiAgICAgIHBhc3N3b3Jkc1VzZWQuc2hvdWxkLmNvbnRhaW5FcWwod2ViYXV0aG5QYXNzcGhyYXNlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgbm90IGFkZCB3ZWJhdXRobkRldmljZXMgd2hlbiB3ZWJhdXRobkluZm8gaXMgbm90IHByb3ZpZGVkJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgYXdhaXQgd2FsbGV0cy5nZW5lcmF0ZVdhbGxldCh7XG4gICAgICAgIGxhYmVsOiAnVGVzdCBXYWxsZXQnLFxuICAgICAgICBwYXNzcGhyYXNlOiAnd2FsbGV0LXBhc3NwaHJhc2UnLFxuICAgICAgfSk7XG5cbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChtb2NrS2V5Y2hhaW5zLmFkZC5jYWxsZWRPbmNlLCB0cnVlKTtcbiAgICAgIGNvbnN0IGFkZFBhcmFtcyA9IG1vY2tLZXljaGFpbnMuYWRkLmZpcnN0Q2FsbC5hcmdzWzBdO1xuICAgICAgYWRkUGFyYW1zLnNob3VsZC5ub3QuaGF2ZS5wcm9wZXJ0eSgnd2ViYXV0aG5EZXZpY2VzJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIG5vdCBhZGQgd2ViYXV0aG5EZXZpY2VzIHdoZW4gdXNlcktleSBpcyBleHBsaWNpdGx5IHByb3ZpZGVkIChubyBwcnYgYXZhaWxhYmxlKScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIFdoZW4gYSB1c2VyLXByb3ZpZGVkIHB1YmxpYyBrZXkgaXMgdXNlZCwgdGhlcmUgaXMgbm8gcHJpdmF0ZSBrZXkgdG8gZW5jcnlwdCwgc28gd2ViYXV0aG5EZXZpY2VzIGlzIHNraXBwZWRcbiAgICAgIGF3YWl0IHdhbGxldHMuZ2VuZXJhdGVXYWxsZXQoe1xuICAgICAgICBsYWJlbDogJ1Rlc3QgV2FsbGV0JyxcbiAgICAgICAgdXNlcktleTogdXNlclB1YixcbiAgICAgICAgYmFja3VwWHB1YjogYmFja3VwUHViLFxuICAgICAgICB3ZWJhdXRobkluZm86IHtcbiAgICAgICAgICBvdHBEZXZpY2VJZDogJ2RldmljZS0xMjMnLFxuICAgICAgICAgIHByZlNhbHQ6ICdzYWx0LWFiYycsXG4gICAgICAgICAgcGFzc3BocmFzZTogJ3ByZi1kZXJpdmVkLXBhc3NwaHJhc2UnLFxuICAgICAgICB9LFxuICAgICAgfSk7XG5cbiAgICAgIC8vIGFkZCBpcyBjYWxsZWQgZm9yIGJvdGggdXNlciBrZXljaGFpbiAocHViLW9ubHkpIGFuZCBiYWNrdXAga2V5Y2hhaW4gLSBuZWl0aGVyIHNob3VsZCBoYXZlIHdlYmF1dGhuRGV2aWNlc1xuICAgICAgY29uc3QgYWxsQWRkQ2FsbHMgPSBtb2NrS2V5Y2hhaW5zLmFkZC5nZXRDYWxscygpO1xuICAgICAgYXNzZXJ0Lm9rKGFsbEFkZENhbGxzLmxlbmd0aCA+IDAsICdleHBlY3RlZCBrZXljaGFpbnMoKS5hZGQgdG8gYmUgY2FsbGVkIGF0IGxlYXN0IG9uY2UnKTtcbiAgICAgIGZvciAoY29uc3QgY2FsbCBvZiBhbGxBZGRDYWxscykge1xuICAgICAgICBjYWxsLmFyZ3NbMF0uc2hvdWxkLm5vdC5oYXZlLnByb3BlcnR5KCd3ZWJhdXRobkRldmljZXMnKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIHdhbGxldCB3aXRoIGtleWNoYWlucyB3aGVuIHdlYmF1dGhuSW5mbyBpcyBwcm92aWRlZCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHdhbGxldHMuZ2VuZXJhdGVXYWxsZXQoe1xuICAgICAgICBsYWJlbDogJ1Rlc3QgV2FsbGV0JyxcbiAgICAgICAgcGFzc3BocmFzZTogJ3dhbGxldC1wYXNzcGhyYXNlJyxcbiAgICAgICAgd2ViYXV0aG5JbmZvOiB7XG4gICAgICAgICAgb3RwRGV2aWNlSWQ6ICdkZXZpY2UtMTIzJyxcbiAgICAgICAgICBwcmZTYWx0OiAnc2FsdC1hYmMnLFxuICAgICAgICAgIHBhc3NwaHJhc2U6ICdwcmYtZGVyaXZlZC1wYXNzcGhyYXNlJyxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuXG4gICAgICByZXN1bHQuc2hvdWxkLmhhdmUucHJvcGVydHkoJ3dhbGxldCcpO1xuICAgICAgcmVzdWx0LnNob3VsZC5oYXZlLnByb3BlcnR5KCd1c2VyS2V5Y2hhaW4nKTtcbiAgICAgIHJlc3VsdC5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgnYmFja3VwS2V5Y2hhaW4nKTtcbiAgICAgIHJlc3VsdC5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgnYml0Z29LZXljaGFpbicpO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ofc.d.ts","sourceRoot":"","sources":["../../../../test/unit/coins/ofc.ts"],"names":[],"mappings":"AAIA,OAAO,QAAQ,CAAC"}
|