Skip to content

Commit 47d6527

Browse files
Merge pull request #5790 from BitGo/BTC-1933.sync-params-script
feat(utxo-staking): add babylon params sync script and manager
2 parents 8103f26 + c743316 commit 47d6527

File tree

13 files changed

+480
-125
lines changed

13 files changed

+480
-125
lines changed
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
.nyc_output/
22
dist/
3+
src/babylon/*.json
34
test/fixtures
45
test/unit/babylon/vendor/btc-staking-ts

modules/utxo-staking/package.json

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,12 @@
4545
"@bitgo/utxo-core": "^1.5.0",
4646
"@bitgo/utxo-lib": "^11.2.4",
4747
"@bitgo/wasm-miniscript": "2.0.0-beta.7",
48-
"bitcoinjs-lib": "^6.1.7"
48+
"bitcoinjs-lib": "^6.1.7",
49+
"fp-ts": "^2.16.2",
50+
"io-ts": "npm:@bitgo-forks/[email protected]",
51+
"io-ts-types": "^0.5.19"
52+
},
53+
"devDependencies": {
54+
"yargs": "^17.7.2"
4955
}
5056
}
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
import * as fs from 'fs/promises';
2+
3+
import yargs from 'yargs';
4+
import { hideBin } from 'yargs/helpers';
5+
6+
function getBaseUrl(network: 'mainnet' | 'testnet') {
7+
if (network === 'mainnet') {
8+
throw new Error('Mainnet not supported');
9+
}
10+
return 'https://babylon-testnet-api.nodes.guru';
11+
}
12+
13+
type BabylonNetwork = 'mainnet' | 'testnet';
14+
15+
async function getParams(network: BabylonNetwork, version: number): Promise<unknown> {
16+
const url = `${getBaseUrl(network)}/babylon/btcstaking/v1/params/${version}`;
17+
const resp = await fetch(url);
18+
if (!resp.ok) {
19+
throw new Error(`Failed to fetch ${url}: ${resp.statusText}`);
20+
}
21+
return await resp.json();
22+
}
23+
24+
async function getAllParams(network: BabylonNetwork): Promise<unknown[]> {
25+
const params: unknown[] = [];
26+
for (let i = 0; ; i++) {
27+
try {
28+
const p = await getParams(network, i);
29+
params.push(p);
30+
} catch (e) {
31+
console.error(`error fetching ${network} params version ${i}: ${e.message}`);
32+
break;
33+
}
34+
}
35+
return params;
36+
}
37+
38+
async function syncParams(network: BabylonNetwork | undefined): Promise<void> {
39+
if (network === undefined) {
40+
await syncParams('testnet');
41+
await syncParams('mainnet');
42+
return;
43+
}
44+
45+
const allParams = await getAllParams(network);
46+
const filename = __dirname + `/../src/babylon/params.${network}.json`;
47+
await fs.writeFile(filename, JSON.stringify(allParams, null, 2) + '\n');
48+
console.log(`Wrote ${allParams.length} params to ${filename}`);
49+
}
50+
51+
yargs(hideBin(process.argv))
52+
.command({
53+
command: 'sync-babylon-params',
54+
describe: 'Sync Babylon params',
55+
builder(b) {
56+
return b.option('network', {
57+
choices: ['mainnet', 'testnet'] as const,
58+
description: 'Network',
59+
});
60+
},
61+
async handler(argv) {
62+
await syncParams(argv.network);
63+
},
64+
})
65+
.demandCommand()
66+
.help()
67+
.strict().argv;

modules/utxo-staking/src/babylon/delegationMessage.ts

Lines changed: 10 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -3,24 +3,20 @@ import assert from 'assert';
33
import * as vendor from '@bitgo/babylonlabs-io-btc-staking-ts';
44
import * as babylonProtobuf from '@babylonlabs-io/babylon-proto-ts';
55
import * as bitcoinjslib from 'bitcoinjs-lib';
6-
import { ECPairInterface } from '@bitgo/utxo-lib';
6+
import * as utxolib from '@bitgo/utxo-lib';
77
import { Descriptor } from '@bitgo/wasm-miniscript';
88
import { toWrappedPsbt } from '@bitgo/utxo-core/descriptor';
99

1010
import { BabylonDescriptorBuilder } from './descriptor';
11-
12-
export const mockBabylonProvider: vendor.BabylonProvider = {
13-
signTransaction(): Promise<Uint8Array> {
14-
throw new Error('Function not implemented.');
15-
},
16-
};
11+
import { createStakingManager } from './stakingManager';
12+
import { getStakingParams } from './stakingParams';
1713

1814
export type ValueWithTypeUrl<T> = { typeUrl: string; value: T };
1915

2016
export function getSignedPsbt(
2117
psbt: bitcoinjslib.Psbt,
2218
descriptor: Descriptor,
23-
signers: ECPairInterface[],
19+
signers: utxolib.ECPairInterface[],
2420
{ finalize = false }
2521
): bitcoinjslib.Psbt {
2622
const wrappedPsbt = toWrappedPsbt(psbt.toBuffer());
@@ -45,12 +41,12 @@ export function getSignedPsbt(
4541

4642
export function getBtcProviderForECKey(
4743
descriptorBuilder: BabylonDescriptorBuilder,
48-
stakerKey: ECPairInterface
44+
stakerKey: utxolib.ECPairInterface
4945
): vendor.BtcProvider {
5046
function signWithDescriptor(
5147
psbt: bitcoinjslib.Psbt,
5248
descriptor: Descriptor,
53-
key: ECPairInterface
49+
key: utxolib.ECPairInterface
5450
): bitcoinjslib.Psbt {
5551
psbt = getSignedPsbt(psbt, descriptor, [key], { finalize: false });
5652
// BUG: we need to blindly finalize here even though we have not fully signed
@@ -145,19 +141,19 @@ export async function createUnsignedPreStakeRegistrationBabylonTransaction(
145141

146142
export async function createUnsignedPreStakeRegistrationBabylonTransactionWithBtcProvider(
147143
btcProvider: vendor.BtcProvider,
148-
stakingParams: vendor.VersionedStakingParams,
149144
network: bitcoinjslib.Network,
150145
stakerBtcInfo: vendor.StakerInfo,
151146
stakingInput: vendor.StakingInputs,
152147
babylonBtcTipHeight: number,
153148
inputUTXOs: vendor.UTXO[],
154149
feeRateSatB: number,
155-
babylonAddress: string
150+
babylonAddress: string,
151+
stakingParams: vendor.VersionedStakingParams[] = getStakingParams(network)
156152
): Promise<Result> {
157-
const manager = new vendor.BabylonBtcStakingManager(network, [stakingParams], btcProvider, mockBabylonProvider);
153+
const manager = createStakingManager(network, btcProvider, stakingParams);
158154
return await createUnsignedPreStakeRegistrationBabylonTransaction(
159155
manager,
160-
[stakingParams],
156+
stakingParams,
161157
network,
162158
stakerBtcInfo,
163159
stakingInput,
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
export * from './delegationMessage';
22
export * from './descriptor';
33
export * from './stakingParams';
4+
export * from './stakingManager';
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
[]
Lines changed: 205 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,205 @@
1+
[
2+
{
3+
"params": {
4+
"covenant_pks": [
5+
"49766ccd9e3cd94343e2040474a77fb37cdfd30530d05f9f1e96ae1e2102c86e",
6+
"76d1ae01f8fb6bf30108731c884cddcf57ef6eef2d9d9559e130894e0e40c62c",
7+
"17921cf156ccb4e73d428f996ed11b245313e37e27c978ac4d2cc21eca4672e4",
8+
"113c3a32a9d320b72190a04a020a0db3976ef36972673258e9a38a364f3dc3b0",
9+
"79a71ffd71c503ef2e2f91bccfc8fcda7946f4653cef0d9f3dde20795ef3b9f0",
10+
"3bb93dfc8b61887d771f3630e9a63e97cbafcfcc78556a474df83a31a0ef899c",
11+
"d21faf78c6751a0d38e6bd8028b907ff07e9a869a43fc837d6b3f8dff6119a36",
12+
"40afaf47c4ffa56de86410d8e47baa2bb6f04b604f4ea24323737ddc3fe092df",
13+
"f5199efae3f28bb82476163a7e458c7ad445d9bffb0682d10d3bdb2cb41f8e8e"
14+
],
15+
"covenant_quorum": 6,
16+
"min_staking_value_sat": "50000",
17+
"max_staking_value_sat": "5000000",
18+
"min_staking_time_blocks": 64000,
19+
"max_staking_time_blocks": 64000,
20+
"slashing_pk_script": "dqkUAQEBAQEBAQEBAQEBAQEBAQEBAQGIrA==",
21+
"min_slashing_tx_fee_sat": "1000",
22+
"slashing_rate": "0.100000000000000000",
23+
"unbonding_time_blocks": 1008,
24+
"unbonding_fee_sat": "2000",
25+
"min_commission_rate": "0.030000000000000000",
26+
"delegation_creation_base_gas_fee": "1000",
27+
"allow_list_expiration_height": "26120",
28+
"btc_activation_height": 197535
29+
}
30+
},
31+
{
32+
"params": {
33+
"covenant_pks": [
34+
"09585ab55a971a231c945790a0a81df754e5a07263a5c20829931cc24683bbb7",
35+
"76d1ae01f8fb6bf30108731c884cddcf57ef6eef2d9d9559e130894e0e40c62c",
36+
"17921cf156ccb4e73d428f996ed11b245313e37e27c978ac4d2cc21eca4672e4",
37+
"113c3a32a9d320b72190a04a020a0db3976ef36972673258e9a38a364f3dc3b0",
38+
"79a71ffd71c503ef2e2f91bccfc8fcda7946f4653cef0d9f3dde20795ef3b9f0",
39+
"3bb93dfc8b61887d771f3630e9a63e97cbafcfcc78556a474df83a31a0ef899c",
40+
"d21faf78c6751a0d38e6bd8028b907ff07e9a869a43fc837d6b3f8dff6119a36",
41+
"40afaf47c4ffa56de86410d8e47baa2bb6f04b604f4ea24323737ddc3fe092df",
42+
"f5199efae3f28bb82476163a7e458c7ad445d9bffb0682d10d3bdb2cb41f8e8e"
43+
],
44+
"covenant_quorum": 6,
45+
"min_staking_value_sat": "50000",
46+
"max_staking_value_sat": "5000000",
47+
"min_staking_time_blocks": 64000,
48+
"max_staking_time_blocks": 64000,
49+
"slashing_pk_script": "dqkUAQEBAQEBAQEBAQEBAQEBAQEBAQGIrA==",
50+
"min_slashing_tx_fee_sat": "1000",
51+
"slashing_rate": "0.100000000000000000",
52+
"unbonding_time_blocks": 1008,
53+
"unbonding_fee_sat": "10000",
54+
"min_commission_rate": "0.030000000000000000",
55+
"delegation_creation_base_gas_fee": "1000",
56+
"allow_list_expiration_height": "26120",
57+
"btc_activation_height": 198665
58+
}
59+
},
60+
{
61+
"params": {
62+
"covenant_pks": [
63+
"fa9d882d45f4060bdb8042183828cd87544f1ea997380e586cab77d5fd698737",
64+
"0aee0509b16db71c999238a4827db945526859b13c95487ab46725357c9a9f25",
65+
"17921cf156ccb4e73d428f996ed11b245313e37e27c978ac4d2cc21eca4672e4",
66+
"113c3a32a9d320b72190a04a020a0db3976ef36972673258e9a38a364f3dc3b0",
67+
"79a71ffd71c503ef2e2f91bccfc8fcda7946f4653cef0d9f3dde20795ef3b9f0",
68+
"3bb93dfc8b61887d771f3630e9a63e97cbafcfcc78556a474df83a31a0ef899c",
69+
"d21faf78c6751a0d38e6bd8028b907ff07e9a869a43fc837d6b3f8dff6119a36",
70+
"40afaf47c4ffa56de86410d8e47baa2bb6f04b604f4ea24323737ddc3fe092df",
71+
"f5199efae3f28bb82476163a7e458c7ad445d9bffb0682d10d3bdb2cb41f8e8e"
72+
],
73+
"covenant_quorum": 6,
74+
"min_staking_value_sat": "50000",
75+
"max_staking_value_sat": "5000000",
76+
"min_staking_time_blocks": 64000,
77+
"max_staking_time_blocks": 64000,
78+
"slashing_pk_script": "dqkUAQEBAQEBAQEBAQEBAQEBAQEBAQGIrA==",
79+
"min_slashing_tx_fee_sat": "1000",
80+
"slashing_rate": "0.100000000000000000",
81+
"unbonding_time_blocks": 1008,
82+
"unbonding_fee_sat": "10000",
83+
"min_commission_rate": "0.030000000000000000",
84+
"delegation_creation_base_gas_fee": "1000",
85+
"allow_list_expiration_height": "26120",
86+
"btc_activation_height": 200665
87+
}
88+
},
89+
{
90+
"params": {
91+
"covenant_pks": [
92+
"fa9d882d45f4060bdb8042183828cd87544f1ea997380e586cab77d5fd698737",
93+
"0aee0509b16db71c999238a4827db945526859b13c95487ab46725357c9a9f25",
94+
"17921cf156ccb4e73d428f996ed11b245313e37e27c978ac4d2cc21eca4672e4",
95+
"113c3a32a9d320b72190a04a020a0db3976ef36972673258e9a38a364f3dc3b0",
96+
"79a71ffd71c503ef2e2f91bccfc8fcda7946f4653cef0d9f3dde20795ef3b9f0",
97+
"3bb93dfc8b61887d771f3630e9a63e97cbafcfcc78556a474df83a31a0ef899c",
98+
"d21faf78c6751a0d38e6bd8028b907ff07e9a869a43fc837d6b3f8dff6119a36",
99+
"40afaf47c4ffa56de86410d8e47baa2bb6f04b604f4ea24323737ddc3fe092df",
100+
"f5199efae3f28bb82476163a7e458c7ad445d9bffb0682d10d3bdb2cb41f8e8e"
101+
],
102+
"covenant_quorum": 6,
103+
"min_staking_value_sat": "50000",
104+
"max_staking_value_sat": "50000000",
105+
"min_staking_time_blocks": 64000,
106+
"max_staking_time_blocks": 64000,
107+
"slashing_pk_script": "dqkUAQEBAQEBAQEBAQEBAQEBAQEBAQGIrA==",
108+
"min_slashing_tx_fee_sat": "1000",
109+
"slashing_rate": "0.100000000000000000",
110+
"unbonding_time_blocks": 1008,
111+
"unbonding_fee_sat": "5000",
112+
"min_commission_rate": "0.030000000000000000",
113+
"delegation_creation_base_gas_fee": "1000",
114+
"allow_list_expiration_height": "26120",
115+
"btc_activation_height": 215968
116+
}
117+
},
118+
{
119+
"params": {
120+
"covenant_pks": [
121+
"fa9d882d45f4060bdb8042183828cd87544f1ea997380e586cab77d5fd698737",
122+
"0aee0509b16db71c999238a4827db945526859b13c95487ab46725357c9a9f25",
123+
"17921cf156ccb4e73d428f996ed11b245313e37e27c978ac4d2cc21eca4672e4",
124+
"113c3a32a9d320b72190a04a020a0db3976ef36972673258e9a38a364f3dc3b0",
125+
"79a71ffd71c503ef2e2f91bccfc8fcda7946f4653cef0d9f3dde20795ef3b9f0",
126+
"3bb93dfc8b61887d771f3630e9a63e97cbafcfcc78556a474df83a31a0ef899c",
127+
"d21faf78c6751a0d38e6bd8028b907ff07e9a869a43fc837d6b3f8dff6119a36",
128+
"40afaf47c4ffa56de86410d8e47baa2bb6f04b604f4ea24323737ddc3fe092df",
129+
"f5199efae3f28bb82476163a7e458c7ad445d9bffb0682d10d3bdb2cb41f8e8e"
130+
],
131+
"covenant_quorum": 6,
132+
"min_staking_value_sat": "50000",
133+
"max_staking_value_sat": "50000000",
134+
"min_staking_time_blocks": 64000,
135+
"max_staking_time_blocks": 64000,
136+
"slashing_pk_script": "dqkUAQEBAQEBAQEBAQEBAQEBAQEBAQGIrA==",
137+
"min_slashing_tx_fee_sat": "1000",
138+
"slashing_rate": "0.100000000000000000",
139+
"unbonding_time_blocks": 1008,
140+
"unbonding_fee_sat": "5000",
141+
"min_commission_rate": "0.030000000000000000",
142+
"delegation_creation_base_gas_fee": "1000",
143+
"allow_list_expiration_height": "26120",
144+
"btc_activation_height": 220637
145+
}
146+
},
147+
{
148+
"params": {
149+
"covenant_pks": [
150+
"fa9d882d45f4060bdb8042183828cd87544f1ea997380e586cab77d5fd698737",
151+
"0aee0509b16db71c999238a4827db945526859b13c95487ab46725357c9a9f25",
152+
"17921cf156ccb4e73d428f996ed11b245313e37e27c978ac4d2cc21eca4672e4",
153+
"113c3a32a9d320b72190a04a020a0db3976ef36972673258e9a38a364f3dc3b0",
154+
"79a71ffd71c503ef2e2f91bccfc8fcda7946f4653cef0d9f3dde20795ef3b9f0",
155+
"3bb93dfc8b61887d771f3630e9a63e97cbafcfcc78556a474df83a31a0ef899c",
156+
"d21faf78c6751a0d38e6bd8028b907ff07e9a869a43fc837d6b3f8dff6119a36",
157+
"40afaf47c4ffa56de86410d8e47baa2bb6f04b604f4ea24323737ddc3fe092df",
158+
"f5199efae3f28bb82476163a7e458c7ad445d9bffb0682d10d3bdb2cb41f8e8e"
159+
],
160+
"covenant_quorum": 6,
161+
"min_staking_value_sat": "50000",
162+
"max_staking_value_sat": "35000000000",
163+
"min_staking_time_blocks": 10000,
164+
"max_staking_time_blocks": 64000,
165+
"slashing_pk_script": "ABRb4SYk0IorQkCV18ByIcM0UNFL8Q==",
166+
"min_slashing_tx_fee_sat": "5000",
167+
"slashing_rate": "0.050000000000000000",
168+
"unbonding_time_blocks": 1008,
169+
"unbonding_fee_sat": "2000",
170+
"min_commission_rate": "0.030000000000000000",
171+
"delegation_creation_base_gas_fee": "1095000",
172+
"allow_list_expiration_height": "26124",
173+
"btc_activation_height": 227174
174+
}
175+
},
176+
{
177+
"params": {
178+
"covenant_pks": [
179+
"fa9d882d45f4060bdb8042183828cd87544f1ea997380e586cab77d5fd698737",
180+
"0aee0509b16db71c999238a4827db945526859b13c95487ab46725357c9a9f25",
181+
"17921cf156ccb4e73d428f996ed11b245313e37e27c978ac4d2cc21eca4672e4",
182+
"113c3a32a9d320b72190a04a020a0db3976ef36972673258e9a38a364f3dc3b0",
183+
"79a71ffd71c503ef2e2f91bccfc8fcda7946f4653cef0d9f3dde20795ef3b9f0",
184+
"3bb93dfc8b61887d771f3630e9a63e97cbafcfcc78556a474df83a31a0ef899c",
185+
"d21faf78c6751a0d38e6bd8028b907ff07e9a869a43fc837d6b3f8dff6119a36",
186+
"40afaf47c4ffa56de86410d8e47baa2bb6f04b604f4ea24323737ddc3fe092df",
187+
"f5199efae3f28bb82476163a7e458c7ad445d9bffb0682d10d3bdb2cb41f8e8e"
188+
],
189+
"covenant_quorum": 6,
190+
"min_staking_value_sat": "50000",
191+
"max_staking_value_sat": "35000000000",
192+
"min_staking_time_blocks": 10000,
193+
"max_staking_time_blocks": 64000,
194+
"slashing_pk_script": "ABRb4SYk0IorQkCV18ByIcM0UNFL8Q==",
195+
"min_slashing_tx_fee_sat": "6000",
196+
"slashing_rate": "0.050000000000000000",
197+
"unbonding_time_blocks": 1008,
198+
"unbonding_fee_sat": "2000",
199+
"min_commission_rate": "0.030000000000000000",
200+
"delegation_creation_base_gas_fee": "1095000",
201+
"allow_list_expiration_height": "26124",
202+
"btc_activation_height": 235952
203+
}
204+
}
205+
]

0 commit comments

Comments
 (0)