Skip to content

Commit 7fb9d68

Browse files
feat(utxo-staking): add unsigned delegation message creation
Add function to create unsigned delegation messages for Babylon BTC staking without needing a proof key. Export utility functions to support this. Issue: BTC-1826
1 parent 8baa60a commit 7fb9d68

File tree

10 files changed

+281
-154
lines changed

10 files changed

+281
-154
lines changed

modules/babylonlabs-io-btc-staking-ts/src/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ export { ObservableStaking, ObservableStakingScriptData } from './staking/observ
44
export * from './staking/transactions';
55
export * from './types';
66
export * from './utils/btc';
7+
export * from './utils/babylon';
78
export * from './utils/staking';
89
export * from './utils/utxo/findInputUTXO';
910
export * from './utils/utxo/getPsbtInputFields';

modules/babylonlabs-io-btc-staking-ts/src/staking/manager.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -661,7 +661,7 @@ export class BabylonBtcStakingManager {
661661
* @param inclusionProof - The inclusion proof of the staking transaction.
662662
* @returns The protobuf message.
663663
*/
664-
private async createBtcDelegationMsg(
664+
public async createBtcDelegationMsg(
665665
stakingInstance: Staking,
666666
stakingInput: StakingInputs,
667667
stakingTx: Transaction,

modules/utxo-staking/package.json

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -39,14 +39,12 @@
3939
]
4040
},
4141
"dependencies": {
42+
"@bitgo/babylonlabs-io-btc-staking-ts": "^0.4.0-bitgo.1",
43+
"@babylonlabs-io/babylon-proto-ts": "1.0.0",
4244
"@bitgo/unspents": "^0.47.20",
4345
"@bitgo/utxo-core": "^1.5.0",
4446
"@bitgo/utxo-lib": "^11.2.4",
45-
"@bitgo/wasm-miniscript": "2.0.0-beta.7"
46-
},
47-
"devDependencies": {
48-
"@bitgo/babylonlabs-io-btc-staking-ts": "^0.4.0-bitgo.1",
49-
"@babylonlabs-io/babylon-proto-ts": "1.0.0",
47+
"@bitgo/wasm-miniscript": "2.0.0-beta.7",
5048
"bitcoinjs-lib": "^6.1.7"
5149
}
5250
}
Lines changed: 136 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,136 @@
1+
import assert from 'assert';
2+
3+
import * as vendor from '@bitgo/babylonlabs-io-btc-staking-ts';
4+
import * as babylonProtobuf from '@babylonlabs-io/babylon-proto-ts';
5+
import * as bitcoinjslib from 'bitcoinjs-lib';
6+
import { ECPairInterface } from '@bitgo/utxo-lib';
7+
import { Descriptor } from '@bitgo/wasm-miniscript';
8+
import { toWrappedPsbt } from '@bitgo/utxo-core/descriptor';
9+
10+
import { BabylonDescriptorBuilder } from './descriptor';
11+
12+
export type ValueWithTypeUrl<T> = { typeUrl: string; value: T };
13+
14+
export function getSignedPsbt(
15+
psbt: bitcoinjslib.Psbt,
16+
descriptor: Descriptor,
17+
signers: ECPairInterface[],
18+
{ finalize = false }
19+
): bitcoinjslib.Psbt {
20+
const wrappedPsbt = toWrappedPsbt(psbt.toBuffer());
21+
const signedInputs = psbt.data.inputs.flatMap((input, i) => {
22+
assert(input.witnessUtxo);
23+
if (Buffer.from(descriptor.scriptPubkey()).equals(input.witnessUtxo.script)) {
24+
wrappedPsbt.updateInputWithDescriptor(i, descriptor);
25+
const signResults = signers.map((signer) => {
26+
assert(signer.privateKey);
27+
return wrappedPsbt.signWithPrv(signer.privateKey);
28+
});
29+
return [[i, signResults]];
30+
}
31+
return [];
32+
});
33+
assert(signedInputs.length > 0);
34+
if (finalize) {
35+
wrappedPsbt.finalize();
36+
}
37+
return bitcoinjslib.Psbt.fromBuffer(Buffer.from(wrappedPsbt.serialize()));
38+
}
39+
40+
export function getBtcProviderForECKey(
41+
descriptorBuilder: BabylonDescriptorBuilder,
42+
stakerKey: ECPairInterface
43+
): vendor.BtcProvider {
44+
function signWithDescriptor(
45+
psbt: bitcoinjslib.Psbt,
46+
descriptor: Descriptor,
47+
key: ECPairInterface
48+
): bitcoinjslib.Psbt {
49+
psbt = getSignedPsbt(psbt, descriptor, [key], { finalize: false });
50+
// BUG: we need to blindly finalize here even though we have not fully signed
51+
psbt.finalizeAllInputs();
52+
return psbt;
53+
}
54+
55+
return {
56+
async signMessage(signingStep: vendor.SigningStep, message: string, type: 'ecdsa'): Promise<string> {
57+
assert(type === 'ecdsa');
58+
switch (signingStep) {
59+
case 'proof-of-possession':
60+
return stakerKey.sign(Buffer.from(message, 'hex')).toString('hex');
61+
default:
62+
throw new Error(`unexpected signing step: ${signingStep}`);
63+
}
64+
},
65+
async signPsbt(signingStep: vendor.SigningStep, psbtHex: string): Promise<string> {
66+
const psbt = bitcoinjslib.Psbt.fromHex(psbtHex);
67+
switch (signingStep) {
68+
case 'staking-slashing':
69+
return signWithDescriptor(psbt, descriptorBuilder.getStakingDescriptor(), stakerKey).toHex();
70+
case 'unbonding-slashing':
71+
return signWithDescriptor(psbt, descriptorBuilder.getUnbondingDescriptor(), stakerKey).toHex();
72+
default:
73+
throw new Error(`unexpected signing step: ${signingStep}`);
74+
}
75+
},
76+
};
77+
}
78+
79+
/*
80+
* This is mostly lifted from
81+
* https://github.com/babylonlabs-io/btc-staking-ts/blob/v0.4.0-rc.2/src/staking/manager.ts#L100-L172
82+
*
83+
* The difference is that here we are returning an _unsigned_ delegation message.
84+
*/
85+
export async function createUnsignedPreStakeRegistrationBabylonTransaction(
86+
manager: vendor.BabylonBtcStakingManager,
87+
stakingParams: vendor.VersionedStakingParams[],
88+
network: bitcoinjslib.Network,
89+
stakerBtcInfo: vendor.StakerInfo,
90+
stakingInput: vendor.StakingInputs,
91+
babylonBtcTipHeight: number,
92+
inputUTXOs: vendor.UTXO[],
93+
feeRate: number,
94+
babylonAddress: string
95+
): Promise<{
96+
unsignedDelegationMsg: ValueWithTypeUrl<babylonProtobuf.btcstakingtx.MsgCreateBTCDelegation>;
97+
stakingTx: bitcoinjslib.Transaction;
98+
}> {
99+
if (babylonBtcTipHeight === 0) {
100+
throw new Error('Babylon BTC tip height cannot be 0');
101+
}
102+
if (inputUTXOs.length === 0) {
103+
throw new Error('No input UTXOs provided');
104+
}
105+
if (!vendor.isValidBabylonAddress(babylonAddress)) {
106+
throw new Error('Invalid Babylon address');
107+
}
108+
109+
// Get the Babylon params based on the BTC tip height from Babylon chain
110+
const params = vendor.getBabylonParamByBtcHeight(babylonBtcTipHeight, stakingParams);
111+
112+
const staking = new vendor.Staking(
113+
network,
114+
stakerBtcInfo,
115+
params,
116+
stakingInput.finalityProviderPkNoCoordHex,
117+
stakingInput.stakingTimelock
118+
);
119+
120+
// Create unsigned staking transaction
121+
const { transaction } = staking.createStakingTransaction(stakingInput.stakingAmountSat, inputUTXOs, feeRate);
122+
123+
// Create delegation message without including inclusion proof
124+
const msg = await manager.createBtcDelegationMsg(
125+
staking,
126+
stakingInput,
127+
transaction,
128+
babylonAddress,
129+
stakerBtcInfo,
130+
params
131+
);
132+
return {
133+
unsignedDelegationMsg: msg,
134+
stakingTx: transaction,
135+
};
136+
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
1+
export * from './delegationMessage';
12
export * from './descriptor';
23
export * from './testnet';

modules/utxo-staking/test/fixtures/babylon/msgCreateBTCDelegation.testnet.json

Lines changed: 23 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,28 @@
11
{
2-
"msg": {
3-
"stakerAddr": "bbn1qw3jhxaqax8rcq",
4-
"pop": {
5-
"btcSigType": 2,
6-
"btcSig": "77d73c7deef77de75f6dc79cddaf7c7f8f3aedbddcd36f787f6d35d37dfaf5d7dbdb46b9efb71e71de79f3cf74e7a6b7e9ff7475ae3c6da7dc7b9e7ae9cf74e1deb46dc6dcd5bd377b6df6e3be7475feddf3d71bd7c7757fa7dc6ddd3adf4ddb"
7-
},
8-
"btcPk": "7b6a08504c46336f985a5787a5423eb18c10b149fef29cd3316ad86f565cd2b9",
9-
"fpBtcPkList": [
10-
"d23c2c25e1fcf8fd1c21b9a402c19e2e309e531e45e92fb1e9805b6056b0cc76"
11-
],
12-
"stakingTime": 10000,
13-
"stakingValue": 55555,
14-
"stakingTx": "020000000111111111111111111111111111111111111111111111111111111111111111110000000000ffffffff0203d9000000000000225120f1871fc2ac3050b53dc35d502a9d94388f6f373b86f3905667945a8430cbd639bf51090000000000160014896f1ba65deaeb045bb3121e20e5744e66ca0e4800000000",
15-
"slashingTx": "020000000164da14050ffd0e6186c68a59f371a0adc95cc84b0502fe0915be7eba3f771bb30000000000ffffffff02d90a0000000000001600145be12624d08a2b424095d7c07221c33450d14bf1a2ba000000000000225120d5238530e223ef1bd34a8a98ee1708f6a8a87e7a2589d88de6700b9973ffff4600000000",
16-
"delegatorSlashingSig": "f10a5e6d722b459e87d713bf9af1113fa5eb7a1e41ff5738de7049fcf113beaa5f01228aecf27eb94045a9900b092091a63dbf546fd7d6c05d32d32cf8ad591d",
17-
"unbondingTime": 1008,
18-
"unbondingTx": "020000000164da14050ffd0e6186c68a59f371a0adc95cc84b0502fe0915be7eba3f771bb30000000000ffffffff0133d10000000000002251204dcea0c802236110602d7b1cc2e76ef5f1f05170b058685b4caf4367ac849d6b00000000",
19-
"unbondingValue": 53555,
20-
"unbondingSlashingTx": "0200000001c047c5904542017cfee57fdb350d6bf776a5ef8c46bc033f454a64b496d0ab9d0000000000ffffffff02750a0000000000001600145be12624d08a2b424095d7c07221c33450d14bf136b3000000000000225120d5238530e223ef1bd34a8a98ee1708f6a8a87e7a2589d88de6700b9973ffff4600000000",
21-
"delegatorUnbondingSlashingSig": "5bf9bed637fbd109d53c60df4093b166ba06a27b90c6b7d05beb9124a19fc62d1d17522a309d4dd7d8dc2eed954dcb3f628f44ae9837c02b91545fa313de6e17"
2+
"unsignedDelegationMsg": {
3+
"typeUrl": "/babylon.btcstaking.v1.MsgCreateBTCDelegation",
4+
"value": {
5+
"stakerAddr": "bbn1qw3jhxaqax8rcq",
6+
"pop": {
7+
"btcSigType": 2,
8+
"btcSig": "77d73c7deef77de75f6dc79cddaf7c7f8f3aedbddcd36f787f6d35d37dfaf5d7dbdb46b9efb71e71de79f3cf74e7a6b7e9ff7475ae3c6da7dc7b9e7ae9cf74e1deb46dc6dcd5bd377b6df6e3be7475feddf3d71bd7c7757fa7dc6ddd3adf4ddb"
9+
},
10+
"btcPk": "7b6a08504c46336f985a5787a5423eb18c10b149fef29cd3316ad86f565cd2b9",
11+
"fpBtcPkList": [
12+
"d23c2c25e1fcf8fd1c21b9a402c19e2e309e531e45e92fb1e9805b6056b0cc76"
13+
],
14+
"stakingTime": 10000,
15+
"stakingValue": 55555,
16+
"stakingTx": "020000000111111111111111111111111111111111111111111111111111111111111111110000000000ffffffff0203d9000000000000225120f1871fc2ac3050b53dc35d502a9d94388f6f373b86f3905667945a8430cbd639bf51090000000000160014896f1ba65deaeb045bb3121e20e5744e66ca0e4800000000",
17+
"slashingTx": "020000000164da14050ffd0e6186c68a59f371a0adc95cc84b0502fe0915be7eba3f771bb30000000000ffffffff02d90a0000000000001600145be12624d08a2b424095d7c07221c33450d14bf1a2ba000000000000225120d5238530e223ef1bd34a8a98ee1708f6a8a87e7a2589d88de6700b9973ffff4600000000",
18+
"delegatorSlashingSig": "f10a5e6d722b459e87d713bf9af1113fa5eb7a1e41ff5738de7049fcf113beaa5f01228aecf27eb94045a9900b092091a63dbf546fd7d6c05d32d32cf8ad591d",
19+
"unbondingTime": 1008,
20+
"unbondingTx": "020000000164da14050ffd0e6186c68a59f371a0adc95cc84b0502fe0915be7eba3f771bb30000000000ffffffff0133d10000000000002251204dcea0c802236110602d7b1cc2e76ef5f1f05170b058685b4caf4367ac849d6b00000000",
21+
"unbondingValue": 53555,
22+
"unbondingSlashingTx": "0200000001c047c5904542017cfee57fdb350d6bf776a5ef8c46bc033f454a64b496d0ab9d0000000000ffffffff02750a0000000000001600145be12624d08a2b424095d7c07221c33450d14bf136b3000000000000225120d5238530e223ef1bd34a8a98ee1708f6a8a87e7a2589d88de6700b9973ffff4600000000",
23+
"delegatorUnbondingSlashingSig": "5bf9bed637fbd109d53c60df4093b166ba06a27b90c6b7d05beb9124a19fc62d1d17522a309d4dd7d8dc2eed954dcb3f628f44ae9837c02b91545fa313de6e17"
24+
}
2225
},
23-
"msgBytes": "0a1262626e317177336a6878617161783872637112640802126077d73c7deef77de75f6dc79cddaf7c7f8f3aedbddcd36f787f6d35d37dfaf5d7dbdb46b9efb71e71de79f3cf74e7a6b7e9ff7475ae3c6da7dc7b9e7ae9cf74e1deb46dc6dcd5bd377b6df6e3be7475feddf3d71bd7c7757fa7dc6ddd3adf4ddb1a207b6a08504c46336f985a5787a5423eb18c10b149fef29cd3316ad86f565cd2b92220d23c2c25e1fcf8fd1c21b9a402c19e2e309e531e45e92fb1e9805b6056b0cc7628904e3083b2033a7d020000000111111111111111111111111111111111111111111111111111111111111111110000000000ffffffff0203d9000000000000225120f1871fc2ac3050b53dc35d502a9d94388f6f373b86f3905667945a8430cbd639bf51090000000000160014896f1ba65deaeb045bb3121e20e5744e66ca0e48000000004a7d020000000164da14050ffd0e6186c68a59f371a0adc95cc84b0502fe0915be7eba3f771bb30000000000ffffffff02d90a0000000000001600145be12624d08a2b424095d7c07221c33450d14bf1a2ba000000000000225120d5238530e223ef1bd34a8a98ee1708f6a8a87e7a2589d88de6700b9973ffff46000000005240f10a5e6d722b459e87d713bf9af1113fa5eb7a1e41ff5738de7049fcf113beaa5f01228aecf27eb94045a9900b092091a63dbf546fd7d6c05d32d32cf8ad591d58f007625e020000000164da14050ffd0e6186c68a59f371a0adc95cc84b0502fe0915be7eba3f771bb30000000000ffffffff0133d10000000000002251204dcea0c802236110602d7b1cc2e76ef5f1f05170b058685b4caf4367ac849d6b0000000068b3a203727d0200000001c047c5904542017cfee57fdb350d6bf776a5ef8c46bc033f454a64b496d0ab9d0000000000ffffffff02750a0000000000001600145be12624d08a2b424095d7c07221c33450d14bf136b3000000000000225120d5238530e223ef1bd34a8a98ee1708f6a8a87e7a2589d88de6700b9973ffff46000000007a405bf9bed637fbd109d53c60df4093b166ba06a27b90c6b7d05beb9124a19fc62d1d17522a309d4dd7d8dc2eed954dcb3f628f44ae9837c02b91545fa313de6e17",
2426
"stakingTx": {
2527
"version": 2,
2628
"locktime": 0,

modules/utxo-staking/test/fixtures/babylon/msgCreateBTCDelegation.testnetMock.json

Lines changed: 23 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,28 @@
11
{
2-
"msg": {
3-
"stakerAddr": "bbn1qw3jhxaqax8rcq",
4-
"pop": {
5-
"btcSigType": 2,
6-
"btcSig": "77d73c7deef77de75f6dc79cddaf7c7f8f3aedbddcd36f787f6d35d37dfaf5d7dbdb46b9efb71e71de79f3cf74e7a6b7e9ff7475ae3c6da7dc7b9e7ae9cf74e1deb46dc6dcd5bd377b6df6e3be7475feddf3d71bd7c7757fa7dc6ddd3adf4ddb"
7-
},
8-
"btcPk": "7b6a08504c46336f985a5787a5423eb18c10b149fef29cd3316ad86f565cd2b9",
9-
"fpBtcPkList": [
10-
"850854d26df93570748d94e3da361f134c522f7970bd7f8701a164547308a900"
11-
],
12-
"stakingTime": 10000,
13-
"stakingValue": 55555,
14-
"stakingTx": "020000000111111111111111111111111111111111111111111111111111111111111111110000000000ffffffff0203d9000000000000225120788d73d75d7dd88d3612f7a91d5b3d6ad4778d8b49176f9539d322980b2f4fd7bf51090000000000160014896f1ba65deaeb045bb3121e20e5744e66ca0e4800000000",
15-
"slashingTx": "0200000001a999d7bc6af1a17cd4e70d0fd875a1734152dfb55f9166240f35965c79fa36c20000000000ffffffff02d90a0000000000001600145be12624d08a2b424095d7c07221c33450d14bf1a2ba000000000000225120d5238530e223ef1bd34a8a98ee1708f6a8a87e7a2589d88de6700b9973ffff4600000000",
16-
"delegatorSlashingSig": "c032a98f7d16adc8a1438310782b35aa0e5d23abca1deb1d743461e7649e0cca07b030c2f083ffb21b88b8de1198a919853b576a7e9c4b80f5bcd6cb544536b4",
17-
"unbondingTime": 1008,
18-
"unbondingTx": "0200000001a999d7bc6af1a17cd4e70d0fd875a1734152dfb55f9166240f35965c79fa36c20000000000ffffffff0133d1000000000000225120dec7bc887b110e2c10f1c9a2212cd961e95184870c91d88c9a3727f4ef4c303c00000000",
19-
"unbondingValue": 53555,
20-
"unbondingSlashingTx": "02000000014c2a294c5e31886937d0985e69e65314419e8866e5ab859cb2903cbe420a555a0000000000ffffffff02750a0000000000001600145be12624d08a2b424095d7c07221c33450d14bf136b3000000000000225120d5238530e223ef1bd34a8a98ee1708f6a8a87e7a2589d88de6700b9973ffff4600000000",
21-
"delegatorUnbondingSlashingSig": "71fdbb1e85db78b2406f7f6a8bbbeecd9be27d6099c4b80b2cf09403a855b55d057805576afad3bf92b79487e9559ad355c9728f95fe191c7a78b21284925fd0"
2+
"unsignedDelegationMsg": {
3+
"typeUrl": "/babylon.btcstaking.v1.MsgCreateBTCDelegation",
4+
"value": {
5+
"stakerAddr": "bbn1qw3jhxaqax8rcq",
6+
"pop": {
7+
"btcSigType": 2,
8+
"btcSig": "77d73c7deef77de75f6dc79cddaf7c7f8f3aedbddcd36f787f6d35d37dfaf5d7dbdb46b9efb71e71de79f3cf74e7a6b7e9ff7475ae3c6da7dc7b9e7ae9cf74e1deb46dc6dcd5bd377b6df6e3be7475feddf3d71bd7c7757fa7dc6ddd3adf4ddb"
9+
},
10+
"btcPk": "7b6a08504c46336f985a5787a5423eb18c10b149fef29cd3316ad86f565cd2b9",
11+
"fpBtcPkList": [
12+
"850854d26df93570748d94e3da361f134c522f7970bd7f8701a164547308a900"
13+
],
14+
"stakingTime": 10000,
15+
"stakingValue": 55555,
16+
"stakingTx": "020000000111111111111111111111111111111111111111111111111111111111111111110000000000ffffffff0203d9000000000000225120788d73d75d7dd88d3612f7a91d5b3d6ad4778d8b49176f9539d322980b2f4fd7bf51090000000000160014896f1ba65deaeb045bb3121e20e5744e66ca0e4800000000",
17+
"slashingTx": "0200000001a999d7bc6af1a17cd4e70d0fd875a1734152dfb55f9166240f35965c79fa36c20000000000ffffffff02d90a0000000000001600145be12624d08a2b424095d7c07221c33450d14bf1a2ba000000000000225120d5238530e223ef1bd34a8a98ee1708f6a8a87e7a2589d88de6700b9973ffff4600000000",
18+
"delegatorSlashingSig": "c032a98f7d16adc8a1438310782b35aa0e5d23abca1deb1d743461e7649e0cca07b030c2f083ffb21b88b8de1198a919853b576a7e9c4b80f5bcd6cb544536b4",
19+
"unbondingTime": 1008,
20+
"unbondingTx": "0200000001a999d7bc6af1a17cd4e70d0fd875a1734152dfb55f9166240f35965c79fa36c20000000000ffffffff0133d1000000000000225120dec7bc887b110e2c10f1c9a2212cd961e95184870c91d88c9a3727f4ef4c303c00000000",
21+
"unbondingValue": 53555,
22+
"unbondingSlashingTx": "02000000014c2a294c5e31886937d0985e69e65314419e8866e5ab859cb2903cbe420a555a0000000000ffffffff02750a0000000000001600145be12624d08a2b424095d7c07221c33450d14bf136b3000000000000225120d5238530e223ef1bd34a8a98ee1708f6a8a87e7a2589d88de6700b9973ffff4600000000",
23+
"delegatorUnbondingSlashingSig": "71fdbb1e85db78b2406f7f6a8bbbeecd9be27d6099c4b80b2cf09403a855b55d057805576afad3bf92b79487e9559ad355c9728f95fe191c7a78b21284925fd0"
24+
}
2225
},
23-
"msgBytes": "0a1262626e317177336a6878617161783872637112640802126077d73c7deef77de75f6dc79cddaf7c7f8f3aedbddcd36f787f6d35d37dfaf5d7dbdb46b9efb71e71de79f3cf74e7a6b7e9ff7475ae3c6da7dc7b9e7ae9cf74e1deb46dc6dcd5bd377b6df6e3be7475feddf3d71bd7c7757fa7dc6ddd3adf4ddb1a207b6a08504c46336f985a5787a5423eb18c10b149fef29cd3316ad86f565cd2b92220850854d26df93570748d94e3da361f134c522f7970bd7f8701a164547308a90028904e3083b2033a7d020000000111111111111111111111111111111111111111111111111111111111111111110000000000ffffffff0203d9000000000000225120788d73d75d7dd88d3612f7a91d5b3d6ad4778d8b49176f9539d322980b2f4fd7bf51090000000000160014896f1ba65deaeb045bb3121e20e5744e66ca0e48000000004a7d0200000001a999d7bc6af1a17cd4e70d0fd875a1734152dfb55f9166240f35965c79fa36c20000000000ffffffff02d90a0000000000001600145be12624d08a2b424095d7c07221c33450d14bf1a2ba000000000000225120d5238530e223ef1bd34a8a98ee1708f6a8a87e7a2589d88de6700b9973ffff46000000005240c032a98f7d16adc8a1438310782b35aa0e5d23abca1deb1d743461e7649e0cca07b030c2f083ffb21b88b8de1198a919853b576a7e9c4b80f5bcd6cb544536b458f007625e0200000001a999d7bc6af1a17cd4e70d0fd875a1734152dfb55f9166240f35965c79fa36c20000000000ffffffff0133d1000000000000225120dec7bc887b110e2c10f1c9a2212cd961e95184870c91d88c9a3727f4ef4c303c0000000068b3a203727d02000000014c2a294c5e31886937d0985e69e65314419e8866e5ab859cb2903cbe420a555a0000000000ffffffff02750a0000000000001600145be12624d08a2b424095d7c07221c33450d14bf136b3000000000000225120d5238530e223ef1bd34a8a98ee1708f6a8a87e7a2589d88de6700b9973ffff46000000007a4071fdbb1e85db78b2406f7f6a8bbbeecd9be27d6099c4b80b2cf09403a855b55d057805576afad3bf92b79487e9559ad355c9728f95fe191c7a78b21284925fd0",
2426
"stakingTx": {
2527
"version": 2,
2628
"locktime": 0,

modules/utxo-staking/test/unit/babylon/transaction.utils.ts

Lines changed: 0 additions & 40 deletions
This file was deleted.

0 commit comments

Comments
 (0)