@bitgo/utxo-staking 1.24.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 +27 -11
- 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,38 @@
|
|
|
1
|
+
import * as vendor from '@bitgo/babylonlabs-io-btc-staking-ts';
|
|
2
|
+
import * as babylonProtobuf from '@babylonlabs-io/babylon-proto-ts';
|
|
3
|
+
import * as bitcoinjslib from 'bitcoinjs-lib';
|
|
4
|
+
import * as utxolib from '@bitgo/utxo-lib';
|
|
5
|
+
import { Descriptor } from '@bitgo/wasm-utxo';
|
|
6
|
+
import { BabylonDescriptorBuilder } from './descriptor';
|
|
7
|
+
import { BabylonNetworkLike } from './network';
|
|
8
|
+
export type ValueWithTypeUrl<T> = {
|
|
9
|
+
typeUrl: string;
|
|
10
|
+
value: T;
|
|
11
|
+
};
|
|
12
|
+
export declare function getSignedPsbt(psbt: bitcoinjslib.Psbt, descriptor: Descriptor, signers: utxolib.ECPairInterface[], { finalize }: {
|
|
13
|
+
finalize?: boolean | undefined;
|
|
14
|
+
}): bitcoinjslib.Psbt;
|
|
15
|
+
/**
|
|
16
|
+
* Utility method to work around a bug in btc-staking-ts
|
|
17
|
+
* https://github.com/babylonlabs-io/btc-staking-ts/issues/71
|
|
18
|
+
* @param v
|
|
19
|
+
* @param network
|
|
20
|
+
*/
|
|
21
|
+
export declare function forceFinalizePsbt(v: Buffer | utxolib.Psbt | bitcoinjslib.Psbt, network: BabylonNetworkLike): bitcoinjslib.Psbt;
|
|
22
|
+
export declare function getBtcProviderForECKey(descriptorBuilder: BabylonDescriptorBuilder, stakerKey: utxolib.ECPairInterface): vendor.BtcProvider;
|
|
23
|
+
type Result = {
|
|
24
|
+
unsignedDelegationMsg: ValueWithTypeUrl<babylonProtobuf.btcstakingtx.MsgCreateBTCDelegation>;
|
|
25
|
+
stakingTx: bitcoinjslib.Transaction;
|
|
26
|
+
};
|
|
27
|
+
/**
|
|
28
|
+
* @param stakingKey - this is the single-sig key that is used for co-signing the staking output
|
|
29
|
+
* @param changeAddress - this is unrelated to the staking key and is used for the change output
|
|
30
|
+
*/
|
|
31
|
+
export declare function toStakerInfo(stakingKey: utxolib.ECPairInterface | Buffer | string, changeAddress: string): vendor.StakerInfo;
|
|
32
|
+
export declare function createStaking(network: BabylonNetworkLike, blockHeight: number, stakerBtcInfo: vendor.StakerInfo, stakingInput: vendor.StakingInputs, versionedParams?: vendor.VersionedStakingParams[]): vendor.Staking;
|
|
33
|
+
type TransactionLike = bitcoinjslib.Psbt | bitcoinjslib.Transaction | utxolib.Transaction | utxolib.bitgo.UtxoTransaction<bigint | number> | utxolib.Psbt | utxolib.bitgo.UtxoPsbt;
|
|
34
|
+
export declare function toStakingTransaction(tx: TransactionLike): bitcoinjslib.Transaction;
|
|
35
|
+
export declare function createDelegationMessageWithTransaction(channel: 'delegation:create' | 'delegation:register', manager: vendor.BabylonBtcStakingManager, staking: vendor.Staking, stakingAmountSat: number, transaction: TransactionLike, babylonAddress: string): Promise<ValueWithTypeUrl<babylonProtobuf.btcstakingtx.MsgCreateBTCDelegation>>;
|
|
36
|
+
export declare function createUnsignedPreStakeRegistrationBabylonTransactionWithBtcProvider(btcProvider: vendor.BtcProvider, network: bitcoinjslib.Network, stakerBtcInfo: vendor.StakerInfo, stakingInput: vendor.StakingInputs, babylonBtcTipHeight: number, inputUTXOs: vendor.UTXO[], feeRateSatB: number, babylonAddress: string, channel: 'delegation:create' | 'delegation:register', stakingParams?: vendor.VersionedStakingParams[]): Promise<Result>;
|
|
37
|
+
export {};
|
|
38
|
+
//# sourceMappingURL=delegationMessage.d.ts.map
|
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* https://github.com/babylonlabs-io/babylon/blob/v1.99.0-snapshot.250211/x/btcstaking/types/validate_parsed_message.go
|
|
3
|
+
*/
|
|
4
|
+
import assert from 'assert';
|
|
5
|
+
import { BIP322 } from 'bip322-js';
|
|
6
|
+
import * as vendor from '@bitgo/babylonlabs-io-btc-staking-ts';
|
|
7
|
+
import * as bitcoinjslib from 'bitcoinjs-lib';
|
|
8
|
+
import * as utxolib from '@bitgo/utxo-lib';
|
|
9
|
+
import { toXOnlyPublicKey } from '@bitgo/utxo-core';
|
|
10
|
+
import { signWithKey, toWrappedPsbt } from '@bitgo/utxo-core/descriptor';
|
|
11
|
+
import { createStakingManager } from './stakingManager';
|
|
12
|
+
import { getStakingParams } from './stakingParams';
|
|
13
|
+
import { toBitcoinJsNetwork } from './network';
|
|
14
|
+
/**
|
|
15
|
+
* Decode a hex or base64 encoded string and check if the length is valid.
|
|
16
|
+
* @param v
|
|
17
|
+
* @param encoding
|
|
18
|
+
*/
|
|
19
|
+
function decodeCheck(v, encoding) {
|
|
20
|
+
const result = Buffer.from(v, encoding);
|
|
21
|
+
if (result.toString(encoding).length !== v.length) {
|
|
22
|
+
throw new Error(`Invalid ${encoding} encoding`);
|
|
23
|
+
}
|
|
24
|
+
return result;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Convert a Buffer or string to a base64 encoded string.
|
|
28
|
+
* @param v
|
|
29
|
+
*/
|
|
30
|
+
function toBase64(v) {
|
|
31
|
+
if (typeof v === 'string') {
|
|
32
|
+
for (const encoding of ['base64', 'hex']) {
|
|
33
|
+
try {
|
|
34
|
+
return toBase64(decodeCheck(v, encoding));
|
|
35
|
+
}
|
|
36
|
+
catch (e) {
|
|
37
|
+
// try next
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
throw new Error(`Invalid base64 or hex encoding: ${v}`);
|
|
41
|
+
}
|
|
42
|
+
return v.toString('base64');
|
|
43
|
+
}
|
|
44
|
+
export function getSignedPsbt(psbt, descriptor, signers, { finalize = false }) {
|
|
45
|
+
const wrappedPsbt = toWrappedPsbt(psbt.toBuffer());
|
|
46
|
+
const signedInputs = psbt.data.inputs.flatMap((input, i) => {
|
|
47
|
+
assert(input.witnessUtxo);
|
|
48
|
+
if (Buffer.from(descriptor.scriptPubkey()).equals(input.witnessUtxo.script)) {
|
|
49
|
+
wrappedPsbt.updateInputWithDescriptor(i, descriptor);
|
|
50
|
+
const signResults = signers.map((signer) => {
|
|
51
|
+
assert(signer.privateKey);
|
|
52
|
+
return wrappedPsbt.signWithPrv(signer.privateKey);
|
|
53
|
+
});
|
|
54
|
+
return [[i, signResults]];
|
|
55
|
+
}
|
|
56
|
+
return [];
|
|
57
|
+
});
|
|
58
|
+
assert(signedInputs.length > 0);
|
|
59
|
+
if (finalize) {
|
|
60
|
+
wrappedPsbt.finalize();
|
|
61
|
+
}
|
|
62
|
+
return bitcoinjslib.Psbt.fromBuffer(Buffer.from(wrappedPsbt.serialize()));
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Utility method to work around a bug in btc-staking-ts
|
|
66
|
+
* https://github.com/babylonlabs-io/btc-staking-ts/issues/71
|
|
67
|
+
* @param v
|
|
68
|
+
* @param network
|
|
69
|
+
*/
|
|
70
|
+
export function forceFinalizePsbt(v, network) {
|
|
71
|
+
if (v instanceof utxolib.Psbt) {
|
|
72
|
+
v = v.toBuffer();
|
|
73
|
+
}
|
|
74
|
+
if (v instanceof bitcoinjslib.Psbt) {
|
|
75
|
+
v = v.toBuffer();
|
|
76
|
+
}
|
|
77
|
+
const psbt = bitcoinjslib.Psbt.fromBuffer(v, { network: toBitcoinJsNetwork(network) });
|
|
78
|
+
// this only works with certain bitcoinjslib versions
|
|
79
|
+
psbt.finalizeAllInputs();
|
|
80
|
+
return psbt;
|
|
81
|
+
}
|
|
82
|
+
export function getBtcProviderForECKey(descriptorBuilder, stakerKey) {
|
|
83
|
+
function signWithDescriptor(psbt, descriptor, key) {
|
|
84
|
+
psbt = getSignedPsbt(psbt, descriptor, [key], { finalize: false });
|
|
85
|
+
// BUG: we need to blindly finalize here even though we have not fully signed
|
|
86
|
+
psbt.finalizeAllInputs();
|
|
87
|
+
return psbt;
|
|
88
|
+
}
|
|
89
|
+
function signBip322Simple(message) {
|
|
90
|
+
// Get the script public key from the staking descriptor
|
|
91
|
+
const scriptPubKey = Buffer.from(descriptorBuilder.getStakingDescriptor().scriptPubkey());
|
|
92
|
+
const toSpendTx = BIP322.buildToSpendTx(message, scriptPubKey);
|
|
93
|
+
// Get the to_spend txid
|
|
94
|
+
const toSpendTxId = toSpendTx.getId();
|
|
95
|
+
// Create PSBT object for constructing the transaction
|
|
96
|
+
const toSignPsbt = new bitcoinjslib.Psbt();
|
|
97
|
+
toSignPsbt.setVersion(2); // nVersion = 0
|
|
98
|
+
toSignPsbt.setLocktime(0); // nLockTime = 0
|
|
99
|
+
toSignPsbt.addInput({
|
|
100
|
+
hash: toSpendTxId,
|
|
101
|
+
index: 0,
|
|
102
|
+
sequence: descriptorBuilder.stakingTimeLock,
|
|
103
|
+
witnessUtxo: {
|
|
104
|
+
script: scriptPubKey,
|
|
105
|
+
value: 0,
|
|
106
|
+
},
|
|
107
|
+
});
|
|
108
|
+
// Sign the PSBT with the staker key
|
|
109
|
+
const wrappedPsbt = toWrappedPsbt(toSignPsbt.toBuffer());
|
|
110
|
+
wrappedPsbt.updateInputWithDescriptor(0, descriptorBuilder.getStakingDescriptor());
|
|
111
|
+
signWithKey(wrappedPsbt, stakerKey);
|
|
112
|
+
wrappedPsbt.finalize();
|
|
113
|
+
// Encode the witness data and return
|
|
114
|
+
return BIP322.encodeWitness(bitcoinjslib.Psbt.fromBuffer(Buffer.from(wrappedPsbt.serialize())));
|
|
115
|
+
}
|
|
116
|
+
return {
|
|
117
|
+
/**
|
|
118
|
+
* @param message
|
|
119
|
+
* @param type
|
|
120
|
+
* @returns Base64 encoded string
|
|
121
|
+
*/
|
|
122
|
+
async signMessage(message, type) {
|
|
123
|
+
switch (type) {
|
|
124
|
+
case 'ecdsa':
|
|
125
|
+
return toBase64(stakerKey.sign(Buffer.from(message, 'hex')));
|
|
126
|
+
case 'bip322-simple':
|
|
127
|
+
return toBase64(signBip322Simple(message));
|
|
128
|
+
default:
|
|
129
|
+
throw new Error(`unexpected type: ${type}`);
|
|
130
|
+
}
|
|
131
|
+
},
|
|
132
|
+
async signPsbt(psbtHex, options) {
|
|
133
|
+
const psbt = bitcoinjslib.Psbt.fromHex(psbtHex);
|
|
134
|
+
switch (options.action.name) {
|
|
135
|
+
case 'sign-btc-slashing-transaction':
|
|
136
|
+
return signWithDescriptor(psbt, descriptorBuilder.getStakingDescriptor(), stakerKey).toHex();
|
|
137
|
+
case 'sign-btc-unbonding-slashing-transaction':
|
|
138
|
+
return signWithDescriptor(psbt, descriptorBuilder.getUnbondingDescriptor(), stakerKey).toHex();
|
|
139
|
+
default:
|
|
140
|
+
throw new Error(`unexpected signing step: ${options.action.name}`);
|
|
141
|
+
}
|
|
142
|
+
},
|
|
143
|
+
/**
|
|
144
|
+
* This function is only used by btc-staking-ts to create a staking expansion registration
|
|
145
|
+
* transaction, which we do not currently support.
|
|
146
|
+
*/
|
|
147
|
+
async getTransactionHex(txid) {
|
|
148
|
+
throw new Error(`Unsupported operation getTransactionHex (txid=${txid})`);
|
|
149
|
+
},
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* @param stakingKey - this is the single-sig key that is used for co-signing the staking output
|
|
154
|
+
* @param changeAddress - this is unrelated to the staking key and is used for the change output
|
|
155
|
+
*/
|
|
156
|
+
export function toStakerInfo(stakingKey, changeAddress) {
|
|
157
|
+
if (typeof stakingKey === 'object' && 'publicKey' in stakingKey) {
|
|
158
|
+
stakingKey = stakingKey.publicKey;
|
|
159
|
+
}
|
|
160
|
+
if (typeof stakingKey === 'string') {
|
|
161
|
+
stakingKey = Buffer.from(stakingKey, 'hex');
|
|
162
|
+
}
|
|
163
|
+
return {
|
|
164
|
+
publicKeyNoCoordHex: toXOnlyPublicKey(stakingKey).toString('hex'),
|
|
165
|
+
address: changeAddress,
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
export function createStaking(network, blockHeight, stakerBtcInfo, stakingInput, versionedParams = getStakingParams(network)) {
|
|
169
|
+
if (blockHeight === 0) {
|
|
170
|
+
throw new Error('Babylon BTC tip height cannot be 0');
|
|
171
|
+
}
|
|
172
|
+
// Get the Babylon params based on the BTC tip height from Babylon chain
|
|
173
|
+
const params = vendor.getBabylonParamByBtcHeight(blockHeight, versionedParams);
|
|
174
|
+
return new vendor.Staking(toBitcoinJsNetwork(network), stakerBtcInfo, params, stakingInput.finalityProviderPksNoCoordHex, stakingInput.stakingTimelock);
|
|
175
|
+
}
|
|
176
|
+
function toStakingTransactionFromPsbt(psbt) {
|
|
177
|
+
if (!(psbt instanceof utxolib.bitgo.UtxoPsbt)) {
|
|
178
|
+
psbt = utxolib.bitgo.createPsbtFromBuffer(psbt.toBuffer(), utxolib.networks.bitcoin);
|
|
179
|
+
}
|
|
180
|
+
if (psbt instanceof utxolib.bitgo.UtxoPsbt) {
|
|
181
|
+
// only utxolib.bitgo.UtxoPsbt has the getUnsignedTx method
|
|
182
|
+
return bitcoinjslib.Transaction.fromHex(psbt.getUnsignedTx().toHex());
|
|
183
|
+
}
|
|
184
|
+
throw new Error('illegal state');
|
|
185
|
+
}
|
|
186
|
+
export function toStakingTransaction(tx) {
|
|
187
|
+
if (tx instanceof bitcoinjslib.Psbt || tx instanceof utxolib.Psbt) {
|
|
188
|
+
return toStakingTransactionFromPsbt(tx);
|
|
189
|
+
}
|
|
190
|
+
return bitcoinjslib.Transaction.fromHex(tx.toHex());
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* As of babylonlabs-io/btc-staking-ts v1.5.7, the BTC delegation message creation functions support two message types:
|
|
194
|
+
* - MsgCreateBTCDelegation
|
|
195
|
+
* - MsgBtcStakeExpand
|
|
196
|
+
*
|
|
197
|
+
* BitGo still only supports MsgCreateBTCDelegation, so we need to check the message type here.
|
|
198
|
+
*
|
|
199
|
+
* @param msg - the message to check
|
|
200
|
+
* @return `true` if the message is of type MsgCreateBTCDelegation
|
|
201
|
+
*/
|
|
202
|
+
function isMsgBtcStakeExpand(msg) {
|
|
203
|
+
return 'previousStakingTxHash' in msg;
|
|
204
|
+
}
|
|
205
|
+
/*
|
|
206
|
+
* This is mostly lifted from
|
|
207
|
+
* https://github.com/babylonlabs-io/btc-staking-ts/blob/v0.4.0-rc.2/src/staking/manager.ts#L100-L172
|
|
208
|
+
*
|
|
209
|
+
* The difference is that here we are returning an _unsigned_ delegation message.
|
|
210
|
+
*/
|
|
211
|
+
export async function createDelegationMessageWithTransaction(channel, manager, staking, stakingAmountSat, transaction, babylonAddress) {
|
|
212
|
+
if (!vendor.isValidBabylonAddress(babylonAddress)) {
|
|
213
|
+
throw new Error('Invalid Babylon address');
|
|
214
|
+
}
|
|
215
|
+
// Create delegation message without including inclusion proof
|
|
216
|
+
const msg = await manager.createBtcDelegationMsg(channel, staking, {
|
|
217
|
+
stakingTimelock: staking.stakingTimelock,
|
|
218
|
+
finalityProviderPksNoCoordHex: staking.finalityProviderPksNoCoordHex,
|
|
219
|
+
stakingAmountSat,
|
|
220
|
+
}, toStakingTransaction(transaction), babylonAddress, staking.stakerInfo, staking.params);
|
|
221
|
+
// It shouldn't be possible for us to create a MsgBtcStakeExpand here because that only gets created when
|
|
222
|
+
// we pass channel = delegation:expand into createBtcDelegationMsg, which we cannot do.
|
|
223
|
+
if (isMsgBtcStakeExpand(msg.value)) {
|
|
224
|
+
throw new Error('MsgBtcStakeExpand is not supported');
|
|
225
|
+
}
|
|
226
|
+
return { ...msg, value: msg.value };
|
|
227
|
+
}
|
|
228
|
+
export async function createUnsignedPreStakeRegistrationBabylonTransactionWithBtcProvider(btcProvider, network, stakerBtcInfo, stakingInput, babylonBtcTipHeight, inputUTXOs, feeRateSatB, babylonAddress, channel, stakingParams = getStakingParams(network)) {
|
|
229
|
+
if (inputUTXOs.length === 0) {
|
|
230
|
+
throw new Error('No input UTXOs provided');
|
|
231
|
+
}
|
|
232
|
+
const manager = createStakingManager(network, btcProvider, stakingParams);
|
|
233
|
+
const staking = createStaking(network, babylonBtcTipHeight, stakerBtcInfo, stakingInput, stakingParams);
|
|
234
|
+
// Create unsigned staking transaction
|
|
235
|
+
const { transaction } = staking.createStakingTransaction(stakingInput.stakingAmountSat, inputUTXOs, feeRateSatB);
|
|
236
|
+
const unsignedDelegationMsg = await createDelegationMessageWithTransaction(channel, manager, staking, stakingInput.stakingAmountSat, transaction, babylonAddress);
|
|
237
|
+
return { unsignedDelegationMsg, stakingTx: transaction };
|
|
238
|
+
}
|
|
239
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVsZWdhdGlvbk1lc3NhZ2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYmFieWxvbi9kZWxlZ2F0aW9uTWVzc2FnZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUNILE9BQU8sTUFBTSxNQUFNLFFBQVEsQ0FBQztBQUU1QixPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ25DLE9BQU8sS0FBSyxNQUFNLE1BQU0sc0NBQXNDLENBQUM7QUFFL0QsT0FBTyxLQUFLLFlBQVksTUFBTSxlQUFlLENBQUM7QUFDOUMsT0FBTyxLQUFLLE9BQU8sTUFBTSxpQkFBaUIsQ0FBQztBQUUzQyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNwRCxPQUFPLEVBQUUsV0FBVyxFQUFFLGFBQWEsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBR3pFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ3hELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ25ELE9BQU8sRUFBc0Isa0JBQWtCLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFJbkU7Ozs7R0FJRztBQUNILFNBQVMsV0FBVyxDQUFDLENBQVMsRUFBRSxRQUEwQjtJQUN4RCxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUN4QyxJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNsRCxNQUFNLElBQUksS0FBSyxDQUFDLFdBQVcsUUFBUSxXQUFXLENBQUMsQ0FBQztJQUNsRCxDQUFDO0lBQ0QsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQUVEOzs7R0FHRztBQUNILFNBQVMsUUFBUSxDQUFDLENBQWtCO0lBQ2xDLElB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LEVBQ2xDLG1CQUEyQixFQUMzQixVQUF5QixFQUN6QixXQUFtQixFQUNuQixjQUFzQixFQUN0QixPQUFvRCxFQUNwRCxnQkFBaUQsZ0JBQWdCLENBQUMsT0FBTyxDQUFDO0lBRTFFLElBQUksVUFBVSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUM1QixNQUFNLElBQUksS0FBSyxDQUFDLHlCQUF5QixDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUNELE1BQU0sT0FBTyxHQUFHLG9CQUFvQixDQUFDLE9BQU8sRUFBRSxXQUFXLEVBQUUsYUFBYSxDQUFDLENBQUM7SUFDMUUsTUFBTSxPQUFPLEdBQUcsYUFBYSxDQUFDLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxhQUFhLEVBQUUsWUFBWSxFQUFFLGFBQWEsQ0FBQyxDQUFDO0lBQ3hHLHNDQUFzQztJQUN0QyxNQUFNLEVBQUUsV0FBVyxFQUFFLEdBQUcsT0FBTyxDQUFDLHdCQUF3QixDQUFDLFlBQVksQ0FBQyxnQkFBZ0IsRUFBRSxVQUFVLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFDakgsTUFBTSxxQkFBcUIsR0FBRyxNQUFNLHNDQUFzQyxDQUN4RSxPQUFPLEVBQ1AsT0FBTyxFQUNQLE9BQU8sRUFDUCxZQUFZLENBQUMsZ0JBQWdCLEVBQzdCLFdBQVcsRUFDWCxjQUFjLENBQ2YsQ0FBQztJQUNGLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLENBQUM7QUFDM0QsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogaHR0cHM6Ly9naXRodWIuY29tL2JhYnlsb25sYWJzLWlvL2JhYnlsb24vYmxvYi92MS45OS4wLXNuYXBzaG90LjI1MDIxMS94L2J0Y3N0YWtpbmcvdHlwZXMvdmFsaWRhdGVfcGFyc2VkX21lc3NhZ2UuZ29cbiAqL1xuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuXG5pbXBvcnQgeyBCSVAzMjIgfSBmcm9tICdiaXAzMjItanMnO1xuaW1wb3J0ICogYXMgdmVuZG9yIGZyb20gJ0BiaXRnby9iYWJ5bG9ubGFicy1pby1idGMtc3Rha2luZy10cyc7XG5pbXBvcnQgKiBhcyBiYWJ5bG9uUHJvdG9idWYgZnJvbSAnQGJhYnlsb25sYWJzLWlvL2JhYnlsb24tcHJvdG8tdHMnO1xuaW1wb3J0ICogYXMgYml0Y29pbmpzbGliIGZyb20gJ2JpdGNvaW5qcy1saWInO1xuaW1wb3J0ICogYXMgdXR4b2xpYiBmcm9tICdAYml0Z28vdXR4by1saWInO1xuaW1wb3J0IHsgRGVzY3JpcHRvciB9IGZyb20gJ0BiaXRnby93YXNtLXV0eG8nO1xuaW1wb3J0IHsgdG9YT25seVB1YmxpY0tleSB9IGZyb20gJ0BiaXRnby91dHhvLWNvcmUnO1xuaW1wb3J0IHsgc2lnbldpdGhLZXksIHRvV3JhcHBlZFBzYnQgfSBmcm9tICdAYml0Z28vdXR4by1jb3JlL2Rlc2NyaXB0b3InO1xuXG5pbXBvcnQgeyBCYWJ5bG9uRGVzY3JpcHRvckJ1aWxkZXIgfSBmcm9tICcuL2Rlc2NyaXB0b3InO1xuaW1wb3J0IHsgY3JlYXRlU3Rha2luZ01hbmFnZXIgfSBmcm9tICcuL3N0YWtpbmdNYW5hZ2VyJztcbmltcG9ydCB7IGdldFN0YWtpbmdQYXJhbXMgfSBmcm9tICcuL3N0YWtpbmdQYXJhbXMnO1xuaW1wb3J0IHsgQmFieWxvbk5ldHdvcmtMaWtlLCB0b0JpdGNvaW5Kc05ldHdvcmsgfSBmcm9tICcuL25ldHdvcmsnO1xuXG5leHBvcnQgdHlwZSBWYWx1ZVdpdGhUeXBlVXJsPFQ+ID0geyB0eXBlVXJsOiBzdHJpbmc7IHZhbHVlOiBUIH07XG5cbi8qKlxuICogRGVjb2RlIGEgaGV4IG9yIGJhc2U2NCBlbmNvZGVkIHN0cmluZyBhbmQgY2hlY2sgaWYgdGhlIGxlbmd0aCBpcyB2YWxpZC5cbiAqIEBwYXJhbSB2XG4gKiBAcGFyYW0gZW5jb2RpbmdcbiAqL1xuZnVuY3Rpb24gZGVjb2RlQ2hlY2sodjogc3RyaW5nLCBlbmNvZGluZzogJ2hleCcgfCAnYmFzZTY0Jykge1xuICBjb25zdCByZXN1bHQgPSBCdWZmZXIuZnJvbSh2LCBlbmNvZGluZyk7XG4gIGlmIChyZXN1bHQudG9TdHJpbmcoZW5jb2RpbmcpLmxlbmd0aCAhPT0gdi5sZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgJHtlbmNvZGluZ30gZW5jb2RpbmdgKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIENvbnZlcnQgYSBCdWZmZXIgb3Igc3RyaW5nIHRvIGEgYmFzZTY0IGVuY29kZWQgc3RyaW5nLlxuICogQHBhcmFtIHZcbiAqL1xuZnVuY3Rpb24gdG9CYXNlNjQodjogQnVmZmVyIHwgc3RyaW5nKSB7XG4gIGlmICh0eXBlb2YgdiA9PT0gJ3N0cmluZycpIHtcbiAgICBmb3IgKGNvbnN0IGVuY29kaW5nIG9mIFsnYmFzZTY0JywgJ2hleCddIGFzIGNvbnN0KSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gdG9CYXNlNjQoZGVjb2RlQ2hlY2sodiwgZW5jb2RpbmcpKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgLy8gdHJ5IG5leHRcbiAgICAgIH1cbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGJhc2U2NCBvciBoZXggZW5jb2Rpbmc6ICR7dn1gKTtcbiAgfVxuXG4gIHJldHVybiB2LnRvU3RyaW5nKCdiYXNlNjQnKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNpZ25lZFBzYnQoXG4gIHBzYnQ6IGJpdGNvaW5qc2xpYi5Qc2J0LFxuICBkZXNjcmlwdG9yOiBEZXNjcmlwdG9yLFxuICBzaWduZXJzOiB1dHhvbGliLkVDUGFpckludGVyZmFjZVtdLFxuICB7IGZpbmFsaXplID0gZmFsc2UgfVxuKTogYml0Y29pbmpzbGliLlBzYnQge1xuICBjb25zdCB3cmFwcGVkUHNidCA9IHRvV3JhcHBlZFBzYnQocHNidC50b0J1ZmZlcigpKTtcbiAgY29uc3Qgc2lnbmVkSW5wdXRzID0gcHNidC5kYXRhLmlucHV0cy5mbGF0TWFwKChpbnB1dCwgaSkgPT4ge1xuICAgIGFzc2VydChpbnB1dC53aXRuZXNzVXR4byk7XG4gICAgaWYgKEJ1ZmZlci5mcm9tKGRlc2NyaXB0b3Iuc2NyaXB0UHVia2V5KCkpLmVxdWFscyhpbnB1dC53aXRuZXNzVXR4by5zY3JpcHQpKSB7XG4gICAgICB3cmFwcGVkUHNidC51cGRhdGVJbnB1dFdpdGhEZXNjcmlwdG9yKGksIGRlc2NyaXB0b3IpO1xuICAgICAgY29uc3Qgc2lnblJlc3VsdHMgPSBzaWduZXJzLm1hcCgoc2lnbmVyKSA9PiB7XG4gICAgICAgIGFzc2VydChzaWduZXIucHJpdmF0ZUtleSk7XG4gICAgICAgIHJldHVybiB3cmFwcGVkUHNidC5zaWduV2l0aFBydihzaWduZXIucHJpdmF0ZUtleSk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBbW2ksIHNpZ25SZXN1bHRzXV07XG4gICAgfVxuICAgIHJldHVybiBbXTtcbiAgfSk7XG4gIGFzc2VydChzaWduZWRJbnB1dHMubGVuZ3RoID4gMCk7XG4gIGlmIChmaW5hbGl6ZSkge1xuICAgIHdyYXBwZWRQc2J0LmZpbmFsaXplKCk7XG4gIH1cbiAgcmV0dXJuIGJpdGNvaW5qc2xpYi5Qc2J0LmZyb21CdWZmZXIoQnVmZmVyLmZyb20od3JhcHBlZFBzYnQuc2VyaWFsaXplKCkpKTtcbn1cblxuLyoqXG4gKiBVdGlsaXR5IG1ldGhvZCB0byB3b3JrIGFyb3VuZCBhIGJ1ZyBpbiBidGMtc3Rha2luZy10c1xuICogaHR0cHM6Ly9naXRodWIuY29tL2JhYnlsb25sYWJzLWlvL2J0Yy1zdGFraW5nLXRzL2lzc3Vlcy83MVxuICogQHBhcmFtIHZcbiAqIEBwYXJhbSBuZXR3b3JrXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JjZUZpbmFsaXplUHNidChcbiAgdjogQnVmZmVyIHwgdXR4b2xpYi5Qc2J0IHwgYml0Y29pbmpzbGliLlBzYnQsXG4gIG5ldHdvcms6IEJhYnlsb25OZXR3b3JrTGlrZVxuKTogYml0Y29pbmpzbGliLlBzYnQge1xuICBpZiAodiBpbnN0YW5jZW9mIHV0eG9saWIuUHNidCkge1xuICAgIHYgPSB2LnRvQnVmZmVyKCk7XG4gIH1cbiAgaWYgKHYgaW5zdGFuY2VvZiBiaXRjb2luanNsaWIuUHNidCkge1xuICAgIHYgPSB2LnRvQnVmZmVyKCk7XG4gIH1cbiAgY29uc3QgcHNidCA9IGJpdGNvaW5qc2xpYi5Qc2J0LmZyb21CdWZmZXIodiwgeyBuZXR3b3JrOiB0b0JpdGNvaW5Kc05ldHdvcmsobmV0d29yaykgfSk7XG4gIC8vIHRoaXMgb25seSB3b3JrcyB3aXRoIGNlcnRhaW4gYml0Y29pbmpzbGliIHZlcnNpb25zXG4gIHBzYnQuZmluYWxpemVBbGxJbnB1dHMoKTtcbiAgcmV0dXJuIHBzYnQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRCdGNQcm92aWRlckZvckVDS2V5KFxuICBkZXNjcmlwdG9yQnVpbGRlcjogQmFieWxvbkRlc2NyaXB0b3JCdWlsZGVyLFxuICBzdGFrZXJLZXk6IHV0eG9saWIuRUNQYWlySW50ZXJmYWNlXG4pOiB2ZW5kb3IuQnRjUHJvdmlkZXIge1xuICBmdW5jdGlvbiBzaWduV2l0aERlc2NyaXB0b3IoXG4gICAgcHNidDogYml0Y29pbmpzbGliLlBzYnQsXG4gICAgZGVzY3JpcHRvcjogRGVzY3JpcHRvcixcbiAgICBrZXk6IHV0eG9saWIuRUNQYWlySW50ZXJmYWNlXG4gICk6IGJpdGNvaW5qc2xpYi5Qc2J0IHtcbiAgICBwc2J0ID0gZ2V0U2lnbmVkUHNidChwc2J0LCBkZXNjcmlwdG9yLCBba2V5XSwgeyBmaW5hbGl6ZTogZmFsc2UgfSk7XG4gICAgLy8gQlVHOiB3ZSBuZWVkIHRvIGJsaW5kbHkgZmluYWxpemUgaGVyZSBldmVuIHRob3VnaCB3ZSBoYXZlIG5vdCBmdWxseSBzaWduZWRcbiAgICBwc2J0LmZpbmFsaXplQWxsSW5wdXRzKCk7XG4gICAgcmV0dXJuIHBzYnQ7XG4gIH1cblxuICBmdW5jdGlvbiBzaWduQmlwMzIyU2ltcGxlKG1lc3NhZ2U6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgLy8gR2V0IHRoZSBzY3JpcHQgcHVibGljIGtleSBmcm9tIHRoZSBzdGFraW5nIGRlc2NyaXB0b3JcbiAgICBjb25zdCBzY3JpcHRQdWJLZXkgPSBCdWZmZXIuZnJvbShkZXNjcmlwdG9yQnVpbGRlci5nZXRTdGFraW5nRGVzY3JpcHRvcigpLnNjcmlwdFB1YmtleSgpKTtcbiAgICBjb25zdCB0b1NwZW5kVHggPSBCSVAzMjIuYnVpbGRUb1NwZW5kVHgobWVzc2FnZSwgc2NyaXB0UHViS2V5KTtcblxuICAgIC8vIEdldCB0aGUgdG9fc3BlbmQgdHhpZFxuICAgIGNvbnN0IHRvU3BlbmRUeElkID0gdG9TcGVuZFR4LmdldElkKCk7XG5cbiAgICAvLyBDcmVhdGUgUFNCVCBvYmplY3QgZm9yIGNvbnN0cnVjdGluZyB0aGUgdHJhbnNhY3Rpb25cbiAgICBjb25zdCB0b1NpZ25Qc2J0ID0gbmV3IGJpdGNvaW5qc2xpYi5Qc2J0KCk7XG4gICAgdG9TaWduUHNidC5zZXRWZXJzaW9uKDIpOyAvLyBuVmVyc2lvbiA9IDBcbiAgICB0b1NpZ25Qc2J0LnNldExvY2t0aW1lKDApOyAvLyBuTG9ja1RpbWUgPSAwXG4gICAgdG9TaWduUHNidC5hZGRJbnB1dCh7XG4gICAgICBoYXNoOiB0b1NwZW5kVHhJZCxcbiAgICAgIGluZGV4OiAwLFxuICAgICAgc2VxdWVuY2U6IGRlc2NyaXB0b3JCdWlsZGVyLnN0YWtpbmdUaW1lTG9jayxcbiAgICAgIHdpdG5lc3NVdHhvOiB7XG4gICAgICAgIHNjcmlwdDogc2NyaXB0UHViS2V5LFxuICAgICAgICB2YWx1ZTogMCxcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICAvLyBTaWduIHRoZSBQU0JUIHdpdGggdGhlIHN0YWtlciBrZXlcbiAgICBjb25zdCB3cmFwcGVkUHNidCA9IHRvV3JhcHBlZFBzYnQodG9TaWduUHNidC50b0J1ZmZlcigpKTtcbiAgICB3cmFwcGVkUHNidC51cGRhdGVJbnB1dFdpdGhEZXNjcmlwdG9yKDAsIGRlc2NyaXB0b3JCdWlsZGVyLmdldFN0YWtpbmdEZXNjcmlwdG9yKCkpO1xuICAgIHNpZ25XaXRoS2V5KHdyYXBwZWRQc2J0LCBzdGFrZXJLZXkpO1xuICAgIHdyYXBwZWRQc2J0LmZpbmFsaXplKCk7XG5cbiAgICAvLyBFbmNvZGUgdGhlIHdpdG5lc3MgZGF0YSBhbmQgcmV0dXJuXG4gICAgcmV0dXJuIEJJUDMyMi5lbmNvZGVXaXRuZXNzKGJpdGNvaW5qc2xpYi5Qc2J0LmZyb21CdWZmZXIoQnVmZmVyLmZyb20od3JhcHBlZFBzYnQuc2VyaWFsaXplKCkpKSk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSBtZXNzYWdlXG4gICAgICogQHBhcmFtIHR5cGVcbiAgICAgKiBAcmV0dXJucyBCYXNlNjQgZW5jb2RlZCBzdHJpbmdcbiAgICAgKi9cbiAgICBhc3luYyBzaWduTWVzc2FnZShtZXNzYWdlOiBzdHJpbmcsIHR5cGU6ICdlY2RzYScgfCAnYmlwMzIyLXNpbXBsZScpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgIGNhc2UgJ2VjZHNhJzpcbiAgICAgICAgICByZXR1cm4gdG9CYXNlNjQoc3Rha2VyS2V5LnNpZ24oQnVmZmVyLmZyb20obWVzc2FnZSwgJ2hleCcpKSk7XG4gICAgICAgIGNhc2UgJ2JpcDMyMi1zaW1wbGUnOlxuICAgICAgICAgIHJldHVybiB0b0Jhc2U2NChzaWduQmlwMzIyU2ltcGxlKG1lc3NhZ2UpKTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHVuZXhwZWN0ZWQgdHlwZTogJHt0eXBlfWApO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBhc3luYyBzaWduUHNidChwc2J0SGV4OiBzdHJpbmcsIG9wdGlvbnM6IHZlbmRvci5TaWduUHNidE9wdGlvbnMpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgY29uc3QgcHNidCA9IGJpdGNvaW5qc2xpYi5Qc2J0LmZyb21IZXgocHNidEhleCk7XG4gICAgICBzd2l0Y2ggKG9wdGlvbnMuYWN0aW9uLm5hbWUpIHtcbiAgICAgICAgY2FzZSAnc2lnbi1idGMtc2xhc2hpbmctdHJhbnNhY3Rpb24nOlxuICAgICAgICAgIHJldHVybiBzaWduV2l0aERlc2NyaXB0b3IocHNidCwgZGVzY3JpcHRvckJ1aWxkZXIuZ2V0U3Rha2luZ0Rlc2NyaXB0b3IoKSwgc3Rha2VyS2V5KS50b0hleCgpO1xuICAgICAgICBjYXNlICdzaWduLWJ0Yy11bmJvbmRpbmctc2xhc2hpbmctdHJhbnNhY3Rpb24nOlxuICAgICAgICAgIHJldHVybiBzaWduV2l0aERlc2NyaXB0b3IocHNidCwgZGVzY3JpcHRvckJ1aWxkZXIuZ2V0VW5ib25kaW5nRGVzY3JpcHRvcigpLCBzdGFrZXJLZXkpLnRvSGV4KCk7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGB1bmV4cGVjdGVkIHNpZ25pbmcgc3RlcDogJHtvcHRpb25zLmFjdGlvbi5uYW1lfWApO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgdXNlZCBieSBidGMtc3Rha2luZy10cyB0byBjcmVhdGUgYSBzdGFraW5nIGV4cGFuc2lvbiByZWdpc3RyYXRpb25cbiAgICAgKiB0cmFuc2FjdGlvbiwgd2hpY2ggd2UgZG8gbm90IGN1cnJlbnRseSBzdXBwb3J0LlxuICAgICAqL1xuICAgIGFzeW5jIGdldFRyYW5zYWN0aW9uSGV4KHR4aWQ6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIG9wZXJhdGlvbiBnZXRUcmFuc2FjdGlvbkhleCAodHhpZD0ke3R4aWR9KWApO1xuICAgIH0sXG4gIH07XG59XG50eXBlIFJlc3VsdCA9IHtcbiAgdW5zaWduZWREZWxlZ2F0aW9uTXNnOiBWYWx1ZVdpdGhUeXBlVXJsPGJhYnlsb25Qcm90b2J1Zi5idGNzdGFraW5ndHguTXNnQ3JlYXRlQlRDRGVsZWdhdGlvbj47XG4gIHN0YWtpbmdUeDogYml0Y29pbmpzbGliLlRyYW5zYWN0aW9uO1xufTtcblxuLyoqXG4gKiBAcGFyYW0gc3Rha2luZ0tleSAtIHRoaXMgaXMgdGhlIHNpbmdsZS1zaWcga2V5IHRoYXQgaXMgdXNlZCBmb3IgY28tc2lnbmluZyB0aGUgc3Rha2luZyBvdXRwdXRcbiAqIEBwYXJhbSBjaGFuZ2VBZGRyZXNzIC0gdGhpcyBpcyB1bnJlbGF0ZWQgdG8gdGhlIHN0YWtpbmcga2V5IGFuZCBpcyB1c2VkIGZvciB0aGUgY2hhbmdlIG91dHB1dFxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9TdGFrZXJJbmZvKFxuICBzdGFraW5nS2V5OiB1dHhvbGliLkVDUGFpckludGVyZmFjZSB8IEJ1ZmZlciB8IHN0cmluZyxcbiAgY2hhbmdlQWRkcmVzczogc3RyaW5nXG4pOiB2ZW5kb3IuU3Rha2VySW5mbyB7XG4gIGlmICh0eXBlb2Ygc3Rha2luZ0tleSA9PT0gJ29iamVjdCcgJiYgJ3B1YmxpY0tleScgaW4gc3Rha2luZ0tleSkge1xuICAgIHN0YWtpbmdLZXkgPSBzdGFraW5nS2V5LnB1YmxpY0tleTtcbiAgfVxuICBpZiAodHlwZW9mIHN0YWtpbmdLZXkgPT09ICdzdHJpbmcnKSB7XG4gICAgc3Rha2luZ0tleSA9IEJ1ZmZlci5mcm9tKHN0YWtpbmdLZXksICdoZXgnKTtcbiAgfVxuICByZXR1cm4ge1xuICAgIHB1YmxpY0tleU5vQ29vcmRIZXg6IHRvWE9ubHlQdWJsaWNLZXkoc3Rha2luZ0tleSkudG9TdHJpbmcoJ2hleCcpLFxuICAgIGFkZHJlc3M6IGNoYW5nZUFkZHJlc3MsXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVTdGFraW5nKFxuICBuZXR3b3JrOiBCYWJ5bG9uTmV0d29ya0xpa2UsXG4gIGJsb2NrSGVpZ2h0OiBudW1iZXIsXG4gIHN0YWtlckJ0Y0luZm86IHZlbmRvci5TdGFrZXJJbmZvLFxuICBzdGFraW5nSW5wdXQ6IHZlbmRvci5TdGFraW5nSW5wdXRzLFxuICB2ZXJzaW9uZWRQYXJhbXM6IHZlbmRvci5WZXJzaW9uZWRTdGFraW5nUGFyYW1zW10gPSBnZXRTdGFraW5nUGFyYW1zKG5ldHdvcmspXG4pOiB2ZW5kb3IuU3Rha2luZyB7XG4gIGlmIChibG9ja0hlaWdodCA9PT0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcignQmFieWxvbiBCVEMgdGlwIGhlaWdodCBjYW5ub3QgYmUgMCcpO1xuICB9XG5cbiAgLy8gR2V0IHRoZSBCYWJ5bG9uIHBhcmFtcyBiYXNlZCBvbiB0aGUgQlRDIHRpcCBoZWlnaHQgZnJvbSBCYWJ5bG9uIGNoYWluXG4gIGNvbnN0IHBhcmFtcyA9IHZlbmRvci5nZXRCYWJ5bG9uUGFyYW1CeUJ0Y0hlaWdodChibG9ja0hlaWdodCwgdmVyc2lvbmVkUGFyYW1zKTtcblxuICByZXR1cm4gbmV3IHZlbmRvci5TdGFraW5nKFxuICAgIHRvQml0Y29pbkpzTmV0d29yayhuZXR3b3JrKSxcbiAgICBzdGFrZXJCdGNJbmZvLFxuICAgIHBhcmFtcyxcbiAgICBzdGFraW5nSW5wdXQuZmluYWxpdHlQcm92aWRlclBrc05vQ29vcmRIZXgsXG4gICAgc3Rha2luZ0lucHV0LnN0YWtpbmdUaW1lbG9ja1xuICApO1xufVxuXG50eXBlIFRyYW5zYWN0aW9uTGlrZSA9XG4gIHwgYml0Y29pbmpzbGliLlBzYnRcbiAgfCBiaXRjb2luanNsaWIuVHJhbnNhY3Rpb25cbiAgfCB1dHhvbGliLlRyYW5zYWN0aW9uXG4gIHwgdXR4b2xpYi5iaXRnby5VdHhvVHJhbnNhY3Rpb248YmlnaW50IHwgbnVtYmVyPlxuICB8IHV0eG9saWIuUHNidFxuICB8IHV0eG9saWIuYml0Z28uVXR4b1BzYnQ7XG5cbmZ1bmN0aW9uIHRvU3Rha2luZ1RyYW5zYWN0aW9uRnJvbVBzYnQoXG4gIHBzYnQ6IGJpdGNvaW5qc2xpYi5Qc2J0IHwgdXR4b2xpYi5Qc2J0IHwgdXR4b2xpYi5iaXRnby5VdHhvUHNidFxuKTogYml0Y29pbmpzbGliLlRyYW5zYWN0aW9uIHtcbiAgaWYgKCEocHNidCBpbnN0YW5jZW9mIHV0eG9saWIuYml0Z28uVXR4b1BzYnQpKSB7XG4gICAgcHNidCA9IHV0eG9saWIuYml0Z28uY3JlYXRlUHNidEZyb21CdWZmZXIocHNidC50b0J1ZmZlcigpLCB1dHhvbGliLm5ldHdvcmtzLmJpdGNvaW4pO1xuICB9XG4gIGlmIChwc2J0IGluc3RhbmNlb2YgdXR4b2xpYi5iaXRnby5VdHhvUHNidCkge1xuICAgIC8vIG9ubHkgdXR4b2xpYi5iaXRnby5VdHhvUHNidCBoYXMgdGhlIGdldFVuc2lnbmVkVHggbWV0aG9kXG4gICAgcmV0dXJuIGJpdGNvaW5qc2xpYi5UcmFuc2FjdGlvbi5mcm9tSGV4KHBzYnQuZ2V0VW5zaWduZWRUeCgpLnRvSGV4KCkpO1xuICB9XG4gIHRocm93IG5ldyBFcnJvcignaWxsZWdhbCBzdGF0ZScpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdG9TdGFraW5nVHJhbnNhY3Rpb24odHg6IFRyYW5zYWN0aW9uTGlrZSk6IGJpdGNvaW5qc2xpYi5UcmFuc2FjdGlvbiB7XG4gIGlmICh0eCBpbnN0YW5jZW9mIGJpdGNvaW5qc2xpYi5Qc2J0IHx8IHR4IGluc3RhbmNlb2YgdXR4b2xpYi5Qc2J0KSB7XG4gICAgcmV0dXJuIHRvU3Rha2luZ1RyYW5zYWN0aW9uRnJvbVBzYnQodHgpO1xuICB9XG4gIHJldHVybiBiaXRjb2luanNsaWIuVHJhbnNhY3Rpb24uZnJvbUhleCh0eC50b0hleCgpKTtcbn1cblxuLyoqXG4gKiBBcyBvZiBiYWJ5bG9ubGFicy1pby9idGMtc3Rha2luZy10cyB2MS41LjcsIHRoZSBCVEMgZGVsZWdhdGlvbiBtZXNzYWdlIGNyZWF0aW9uIGZ1bmN0aW9ucyBzdXBwb3J0IHR3byBtZXNzYWdlIHR5cGVzOlxuICogLSBNc2dDcmVhdGVCVENEZWxlZ2F0aW9uXG4gKiAtIE1zZ0J0Y1N0YWtlRXhwYW5kXG4gKlxuICogQml0R28gc3RpbGwgb25seSBzdXBwb3J0cyBNc2dDcmVhdGVCVENEZWxlZ2F0aW9uLCBzbyB3ZSBuZWVkIHRvIGNoZWNrIHRoZSBtZXNzYWdlIHR5cGUgaGVyZS5cbiAqXG4gKiBAcGFyYW0gbXNnIC0gdGhlIG1lc3NhZ2UgdG8gY2hlY2tcbiAqIEByZXR1cm4gYHRydWVgIGlmIHRoZSBtZXNzYWdlIGlzIG9mIHR5cGUgTXNnQ3JlYXRlQlRDRGVsZWdhdGlvblxuICovXG5mdW5jdGlvbiBpc01zZ0J0Y1N0YWtlRXhwYW5kKFxuICBtc2c6IGJhYnlsb25Qcm90b2J1Zi5idGNzdGFraW5ndHguTXNnQ3JlYXRlQlRDRGVsZWdhdGlvbiB8IGJhYnlsb25Qcm90b2J1Zi5idGNzdGFraW5ndHguTXNnQnRjU3Rha2VFeHBhbmRcbikge1xuICByZXR1cm4gJ3ByZXZpb3VzU3Rha2luZ1R4SGFzaCcgaW4gbXNnO1xufVxuXG4vKlxuICogVGhpcyBpcyBtb3N0bHkgbGlmdGVkIGZyb21cbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9iYWJ5bG9ubGFicy1pby9idGMtc3Rha2luZy10cy9ibG9iL3YwLjQuMC1yYy4yL3NyYy9zdGFraW5nL21hbmFnZXIudHMjTDEwMC1MMTcyXG4gKlxuICogVGhlIGRpZmZlcmVuY2UgaXMgdGhhdCBoZXJlIHdlIGFyZSByZXR1cm5pbmcgYW4gX3Vuc2lnbmVkXyBkZWxlZ2F0aW9uIG1lc3NhZ2UuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjcmVhdGVEZWxlZ2F0aW9uTWVzc2FnZVdpdGhUcmFuc2FjdGlvbihcbiAgY2hhbm5lbDogJ2RlbGVnYXRpb246Y3JlYXRlJyB8ICdkZWxlZ2F0aW9uOnJlZ2lzdGVyJyxcbiAgbWFuYWdlcjogdmVuZG9yLkJhYnlsb25CdGNTdGFraW5nTWFuYWdlcixcbiAgc3Rha2luZzogdmVuZG9yLlN0YWtpbmcsXG4gIHN0YWtpbmdBbW91bnRTYXQ6IG51bWJlcixcbiAgdHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uTGlrZSxcbiAgYmFieWxvbkFkZHJlc3M6IHN0cmluZ1xuKTogUHJvbWlzZTxWYWx1ZVdpdGhUeXBlVXJsPGJhYnlsb25Qcm90b2J1Zi5idGNzdGFraW5ndHguTXNnQ3JlYXRlQlRDRGVsZWdhdGlvbj4+IHtcbiAgaWYgKCF2ZW5kb3IuaXNWYWxpZEJhYnlsb25BZGRyZXNzKGJhYnlsb25BZGRyZXNzKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBCYWJ5bG9uIGFkZHJlc3MnKTtcbiAgfVxuICAvLyBDcmVhdGUgZGVsZWdhdGlvbiBtZXNzYWdlIHdpdGhvdXQgaW5jbHVkaW5nIGluY2x1c2lvbiBwcm9vZlxuICBjb25zdCBtc2cgPSBhd2FpdCBtYW5hZ2VyLmNyZWF0ZUJ0Y0RlbGVnYXRpb25Nc2coXG4gICAgY2hhbm5lbCxcbiAgICBzdGFraW5nLFxuICAgIHtcbiAgICAgIHN0YWtpbmdUaW1lbG9jazogc3Rha2luZy5zdGFraW5nVGltZWxvY2ssXG4gICAgICBmaW5hbGl0eVByb3ZpZGVyUGtzTm9Db29yZEhleDogc3Rha2luZy5maW5hbGl0eVByb3ZpZGVyUGtzTm9Db29yZEhleCxcbiAgICAgIHN0YWtpbmdBbW91bnRTYXQsXG4gICAgfSxcbiAgICB0b1N0YWtpbmdUcmFuc2FjdGlvbih0cmFuc2FjdGlvbiksXG4gICAgYmFieWxvbkFkZHJlc3MsXG4gICAgc3Rha2luZy5zdGFrZXJJbmZvLFxuICAgIHN0YWtpbmcucGFyYW1zXG4gICk7XG5cbiAgLy8gSXQgc2hvdWxkbid0IGJlIHBvc3NpYmxlIGZvciB1cyB0byBjcmVhdGUgYSBNc2dCdGNTdGFrZUV4cGFuZCBoZXJlIGJlY2F1c2UgdGhhdCBvbmx5IGdldHMgY3JlYXRlZCB3aGVuXG4gIC8vIHdlIHBhc3MgY2hhbm5lbCA9IGRlbGVnYXRpb246ZXhwYW5kIGludG8gY3JlYXRlQnRjRGVsZWdhdGlvbk1zZywgd2hpY2ggd2UgY2Fubm90IGRvLlxuICBpZiAoaXNNc2dCdGNTdGFrZUV4cGFuZChtc2cudmFsdWUpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdNc2dCdGNTdGFrZUV4cGFuZCBpcyBub3Qgc3VwcG9ydGVkJyk7XG4gIH1cblxuICByZXR1cm4geyAuLi5tc2csIHZhbHVlOiBtc2cudmFsdWUgYXMgYmFieWxvblByb3RvYnVmLmJ0Y3N0YWtpbmd0eC5Nc2dDcmVhdGVCVENEZWxlZ2F0aW9uIH07XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjcmVhdGVVbnNpZ25lZFByZVN0YWtlUmVnaXN0cmF0aW9uQmFieWxvblRyYW5zYWN0aW9uV2l0aEJ0Y1Byb3ZpZGVyKFxuICBidGNQcm92aWRlcjogdmVuZG9yLkJ0Y1Byb3ZpZGVyLFxuICBuZXR3b3JrOiBiaXRjb2luanNsaWIuTmV0d29yayxcbiAgc3Rha2VyQnRjSW5mbzogdmVuZG9yLlN0YWtlckluZm8sXG4gIHN0YWtpbmdJbnB1dDogdmVuZG9yLlN0YWtpbmdJbnB1dHMsXG4gIGJhYnlsb25CdGNUaXBIZWlnaHQ6IG51bWJlcixcbiAgaW5wdXRVVFhPczogdmVuZG9yLlVUWE9bXSxcbiAgZmVlUmF0ZVNhdEI6IG51bWJlcixcbiAgYmFieWxvbkFkZHJlc3M6IHN0cmluZyxcbiAgY2hhbm5lbDogJ2RlbGVnYXRpb246Y3JlYXRlJyB8ICdkZWxlZ2F0aW9uOnJlZ2lzdGVyJyxcbiAgc3Rha2luZ1BhcmFtczogdmVuZG9yLlZlcnNpb25lZFN0YWtpbmdQYXJhbXNbXSA9IGdldFN0YWtpbmdQYXJhbXMobmV0d29yaylcbik6IFByb21pc2U8UmVzdWx0PiB7XG4gIGlmIChpbnB1dFVUWE9zLmxlbmd0aCA9PT0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcignTm8gaW5wdXQgVVRYT3MgcHJvdmlkZWQnKTtcbiAgfVxuICBjb25zdCBtYW5hZ2VyID0gY3JlYXRlU3Rha2luZ01hbmFnZXIobmV0d29yaywgYnRjUHJvdmlkZXIsIHN0YWtpbmdQYXJhbXMpO1xuICBjb25zdCBzdGFraW5nID0gY3JlYXRlU3Rha2luZyhuZXR3b3JrLCBiYWJ5bG9uQnRjVGlwSGVpZ2h0LCBzdGFrZXJCdGNJbmZvLCBzdGFraW5nSW5wdXQsIHN0YWtpbmdQYXJhbXMpO1xuICAvLyBDcmVhdGUgdW5zaWduZWQgc3Rha2luZyB0cmFuc2FjdGlvblxuICBjb25zdCB7IHRyYW5zYWN0aW9uIH0gPSBzdGFraW5nLmNyZWF0ZVN0YWtpbmdUcmFuc2FjdGlvbihzdGFraW5nSW5wdXQuc3Rha2luZ0Ftb3VudFNhdCwgaW5wdXRVVFhPcywgZmVlUmF0ZVNhdEIpO1xuICBjb25zdCB1bnNpZ25lZERlbGVnYXRpb25Nc2cgPSBhd2FpdCBjcmVhdGVEZWxlZ2F0aW9uTWVzc2FnZVdpdGhUcmFuc2FjdGlvbihcbiAgICBjaGFubmVsLFxuICAgIG1hbmFnZXIsXG4gICAgc3Rha2luZyxcbiAgICBzdGFraW5nSW5wdXQuc3Rha2luZ0Ftb3VudFNhdCxcbiAgICB0cmFuc2FjdGlvbixcbiAgICBiYWJ5bG9uQWRkcmVzc1xuICApO1xuICByZXR1cm4geyB1bnNpZ25lZERlbGVnYXRpb25Nc2csIHN0YWtpbmdUeDogdHJhbnNhY3Rpb24gfTtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* https://github.com/babylonlabs-io/babylon/tree/main/docs
|
|
3
|
+
* https://github.com/babylonlabs-io/babylon/blob/main/docs/staking-script.md
|
|
4
|
+
* https://github.com/babylonlabs-io/babylon/blob/v1.99.0-snapshot.250211/btcstaking/staking.go
|
|
5
|
+
*/
|
|
6
|
+
import { Descriptor, ast } from '@bitgo/wasm-utxo';
|
|
7
|
+
import { StakingParams } from '@bitgo/babylonlabs-io-btc-staking-ts';
|
|
8
|
+
export declare function getUnspendableKey(): string;
|
|
9
|
+
export declare function sortedKeys(keys: Buffer[]): Buffer[];
|
|
10
|
+
export declare class BabylonDescriptorBuilder {
|
|
11
|
+
stakerKey: Buffer;
|
|
12
|
+
finalityProviderKeys: Buffer[];
|
|
13
|
+
covenantKeys: Buffer[];
|
|
14
|
+
covenantThreshold: number;
|
|
15
|
+
stakingTimeLock: number;
|
|
16
|
+
unbondingTimeLock: number;
|
|
17
|
+
constructor(stakerKey: Buffer, finalityProviderKeys: Buffer[], covenantKeys: Buffer[], covenantThreshold: number, stakingTimeLock: number, unbondingTimeLock: number);
|
|
18
|
+
static fromParams(params: {
|
|
19
|
+
stakerKey: Buffer;
|
|
20
|
+
finalityProviderKeys: Buffer[];
|
|
21
|
+
} & StakingParams): BabylonDescriptorBuilder;
|
|
22
|
+
/** Spend path with the staker key and the staking timelock */
|
|
23
|
+
getStakingTimelockMiniscriptNode(): ast.MiniscriptNode;
|
|
24
|
+
/** Spend path with the staker key and the unbonding timelock */
|
|
25
|
+
getUnbondingTimelockMiniscriptNode(): ast.MiniscriptNode;
|
|
26
|
+
/** Spend path with the staker key and the covenant keys */
|
|
27
|
+
getUnbondingMiniscriptNode(): ast.MiniscriptNode;
|
|
28
|
+
/** Spend path with the finality provider keys and the covenant keys */
|
|
29
|
+
getSlashingMiniscriptNode(): ast.MiniscriptNode;
|
|
30
|
+
/**
|
|
31
|
+
* Creates a descriptor for a staking output.
|
|
32
|
+
*
|
|
33
|
+
* Three spend paths:
|
|
34
|
+
* - the slashing script,
|
|
35
|
+
* - the unbonding script,
|
|
36
|
+
* - the timelocked unstaking script.
|
|
37
|
+
*/
|
|
38
|
+
getStakingDescriptor(): Descriptor;
|
|
39
|
+
/**
|
|
40
|
+
* Creates a descriptor for the timelocked unbonding script.
|
|
41
|
+
*/
|
|
42
|
+
getUnbondingTimelockDescriptor(): Descriptor;
|
|
43
|
+
/**
|
|
44
|
+
* Creates a descriptor with two script paths: the slashing script and the timelocked unbonding script.
|
|
45
|
+
*/
|
|
46
|
+
getUnbondingDescriptor(): Descriptor;
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=descriptor.d.ts.map
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* https://github.com/babylonlabs-io/babylon/tree/main/docs
|
|
3
|
+
* https://github.com/babylonlabs-io/babylon/blob/main/docs/staking-script.md
|
|
4
|
+
* https://github.com/babylonlabs-io/babylon/blob/v1.99.0-snapshot.250211/btcstaking/staking.go
|
|
5
|
+
*/
|
|
6
|
+
import { Descriptor, ast } from '@bitgo/wasm-utxo';
|
|
7
|
+
export function getUnspendableKey() {
|
|
8
|
+
// https://github.com/babylonlabs-io/btc-staking-ts/blob/v0.4.0-rc.2/src/constants/internalPubkey.ts
|
|
9
|
+
return '50929b74c1a04954b78b4b6035e97a5e078a5a0f28ec96d547bfee9ace803ac0';
|
|
10
|
+
}
|
|
11
|
+
// Helper functions for creating miniscript nodes
|
|
12
|
+
function pk(b) {
|
|
13
|
+
return { 'v:pk': b.toString('hex') };
|
|
14
|
+
}
|
|
15
|
+
export function sortedKeys(keys) {
|
|
16
|
+
return [...keys].sort((a, b) => a.compare(b));
|
|
17
|
+
}
|
|
18
|
+
function multiArgs(threshold, keys) {
|
|
19
|
+
return [threshold, ...sortedKeys(keys).map((k) => k.toString('hex'))];
|
|
20
|
+
}
|
|
21
|
+
function taprootScriptOnlyFromAst(n) {
|
|
22
|
+
return Descriptor.fromString(ast.formatNode({ tr: [getUnspendableKey(), n] }), 'definite');
|
|
23
|
+
}
|
|
24
|
+
export class BabylonDescriptorBuilder {
|
|
25
|
+
constructor(stakerKey, finalityProviderKeys, covenantKeys, covenantThreshold, stakingTimeLock, unbondingTimeLock) {
|
|
26
|
+
this.stakerKey = stakerKey;
|
|
27
|
+
this.finalityProviderKeys = finalityProviderKeys;
|
|
28
|
+
this.covenantKeys = covenantKeys;
|
|
29
|
+
this.covenantThreshold = covenantThreshold;
|
|
30
|
+
this.stakingTimeLock = stakingTimeLock;
|
|
31
|
+
this.unbondingTimeLock = unbondingTimeLock;
|
|
32
|
+
}
|
|
33
|
+
static fromParams(params) {
|
|
34
|
+
return new BabylonDescriptorBuilder(params.stakerKey, params.finalityProviderKeys, params.covenantNoCoordPks.map((k) => Buffer.from(k, 'hex')), params.covenantQuorum, params.minStakingTimeBlocks, params.unbondingTime);
|
|
35
|
+
}
|
|
36
|
+
/** Spend path with the staker key and the staking timelock */
|
|
37
|
+
getStakingTimelockMiniscriptNode() {
|
|
38
|
+
return { and_v: [pk(this.stakerKey), { older: this.stakingTimeLock }] };
|
|
39
|
+
}
|
|
40
|
+
/** Spend path with the staker key and the unbonding timelock */
|
|
41
|
+
getUnbondingTimelockMiniscriptNode() {
|
|
42
|
+
return { and_v: [pk(this.stakerKey), { older: this.unbondingTimeLock }] };
|
|
43
|
+
}
|
|
44
|
+
/** Spend path with the staker key and the covenant keys */
|
|
45
|
+
getUnbondingMiniscriptNode() {
|
|
46
|
+
return { and_v: [pk(this.stakerKey), { multi_a: multiArgs(this.covenantThreshold, this.covenantKeys) }] };
|
|
47
|
+
}
|
|
48
|
+
/** Spend path with the finality provider keys and the covenant keys */
|
|
49
|
+
getSlashingMiniscriptNode() {
|
|
50
|
+
return {
|
|
51
|
+
and_v: [
|
|
52
|
+
{
|
|
53
|
+
and_v: [
|
|
54
|
+
pk(this.stakerKey),
|
|
55
|
+
this.finalityProviderKeys.length === 1
|
|
56
|
+
? { 'v:pk': this.finalityProviderKeys[0].toString('hex') }
|
|
57
|
+
: { 'v:multi_a': multiArgs(1, this.finalityProviderKeys) },
|
|
58
|
+
],
|
|
59
|
+
},
|
|
60
|
+
{ multi_a: multiArgs(this.covenantThreshold, this.covenantKeys) },
|
|
61
|
+
],
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Creates a descriptor for a staking output.
|
|
66
|
+
*
|
|
67
|
+
* Three spend paths:
|
|
68
|
+
* - the slashing script,
|
|
69
|
+
* - the unbonding script,
|
|
70
|
+
* - the timelocked unstaking script.
|
|
71
|
+
*/
|
|
72
|
+
getStakingDescriptor() {
|
|
73
|
+
return taprootScriptOnlyFromAst([
|
|
74
|
+
this.getSlashingMiniscriptNode(),
|
|
75
|
+
[this.getUnbondingMiniscriptNode(), this.getStakingTimelockMiniscriptNode()],
|
|
76
|
+
]);
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Creates a descriptor for the timelocked unbonding script.
|
|
80
|
+
*/
|
|
81
|
+
getUnbondingTimelockDescriptor() {
|
|
82
|
+
return taprootScriptOnlyFromAst(this.getUnbondingTimelockMiniscriptNode());
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Creates a descriptor with two script paths: the slashing script and the timelocked unbonding script.
|
|
86
|
+
*/
|
|
87
|
+
getUnbondingDescriptor() {
|
|
88
|
+
return taprootScriptOnlyFromAst([this.getSlashingMiniscriptNode(), this.getUnbondingTimelockMiniscriptNode()]);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVzY3JpcHRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9iYWJ5bG9uL2Rlc2NyaXB0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7R0FJRztBQUVILE9BQU8sRUFBRSxVQUFVLEVBQUUsR0FBRyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFHbkQsTUFBTSxVQUFVLGlCQUFpQjtJQUMvQixvR0FBb0c7SUFDcEcsT0FBTyxrRUFBa0UsQ0FBQztBQUM1RSxDQUFDO0FBRUQsaURBQWlEO0FBQ2pELFNBQVMsRUFBRSxDQUFDLENBQVM7SUFDbkIsT0FBTyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7QUFDdkMsQ0FBQztBQUVELE1BQU0sVUFBVSxVQUFVLENBQUMsSUFBYztJQUN2QyxPQUFPLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEQsQ0FBQztBQUVELFNBQVMsU0FBUyxDQUFDLFNBQWlCLEVBQUUsSUFBYztJQUNsRCxPQUFPLENBQUMsU0FBUyxFQUFFLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDeEUsQ0FBQztBQUVELFNBQVMsd0JBQXdCLENBQUMsQ0FBa0I7SUFDbEQsT0FBTyxVQUFVLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxpQkFBaUIsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxVQUFVLENBQUMsQ0FBQztBQUM3RixDQUFDO0FBRUQsTUFBTSxPQUFP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QixDQUFDLENBQUMsSUFBSSxDQUFDLHlCQUF5QixFQUFFLEVBQUUsSUFBSSxDQUFDLGtDQUFrQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ2pILENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogaHR0cHM6Ly9naXRodWIuY29tL2JhYnlsb25sYWJzLWlvL2JhYnlsb24vdHJlZS9tYWluL2RvY3NcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9iYWJ5bG9ubGFicy1pby9iYWJ5bG9uL2Jsb2IvbWFpbi9kb2NzL3N0YWtpbmctc2NyaXB0Lm1kXG4gKiBodHRwczovL2dpdGh1Yi5jb20vYmFieWxvbmxhYnMtaW8vYmFieWxvbi9ibG9iL3YxLjk5LjAtc25hcHNob3QuMjUwMjExL2J0Y3N0YWtpbmcvc3Rha2luZy5nb1xuICovXG5cbmltcG9ydCB7IERlc2NyaXB0b3IsIGFzdCB9IGZyb20gJ0BiaXRnby93YXNtLXV0eG8nO1xuaW1wb3J0IHsgU3Rha2luZ1BhcmFtcyB9IGZyb20gJ0BiaXRnby9iYWJ5bG9ubGFicy1pby1idGMtc3Rha2luZy10cyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRVbnNwZW5kYWJsZUtleSgpOiBzdHJpbmcge1xuICAvLyBodHRwczovL2dpdGh1Yi5jb20vYmFieWxvbmxhYnMtaW8vYnRjLXN0YWtpbmctdHMvYmxvYi92MC40LjAtcmMuMi9zcmMvY29uc3RhbnRzL2ludGVybmFsUHVia2V5LnRzXG4gIHJldHVybiAnNTA5MjliNzRjMWEwNDk1NGI3OGI0YjYwMzVlOTdhNWUwNzhhNWEwZjI4ZWM5NmQ1NDdiZmVlOWFjZTgwM2FjMCc7XG59XG5cbi8vIEhlbHBlciBmdW5jdGlvbnMgZm9yIGNyZWF0aW5nIG1pbmlzY3JpcHQgbm9kZXNcbmZ1bmN0aW9uIHBrKGI6IEJ1ZmZlcik6IGFzdC5NaW5pc2NyaXB0Tm9kZSB7XG4gIHJldHVybiB7ICd2OnBrJzogYi50b1N0cmluZygnaGV4JykgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNvcnRlZEtleXMoa2V5czogQnVmZmVyW10pOiBCdWZmZXJbXSB7XG4gIHJldHVybiBbLi4ua2V5c10uc29ydCgoYSwgYikgPT4gYS5jb21wYXJlKGIpKTtcbn1cblxuZnVuY3Rpb24gbXVsdGlBcmdzKHRocmVzaG9sZDogbnVtYmVyLCBrZXlzOiBCdWZmZXJbXSk6IFtudW1iZXIsIC4uLnN0cmluZ1tdXSB7XG4gIHJldHVybiBbdGhyZXNob2xkLCAuLi5zb3J0ZWRLZXlzKGtleXMpLm1hcCgoaykgPT4gay50b1N0cmluZygnaGV4JykpXTtcbn1cblxuZnVuY3Rpb24gdGFwcm9vdFNjcmlwdE9ubHlGcm9tQXN0KG46IGFzdC5UYXBUcmVlTm9kZSk6IERlc2NyaXB0b3Ige1xuICByZXR1cm4gRGVzY3JpcHRvci5mcm9tU3RyaW5nKGFzdC5mb3JtYXROb2RlKHsgdHI6IFtnZXRVbnNwZW5kYWJsZUtleSgpLCBuXSB9KSwgJ2RlZmluaXRlJyk7XG59XG5cbmV4cG9ydCBjbGFzcyBCYWJ5bG9uRGVzY3JpcHRvckJ1aWxkZXIge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgc3Rha2VyS2V5OiBCdWZmZXIsXG4gICAgcHVibGljIGZpbmFsaXR5UHJvdmlkZXJLZXlzOiBCdWZmZXJbXSxcbiAgICBwdWJsaWMgY292ZW5hbnRLZXlzOiBCdWZmZXJbXSxcbiAgICBwdWJsaWMgY292ZW5hbnRUaHJlc2hvbGQ6IG51bWJlcixcbiAgICBwdWJsaWMgc3Rha2luZ1RpbWVMb2NrOiBudW1iZXIsXG4gICAgcHVibGljIHVuYm9uZGluZ1RpbWVMb2NrOiBudW1iZXJcbiAgKSB7fVxuXG4gIHN0YXRpYyBmcm9tUGFyYW1zKFxuICAgIHBhcmFtczoge1xuICAgICAgc3Rha2VyS2V5OiBCdWZmZXI7XG4gICAgICBmaW5hbGl0eVByb3ZpZGVyS2V5czogQnVmZmVyW107XG4gICAgfSAmIFN0YWtpbmdQYXJhbXNcbiAgKTogQmFieWxvbkRlc2NyaXB0b3JCdWlsZGVyIHtcbiAgICByZXR1cm4gbmV3IEJhYnlsb25EZXNjcmlwdG9yQnVpbGRlcihcbiAgICAgIHBhcmFtcy5zdGFrZXJLZXksXG4gICAgICBwYXJhbXMuZmluYWxpdHlQcm92aWRlcktleXMsXG4gICAgICBwYXJhbXMuY292ZW5hbnROb0Nvb3JkUGtzLm1hcCgoaykgPT4gQnVmZmVyLmZyb20oaywgJ2hleCcpKSxcbiAgICAgIHBhcmFtcy5jb3ZlbmFudFF1b3J1bSxcbiAgICAgIHBhcmFtcy5taW5TdGFraW5nVGltZUJsb2NrcyxcbiAgICAgIHBhcmFtcy51bmJvbmRpbmdUaW1lXG4gICAgKTtcbiAgfVxuXG4gIC8qKiBTcGVuZCBwYXRoIHdpdGggdGhlIHN0YWtlciBrZXkgYW5kIHRoZSBzdGFraW5nIHRpbWVsb2NrICovXG4gIGdldFN0YWtpbmdUaW1lbG9ja01pbmlzY3JpcHROb2RlKCk6IGFzdC5NaW5pc2NyaXB0Tm9kZSB7XG4gICAgcmV0dXJuIHsgYW5kX3Y6IFtwayh0aGlzLnN0YWtlcktleSksIHsgb2xkZXI6IHRoaXMuc3Rha2luZ1RpbWVMb2NrIH1dIH07XG4gIH1cblxuICAvKiogU3BlbmQgcGF0aCB3aXRoIHRoZSBzdGFrZXIga2V5IGFuZCB0aGUgdW5ib25kaW5nIHRpbWVsb2NrICovXG4gIGdldFVuYm9uZGluZ1RpbWVsb2NrTWluaXNjcmlwdE5vZGUoKTogYXN0Lk1pbmlzY3JpcHROb2RlIHtcbiAgICByZXR1cm4geyBhbmRfdjogW3BrKHRoaXMuc3Rha2VyS2V5KSwgeyBvbGRlcjogdGhpcy51bmJvbmRpbmdUaW1lTG9jayB9XSB9O1xuICB9XG5cbiAgLyoqIFNwZW5kIHBhdGggd2l0aCB0aGUgc3Rha2VyIGtleSBhbmQgdGhlIGNvdmVuYW50IGtleXMgKi9cbiAgZ2V0VW5ib25kaW5nTWluaXNjcmlwdE5vZGUoKTogYXN0Lk1pbmlzY3JpcHROb2RlIHtcbiAgICByZXR1cm4geyBhbmRfdjogW3BrKHRoaXMuc3Rha2VyS2V5KSwgeyBtdWx0aV9hOiBtdWx0aUFyZ3ModGhpcy5jb3ZlbmFudFRocmVzaG9sZCwgdGhpcy5jb3ZlbmFudEtleXMpIH1dIH07XG4gIH1cblxuICAvKiogU3BlbmQgcGF0aCB3aXRoIHRoZSBmaW5hbGl0eSBwcm92aWRlciBrZXlzIGFuZCB0aGUgY292ZW5hbnQga2V5cyAqL1xuICBnZXRTbGFzaGluZ01pbmlzY3JpcHROb2RlKCk6IGFzdC5NaW5pc2NyaXB0Tm9kZSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGFuZF92OiBbXG4gICAgICAgIHtcbiAgICAgICAgICBhbmRfdjogW1xuICAgICAgICAgICAgcGsodGhpcy5zdGFrZXJLZXkpLFxuICAgICAgICAgICAgdGhpcy5maW5hbGl0eVByb3ZpZGVyS2V5cy5sZW5ndGggPT09IDFcbiAgICAgICAgICAgICAgPyB7ICd2OnBrJzogdGhpcy5maW5hbGl0eVByb3ZpZGVyS2V5c1swXS50b1N0cmluZygnaGV4JykgfVxuICAgICAgICAgICAgICA6IHsgJ3Y6bXVsdGlfYSc6IG11bHRpQXJncygxLCB0aGlzLmZpbmFsaXR5UHJvdmlkZXJLZXlzKSB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICAgIHsgbXVsdGlfYTogbXVsdGlBcmdzKHRoaXMuY292ZW5hbnRUaHJlc2hvbGQsIHRoaXMuY292ZW5hbnRLZXlzKSB9LFxuICAgICAgXSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBkZXNjcmlwdG9yIGZvciBhIHN0YWtpbmcgb3V0cHV0LlxuICAgKlxuICAgKiBUaHJlZSBzcGVuZCBwYXRoczpcbiAgICogLSB0aGUgc2xhc2hpbmcgc2NyaXB0LFxuICAgKiAtIHRoZSB1bmJvbmRpbmcgc2NyaXB0LFxuICAgKiAtIHRoZSB0aW1lbG9ja2VkIHVuc3Rha2luZyBzY3JpcHQuXG4gICAqL1xuICBnZXRTdGFraW5nRGVzY3JpcHRvcigpOiBEZXNjcmlwdG9yIHtcbiAgICByZXR1cm4gdGFwcm9vdFNjcmlwdE9ubHlGcm9tQXN0KFtcbiAgICAgIHRoaXMuZ2V0U2xhc2hpbmdNaW5pc2NyaXB0Tm9kZSgpLFxuICAgICAgW3RoaXMuZ2V0VW5ib25kaW5nTWluaXNjcmlwdE5vZGUoKSwgdGhpcy5nZXRTdGFraW5nVGltZWxvY2tNaW5pc2NyaXB0Tm9kZSgpXSxcbiAgICBdKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgZGVzY3JpcHRvciBmb3IgdGhlIHRpbWVsb2NrZWQgdW5ib25kaW5nIHNjcmlwdC5cbiAgICovXG4gIGdldFVuYm9uZGluZ1RpbWVsb2NrRGVzY3JpcHRvcigpOiBEZXNjcmlwdG9yIHtcbiAgICByZXR1cm4gdGFwcm9vdFNjcmlwdE9ubHlGcm9tQXN0KHRoaXMuZ2V0VW5ib25kaW5nVGltZWxvY2tNaW5pc2NyaXB0Tm9kZSgpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgZGVzY3JpcHRvciB3aXRoIHR3byBzY3JpcHQgcGF0aHM6IHRoZSBzbGFzaGluZyBzY3JpcHQgYW5kIHRoZSB0aW1lbG9ja2VkIHVuYm9uZGluZyBzY3JpcHQuXG4gICAqL1xuICBnZXRVbmJvbmRpbmdEZXNjcmlwdG9yKCk6IERlc2NyaXB0b3Ige1xuICAgIHJldHVybiB0YXByb290U2NyaXB0T25seUZyb21Bc3QoW3RoaXMuZ2V0U2xhc2hpbmdNaW5pc2NyaXB0Tm9kZSgpLCB0aGlzLmdldFVuYm9uZGluZ1RpbWVsb2NrTWluaXNjcmlwdE5vZGUoKV0pO1xuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { initBTCCurve } from '@bitgo/babylonlabs-io-btc-staking-ts';
|
|
2
|
+
import * as bitcoinjslib from 'bitcoinjs-lib';
|
|
3
|
+
import * as utxolib from '@bitgo/utxo-lib';
|
|
4
|
+
initBTCCurve();
|
|
5
|
+
bitcoinjslib.initEccLib(utxolib.ecc);
|
|
6
|
+
export * from './delegationMessage';
|
|
7
|
+
export * from './descriptor';
|
|
8
|
+
export * from './stakingParams';
|
|
9
|
+
export * from './stakingManager';
|
|
10
|
+
export * from './undelegation';
|
|
11
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYmFieWxvbi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDcEUsT0FBTyxLQUFLLFlBQVksTUFBTSxlQUFlLENBQUM7QUFDOUMsT0FBTyxLQUFLLE9BQU8sTUFBTSxpQkFBaUIsQ0FBQztBQUUzQyxZQUFZLEVBQUUsQ0FBQztBQUNmLFlBQVksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBRXJDLGNBQWMscUJBQXFCLENBQUM7QUFDcEMsY0FBYyxjQUFjLENBQUM7QUFDN0IsY0FBYyxpQkFBaUIsQ0FBQztBQUNoQyxjQUFjLGtCQUFrQixDQUFDO0FBQ2pDLGNBQWMsZ0JBQWdCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpbml0QlRDQ3VydmUgfSBmcm9tICdAYml0Z28vYmFieWxvbmxhYnMtaW8tYnRjLXN0YWtpbmctdHMnO1xuaW1wb3J0ICogYXMgYml0Y29pbmpzbGliIGZyb20gJ2JpdGNvaW5qcy1saWInO1xuaW1wb3J0ICogYXMgdXR4b2xpYiBmcm9tICdAYml0Z28vdXR4by1saWInO1xuXG5pbml0QlRDQ3VydmUoKTtcbmJpdGNvaW5qc2xpYi5pbml0RWNjTGliKHV0eG9saWIuZWNjKTtcblxuZXhwb3J0ICogZnJvbSAnLi9kZWxlZ2F0aW9uTWVzc2FnZSc7XG5leHBvcnQgKiBmcm9tICcuL2Rlc2NyaXB0b3InO1xuZXhwb3J0ICogZnJvbSAnLi9zdGFraW5nUGFyYW1zJztcbmV4cG9ydCAqIGZyb20gJy4vc3Rha2luZ01hbmFnZXInO1xuZXhwb3J0ICogZnJvbSAnLi91bmRlbGVnYXRpb24nO1xuIl19
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import * as bitcoinjslib from 'bitcoinjs-lib';
|
|
2
|
+
import * as utxolib from '@bitgo/utxo-lib';
|
|
3
|
+
export type BabylonNetwork = 'mainnet' | 'testnet';
|
|
4
|
+
export type BabylonNetworkLike = bitcoinjslib.Network | utxolib.Network | BabylonNetwork;
|
|
5
|
+
export declare function toBabylonNetwork(n: BabylonNetworkLike): BabylonNetwork;
|
|
6
|
+
export declare function toBitcoinJsNetwork(n: BabylonNetworkLike): bitcoinjslib.Network;
|
|
7
|
+
//# sourceMappingURL=network.d.ts.map
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import * as bitcoinjslib from 'bitcoinjs-lib';
|
|
2
|
+
import * as utxolib from '@bitgo/utxo-lib';
|
|
3
|
+
export function toBabylonNetwork(n) {
|
|
4
|
+
switch (n) {
|
|
5
|
+
case bitcoinjslib.networks.bitcoin:
|
|
6
|
+
case utxolib.networks.bitcoin:
|
|
7
|
+
return 'mainnet';
|
|
8
|
+
case bitcoinjslib.networks.testnet:
|
|
9
|
+
case utxolib.networks.testnet:
|
|
10
|
+
case utxolib.networks.bitcoinPublicSignet:
|
|
11
|
+
return 'testnet';
|
|
12
|
+
case 'mainnet':
|
|
13
|
+
case 'testnet':
|
|
14
|
+
return n;
|
|
15
|
+
default:
|
|
16
|
+
throw new Error('Unsupported network');
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
export function toBitcoinJsNetwork(n) {
|
|
20
|
+
switch (toBabylonNetwork(n)) {
|
|
21
|
+
case 'mainnet':
|
|
22
|
+
return bitcoinjslib.networks.bitcoin;
|
|
23
|
+
case 'testnet':
|
|
24
|
+
return bitcoinjslib.networks.testnet;
|
|
25
|
+
default:
|
|
26
|
+
throw new Error('Unsupported network');
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV0d29yay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9iYWJ5bG9uL25ldHdvcmsudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLFlBQVksTUFBTSxlQUFlLENBQUM7QUFDOUMsT0FBTyxLQUFLLE9BQU8sTUFBTSxpQkFBaUIsQ0FBQztBQU0zQyxNQUFNLFVBQVUsZ0JBQWdCLENBQUMsQ0FBcUI7SUFDcEQsUUFBUSxDQUFDLEVBQUUsQ0FBQztRQUNWLEtBQUssWUFBWSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUM7UUFDbkMsS0FBSyxPQUFPLENBQUMsUUFBUSxDQUFDLE9BQU87WUFDM0IsT0FBTyxTQUFTLENBQUM7UUFDbkIsS0FBSyxZQUFZLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQztRQUNuQyxLQUFLLE9BQU8sQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDO1FBQzlCLEtBQUssT0FBTyxDQUFDLFFBQVEsQ0FBQyxtQkFBbUI7WUFDdkMsT0FBTyxTQUFTLENBQUM7UUFDbkIsS0FBSyxTQUFTLENBQUM7UUFDZixLQUFLLFNBQVM7WUFDWixPQUFPLENBQUMsQ0FBQztRQUNYO1lBQ0UsTUFBTSxJQUFJLEtBQUssQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO0lBQzNDLENBQUM7QUFDSCxDQUFDO0FBRUQsTUFBTSxVQUFVLGtCQUFrQixDQUFDLENBQXFCO0lBQ3RELFFBQVEsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUM1QixLQUFLLFNBQVM7WUFDWixPQUFPLFlBQVksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDO1FBQ3ZDLEtBQUssU0FBUztZQUNaLE9BQU8sWUFBWSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUM7UUFDdkM7WUFDRSxNQUFNLElBQUksS0FBSyxDQUFDLHFCQUFxQixDQUFDLENBQUM7SUFDM0MsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBiaXRjb2luanNsaWIgZnJvbSAnYml0Y29pbmpzLWxpYic7XG5pbXBvcnQgKiBhcyB1dHhvbGliIGZyb20gJ0BiaXRnby91dHhvLWxpYic7XG5cbmV4cG9ydCB0eXBlIEJhYnlsb25OZXR3b3JrID0gJ21haW5uZXQnIHwgJ3Rlc3RuZXQnO1xuXG5leHBvcnQgdHlwZSBCYWJ5bG9uTmV0d29ya0xpa2UgPSBiaXRjb2luanNsaWIuTmV0d29yayB8IHV0eG9saWIuTmV0d29yayB8IEJhYnlsb25OZXR3b3JrO1xuXG5leHBvcnQgZnVuY3Rpb24gdG9CYWJ5bG9uTmV0d29yayhuOiBCYWJ5bG9uTmV0d29ya0xpa2UpOiBCYWJ5bG9uTmV0d29yayB7XG4gIHN3aXRjaCAobikge1xuICAgIGNhc2UgYml0Y29pbmpzbGliLm5ldHdvcmtzLmJpdGNvaW46XG4gICAgY2FzZSB1dHhvbGliLm5ldHdvcmtzLmJpdGNvaW46XG4gICAgICByZXR1cm4gJ21haW5uZXQnO1xuICAgIGNhc2UgYml0Y29pbmpzbGliLm5ldHdvcmtzLnRlc3RuZXQ6XG4gICAgY2FzZSB1dHhvbGliLm5ldHdvcmtzLnRlc3RuZXQ6XG4gICAgY2FzZSB1dHhvbGliLm5ldHdvcmtzLmJpdGNvaW5QdWJsaWNTaWduZXQ6XG4gICAgICByZXR1cm4gJ3Rlc3RuZXQnO1xuICAgIGNhc2UgJ21haW5uZXQnOlxuICAgIGNhc2UgJ3Rlc3RuZXQnOlxuICAgICAgcmV0dXJuIG47XG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBFcnJvcignVW5zdXBwb3J0ZWQgbmV0d29yaycpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0b0JpdGNvaW5Kc05ldHdvcmsobjogQmFieWxvbk5ldHdvcmtMaWtlKTogYml0Y29pbmpzbGliLk5ldHdvcmsge1xuICBzd2l0Y2ggKHRvQmFieWxvbk5ldHdvcmsobikpIHtcbiAgICBjYXNlICdtYWlubmV0JzpcbiAgICAgIHJldHVybiBiaXRjb2luanNsaWIubmV0d29ya3MuYml0Y29pbjtcbiAgICBjYXNlICd0ZXN0bmV0JzpcbiAgICAgIHJldHVybiBiaXRjb2luanNsaWIubmV0d29ya3MudGVzdG5ldDtcbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbnN1cHBvcnRlZCBuZXR3b3JrJyk7XG4gIH1cbn1cbiJdfQ==
|