@bitgo/utxo-staking 1.25.0 → 1.26.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/cjs/scripts/babylon-sync.d.ts +2 -0
- package/dist/cjs/scripts/babylon-sync.d.ts.map +1 -0
- package/dist/cjs/scripts/babylon-sync.js +126 -0
- package/dist/cjs/src/babylon/delegationMessage.d.ts.map +1 -0
- package/dist/cjs/src/babylon/delegationMessage.js +285 -0
- package/dist/cjs/src/babylon/descriptor.d.ts.map +1 -0
- package/dist/cjs/src/babylon/descriptor.js +97 -0
- package/dist/cjs/src/babylon/index.d.ts.map +1 -0
- package/dist/{src → cjs/src}/babylon/index.js +1 -1
- package/dist/cjs/src/babylon/network.d.ts.map +1 -0
- package/dist/{src → cjs/src}/babylon/network.js +1 -1
- package/dist/cjs/src/babylon/parseDescriptor.d.ts.map +1 -0
- package/dist/cjs/src/babylon/parseDescriptor.js +159 -0
- package/dist/cjs/src/babylon/stakingManager.d.ts.map +1 -0
- package/dist/cjs/src/babylon/stakingManager.js +120 -0
- package/dist/cjs/src/babylon/stakingParams.d.ts.map +1 -0
- package/dist/cjs/src/babylon/stakingParams.js +132 -0
- package/dist/cjs/src/babylon/undelegation/UndelegationResponse.d.ts.map +1 -0
- package/dist/{src → cjs/src}/babylon/undelegation/UndelegationResponse.js +1 -1
- package/dist/cjs/src/babylon/undelegation/index.d.ts.map +1 -0
- package/dist/{src → cjs/src}/babylon/undelegation/index.js +1 -1
- package/dist/cjs/src/babylon/undelegation/unbonding.d.ts.map +1 -0
- package/dist/cjs/src/babylon/undelegation/unbonding.js +111 -0
- package/dist/cjs/src/coreDao/descriptor.d.ts.map +1 -0
- package/dist/cjs/src/coreDao/descriptor.js +38 -0
- package/dist/cjs/src/coreDao/index.d.ts.map +1 -0
- package/dist/{src → cjs/src}/coreDao/index.js +1 -1
- package/dist/cjs/src/coreDao/opReturn.d.ts.map +1 -0
- package/dist/cjs/src/coreDao/opReturn.js +183 -0
- package/dist/cjs/src/coreDao/transaction.d.ts.map +1 -0
- package/dist/cjs/src/coreDao/transaction.js +34 -0
- package/dist/cjs/src/index.d.ts.map +1 -0
- package/dist/{src → cjs/src}/index.js +1 -1
- package/dist/cjs/test/unit/babylon/bug71.d.ts +2 -0
- package/dist/cjs/test/unit/babylon/bug71.d.ts.map +1 -0
- package/dist/cjs/test/unit/babylon/bug71.js +108 -0
- package/dist/cjs/test/unit/babylon/key.utils.d.ts +6 -0
- package/dist/cjs/test/unit/babylon/key.utils.d.ts.map +1 -0
- package/dist/cjs/test/unit/babylon/key.utils.js +68 -0
- package/dist/cjs/test/unit/babylon/transactions.d.ts +2 -0
- package/dist/cjs/test/unit/babylon/transactions.d.ts.map +1 -0
- package/dist/cjs/test/unit/babylon/transactions.js +338 -0
- package/dist/cjs/test/unit/babylon/undelegation.d.ts +2 -0
- package/dist/cjs/test/unit/babylon/undelegation.d.ts.map +1 -0
- package/dist/cjs/test/unit/babylon/undelegation.js +156 -0
- package/dist/cjs/test/unit/babylon/vendor.utils.d.ts +13 -0
- package/dist/cjs/test/unit/babylon/vendor.utils.d.ts.map +1 -0
- package/dist/cjs/test/unit/babylon/vendor.utils.js +78 -0
- package/dist/cjs/test/unit/coreDao/descriptor.d.ts +2 -0
- package/dist/cjs/test/unit/coreDao/descriptor.d.ts.map +1 -0
- package/dist/cjs/test/unit/coreDao/descriptor.js +144 -0
- package/dist/cjs/test/unit/coreDao/opReturn.d.ts +2 -0
- package/dist/cjs/test/unit/coreDao/opReturn.d.ts.map +1 -0
- package/dist/cjs/test/unit/coreDao/opReturn.js +275 -0
- package/dist/cjs/test/unit/coreDao/utils.d.ts +5 -0
- package/dist/cjs/test/unit/coreDao/utils.d.ts.map +1 -0
- package/dist/cjs/test/unit/coreDao/utils.js +54 -0
- package/dist/cjs/test/unit/fixtures.utils.d.ts +9 -0
- package/dist/cjs/test/unit/fixtures.utils.d.ts.map +1 -0
- package/dist/cjs/test/unit/fixtures.utils.js +91 -0
- package/dist/cjs/tsconfig.tsbuildinfo +1 -0
- package/dist/esm/babylon/delegationMessage.d.ts +38 -0
- package/dist/esm/babylon/delegationMessage.js +239 -0
- package/dist/esm/babylon/descriptor.d.ts +48 -0
- package/dist/esm/babylon/descriptor.js +91 -0
- package/dist/esm/babylon/index.d.ts +6 -0
- package/dist/esm/babylon/index.js +11 -0
- package/dist/esm/babylon/network.d.ts +7 -0
- package/dist/esm/babylon/network.js +29 -0
- package/dist/esm/babylon/params.mainnet.json +152 -0
- package/dist/esm/babylon/params.testnet.json +212 -0
- package/dist/esm/babylon/parseDescriptor.d.ts +26 -0
- package/dist/esm/babylon/parseDescriptor.js +155 -0
- package/dist/esm/babylon/stakingManager.d.ts +6 -0
- package/dist/esm/babylon/stakingManager.js +83 -0
- package/dist/esm/babylon/stakingParams.d.ts +40 -0
- package/dist/esm/babylon/stakingParams.js +86 -0
- package/dist/esm/babylon/undelegation/UndelegationResponse.d.ts +24 -0
- package/dist/esm/babylon/undelegation/UndelegationResponse.js +18 -0
- package/dist/esm/babylon/undelegation/index.d.ts +3 -0
- package/dist/esm/babylon/undelegation/index.js +3 -0
- package/dist/esm/babylon/undelegation/unbonding.d.ts +16 -0
- package/dist/esm/babylon/undelegation/unbonding.js +70 -0
- package/dist/esm/coreDao/descriptor.d.ts +18 -0
- package/dist/esm/coreDao/descriptor.js +35 -0
- package/dist/esm/coreDao/index.d.ts +4 -0
- package/dist/esm/coreDao/index.js +4 -0
- package/dist/esm/coreDao/opReturn.d.ts +41 -0
- package/dist/esm/coreDao/opReturn.js +175 -0
- package/dist/esm/coreDao/transaction.d.ts +28 -0
- package/dist/esm/coreDao/transaction.js +30 -0
- package/dist/esm/index.d.ts +3 -0
- package/dist/esm/index.js +3 -0
- package/package.json +26 -10
- package/dist/src/babylon/delegationMessage.js +0 -285
- package/dist/src/babylon/descriptor.js +0 -97
- package/dist/src/babylon/parseDescriptor.js +0 -159
- package/dist/src/babylon/stakingManager.js +0 -120
- package/dist/src/babylon/stakingParams.js +0 -132
- package/dist/src/babylon/undelegation/unbonding.js +0 -111
- package/dist/src/coreDao/descriptor.js +0 -38
- package/dist/src/coreDao/opReturn.js +0 -183
- package/dist/src/coreDao/transaction.js +0 -34
- /package/dist/{src → cjs/src}/babylon/delegationMessage.d.ts +0 -0
- /package/dist/{src → cjs/src}/babylon/descriptor.d.ts +0 -0
- /package/dist/{src → cjs/src}/babylon/index.d.ts +0 -0
- /package/dist/{src → cjs/src}/babylon/network.d.ts +0 -0
- /package/dist/{src → cjs/src}/babylon/params.mainnet.json +0 -0
- /package/dist/{src → cjs/src}/babylon/params.testnet.json +0 -0
- /package/dist/{src → cjs/src}/babylon/parseDescriptor.d.ts +0 -0
- /package/dist/{src → cjs/src}/babylon/stakingManager.d.ts +0 -0
- /package/dist/{src → cjs/src}/babylon/stakingParams.d.ts +0 -0
- /package/dist/{src → cjs/src}/babylon/undelegation/UndelegationResponse.d.ts +0 -0
- /package/dist/{src → cjs/src}/babylon/undelegation/index.d.ts +0 -0
- /package/dist/{src → cjs/src}/babylon/undelegation/unbonding.d.ts +0 -0
- /package/dist/{src → cjs/src}/coreDao/descriptor.d.ts +0 -0
- /package/dist/{src → cjs/src}/coreDao/index.d.ts +0 -0
- /package/dist/{src → cjs/src}/coreDao/opReturn.d.ts +0 -0
- /package/dist/{src → cjs/src}/coreDao/transaction.d.ts +0 -0
- /package/dist/{src → cjs/src}/index.d.ts +0 -0
- /package/dist/{src → esm}/babylon/delegationMessage.d.ts.map +0 -0
- /package/dist/{src → esm}/babylon/descriptor.d.ts.map +0 -0
- /package/dist/{src → esm}/babylon/index.d.ts.map +0 -0
- /package/dist/{src → esm}/babylon/network.d.ts.map +0 -0
- /package/dist/{src → esm}/babylon/parseDescriptor.d.ts.map +0 -0
- /package/dist/{src → esm}/babylon/stakingManager.d.ts.map +0 -0
- /package/dist/{src → esm}/babylon/stakingParams.d.ts.map +0 -0
- /package/dist/{src → esm}/babylon/undelegation/UndelegationResponse.d.ts.map +0 -0
- /package/dist/{src → esm}/babylon/undelegation/index.d.ts.map +0 -0
- /package/dist/{src → esm}/babylon/undelegation/unbonding.d.ts.map +0 -0
- /package/dist/{src → esm}/coreDao/descriptor.d.ts.map +0 -0
- /package/dist/{src → esm}/coreDao/index.d.ts.map +0 -0
- /package/dist/{src → esm}/coreDao/opReturn.d.ts.map +0 -0
- /package/dist/{src → esm}/coreDao/transaction.d.ts.map +0 -0
- /package/dist/{src → esm}/index.d.ts.map +0 -0
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
const assert_1 = __importDefault(require("assert"));
|
|
40
|
+
const fs_1 = require("fs");
|
|
41
|
+
const t = __importStar(require("io-ts"));
|
|
42
|
+
const PathReporter_1 = require("io-ts/lib/PathReporter");
|
|
43
|
+
const Either_1 = require("fp-ts/Either");
|
|
44
|
+
const utxolib = __importStar(require("@bitgo/utxo-lib"));
|
|
45
|
+
const wasm_utxo_1 = require("@bitgo/wasm-utxo");
|
|
46
|
+
const babylon_1 = require("../../../src/babylon");
|
|
47
|
+
const undelegation_1 = require("../../../src/babylon/undelegation");
|
|
48
|
+
const parseDescriptor_1 = require("../../../src/babylon/parseDescriptor");
|
|
49
|
+
const fixtures_utils_1 = require("../fixtures.utils");
|
|
50
|
+
const BtcDelegation = t.type({
|
|
51
|
+
unbonding_time: t.number,
|
|
52
|
+
undelegation_response: undelegation_1.UndelegationResponse,
|
|
53
|
+
});
|
|
54
|
+
async function getFixture(txid) {
|
|
55
|
+
// As returned by https://babylon.nodes.guru/api#/Query/BTCDelegation
|
|
56
|
+
const BtcDelegationResponse = t.type({ btc_delegation: BtcDelegation }, 'BtcDelegationResponse');
|
|
57
|
+
const filename = __dirname + `/../../fixtures/babylon/rpc/btc_delegation/testnet.${txid}.json`;
|
|
58
|
+
const data = JSON.parse(await fs_1.promises.readFile(filename, 'utf8'));
|
|
59
|
+
const result = BtcDelegationResponse.decode(data);
|
|
60
|
+
if ((0, Either_1.isLeft)(result)) {
|
|
61
|
+
throw new Error(`Failed to decode fixture data for txid ${txid}: ${PathReporter_1.PathReporter.report(result).join(', ')}`);
|
|
62
|
+
}
|
|
63
|
+
return result.right.btc_delegation;
|
|
64
|
+
}
|
|
65
|
+
function toDescriptor(descriptor) {
|
|
66
|
+
return descriptor instanceof wasm_utxo_1.Descriptor
|
|
67
|
+
? descriptor
|
|
68
|
+
: wasm_utxo_1.Descriptor.fromStringDetectType(typeof descriptor === 'string' ? descriptor : wasm_utxo_1.ast.formatNode(descriptor));
|
|
69
|
+
}
|
|
70
|
+
function runTest(network, txid, descriptor) {
|
|
71
|
+
describe(`Unbonding transaction ${txid}`, function () {
|
|
72
|
+
let fixture;
|
|
73
|
+
let psbt;
|
|
74
|
+
let signatures;
|
|
75
|
+
before('should create a PSBT from the unbonding transaction', async function () {
|
|
76
|
+
fixture = await getFixture(txid);
|
|
77
|
+
const txBuffer = Buffer.from(fixture.undelegation_response.unbonding_tx_hex, 'hex');
|
|
78
|
+
const tx = utxolib.bitgo.createTransactionFromBuffer(txBuffer, network, {
|
|
79
|
+
amountType: 'bigint',
|
|
80
|
+
});
|
|
81
|
+
signatures = fixture.undelegation_response.covenant_unbonding_sig_list.map((sig) => (0, undelegation_1.toPartialSig)(sig));
|
|
82
|
+
psbt = (0, undelegation_1.toUnbondingPsbtWithSignatures)(tx, {
|
|
83
|
+
script: Buffer.from('5120b81e8691ab3c46bddf8ea43f776e4d64abf417a0fa5a4d09976c8aaadabbb6a0', 'hex'),
|
|
84
|
+
value: 100000n,
|
|
85
|
+
}, descriptor, signatures, utxolib.networks.testnet);
|
|
86
|
+
});
|
|
87
|
+
it('should have valid signatures', async function () {
|
|
88
|
+
(0, undelegation_1.assertValidSignatures)(psbt, 0, signatures);
|
|
89
|
+
});
|
|
90
|
+
it('should match the fixture', async function () {
|
|
91
|
+
await (0, fixtures_utils_1.assertTransactionEqualsFixture)('test/fixtures/babylon/unbonding.' + txid.substring(0, 4) + '.psbt.json', psbt);
|
|
92
|
+
});
|
|
93
|
+
it('can spend from unbonding output', async function () {
|
|
94
|
+
const parsed = (0, parseDescriptor_1.parseStakingDescriptor)(descriptor);
|
|
95
|
+
(0, assert_1.default)(parsed);
|
|
96
|
+
const descriptorBuilder = new babylon_1.BabylonDescriptorBuilder(parsed.stakerKey, parsed.finalityProviderKeys, parsed.covenantKeys, parsed.covenantThreshold, parsed.stakingTimeLock, fixture.unbonding_time);
|
|
97
|
+
assert_1.default.deepStrictEqual(descriptorBuilder.getUnbondingMiniscriptNode(), parsed.unbondingMiniscriptNode, 'Unbonding miniscript node does not match expected value');
|
|
98
|
+
(0, assert_1.default)(psbt.txOutputs.length === 1, 'Unbonding transaction should have exactly one output');
|
|
99
|
+
assert_1.default.deepStrictEqual(psbt.txOutputs[0].script, Buffer.from(descriptorBuilder.getUnbondingDescriptor().scriptPubkey()));
|
|
100
|
+
});
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
runTest(utxolib.networks.bitcoinPublicSignet, '5d277e1b29e5589074aea95ac8c8230fd911c2ec3c58774aafdef915619b772c', toDescriptor({
|
|
104
|
+
tr: [
|
|
105
|
+
'50929b74c1a04954b78b4b6035e97a5e078a5a0f28ec96d547bfee9ace803ac0',
|
|
106
|
+
[
|
|
107
|
+
{
|
|
108
|
+
and_v: [
|
|
109
|
+
{
|
|
110
|
+
and_v: [
|
|
111
|
+
{ 'v:pk': '1b443f34ddc1bbaef52a8c5162dfa5a84524636ec745292f949470369ee67391' },
|
|
112
|
+
{ 'v:pk': 'd23c2c25e1fcf8fd1c21b9a402c19e2e309e531e45e92fb1e9805b6056b0cc76' },
|
|
113
|
+
],
|
|
114
|
+
},
|
|
115
|
+
{
|
|
116
|
+
multi_a: [
|
|
117
|
+
6,
|
|
118
|
+
'0aee0509b16db71c999238a4827db945526859b13c95487ab46725357c9a9f25',
|
|
119
|
+
'113c3a32a9d320b72190a04a020a0db3976ef36972673258e9a38a364f3dc3b0',
|
|
120
|
+
'17921cf156ccb4e73d428f996ed11b245313e37e27c978ac4d2cc21eca4672e4',
|
|
121
|
+
'3bb93dfc8b61887d771f3630e9a63e97cbafcfcc78556a474df83a31a0ef899c',
|
|
122
|
+
'40afaf47c4ffa56de86410d8e47baa2bb6f04b604f4ea24323737ddc3fe092df',
|
|
123
|
+
'79a71ffd71c503ef2e2f91bccfc8fcda7946f4653cef0d9f3dde20795ef3b9f0',
|
|
124
|
+
'd21faf78c6751a0d38e6bd8028b907ff07e9a869a43fc837d6b3f8dff6119a36',
|
|
125
|
+
'f5199efae3f28bb82476163a7e458c7ad445d9bffb0682d10d3bdb2cb41f8e8e',
|
|
126
|
+
'fa9d882d45f4060bdb8042183828cd87544f1ea997380e586cab77d5fd698737',
|
|
127
|
+
],
|
|
128
|
+
},
|
|
129
|
+
],
|
|
130
|
+
},
|
|
131
|
+
[
|
|
132
|
+
{
|
|
133
|
+
and_v: [
|
|
134
|
+
{ 'v:pk': '1b443f34ddc1bbaef52a8c5162dfa5a84524636ec745292f949470369ee67391' },
|
|
135
|
+
{
|
|
136
|
+
multi_a: [
|
|
137
|
+
6,
|
|
138
|
+
'0aee0509b16db71c999238a4827db945526859b13c95487ab46725357c9a9f25',
|
|
139
|
+
'113c3a32a9d320b72190a04a020a0db3976ef36972673258e9a38a364f3dc3b0',
|
|
140
|
+
'17921cf156ccb4e73d428f996ed11b245313e37e27c978ac4d2cc21eca4672e4',
|
|
141
|
+
'3bb93dfc8b61887d771f3630e9a63e97cbafcfcc78556a474df83a31a0ef899c',
|
|
142
|
+
'40afaf47c4ffa56de86410d8e47baa2bb6f04b604f4ea24323737ddc3fe092df',
|
|
143
|
+
'79a71ffd71c503ef2e2f91bccfc8fcda7946f4653cef0d9f3dde20795ef3b9f0',
|
|
144
|
+
'd21faf78c6751a0d38e6bd8028b907ff07e9a869a43fc837d6b3f8dff6119a36',
|
|
145
|
+
'f5199efae3f28bb82476163a7e458c7ad445d9bffb0682d10d3bdb2cb41f8e8e',
|
|
146
|
+
'fa9d882d45f4060bdb8042183828cd87544f1ea997380e586cab77d5fd698737',
|
|
147
|
+
],
|
|
148
|
+
},
|
|
149
|
+
],
|
|
150
|
+
},
|
|
151
|
+
{ and_v: [{ 'v:pk': '1b443f34ddc1bbaef52a8c5162dfa5a84524636ec745292f949470369ee67391' }, { older: 10000 }] },
|
|
152
|
+
],
|
|
153
|
+
],
|
|
154
|
+
],
|
|
155
|
+
}));
|
|
156
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidW5kZWxlZ2F0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGVzdC91bml0L2JhYnlsb24vdW5kZWxlZ2F0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsb0RBQTRCO0FBQzVCLDJCQUFvQztBQUVwQyx5Q0FBMkI7QUFDM0IseURBQXNEO0FBQ3RELHlDQUFzQztBQUN0Qyx5REFBMkM7QUFDM0MsZ0RBQW1EO0FBR25ELGtEQUFnRTtBQUNoRSxvRUFLMkM7QUFDM0MsMEVBQThFO0FBQzlFLHNEQUFtRTtBQUVuRSxNQUFNLGFBQWEsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQzNCLGNBQWMsRUFBRSxDQUFDLENBQUMsTUFBTTtJQUN4QixxQkFBcUIsRUFBRSxtQ0FBb0I7Q0FDNUMsQ0FBQyxDQUFDO0FBSUgsS0FBSyxVQUFVLFVBQVUsQ0FBQyxJQUFZO0lBQ3BDLHFFQUFxRTtJQUNyRSxNQUFNLHFCQUFxQixHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxjQUFjLEVBQUUsYUFBYSxFQUFFLEVBQUUsdUJBQXVCLENBQUMsQ0FBQztJQUNqRyxNQUFNLFFBQVEsR0FBRyxTQUFTLEdBQUcsc0RBQXNELElBQUksT0FBTyxDQUFDO0lBQy9GLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxhQUFFLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQzdELE1BQU0sTUFBTSxHQUFHLHFCQUFxQixDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNsRCxJQUFJLElBQUEsZUFBTSxFQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFDbkIsTUFBTSxJQUFJLEtBQUssQ0FBQywwQ0FBMEMsSUFBSSxLQUFLLDJCQUFZLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElB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LEVBQUUsTUFBTSxFQUFFLGtFQUFrRSxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRTthQUM5RztTQUNGO0tBQ0Y7Q0FDRixDQUFDLENBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCB7IHByb21pc2VzIGFzIGZzIH0gZnJvbSAnZnMnO1xuXG5pbXBvcnQgKiBhcyB0IGZyb20gJ2lvLXRzJztcbmltcG9ydCB7IFBhdGhSZXBvcnRlciB9IGZyb20gJ2lvLXRzL2xpYi9QYXRoUmVwb3J0ZXInO1xuaW1wb3J0IHsgaXNMZWZ0IH0gZnJvbSAnZnAtdHMvRWl0aGVyJztcbmltcG9ydCAqIGFzIHV0eG9saWIgZnJvbSAnQGJpdGdvL3V0eG8tbGliJztcbmltcG9ydCB7IGFzdCwgRGVzY3JpcHRvciB9IGZyb20gJ0BiaXRnby93YXNtLXV0eG8nO1xuaW1wb3J0IHsgUGFydGlhbFNpZyB9IGZyb20gJ2JpcDE3NC9zcmMvbGliL2ludGVyZmFjZXMnO1xuXG5pbXBvcnQgeyBCYWJ5bG9uRGVzY3JpcHRvckJ1aWxkZXIgfSBmcm9tICcuLi8uLi8uLi9zcmMvYmFieWxvbic7XG5pbXBvcnQge1xuICB0b1BhcnRpYWxTaWcsXG4gIFVuZGVsZWdhdGlvblJlc3BvbnNlLFxuICBhc3NlcnRWYWxpZFNpZ25hdHVyZXMsXG4gIHRvVW5ib25kaW5nUHNidFdpdGhTaWduYXR1cmVzLFxufSBmcm9tICcuLi8uLi8uLi9zcmMvYmFieWxvbi91bmRlbGVnYXRpb24nO1xuaW1wb3J0IHsgcGFyc2VTdGFraW5nRGVzY3JpcHRvciB9IGZyb20gJy4uLy4uLy4uL3NyYy9iYWJ5bG9uL3BhcnNlRGVzY3JpcHRvcic7XG5pbXBvcnQgeyBhc3NlcnRUcmFuc2FjdGlvbkVxdWFsc0ZpeHR1cmUgfSBmcm9tICcuLi9maXh0dXJlcy51dGlscyc7XG5cbmNvbnN0IEJ0Y0RlbGVnYXRpb24gPSB0LnR5cGUoe1xuICB1bmJvbmRpbmdfdGltZTogdC5udW1iZXIsXG4gIHVuZGVsZWdhdGlvbl9yZXNwb25zZTogVW5kZWxlZ2F0aW9uUmVzcG9uc2UsXG59KTtcblxudHlwZSBCdGNEZWxlZ2F0aW9uID0gdC5UeXBlT2Y8dHlwZW9mIEJ0Y0RlbGVnYXRpb24+O1xuXG5hc3luYyBmdW5jdGlvbiBnZXRGaXh0dXJlKHR4aWQ6IHN0cmluZyk6IFByb21pc2U8QnRjRGVsZWdhdGlvbj4ge1xuICAvLyBBcyByZXR1cm5lZCBieSBodHRwczovL2JhYnlsb24ubm9kZXMuZ3VydS9hcGkjL1F1ZXJ5L0JUQ0RlbGVnYXRpb25cbiAgY29uc3QgQnRjRGVsZWdhdGlvblJlc3BvbnNlID0gdC50eXBlKHsgYnRjX2RlbGVnYXRpb246IEJ0Y0RlbGVnYXRpb24gfSwgJ0J0Y0RlbGVnYXRpb25SZXNwb25zZScpO1xuICBjb25zdCBmaWxlbmFtZSA9IF9fZGlybmFtZSArIGAvLi4vLi4vZml4dHVyZXMvYmFieWxvbi9ycGMvYnRjX2RlbGVnYXRpb24vdGVzdG5ldC4ke3R4aWR9Lmpzb25gO1xuICBjb25zdCBkYXRhID0gSlNPTi5wYXJzZShhd2FpdCBmcy5yZWFkRmlsZShmaWxlbmFtZSwgJ3V0ZjgnKSk7XG4gIGNvbnN0IHJlc3VsdCA9IEJ0Y0RlbGVnYXRpb25SZXNwb25zZS5kZWNvZGUoZGF0YSk7XG4gIGlmIChpc0xlZnQocmVzdWx0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGRlY29kZSBmaXh0dXJlIGRhdGEgZm9yIHR4aWQgJHt0eGlkfTogJHtQYXRoUmVwb3J0ZXIucmVwb3J0KHJlc3VsdCkuam9pbignLCAnKX1gKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0LnJpZ2h0LmJ0Y19kZWxlZ2F0aW9uO1xufVxuXG50eXBlIERlc2NyaXB0b3JMaWtlID0gRGVzY3JpcHRvciB8IGFzdC5EZXNjcmlwdG9yTm9kZSB8IHN0cmluZztcblxuZnVuY3Rpb24gdG9EZXNjcmlwdG9yKGRlc2NyaXB0b3I6IERlc2NyaXB0b3JMaWtlKTogRGVzY3JpcHRvciB7XG4gIHJldHVybiBkZXNjcmlwdG9yIGluc3RhbmNlb2YgRGVzY3JpcHRvclxuICAgID8gZGVzY3JpcHRvclxuICAgIDogRGVzY3JpcHRvci5mcm9tU3RyaW5nRGV0ZWN0VHlwZSh0eXBlb2YgZGVzY3JpcHRvciA9PT0gJ3N0cmluZycgPyBkZXNjcmlwdG9yIDogYXN0LmZvcm1hdE5vZGUoZGVzY3JpcHRvcikpO1xufVxuXG5mdW5jdGlvbiBydW5UZXN0KG5ldHdvcms6IHV0eG9saWIuTmV0d29yaywgdHhpZDogc3RyaW5nLCBkZXNjcmlwdG9yOiBEZXNjcmlwdG9yKTogdm9pZCB7XG4gIGRlc2NyaWJlKGBVbmJvbmRpbmcgdHJhbnNhY3Rpb24gJHt0eGlkfWAsIGZ1bmN0aW9uICgpIHtcbiAgICBsZXQgZml4dHVyZTogQnRjRGVsZWdhdGlvbjtcbiAgICBsZXQgcHNidDogdXR4b2xpYi5iaXRnby5VdHhvUHNidDtcbiAgICBsZXQgc2lnbmF0dXJlczogUGFydGlhbFNpZ1tdO1xuXG4gICAgYmVmb3JlKCdzaG91bGQgY3JlYXRlIGEgUFNCVCBmcm9tIHRoZSB1bmJvbmRpbmcgdHJhbnNhY3Rpb24nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBmaXh0dXJlID0gYXdhaXQgZ2V0Rml4dHVyZSh0eGlkKTtcbiAgICAgIGNvbnN0IHR4QnVmZmVyID0gQnVmZmVyLmZyb20oZml4dHVyZS51bmRlbGVnYXRpb25fcmVzcG9uc2UudW5ib25kaW5nX3R4X2hleCwgJ2hleCcpO1xuICAgICAgY29uc3QgdHggPSB1dHhvbGliLmJpdGdvLmNyZWF0ZVRyYW5zYWN0aW9uRnJvbUJ1ZmZlcih0eEJ1ZmZlciwgbmV0d29yaywge1xuICAgICAgICBhbW91bnRUeXBlOiAnYmlnaW50JyxcbiAgICAgIH0pO1xuICAgICAgc2lnbmF0dXJlcyA9IGZpeHR1cmUudW5kZWxlZ2F0aW9uX3Jlc3BvbnNlLmNvdmVuYW50X3VuYm9uZGluZ19zaWdfbGlzdC5tYXAoKHNpZykgPT4gdG9QYXJ0aWFsU2lnKHNpZykpO1xuXG4gICAgICBwc2J0ID0gdG9VbmJvbmRpbmdQc2J0V2l0aFNpZ25hdHVyZXMoXG4gICAgICAgIHR4LFxuICAgICAgICB7XG4gICAgICAgICAgc2NyaXB0OiBCdWZmZXIuZnJvbSgnNTEyMGI4MWU4NjkxYWIzYzQ2YmRkZjhlYTQzZjc3NmU0ZDY0YWJmNDE3YTBmYTVhNGQwOTk3NmM4YWFhZGFiYmI2YTAnLCAnaGV4JyksXG4gICAgICAgICAgdmFsdWU6IDEwMF8wMDBuLFxuICAgICAgICB9LFxuICAgICAgICBkZXNjcmlwdG9yLFxuICAgICAgICBzaWduYXR1cmVzLFxuICAgICAgICB1dHhvbGliLm5ldHdvcmtzLnRlc3RuZXRcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGhhdmUgdmFsaWQgc2lnbmF0dXJlcycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGFzc2VydFZhbGlkU2lnbmF0dXJlcyhwc2J0LCAwLCBzaWduYXR1cmVzKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgbWF0Y2ggdGhlIGZpeHR1cmUnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBhd2FpdCBhc3NlcnRUcmFuc2FjdGlvbkVxdWFsc0ZpeHR1cmUoXG4gICAgICAgICd0ZXN0L2ZpeHR1cmVzL2JhYnlsb24vdW5ib25kaW5nLicgKyB0eGlkLnN1YnN0cmluZygwLCA0KSArICcucHNidC5qc29uJyxcbiAgICAgICAgcHNidFxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdjYW4gc3BlbmQgZnJvbSB1bmJvbmRpbmcgb3V0cHV0JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgcGFyc2VkID0gcGFyc2VTdGFraW5nRGVzY3JpcHRvcihkZXNjcmlwdG9yKTtcbiAgICAgIGFzc2VydChwYXJzZWQpO1xuXG4gICAgICBjb25zdCBkZXNjcmlwdG9yQnVpbGRlciA9IG5ldyBCYWJ5bG9uRGVzY3JpcHRvckJ1aWxkZXIoXG4gICAgICAgIHBhcnNlZC5zdGFrZXJLZXksXG4gICAgICAgIHBhcnNlZC5maW5hbGl0eVByb3ZpZGVyS2V5cyxcbiAgICAgICAgcGFyc2VkLmNvdmVuYW50S2V5cyxcbiAgICAgICAgcGFyc2VkLmNvdmVuYW50VGhyZXNob2xkLFxuICAgICAgICBwYXJzZWQuc3Rha2luZ1RpbWVMb2NrLFxuICAgICAgICBmaXh0dXJlLnVuYm9uZGluZ190aW1lXG4gICAgICApO1xuXG4gICAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKFxuICAgICAgICBkZXNjcmlwdG9yQnVpbGRlci5nZXRVbmJvbmRpbmdNaW5pc2NyaXB0Tm9kZSgpLFxuICAgICAgICBwYXJzZWQudW5ib25kaW5nTWluaXNjcmlwdE5vZGUsXG4gICAgICAgICdVbmJvbmRpbmcgbWluaXNjcmlwdCBub2RlIGRvZXMgbm90IG1hdGNoIGV4cGVjdGVkIHZhbHVlJ1xuICAgICAgKTtcblxuICAgICAgYXNzZXJ0KHBzYnQudHhPdXRwdXRzLmxlbmd0aCA9PT0gMSwgJ1VuYm9uZGluZyB0cmFuc2FjdGlvbiBzaG91bGQgaGF2ZSBleGFjdGx5IG9uZSBvdXRwdXQnKTtcblxuICAgICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChcbiAgICAgICAgcHNidC50eE91dHB1dHNbMF0uc2NyaXB0LFxuICAgICAgICBCdWZmZXIuZnJvbShkZXNjcmlwdG9yQnVpbGRlci5nZXRVbmJvbmRpbmdEZXNjcmlwdG9yKCkuc2NyaXB0UHVia2V5KCkpXG4gICAgICApO1xuICAgIH0pO1xuICB9KTtcbn1cblxucnVuVGVzdChcbiAgdXR4b2xpYi5uZXR3b3Jrcy5iaXRjb2luUHVibGljU2lnbmV0LFxuICAnNWQyNzdlMWIyOWU1NTg5MDc0YWVhOTVhYzhjODIzMGZkOTExYzJlYzNjNTg3NzRhYWZkZWY5MTU2MTliNzcyYycsXG4gIHRvRGVzY3JpcHRvcih7XG4gICAgdHI6IFtcbiAgICAgICc1MDkyOWI3NGMxYTA0OTU0Yjc4YjRiNjAzNWU5N2E1ZTA3OGE1YTBmMjhlYzk2ZDU0N2JmZWU5YWNlODAzYWMwJyxcbiAgICAgIFtcbiAgICAgICAge1xuICAgICAgICAgIGFuZF92OiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGFuZF92OiBbXG4gICAgICAgICAgICAgICAgeyAndjpwayc6ICcxYjQ0M2YzNGRkYzFiYmFlZjUyYThjNTE2MmRmYTVhODQ1MjQ2MzZlYzc0NTI5MmY5NDk0NzAzNjllZTY3MzkxJyB9LFxuICAgICAgICAgICAgICAgIHsgJ3Y6cGsnOiAnZDIzYzJjMjVlMWZjZjhmZDFjMjFiOWE0MDJjMTllMmUzMDllNTMxZTQ1ZTkyZmIxZTk4MDViNjA1NmIwY2M3NicgfSxcbiAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIG11bHRpX2E6IFtcbiAgICAgICAgICAgICAgICA2LFxuICAgICAgICAgICAgICAgICcwYWVlMDUwOWIxNmRiNzFjOTk5MjM4YTQ4MjdkYjk0NTUyNjg1OWIxM2M5NTQ4N2FiNDY3MjUzNTdjOWE5ZjI1JyxcbiAgICAgICAgICAgICAgICAnMTEzYzNhMzJhOWQzMjBiNzIxOTBhMDRhMDIwYTBkYjM5NzZlZjM2OTcyNjczMjU4ZTlhMzhhMzY0ZjNkYzNiMCcsXG4gICAgICAgICAgICAgICAgJzE3OTIxY2YxNTZjY2I0ZTczZDQyOGY5OTZlZDExYjI0NTMxM2UzN2UyN2M5NzhhYzRkMmNjMjFlY2E0NjcyZTQnLFxuICAgICAgICAgICAgICAgICczYmI5M2RmYzhiNjE4ODdkNzcxZjM2MzBlOWE2M2U5N2NiYWZjZmNjNzg1NTZhNDc0ZGY4M2EzMWEwZWY4OTljJyxcbiAgICAgICAgICAgICAgICAnNDBhZmFmNDdjNGZmYTU2ZGU4NjQxMGQ4ZTQ3YmFhMmJiNmYwNGI2MDRmNGVhMjQzMjM3MzdkZGMzZmUwOTJkZicsXG4gICAgICAgICAgICAgICAgJzc5YTcxZmZkNzFjNTAzZWYyZTJmOTFiY2NmYzhmY2RhNzk0NmY0NjUzY2VmMGQ5ZjNkZGUyMDc5NWVmM2I5ZjAnLFxuICAgICAgICAgICAgICAgICdkMjFmYWY3OGM2NzUxYTBkMzhlNmJkODAyOGI5MDdmZjA3ZTlhODY5YTQzZmM4MzdkNmIzZjhkZmY2MTE5YTM2JyxcbiAgICAgICAgICAgICAgICAnZjUxOTllZmFlM2YyOGJiODI0NzYxNjNhN2U0NThjN2FkNDQ1ZDliZmZiMDY4MmQxMGQzYmRiMmNiNDFmOGU4ZScsXG4gICAgICAgICAgICAgICAgJ2ZhOWQ4ODJkNDVmNDA2MGJkYjgwNDIxODM4MjhjZDg3NTQ0ZjFlYTk5NzM4MGU1ODZjYWI3N2Q1ZmQ2OTg3MzcnLFxuICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICB9LFxuICAgICAgICBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYW5kX3Y6IFtcbiAgICAgICAgICAgICAgeyAndjpwayc6ICcxYjQ0M2YzNGRkYzFiYmFlZjUyYThjNTE2MmRmYTVhODQ1MjQ2MzZlYzc0NTI5MmY5NDk0NzAzNjllZTY3MzkxJyB9LFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbXVsdGlfYTogW1xuICAgICAgICAgICAgICAgICAgNixcbiAgICAgICAgICAgICAgICAgICcwYWVlMDUwOWIxNmRiNzFjOTk5MjM4YTQ4MjdkYjk0NTUyNjg1OWIxM2M5NTQ4N2FiNDY3MjUzNTdjOWE5ZjI1JyxcbiAgICAgICAgICAgICAgICAgICcxMTNjM2EzMmE5ZDMyMGI3MjE5MGEwNGEwMjBhMGRiMzk3NmVmMzY5NzI2NzMyNThlOWEzOGEzNjRmM2RjM2IwJyxcbiAgICAgICAgICAgICAgICAgICcxNzkyMWNmMTU2Y2NiNGU3M2Q0MjhmOTk2ZWQxMWIyNDUzMTNlMzdlMjdjOTc4YWM0ZDJjYzIxZWNhNDY3MmU0JyxcbiAgICAgICAgICAgICAgICAgICczYmI5M2RmYzhiNjE4ODdkNzcxZjM2MzBlOWE2M2U5N2NiYWZjZmNjNzg1NTZhNDc0ZGY4M2EzMWEwZWY4OTljJyxcbiAgICAgICAgICAgICAgICAgICc0MGFmYWY0N2M0ZmZhNTZkZTg2NDEwZDhlNDdiYWEyYmI2ZjA0YjYwNGY0ZWEyNDMyMzczN2RkYzNmZTA5MmRmJyxcbiAgICAgICAgICAgICAgICAgICc3OWE3MWZmZDcxYzUwM2VmMmUyZjkxYmNjZmM4ZmNkYTc5NDZmNDY1M2NlZjBkOWYzZGRlMjA3OTVlZjNiOWYwJyxcbiAgICAgICAgICAgICAgICAgICdkMjFmYWY3OGM2NzUxYTBkMzhlNmJkODAyOGI5MDdmZjA3ZTlhODY5YTQzZmM4MzdkNmIzZjhkZmY2MTE5YTM2JyxcbiAgICAgICAgICAgICAgICAgICdmNTE5OWVmYWUzZjI4YmI4MjQ3NjE2M2E3ZTQ1OGM3YWQ0NDVkOWJmZmIwNjgyZDEwZDNiZGIyY2I0MWY4ZThlJyxcbiAgICAgICAgICAgICAgICAgICdmYTlkODgyZDQ1ZjQwNjBiZGI4MDQyMTgzODI4Y2Q4NzU0NGYxZWE5OTczODBlNTg2Y2FiNzdkNWZkNjk4NzM3JyxcbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHsgYW5kX3Y6IFt7ICd2OnBrJzogJzFiNDQzZjM0ZGRjMWJiYWVmNTJhOGM1MTYyZGZhNWE4NDUyNDYzNmVjNzQ1MjkyZjk0OTQ3MDM2OWVlNjczOTEnIH0sIHsgb2xkZXI6IDEwMDAwIH1dIH0sXG4gICAgICAgIF0sXG4gICAgICBdLFxuICAgIF0sXG4gIH0pXG4pO1xuIl19
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import * as bitcoinjslib from 'bitcoinjs-lib';
|
|
2
|
+
import { ECPairInterface } from '@bitgo/utxo-lib';
|
|
3
|
+
import * as vendor from '@bitgo/babylonlabs-io-btc-staking-ts';
|
|
4
|
+
import * as babylonProtobuf from '@babylonlabs-io/babylon-proto-ts';
|
|
5
|
+
import { BabylonDescriptorBuilder, ValueWithTypeUrl } from '../../../src/babylon';
|
|
6
|
+
type Result = {
|
|
7
|
+
unsignedDelegationMsg: ValueWithTypeUrl<babylonProtobuf.btcstakingtx.MsgCreateBTCDelegation>;
|
|
8
|
+
stakingTx: bitcoinjslib.Transaction;
|
|
9
|
+
};
|
|
10
|
+
export declare function getBitGoUtxoStakingMsgCreateBtcDelegation(network: bitcoinjslib.Network, stakerKey: ECPairInterface, finalityProvider: ECPairInterface, descriptorBuilder: BabylonDescriptorBuilder, stakingParams: vendor.VersionedStakingParams[], changeAddress: string, amount: number, utxo: vendor.UTXO, feeRateSatB: number, blockHeight: number): Promise<Result>;
|
|
11
|
+
export declare function getVendorMsgCreateBtcDelegation(network: bitcoinjslib.Network, stakerKey: ECPairInterface, finalityProvider: ECPairInterface, descriptorBuilder: BabylonDescriptorBuilder, stakingParams: vendor.VersionedStakingParams[], changeAddress: string, amount: number, utxo: vendor.UTXO, feeRateSatB: number, blockHeight: number): Promise<Result>;
|
|
12
|
+
export {};
|
|
13
|
+
//# sourceMappingURL=vendor.utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vendor.utils.d.ts","sourceRoot":"","sources":["../../../../../test/unit/babylon/vendor.utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,YAAY,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,KAAK,MAAM,MAAM,sCAAsC,CAAC;AAC/D,OAAO,KAAK,eAAe,MAAM,kCAAkC,CAAC;AAIpE,OAAO,EACL,wBAAwB,EAGxB,gBAAgB,EACjB,MAAM,sBAAsB,CAAC;AAI9B,KAAK,MAAM,GAAG;IACZ,qBAAqB,EAAE,gBAAgB,CAAC,eAAe,CAAC,YAAY,CAAC,sBAAsB,CAAC,CAAC;IAC7F,SAAS,EAAE,YAAY,CAAC,WAAW,CAAC;CACrC,CAAC;AAEF,wBAAsB,yCAAyC,CAC7D,OAAO,EAAE,YAAY,CAAC,OAAO,EAC7B,SAAS,EAAE,eAAe,EAC1B,gBAAgB,EAAE,eAAe,EACjC,iBAAiB,EAAE,wBAAwB,EAC3C,aAAa,EAAE,MAAM,CAAC,sBAAsB,EAAE,EAC9C,aAAa,EAAE,MAAM,EACrB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,CAAC,IAAI,EACjB,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,MAAM,CAAC,CAoBjB;AAED,wBAAsB,+BAA+B,CACnD,OAAO,EAAE,YAAY,CAAC,OAAO,EAC7B,SAAS,EAAE,eAAe,EAC1B,gBAAgB,EAAE,eAAe,EACjC,iBAAiB,EAAE,wBAAwB,EAC3C,aAAa,EAAE,MAAM,CAAC,sBAAsB,EAAE,EAC9C,aAAa,EAAE,MAAM,EACrB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,CAAC,IAAI,EACjB,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,MAAM,CAAC,CAuCjB"}
|
|
@@ -0,0 +1,78 @@
|
|
|
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
|
+
exports.getBitGoUtxoStakingMsgCreateBtcDelegation = getBitGoUtxoStakingMsgCreateBtcDelegation;
|
|
37
|
+
exports.getVendorMsgCreateBtcDelegation = getVendorMsgCreateBtcDelegation;
|
|
38
|
+
const vendor = __importStar(require("@bitgo/babylonlabs-io-btc-staking-ts"));
|
|
39
|
+
const babylonProtobuf = __importStar(require("@babylonlabs-io/babylon-proto-ts"));
|
|
40
|
+
const address_1 = require("bitcoinjs-lib/src/address");
|
|
41
|
+
const babylonlabs_io_btc_staking_ts_1 = require("@bitgo/babylonlabs-io-btc-staking-ts");
|
|
42
|
+
const babylon_1 = require("../../../src/babylon");
|
|
43
|
+
const key_utils_1 = require("./key.utils");
|
|
44
|
+
async function getBitGoUtxoStakingMsgCreateBtcDelegation(network, stakerKey, finalityProvider, descriptorBuilder, stakingParams, changeAddress, amount, utxo, feeRateSatB, blockHeight) {
|
|
45
|
+
return await (0, babylon_1.createUnsignedPreStakeRegistrationBabylonTransactionWithBtcProvider)((0, babylon_1.getBtcProviderForECKey)(descriptorBuilder, stakerKey), network, {
|
|
46
|
+
address: changeAddress,
|
|
47
|
+
publicKeyNoCoordHex: (0, key_utils_1.getXOnlyPubkey)(stakerKey).toString('hex'),
|
|
48
|
+
}, {
|
|
49
|
+
finalityProviderPksNoCoordHex: [(0, key_utils_1.getXOnlyPubkey)(finalityProvider).toString('hex')],
|
|
50
|
+
stakingAmountSat: amount,
|
|
51
|
+
stakingTimelock: (0, babylonlabs_io_btc_staking_ts_1.getBabylonParamByBtcHeight)(blockHeight, stakingParams).minStakingTimeBlocks,
|
|
52
|
+
}, 800000, [utxo], feeRateSatB, (0, address_1.toBech32)(Buffer.from('test'), 0, 'bbn'), 'delegation:create', stakingParams);
|
|
53
|
+
}
|
|
54
|
+
async function getVendorMsgCreateBtcDelegation(network, stakerKey, finalityProvider, descriptorBuilder, stakingParams, changeAddress, amount, utxo, feeRateSatB, blockHeight) {
|
|
55
|
+
const babylonProvider = {
|
|
56
|
+
async signTransaction(msg) {
|
|
57
|
+
// return unsigned payload
|
|
58
|
+
return babylonProtobuf.btcstakingtx.MsgCreateBTCDelegation.encode(msg.value).finish();
|
|
59
|
+
},
|
|
60
|
+
};
|
|
61
|
+
const manager = new vendor.BabylonBtcStakingManager(network, stakingParams, (0, babylon_1.getBtcProviderForECKey)(descriptorBuilder, stakerKey), babylonProvider);
|
|
62
|
+
const result = await manager.preStakeRegistrationBabylonTransaction({
|
|
63
|
+
address: changeAddress,
|
|
64
|
+
publicKeyNoCoordHex: (0, key_utils_1.getXOnlyPubkey)(stakerKey).toString('hex'),
|
|
65
|
+
}, {
|
|
66
|
+
finalityProviderPksNoCoordHex: [(0, key_utils_1.getXOnlyPubkey)(finalityProvider).toString('hex')],
|
|
67
|
+
stakingAmountSat: amount,
|
|
68
|
+
stakingTimelock: (0, babylonlabs_io_btc_staking_ts_1.getBabylonParamByBtcHeight)(blockHeight, stakingParams).minStakingTimeBlocks,
|
|
69
|
+
}, blockHeight, [utxo], feeRateSatB, (0, address_1.toBech32)(Buffer.from('test'), 0, 'bbn'));
|
|
70
|
+
return {
|
|
71
|
+
unsignedDelegationMsg: {
|
|
72
|
+
typeUrl: '/babylon.btcstaking.v1.MsgCreateBTCDelegation',
|
|
73
|
+
value: babylonProtobuf.btcstakingtx.MsgCreateBTCDelegation.decode(result.signedBabylonTx),
|
|
74
|
+
},
|
|
75
|
+
stakingTx: result.stakingTx,
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVuZG9yLnV0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGVzdC91bml0L2JhYnlsb24vdmVuZG9yLnV0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBcUJBLDhGQStCQztBQUVELDBFQWtEQztBQXRHRCw2RUFBK0Q7QUFDL0Qsa0ZBQW9FO0FBQ3BFLHVEQUFxRDtBQUNyRCx3RkFBa0Y7QUFFbEYsa0RBSzhCO0FBRTlCLDJDQUE2QztBQU90QyxLQUFLLFVBQVUseUNBQXlDLENBQzdELE9BQTZCLEVBQzdCLFNBQTBCLEVBQzFCLGdCQUFpQyxFQUNqQyxpQkFBMkMsRUFDM0MsYUFBOEMsRUFDOUMsYUFBcUIsRUFDckIsTUFBYyxFQUNkLElBQWlCLEVBQ2pCLFdBQW1CLEVBQ25CLFdBQW1CO0lBRW5CLE9BQU8sTUFBTSxJQUFBLDZFQUFtRSxFQUM5RSxJQUFBLGdDQUFzQixFQUFDLGlCQUFpQixFQUFFLFNBQVMsQ0FBQyxFQUNwRCxPQUFPLEVBQ1A7UUFDRSxPQUFPLEVBQUUsYUFBYTtRQUN0QixtQkFBbUIsRUFBRSxJQUFBLDBCQUFjLEVBQUMsU0FBUyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztLQUMvRCxFQUNEO1FBQ0UsNkJBQTZCLEVBQUUsQ0FBQyxJQUFBLDBCQUFjLEVBQUMsZ0JBQWdCLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDakYsZ0JBQWdCLEVBQUUsTUFBTTtRQUN4QixlQUFlLEVBQUUsSUFBQSwwREFBMEIsRUFBQyxXQUFXLEVBQUUsYUFBYSxDQUFDLENBQUMsb0JBQW9CO0tBQzdGLEVBQ0QsTUFBTyxFQUNQLENBQUMsSUFBSSxDQUFDLEVBQ04sV0FBVyxFQUNYLElBQUEsa0JBQVEsRUFBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsRUFBRSxLQUFLLENBQUMsRUFDdkMsbUJBQW1CLEVBQ25CLGFBQWEsQ0FDZCxDQUFDO0FBQ0osQ0FBQztBQUVNLEtBQUssVUFBVSwrQkFBK0IsQ0FDbkQsT0FBNkIsRUFDN0IsU0FBMEIsRUFDMUIsZ0JBQWlDLEVBQ2pDLGlCQUEyQyxFQUMzQyxhQUE4QyxFQUM5QyxhQUFxQixFQUNyQixNQUFjLEVBQ2QsSUFBaUIsRUFDakIsV0FBbUIsRUFDbkIsV0FBbUI7SUFFbkIsTUFBTSxlQUFlLEdBQTJCO1FBQzlDLEtBQUssQ0FBQyxlQUFlLENBQUMsR0FBRztZQUN2QiwwQkFBMEI7WUFDMUIsT0FBTyxlQUFlLENBQUMsWUFBWSxDQUFDLHNCQUFzQixDQUFDLE1BQU0sQ0FDL0QsR0FBRyxDQUFDLEtBQTRELENBQ2pFLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDYixDQUFDO0tBQ0YsQ0FBQztJQUNGLE1BQU0sT0FBTyxHQUFHLElBQUksTUFBTSxDQUFDLHdCQUF3QixDQUNqRCxPQUFPLEVBQ1AsYUFBYSxFQUNiLElBQUEsZ0NBQXNCLEVBQUMsaUJBQWlCLEVBQUUsU0FBUyxDQUFDLEVBQ3BELGVBQWUsQ0FDaEIsQ0FBQztJQUVGLE1BQU0sTUFBTSxHQUFHLE1BQU0sT0FBTyxDQUFDLHNDQUFzQyxDQUNqRTtRQUNFLE9BQU8sRUFBRSxhQUFhO1FBQ3RCLG1CQUFtQixFQUFFLElBQUEsMEJBQWMsRUFBQyxTQUFTLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO0tBQy9ELEVBQ0Q7UUFDRSw2QkFBNkIsRUFBRSxDQUFDLElBQUEsMEJBQWMsRUFBQyxnQkFBZ0IsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNqRixnQkFBZ0IsRUFBRSxNQUFNO1FBQ3hCLGVBQWUsRUFBRSxJQUFBLDBEQUEwQixFQUFDLFdBQVcsRUFBRSxhQUFhLENBQUMsQ0FBQyxvQkFBb0I7S0FDN0YsRUFDRCxXQUFXLEVBQ1gsQ0FBQyxJQUFJLENBQUMsRUFDTixXQUFXLEVBQ1gsSUFBQSxrQkFBUSxFQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUN4QyxDQUFDO0lBRUYsT0FBTztRQUNMLHFCQUFxQixFQUFFO1lBQ3JCLE9BQU8sRUFBRSwrQ0FBK0M7WUFDeEQsS0FBSyxFQUFFLGVBQWUsQ0FBQyxZQUFZLENBQUMsc0JBQXNCLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxlQUFlLENBQUM7U0FDMUY7UUFDRCxTQUFTLEVBQUUsTUFBTSxDQUFDLFNBQVM7S0FDNUIsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBiaXRjb2luanNsaWIgZnJvbSAnYml0Y29pbmpzLWxpYic7XG5pbXBvcnQgeyBFQ1BhaXJJbnRlcmZhY2UgfSBmcm9tICdAYml0Z28vdXR4by1saWInO1xuaW1wb3J0ICogYXMgdmVuZG9yIGZyb20gJ0BiaXRnby9iYWJ5bG9ubGFicy1pby1idGMtc3Rha2luZy10cyc7XG5pbXBvcnQgKiBhcyBiYWJ5bG9uUHJvdG9idWYgZnJvbSAnQGJhYnlsb25sYWJzLWlvL2JhYnlsb24tcHJvdG8tdHMnO1xuaW1wb3J0IHsgdG9CZWNoMzIgfSBmcm9tICdiaXRjb2luanMtbGliL3NyYy9hZGRyZXNzJztcbmltcG9ydCB7IGdldEJhYnlsb25QYXJhbUJ5QnRjSGVpZ2h0IH0gZnJvbSAnQGJpdGdvL2JhYnlsb25sYWJzLWlvLWJ0Yy1zdGFraW5nLXRzJztcblxuaW1wb3J0IHtcbiAgQmFieWxvbkRlc2NyaXB0b3JCdWlsZGVyLFxuICBjcmVhdGVVbnNpZ25lZFByZVN0YWtlUmVnaXN0cmF0aW9uQmFieWxvblRyYW5zYWN0aW9uV2l0aEJ0Y1Byb3ZpZGVyLFxuICBnZXRCdGNQcm92aWRlckZvckVDS2V5LFxuICBWYWx1ZVdpdGhUeXBlVXJsLFxufSBmcm9tICcuLi8uLi8uLi9zcmMvYmFieWxvbic7XG5cbmltcG9ydCB7IGdldFhPbmx5UHVia2V5IH0gZnJvbSAnLi9rZXkudXRpbHMnO1xuXG50eXBlIFJlc3VsdCA9IHtcbiAgdW5zaWduZWREZWxlZ2F0aW9uTXNnOiBWYWx1ZVdpdGhUeXBlVXJsPGJhYnlsb25Qcm90b2J1Zi5idGNzdGFraW5ndHguTXNnQ3JlYXRlQlRDRGVsZWdhdGlvbj47XG4gIHN0YWtpbmdUeDogYml0Y29pbmpzbGliLlRyYW5zYWN0aW9uO1xufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldEJpdEdvVXR4b1N0YWtpbmdNc2dDcmVhdGVCdGNEZWxlZ2F0aW9uKFxuICBuZXR3b3JrOiBiaXRjb2luanNsaWIuTmV0d29yayxcbiAgc3Rha2VyS2V5OiBFQ1BhaXJJbnRlcmZhY2UsXG4gIGZpbmFsaXR5UHJvdmlkZXI6IEVDUGFpckludGVyZmFjZSxcbiAgZGVzY3JpcHRvckJ1aWxkZXI6IEJhYnlsb25EZXNjcmlwdG9yQnVpbGRlcixcbiAgc3Rha2luZ1BhcmFtczogdmVuZG9yLlZlcnNpb25lZFN0YWtpbmdQYXJhbXNbXSxcbiAgY2hhbmdlQWRkcmVzczogc3RyaW5nLFxuICBhbW91bnQ6IG51bWJlcixcbiAgdXR4bzogdmVuZG9yLlVUWE8sXG4gIGZlZVJhdGVTYXRCOiBudW1iZXIsXG4gIGJsb2NrSGVpZ2h0OiBudW1iZXJcbik6IFByb21pc2U8UmVzdWx0PiB7XG4gIHJldHVybiBhd2FpdCBjcmVhdGVVbnNpZ25lZFByZVN0YWtlUmVnaXN0cmF0aW9uQmFieWxvblRyYW5zYWN0aW9uV2l0aEJ0Y1Byb3ZpZGVyKFxuICAgIGdldEJ0Y1Byb3ZpZGVyRm9yRUNLZXkoZGVzY3JpcHRvckJ1aWxkZXIsIHN0YWtlcktleSksXG4gICAgbmV0d29yayxcbiAgICB7XG4gICAgICBhZGRyZXNzOiBjaGFuZ2VBZGRyZXNzLFxuICAgICAgcHVibGljS2V5Tm9Db29yZEhleDogZ2V0WE9ubHlQdWJrZXkoc3Rha2VyS2V5KS50b1N0cmluZygnaGV4JyksXG4gICAgfSxcbiAgICB7XG4gICAgICBmaW5hbGl0eVByb3ZpZGVyUGtzTm9Db29yZEhleDogW2dldFhPbmx5UHVia2V5KGZpbmFsaXR5UHJvdmlkZXIpLnRvU3RyaW5nKCdoZXgnKV0sXG4gICAgICBzdGFraW5nQW1vdW50U2F0OiBhbW91bnQsXG4gICAgICBzdGFraW5nVGltZWxvY2s6IGdldEJhYnlsb25QYXJhbUJ5QnRjSGVpZ2h0KGJsb2NrSGVpZ2h0LCBzdGFraW5nUGFyYW1zKS5taW5TdGFraW5nVGltZUJsb2NrcyxcbiAgICB9LFxuICAgIDgwMF8wMDAsXG4gICAgW3V0eG9dLFxuICAgIGZlZVJhdGVTYXRCLFxuICAgIHRvQmVjaDMyKEJ1ZmZlci5mcm9tKCd0ZXN0JyksIDAsICdiYm4nKSxcbiAgICAnZGVsZWdhdGlvbjpjcmVhdGUnLFxuICAgIHN0YWtpbmdQYXJhbXNcbiAgKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFZlbmRvck1zZ0NyZWF0ZUJ0Y0RlbGVnYXRpb24oXG4gIG5ldHdvcms6IGJpdGNvaW5qc2xpYi5OZXR3b3JrLFxuICBzdGFrZXJLZXk6IEVDUGFpckludGVyZmFjZSxcbiAgZmluYWxpdHlQcm92aWRlcjogRUNQYWlySW50ZXJmYWNlLFxuICBkZXNjcmlwdG9yQnVpbGRlcjogQmFieWxvbkRlc2NyaXB0b3JCdWlsZGVyLFxuICBzdGFraW5nUGFyYW1zOiB2ZW5kb3IuVmVyc2lvbmVkU3Rha2luZ1BhcmFtc1tdLFxuICBjaGFuZ2VBZGRyZXNzOiBzdHJpbmcsXG4gIGFtb3VudDogbnVtYmVyLFxuICB1dHhvOiB2ZW5kb3IuVVRYTyxcbiAgZmVlUmF0ZVNhdEI6IG51bWJlcixcbiAgYmxvY2tIZWlnaHQ6IG51bWJlclxuKTogUHJvbWlzZTxSZXN1bHQ+IHtcbiAgY29uc3QgYmFieWxvblByb3ZpZGVyOiB2ZW5kb3IuQmFieWxvblByb3ZpZGVyID0ge1xuICAgIGFzeW5jIHNpZ25UcmFuc2FjdGlvbihtc2cpIHtcbiAgICAgIC8vIHJldHVybiB1bnNpZ25lZCBwYXlsb2FkXG4gICAgICByZXR1cm4gYmFieWxvblByb3RvYnVmLmJ0Y3N0YWtpbmd0eC5Nc2dDcmVhdGVCVENEZWxlZ2F0aW9uLmVuY29kZShcbiAgICAgICAgbXNnLnZhbHVlIGFzIGJhYnlsb25Qcm90b2J1Zi5idGNzdGFraW5ndHguTXNnQ3JlYXRlQlRDRGVsZWdhdGlvblxuICAgICAgKS5maW5pc2goKTtcbiAgICB9LFxuICB9O1xuICBjb25zdCBtYW5hZ2VyID0gbmV3IHZlbmRvci5CYWJ5bG9uQnRjU3Rha2luZ01hbmFnZXIoXG4gICAgbmV0d29yayxcbiAgICBzdGFraW5nUGFyYW1zLFxuICAgIGdldEJ0Y1Byb3ZpZGVyRm9yRUNLZXkoZGVzY3JpcHRvckJ1aWxkZXIsIHN0YWtlcktleSksXG4gICAgYmFieWxvblByb3ZpZGVyXG4gICk7XG5cbiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgbWFuYWdlci5wcmVTdGFrZVJlZ2lzdHJhdGlvbkJhYnlsb25UcmFuc2FjdGlvbihcbiAgICB7XG4gICAgICBhZGRyZXNzOiBjaGFuZ2VBZGRyZXNzLFxuICAgICAgcHVibGljS2V5Tm9Db29yZEhleDogZ2V0WE9ubHlQdWJrZXkoc3Rha2VyS2V5KS50b1N0cmluZygnaGV4JyksXG4gICAgfSxcbiAgICB7XG4gICAgICBmaW5hbGl0eVByb3ZpZGVyUGtzTm9Db29yZEhleDogW2dldFhPbmx5UHVia2V5KGZpbmFsaXR5UHJvdmlkZXIpLnRvU3RyaW5nKCdoZXgnKV0sXG4gICAgICBzdGFraW5nQW1vdW50U2F0OiBhbW91bnQsXG4gICAgICBzdGFraW5nVGltZWxvY2s6IGdldEJhYnlsb25QYXJhbUJ5QnRjSGVpZ2h0KGJsb2NrSGVpZ2h0LCBzdGFraW5nUGFyYW1zKS5taW5TdGFraW5nVGltZUJsb2NrcyxcbiAgICB9LFxuICAgIGJsb2NrSGVpZ2h0LFxuICAgIFt1dHhvXSxcbiAgICBmZWVSYXRlU2F0QixcbiAgICB0b0JlY2gzMihCdWZmZXIuZnJvbSgndGVzdCcpLCAwLCAnYmJuJylcbiAgKTtcblxuICByZXR1cm4ge1xuICAgIHVuc2lnbmVkRGVsZWdhdGlvbk1zZzoge1xuICAgICAgdHlwZVVybDogJy9iYWJ5bG9uLmJ0Y3N0YWtpbmcudjEuTXNnQ3JlYXRlQlRDRGVsZWdhdGlvbicsXG4gICAgICB2YWx1ZTogYmFieWxvblByb3RvYnVmLmJ0Y3N0YWtpbmd0eC5Nc2dDcmVhdGVCVENEZWxlZ2F0aW9uLmRlY29kZShyZXN1bHQuc2lnbmVkQmFieWxvblR4KSxcbiAgICB9LFxuICAgIHN0YWtpbmdUeDogcmVzdWx0LnN0YWtpbmdUeCxcbiAgfTtcbn1cbiJdfQ==
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"descriptor.d.ts","sourceRoot":"","sources":["../../../../../test/unit/coreDao/descriptor.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,144 @@
|
|
|
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 utxolib = __importStar(require("@bitgo/utxo-lib"));
|
|
38
|
+
const wasm_utxo_1 = require("@bitgo/wasm-utxo");
|
|
39
|
+
const testutil_1 = require("@bitgo/utxo-core/testutil");
|
|
40
|
+
const coreDao_1 = require("../../../src/coreDao");
|
|
41
|
+
const utils_1 = require("./utils");
|
|
42
|
+
describe('descriptor', function () {
|
|
43
|
+
const baseFixturePath = 'test/fixtures/coreDao/descriptor/';
|
|
44
|
+
const rootWalletKeys = utxolib.testutil.getDefaultWalletKeys();
|
|
45
|
+
const key1 = rootWalletKeys.triple[0];
|
|
46
|
+
const key2 = rootWalletKeys.triple[1];
|
|
47
|
+
const key3 = rootWalletKeys.triple[2];
|
|
48
|
+
const validLocktime = 2048;
|
|
49
|
+
it('should fail if m is longer than the number of keys or not at least 1', function () {
|
|
50
|
+
assert.throws(() => {
|
|
51
|
+
(0, coreDao_1.createMultiSigDescriptor)('sh', validLocktime, 3, [key1, key2], false);
|
|
52
|
+
});
|
|
53
|
+
assert.throws(() => {
|
|
54
|
+
(0, coreDao_1.createMultiSigDescriptor)('sh', validLocktime, 0, [key1, key2], false);
|
|
55
|
+
});
|
|
56
|
+
});
|
|
57
|
+
it('should fail if locktime is invalid', function () {
|
|
58
|
+
assert.throws(() => {
|
|
59
|
+
(0, coreDao_1.createMultiSigDescriptor)('sh', 0, 2, [key1, key2], false);
|
|
60
|
+
});
|
|
61
|
+
});
|
|
62
|
+
async function runTestForParams(scriptType, m, keys) {
|
|
63
|
+
const fixturePath = baseFixturePath + `${scriptType}-${m}of${keys.length}`;
|
|
64
|
+
describe(`should create a ${m} of ${keys.length} multi-sig ${scriptType} descriptor`, function () {
|
|
65
|
+
it('has expected descriptor string', async function () {
|
|
66
|
+
const descriptorString = (0, coreDao_1.createMultiSigDescriptor)(scriptType, validLocktime, m, keys, false);
|
|
67
|
+
assert.strictEqual(descriptorString, await (0, testutil_1.getFixture)(fixturePath + `-string.txt`, descriptorString), descriptorString);
|
|
68
|
+
});
|
|
69
|
+
it('has expected AST', async function () {
|
|
70
|
+
const descriptor = wasm_utxo_1.Descriptor.fromString((0, coreDao_1.createMultiSigDescriptor)(scriptType, validLocktime, m, keys, false), 'derivable');
|
|
71
|
+
assert.deepStrictEqual(descriptor.node(), await (0, testutil_1.getFixture)(fixturePath + '-ast.json', descriptor.node()));
|
|
72
|
+
});
|
|
73
|
+
it('has expected asm', async function () {
|
|
74
|
+
const descriptor = wasm_utxo_1.Descriptor.fromString((0, coreDao_1.createMultiSigDescriptor)(scriptType, validLocktime, m, keys, false), 'derivable');
|
|
75
|
+
const asmString = descriptor.atDerivationIndex(0).toAsmString();
|
|
76
|
+
assert.strictEqual(asmString, await (0, testutil_1.getFixture)(fixturePath + '-asm.txt', asmString), asmString);
|
|
77
|
+
});
|
|
78
|
+
it('can be signed', async function () {
|
|
79
|
+
// Derive the script from the descriptor
|
|
80
|
+
const descriptor = wasm_utxo_1.Descriptor.fromString((0, coreDao_1.createMultiSigDescriptor)(scriptType, validLocktime, m, keys, false), 'derivable');
|
|
81
|
+
const descriptorAt0 = descriptor.atDerivationIndex(0);
|
|
82
|
+
const script = Buffer.from(descriptorAt0.scriptPubkey());
|
|
83
|
+
// Make the prevTx
|
|
84
|
+
const prevPsbt = utxolib.testutil.constructPsbt([{ scriptType: 'p2wsh', value: BigInt(1.1e8) }], [{ script: script.toString('hex'), value: BigInt(1e8) }], utxolib.networks.bitcoin, rootWalletKeys, 'fullsigned');
|
|
85
|
+
const prevTx = prevPsbt.finalizeAllInputs().extractTransaction();
|
|
86
|
+
// Create the PSBT and sign
|
|
87
|
+
const psbt = Object.assign(new utxolib.Psbt({ network: utxolib.networks.bitcoin }), {
|
|
88
|
+
locktime: validLocktime,
|
|
89
|
+
});
|
|
90
|
+
psbt.addInput({
|
|
91
|
+
hash: prevTx.getId(),
|
|
92
|
+
index: 0,
|
|
93
|
+
sequence: 0xfffffffe,
|
|
94
|
+
});
|
|
95
|
+
if (scriptType === 'sh-wsh') {
|
|
96
|
+
psbt.updateInput(0, { witnessUtxo: { script, value: BigInt(1e8) } });
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
psbt.updateInput(0, { nonWitnessUtxo: prevTx.toBuffer() });
|
|
100
|
+
}
|
|
101
|
+
psbt.addOutput({ script, value: BigInt(0.9e8) });
|
|
102
|
+
(0, utils_1.updateInputWithDescriptor)(psbt, 0, descriptorAt0);
|
|
103
|
+
keys.forEach((signer, i) => {
|
|
104
|
+
if (i >= m) {
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
psbt.signAllInputsHD(signer);
|
|
108
|
+
});
|
|
109
|
+
// Get the fully signed transaction and check
|
|
110
|
+
const signedTx = (0, utils_1.finalizePsbt)(psbt).extractTransaction().toBuffer();
|
|
111
|
+
assert.strictEqual(signedTx.toString('hex'), await (0, testutil_1.getFixture)(fixturePath + '-tx.txt', signedTx.toString('hex')));
|
|
112
|
+
});
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
runTestForParams('sh', 2, [key1, key2]);
|
|
116
|
+
runTestForParams('sh-wsh', 2, [key1, key2]);
|
|
117
|
+
runTestForParams('sh', 3, [key1, key2, key3]);
|
|
118
|
+
runTestForParams('wsh', 3, [key1, key2, key3]);
|
|
119
|
+
it('should recreate the script used in testnet staking transaction', function () {
|
|
120
|
+
// Source: https://mempool.space/testnet/address/2MxTi2EhHKgdJFKRTBttVGGxir9ZzjmKCXw
|
|
121
|
+
// 2 of 2 multisig
|
|
122
|
+
const timelock = 'fce4cb66';
|
|
123
|
+
const pubkey1 = '03ecb6d4b7f5d56962e547fc52dd588359f5729c0ba856d6978b84723895a16691';
|
|
124
|
+
const pubkey2 = '024aaea25d82b1db2be030a05b641d6302e48ed652b1ca9cb08a67267fcbb56747';
|
|
125
|
+
const redeemScriptASM = [
|
|
126
|
+
'OP_PUSHBYTES_4',
|
|
127
|
+
timelock,
|
|
128
|
+
'OP_CLTV',
|
|
129
|
+
'OP_DROP',
|
|
130
|
+
'OP_PUSHNUM_2',
|
|
131
|
+
'OP_PUSHBYTES_33',
|
|
132
|
+
pubkey1,
|
|
133
|
+
'OP_PUSHBYTES_33',
|
|
134
|
+
pubkey2,
|
|
135
|
+
'OP_PUSHNUM_2',
|
|
136
|
+
'OP_CHECKMULTISIG',
|
|
137
|
+
].join(' ');
|
|
138
|
+
const decodedTimelock = (0, coreDao_1.decodeTimelock)(Buffer.from(timelock, 'hex'));
|
|
139
|
+
const descriptor = (0, coreDao_1.createMultiSigDescriptor)('sh', decodedTimelock, 2, [Buffer.from(pubkey1, 'hex'), Buffer.from(pubkey2, 'hex')], false);
|
|
140
|
+
const descriptorASM = wasm_utxo_1.Descriptor.fromString(descriptor, 'definite').toAsmString();
|
|
141
|
+
assert.deepStrictEqual(redeemScriptASM, descriptorASM);
|
|
142
|
+
});
|
|
143
|
+
});
|
|
144
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVzY3JpcHRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Rlc3QvdW5pdC9jb3JlRGFvL2Rlc2NyaXB0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSwrQ0FBaUM7QUFFakMseURBQTJDO0FBQzNDLGdEQUE4QztBQUM5Qyx3REFBdUQ7QUFFdkQsa0RBQWdGO0FBRWhGLG1DQUFrRTtBQUVsRSxRQUFRLENBQUMsWUFBWSxFQUFFO0lBQ3JCLE1BQU0sZUFBZSxHQUFHLG1DQUFtQyxDQUFDO0lBQzVELE1BQU0sY0FBYyxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztJQUMvRCxNQUFNLElBQUksR0FBRyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3RDLE1BQU0sSUFBSSxHQUFHLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDdEMsTUFBTSxJQUFJLEdBQUcsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN0QyxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUM7SUFFM0IsRUFBRSxDQUFDLHNFQUFzRSxFQUFFO1FBQ3pFLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFO1lBQ2pCLElBQUEsa0NBQXdCLEVBQUMsSUFBSSxFQUFFLGFBQWEsRUFBRSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDeEUsQ0FBQyxDQUFDLENBQUM7UUFFSCxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRTtZQUNqQixJQUFBLGtDQUF3QixFQUFDLElBQUksRUFBRSxhQUFhLEVBQUUsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3hFLENBQUMsQ0FBQyxDQUFD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O1FBQ2xCLE1BQU0sUUFBUSxHQUFHLFVBQVUsQ0FBQztRQUM1QixNQUFNLE9BQU8sR0FBRyxvRUFBb0UsQ0FBQztRQUNyRixNQUFNLE9BQU8sR0FBRyxvRUFBb0UsQ0FBQztRQUNyRixNQUFNLGVBQWUsR0FBRztZQUN0QixnQkFBZ0I7WUFDaEIsUUFBUTtZQUNSLFNBQVM7WUFDVCxTQUFTO1lBQ1QsY0FBYztZQUNkLGlCQUFpQjtZQUNqQixPQUFPO1lBQ1AsaUJBQWlCO1lBQ2pCLE9BQU87WUFDUCxjQUFjO1lBQ2Qsa0JBQWtCO1NBQ25CLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBRVosTUFBTSxlQUFlLEdBQUcsSUFBQSx3QkFBYyxFQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDckUsTUFBTSxVQUFVLEdBQUcsSUFBQSxrQ0FBd0IsRUFDekMsSUFBSSxFQUNKLGVBQWUsRUFDZixDQUFDLEVBQ0QsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQyxFQUMxRCxLQUFLLENBQ04sQ0FBQztRQUNGLE1BQU0sYUFBYSxHQUFHLHNCQUFVLENBQUMsVUFBVSxDQUFDLFVBQVUsRUFBRSxVQUFVLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNsRixNQUFNLENBQUMsZUFBZSxDQUFDLGVBQWUsRUFBRSxhQUFhLENBQUMsQ0FBQztJQUN6RCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5cbmltcG9ydCAqIGFzIHV0eG9saWIgZnJvbSAnQGJpdGdvL3V0eG8tbGliJztcbmltcG9ydCB7IERlc2NyaXB0b3IgfSBmcm9tICdAYml0Z28vd2FzbS11dHhvJztcbmltcG9ydCB7IGdldEZpeHR1cmUgfSBmcm9tICdAYml0Z28vdXR4by1jb3JlL3Rlc3R1dGlsJztcblxuaW1wb3J0IHsgY3JlYXRlTXVsdGlTaWdEZXNjcmlwdG9yLCBkZWNvZGVUaW1lbG9jayB9IGZyb20gJy4uLy4uLy4uL3NyYy9jb3JlRGFvJztcblxuaW1wb3J0IHsgZmluYWxpemVQc2J0LCB1cGRhdGVJbnB1dFdpdGhEZXNjcmlwdG9yIH0gZnJvbSAnLi91dGlscyc7XG5cbmRlc2NyaWJlKCdkZXNjcmlwdG9yJywgZnVuY3Rpb24gKCkge1xuICBjb25zdCBiYXNlRml4dHVyZVBhdGggPSAndGVzdC9maXh0dXJlcy9jb3JlRGFvL2Rlc2NyaXB0b3IvJztcbiAgY29uc3Qgcm9vdFdhbGxldEtleXMgPSB1dHhvbGliLnRlc3R1dGlsLmdldERlZmF1bHRXYWxsZXRLZXlzKCk7XG4gIGNvbnN0IGtleTEgPSByb290V2FsbGV0S2V5cy50cmlwbGVbMF07XG4gIGNvbnN0IGtleTIgPSByb290V2FsbGV0S2V5cy50cmlwbGVbMV07XG4gIGNvbnN0IGtleTMgPSByb290V2FsbGV0S2V5cy50cmlwbGVbMl07XG4gIGNvbnN0IHZhbGlkTG9ja3RpbWUgPSAyMDQ4O1xuXG4gIGl0KCdzaG91bGQgZmFpbCBpZiBtIGlzIGxvbmdlciB0aGFuIHRoZSBudW1iZXIgb2Yga2V5cyBvciBub3QgYXQgbGVhc3QgMScsIGZ1bmN0aW9uICgpIHtcbiAgICBhc3NlcnQudGhyb3dzKCgpID0+IHtcbiAgICAgIGNyZWF0ZU11bHRpU2lnRGVzY3JpcHRvcignc2gnLCB2YWxpZExvY2t0aW1lLCAzLCBba2V5MSwga2V5Ml0sIGZhbHNlKTtcbiAgICB9KTtcblxuICAgIGFzc2VydC50aHJvd3MoKCkgPT4ge1xuICAgICAgY3JlYXRlTXVsdGlTaWdEZXNjcmlwdG9yKCdzaCcsIHZhbGlkTG9ja3RpbWUsIDAsIFtrZXkxLCBrZXkyXSwgZmFsc2UpO1xuICAgIH0pO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGZhaWwgaWYgbG9ja3RpbWUgaXMgaW52YWxpZCcsIGZ1bmN0aW9uICgpIHtcbiAgICBhc3NlcnQudGhyb3dzKCgpID0+IHtcbiAgICAgIGNyZWF0ZU11bHRpU2lnRGVzY3JpcHRvcignc2gnLCAwLCAyLCBba2V5MSwga2V5Ml0sIGZhbHNlKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgYXN5bmMgZnVuY3Rpb24gcnVuVGVzdEZvclBhcmFtcyhzY3JpcHRUeXBlOiAnc2gnIHwgJ3NoLXdzaCcgfCAnd3NoJywgbTogbnVtYmVyLCBrZXlzOiB1dHhvbGliLkJJUDMySW50ZXJmYWNlW10pIHtcbiAgICBjb25zdCBmaXh0dXJlUGF0aCA9IGJhc2VGaXh0dXJlUGF0aCArIGAke3NjcmlwdFR5cGV9LSR7bX1vZiR7a2V5cy5sZW5ndGh9YDtcbiAgICBkZXNjcmliZShgc2hvdWxkIGNyZWF0ZSBhICR7bX0gb2YgJHtrZXlzLmxlbmd0aH0gbXVsdGktc2lnICR7c2NyaXB0VHlwZX0gZGVzY3JpcHRvcmAsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGl0KCdoYXMgZXhwZWN0ZWQgZGVzY3JpcHRvciBzdHJpbmcnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IGRlc2NyaXB0b3JTdHJpbmcgPSBjcmVhdGVNdWx0aVNpZ0Rlc2NyaXB0b3Ioc2NyaXB0VHlwZSwgdmFsaWRMb2NrdGltZSwgbSwga2V5cywgZmFsc2UpO1xuICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoXG4gICAgICAgICAgZGVzY3JpcHRvclN0cmluZyxcbiAgICAgICAgICBhd2FpdCBnZXRGaXh0dXJlKGZpeHR1cmVQYXRoICsgYC1zdHJpbmcudHh0YCwgZGVzY3JpcHRvclN0cmluZyksXG4gICAgICAgICAgZGVzY3JpcHRvclN0cmluZ1xuICAgICAgICApO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdoYXMgZXhwZWN0ZWQgQVNUJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBkZXNjcmlwdG9yID0gRGVzY3JpcHRvci5mcm9tU3RyaW5nKFxuICAgICAgICAgIGNyZWF0ZU11bHRpU2lnRGVzY3JpcHRvcihzY3JpcHRUeXBlLCB2YWxpZExvY2t0aW1lLCBtLCBrZXlzLCBmYWxzZSksXG4gICAgICAgICAgJ2Rlcml2YWJsZSdcbiAgICAgICAgKTtcblxuICAgICAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKGRlc2NyaXB0b3Iubm9kZSgpLCBhd2FpdCBnZXRGaXh0dXJlKGZpeHR1cmVQYXRoICsgJy1hc3QuanNvbicsIGRlc2NyaXB0b3Iubm9kZSgpKSk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ2hhcyBleHBlY3RlZCBhc20nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IGRlc2NyaXB0b3IgPSBEZXNjcmlwdG9yLmZyb21TdHJpbmcoXG4gICAgICAgICAgY3JlYXRlTXVsdGlTaWdEZXNjcmlwdG9yKHNjcmlwdFR5cGUsIHZhbGlkTG9ja3RpbWUsIG0sIGtleXMsIGZhbHNlKSxcbiAgICAgICAgICAnZGVyaXZhYmxlJ1xuICAgICAgICApO1xuICAgICAgICBjb25zdCBhc21TdHJpbmcgPSBkZXNjcmlwdG9yLmF0RGVyaXZhdGlvbkluZGV4KDApLnRvQXNtU3RyaW5nKCk7XG4gICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChhc21TdHJpbmcsIGF3YWl0IGdldEZpeHR1cmUoZml4dHVyZVBhdGggKyAnLWFzbS50eHQnLCBhc21TdHJpbmcpLCBhc21TdHJpbmcpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdjYW4gYmUgc2lnbmVkJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICAvLyBEZXJpdmUgdGhlIHNjcmlwdCBmcm9tIHRoZSBkZXNjcmlwdG9yXG4gICAgICAgIGNvbnN0IGRlc2NyaXB0b3IgPSBEZXNjcmlwdG9yLmZyb21TdHJpbmcoXG4gICAgICAgICAgY3JlYXRlTXVsdGlTaWdEZXNjcmlwdG9yKHNjcmlwdFR5cGUsIHZhbGlkTG9ja3RpbWUsIG0sIGtleXMsIGZhbHNlKSxcbiAgICAgICAgICAnZGVyaXZhYmxlJ1xuICAgICAgICApO1xuICAgICAgICBjb25zdCBkZXNjcmlwdG9yQXQwID0gZGVzY3JpcHRvci5hdERlcml2YXRpb25JbmRleCgwKTtcbiAgICAgICAgY29uc3Qgc2NyaXB0ID0gQnVmZmVyLmZyb20oZGVzY3JpcHRvckF0MC5zY3JpcHRQdWJrZXkoKSk7XG5cbiAgICAgICAgLy8gTWFrZSB0aGUgcHJldlR4XG4gICAgICAgIGNvbnN0IHByZXZQc2J0ID0gdXR4b2xpYi50ZXN0dXRpbC5jb25zdHJ1Y3RQc2J0KFxuICAgICAgICAgIFt7IHNjcmlwdFR5cGU6ICdwMndzaCcsIHZhbHVlOiBCaWdJbnQoMS4xZTgpIH1dLFxuICAgICAgICAgIFt7IHNjcmlwdDogc2NyaXB0LnRvU3RyaW5nKCdoZXgnKSwgdmFsdWU6IEJpZ0ludCgxZTgpIH1dLFxuICAgICAgICAgIHV0eG9saWIubmV0d29ya3MuYml0Y29pbixcbiAgICAgICAgICByb290V2FsbGV0S2V5cyxcbiAgICAgICAgICAnZnVsbHNpZ25lZCdcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgcHJldlR4ID0gcHJldlBzYnQuZmluYWxpemVBbGxJbnB1dHMoKS5leHRyYWN0VHJhbnNhY3Rpb24oKTtcblxuICAgICAgICAvLyBDcmVhdGUgdGhlIFBTQlQgYW5kIHNpZ25cbiAgICAgICAgY29uc3QgcHNidCA9IE9iamVjdC5hc3NpZ24obmV3IHV0eG9saWIuUHNidCh7IG5ldHdvcms6IHV0eG9saWIubmV0d29ya3MuYml0Y29pbiB9KSwge1xuICAgICAgICAgIGxvY2t0aW1lOiB2YWxpZExvY2t0aW1lLFxuICAgICAgICB9KTtcbiAgICAgICAgcHNidC5hZGRJbnB1dCh7XG4gICAgICAgICAgaGFzaDogcHJldlR4LmdldElkKCksXG4gICAgICAgICAgaW5kZXg6IDAsXG4gICAgICAgICAgc2VxdWVuY2U6IDB4ZmZmZmZmZmUsXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoc2NyaXB0VHlwZSA9PT0gJ3NoLXdzaCcpIHtcbiAgICAgICAgICBwc2J0LnVwZGF0ZUlucHV0KDAsIHsgd2l0bmVzc1V0eG86IHsgc2NyaXB0LCB2YWx1ZTogQmlnSW50KDFlOCkgfSB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwc2J0LnVwZGF0ZUlucHV0KDAsIHsgbm9uV2l0bmVzc1V0eG86IHByZXZUeC50b0J1ZmZlcigpIH0pO1xuICAgICAgICB9XG4gICAgICAgIHBzYnQuYWRkT3V0cHV0KHsgc2NyaXB0LCB2YWx1ZTogQmlnSW50KDAuOWU4KSB9KTtcbiAgICAgICAgdXBkYXRlSW5wdXRXaXRoRGVzY3JpcHRvcihwc2J0LCAwLCBkZXNjcmlwdG9yQXQwKTtcbiAgICAgICAga2V5cy5mb3JFYWNoKChzaWduZXIsIGkpID0+IHtcbiAgICAgICAgICBpZiAoaSA+PSBtKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIHBzYnQuc2lnbkFsbElucHV0c0hEKHNpZ25lcik7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIEdldCB0aGUgZnVsbHkgc2lnbmVkIHRyYW5zYWN0aW9uIGFuZCBjaGVja1xuICAgICAgICBjb25zdCBzaWduZWRUeCA9IGZpbmFsaXplUHNidChwc2J0KS5leHRyYWN0VHJhbnNhY3Rpb24oKS50b0J1ZmZlcigpO1xuICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoXG4gICAgICAgICAgc2lnbmVkVHgudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICAgIGF3YWl0IGdldEZpeHR1cmUoZml4dHVyZVBhdGggKyAnLXR4LnR4dCcsIHNpZ25lZFR4LnRvU3RyaW5nKCdoZXgnKSlcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcnVuVGVzdEZvclBhcmFtcygnc2gnLCAyLCBba2V5MSwga2V5Ml0pO1xuICBydW5UZXN0Rm9yUGFyYW1zKCdzaC13c2gnLCAyLCBba2V5MSwga2V5Ml0pO1xuICBydW5UZXN0Rm9yUGFyYW1zKCdzaCcsIDMsIFtrZXkxLCBrZXkyLCBrZXkzXSk7XG4gIHJ1blRlc3RGb3JQYXJhbXMoJ3dzaCcsIDMsIFtrZXkxLCBrZXkyLCBrZXkzXSk7XG5cbiAgaXQoJ3Nob3VsZCByZWNyZWF0ZSB0aGUgc2NyaXB0IHVzZWQgaW4gdGVzdG5ldCBzdGFraW5nIHRyYW5zYWN0aW9uJywgZnVuY3Rpb24gKCkge1xuICAgIC8vIFNvdXJjZTogaHR0cHM6Ly9tZW1wb29sLnNwYWNlL3Rlc3RuZXQvYWRkcmVzcy8yTXhUaTJFaEhLZ2RKRktSVEJ0dFZHR3hpcjlaemptS0NYd1xuICAgIC8vIDIgb2YgMiBtdWx0aXNpZ1xuICAgIGNvbnN0IHRpbWVsb2NrID0gJ2ZjZTRjYjY2JztcbiAgICBjb25zdCBwdWJrZXkxID0gJzAzZWNiNmQ0YjdmNWQ1Njk2MmU1NDdmYzUyZGQ1ODgzNTlmNTcyOWMwYmE4NTZkNjk3OGI4NDcyMzg5NWExNjY5MSc7XG4gICAgY29uc3QgcHVia2V5MiA9ICcwMjRhYWVhMjVkODJiMWRiMmJlMDMwYTA1YjY0MWQ2MzAyZTQ4ZWQ2NTJiMWNhOWNiMDhhNjcyNjdmY2JiNTY3NDcnO1xuICAgIGNvbnN0IHJlZGVlbVNjcmlwdEFTTSA9IFtcbiAgICAgICdPUF9QVVNIQllURVNfNCcsXG4gICAgICB0aW1lbG9jayxcbiAgICAgICdPUF9DTFRWJyxcbiAgICAgICdPUF9EUk9QJyxcbiAgICAgICdPUF9QVVNITlVNXzInLFxuICAgICAgJ09QX1BVU0hCWVRFU18zMycsXG4gICAgICBwdWJrZXkxLFxuICAgICAgJ09QX1BVU0hCWVRFU18zMycsXG4gICAgICBwdWJrZXkyLFxuICAgICAgJ09QX1BVU0hOVU1fMicsXG4gICAgICAnT1BfQ0hFQ0tNVUxUSVNJRycsXG4gICAgXS5qb2luKCcgJyk7XG5cbiAgICBjb25zdCBkZWNvZGVkVGltZWxvY2sgPSBkZWNvZGVUaW1lbG9jayhCdWZmZXIuZnJvbSh0aW1lbG9jaywgJ2hleCcpKTtcbiAgICBjb25zdCBkZXNjcmlwdG9yID0gY3JlYXRlTXVsdGlTaWdEZXNjcmlwdG9yKFxuICAgICAgJ3NoJyxcbiAgICAgIGRlY29kZWRUaW1lbG9jayxcbiAgICAgIDIsXG4gICAgICBbQnVmZmVyLmZyb20ocHVia2V5MSwgJ2hleCcpLCBCdWZmZXIuZnJvbShwdWJrZXkyLCAnaGV4JyldLFxuICAgICAgZmFsc2VcbiAgICApO1xuICAgIGNvbnN0IGRlc2NyaXB0b3JBU00gPSBEZXNjcmlwdG9yLmZyb21TdHJpbmcoZGVzY3JpcHRvciwgJ2RlZmluaXRlJykudG9Bc21TdHJpbmcoKTtcbiAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKHJlZGVlbVNjcmlwdEFTTSwgZGVzY3JpcHRvckFTTSk7XG4gIH0pO1xufSk7XG4iXX0=
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"opReturn.d.ts","sourceRoot":"","sources":["../../../../../test/unit/coreDao/opReturn.ts"],"names":[],"mappings":""}
|