@bitgo/sdk-core 36.42.0 → 36.43.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/trading/iTradingAccount.d.ts +1 -6
- 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 +5 -3
- 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 +1 -13
- package/dist/src/bitgo/trading/tradingAccount.d.ts.map +1 -1
- package/dist/src/bitgo/trading/tradingAccount.js +2 -32
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2.d.ts +4 -0
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2.js +25 -11
- package/dist/src/bitgo/wallet/iWallet.d.ts +0 -1
- package/dist/src/bitgo/wallet/iWallet.d.ts.map +1 -1
- package/dist/src/bitgo/wallet/iWallet.js +1 -1
- package/dist/src/coins/ofc.d.ts +1 -15
- package/dist/src/coins/ofc.d.ts.map +1 -1
- package/dist/src/coins/ofc.js +1 -8
- package/dist/src/coins/ofcToken.d.ts +3 -5
- package/dist/src/coins/ofcToken.d.ts.map +1 -1
- package/dist/src/coins/ofcToken.js +4 -14
- 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 +465 -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/tsconfig.tsbuildinfo +1 -1
- package/package.json +4 -4
- package/dist/test/unit/bitgo/trading/tradingAccount.d.ts +0 -2
- package/dist/test/unit/bitgo/trading/tradingAccount.d.ts.map +0 -1
- package/dist/test/unit/bitgo/trading/tradingAccount.js +0 -113
- package/dist/test/unit/bitgo/wallet/ofcWalletSignTransaction.d.ts +0 -2
- package/dist/test/unit/bitgo/wallet/ofcWalletSignTransaction.d.ts.map +0 -1
- package/dist/test/unit/bitgo/wallet/ofcWalletSignTransaction.js +0 -70
- package/dist/test/unit/coins/ofc.d.ts +0 -2
- package/dist/test/unit/coins/ofc.d.ts.map +0 -1
- package/dist/test/unit/coins/ofc.js +0 -124
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bitgo/sdk-core",
|
|
3
|
-
"version": "36.
|
|
3
|
+
"version": "36.43.0",
|
|
4
4
|
"description": "core library functions for BitGoJS",
|
|
5
5
|
"main": "./dist/src/index.js",
|
|
6
6
|
"types": "./dist/src/index.d.ts",
|
|
@@ -41,10 +41,10 @@
|
|
|
41
41
|
},
|
|
42
42
|
"dependencies": {
|
|
43
43
|
"@bitgo/public-types": "5.96.2",
|
|
44
|
-
"@bitgo/sdk-lib-mpc": "^10.
|
|
44
|
+
"@bitgo/sdk-lib-mpc": "^10.12.0",
|
|
45
45
|
"@bitgo/secp256k1": "^1.11.0",
|
|
46
46
|
"@bitgo/sjcl": "^1.1.0",
|
|
47
|
-
"@bitgo/statics": "^58.
|
|
47
|
+
"@bitgo/statics": "^58.38.0",
|
|
48
48
|
"@bitgo/utxo-lib": "^11.22.0",
|
|
49
49
|
"@noble/curves": "1.8.1",
|
|
50
50
|
"@stablelib/hex": "^1.0.0",
|
|
@@ -78,5 +78,5 @@
|
|
|
78
78
|
"@types/lodash": "^4.14.151",
|
|
79
79
|
"nyc": "^15.0.0"
|
|
80
80
|
},
|
|
81
|
-
"gitHead": "
|
|
81
|
+
"gitHead": "292de3c9c18627c8a70cfbec2f8330f8be56bb77"
|
|
82
82
|
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"tradingAccount.d.ts","sourceRoot":"","sources":["../../../../../test/unit/bitgo/trading/tradingAccount.ts"],"names":[],"mappings":"AAIA,OAAO,QAAQ,CAAC"}
|
|
@@ -1,113 +0,0 @@
|
|
|
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 mockBitGo;
|
|
15
|
-
let mockWallet;
|
|
16
|
-
let mockBaseCoin;
|
|
17
|
-
const enterpriseId = 'test-enterprise-id';
|
|
18
|
-
const walletPassphrase = 'test-passphrase';
|
|
19
|
-
const encryptedPrv = 'encrypted-prv';
|
|
20
|
-
const decryptedPrv = 'decrypted-prv';
|
|
21
|
-
const signature = 'aabbccdd';
|
|
22
|
-
beforeEach(function () {
|
|
23
|
-
const postStub = sinon_1.default.stub();
|
|
24
|
-
postStub.returns({
|
|
25
|
-
send: sinon_1.default.stub().returns({
|
|
26
|
-
result: sinon_1.default.stub().resolves({ signature }),
|
|
27
|
-
}),
|
|
28
|
-
});
|
|
29
|
-
mockBitGo = {
|
|
30
|
-
post: postStub,
|
|
31
|
-
decrypt: sinon_1.default.stub().returns(decryptedPrv),
|
|
32
|
-
};
|
|
33
|
-
mockBaseCoin = {
|
|
34
|
-
keychains: sinon_1.default.stub().returns({
|
|
35
|
-
get: sinon_1.default.stub().resolves({ encryptedPrv }),
|
|
36
|
-
}),
|
|
37
|
-
signMessage: sinon_1.default.stub().resolves(Buffer.from(signature, 'hex')),
|
|
38
|
-
};
|
|
39
|
-
mockWallet = {
|
|
40
|
-
id: sinon_1.default.stub().returns('test-wallet-id'),
|
|
41
|
-
keyIds: sinon_1.default.stub().returns(['user-key-id', 'backup-key-id', 'bitgo-key-id']),
|
|
42
|
-
url: sinon_1.default.stub().returns('https://example.com/wallet/test-wallet-id/tx/sign'),
|
|
43
|
-
toJSON: sinon_1.default.stub().returns({
|
|
44
|
-
id: 'test-wallet-id',
|
|
45
|
-
keys: ['user-key-id', 'backup-key-id', 'bitgo-key-id'],
|
|
46
|
-
userKeySigningRequired: undefined,
|
|
47
|
-
}),
|
|
48
|
-
baseCoin: mockBaseCoin,
|
|
49
|
-
bitgo: mockBitGo,
|
|
50
|
-
};
|
|
51
|
-
tradingAccount = new tradingAccount_1.TradingAccount(enterpriseId, mockWallet, mockBitGo);
|
|
52
|
-
});
|
|
53
|
-
afterEach(function () {
|
|
54
|
-
sinon_1.default.restore();
|
|
55
|
-
});
|
|
56
|
-
describe('signPayload', function () {
|
|
57
|
-
const payload = { data: 'test-payload' };
|
|
58
|
-
const payloadString = 'test-payload-string';
|
|
59
|
-
describe('without walletPassphrase (BitGo remote signing)', function () {
|
|
60
|
-
it('should sign using the BitGo key remotely when no passphrase is provided', async function () {
|
|
61
|
-
const result = await tradingAccount.signPayload({ payload });
|
|
62
|
-
mockWallet.toJSON.calledOnce.should.be.true();
|
|
63
|
-
mockWallet.url.calledWith('/tx/sign').should.be.true();
|
|
64
|
-
mockBitGo.post.calledOnce.should.be.true();
|
|
65
|
-
result.should.equal(signature);
|
|
66
|
-
});
|
|
67
|
-
it('should sign a string payload remotely when no passphrase is provided', async function () {
|
|
68
|
-
const result = await tradingAccount.signPayload({ payload: payloadString });
|
|
69
|
-
result.should.equal(signature);
|
|
70
|
-
});
|
|
71
|
-
it('should throw if userKeySigningRequired is set and no passphrase is provided', async function () {
|
|
72
|
-
mockWallet.toJSON.returns({
|
|
73
|
-
id: 'test-wallet-id',
|
|
74
|
-
keys: ['user-key-id', 'backup-key-id', 'bitgo-key-id'],
|
|
75
|
-
userKeySigningRequired: 'true',
|
|
76
|
-
});
|
|
77
|
-
await tradingAccount
|
|
78
|
-
.signPayload({ payload })
|
|
79
|
-
.should.be.rejectedWith('Wallet must use user key to sign ofc transaction, please provide the wallet passphrase or visit your wallet settings page to configure one.');
|
|
80
|
-
});
|
|
81
|
-
it('should throw if wallet has fewer than 2 keys and no passphrase is provided', async function () {
|
|
82
|
-
mockWallet.toJSON.returns({
|
|
83
|
-
id: 'test-wallet-id',
|
|
84
|
-
keys: ['user-key-id'],
|
|
85
|
-
userKeySigningRequired: undefined,
|
|
86
|
-
});
|
|
87
|
-
await tradingAccount
|
|
88
|
-
.signPayload({ payload })
|
|
89
|
-
.should.be.rejectedWith('Wallet does not support BitGo signing. Please reach out to support@bitgo.com to resolve this issue.');
|
|
90
|
-
});
|
|
91
|
-
});
|
|
92
|
-
describe('with walletPassphrase (local user key signing)', function () {
|
|
93
|
-
it('should decrypt the user key and sign the payload locally', async function () {
|
|
94
|
-
const result = await tradingAccount.signPayload({ payload, walletPassphrase });
|
|
95
|
-
mockBaseCoin.keychains().get.calledWith({ id: 'user-key-id' }).should.be.true();
|
|
96
|
-
mockBitGo.decrypt.calledWith({ input: encryptedPrv, password: walletPassphrase }).should.be.true();
|
|
97
|
-
mockBaseCoin.signMessage.calledOnce.should.be.true();
|
|
98
|
-
result.should.equal(Buffer.from(signature, 'hex').toString('hex'));
|
|
99
|
-
});
|
|
100
|
-
it('should stringify a Record payload before signing locally', async function () {
|
|
101
|
-
await tradingAccount.signPayload({ payload, walletPassphrase });
|
|
102
|
-
const signMessageCall = mockBaseCoin.signMessage.getCall(0);
|
|
103
|
-
signMessageCall.args[1].should.equal(JSON.stringify(payload));
|
|
104
|
-
});
|
|
105
|
-
it('should pass a string payload directly to signMessage', async function () {
|
|
106
|
-
await tradingAccount.signPayload({ payload: payloadString, walletPassphrase });
|
|
107
|
-
const signMessageCall = mockBaseCoin.signMessage.getCall(0);
|
|
108
|
-
signMessageCall.args[1].should.equal(payloadString);
|
|
109
|
-
});
|
|
110
|
-
});
|
|
111
|
-
});
|
|
112
|
-
});
|
|
113
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhZGluZ0FjY291bnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi90ZXN0L3VuaXQvYml0Z28vdHJhZGluZy90cmFkaW5nQWNjb3VudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBOztHQUVHO0FBQ0gsa0RBQTBCO0FBQzFCLGtCQUFnQjtBQUNoQixpRkFBOEU7QUFFOUUsUUFBUSxDQUFDLGdCQUFnQixFQUFFO0lBQ3pCLElBQUksY0FBOEIsQ0FBQztJQUNuQyxJQUFJLFNBQWMsQ0FBQztJQUNuQixJQUFJLFVBQWUsQ0FBQztJQUNwQixJQUFJLFlBQWlCLENBQUM7SUFFdEIsTUFBTSxZQUFZLEdBQUcsb0JBQW9CLENBQUM7SUFDMUMsTUFBTSxnQkFBZ0IsR0FBRyxpQkFBaUIsQ0FBQztJQUMzQyxNQUFNLFlBQVksR0FBRyxlQUFlLENBQUM7SUFDckMsTUFBTSxZQUFZLEdBQUcsZUFBZSxDQUFDO0lBQ3JDLE1BQU0sU0FBUyxHQUFHLFVBQVUsQ0FBQztJQUU3QixVQUFVLENBQUM7UUFDVCxNQUFNLFFBQVEsR0FBRyxlQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDOUIsUUFBUSxDQUFDLE9BQU8sQ0FBQztZQUNmLElBQUksRUFBRSxlQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsT0FBTyxDQUFDO2dCQUN6QixNQUFNLEVBQUUsZUFBSyxDQUFDLElBQUksRUFBRSxDQUFDLFFBQVEsQ0FBQyxFQUFFLFNBQVMsRUFBRSxDQUFDO2FBQzdDLENBQUM7U0FDSCxDQUFDLENBQUM7UUFFSCxTQUFTLEdBQUc7WUFDVixJQUFJLEVBQUUsUUFBUTtZQUNkLE9BQU8sRUFBRSxlQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQztTQUM1QyxDQUFDO1FBRUYsWUFBWSxHQUFHO1lBQ2IsU0FBUyxFQUFFLGVBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxPQUFPLENBQUM7Z0JBQzlCLEdBQUcsRUFB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QUFDLENBQUMsQ0FBQztZQUNyRSxDQUFDLENBQUMsQ0FBQztZQUVILEVBQUUsQ0FBQywwREFBMEQsRUFBRSxLQUFLO2dCQUNsRSxNQUFNLGNBQWMsQ0FBQyxXQUFXLENBQUMsRUFBRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDO2dCQUVoRSxNQUFNLGVBQWUsR0FBRyxZQUFZLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDNUQsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztZQUNoRSxDQUFDLENBQUMsQ0FBQztZQUVILEVBQUUsQ0FBQyxzREFBc0QsRUFBRSxLQUFLO2dCQUM5RCxNQUFNLGNBQWMsQ0FBQyxXQUFXLENBQUMsRUFBRSxPQUFPLEVBQUUsYUFBYSxFQUFFLGdCQUFnQixFQUFFLENBQUMsQ0FBQztnQkFFL0UsTUFBTSxlQUFlLEdBQUcsWUFBWSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQzVELGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUN0RCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQHByZXR0aWVyXG4gKi9cbmltcG9ydCBzaW5vbiBmcm9tICdzaW5vbic7XG5pbXBvcnQgJ3Nob3VsZCc7XG5pbXBvcnQgeyBUcmFkaW5nQWNjb3VudCB9IGZyb20gJy4uLy4uLy4uLy4uL3NyYy9iaXRnby90cmFkaW5nL3RyYWRpbmdBY2NvdW50JztcblxuZGVzY3JpYmUoJ1RyYWRpbmdBY2NvdW50JywgZnVuY3Rpb24gKCkge1xuICBsZXQgdHJhZGluZ0FjY291bnQ6IFRyYWRpbmdBY2NvdW50O1xuICBsZXQgbW9ja0JpdEdvOiBhbnk7XG4gIGxldCBtb2NrV2FsbGV0OiBhbnk7XG4gIGxldCBtb2NrQmFzZUNvaW46IGFueTtcblxuICBjb25zdCBlbnRlcnByaXNlSWQgPSAndGVzdC1lbnRlcnByaXNlLWlkJztcbiAgY29uc3Qgd2FsbGV0UGFzc3BocmFzZSA9ICd0ZXN0LXBhc3NwaHJhc2UnO1xuICBjb25zdCBlbmNyeXB0ZWRQcnYgPSAnZW5jcnlwdGVkLXBydic7XG4gIGNvbnN0IGRlY3J5cHRlZFBydiA9ICdkZWNyeXB0ZWQtcHJ2JztcbiAgY29uc3Qgc2lnbmF0dXJlID0gJ2FhYmJjY2RkJztcblxuICBiZWZvcmVFYWNoKGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBwb3N0U3R1YiA9IHNpbm9uLnN0dWIoKTtcbiAgICBwb3N0U3R1Yi5yZXR1cm5zKHtcbiAgICAgIHNlbmQ6IHNpbm9uLnN0dWIoKS5yZXR1cm5zKHtcbiAgICAgICAgcmVzdWx0OiBzaW5vbi5zdHViKCkucmVzb2x2ZXMoeyBzaWduYXR1cmUgfSksXG4gICAgICB9KSxcbiAgICB9KTtcblxuICAgIG1vY2tCaXRHbyA9IHtcbiAgICAgIHBvc3Q6IHBvc3RTdHViLFxuICAgICAgZGVjcnlwdDogc2lub24uc3R1YigpLnJldHVybnMoZGVjcnlwdGVkUHJ2KSxcbiAgICB9O1xuXG4gICAgbW9ja0Jhc2VDb2luID0ge1xuICAgICAga2V5Y2hhaW5zOiBzaW5vbi5zdHViKCkucmV0dXJucyh7XG4gICAgICAgIGdldDogc2lub24uc3R1YigpLnJlc29sdmVzKHsgZW5jcnlwdGVkUHJ2IH0pLFxuICAgICAgfSksXG4gICAgICBzaWduTWVzc2FnZTogc2lub24uc3R1YigpLnJlc29sdmVzKEJ1ZmZlci5mcm9tKHNpZ25hdHVyZSwgJ2hleCcpKSxcbiAgICB9O1xuXG4gICAgbW9ja1dhbGxldCA9IHtcbiAgICAgIGlkOiBzaW5vbi5zdHViKCkucmV0dXJucygndGVzdC13YWxsZXQtaWQnKSxcbiAgICAgIGtleUlkczogc2lub24uc3R1YigpLnJldHVybnMoWyd1c2VyLWtleS1pZCcsICdiYWNrdXAta2V5LWlkJywgJ2JpdGdvLWtleS1pZCddKSxcbiAgICAgIHVybDogc2lub24uc3R1YigpLnJldHVybnMoJ2h0dHBzOi8vZXhhbXBsZS5jb20vd2FsbGV0L3Rlc3Qtd2FsbGV0LWlkL3R4L3NpZ24nKSxcbiAgICAgIHRvSlNPTjogc2lub24uc3R1YigpLnJldHVybnMoe1xuICAgICAgICBpZDogJ3Rlc3Qtd2FsbGV0LWlkJyxcbiAgICAgICAga2V5czogWyd1c2VyLWtleS1pZCcsICdiYWNrdXAta2V5LWlkJywgJ2JpdGdvLWtleS1pZCddLFxuICAgICAgICB1c2VyS2V5U2lnbmluZ1JlcXVpcmVkOiB1bmRlZmluZWQsXG4gICAgICB9KSxcbiAgICAgIGJhc2VDb2luOiBtb2NrQmFzZUNvaW4sXG4gICAgICBiaXRnbzogbW9ja0JpdEdvLFxuICAgIH07XG5cbiAgICB0cmFkaW5nQWNjb3VudCA9IG5ldyBUcmFkaW5nQWNjb3VudChlbnRlcnByaXNlSWQsIG1vY2tXYWxsZXQsIG1vY2tCaXRHbyk7XG4gIH0pO1xuXG4gIGFmdGVyRWFjaChmdW5jdGlvbiAoKSB7XG4gICAgc2lub24ucmVzdG9yZSgpO1xuICB9KTtcblxuICBkZXNjcmliZSgnc2lnblBheWxvYWQnLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgcGF5bG9hZCA9IHsgZGF0YTogJ3Rlc3QtcGF5bG9hZCcgfTtcbiAgICBjb25zdCBwYXlsb2FkU3RyaW5nID0gJ3Rlc3QtcGF5bG9hZC1zdHJpbmcnO1xuXG4gICAgZGVzY3JpYmUoJ3dpdGhvdXQgd2FsbGV0UGFzc3BocmFzZSAoQml0R28gcmVtb3RlIHNpZ25pbmcpJywgZnVuY3Rpb24gKCkge1xuICAgICAgaXQoJ3Nob3VsZCBzaWduIHVzaW5nIHRoZSBCaXRHbyBrZXkgcmVtb3RlbHkgd2hlbiBubyBwYXNzcGhyYXNlIGlzIHByb3ZpZGVkJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0cmFkaW5nQWNjb3VudC5zaWduUGF5bG9hZCh7IHBheWxvYWQgfSk7XG5cbiAgICAgICAgbW9ja1dhbGxldC50b0pTT04uY2FsbGVkT25jZS5zaG91bGQuYmUudHJ1ZSgpO1xuICAgICAgICBtb2NrV2FsbGV0LnVybC5jYWxsZWRXaXRoKCcvdHgvc2lnbicpLnNob3VsZC5iZS50cnVlKCk7XG4gICAgICAgIG1vY2tCaXRHby5wb3N0LmNhbGxlZE9uY2Uuc2hvdWxkLmJlLnRydWUoKTtcbiAgICAgICAgcmVzdWx0LnNob3VsZC5lcXVhbChzaWduYXR1cmUpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgc2lnbiBhIHN0cmluZyBwYXlsb2FkIHJlbW90ZWx5IHdoZW4gbm8gcGFzc3BocmFzZSBpcyBwcm92aWRlZCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdHJhZGluZ0FjY291bnQuc2lnblBheWxvYWQoeyBwYXlsb2FkOiBwYXlsb2FkU3RyaW5nIH0pO1xuXG4gICAgICAgIHJlc3VsdC5zaG91bGQuZXF1YWwoc2lnbmF0dXJlKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIHRocm93IGlmIHVzZXJLZXlTaWduaW5nUmVxdWlyZWQgaXMgc2V0IGFuZCBubyBwYXNzcGhyYXNlIGlzIHByb3ZpZGVkJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBtb2NrV2FsbGV0LnRvSlNPTi5yZXR1cm5zKHtcbiAgICAgICAgICBpZDogJ3Rlc3Qtd2FsbGV0LWlkJyxcbiAgICAgICAgICBrZXlzOiBbJ3VzZXIta2V5LWlkJywgJ2JhY2t1cC1rZXktaWQnLCAnYml0Z28ta2V5LWlkJ10sXG4gICAgICAgICAgdXNlcktleVNpZ25pbmdSZXF1aXJlZDogJ3RydWUnLFxuICAgICAgICB9KTtcblxuICAgICAgICBhd2FpdCB0cmFkaW5nQWNjb3VudFxuICAgICAgICAgIC5zaWduUGF5bG9hZCh7IHBheWxvYWQgfSlcbiAgICAgICAgICAuc2hvdWxkLmJlLnJlamVjdGVkV2l0aChcbiAgICAgICAgICAgICdXYWxsZXQgbXVzdCB1c2UgdXNlciBrZXkgdG8gc2lnbiBvZmMgdHJhbnNhY3Rpb24sIHBsZWFzZSBwcm92aWRlIHRoZSB3YWxsZXQgcGFzc3BocmFzZSBvciB2aXNpdCB5b3VyIHdhbGxldCBzZXR0aW5ncyBwYWdlIHRvIGNvbmZpZ3VyZSBvbmUuJ1xuICAgICAgICAgICk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCB0aHJvdyBpZiB3YWxsZXQgaGFzIGZld2VyIHRoYW4gMiBrZXlzIGFuZCBubyBwYXNzcGhyYXNlIGlzIHByb3ZpZGVkJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBtb2NrV2FsbGV0LnRvSlNPTi5yZXR1cm5zKHtcbiAgICAgICAgICBpZDogJ3Rlc3Qtd2FsbGV0LWlkJyxcbiAgICAgICAgICBrZXlzOiBbJ3VzZXIta2V5LWlkJ10sXG4gICAgICAgICAgdXNlcktleVNpZ25pbmdSZXF1aXJlZDogdW5kZWZpbmVkLFxuICAgICAgICB9KTtcblxuICAgICAgICBhd2FpdCB0cmFkaW5nQWNjb3VudFxuICAgICAgICAgIC5zaWduUGF5bG9hZCh7IHBheWxvYWQgfSlcbiAgICAgICAgICAuc2hvdWxkLmJlLnJlamVjdGVkV2l0aChcbiAgICAgICAgICAgICdXYWxsZXQgZG9lcyBub3Qgc3VwcG9ydCBCaXRHbyBzaWduaW5nLiBQbGVhc2UgcmVhY2ggb3V0IHRvIHN1cHBvcnRAYml0Z28uY29tIHRvIHJlc29sdmUgdGhpcyBpc3N1ZS4nXG4gICAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ3dpdGggd2FsbGV0UGFzc3BocmFzZSAobG9jYWwgdXNlciBrZXkgc2lnbmluZyknLCBmdW5jdGlvbiAoKSB7XG4gICAgICBpdCgnc2hvdWxkIGRlY3J5cHQgdGhlIHVzZXIga2V5IGFuZCBzaWduIHRoZSBwYXlsb2FkIGxvY2FsbHknLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRyYWRpbmdBY2NvdW50LnNpZ25QYXlsb2FkKHsgcGF5bG9hZCwgd2FsbGV0UGFzc3BocmFzZSB9KTtcblxuICAgICAgICBtb2NrQmFzZUNvaW4ua2V5Y2hhaW5zKCkuZ2V0LmNhbGxlZFdpdGgoeyBpZDogJ3VzZXIta2V5LWlkJyB9KS5zaG91bGQuYmUudHJ1ZSgpO1xuICAgICAgICBtb2NrQml0R28uZGVjcnlwdC5jYWxsZWRXaXRoKHsgaW5wdXQ6IGVuY3J5cHRlZFBydiwgcGFzc3dvcmQ6IHdhbGxldFBhc3NwaHJhc2UgfSkuc2hvdWxkLmJlLnRydWUoKTtcbiAgICAgICAgbW9ja0Jhc2VDb2luLnNpZ25NZXNzYWdlLmNhbGxlZE9uY2Uuc2hvdWxkLmJlLnRydWUoKTtcbiAgICAgICAgcmVzdWx0LnNob3VsZC5lcXVhbChCdWZmZXIuZnJvbShzaWduYXR1cmUsICdoZXgnKS50b1N0cmluZygnaGV4JykpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgc3RyaW5naWZ5IGEgUmVjb3JkIHBheWxvYWQgYmVmb3JlIHNpZ25pbmcgbG9jYWxseScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgYXdhaXQgdHJhZGluZ0FjY291bnQuc2lnblBheWxvYWQoeyBwYXlsb2FkLCB3YWxsZXRQYXNzcGhyYXNlIH0pO1xuXG4gICAgICAgIGNvbnN0IHNpZ25NZXNzYWdlQ2FsbCA9IG1vY2tCYXNlQ29pbi5zaWduTWVzc2FnZS5nZXRDYWxsKDApO1xuICAgICAgICBzaWduTWVzc2FnZUNhbGwuYXJnc1sxXS5zaG91bGQuZXF1YWwoSlNPTi5zdHJpbmdpZnkocGF5bG9hZCkpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgcGFzcyBhIHN0cmluZyBwYXlsb2FkIGRpcmVjdGx5IHRvIHNpZ25NZXNzYWdlJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBhd2FpdCB0cmFkaW5nQWNjb3VudC5zaWduUGF5bG9hZCh7IHBheWxvYWQ6IHBheWxvYWRTdHJpbmcsIHdhbGxldFBhc3NwaHJhc2UgfSk7XG5cbiAgICAgICAgY29uc3Qgc2lnbk1lc3NhZ2VDYWxsID0gbW9ja0Jhc2VDb2luLnNpZ25NZXNzYWdlLmdldENhbGwoMCk7XG4gICAgICAgIHNpZ25NZXNzYWdlQ2FsbC5hcmdzWzFdLnNob3VsZC5lcXVhbChwYXlsb2FkU3RyaW5nKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ofcWalletSignTransaction.d.ts","sourceRoot":"","sources":["../../../../../test/unit/bitgo/wallet/ofcWalletSignTransaction.ts"],"names":[],"mappings":"AAIA,OAAO,QAAQ,CAAC"}
|
|
@@ -1,70 +0,0 @@
|
|
|
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2ZjV2FsbGV0U2lnblRyYW5zYWN0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGVzdC91bml0L2JpdGdvL3dhbGxldC9vZmNXYWxsZXRTaWduVHJhbnNhY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQTs7R0FFRztBQUNILGtEQUEwQjtBQUMxQixrQkFBZ0I7QUFDaEIseUNBQXlDO0FBRXpDLFFBQVEsQ0FBQyw4QkFBOEIsRUFBRTtJQUN2QyxJQUFJLE1BQWMsQ0FBQztJQUNuQixJQUFJLFNBQWMsQ0FBQztJQUNuQixJQUFJLFlBQWlCLENBQUM7SUFDdEIsSUFBSSxjQUFtQixDQUFDO0lBRXhCLFVBQVUsQ0FBQztRQUNULFNBQVMsR0FBRztZQUNWLEdBQUcsRUFBRSxlQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsT0FBTyxDQUFDLHdCQUF3QixDQUFDO1lBQ25ELElBQUksRUFBRSxlQUFLLENBQUMsSUFBSSxFQUFFO1lBQ2xCLEdBQUcsRUFBRSxlQUFLLENBQUMsSUFBSSxFQUFFO1lBQ2pCLGdCQUFnQixFQUFFLGVBQUssQ0FBQyxJQUFJLEVBQUU7U0FDL0IsQ0FBQztRQUVGLFlBQVksR0FBRztZQUNiLFNBQVMsRUFBRSxlQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztZQUN0QyxHQUFHLEVBQUUsZUFBSyxDQUFDLElBQUksRUFBRSxDQUFDLE9BQU8sQ0FBQywrQkFBK0IsQ0FBQztZQUMxRCxTQUFTLEVBQUUsZUFBSyxDQUFDLElBQUksRUFBRTtZQUN2QixXQUFXLEVBQUUsZUFBSyxDQUFDLElBQUksRUFBRSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7WUFDeEMsZUFBZSxFQUFFLGVBQUssQ0FBQyxJQUFJLEVBQUU7WUFDN0Isa0JBQWtCLEVBQUUsZUFBSyxDQUFDLElBQUksRUFBRSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7WUFDL0MsZ0JBQWdCLEVBQUUsZUFBSyxDQUFDLElBQUksRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzNDLGVBQWUsRUFBRSxlQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsUUFBUSxDQUFDLEVBQUUsVUFBVSxFQUFFLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLEVBQUUsQ0FBQztTQUNqRyxDQUFDO1FBRUYsY0FBYyxHQUFHO1lBQ2YsRUFBRSxFQUFFLGdCQUFnQjtZQUNwQixJQUFJLEVBQUUsU0FBUztZQUNmLElBQUksRUFBRSxDQUFDLFVBQVUsRUFBRSxZQUFZLEVBQUUsV0FBVyxDQUFDO1lBQzdDLFlBQVksRUFBRSxTQUFTO1lBQ3ZCLFVBQVUsRUFBRSxRQUFRO1NBQ3JCLENBQUM7UUFFRixNQUFNLEdBQUcsSUFBSSxZQUFNLENBQUMsU0FBUyxFQUFFLFlBQVksRUFBRSxjQUFjLENBQUMsQ0FBQztJQUMvRCxDQUFDLENBQUMsQ0FBQztJQUVILFNBQVMsQ0FBQztRQUNSLGVBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUNsQixDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyx5REFBeUQsRUFBRSxLQUFLO1FBQ2pFLE1BQU0sVUFBVSxHQUFHLEVBQUUsTUFBTSxFQUFFLEVBQUUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLEVBQVMsQ0FBQztRQUN0RSxNQUFNLEdBQUcsR0FBRyxVQUFVLENBQUM7UUFFdkIsTUFBTSxNQUFNLENBQUMsZUFBZSxDQUFDLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFFbEQsWUFBWSxDQUFDLGVBQWUsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUN6RCxNQUFNLFFBQVEsR0FBRyxZQUFZLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDakUsUUFBUSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3ZDLENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLG9FQUFvRSxFQUFFLEtBQUs7UUFDNUUsTUFBTSxVQUFVLEdBQUcsRUFBRSxNQUFNLEVBQUUsRUFBRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsRUFBUyxDQUFDO1FBQ3RFLE1BQU0sR0FBRyxHQUFHLFVBQVUsQ0FBQztRQUV2QixNQUFNLE1BQU0sQ0FBQyxlQUFlLENBQUMsRUFBRSxVQUFVLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztRQUVsRCxNQUFNLFFBQVEsR0FBRyxZQUFZLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDakUsUUFBUSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2pDLENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLHVGQUF1RixFQUFFLEtBQUs7UUFDL0YsZUFBSyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsWUFBWSxDQUFDLENBQUMsT0FBTyxDQUFDLFNBQWdCLENBQUMsQ0FBQztRQUMzRCxNQUFNLFVBQVUsR0FBRyxFQUFFLE1BQU0sRUFBRSxFQUFFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxFQUFTLENBQUM7UUFFdEUsTUFBTSxNQUFNLENBQUMsZUFBZSxDQUFDLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQztRQUU3QyxZQUFZLENBQUMsZUFBZSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3pELE1BQU0sUUFBUSxHQUFHLFlBQVksQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNqRSxRQUFRLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDdkMsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQHByZXR0aWVyXG4gKi9cbmltcG9ydCBzaW5vbiBmcm9tICdzaW5vbic7XG5pbXBvcnQgJ3Nob3VsZCc7XG5pbXBvcnQgeyBXYWxsZXQgfSBmcm9tICcuLi8uLi8uLi8uLi9zcmMnO1xuXG5kZXNjcmliZSgnV2FsbGV0IC0gT0ZDIHNpZ25UcmFuc2FjdGlvbicsIGZ1bmN0aW9uICgpIHtcbiAgbGV0IHdhbGxldDogV2FsbGV0O1xuICBsZXQgbW9ja0JpdEdvOiBhbnk7XG4gIGxldCBtb2NrQmFzZUNvaW46IGFueTtcbiAgbGV0IG1vY2tXYWxsZXREYXRhOiBhbnk7XG5cbiAgYmVmb3JlRWFjaChmdW5jdGlvbiAoKSB7XG4gICAgbW9ja0JpdEdvID0ge1xuICAgICAgdXJsOiBzaW5vbi5zdHViKCkucmV0dXJucygnaHR0cHM6Ly90ZXN0LmJpdGdvLmNvbScpLFxuICAgICAgcG9zdDogc2lub24uc3R1YigpLFxuICAgICAgZ2V0OiBzaW5vbi5zdHViKCksXG4gICAgICBzZXRSZXF1ZXN0VHJhY2VyOiBzaW5vbi5zdHViKCksXG4gICAgfTtcblxuICAgIG1vY2tCYXNlQ29pbiA9IHtcbiAgICAgIGdldEZhbWlseTogc2lub24uc3R1YigpLnJldHVybnMoJ29mYycpLFxuICAgICAgdXJsOiBzaW5vbi5zdHViKCkucmV0dXJucygnaHR0cHM6Ly90ZXN0LmJpdGdvLmNvbS93YWxsZXQnKSxcbiAgICAgIGtleWNoYWluczogc2lub24uc3R1YigpLFxuICAgICAgc3VwcG9ydHNUc3M6IHNpbm9uLnN0dWIoKS5yZXR1cm5zKGZhbHNlKSxcbiAgICAgIGdldE1QQ0FsZ29yaXRobTogc2lub24uc3R1YigpLFxuICAgICAgcHJlc2lnblRyYW5zYWN0aW9uOiBzaW5vbi5zdHViKCkucmVzb2x2ZXNBcmcoMCksXG4gICAgICBrZXlJZHNGb3JTaWduaW5nOiBzaW5vbi5zdHViKCkucmV0dXJucyhbMF0pLFxuICAgICAgc2lnblRyYW5zYWN0aW9uOiBzaW5vbi5zdHViKCkucmVzb2x2ZXMoeyBoYWxmU2lnbmVkOiB7IHBheWxvYWQ6ICd0ZXN0Jywgc2lnbmF0dXJlOiAnYWFiYmNjJyB9IH0pLFxuICAgIH07XG5cbiAgICBtb2NrV2FsbGV0RGF0YSA9IHtcbiAgICAgIGlkOiAndGVzdC13YWxsZXQtaWQnLFxuICAgICAgY29pbjogJ29mY3VzZHQnLFxuICAgICAga2V5czogWyd1c2VyLWtleScsICdiYWNrdXAta2V5JywgJ2JpdGdvLWtleSddLFxuICAgICAgbXVsdGlzaWdUeXBlOiAnb25jaGFpbicsXG4gICAgICBlbnRlcnByaXNlOiAnZW50LWlkJyxcbiAgICB9O1xuXG4gICAgd2FsbGV0ID0gbmV3IFdhbGxldChtb2NrQml0R28sIG1vY2tCYXNlQ29pbiwgbW9ja1dhbGxldERhdGEpO1xuICB9KTtcblxuICBhZnRlckVhY2goZnVuY3Rpb24gKCkge1xuICAgIHNpbm9uLnJlc3RvcmUoKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBwYXNzIHdhbGxldCBpbnN0YW5jZSB0byBiYXNlQ29pbi5zaWduVHJhbnNhY3Rpb24nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgdHhQcmVidWlsZCA9IHsgdHhJbmZvOiB7IHBheWxvYWQ6ICd7XCJhbW91bnRcIjpcIjEwMFwifScgfSB9IGFzIGFueTtcbiAgICBjb25zdCBwcnYgPSAndGVzdC1wcnYnO1xuXG4gICAgYXdhaXQgd2FsbGV0LnNpZ25UcmFuc2FjdGlvbih7IHR4UHJlYnVpbGQsIHBydiB9KTtcblxuICAgIG1vY2tCYXNlQ29pbi5zaWduVHJhbnNhY3Rpb24uY2FsbGVkT25jZS5zaG91bGQuYmUudHJ1ZSgpO1xuICAgIGNvbnN0IGNhbGxBcmdzID0gbW9ja0Jhc2VDb2luLnNpZ25UcmFuc2FjdGlvbi5nZXRDYWxsKDApLmFyZ3NbMF07XG4gICAgY2FsbEFyZ3Mud2FsbGV0LnNob3VsZC5lcXVhbCh3YWxsZXQpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIHBhc3MgcHJ2IHRvIGJhc2VDb2luLnNpZ25UcmFuc2FjdGlvbiB3aGVuIHByb3ZpZGVkIGRpcmVjdGx5JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHR4UHJlYnVpbGQgPSB7IHR4SW5mbzogeyBwYXlsb2FkOiAne1wiYW1vdW50XCI6XCIxMDBcIn0nIH0gfSBhcyBhbnk7XG4gICAgY29uc3QgcHJ2ID0gJ3Rlc3QtcHJ2JztcblxuICAgIGF3YWl0IHdhbGxldC5zaWduVHJhbnNhY3Rpb24oeyB0eFByZWJ1aWxkLCBwcnYgfSk7XG5cbiAgICBjb25zdCBjYWxsQXJncyA9IG1vY2tCYXNlQ29pbi5zaWduVHJhbnNhY3Rpb24uZ2V0Q2FsbCgwKS5hcmdzWzBdO1xuICAgIGNhbGxBcmdzLnBydi5zaG91bGQuZXF1YWwocHJ2KTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBwYXNzIHdhbGxldCBpbnN0YW5jZSB0byBiYXNlQ29pbi5zaWduVHJhbnNhY3Rpb24gZXZlbiB3aGVuIG5vIHBydiBpcyBhdmFpbGFibGUnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgc2lub24uc3R1Yih3YWxsZXQsICdnZXRVc2VyUHJ2JykucmV0dXJucyh1bmRlZmluZWQgYXMgYW55KTtcbiAgICBjb25zdCB0eFByZWJ1aWxkID0geyB0eEluZm86IHsgcGF5bG9hZDogJ3tcImFtb3VudFwiOlwiMTAwXCJ9JyB9IH0gYXMgYW55O1xuXG4gICAgYXdhaXQgd2FsbGV0LnNpZ25UcmFuc2FjdGlvbih7IHR4UHJlYnVpbGQgfSk7XG5cbiAgICBtb2NrQmFzZUNvaW4uc2lnblRyYW5zYWN0aW9uLmNhbGxlZE9uY2Uuc2hvdWxkLmJlLnRydWUoKTtcbiAgICBjb25zdCBjYWxsQXJncyA9IG1vY2tCYXNlQ29pbi5zaWduVHJhbnNhY3Rpb24uZ2V0Q2FsbCgwKS5hcmdzWzBdO1xuICAgIGNhbGxBcmdzLndhbGxldC5zaG91bGQuZXF1YWwod2FsbGV0KTtcbiAgfSk7XG59KTtcbiJdfQ==
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ofc.d.ts","sourceRoot":"","sources":["../../../../test/unit/coins/ofc.ts"],"names":[],"mappings":"AAIA,OAAO,QAAQ,CAAC"}
|
|
@@ -1,124 +0,0 @@
|
|
|
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 ofc_1 = require("../../../src/coins/ofc");
|
|
12
|
-
const ofcToken_1 = require("../../../src/coins/ofcToken");
|
|
13
|
-
const baseCoin_1 = require("../../../src/bitgo/baseCoin/baseCoin");
|
|
14
|
-
const src_1 = require("../../../src");
|
|
15
|
-
const TEST_TOKEN_CONFIG = {
|
|
16
|
-
coin: 'ofcusdt',
|
|
17
|
-
decimalPlaces: 6,
|
|
18
|
-
name: 'OFCUSDT',
|
|
19
|
-
type: 'ofcusdt',
|
|
20
|
-
backingCoin: 'usdt',
|
|
21
|
-
isFiat: false,
|
|
22
|
-
};
|
|
23
|
-
describe('Ofc / OfcToken', function () {
|
|
24
|
-
let mockBitGo;
|
|
25
|
-
beforeEach(function () {
|
|
26
|
-
mockBitGo = { url: sinon_1.default.stub().returns('https://test.bitgo.com') };
|
|
27
|
-
});
|
|
28
|
-
afterEach(function () {
|
|
29
|
-
sinon_1.default.restore();
|
|
30
|
-
});
|
|
31
|
-
describe('signMessage', function () {
|
|
32
|
-
let ofc;
|
|
33
|
-
beforeEach(function () {
|
|
34
|
-
ofc = new ofc_1.Ofc(mockBitGo);
|
|
35
|
-
});
|
|
36
|
-
describe('with a Wallet instance', function () {
|
|
37
|
-
it('should delegate to wallet.toTradingAccount().signPayload() and return a Buffer', async function () {
|
|
38
|
-
const hexSignature = 'deadbeef';
|
|
39
|
-
const signPayloadStub = sinon_1.default.stub().resolves(hexSignature);
|
|
40
|
-
const mockBaseCoin = { supportsTss: sinon_1.default.stub().returns(false), getMPCAlgorithm: sinon_1.default.stub() };
|
|
41
|
-
const walletData = {
|
|
42
|
-
id: 'wallet-id',
|
|
43
|
-
keys: ['key1', 'key2', 'key3'],
|
|
44
|
-
multisigType: 'onchain',
|
|
45
|
-
enterprise: 'ent-id',
|
|
46
|
-
};
|
|
47
|
-
const wallet = new src_1.Wallet(mockBitGo, mockBaseCoin, walletData);
|
|
48
|
-
sinon_1.default.stub(wallet, 'toTradingAccount').returns({ signPayload: signPayloadStub });
|
|
49
|
-
const message = 'test message';
|
|
50
|
-
const result = await ofc.signMessage(wallet, message);
|
|
51
|
-
signPayloadStub.calledOnceWith({ payload: message }).should.be.true();
|
|
52
|
-
result.should.deepEqual(Buffer.from(hexSignature, 'hex'));
|
|
53
|
-
});
|
|
54
|
-
});
|
|
55
|
-
describe('with a prv key', function () {
|
|
56
|
-
it('should delegate to the base class signMessage', async function () {
|
|
57
|
-
const expectedResult = Buffer.from('basesignature', 'hex');
|
|
58
|
-
const superSignMessageStub = sinon_1.default.stub(baseCoin_1.BaseCoin.prototype, 'signMessage').resolves(expectedResult);
|
|
59
|
-
const key = {
|
|
60
|
-
prv: 'xprv9s21ZrQH143K3QTDL4LXw2F7HEK3wJUD2nW2nRk4stbPy6cq3jPPqhuCo36EkzGH6qiT9mJHBvuPKtLRYD4NxFb5hgXMQBB2LLT6mxLDHHo',
|
|
61
|
-
};
|
|
62
|
-
const message = 'test message';
|
|
63
|
-
const result = await ofc.signMessage(key, message);
|
|
64
|
-
superSignMessageStub.calledOnceWith(key, message).should.be.true();
|
|
65
|
-
result.should.equal(expectedResult);
|
|
66
|
-
});
|
|
67
|
-
});
|
|
68
|
-
});
|
|
69
|
-
describe('signTransaction (OfcToken)', function () {
|
|
70
|
-
let ofcToken;
|
|
71
|
-
const payload = '{"amount":"100","from":"alice","to":"bob"}';
|
|
72
|
-
beforeEach(function () {
|
|
73
|
-
ofcToken = new ofcToken_1.OfcToken(mockBitGo, TEST_TOKEN_CONFIG);
|
|
74
|
-
});
|
|
75
|
-
describe('with wallet and no prv (BitGo remote signing)', function () {
|
|
76
|
-
it('should call wallet.toTradingAccount().signPayload() without a passphrase', async function () {
|
|
77
|
-
const hexSignature = 'aabbccdd';
|
|
78
|
-
const signPayloadStub = sinon_1.default.stub().resolves(hexSignature);
|
|
79
|
-
const mockWallet = { toTradingAccount: sinon_1.default.stub().returns({ signPayload: signPayloadStub }) };
|
|
80
|
-
const result = await ofcToken.signTransaction({ txPrebuild: { payload }, wallet: mockWallet });
|
|
81
|
-
signPayloadStub.calledOnceWith({ payload, walletPassphrase: undefined }).should.be.true();
|
|
82
|
-
result.should.deepEqual({ halfSigned: { payload, signature: hexSignature } });
|
|
83
|
-
});
|
|
84
|
-
});
|
|
85
|
-
describe('with wallet and prv (local signing routed through wallet)', function () {
|
|
86
|
-
it('should call wallet.toTradingAccount().signPayload() with the wallet passphrase', async function () {
|
|
87
|
-
const hexSignature = 'aabbccdd';
|
|
88
|
-
const passphrase = 'test-passphrase';
|
|
89
|
-
const signPayloadStub = sinon_1.default.stub().resolves(hexSignature);
|
|
90
|
-
const mockWallet = { toTradingAccount: sinon_1.default.stub().returns({ signPayload: signPayloadStub }) };
|
|
91
|
-
const result = await ofcToken.signTransaction({
|
|
92
|
-
txPrebuild: { payload },
|
|
93
|
-
wallet: mockWallet,
|
|
94
|
-
prv: passphrase,
|
|
95
|
-
});
|
|
96
|
-
signPayloadStub.calledOnceWith({ payload, walletPassphrase: passphrase }).should.be.true();
|
|
97
|
-
result.should.deepEqual({ halfSigned: { payload, signature: hexSignature } });
|
|
98
|
-
});
|
|
99
|
-
});
|
|
100
|
-
describe('with prv only (local signing without wallet)', function () {
|
|
101
|
-
it('should sign locally and return the correct halfSigned result', async function () {
|
|
102
|
-
const signatureBytes = Buffer.from('ccddee', 'hex');
|
|
103
|
-
sinon_1.default.stub(baseCoin_1.BaseCoin.prototype, 'signMessage').resolves(signatureBytes);
|
|
104
|
-
const result = await ofcToken.signTransaction({ txPrebuild: { payload }, prv: 'test-prv' });
|
|
105
|
-
result.should.deepEqual({ halfSigned: { payload, signature: signatureBytes.toString('hex') } });
|
|
106
|
-
});
|
|
107
|
-
it('should pass the prv to signMessage', async function () {
|
|
108
|
-
const signatureBytes = Buffer.from('ccddee', 'hex');
|
|
109
|
-
const superSignMessageStub = sinon_1.default.stub(baseCoin_1.BaseCoin.prototype, 'signMessage').resolves(signatureBytes);
|
|
110
|
-
const prv = 'test-prv';
|
|
111
|
-
await ofcToken.signTransaction({ txPrebuild: { payload }, prv });
|
|
112
|
-
superSignMessageStub.calledOnceWith({ prv }, payload).should.be.true();
|
|
113
|
-
});
|
|
114
|
-
});
|
|
115
|
-
describe('with neither wallet nor prv', function () {
|
|
116
|
-
it('should throw an error', async function () {
|
|
117
|
-
await ofcToken
|
|
118
|
-
.signTransaction({ txPrebuild: { payload } })
|
|
119
|
-
.should.be.rejectedWith('You must pass in either one of wallet or prv');
|
|
120
|
-
});
|
|
121
|
-
});
|
|
122
|
-
});
|
|
123
|
-
});
|
|
124
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2ZjLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdGVzdC91bml0L2NvaW5zL29mYy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBOztHQUVHO0FBQ0gsa0RBQTBCO0FBQzFCLGtCQUFnQjtBQUNoQixnREFBNkM7QUFDN0MsMERBQXVEO0FBQ3ZELG1FQUFnRTtBQUNoRSxzQ0FBc0M7QUFFdEMsTUFBTSxpQkFBaUIsR0FBRztJQUN4QixJQUFJLEVBQUUsU0FBUztJQUNmLGFBQWEsRUFBRSxDQUFDO0lBQ2hCLElBQUksRUFBRSxTQUFTO0lBQ2YsSUFBSSxFQUFFLFNBQVM7SUFDZixXQUFXLEVBQUUsTUFBTTtJQUNuQixNQUFNLEVBQUUsS0FBSztDQUNkLENBQUM7QUFFRixRQUFRLENBQUMsZ0JBQWdCLEVBQUU7SUFDekIsSUFBSSxTQUFjLENBQUM7SUFFbkIsVUFBVSxDQUFDO1FBQ1QsU0FBUyxHQUFHLEVBQUUsR0FBRyxFQUFFLGVBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxPQUFPLENBQUMsd0JBQXdCLENBQUMsRUFBRSxDQUFDO0lBQ3RFLENBQUMsQ0FBQyxDQUFDO0lBRUgsU0FBUyxDQUFDO1FBQ1IsZUFBSyxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ2xCLENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLGFBQWEsRUFBRTtRQUN0QixJQUFJLEdBQVEsQ0FBQztRQUViLFVBQVUsQ0FBQztZQUNULEdBQUcsR0FBRyxJQUFJLFNBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUMzQixDQUFDLENBQUMsQ0FBQztRQUVILFFBQVEsQ0FBQyx3QkFBd0IsRUFBRTtZQUNqQyxFQUFFLENBQUMsZ0ZBQWdGLEVBQUUsS0FBSztnQkFDeEYsTUFBTSxZQUFZLEdBQUcsVUFBVSxDQUFDO2dCQUNoQyxNQUFNLGVBQWUsR0FBRyxlQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxDQUFDO2dCQUU1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QztnQkFFdkIsTUFBTSxRQUFRLENBQUMsZUFBZSxDQUFDLEVBQUUsVUFBVSxFQUFFLEVBQUUsT0FBTyxFQUFFLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztnQkFFakUsb0JBQW9CLENBQUMsY0FBYyxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsT0FBTyxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUN6RSxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO1FBRUgsUUFBUSxDQUFDLDZCQUE2QixFQUFFO1lBQ3RDLEVBQUUsQ0FBQyx1QkFBdUIsRUFBRSxLQUFLO2dCQUMvQixNQUFNLFFBQVE7cUJBQ1gsZUFBZSxDQUFDLEVBQUUsVUFBVSxFQUFFLEVBQUUsT0FBTyxFQUFFLEVBQUUsQ0FBQztxQkFDNUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsOENBQThDLENBQUMsQ0FBQztZQUM1RSxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQHByZXR0aWVyXG4gKi9cbmltcG9ydCBzaW5vbiBmcm9tICdzaW5vbic7XG5pbXBvcnQgJ3Nob3VsZCc7XG5pbXBvcnQgeyBPZmMgfSBmcm9tICcuLi8uLi8uLi9zcmMvY29pbnMvb2ZjJztcbmltcG9ydCB7IE9mY1Rva2VuIH0gZnJvbSAnLi4vLi4vLi4vc3JjL2NvaW5zL29mY1Rva2VuJztcbmltcG9ydCB7IEJhc2VDb2luIH0gZnJvbSAnLi4vLi4vLi4vc3JjL2JpdGdvL2Jhc2VDb2luL2Jhc2VDb2luJztcbmltcG9ydCB7IFdhbGxldCB9IGZyb20gJy4uLy4uLy4uL3NyYyc7XG5cbmNvbnN0IFRFU1RfVE9LRU5fQ09ORklHID0ge1xuICBjb2luOiAnb2ZjdXNkdCcsXG4gIGRlY2ltYWxQbGFjZXM6IDYsXG4gIG5hbWU6ICdPRkNVU0RUJyxcbiAgdHlwZTogJ29mY3VzZHQnLFxuICBiYWNraW5nQ29pbjogJ3VzZHQnLFxuICBpc0ZpYXQ6IGZhbHNlLFxufTtcblxuZGVzY3JpYmUoJ09mYyAvIE9mY1Rva2VuJywgZnVuY3Rpb24gKCkge1xuICBsZXQgbW9ja0JpdEdvOiBhbnk7XG5cbiAgYmVmb3JlRWFjaChmdW5jdGlvbiAoKSB7XG4gICAgbW9ja0JpdEdvID0geyB1cmw6IHNpbm9uLnN0dWIoKS5yZXR1cm5zKCdodHRwczovL3Rlc3QuYml0Z28uY29tJykgfTtcbiAgfSk7XG5cbiAgYWZ0ZXJFYWNoKGZ1bmN0aW9uICgpIHtcbiAgICBzaW5vbi5yZXN0b3JlKCk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdzaWduTWVzc2FnZScsIGZ1bmN0aW9uICgpIHtcbiAgICBsZXQgb2ZjOiBPZmM7XG5cbiAgICBiZWZvcmVFYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgIG9mYyA9IG5ldyBPZmMobW9ja0JpdEdvKTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCd3aXRoIGEgV2FsbGV0IGluc3RhbmNlJywgZnVuY3Rpb24gKCkge1xuICAgICAgaXQoJ3Nob3VsZCBkZWxlZ2F0ZSB0byB3YWxsZXQudG9UcmFkaW5nQWNjb3VudCgpLnNpZ25QYXlsb2FkKCkgYW5kIHJldHVybiBhIEJ1ZmZlcicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgaGV4U2lnbmF0dXJlID0gJ2RlYWRiZWVmJztcbiAgICAgICAgY29uc3Qgc2lnblBheWxvYWRTdHViID0gc2lub24uc3R1YigpLnJlc29sdmVzKGhleFNpZ25hdHVyZSk7XG5cbiAgICAgICAgY29uc3QgbW9ja0Jhc2VDb2luID0geyBzdXBwb3J0c1Rzczogc2lub24uc3R1YigpLnJldHVybnMoZmFsc2UpLCBnZXRNUENBbGdvcml0aG06IHNpbm9uLnN0dWIoKSB9O1xuICAgICAgICBjb25zdCB3YWxsZXREYXRhID0ge1xuICAgICAgICAgIGlkOiAnd2FsbGV0LWlkJyxcbiAgICAgICAgICBrZXlzOiBbJ2tleTEnLCAna2V5MicsICdrZXkzJ10sXG4gICAgICAgICAgbXVsdGlzaWdUeXBlOiAnb25jaGFpbicsXG4gICAgICAgICAgZW50ZXJwcmlzZTogJ2VudC1pZCcsXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHdhbGxldCA9IG5ldyBXYWxsZXQobW9ja0JpdEdvLCBtb2NrQmFzZUNvaW4gYXMgYW55LCB3YWxsZXREYXRhKTtcbiAgICAgICAgc2lub24uc3R1Yih3YWxsZXQsICd0b1RyYWRpbmdBY2NvdW50JykucmV0dXJucyh7IHNpZ25QYXlsb2FkOiBzaWduUGF5bG9hZFN0dWIgfSBhcyBhbnkpO1xuXG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSAndGVzdCBtZXNzYWdlJztcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgb2ZjLnNpZ25NZXNzYWdlKHdhbGxldCwgbWVzc2FnZSk7XG5cbiAgICAgICAgc2lnblBheWxvYWRTdHViLmNhbGxlZE9uY2VXaXRoKHsgcGF5bG9hZDogbWVzc2FnZSB9KS5zaG91bGQuYmUudHJ1ZSgpO1xuICAgICAgICByZXN1bHQuc2hvdWxkLmRlZXBFcXVhbChCdWZmZXIuZnJvbShoZXhTaWduYXR1cmUsICdoZXgnKSk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCd3aXRoIGEgcHJ2IGtleScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGl0KCdzaG91bGQgZGVsZWdhdGUgdG8gdGhlIGJhc2UgY2xhc3Mgc2lnbk1lc3NhZ2UnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IGV4cGVjdGVkUmVzdWx0ID0gQnVmZmVyLmZyb20oJ2Jhc2VzaWduYXR1cmUnLCAnaGV4Jyk7XG4gICAgICAgIGNvbnN0IHN1cGVyU2lnbk1lc3NhZ2VTdHViID0gc2lub24uc3R1YihCYXNlQ29pbi5wcm90b3R5cGUsICdzaWduTWVzc2FnZScpLnJlc29sdmVzKGV4cGVjdGVkUmVzdWx0KTtcblxuICAgICAgICBjb25zdCBrZXkgPSB7XG4gICAgICAgICAgcHJ2OiAneHBydjlzMjFaclFIMTQzSzNRVERMNExYdzJGN0hFSzN3SlVEMm5XMm5SazRzdGJQeTZjcTNqUFBxaHVDbzM2RWt6R0g2cWlUOW1KSEJ2dVBLdExSWUQ0TnhGYjVoZ1hNUUJCMkxMVDZteExESEhvJyxcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9ICd0ZXN0IG1lc3NhZ2UnO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBvZmMuc2lnbk1lc3NhZ2Uoa2V5LCBtZXNzYWdlKTtcblxuICAgICAgICBzdXBlclNpZ25NZXNzYWdlU3R1Yi5jYWxsZWRPbmNlV2l0aChrZXksIG1lc3NhZ2UpLnNob3VsZC5iZS50cnVlKCk7XG4gICAgICAgIHJlc3VsdC5zaG91bGQuZXF1YWwoZXhwZWN0ZWRSZXN1bHQpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdzaWduVHJhbnNhY3Rpb24gKE9mY1Rva2VuKScsIGZ1bmN0aW9uICgpIHtcbiAgICBsZXQgb2ZjVG9rZW46IE9mY1Rva2VuO1xuICAgIGNvbnN0IHBheWxvYWQgPSAne1wiYW1vdW50XCI6XCIxMDBcIixcImZyb21cIjpcImFsaWNlXCIsXCJ0b1wiOlwiYm9iXCJ9JztcblxuICAgIGJlZm9yZUVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgb2ZjVG9rZW4gPSBuZXcgT2ZjVG9rZW4obW9ja0JpdEdvLCBURVNUX1RPS0VOX0NPTkZJRyk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnd2l0aCB3YWxsZXQgYW5kIG5vIHBydiAoQml0R28gcmVtb3RlIHNpZ25pbmcpJywgZnVuY3Rpb24gKCkge1xuICAgICAgaXQoJ3Nob3VsZCBjYWxsIHdhbGxldC50b1RyYWRpbmdBY2NvdW50KCkuc2lnblBheWxvYWQoKSB3aXRob3V0IGEgcGFzc3BocmFzZScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgaGV4U2lnbmF0dXJlID0gJ2FhYmJjY2RkJztcbiAgICAgICAgY29uc3Qgc2lnblBheWxvYWRTdHViID0gc2lub24uc3R1YigpLnJlc29sdmVzKGhleFNpZ25hdHVyZSk7XG4gICAgICAgIGNvbnN0IG1vY2tXYWxsZXQgPSB7IHRvVHJhZGluZ0FjY291bnQ6IHNpbm9uLnN0dWIoKS5yZXR1cm5zKHsgc2lnblBheWxvYWQ6IHNpZ25QYXlsb2FkU3R1YiB9KSB9O1xuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IG9mY1Rva2VuLnNpZ25UcmFuc2FjdGlvbih7IHR4UHJlYnVpbGQ6IHsgcGF5bG9hZCB9LCB3YWxsZXQ6IG1vY2tXYWxsZXQgYXMgYW55IH0pO1xuXG4gICAgICAgIHNpZ25QYXlsb2FkU3R1Yi5jYWxsZWRPbmNlV2l0aCh7IHBheWxvYWQsIHdhbGxldFBhc3NwaHJhc2U6IHVuZGVmaW5lZCB9KS5zaG91bGQuYmUudHJ1ZSgpO1xuICAgICAgICByZXN1bHQuc2hvdWxkLmRlZXBFcXVhbCh7IGhhbGZTaWduZWQ6IHsgcGF5bG9hZCwgc2lnbmF0dXJlOiBoZXhTaWduYXR1cmUgfSB9KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ3dpdGggd2FsbGV0IGFuZCBwcnYgKGxvY2FsIHNpZ25pbmcgcm91dGVkIHRocm91Z2ggd2FsbGV0KScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGl0KCdzaG91bGQgY2FsbCB3YWxsZXQudG9UcmFkaW5nQWNjb3VudCgpLnNpZ25QYXlsb2FkKCkgd2l0aCB0aGUgd2FsbGV0IHBhc3NwaHJhc2UnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IGhleFNpZ25hdHVyZSA9ICdhYWJiY2NkZCc7XG4gICAgICAgIGNvbnN0IHBhc3NwaHJhc2UgPSAndGVzdC1wYXNzcGhyYXNlJztcbiAgICAgICAgY29uc3Qgc2lnblBheWxvYWRTdHViID0gc2lub24uc3R1YigpLnJlc29sdmVzKGhleFNpZ25hdHVyZSk7XG4gICAgICAgIGNvbnN0IG1vY2tXYWxsZXQgPSB7IHRvVHJhZGluZ0FjY291bnQ6IHNpbm9uLnN0dWIoKS5yZXR1cm5zKHsgc2lnblBheWxvYWQ6IHNpZ25QYXlsb2FkU3R1YiB9KSB9O1xuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IG9mY1Rva2VuLnNpZ25UcmFuc2FjdGlvbih7XG4gICAgICAgICAgdHhQcmVidWlsZDogeyBwYXlsb2FkIH0sXG4gICAgICAgICAgd2FsbGV0OiBtb2NrV2FsbGV0IGFzIGFueSxcbiAgICAgICAgICBwcnY6IHBhc3NwaHJhc2UsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHNpZ25QYXlsb2FkU3R1Yi5jYWxsZWRPbmNlV2l0aCh7IHBheWxvYWQsIHdhbGxldFBhc3NwaHJhc2U6IHBhc3NwaHJhc2UgfSkuc2hvdWxkLmJlLnRydWUoKTtcbiAgICAgICAgcmVzdWx0LnNob3VsZC5kZWVwRXF1YWwoeyBoYWxmU2lnbmVkOiB7IHBheWxvYWQsIHNpZ25hdHVyZTogaGV4U2lnbmF0dXJlIH0gfSk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCd3aXRoIHBydiBvbmx5IChsb2NhbCBzaWduaW5nIHdpdGhvdXQgd2FsbGV0KScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGl0KCdzaG91bGQgc2lnbiBsb2NhbGx5IGFuZCByZXR1cm4gdGhlIGNvcnJlY3QgaGFsZlNpZ25lZCByZXN1bHQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IHNpZ25hdHVyZUJ5dGVzID0gQnVmZmVyLmZyb20oJ2NjZGRlZScsICdoZXgnKTtcbiAgICAgICAgc2lub24uc3R1YihCYXNlQ29pbi5wcm90b3R5cGUsICdzaWduTWVzc2FnZScpLnJlc29sdmVzKHNpZ25hdHVyZUJ5dGVzKTtcblxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBvZmNUb2tlbi5zaWduVHJhbnNhY3Rpb24oeyB0eFByZWJ1aWxkOiB7IHBheWxvYWQgfSwgcHJ2OiAndGVzdC1wcnYnIH0pO1xuXG4gICAgICAgIHJlc3VsdC5zaG91bGQuZGVlcEVxdWFsKHsgaGFsZlNpZ25lZDogeyBwYXlsb2FkLCBzaWduYXR1cmU6IHNpZ25hdHVyZUJ5dGVzLnRvU3RyaW5nKCdoZXgnKSB9IH0pO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgcGFzcyB0aGUgcHJ2IHRvIHNpZ25NZXNzYWdlJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBzaWduYXR1cmVCeXRlcyA9IEJ1ZmZlci5mcm9tKCdjY2RkZWUnLCAnaGV4Jyk7XG4gICAgICAgIGNvbnN0IHN1cGVyU2lnbk1lc3NhZ2VTdHViID0gc2lub24uc3R1YihCYXNlQ29pbi5wcm90b3R5cGUsICdzaWduTWVzc2FnZScpLnJlc29sdmVzKHNpZ25hdHVyZUJ5dGVzKTtcbiAgICAgICAgY29uc3QgcHJ2ID0gJ3Rlc3QtcHJ2JztcblxuICAgICAgICBhd2FpdCBvZmNUb2tlbi5zaWduVHJhbnNhY3Rpb24oeyB0eFByZWJ1aWxkOiB7IHBheWxvYWQgfSwgcHJ2IH0pO1xuXG4gICAgICAgIHN1cGVyU2lnbk1lc3NhZ2VTdHViLmNhbGxlZE9uY2VXaXRoKHsgcHJ2IH0sIHBheWxvYWQpLnNob3VsZC5iZS50cnVlKCk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCd3aXRoIG5laXRoZXIgd2FsbGV0IG5vciBwcnYnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBpdCgnc2hvdWxkIHRocm93IGFuIGVycm9yJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBhd2FpdCBvZmNUb2tlblxuICAgICAgICAgIC5zaWduVHJhbnNhY3Rpb24oeyB0eFByZWJ1aWxkOiB7IHBheWxvYWQgfSB9KVxuICAgICAgICAgIC5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKCdZb3UgbXVzdCBwYXNzIGluIGVpdGhlciBvbmUgb2Ygd2FsbGV0IG9yIHBydicpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=
|