Skip to content

Commit 2cd6b5d

Browse files
Merge pull request #5068 from BitGo/BTC-1578-descriptor
feat(utxo-coredao): descriptor for staking output
2 parents 8ef8b38 + 791f9e4 commit 2cd6b5d

17 files changed

+306
-41
lines changed

modules/utxo-coredao/package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
]
4141
},
4242
"dependencies": {
43-
"@bitgo/utxo-lib": "^11.0.0"
43+
"@bitgo/utxo-lib": "^11.0.0",
44+
"@bitgo/wasm-miniscript": "^2.0.0-beta.2"
4445
}
4546
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
import { BIP32Interface } from '@bitgo/utxo-lib';
2+
3+
/**
4+
* Script type for a descriptor. This is either a p2sh (sh) or a p2sh-p2wsh (sh-wsh) script.
5+
*/
6+
export type ScriptType = 'sh' | 'sh-wsh';
7+
8+
/**
9+
* Create a multi-sig descriptor to produce a coredao staking address
10+
* @param scriptType segwit or legacy
11+
* @param locktime locktime for CLTV
12+
* @param m Total number of keys required to unlock
13+
* @param orderedKeys
14+
* @param neutered If true, neuter the keys. Default to true
15+
*/
16+
export function createMultiSigDescriptor(
17+
scriptType: ScriptType,
18+
locktime: number,
19+
m: number,
20+
orderedKeys: BIP32Interface[],
21+
neutered = true
22+
): string {
23+
if (m > orderedKeys.length || m < 1) {
24+
throw new Error(
25+
`m (${m}) must be less than or equal to the number of keys (${orderedKeys.length}) and greater than 0`
26+
);
27+
}
28+
if (locktime <= 0) {
29+
throw new Error(`locktime (${locktime}) must be greater than 0`);
30+
}
31+
32+
const xpubs = orderedKeys.map((key) => (neutered ? key.neutered() : key).toBase58() + '/*');
33+
const inner = `and_v(r:after(${locktime}),multi(${m},${xpubs.join(',')}))`;
34+
return scriptType === 'sh' ? `sh(${inner})` : `sh(wsh(${inner}))`;
35+
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
OP_PUSHBYTES_2 0008 OP_CLTV OP_DROP OP_PUSHNUM_2 OP_PUSHBYTES_33 03b6ca82c5298cba26c76a9cc5a9bb08c68b125263924ac9d58a15a60d49cf3ef3 OP_PUSHBYTES_33 02e6a4442a7efbc0f53fad6ff2a7c0940ea18c751a0b6644c03675babd731015cc OP_PUSHNUM_2 OP_CHECKMULTISIG
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
{
2+
"Sh": {
3+
"Ms": {
4+
"AndV": [
5+
{
6+
"Drop": {
7+
"After": {
8+
"absLockTime": 2048
9+
}
10+
}
11+
},
12+
{
13+
"Multi": [
14+
2,
15+
{
16+
"XPub": "xpub661MyMwAqRbcGZfgedgcQiBJpkHoZ37k6uotUVLoC6Px4Y46Yrdmy1CUogcJMoAsosY381gPjhGe9jFx1uYAcxy2gTHh9YFP32tUWycqHnV/*"
17+
},
18+
{
19+
"XPub": "xpub661MyMwAqRbcF8FoYWukS8eTn2gVEojzwf5DYETpB8uqC8t5sqDCEFnuJ39DaPjLRerBDK9QqSMvSYpT4WSugCVbUK5HEevSKAu1wUkVWsS/*"
20+
}
21+
]
22+
}
23+
]
24+
}
25+
}
26+
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
sh(and_v(r:after(2048),multi(2,xprv9s21ZrQH143K45bDYc9c3aEaGiTK9aPtjgtHg6wBdkryBjix1KKXRCszxPcFPejLT9tdLgNe8E8AuQXK2fy8KhNPeLAZsGoX8w9KS2PkacL/*,xprv9s21ZrQH143K2eBLSVNk4zhjDzqzqM29aS9cjr4CcoNrKLYwLHtwgTURSk7RPV3cH9zNZQeR1zGw3MEwSjvARSfWEGpxfaBmduhW3TKsH5g/*)))
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
02000000013ccb3b820130a360a33cc4b8afa063d6c6c2cf04680d6ac3b728db0a82cbec6700000000e100483045022100bdf153f069124649bd6053bc5134b8ee49769fd91bebd38a1d366dfa6aca837c02201c78e9a8804339bef63c2a8250e86faced3feab246f092b460a2289070ff1e8301483045022100cf53ecb0baa76b98e66a2b110a28267f72dff6b243d799013e20561696dfa61d0220067ecaa7fbc50026a56234fe61a25995c4a2b2f6c29c9ab55241cfd5ffc33183014c4c020008b175522103b6ca82c5298cba26c76a9cc5a9bb08c68b125263924ac9d58a15a60d49cf3ef32102e6a4442a7efbc0f53fad6ff2a7c0940ea18c751a0b6644c03675babd731015cc52aefeffffff01804a5d050000000017a914199ff00d994285c5fa0c08a4becd8973945e06c28700080000
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
OP_PUSHBYTES_2 0008 OP_CLTV OP_DROP OP_PUSHNUM_3 OP_PUSHBYTES_33 03b6ca82c5298cba26c76a9cc5a9bb08c68b125263924ac9d58a15a60d49cf3ef3 OP_PUSHBYTES_33 02e6a4442a7efbc0f53fad6ff2a7c0940ea18c751a0b6644c03675babd731015cc OP_PUSHBYTES_33 038ce8843d1085927fdb26a26e9869d6c10dcd37aa45fdd9773ff544a7f3514c82 OP_PUSHNUM_3 OP_CHECKMULTISIG
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
{
2+
"Sh": {
3+
"Ms": {
4+
"AndV": [
5+
{
6+
"Drop": {
7+
"After": {
8+
"absLockTime": 2048
9+
}
10+
}
11+
},
12+
{
13+
"Multi": [
14+
3,
15+
{
16+
"XPub": "xpub661MyMwAqRbcGZfgedgcQiBJpkHoZ37k6uotUVLoC6Px4Y46Yrdmy1CUogcJMoAsosY381gPjhGe9jFx1uYAcxy2gTHh9YFP32tUWycqHnV/*"
17+
},
18+
{
19+
"XPub": "xpub661MyMwAqRbcF8FoYWukS8eTn2gVEojzwf5DYETpB8uqC8t5sqDCEFnuJ39DaPjLRerBDK9QqSMvSYpT4WSugCVbUK5HEevSKAu1wUkVWsS/*"
20+
},
21+
{
22+
"XPub": "xpub661MyMwAqRbcFdScyinA4JpCViqkKsd37MQ6fwuZQQ4shdaGRRX9a8bWvR9QC1AFqKongweJJfyrm7uCoWmCw7UixwGZkZnCT2mchFr7cQb/*"
23+
}
24+
]
25+
}
26+
]
27+
}
28+
}
29+
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
sh(and_v(r:after(2048),multi(3,xprv9s21ZrQH143K45bDYc9c3aEaGiTK9aPtjgtHg6wBdkryBjix1KKXRCszxPcFPejLT9tdLgNe8E8AuQXK2fy8KhNPeLAZsGoX8w9KS2PkacL/*,xprv9s21ZrQH143K2eBLSVNk4zhjDzqzqM29aS9cjr4CcoNrKLYwLHtwgTURSk7RPV3cH9zNZQeR1zGw3MEwSjvARSfWEGpxfaBmduhW3TKsH5g/*,xprv9s21ZrQH143K39N9shF9hAsTwh1FvQuBk8UVsZVwr4XtpqF7stCu2LH358NLuqkkK6pu1Af7TJHr5FZERQoLLtnC7wkoM9sdFo1HuP7dWuv/*)))
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
02000000012864beb49a42260574c7fc2d89a97dba04073353eb5bae5c08b2bde845db371300000000fd49010047304402201f27a9ed1572e5cf4be3c09c48c4df8cbebb7553af584dd437ef541f7c9edc9a02204fe6c5d4bdbd8094f20c7e78160686243a664f69dd41256a4eb6aa97c1f3765b01473044022023d1e8dd29365a384553889b7101071bf1bd265978032155734a65ef7fb240c1022073d45ea7090e31798ebd3e3b41d552706f6bec78ca5fa129c3f3d3a2690478fc01473044022053ad461ec6173e4699ece94345f3aedaa758d7b4070d6f3c75567ab07092013e02204d77ece097fa2f7283dd5e3e4256695c29f3abee7e59d47fc4334c15277f2334014c6e020008b175532103b6ca82c5298cba26c76a9cc5a9bb08c68b125263924ac9d58a15a60d49cf3ef32102e6a4442a7efbc0f53fad6ff2a7c0940ea18c751a0b6644c03675babd731015cc21038ce8843d1085927fdb26a26e9869d6c10dcd37aa45fdd9773ff544a7f3514c8253aefeffffff01804a5d050000000017a914bf73c6a0f7b8e8ed8ad854cc2d65ffe21ad276298700080000

0 commit comments

Comments
 (0)