Skip to content

Commit daabd75

Browse files
feat(utxo-coredao): descriptor for CoreDao
TICKET: BTC-1578
1 parent 5d7758a commit daabd75

File tree

12 files changed

+189
-0
lines changed

12 files changed

+189
-0
lines changed
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
import { BIP32Interface, bitgo } 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+
*/
15+
export function createMultiSigDescriptor(
16+
scriptType: ScriptType,
17+
locktime: number,
18+
m: number,
19+
orderedKeys: BIP32Interface[]
20+
): string {
21+
if (m > orderedKeys.length || m < 1) {
22+
throw new Error(
23+
`m (${m}) must be less than or equal to the number of keys (${orderedKeys.length}) and greater than 0`
24+
);
25+
}
26+
if (locktime <= 0) {
27+
throw new Error(`locktime (${locktime}) must be greater than 0`);
28+
}
29+
30+
const xpubs = orderedKeys.map((key) => key.toBase58() + '/*');
31+
const inner = `and_v(r:after(${locktime}),multi(${m},${xpubs.join(',')}))`;
32+
return scriptType === 'sh' ? `sh(${inner})` : `sh(wsh(${inner}))`;
33+
}
34+
35+
/**
36+
* Create a wallet descriptor to produce a coredao staking address for a standard BitGo wallet
37+
* @param scriptType
38+
* @param locktime
39+
* @param rootWalletKeys
40+
*/
41+
export function createWalletDescriptor(
42+
scriptType: ScriptType,
43+
locktime: number,
44+
rootWalletKeys: bitgo.RootWalletKeys
45+
): string {
46+
return createMultiSigDescriptor(scriptType, locktime, 2, rootWalletKeys.triple);
47+
}
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: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
{"Sh":{"Ms":{"AndV":[{"Drop":{"After":{"absLockTime":2048}}},{"Multi":[2,{"XPub":"xpub661MyMwAqRbcGZfgedgcQiBJpkHoZ37k6uotUVLoC6Px4Y46Yrdmy1CUogcJMoAsosY381gPjhGe9jFx1uYAcxy2gTHh9YFP32tUWycqHnV/*"},{"XPub":"xpub661MyMwAqRbcF8FoYWukS8eTn2gVEojzwf5DYETpB8uqC8t5sqDCEFnuJ39DaPjLRerBDK9QqSMvSYpT4WSugCVbUK5HEevSKAu1wUkVWsS/*"}]}]}}}
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+
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: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
{"Sh":{"Ms":{"AndV":[{"Drop":{"After":{"absLockTime":2048}}},{"Multi":[3,{"XPub":"xpub661MyMwAqRbcGZfgedgcQiBJpkHoZ37k6uotUVLoC6Px4Y46Yrdmy1CUogcJMoAsosY381gPjhGe9jFx1uYAcxy2gTHh9YFP32tUWycqHnV/*"},{"XPub":"xpub661MyMwAqRbcF8FoYWukS8eTn2gVEojzwf5DYETpB8uqC8t5sqDCEFnuJ39DaPjLRerBDK9QqSMvSYpT4WSugCVbUK5HEevSKAu1wUkVWsS/*"},{"XPub":"xpub661MyMwAqRbcFdScyinA4JpCViqkKsd37MQ6fwuZQQ4shdaGRRX9a8bWvR9QC1AFqKongweJJfyrm7uCoWmCw7UixwGZkZnCT2mchFr7cQb/*"}]}]}}}
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+
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: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
{"Sh":{"Wsh":{"Ms":{"AndV":[{"Drop":{"After":{"absLockTime":2048}}},{"Multi":[2,{"XPub":"xpub661MyMwAqRbcGZfgedgcQiBJpkHoZ37k6uotUVLoC6Px4Y46Yrdmy1CUogcJMoAsosY381gPjhGe9jFx1uYAcxy2gTHh9YFP32tUWycqHnV/*"},{"XPub":"xpub661MyMwAqRbcF8FoYWukS8eTn2gVEojzwf5DYETpB8uqC8t5sqDCEFnuJ39DaPjLRerBDK9QqSMvSYpT4WSugCVbUK5HEevSKAu1wUkVWsS/*"}]}]}}}}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
sh(wsh(and_v(r:after(2048),multi(2,xprv9s21ZrQH143K45bDYc9c3aEaGiTK9aPtjgtHg6wBdkryBjix1KKXRCszxPcFPejLT9tdLgNe8E8AuQXK2fy8KhNPeLAZsGoX8w9KS2PkacL/*,xprv9s21ZrQH143K2eBLSVNk4zhjDzqzqM29aS9cjr4CcoNrKLYwLHtwgTURSk7RPV3cH9zNZQeR1zGw3MEwSjvARSfWEGpxfaBmduhW3TKsH5g/*))))

0 commit comments

Comments
 (0)