@bitgo-beta/utxo-staking 1.1.1-beta.91 → 1.1.1-beta.910
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 +38 -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 +48 -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 +8 -0
- package/dist/cjs/src/babylon/index.d.ts.map +1 -0
- package/dist/cjs/src/babylon/index.js +51 -0
- package/dist/cjs/src/babylon/network.d.ts +7 -0
- package/dist/cjs/src/babylon/network.d.ts.map +1 -0
- package/dist/cjs/src/babylon/network.js +66 -0
- package/dist/cjs/src/babylon/params.mainnet.json +152 -0
- package/dist/cjs/src/babylon/params.testnet.json +212 -0
- package/dist/cjs/src/babylon/parseDescriptor.d.ts +26 -0
- 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 +6 -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 +40 -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 +24 -0
- package/dist/cjs/src/babylon/undelegation/UndelegationResponse.d.ts.map +1 -0
- package/dist/cjs/src/babylon/undelegation/UndelegationResponse.js +55 -0
- package/dist/cjs/src/babylon/undelegation/index.d.ts +3 -0
- package/dist/cjs/src/babylon/undelegation/index.d.ts.map +1 -0
- package/dist/{src → cjs/src/babylon/undelegation}/index.js +3 -4
- package/dist/cjs/src/babylon/undelegation/unbonding.d.ts +16 -0
- 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/{src → cjs/src}/coreDao/transaction.d.ts +16 -7
- 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 +3 -0
- package/dist/cjs/src/index.d.ts.map +1 -0
- package/dist/cjs/src/index.js +39 -0
- 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.d.ts.map +1 -0
- package/dist/esm/babylon/delegationMessage.js +239 -0
- package/dist/esm/babylon/descriptor.d.ts +48 -0
- package/dist/esm/babylon/descriptor.d.ts.map +1 -0
- package/dist/esm/babylon/descriptor.js +91 -0
- package/dist/esm/babylon/index.d.ts +8 -0
- package/dist/esm/babylon/index.d.ts.map +1 -0
- package/dist/esm/babylon/index.js +13 -0
- package/dist/esm/babylon/network.d.ts +7 -0
- package/dist/esm/babylon/network.d.ts.map +1 -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.d.ts.map +1 -0
- package/dist/esm/babylon/parseDescriptor.js +155 -0
- package/dist/esm/babylon/stakingManager.d.ts +6 -0
- package/dist/esm/babylon/stakingManager.d.ts.map +1 -0
- package/dist/esm/babylon/stakingManager.js +83 -0
- package/dist/esm/babylon/stakingParams.d.ts +40 -0
- package/dist/esm/babylon/stakingParams.d.ts.map +1 -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.d.ts.map +1 -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.d.ts.map +1 -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.d.ts.map +1 -0
- package/dist/esm/babylon/undelegation/unbonding.js +70 -0
- package/dist/esm/coreDao/descriptor.d.ts +18 -0
- package/dist/{src → esm}/coreDao/descriptor.d.ts.map +1 -1
- 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.d.ts.map +1 -0
- package/dist/esm/coreDao/transaction.js +30 -0
- package/dist/esm/index.d.ts +3 -0
- package/dist/{src → esm}/index.d.ts.map +1 -1
- package/dist/esm/index.js +3 -0
- package/package.json +42 -12
- package/.eslintignore +0 -5
- package/.mocharc.yml +0 -8
- package/CHANGELOG.md +0 -63
- package/dist/src/coreDao/descriptor.js +0 -37
- package/dist/src/coreDao/opReturn.js +0 -183
- package/dist/src/coreDao/transaction.d.ts.map +0 -1
- package/dist/src/coreDao/transaction.js +0 -26
- package/dist/src/index.d.ts +0 -3
- package/dist/src/transaction.d.ts +0 -32
- package/dist/src/transaction.d.ts.map +0 -1
- package/dist/src/transaction.js +0 -54
- /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 → esm}/coreDao/index.d.ts.map +0 -0
- /package/dist/{src → esm}/coreDao/opReturn.d.ts.map +0 -0
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
import { payments, networks } from '@bitgo-beta/utxo-lib';
|
|
2
|
+
// Source: https://docs.coredao.org/docs/Learn/products/btc-staking/design
|
|
3
|
+
export const CORE_DAO_DEVNET_CHAIN_ID = Buffer.from('0458', 'hex');
|
|
4
|
+
export const CORE_DAO_TESTNET2_CHAIN_ID = Buffer.from('045a', 'hex');
|
|
5
|
+
export const CORE_DAO_TESTNET_CHAIN_ID = Buffer.from('045b', 'hex');
|
|
6
|
+
export const CORE_DAO_MAINNET_CHAIN_ID = Buffer.from('045c', 'hex');
|
|
7
|
+
export const CORE_DAO_SATOSHI_PLUS_IDENTIFIER = Buffer.from('5341542b', 'hex');
|
|
8
|
+
// https://github.com/bitcoin/bitcoin/blob/5961b23898ee7c0af2626c46d5d70e80136578d3/src/script/script.h#L47
|
|
9
|
+
const OP_RETURN_IDENTIFIER = Buffer.from('6a', 'hex');
|
|
10
|
+
export function encodeTimelock(timelock) {
|
|
11
|
+
const buff = Buffer.alloc(4);
|
|
12
|
+
buff.writeUInt32LE(timelock);
|
|
13
|
+
return buff;
|
|
14
|
+
}
|
|
15
|
+
export function decodeTimelock(buffer) {
|
|
16
|
+
if (buffer.length !== 4) {
|
|
17
|
+
throw new Error('Invalid timelock buffer length');
|
|
18
|
+
}
|
|
19
|
+
return buffer.readUInt32LE();
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Create a CoreDAO OP_RETURN output script
|
|
23
|
+
*
|
|
24
|
+
* @param version Version of the OP_RETURN
|
|
25
|
+
* @param chainId Chain ID
|
|
26
|
+
* @param delegator Delegator address
|
|
27
|
+
* @param validator Validator address
|
|
28
|
+
* @param fee Fee for relayer
|
|
29
|
+
* @param redeemScript Redeem script of the staking output
|
|
30
|
+
* @param timelock Timelock for the staking output
|
|
31
|
+
* @returns Buffer OP_RETURN buffer
|
|
32
|
+
*/
|
|
33
|
+
export function createCoreDaoOpReturnOutputScript({ version, chainId, delegator, validator, fee, ...rest }) {
|
|
34
|
+
/**
|
|
35
|
+
* As of v2, this is the construction of the OP_RETURN:
|
|
36
|
+
* Source: https://docs.coredao.org/docs/Learn/products/btc-staking/design#op_return-output
|
|
37
|
+
*
|
|
38
|
+
* The OP_RETURN output should contain all staking information in order, and be composed in the following format:
|
|
39
|
+
*
|
|
40
|
+
* Satoshi Plus Identifier: (SAT+) 4 bytes
|
|
41
|
+
* Version: (0x01) 1 byte
|
|
42
|
+
* Chain ID: (0x045b (1115) for Core Testnet and 0x045c (1116) for Core Mainnet) 2 bytes
|
|
43
|
+
* Delegator: The Core address to receive rewards, 20 bytes
|
|
44
|
+
* Validator: The Core validator address to stake to, 20 bytes
|
|
45
|
+
* Fee: Fee for relayer, 1 byte, range [0,255], measured in CORE
|
|
46
|
+
* (Optional) RedeemScript
|
|
47
|
+
* (Optional) Timelock: 4 bytes
|
|
48
|
+
*
|
|
49
|
+
* Either RedeemScript or Timelock must be available, the purpose is to allow relayer to
|
|
50
|
+
* obtain the RedeemScript and submit transactions on Core. If a RedeemScript is provided,
|
|
51
|
+
* relayer will use it directly. Otherwise, relayer will construct the redeem script based
|
|
52
|
+
* on the timelock and the information in the transaction inputs.
|
|
53
|
+
*
|
|
54
|
+
* Note that any length > 80 bytes wont be relayed by nodes and therefore we will throw an error.
|
|
55
|
+
*/
|
|
56
|
+
if (version < 0 || version > 255) {
|
|
57
|
+
throw new Error('Invalid version - out of range');
|
|
58
|
+
}
|
|
59
|
+
const versionBuffer = Buffer.alloc(1, version);
|
|
60
|
+
if (!(chainId.equals(CORE_DAO_TESTNET_CHAIN_ID) ||
|
|
61
|
+
chainId.equals(CORE_DAO_TESTNET2_CHAIN_ID) ||
|
|
62
|
+
chainId.equals(CORE_DAO_MAINNET_CHAIN_ID) ||
|
|
63
|
+
chainId.equals(CORE_DAO_DEVNET_CHAIN_ID))) {
|
|
64
|
+
throw new Error('Invalid chain ID');
|
|
65
|
+
}
|
|
66
|
+
if (delegator.length !== 20) {
|
|
67
|
+
throw new Error('Invalid delegator address');
|
|
68
|
+
}
|
|
69
|
+
if (validator.length !== 20) {
|
|
70
|
+
throw new Error('Invalid validator address');
|
|
71
|
+
}
|
|
72
|
+
if (fee < 0 || fee > 255) {
|
|
73
|
+
throw new Error('Invalid fee - out of range');
|
|
74
|
+
}
|
|
75
|
+
const feeBuffer = Buffer.alloc(1, fee);
|
|
76
|
+
if (feeBuffer.length !== 1) {
|
|
77
|
+
throw new Error('Invalid fee');
|
|
78
|
+
}
|
|
79
|
+
const redeemScriptBuffer = 'redeemScript' in rest ? rest.redeemScript : Buffer.from([]);
|
|
80
|
+
if ('timelock' in rest && (rest.timelock < 0 || rest.timelock > 4294967295)) {
|
|
81
|
+
throw new Error('Invalid timelock - out of range');
|
|
82
|
+
}
|
|
83
|
+
// encode the number into a 4-byte buffer
|
|
84
|
+
// if timelock is provided, write it into 32-bit little-endian
|
|
85
|
+
const timelockBuffer = 'timelock' in rest ? encodeTimelock(rest.timelock) : Buffer.from([]);
|
|
86
|
+
const data = Buffer.concat([
|
|
87
|
+
CORE_DAO_SATOSHI_PLUS_IDENTIFIER,
|
|
88
|
+
versionBuffer,
|
|
89
|
+
chainId,
|
|
90
|
+
delegator,
|
|
91
|
+
validator,
|
|
92
|
+
feeBuffer,
|
|
93
|
+
redeemScriptBuffer,
|
|
94
|
+
timelockBuffer,
|
|
95
|
+
]);
|
|
96
|
+
if (data.length > 80) {
|
|
97
|
+
throw new Error('OP_RETURN outputs cannot have a length larger than 80 bytes');
|
|
98
|
+
}
|
|
99
|
+
const payment = payments.embed({
|
|
100
|
+
data: [data],
|
|
101
|
+
network: chainId.equals(CORE_DAO_DEVNET_CHAIN_ID) ? networks.testnet : networks.bitcoin,
|
|
102
|
+
});
|
|
103
|
+
if (!payment.output) {
|
|
104
|
+
throw new Error('Unable to create OP_RETURN output');
|
|
105
|
+
}
|
|
106
|
+
return payment.output;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Parse a CoreDAO OP_RETURN output script into the constituent parts
|
|
110
|
+
* @param script
|
|
111
|
+
* @returns OpReturnParams
|
|
112
|
+
*/
|
|
113
|
+
export function parseCoreDaoOpReturnOutputScript(script) {
|
|
114
|
+
if (!script.subarray(0, 1).equals(OP_RETURN_IDENTIFIER)) {
|
|
115
|
+
throw new Error('First byte must be an OP_RETURN');
|
|
116
|
+
}
|
|
117
|
+
const payment = payments.embed({
|
|
118
|
+
output: script,
|
|
119
|
+
});
|
|
120
|
+
const data = payment.data;
|
|
121
|
+
if (!data || data.length !== 1) {
|
|
122
|
+
throw new Error('Invalid OP_RETURN output');
|
|
123
|
+
}
|
|
124
|
+
const dataBuffer = data[0];
|
|
125
|
+
if (dataBuffer.length > 80) {
|
|
126
|
+
throw new Error(`OP_RETURN outputs cannot have a length larger than 80 bytes`);
|
|
127
|
+
}
|
|
128
|
+
let offset = 0;
|
|
129
|
+
// Decode satoshi+ identifier
|
|
130
|
+
if (!dataBuffer.subarray(offset, offset + 4).equals(CORE_DAO_SATOSHI_PLUS_IDENTIFIER)) {
|
|
131
|
+
throw new Error('Invalid satoshi+ identifier');
|
|
132
|
+
}
|
|
133
|
+
offset += 4;
|
|
134
|
+
// Decode version
|
|
135
|
+
const version = dataBuffer[offset];
|
|
136
|
+
offset += 1;
|
|
137
|
+
// Decode chainId
|
|
138
|
+
const chainId = Buffer.from(dataBuffer.subarray(offset, offset + 2));
|
|
139
|
+
if (!(chainId.equals(CORE_DAO_DEVNET_CHAIN_ID) ||
|
|
140
|
+
chainId.equals(CORE_DAO_TESTNET_CHAIN_ID) ||
|
|
141
|
+
chainId.equals(CORE_DAO_TESTNET2_CHAIN_ID) ||
|
|
142
|
+
chainId.equals(CORE_DAO_MAINNET_CHAIN_ID))) {
|
|
143
|
+
throw new Error(`Invalid ChainID: ${chainId.toString('hex')}. Must be either 0x0458 (devnet), 0x045b (testnet), or 0x045c (mainnet).`);
|
|
144
|
+
}
|
|
145
|
+
offset += 2;
|
|
146
|
+
// Decode delegator
|
|
147
|
+
const delegator = Buffer.from(dataBuffer.subarray(offset, offset + 20));
|
|
148
|
+
offset += 20;
|
|
149
|
+
// Decode validator
|
|
150
|
+
const validator = Buffer.from(dataBuffer.subarray(offset, offset + 20));
|
|
151
|
+
offset += 20;
|
|
152
|
+
// Decode fee
|
|
153
|
+
const fee = dataBuffer[offset];
|
|
154
|
+
offset += 1;
|
|
155
|
+
const baseParams = { version, chainId, delegator, validator, fee };
|
|
156
|
+
// Decode redeemScript or timelock
|
|
157
|
+
if (offset === dataBuffer.length - 4) {
|
|
158
|
+
return { ...baseParams, timelock: decodeTimelock(dataBuffer.subarray(offset)) };
|
|
159
|
+
}
|
|
160
|
+
else {
|
|
161
|
+
return { ...baseParams, redeemScript: Buffer.from(dataBuffer.subarray(offset)) };
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
export function toString(params) {
|
|
165
|
+
return JSON.stringify({
|
|
166
|
+
version: params.version,
|
|
167
|
+
chainId: params.chainId.toString('hex'),
|
|
168
|
+
delegator: params.delegator.toString('hex'),
|
|
169
|
+
validator: params.validator.toString('hex'),
|
|
170
|
+
fee: params.fee,
|
|
171
|
+
...('redeemScript' in params ? { redeemScript: params.redeemScript.toString('hex') } : {}),
|
|
172
|
+
...('timelock' in params ? { timelock: params.timelock } : {}),
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BSZXR1cm4uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29yZURhby9vcFJldHVybi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRTFELDBFQUEwRTtBQUMxRSxNQUFNLENBQUMsTUFBTSx3QkFBd0IsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztBQUNuRSxNQUFNLENBQUMsTUFBTSwwQkFBMEIsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztBQUNyRSxNQUFNLENBQUMsTUFBTSx5QkFBeUIsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztBQUNwRSxNQUFNLENBQUMsTUFBTSx5QkFBeUIsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztBQUNwRSxNQUFNLENBQUMsTUFBTSxnQ0FBZ0MsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxLQUFLLENBQUMsQ0FBQztBQUMvRSwyR0FBMkc7QUFDM0csTUFBTSxvQkFBb0IsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztBQUV0RCxNQUFNLFVBQVUsY0FBYyxDQUFDLFFBQWdCO0lBQzdDLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDN0IsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUM3QixPQUFPLElBQUksQ0FBQztBQUNkLENBQUM7QUFFRCxNQUFNLFVBQVUsY0FBYyxDQUFDLE1BQWM7SUFDM0MsSUFBSSxNQUFNLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ3hCLE1B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LEVBQUUsWUFBWSxFQUFFLE1BQU0sQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUMxRixHQUFHLENBQUMsVUFBVSxJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxRQUFRLEVBQUUsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7S0FDL0QsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHBheW1lbnRzLCBuZXR3b3JrcyB9IGZyb20gJ0BiaXRnby1iZXRhL3V0eG8tbGliJztcblxuLy8gU291cmNlOiBodHRwczovL2RvY3MuY29yZWRhby5vcmcvZG9jcy9MZWFybi9wcm9kdWN0cy9idGMtc3Rha2luZy9kZXNpZ25cbmV4cG9ydCBjb25zdCBDT1JFX0RBT19ERVZORVRfQ0hBSU5fSUQgPSBCdWZmZXIuZnJvbSgnMDQ1OCcsICdoZXgnKTtcbmV4cG9ydCBjb25zdCBDT1JFX0RBT19URVNUTkVUMl9DSEFJTl9JRCA9IEJ1ZmZlci5mcm9tKCcwNDVhJywgJ2hleCcpO1xuZXhwb3J0IGNvbnN0IENPUkVfREFPX1RFU1RORVRfQ0hBSU5fSUQgPSBCdWZmZXIuZnJvbSgnMDQ1YicsICdoZXgnKTtcbmV4cG9ydCBjb25zdCBDT1JFX0RBT19NQUlOTkVUX0NIQUlOX0lEID0gQnVmZmVyLmZyb20oJzA0NWMnLCAnaGV4Jyk7XG5leHBvcnQgY29uc3QgQ09SRV9EQU9fU0FUT1NISV9QTFVTX0lERU5USUZJRVIgPSBCdWZmZXIuZnJvbSgnNTM0MTU0MmInLCAnaGV4Jyk7XG4vLyBodHRwczovL2dpdGh1Yi5jb20vYml0Y29pbi9iaXRjb2luL2Jsb2IvNTk2MWIyMzg5OGVlN2MwYWYyNjI2YzQ2ZDVkNzBlODAxMzY1NzhkMy9zcmMvc2NyaXB0L3NjcmlwdC5oI0w0N1xuY29uc3QgT1BfUkVUVVJOX0lERU5USUZJRVIgPSBCdWZmZXIuZnJvbSgnNmEnLCAnaGV4Jyk7XG5cbmV4cG9ydCBmdW5jdGlvbiBlbmNvZGVUaW1lbG9jayh0aW1lbG9jazogbnVtYmVyKTogQnVmZmVyIHtcbiAgY29uc3QgYnVmZiA9IEJ1ZmZlci5hbGxvYyg0KTtcbiAgYnVmZi53cml0ZVVJbnQzMkxFKHRpbWVsb2NrKTtcbiAgcmV0dXJuIGJ1ZmY7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZWNvZGVUaW1lbG9jayhidWZmZXI6IEJ1ZmZlcik6IG51bWJlciB7XG4gIGlmIChidWZmZXIubGVuZ3RoICE9PSA0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHRpbWVsb2NrIGJ1ZmZlciBsZW5ndGgnKTtcbiAgfVxuICByZXR1cm4gYnVmZmVyLnJlYWRVSW50MzJMRSgpO1xufVxuXG50eXBlIEJhc2VQYXJhbXMgPSB7XG4gIHZlcnNpb246IG51bWJlcjtcbiAgY2hhaW5JZDogQnVmZmVyO1xuICBkZWxlZ2F0b3I6IEJ1ZmZlcjtcbiAgdmFsaWRhdG9yOiBCdWZmZXI7XG4gIGZlZTogbnVtYmVyO1xufTtcblxuZXhwb3J0IHR5cGUgT3BSZXR1cm5QYXJhbXMgPSBCYXNlUGFyYW1zICYgKHsgcmVkZWVtU2NyaXB0OiBCdWZmZXIgfSB8IHsgdGltZWxvY2s6IG51bWJlciB9KTtcblxuLyoqXG4gKiBDcmVhdGUgYSBDb3JlREFPIE9QX1JFVFVSTiBvdXRwdXQgc2NyaXB0XG4gKlxuICogQHBhcmFtIHZlcnNpb24gVmVyc2lvbiBvZiB0aGUgT1BfUkVUVVJOXG4gKiBAcGFyYW0gY2hhaW5JZCBDaGFpbiBJRFxuICogQHBhcmFtIGRlbGVnYXRvciBEZWxlZ2F0b3IgYWRkcmVzc1xuICogQHBhcmFtIHZhbGlkYXRvciBWYWxpZGF0b3IgYWRkcmVzc1xuICogQHBhcmFtIGZlZSBGZWUgZm9yIHJlbGF5ZXJcbiAqIEBwYXJhbSByZWRlZW1TY3JpcHQgUmVkZWVtIHNjcmlwdCBvZiB0aGUgc3Rha2luZyBvdXRwdXRcbiAqIEBwYXJhbSB0aW1lbG9jayBUaW1lbG9jayBmb3IgdGhlIHN0YWtpbmcgb3V0cHV0XG4gKiBAcmV0dXJucyBCdWZmZXIgT1BfUkVUVVJOIGJ1ZmZlclxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQ29yZURhb09wUmV0dXJuT3V0cHV0U2NyaXB0KHtcbiAgdmVyc2lvbixcbiAgY2hhaW5JZCxcbiAgZGVsZWdhdG9yLFxuICB2YWxpZGF0b3IsXG4gIGZlZSxcbiAgLi4ucmVzdFxufTogT3BSZXR1cm5QYXJhbXMpOiBCdWZmZXIge1xuICAvKipcbiAgICogQXMgb2YgdjIsIHRoaXMgaXMgdGhlIGNvbnN0cnVjdGlvbiBvZiB0aGUgT1BfUkVUVVJOOlxuICAgKiBTb3VyY2U6IGh0dHBzOi8vZG9jcy5jb3JlZGFvLm9yZy9kb2NzL0xlYXJuL3Byb2R1Y3RzL2J0Yy1zdGFraW5nL2Rlc2lnbiNvcF9yZXR1cm4tb3V0cHV0XG4gICAqXG4gICAqIFRoZSBPUF9SRVRVUk4gb3V0cHV0IHNob3VsZCBjb250YWluIGFsbCBzdGFraW5nIGluZm9ybWF0aW9uIGluIG9yZGVyLCBhbmQgYmUgY29tcG9zZWQgaW4gdGhlIGZvbGxvd2luZyBmb3JtYXQ6XG4gICAqXG4gICAqIFNhdG9zaGkgUGx1cyBJZGVudGlmaWVyOiAoU0FUKykgNCBieXRlc1xuICAgKiBWZXJzaW9uOiAoMHgwMSkgMSBieXRlXG4gICAqIENoYWluIElEOiAoMHgwNDViICgxMTE1KSBmb3IgQ29yZSBUZXN0bmV0IGFuZCAweDA0NWMgKDExMTYpIGZvciBDb3JlIE1haW5uZXQpIDIgYnl0ZXNcbiAgICogRGVsZWdhdG9yOiBUaGUgQ29yZSBhZGRyZXNzIHRvIHJlY2VpdmUgcmV3YXJkcywgMjAgYnl0ZXNcbiAgICogVmFsaWRhdG9yOiBUaGUgQ29yZSB2YWxpZGF0b3IgYWRkcmVzcyB0byBzdGFrZSB0bywgMjAgYnl0ZXNcbiAgICogRmVlOiBGZWUgZm9yIHJlbGF5ZXIsIDEgYnl0ZSwgcmFuZ2UgWzAsMjU1XSwgbWVhc3VyZWQgaW4gQ09SRVxuICAgKiAoT3B0aW9uYWwpIFJlZGVlbVNjcmlwdFxuICAgKiAoT3B0aW9uYWwpIFRpbWVsb2NrOiA0IGJ5dGVzXG4gICAqXG4gICAqIEVpdGhlciBSZWRlZW1TY3JpcHQgb3IgVGltZWxvY2sgbXVzdCBiZSBhdmFpbGFibGUsIHRoZSBwdXJwb3NlIGlzIHRvIGFsbG93IHJlbGF5ZXIgdG9cbiAgICogb2J0YWluIHRoZSBSZWRlZW1TY3JpcHQgYW5kIHN1Ym1pdCB0cmFuc2FjdGlvbnMgb24gQ29yZS4gSWYgYSBSZWRlZW1TY3JpcHQgaXMgcHJvdmlkZWQsXG4gICAqIHJlbGF5ZXIgd2lsbCB1c2UgaXQgZGlyZWN0bHkuIE90aGVyd2lzZSwgcmVsYXllciB3aWxsIGNvbnN0cnVjdCB0aGUgcmVkZWVtIHNjcmlwdCBiYXNlZFxuICAgKiBvbiB0aGUgdGltZWxvY2sgYW5kIHRoZSBpbmZvcm1hdGlvbiBpbiB0aGUgdHJhbnNhY3Rpb24gaW5wdXRzLlxuICAgKlxuICAgKiBOb3RlIHRoYXQgYW55IGxlbmd0aCA+IDgwIGJ5dGVzIHdvbnQgYmUgcmVsYXllZCBieSBub2RlcyBhbmQgdGhlcmVmb3JlIHdlIHdpbGwgdGhyb3cgYW4gZXJyb3IuXG4gICAqL1xuICBpZiAodmVyc2lvbiA8IDAgfHwgdmVyc2lvbiA+IDI1NSkge1xuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCB2ZXJzaW9uIC0gb3V0IG9mIHJhbmdlJyk7XG4gIH1cbiAgY29uc3QgdmVyc2lvbkJ1ZmZlciA9IEJ1ZmZlci5hbGxvYygxLCB2ZXJzaW9uKTtcblxuICBpZiAoXG4gICAgIShcbiAgICAgIGNoYWluSWQuZXF1YWxzKENPUkVfREFPX1RFU1RORVRfQ0hBSU5fSUQpIHx8XG4gICAgICBjaGFpbklkLmVxdWFscyhDT1JFX0RBT19URVNUTkVUMl9DSEFJTl9JRCkgfHxcbiAgICAgIGNoYWluSWQuZXF1YWxzKENPUkVfREFPX01BSU5ORVRfQ0hBSU5fSUQpIHx8XG4gICAgICBjaGFpbklkLmVxdWFscyhDT1JFX0RBT19ERVZORVRfQ0hBSU5fSUQpXG4gICAgKVxuICApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgY2hhaW4gSUQnKTtcbiAgfVxuXG4gIGlmIChkZWxlZ2F0b3IubGVuZ3RoICE9PSAyMCkge1xuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBkZWxlZ2F0b3IgYWRkcmVzcycpO1xuICB9XG5cbiAgaWYgKHZhbGlkYXRvci5sZW5ndGggIT09IDIwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHZhbGlkYXRvciBhZGRyZXNzJyk7XG4gIH1cblxuICBpZiAoZmVlIDwgMCB8fCBmZWUgPiAyNTUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgZmVlIC0gb3V0IG9mIHJhbmdlJyk7XG4gIH1cbiAgY29uc3QgZmVlQnVmZmVyID0gQnVmZmVyLmFsbG9jKDEsIGZlZSk7XG5cbiAgaWYgKGZlZUJ1ZmZlci5sZW5ndGggIT09IDEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgZmVlJyk7XG4gIH1cblxuICBjb25zdCByZWRlZW1TY3JpcHRCdWZmZXIgPSAncmVkZWVtU2NyaXB0JyBpbiByZXN0ID8gcmVzdC5yZWRlZW1TY3JpcHQgOiBCdWZmZXIuZnJvbShbXSk7XG4gIGlmICgndGltZWxvY2snIGluIHJlc3QgJiYgKHJlc3QudGltZWxvY2sgPCAwIHx8IHJlc3QudGltZWxvY2sgPiA0Mjk0OTY3Mjk1KSkge1xuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCB0aW1lbG9jayAtIG91dCBvZiByYW5nZScpO1xuICB9XG5cbiAgLy8gZW5jb2RlIHRoZSBudW1iZXIgaW50byBhIDQtYnl0ZSBidWZmZXJcbiAgLy8gaWYgdGltZWxvY2sgaXMgcHJvdmlkZWQsIHdyaXRlIGl0IGludG8gMzItYml0IGxpdHRsZS1lbmRpYW5cbiAgY29uc3QgdGltZWxvY2tCdWZmZXIgPSAndGltZWxvY2snIGluIHJlc3QgPyBlbmNvZGVUaW1lbG9jayhyZXN0LnRpbWVsb2NrKSA6IEJ1ZmZlci5mcm9tKFtdKTtcbiAgY29uc3QgZGF0YSA9IEJ1ZmZlci5jb25jYXQoW1xuICAgIENPUkVfREFPX1NBVE9TSElfUExVU19JREVOVElGSUVSLFxuICAgIHZlcnNpb25CdWZmZXIsXG4gICAgY2hhaW5JZCxcbiAgICBkZWxlZ2F0b3IsXG4gICAgdmFsaWRhdG9yLFxuICAgIGZlZUJ1ZmZlcixcbiAgICByZWRlZW1TY3JpcHRCdWZmZXIsXG4gICAgdGltZWxvY2tCdWZmZXIsXG4gIF0pO1xuICBpZiAoZGF0YS5sZW5ndGggPiA4MCkge1xuICAgIHRocm93IG5ldyBFcnJvcignT1BfUkVUVVJOIG91dHB1dHMgY2Fubm90IGhhdmUgYSBsZW5ndGggbGFyZ2VyIHRoYW4gODAgYnl0ZXMnKTtcbiAgfVxuXG4gIGNvbnN0IHBheW1lbnQgPSBwYXltZW50cy5lbWJlZCh7XG4gICAgZGF0YTogW2RhdGFdLFxuICAgIG5ldHdvcms6IGNoYWluSWQuZXF1YWxzKENPUkVfREFPX0RFVk5FVF9DSEFJTl9JRCkgPyBuZXR3b3Jrcy50ZXN0bmV0IDogbmV0d29ya3MuYml0Y29pbixcbiAgfSk7XG4gIGlmICghcGF5bWVudC5vdXRwdXQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuYWJsZSB0byBjcmVhdGUgT1BfUkVUVVJOIG91dHB1dCcpO1xuICB9XG5cbiAgcmV0dXJuIHBheW1lbnQub3V0cHV0O1xufVxuXG4vKipcbiAqIFBhcnNlIGEgQ29yZURBTyBPUF9SRVRVUk4gb3V0cHV0IHNjcmlwdCBpbnRvIHRoZSBjb25zdGl0dWVudCBwYXJ0c1xuICogQHBhcmFtIHNjcmlwdFxuICogQHJldHVybnMgT3BSZXR1cm5QYXJhbXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlQ29yZURhb09wUmV0dXJuT3V0cHV0U2NyaXB0KHNjcmlwdDogQnVmZmVyKTogT3BSZXR1cm5QYXJhbXMge1xuICBpZiAoIXNjcmlwdC5zdWJhcnJheSgwLCAxKS5lcXVhbHMoT1BfUkVUVVJOX0lERU5USUZJRVIpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdGaXJzdCBieXRlIG11c3QgYmUgYW4gT1BfUkVUVVJOJyk7XG4gIH1cblxuICBjb25zdCBwYXltZW50ID0gcGF5bWVudHMuZW1iZWQoe1xuICAgIG91dHB1dDogc2NyaXB0LFxuICB9KTtcbiAgY29uc3QgZGF0YSA9IHBheW1lbnQuZGF0YTtcbiAgaWYgKCFkYXRhIHx8IGRhdGEubGVuZ3RoICE9PSAxKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIE9QX1JFVFVSTiBvdXRwdXQnKTtcbiAgfVxuICBjb25zdCBkYXRhQnVmZmVyID0gZGF0YVswXTtcbiAgaWYgKGRhdGFCdWZmZXIubGVuZ3RoID4gODApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYE9QX1JFVFVSTiBvdXRwdXRzIGNhbm5vdCBoYXZlIGEgbGVuZ3RoIGxhcmdlciB0aGFuIDgwIGJ5dGVzYCk7XG4gIH1cbiAgbGV0IG9mZnNldCA9IDA7XG5cbiAgLy8gRGVjb2RlIHNhdG9zaGkrIGlkZW50aWZpZXJcbiAgaWYgKCFkYXRhQnVmZmVyLnN1YmFycmF5KG9mZnNldCwgb2Zmc2V0ICsgNCkuZXF1YWxzKENPUkVfREFPX1NBVE9TSElfUExVU19JREVOVElGSUVSKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBzYXRvc2hpKyBpZGVudGlmaWVyJyk7XG4gIH1cbiAgb2Zmc2V0ICs9IDQ7XG5cbiAgLy8gRGVjb2RlIHZlcnNpb25cbiAgY29uc3QgdmVyc2lvbiA9IGRhdGFCdWZmZXJbb2Zmc2V0XTtcbiAgb2Zmc2V0ICs9IDE7XG5cbiAgLy8gRGVjb2RlIGNoYWluSWRcbiAgY29uc3QgY2hhaW5JZCA9IEJ1ZmZlci5mcm9tKGRhdGFCdWZmZXIuc3ViYXJyYXkob2Zmc2V0LCBvZmZzZXQgKyAyKSk7XG4gIGlmIChcbiAgICAhKFxuICAgICAgY2hhaW5JZC5lcXVhbHMoQ09SRV9EQU9fREVWTkVUX0NIQUlOX0lEKSB8fFxuICAgICAgY2hhaW5JZC5lcXVhbHMoQ09SRV9EQU9fVEVTVE5FVF9DSEFJTl9JRCkgfHxcbiAgICAgIGNoYWluSWQuZXF1YWxzKENPUkVfREFPX1RFU1RORVQyX0NIQUlOX0lEKSB8fFxuICAgICAgY2hhaW5JZC5lcXVhbHMoQ09SRV9EQU9fTUFJTk5FVF9DSEFJTl9JRClcbiAgICApXG4gICkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBJbnZhbGlkIENoYWluSUQ6ICR7Y2hhaW5JZC50b1N0cmluZyhcbiAgICAgICAgJ2hleCdcbiAgICAgICl9LiBNdXN0IGJlIGVpdGhlciAweDA0NTggKGRldm5ldCksIDB4MDQ1YiAodGVzdG5ldCksIG9yIDB4MDQ1YyAobWFpbm5ldCkuYFxuICAgICk7XG4gIH1cbiAgb2Zmc2V0ICs9IDI7XG5cbiAgLy8gRGVjb2RlIGRlbGVnYXRvclxuICBjb25zdCBkZWxlZ2F0b3IgPSBCdWZmZXIuZnJvbShkYXRhQnVmZmVyLnN1YmFycmF5KG9mZnNldCwgb2Zmc2V0ICsgMjApKTtcbiAgb2Zmc2V0ICs9IDIwO1xuXG4gIC8vIERlY29kZSB2YWxpZGF0b3JcbiAgY29uc3QgdmFsaWRhdG9yID0gQnVmZmVyLmZyb20oZGF0YUJ1ZmZlci5zdWJhcnJheShvZmZzZXQsIG9mZnNldCArIDIwKSk7XG4gIG9mZnNldCArPSAyMDtcblxuICAvLyBEZWNvZGUgZmVlXG4gIGNvbnN0IGZlZSA9IGRhdGFCdWZmZXJbb2Zmc2V0XTtcbiAgb2Zmc2V0ICs9IDE7XG5cbiAgY29uc3QgYmFzZVBhcmFtcyA9IHsgdmVyc2lvbiwgY2hhaW5JZCwgZGVsZWdhdG9yLCB2YWxpZGF0b3IsIGZlZSB9O1xuXG4gIC8vIERlY29kZSByZWRlZW1TY3JpcHQgb3IgdGltZWxvY2tcbiAgaWYgKG9mZnNldCA9PT0gZGF0YUJ1ZmZlci5sZW5ndGggLSA0KSB7XG4gICAgcmV0dXJuIHsgLi4uYmFzZVBhcmFtcywgdGltZWxvY2s6IGRlY29kZVRpbWVsb2NrKGRhdGFCdWZmZXIuc3ViYXJyYXkob2Zmc2V0KSkgfTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4geyAuLi5iYXNlUGFyYW1zLCByZWRlZW1TY3JpcHQ6IEJ1ZmZlci5mcm9tKGRhdGFCdWZmZXIuc3ViYXJyYXkob2Zmc2V0KSkgfTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gdG9TdHJpbmcocGFyYW1zOiBPcFJldHVyblBhcmFtcyk6IHN0cmluZyB7XG4gIHJldHVybiBKU09OLnN0cmluZ2lmeSh7XG4gICAgdmVyc2lvbjogcGFyYW1zLnZlcnNpb24sXG4gICAgY2hhaW5JZDogcGFyYW1zLmNoYWluSWQudG9TdHJpbmcoJ2hleCcpLFxuICAgIGRlbGVnYXRvcjogcGFyYW1zLmRlbGVnYXRvci50b1N0cmluZygnaGV4JyksXG4gICAgdmFsaWRhdG9yOiBwYXJhbXMudmFsaWRhdG9yLnRvU3RyaW5nKCdoZXgnKSxcbiAgICBmZWU6IHBhcmFtcy5mZWUsXG4gICAgLi4uKCdyZWRlZW1TY3JpcHQnIGluIHBhcmFtcyA/IHsgcmVkZWVtU2NyaXB0OiBwYXJhbXMucmVkZWVtU2NyaXB0LnRvU3RyaW5nKCdoZXgnKSB9IDoge30pLFxuICAgIC4uLigndGltZWxvY2snIGluIHBhcmFtcyA/IHsgdGltZWxvY2s6IHBhcmFtcy50aW1lbG9jayB9IDoge30pLFxuICB9KTtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { Output } from '@bitgo-beta/utxo-core';
|
|
2
|
+
import { Descriptor } from '@bitgo/wasm-utxo';
|
|
3
|
+
import { OpReturnParams } from './opReturn';
|
|
4
|
+
type StakingParams = {
|
|
5
|
+
amount: bigint;
|
|
6
|
+
descriptor: Descriptor;
|
|
7
|
+
index?: number;
|
|
8
|
+
};
|
|
9
|
+
/**
|
|
10
|
+
* Create the staking outputs for a CoreDAO staking transaction. This is the ordering
|
|
11
|
+
* in which to add into the transaction.
|
|
12
|
+
* @param stakingParams how to create the timelocked stake output
|
|
13
|
+
* @param stakingParams.descriptor if stakingParams.index is not provided, then this is assumed to be a `definite` descriptor.
|
|
14
|
+
* If stakingParams.index is provided, then this is assumed to be a `derivable` descriptor.
|
|
15
|
+
* @param opReturnParams to create the OP_RETURN output
|
|
16
|
+
*/
|
|
17
|
+
export declare function createStakingOutputsCore(stakingParams: StakingParams, opReturnParams: OpReturnParams): Output<bigint>[];
|
|
18
|
+
type LegacyOutput = {
|
|
19
|
+
script: Buffer;
|
|
20
|
+
amount: bigint;
|
|
21
|
+
};
|
|
22
|
+
/**
|
|
23
|
+
* @see createStakingOutputsCore
|
|
24
|
+
* @deprecated - use createStakingOutputsCore instead
|
|
25
|
+
*/
|
|
26
|
+
export declare function createStakingOutputs(stakingParams: StakingParams, opReturnParams: OpReturnParams): LegacyOutput[];
|
|
27
|
+
export {};
|
|
28
|
+
//# sourceMappingURL=transaction.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transaction.d.ts","sourceRoot":"","sources":["../../../src/coreDao/transaction.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,OAAO,EAAqC,cAAc,EAAE,MAAM,YAAY,CAAC;AAE/E,KAAK,aAAa,GAAG;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,UAAU,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF;;;;;;;GAOG;AACH,wBAAgB,wBAAwB,CACtC,aAAa,EAAE,aAAa,EAC5B,cAAc,EAAE,cAAc,GAC7B,MAAM,CAAC,MAAM,CAAC,EAAE,CAgBlB;AAED,KAAK,YAAY,GAAG;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,aAAa,EAAE,aAAa,EAAE,cAAc,EAAE,cAAc,GAAG,YAAY,EAAE,CAEjH"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { createCoreDaoOpReturnOutputScript } from './opReturn';
|
|
2
|
+
/**
|
|
3
|
+
* Create the staking outputs for a CoreDAO staking transaction. This is the ordering
|
|
4
|
+
* in which to add into the transaction.
|
|
5
|
+
* @param stakingParams how to create the timelocked stake output
|
|
6
|
+
* @param stakingParams.descriptor if stakingParams.index is not provided, then this is assumed to be a `definite` descriptor.
|
|
7
|
+
* If stakingParams.index is provided, then this is assumed to be a `derivable` descriptor.
|
|
8
|
+
* @param opReturnParams to create the OP_RETURN output
|
|
9
|
+
*/
|
|
10
|
+
export function createStakingOutputsCore(stakingParams, opReturnParams) {
|
|
11
|
+
if (stakingParams.descriptor.hasWildcard() && stakingParams.index === undefined) {
|
|
12
|
+
throw new Error('Cannot create staking outputs with a wildcard descriptor and no derivation index');
|
|
13
|
+
}
|
|
14
|
+
const outputScript = Buffer.from(stakingParams.index === undefined
|
|
15
|
+
? stakingParams.descriptor.scriptPubkey()
|
|
16
|
+
: stakingParams.descriptor.atDerivationIndex(stakingParams.index).scriptPubkey());
|
|
17
|
+
const opReturnScript = createCoreDaoOpReturnOutputScript(opReturnParams);
|
|
18
|
+
return [
|
|
19
|
+
{ script: outputScript, value: stakingParams.amount },
|
|
20
|
+
{ script: opReturnScript, value: BigInt(0) },
|
|
21
|
+
];
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* @see createStakingOutputsCore
|
|
25
|
+
* @deprecated - use createStakingOutputsCore instead
|
|
26
|
+
*/
|
|
27
|
+
export function createStakingOutputs(stakingParams, opReturnParams) {
|
|
28
|
+
return createStakingOutputsCore(stakingParams, opReturnParams).map(({ value, ...o }) => ({ ...o, amount: value }));
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29yZURhby90cmFuc2FjdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFHQSxPQUFPLEVBQUUsaUNBQWlDLEVBQWtCLE1BQU0sWUFBWSxDQUFDO0FBUS9FOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLFVBQVUsd0JBQXdCLENBQ3RDLGFBQTRCLEVBQzVCLGNBQThCO0lBRTlCLElBQUksYUFBYSxDQUFDLFVBQVUsQ0FBQyxXQUFXLEVBQUUsSUFBSSxhQUFhLENBQUMsS0FBSyxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQ2hGLE1BQU0sSUFBSSxLQUFLLENBQUMsa0ZBQWtGLENBQUMsQ0FBQztJQUN0RyxDQUFDO0lBRUQsTUFBTSxZQUFZLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FDOUIsYUFBYSxDQUFDLEtBQUssS0FBSyxTQUFTO1FBQy9CLENBQUMsQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLFlBQVksRUFBRTtRQUN6QyxDQUFDLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUMsWUFBWSxFQUFFLENBQ25GLENBQUM7SUFDRixNQUFNLGNBQWMsR0FBRyxpQ0FBaUMsQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUV6RSxPQUFPO1FBQ0wsRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxhQUFhLENBQUMsTUFBTSxFQUFFO1FBQ3JELEVBQUUsTUFBTSxFQUFFLGNBQWMsRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFO0tBQzdDLENBQUM7QUFDSixDQUFDO0FBT0Q7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLG9CQUFvQixDQUFDLGFBQTRCLEVBQUUsY0FBOEI7SUFDL0YsT0FBTyx3QkFBd0IsQ0FBQyxhQUFhLEVBQUUsY0FBYyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsR0FBRyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDckgsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE91dHB1dCB9IGZyb20gJ0BiaXRnby1iZXRhL3V0eG8tY29yZSc7XG5pbXBvcnQgeyBEZXNjcmlwdG9yIH0gZnJvbSAnQGJpdGdvL3dhc20tdXR4byc7XG5cbmltcG9ydCB7IGNyZWF0ZUNvcmVEYW9PcFJldHVybk91dHB1dFNjcmlwdCwgT3BSZXR1cm5QYXJhbXMgfSBmcm9tICcuL29wUmV0dXJuJztcblxudHlwZSBTdGFraW5nUGFyYW1zID0ge1xuICBhbW91bnQ6IGJpZ2ludDtcbiAgZGVzY3JpcHRvcjogRGVzY3JpcHRvcjtcbiAgaW5kZXg/OiBudW1iZXI7XG59O1xuXG4vKipcbiAqIENyZWF0ZSB0aGUgc3Rha2luZyBvdXRwdXRzIGZvciBhIENvcmVEQU8gc3Rha2luZyB0cmFuc2FjdGlvbi4gVGhpcyBpcyB0aGUgb3JkZXJpbmdcbiAqIGluIHdoaWNoIHRvIGFkZCBpbnRvIHRoZSB0cmFuc2FjdGlvbi5cbiAqIEBwYXJhbSBzdGFraW5nUGFyYW1zIGhvdyB0byBjcmVhdGUgdGhlIHRpbWVsb2NrZWQgc3Rha2Ugb3V0cHV0XG4gKiBAcGFyYW0gc3Rha2luZ1BhcmFtcy5kZXNjcmlwdG9yIGlmIHN0YWtpbmdQYXJhbXMuaW5kZXggaXMgbm90IHByb3ZpZGVkLCB0aGVuIHRoaXMgaXMgYXNzdW1lZCB0byBiZSBhIGBkZWZpbml0ZWAgZGVzY3JpcHRvci5cbiAqIElmIHN0YWtpbmdQYXJhbXMuaW5kZXggaXMgcHJvdmlkZWQsIHRoZW4gdGhpcyBpcyBhc3N1bWVkIHRvIGJlIGEgYGRlcml2YWJsZWAgZGVzY3JpcHRvci5cbiAqIEBwYXJhbSBvcFJldHVyblBhcmFtcyB0byBjcmVhdGUgdGhlIE9QX1JFVFVSTiBvdXRwdXRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVN0YWtpbmdPdXRwdXRzQ29yZShcbiAgc3Rha2luZ1BhcmFtczogU3Rha2luZ1BhcmFtcyxcbiAgb3BSZXR1cm5QYXJhbXM6IE9wUmV0dXJuUGFyYW1zXG4pOiBPdXRwdXQ8YmlnaW50PltdIHtcbiAgaWYgKHN0YWtpbmdQYXJhbXMuZGVzY3JpcHRvci5oYXNXaWxkY2FyZCgpICYmIHN0YWtpbmdQYXJhbXMuaW5kZXggPT09IHVuZGVmaW5lZCkge1xuICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGNyZWF0ZSBzdGFraW5nIG91dHB1dHMgd2l0aCBhIHdpbGRjYXJkIGRlc2NyaXB0b3IgYW5kIG5vIGRlcml2YXRpb24gaW5kZXgnKTtcbiAgfVxuXG4gIGNvbnN0IG91dHB1dFNjcmlwdCA9IEJ1ZmZlci5mcm9tKFxuICAgIHN0YWtpbmdQYXJhbXMuaW5kZXggPT09IHVuZGVmaW5lZFxuICAgICAgPyBzdGFraW5nUGFyYW1zLmRlc2NyaXB0b3Iuc2NyaXB0UHVia2V5KClcbiAgICAgIDogc3Rha2luZ1BhcmFtcy5kZXNjcmlwdG9yLmF0RGVyaXZhdGlvbkluZGV4KHN0YWtpbmdQYXJhbXMuaW5kZXgpLnNjcmlwdFB1YmtleSgpXG4gICk7XG4gIGNvbnN0IG9wUmV0dXJuU2NyaXB0ID0gY3JlYXRlQ29yZURhb09wUmV0dXJuT3V0cHV0U2NyaXB0KG9wUmV0dXJuUGFyYW1zKTtcblxuICByZXR1cm4gW1xuICAgIHsgc2NyaXB0OiBvdXRwdXRTY3JpcHQsIHZhbHVlOiBzdGFraW5nUGFyYW1zLmFtb3VudCB9LFxuICAgIHsgc2NyaXB0OiBvcFJldHVyblNjcmlwdCwgdmFsdWU6IEJpZ0ludCgwKSB9LFxuICBdO1xufVxuXG50eXBlIExlZ2FjeU91dHB1dCA9IHtcbiAgc2NyaXB0OiBCdWZmZXI7XG4gIGFtb3VudDogYmlnaW50O1xufTtcblxuLyoqXG4gKiBAc2VlIGNyZWF0ZVN0YWtpbmdPdXRwdXRzQ29yZVxuICogQGRlcHJlY2F0ZWQgLSB1c2UgY3JlYXRlU3Rha2luZ091dHB1dHNDb3JlIGluc3RlYWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVN0YWtpbmdPdXRwdXRzKHN0YWtpbmdQYXJhbXM6IFN0YWtpbmdQYXJhbXMsIG9wUmV0dXJuUGFyYW1zOiBPcFJldHVyblBhcmFtcyk6IExlZ2FjeU91dHB1dFtdIHtcbiAgcmV0dXJuIGNyZWF0ZVN0YWtpbmdPdXRwdXRzQ29yZShzdGFraW5nUGFyYW1zLCBvcFJldHVyblBhcmFtcykubWFwKCh7IHZhbHVlLCAuLi5vIH0pID0+ICh7IC4uLm8sIGFtb3VudDogdmFsdWUgfSkpO1xufVxuIl19
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,WAAW,CAAC;AACrC,OAAO,KAAK,OAAO,MAAM,WAAW,CAAC"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export * as coreDao from './coreDao';
|
|
2
|
+
export * as babylon from './babylon';
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxXQUFXLENBQUM7QUFDckMsT0FBTyxLQUFLLE9BQU8sTUFBTSxXQUFXLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBhcyBjb3JlRGFvIGZyb20gJy4vY29yZURhbyc7XG5leHBvcnQgKiBhcyBiYWJ5bG9uIGZyb20gJy4vYmFieWxvbic7XG4iXX0=
|
package/package.json
CHANGED
|
@@ -1,24 +1,43 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bitgo-beta/utxo-staking",
|
|
3
|
-
"version": "1.1.1-beta.
|
|
3
|
+
"version": "1.1.1-beta.910",
|
|
4
4
|
"description": "BitGo SDK for build UTXO staking transactions",
|
|
5
|
-
"main": "./dist/src/index.js",
|
|
6
|
-
"
|
|
5
|
+
"main": "./dist/cjs/src/index.js",
|
|
6
|
+
"module": "./dist/esm/index.js",
|
|
7
|
+
"browser": "./dist/esm/index.js",
|
|
8
|
+
"types": "./dist/cjs/src/index.d.ts",
|
|
9
|
+
"files": [
|
|
10
|
+
"dist/cjs",
|
|
11
|
+
"dist/esm"
|
|
12
|
+
],
|
|
13
|
+
"exports": {
|
|
14
|
+
".": {
|
|
15
|
+
"import": {
|
|
16
|
+
"types": "./dist/esm/index.d.ts",
|
|
17
|
+
"default": "./dist/esm/index.js"
|
|
18
|
+
},
|
|
19
|
+
"require": {
|
|
20
|
+
"types": "./dist/cjs/src/index.d.ts",
|
|
21
|
+
"default": "./dist/cjs/src/index.js"
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
},
|
|
7
25
|
"scripts": {
|
|
8
|
-
"build": "
|
|
26
|
+
"build": "npm run build:cjs && npm run build:esm",
|
|
27
|
+
"build:cjs": "yarn tsc --build --incremental --verbose .",
|
|
28
|
+
"build:esm": "yarn tsc --project tsconfig.esm.json",
|
|
9
29
|
"fmt": "prettier --write .",
|
|
10
|
-
"check-fmt": "prettier --check
|
|
30
|
+
"check-fmt": "prettier --check '**/*.{ts,js,json}'",
|
|
11
31
|
"clean": "rm -r ./dist",
|
|
12
32
|
"lint": "eslint --quiet .",
|
|
13
33
|
"prepare": "npm run build",
|
|
14
|
-
"test": "npm run coverage",
|
|
15
34
|
"coverage": "nyc -- npm run unit-test",
|
|
16
|
-
"unit-test": "mocha"
|
|
35
|
+
"unit-test": "mocha --recursive \"test/**/*.ts\""
|
|
17
36
|
},
|
|
18
37
|
"author": "BitGo SDK Team <sdkteam@bitgo.com>",
|
|
19
38
|
"license": "MIT",
|
|
20
39
|
"engines": {
|
|
21
|
-
"node": ">=
|
|
40
|
+
"node": ">=20 <23"
|
|
22
41
|
},
|
|
23
42
|
"repository": {
|
|
24
43
|
"type": "git",
|
|
@@ -40,9 +59,20 @@
|
|
|
40
59
|
]
|
|
41
60
|
},
|
|
42
61
|
"dependencies": {
|
|
43
|
-
"@
|
|
44
|
-
"@bitgo-beta/
|
|
45
|
-
"@bitgo/
|
|
62
|
+
"@babylonlabs-io/babylon-proto-ts": "1.7.2",
|
|
63
|
+
"@bitgo-beta/babylonlabs-io-btc-staking-ts": "0.4.0-beta.715",
|
|
64
|
+
"@bitgo-beta/utxo-core": "1.8.1-beta.586",
|
|
65
|
+
"@bitgo-beta/utxo-lib": "8.0.3-beta.1470",
|
|
66
|
+
"@bitgo/wasm-utxo": "1.11.0",
|
|
67
|
+
"bip174": "npm:@bitgo-forks/bip174@3.1.0-master.4",
|
|
68
|
+
"bip322-js": "^2.0.0",
|
|
69
|
+
"bitcoinjs-lib": "^6.1.7",
|
|
70
|
+
"fp-ts": "^2.16.2",
|
|
71
|
+
"io-ts": "npm:@bitgo-forks/io-ts@2.1.4",
|
|
72
|
+
"io-ts-types": "^0.5.19"
|
|
73
|
+
},
|
|
74
|
+
"devDependencies": {
|
|
75
|
+
"yargs": "^17.7.2"
|
|
46
76
|
},
|
|
47
|
-
"gitHead": "
|
|
77
|
+
"gitHead": "2f84eaa158d1a5e2f7ee792701d76bd860867d21"
|
|
48
78
|
}
|
package/.mocharc.yml
DELETED
package/CHANGELOG.md
DELETED
|
@@ -1,63 +0,0 @@
|
|
|
1
|
-
# Change Log
|
|
2
|
-
|
|
3
|
-
All notable changes to this project will be documented in this file.
|
|
4
|
-
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
|
5
|
-
|
|
6
|
-
# [1.5.0](https://github.com/BitGo/BitGoJS/compare/@bitgo/utxo-staking@1.3.5...@bitgo/utxo-staking@1.5.0) (2024-12-17)
|
|
7
|
-
|
|
8
|
-
### Features
|
|
9
|
-
|
|
10
|
-
- **utxo-staking:** add support for wsh script type ([c3632a4](https://github.com/BitGo/BitGoJS/commit/c3632a456a92953ee52340c79740bcd9e6f66215))
|
|
11
|
-
|
|
12
|
-
# [1.4.0](https://github.com/BitGo/BitGoJS/compare/@bitgo/utxo-staking@1.3.5...@bitgo/utxo-staking@1.4.0) (2024-12-17)
|
|
13
|
-
|
|
14
|
-
### Features
|
|
15
|
-
|
|
16
|
-
- **utxo-staking:** add support for wsh script type ([c3632a4](https://github.com/BitGo/BitGoJS/commit/c3632a456a92953ee52340c79740bcd9e6f66215))
|
|
17
|
-
|
|
18
|
-
## [1.3.5](https://github.com/BitGo/BitGoJS/compare/@bitgo/utxo-staking@1.3.4...@bitgo/utxo-staking@1.3.5) (2024-12-12)
|
|
19
|
-
|
|
20
|
-
**Note:** Version bump only for package @bitgo/utxo-staking
|
|
21
|
-
|
|
22
|
-
## [1.3.4](https://github.com/BitGo/BitGoJS/compare/@bitgo/utxo-staking@1.3.3...@bitgo/utxo-staking@1.3.4) (2024-12-11)
|
|
23
|
-
|
|
24
|
-
**Note:** Version bump only for package @bitgo/utxo-staking
|
|
25
|
-
|
|
26
|
-
## [1.3.3](https://github.com/BitGo/BitGoJS/compare/@bitgo/utxo-staking@1.3.2...@bitgo/utxo-staking@1.3.3) (2024-12-03)
|
|
27
|
-
|
|
28
|
-
**Note:** Version bump only for package @bitgo/utxo-staking
|
|
29
|
-
|
|
30
|
-
## [1.3.2](https://github.com/BitGo/BitGoJS/compare/@bitgo/utxo-staking@1.3.1...@bitgo/utxo-staking@1.3.2) (2024-11-26)
|
|
31
|
-
|
|
32
|
-
**Note:** Version bump only for package @bitgo/utxo-staking
|
|
33
|
-
|
|
34
|
-
## [1.3.1](https://github.com/BitGo/BitGoJS/compare/@bitgo/utxo-staking@1.3.0...@bitgo/utxo-staking@1.3.1) (2024-11-21)
|
|
35
|
-
|
|
36
|
-
**Note:** Version bump only for package @bitgo/utxo-staking
|
|
37
|
-
|
|
38
|
-
# 1.3.0 (2024-11-19)
|
|
39
|
-
|
|
40
|
-
### Features
|
|
41
|
-
|
|
42
|
-
- **utxo-staking:** build staking transaction ([73b33bc](https://github.com/BitGo/BitGoJS/commit/73b33bc93e46934fe5e6002c52c0b1443a3d0d8d))
|
|
43
|
-
- **utxo-staking:** create coredao staking outputs ([6b5ca4b](https://github.com/BitGo/BitGoJS/commit/6b5ca4b7c726fb6a4380526391416f6db356e0b7))
|
|
44
|
-
|
|
45
|
-
# 1.2.0 (2024-11-14)
|
|
46
|
-
|
|
47
|
-
### Features
|
|
48
|
-
|
|
49
|
-
- **utxo-staking:** build staking transaction ([73b33bc](https://github.com/BitGo/BitGoJS/commit/73b33bc93e46934fe5e6002c52c0b1443a3d0d8d))
|
|
50
|
-
- **utxo-staking:** create coredao staking outputs ([6b5ca4b](https://github.com/BitGo/BitGoJS/commit/6b5ca4b7c726fb6a4380526391416f6db356e0b7))
|
|
51
|
-
|
|
52
|
-
# 1.1.0 (2024-11-01)
|
|
53
|
-
|
|
54
|
-
### Bug Fixes
|
|
55
|
-
|
|
56
|
-
- **utxo-coredao:** clarifications from the coredao team ([56157b3](https://github.com/BitGo/BitGoJS/commit/56157b34e6802895489928d8e7a87f8f5c8129ed))
|
|
57
|
-
- **utxo-coredao:** fix json encoding to add newline ([bb5be2f](https://github.com/BitGo/BitGoJS/commit/bb5be2f91e0e7f1d59d94a1786fdd2cccc4ebad6))
|
|
58
|
-
|
|
59
|
-
### Features
|
|
60
|
-
|
|
61
|
-
- **utxo-coredao:** descriptor for CoreDao ([791f9e4](https://github.com/BitGo/BitGoJS/commit/791f9e47033a8224759d98f0483f5b0bb9bbc524))
|
|
62
|
-
- **utxo-coredao:** init repo and op-return ([60fa058](https://github.com/BitGo/BitGoJS/commit/60fa058f693cf722db8d5e7507539a5ec1c8b1a5))
|
|
63
|
-
- **utxo-coredao:** parse and verify op-return ([32dc7c4](https://github.com/BitGo/BitGoJS/commit/32dc7c49f0ff5baeb0db4a20853f70745f71c02b))
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.createMultiSigDescriptor = createMultiSigDescriptor;
|
|
4
|
-
function asDescriptorKey(key, neutered) {
|
|
5
|
-
if (Buffer.isBuffer(key)) {
|
|
6
|
-
return key.toString('hex');
|
|
7
|
-
}
|
|
8
|
-
return (neutered ? key.neutered() : key).toBase58() + '/*';
|
|
9
|
-
}
|
|
10
|
-
/**
|
|
11
|
-
* Create a multi-sig descriptor to produce a coredao staking address
|
|
12
|
-
* @param scriptType segwit or legacy
|
|
13
|
-
* @param locktime locktime for CLTV
|
|
14
|
-
* @param m Total number of keys required to unlock
|
|
15
|
-
* @param orderedKeys If Bip32Interfaces, these are xprvs or xpubs and are derivable.
|
|
16
|
-
* If they are buffers, then they are pub/prv keys and are not derivable.
|
|
17
|
-
* @param neutered If true, neuter the keys. Default to true
|
|
18
|
-
*/
|
|
19
|
-
function createMultiSigDescriptor(scriptType, locktime, m, orderedKeys, neutered = true) {
|
|
20
|
-
if (m > orderedKeys.length || m < 1) {
|
|
21
|
-
throw new Error(`m (${m}) must be less than or equal to the number of keys (${orderedKeys.length}) and greater than 0`);
|
|
22
|
-
}
|
|
23
|
-
if (locktime <= 0) {
|
|
24
|
-
throw new Error(`locktime (${locktime}) must be greater than 0`);
|
|
25
|
-
}
|
|
26
|
-
const keys = orderedKeys.map((key) => asDescriptorKey(key, neutered));
|
|
27
|
-
const inner = `and_v(r:after(${locktime}),multi(${m},${keys.join(',')}))`;
|
|
28
|
-
switch (scriptType) {
|
|
29
|
-
case 'sh':
|
|
30
|
-
return `sh(${inner})`;
|
|
31
|
-
case 'sh-wsh':
|
|
32
|
-
return `sh(wsh(${inner}))`;
|
|
33
|
-
case 'wsh':
|
|
34
|
-
return `wsh(${inner})`;
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVzY3JpcHRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb3JlRGFvL2Rlc2NyaXB0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUF5QkEsNERBeUJDO0FBekNELFNBQVMsZUFBZSxDQUFDLEdBQTRCLEVBQUUsUUFBaUI7SUFDdEUsSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDekIsT0FBTyxHQUFHLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzdCLENBQUM7SUFDRCxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsRUFBRSxHQUFHLElBQUksQ0FBQztBQUM3RCxDQUFDO0FBRUQ7Ozs7Ozs7O0dBUUc7QUFDSCxTQUFnQix3QkFBd0IsQ0FDdEMsVUFBc0IsRUFDdEIsUUFBZ0IsRUFDaEIsQ0FBUyxFQUNULFdBQXdDLEVBQ3hDLFFBQVEsR0FBRyxJQUFJO0lBRWYsSUFBSSxDQUFDLEdBQUcsV0FBVyxDQUFDLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDcEMsTUFBTSxJQUFJLEtBQUssQ0FDYixNQUFNLENBQUMsdURBQXVELFdBQVcsQ0FBQyxNQUFNLHNCQUFzQixDQUN2RyxDQUFDO0lBQ0osQ0FBQztJQUNELElBQUksUUFBUSxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQ2xCLE1BQU0sSUFBSSxLQUFLLENBQUMsYUFBYSxRQUFRLDBCQUEwQixDQUFDLENBQUM7SUFDbkUsQ0FBQztJQUNELE1BQU0sSUFBSSxHQUFHLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLGVBQWUsQ0FBQyxHQUFHLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQztJQUN0RSxNQUFNLEtBQUssR0FBRyxpQkFBaUIsUUFBUSxXQUFXLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUM7SUFDMUUsUUFBUSxVQUFVLEVBQUUsQ0FBQztRQUNuQixLQUFLLElBQUk7WUFDUCxPQUFPLE1BQU0sS0FBSyxHQUFHLENBQUM7UUFDeEIsS0FBSyxRQUFRO1lBQ1gsT0FBTyxVQUFVLEtBQUssSUFBSSxDQUFDO1FBQzdCLEtBQUssS0FBSztZQUNSLE9BQU8sT0FBTyxLQUFLLEdBQUcsQ0FBQztJQUMzQixDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJJUDMySW50ZXJmYWNlIH0gZnJvbSAnQGJpdGdvLWJldGEvdXR4by1saWInO1xuXG4vKipcbiAqIFNjcmlwdCB0eXBlIGZvciBhIGRlc2NyaXB0b3IuXG4gKlxuICogU2VlIGh0dHBzOi8vZG9jcy5jb3JlZGFvLm9yZy9kb2NzL0xlYXJuL3Byb2R1Y3RzL2J0Yy1zdGFraW5nL2Rlc2lnbiNwMnNocDJ3c2gtb3V0cHV0XG4gKi9cbmV4cG9ydCB0eXBlIFNjcmlwdFR5cGUgPSAnc2gnIHwgJ3NoLXdzaCcgfCAnd3NoJztcblxuZnVuY3Rpb24gYXNEZXNjcmlwdG9yS2V5KGtleTogQklQMzJJbnRlcmZhY2UgfCBCdWZmZXIsIG5ldXRlcmVkOiBib29sZWFuKTogc3RyaW5nIHtcbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihrZXkpKSB7XG4gICAgcmV0dXJuIGtleS50b1N0cmluZygnaGV4Jyk7XG4gIH1cbiAgcmV0dXJuIChuZXV0ZXJlZCA/IGtleS5uZXV0ZXJlZCgpIDoga2V5KS50b0Jhc2U1OCgpICsgJy8qJztcbn1cblxuLyoqXG4gKiBDcmVhdGUgYSBtdWx0aS1zaWcgZGVzY3JpcHRvciB0byBwcm9kdWNlIGEgY29yZWRhbyBzdGFraW5nIGFkZHJlc3NcbiAqIEBwYXJhbSBzY3JpcHRUeXBlIHNlZ3dpdCBvciBsZWdhY3lcbiAqIEBwYXJhbSBsb2NrdGltZSBsb2NrdGltZSBmb3IgQ0xUVlxuICogQHBhcmFtIG0gVG90YWwgbnVtYmVyIG9mIGtleXMgcmVxdWlyZWQgdG8gdW5sb2NrXG4gKiBAcGFyYW0gb3JkZXJlZEtleXMgSWYgQmlwMzJJbnRlcmZhY2VzLCB0aGVzZSBhcmUgeHBydnMgb3IgeHB1YnMgYW5kIGFyZSBkZXJpdmFibGUuXG4gKiAgICAgICAgICAgICAgICAgICAgSWYgdGhleSBhcmUgYnVmZmVycywgdGhlbiB0aGV5IGFyZSBwdWIvcHJ2IGtleXMgYW5kIGFyZSBub3QgZGVyaXZhYmxlLlxuICogQHBhcmFtIG5ldXRlcmVkIElmIHRydWUsIG5ldXRlciB0aGUga2V5cy4gRGVmYXVsdCB0byB0cnVlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVNdWx0aVNpZ0Rlc2NyaXB0b3IoXG4gIHNjcmlwdFR5cGU6IFNjcmlwdFR5cGUsXG4gIGxvY2t0aW1lOiBudW1iZXIsXG4gIG06IG51bWJlcixcbiAgb3JkZXJlZEtleXM6IChCSVAzMkludGVyZmFjZSB8IEJ1ZmZlcilbXSxcbiAgbmV1dGVyZWQgPSB0cnVlXG4pOiBzdHJpbmcge1xuICBpZiAobSA+IG9yZGVyZWRLZXlzLmxlbmd0aCB8fCBtIDwgMSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBtICgke219KSBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgbnVtYmVyIG9mIGtleXMgKCR7b3JkZXJlZEtleXMubGVuZ3RofSkgYW5kIGdyZWF0ZXIgdGhhbiAwYFxuICAgICk7XG4gIH1cbiAgaWYgKGxvY2t0aW1lIDw9IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYGxvY2t0aW1lICgke2xvY2t0aW1lfSkgbXVzdCBiZSBncmVhdGVyIHRoYW4gMGApO1xuICB9XG4gIGNvbnN0IGtleXMgPSBvcmRlcmVkS2V5cy5tYXAoKGtleSkgPT4gYXNEZXNjcmlwdG9yS2V5KGtleSwgbmV1dGVyZWQpKTtcbiAgY29uc3QgaW5uZXIgPSBgYW5kX3YocjphZnRlcigke2xvY2t0aW1lfSksbXVsdGkoJHttfSwke2tleXMuam9pbignLCcpfSkpYDtcbiAgc3dpdGNoIChzY3JpcHRUeXBlKSB7XG4gICAgY2FzZSAnc2gnOlxuICAgICAgcmV0dXJuIGBzaCgke2lubmVyfSlgO1xuICAgIGNhc2UgJ3NoLXdzaCc6XG4gICAgICByZXR1cm4gYHNoKHdzaCgke2lubmVyfSkpYDtcbiAgICBjYXNlICd3c2gnOlxuICAgICAgcmV0dXJuIGB3c2goJHtpbm5lcn0pYDtcbiAgfVxufVxuIl19
|