Skip to content

Commit 86b44b1

Browse files
Merge pull request #7467 from BitGo/BTC-2742.external-wallet-outputs
feat(utxo-lib): enhance PSBT fixtures and utilities
2 parents b6dbbd8 + 35bdd8b commit 86b44b1

File tree

55 files changed

+7062
-368
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

55 files changed

+7062
-368
lines changed

modules/utxo-lib/src/bitgo/wallet/WalletOutput.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -195,7 +195,8 @@ export function addWalletOutputToPsbt(
195195
rootWalletKeys: RootWalletKeys,
196196
chain: ChainCode,
197197
index: number,
198-
value: bigint
198+
value: bigint,
199+
{ addDerivationInfo = true }: { addDerivationInfo?: boolean } = {}
199200
): void {
200201
const walletKeys = rootWalletKeys.deriveForChainAndIndex(chain, index);
201202
const scriptType = scriptTypeForChain(chain);
@@ -207,7 +208,9 @@ export function addWalletOutputToPsbt(
207208
const { scriptPubKey: script } = createOutputScript2of3(walletKeys.publicKeys, scriptType);
208209
psbt.addOutput({ script, value });
209210
}
210-
updateWalletOutputForPsbt(psbt, rootWalletKeys, psbt.data.outputs.length - 1, chain, index);
211+
if (addDerivationInfo) {
212+
updateWalletOutputForPsbt(psbt, rootWalletKeys, psbt.data.outputs.length - 1, chain, index);
213+
}
211214
}
212215

213216
/**

modules/utxo-lib/src/testutil/keys.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,10 @@ export function getDefaultCosigner<T>(keyset: Triple<T>, signer: T): T {
5252
throw new Error(`signer not in pubkeys`);
5353
}
5454

55+
export function getWalletKeysForSeed(seed: string): RootWalletKeys {
56+
return new RootWalletKeys(getKeyTriple(seed));
57+
}
58+
5559
export function getDefaultWalletKeys(): RootWalletKeys {
56-
return new RootWalletKeys(getKeyTriple('default'));
60+
return getWalletKeysForSeed('default');
5761
}

modules/utxo-lib/src/testutil/psbt.ts

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import * as bitcoinjslib from 'bitcoinjs-lib';
12
import { ok as assert } from 'assert';
23

34
import {
@@ -31,9 +32,10 @@ import { mockReplayProtectionUnspent, mockWalletUnspent } from './mock';
3132
import { toOutputScript } from '../address';
3233

3334
/**
34-
* input script type and value.
35-
* use p2trMusig2 for p2trMusig2 script path.
36-
* use taprootKeyPathSpend for p2trMusig2 key path.
35+
* This is a bit of a misnomer, as it actually specifies the spend type of the input.
36+
* This makes a difference for p2trMusig2 inputs, as they can be spent either by key path or script path.
37+
* The value p2trMusig2 is used for p2trMusig2 script path.
38+
* The value taprootKeyPathSpend is used for p2trMusig2 key path.
3739
*/
3840
export type InputScriptType = ScriptType | 'taprootKeyPathSpend';
3941
export type OutputScriptType = ScriptType2Of3;
@@ -52,8 +54,12 @@ export type Input = {
5254
// Make script: string as instead of scriptType or address
5355
export type Output = {
5456
value: bigint;
57+
// Determines chain code for the output
5558
isInternalAddress?: boolean;
56-
} & ({ scriptType: OutputScriptType } | { address: string } | { script: string });
59+
// Determines the wallet keys to use for the output. By default use root wallet keys used for the inputs.
60+
// When set to null, omits the derivation info and effectively makes the output non-wallet output.
61+
walletKeys?: RootWalletKeys | null;
62+
} & ({ scriptType: OutputScriptType } | { address: string } | { script: string } | { opReturn: string });
5763

5864
/**
5965
* array of supported input script types.
@@ -194,18 +200,30 @@ export function constructPsbt(
194200
if ('scriptType' in output) {
195201
addWalletOutputToPsbt(
196202
psbt,
197-
rootWalletKeys,
203+
output.walletKeys ?? rootWalletKeys,
198204
output.isInternalAddress ? getInternalChainCode(output.scriptType) : getExternalChainCode(output.scriptType),
199205
i,
200-
output.value
206+
output.value,
207+
{ addDerivationInfo: output.walletKeys !== null }
201208
);
209+
return;
202210
} else if ('address' in output) {
203211
const { address, value } = output;
204212
psbt.addOutput({ script: toOutputScript(address, network), value });
213+
return;
214+
} else if ('opReturn' in output) {
215+
const { opReturn, value } = output;
216+
const script = bitcoinjslib.payments.embed({ data: [Buffer.from(opReturn, 'ascii')] }).output;
217+
assert(script, 'script is required');
218+
psbt.addOutput({ script, value });
219+
return;
205220
} else if ('script' in output) {
206221
const { script, value } = output;
207222
psbt.addOutput({ script: Buffer.from(script, 'hex'), value });
223+
return;
208224
}
225+
226+
throw new Error('invalid output');
209227
});
210228

211229
if (sign === 'unsigned') {

modules/utxo-lib/test/bitgo/fixtures/psbt/psbt-lite.bitcoin.fullsigned.json

Lines changed: 622 additions & 0 deletions
Large diffs are not rendered by default.

modules/utxo-lib/test/bitgo/fixtures/psbt/psbt-lite.bitcoin.halfsigned.json

Lines changed: 532 additions & 0 deletions
Large diffs are not rendered by default.

modules/utxo-lib/test/bitgo/fixtures/psbt/psbt-lite.bitcoin.unsigned.json

Lines changed: 463 additions & 0 deletions
Large diffs are not rendered by default.
Lines changed: 158 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,158 @@
1+
{
2+
"walletKeys": [
3+
"xprv9s21ZrQH143K45bDYc9c3aEaGiTK9aPtjgtHg6wBdkryBjix1KKXRCszxPcFPejLT9tdLgNe8E8AuQXK2fy8KhNPeLAZsGoX8w9KS2PkacL",
4+
"xprv9s21ZrQH143K2eBLSVNk4zhjDzqzqM29aS9cjr4CcoNrKLYwLHtwgTURSk7RPV3cH9zNZQeR1zGw3MEwSjvARSfWEGpxfaBmduhW3TKsH5g",
5+
"xprv9s21ZrQH143K39N9shF9hAsTwh1FvQuBk8UVsZVwr4XtpqF7stCu2LH358NLuqkkK6pu1Af7TJHr5FZERQoLLtnC7wkoM9sdFo1HuP7dWuv"
6+
],
7+
"psbtBase64": "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",
8+
"psbtBase64Finalized": "cHNidP8BANYCAAAAAtXfdTBXaO3hAaMVPLavKMxhzcqBZRvfo2qnxEBDSeXtAAAAAAD/////AWwmXH9/BmqsmzByVuaOTbCQFWkakkLlHO5gfQAfp/MBAAAAAP////8EhAMAAAAAAAAXqRTZCUdEBMEko9BMP7/2H6pJz0PFi4eEAwAAAAAAABepFE79dh6b5hyqQhyKrEqQKtbypUvPh4QDAAAAAAAAF6kU0k04Fr6KJQy93n6qZ0+AFwzalE6HhAMAAAAAAAARag9zZXRlYyBhc3Ryb25vbXkAAAAATwEEiLIeAAAAAAAAAAAAOpIuKfDI6w2ypgSEy9y2MfaxB8nKrj/9zz59LsH2vNADEhSHFfNh2raFpmnUJDHl1tP5c0BNq5yf0blQsnmtdjQEzBiuCE8BBIiyHgAAAAAAAAAAAG0dZW093ZHBlMBFZaNgNwKiEBbO0UomXziYLWJ15ntkA9O6wjE6fGshy7EbFLDRA0H5IsCkA6i9jIfw3IIPNa9uBPZc2GlPAQSIsh4AAAAAAAAAAADLBP1jqzTZD+ZGa4gOKgLM+KhjN0MSmRr4kRsaqrRDNAM27yKP/puO//ugUsMtM0Zg3R+DZs+P5Erlqmcra2KQlQTy7wOJAAEBINAHAAAAAAAAF6kUVnzXtE+fOgfDE483v5hLYPu68kOHAQf8AEcwRAIgRnE/5xcnJ3snIaHplFxYTgb6Nk4tEl+VW47krOGgN14CICBeVli3kPKrCNz3zz9ncwr9mN0Kgs4wYS1JEQQwkX4kQUcwRAIgfHwUwe5Gnjfo73jKvgnLkUI3V8J1efpA9Lq4RHs2c84CID9vedEuEw56MBebVYzJIWj6ExeJbU/tV0CcoTrqVSvuQUxpUiED9vQHZL1dY/IAoneIg6z3XpbxUJXJmCY8CHJw0Ml+fn8hA1/7erxwFZ4EafS5iabV4XhaKQQWn/BQsvRo/l09XbvyIQPhUk1/b8V6s+rLtlm3hxBngKR10dtIOVLCMQt+mjiXW1OuAAEBINAHAAAAAAAAF6kUILNwlNgqUTRR/wzNnbI6ugW8XvOHAQdsRzBEAiAeEl+PkVFPip16IBQrVgPpl7rB84rrTZKvS8Bwxu0RTgIgIK9Cwb2zSfxI5yLKDV7Dbx4t66/nIkKO9etpOqjAhxdBIyEDNu8ij/6bjv/7oFLDLTNGYN0fg2bPj+RK5apnK2tikJWsAAEAaVIhAsxND6QRysJESG+OssCOA1/3QQ9GCjWcp/iBCZG9O0IJIQLXL9DQ2QKTQ0rV/KFg8njgPGFEl6pOQlz0VOLBMw+WqyEDRNiEE231UCAoZf+8YhjH+ciP5s45yUV5gZC62zinUvFTriICAsxND6QRysJESG+OssCOA1/3QQ9GCjWcp/iBCZG9O0IJFPLvA4kAAAAAAAAAAAAAAAAAAAAAIgIC1y/Q0NkCk0NK1fyhYPJ44DxhRJeqTkJc9FTiwTMPlqsUzBiuCAAAAAAAAAAAAAAAAAAAAAAiAgNE2IQTbfVQIChl/7xiGMf5yI/mzjnJRXmBkLrbOKdS8RT2XNhpAAAAAAAAAAAAAAAAAAAAAAABAGlSIQNreRC1kdOnVtXudaXozA4n50XoVTD+q9J9T1hHpQ8whiECr+EtV30aIKPtr8L9PSVazn0bixg9CvndP75b9VQ6vH0hA0omsDbfD18D30R00HkkqYoF4RuiWER24a3bRIKs6kARU64iAgKv4S1XfRogo+2vwv09JVrOfRuLGD0K+d0/vlv1VDq8fRTUrYNyAAAAAAAAAAAAAAAAAQAAACICA0omsDbfD18D30R00HkkqYoF4RuiWER24a3bRIKs6kARFEBcZb0AAAAAAAAAAAAAAAABAAAAIgIDa3kQtZHTp1bV7nWl6MwOJ+dF6FUw/qvSfU9YR6UPMIYUVH9FdgAAAAAAAAAAAAAAAAEAAAAAAAA=",
9+
"inputs": [
10+
{
11+
"hash": "d5df75305768ede101a3153cb6af28cc61cdca81651bdfa36aa7c4404349e5ed",
12+
"index": 0,
13+
"sequence": 4294967295
14+
},
15+
{
16+
"hash": "016c265c7f7f066aac9b307256e68e4db09015691a9242e51cee607d001fa7f3",
17+
"index": 1,
18+
"sequence": 4294967295
19+
}
20+
],
21+
"psbtInputs": [
22+
{
23+
"type": "p2sh",
24+
"partialSig": [
25+
{
26+
"pubkey": "03e1524d7f6fc57ab3eacbb659b787106780a475d1db483952c2310b7e9a38975b",
27+
"signature": "304402207c7c14c1ee469e37e8ef78cabe09cb91423757c27579fa40f4bab8447b3673ce02203f6f79d12e130e7a30179b558cc92168fa1317896d4fed57409ca13aea552bee41"
28+
},
29+
{
30+
"pubkey": "03f6f40764bd5d63f200a2778883acf75e96f15095c998263c087270d0c97e7e7f",
31+
"signature": "3044022046713fe71727277b2721a1e9945c584e06fa364e2d125f955b8ee4ace1a0375e0220205e5658b790f2ab08dcf7cf3f67730afd98dd0a82ce30612d49110430917e2441"
32+
}
33+
],
34+
"sighashType": 65,
35+
"redeemScript": "522103f6f40764bd5d63f200a2778883acf75e96f15095c998263c087270d0c97e7e7f21035ffb7abc70159e0469f4b989a6d5e1785a2904169ff050b2f468fe5d3d5dbbf22103e1524d7f6fc57ab3eacbb659b787106780a475d1db483952c2310b7e9a38975b53ae",
36+
"bip32Derivation": [
37+
{
38+
"masterFingerprint": "cc18ae08",
39+
"pubkey": "035ffb7abc70159e0469f4b989a6d5e1785a2904169ff050b2f468fe5d3d5dbbf2",
40+
"path": "0/0/1/0"
41+
},
42+
{
43+
"masterFingerprint": "f65cd869",
44+
"pubkey": "03e1524d7f6fc57ab3eacbb659b787106780a475d1db483952c2310b7e9a38975b",
45+
"path": "0/0/1/0"
46+
},
47+
{
48+
"masterFingerprint": "f2ef0389",
49+
"pubkey": "03f6f40764bd5d63f200a2778883acf75e96f15095c998263c087270d0c97e7e7f",
50+
"path": "0/0/1/0"
51+
}
52+
],
53+
"witnessUtxo": {
54+
"value": "2000",
55+
"script": "a914567cd7b44f9f3a07c3138f37bf984b60fbbaf24387"
56+
}
57+
},
58+
{
59+
"type": "p2shP2pk",
60+
"partialSig": [
61+
{
62+
"pubkey": "0336ef228ffe9b8efffba052c32d334660dd1f8366cf8fe44ae5aa672b6b629095",
63+
"signature": "304402201e125f8f91514f8a9d7a20142b5603e997bac1f38aeb4d92af4bc070c6ed114e022020af42c1bdb349fc48e722ca0d5ec36f1e2debafe722428ef5eb693aa8c0871741"
64+
}
65+
],
66+
"sighashType": 65,
67+
"redeemScript": "210336ef228ffe9b8efffba052c32d334660dd1f8366cf8fe44ae5aa672b6b629095ac",
68+
"witnessUtxo": {
69+
"value": "2000",
70+
"script": "a91420b37094d82a513451ff0ccd9db23aba05bc5ef387"
71+
}
72+
}
73+
],
74+
"psbtInputsFinalized": [
75+
{
76+
"type": "p2sh",
77+
"witnessUtxo": {
78+
"script": "a914567cd7b44f9f3a07c3138f37bf984b60fbbaf24387",
79+
"value": "2000"
80+
},
81+
"finalScriptSig": "00473044022046713fe71727277b2721a1e9945c584e06fa364e2d125f955b8ee4ace1a0375e0220205e5658b790f2ab08dcf7cf3f67730afd98dd0a82ce30612d49110430917e244147304402207c7c14c1ee469e37e8ef78cabe09cb91423757c27579fa40f4bab8447b3673ce02203f6f79d12e130e7a30179b558cc92168fa1317896d4fed57409ca13aea552bee414c69522103f6f40764bd5d63f200a2778883acf75e96f15095c998263c087270d0c97e7e7f21035ffb7abc70159e0469f4b989a6d5e1785a2904169ff050b2f468fe5d3d5dbbf22103e1524d7f6fc57ab3eacbb659b787106780a475d1db483952c2310b7e9a38975b53ae"
82+
},
83+
{
84+
"type": "p2shP2pk",
85+
"witnessUtxo": {
86+
"script": "a91420b37094d82a513451ff0ccd9db23aba05bc5ef387",
87+
"value": "2000"
88+
},
89+
"finalScriptSig": "47304402201e125f8f91514f8a9d7a20142b5603e997bac1f38aeb4d92af4bc070c6ed114e022020af42c1bdb349fc48e722ca0d5ec36f1e2debafe722428ef5eb693aa8c087174123210336ef228ffe9b8efffba052c32d334660dd1f8366cf8fe44ae5aa672b6b629095ac"
90+
}
91+
],
92+
"outputs": [
93+
{
94+
"script": "a914d909474404c124a3d04c3fbff61faa49cf43c58b87",
95+
"value": "900",
96+
"address": "3MUbfqvBeD7g1R3b9g8ZQxDwjR7SjQWciv"
97+
},
98+
{
99+
"script": "a9144efd761e9be61caa421c8aac4a902ad6f2a54bcf87",
100+
"value": "900",
101+
"address": "38tgGK9PBA4aV6wWA7yf3D9xjAdNNKpu3D"
102+
},
103+
{
104+
"script": "a914d24d3816be8a250cbdde7eaa674f80170cda944e87",
105+
"value": "900",
106+
"address": "3LrzL73h2RSmuGnSF5YsvuVZ4J8nr5sUwu"
107+
},
108+
{
109+
"script": "6a0f736574656320617374726f6e6f6d79",
110+
"value": "900"
111+
}
112+
],
113+
"psbtOutputs": [
114+
{
115+
"redeemScript": "522102cc4d0fa411cac244486f8eb2c08e035ff7410f460a359ca7f8810991bd3b42092102d72fd0d0d90293434ad5fca160f278e03c614497aa4e425cf454e2c1330f96ab210344d884136df550202865ffbc6218c7f9c88fe6ce39c945798190badb38a752f153ae",
116+
"bip32Derivation": [
117+
{
118+
"masterFingerprint": "f2ef0389",
119+
"pubkey": "02cc4d0fa411cac244486f8eb2c08e035ff7410f460a359ca7f8810991bd3b4209",
120+
"path": "0/0/0/0"
121+
},
122+
{
123+
"masterFingerprint": "cc18ae08",
124+
"pubkey": "02d72fd0d0d90293434ad5fca160f278e03c614497aa4e425cf454e2c1330f96ab",
125+
"path": "0/0/0/0"
126+
},
127+
{
128+
"masterFingerprint": "f65cd869",
129+
"pubkey": "0344d884136df550202865ffbc6218c7f9c88fe6ce39c945798190badb38a752f1",
130+
"path": "0/0/0/0"
131+
}
132+
]
133+
},
134+
{
135+
"redeemScript": "5221036b7910b591d3a756d5ee75a5e8cc0e27e745e85530feabd27d4f5847a50f30862102afe12d577d1a20a3edafc2fd3d255ace7d1b8b183d0af9dd3fbe5bf5543abc7d21034a26b036df0f5f03df4474d07924a98a05e11ba2584476e1addb4482acea401153ae",
136+
"bip32Derivation": [
137+
{
138+
"masterFingerprint": "d4ad8372",
139+
"pubkey": "02afe12d577d1a20a3edafc2fd3d255ace7d1b8b183d0af9dd3fbe5bf5543abc7d",
140+
"path": "0/0/0/1"
141+
},
142+
{
143+
"masterFingerprint": "405c65bd",
144+
"pubkey": "034a26b036df0f5f03df4474d07924a98a05e11ba2584476e1addb4482acea4011",
145+
"path": "0/0/0/1"
146+
},
147+
{
148+
"masterFingerprint": "547f4576",
149+
"pubkey": "036b7910b591d3a756d5ee75a5e8cc0e27e745e85530feabd27d4f5847a50f3086",
150+
"path": "0/0/0/1"
151+
}
152+
]
153+
},
154+
{},
155+
{}
156+
],
157+
"extractedTransaction": "0200000002d5df75305768ede101a3153cb6af28cc61cdca81651bdfa36aa7c4404349e5ed00000000fc00473044022046713fe71727277b2721a1e9945c584e06fa364e2d125f955b8ee4ace1a0375e0220205e5658b790f2ab08dcf7cf3f67730afd98dd0a82ce30612d49110430917e244147304402207c7c14c1ee469e37e8ef78cabe09cb91423757c27579fa40f4bab8447b3673ce02203f6f79d12e130e7a30179b558cc92168fa1317896d4fed57409ca13aea552bee414c69522103f6f40764bd5d63f200a2778883acf75e96f15095c998263c087270d0c97e7e7f21035ffb7abc70159e0469f4b989a6d5e1785a2904169ff050b2f468fe5d3d5dbbf22103e1524d7f6fc57ab3eacbb659b787106780a475d1db483952c2310b7e9a38975b53aeffffffff016c265c7f7f066aac9b307256e68e4db09015691a9242e51cee607d001fa7f3010000006c47304402201e125f8f91514f8a9d7a20142b5603e997bac1f38aeb4d92af4bc070c6ed114e022020af42c1bdb349fc48e722ca0d5ec36f1e2debafe722428ef5eb693aa8c087174123210336ef228ffe9b8efffba052c32d334660dd1f8366cf8fe44ae5aa672b6b629095acffffffff04840300000000000017a914d909474404c124a3d04c3fbff61faa49cf43c58b87840300000000000017a9144efd761e9be61caa421c8aac4a902ad6f2a54bcf87840300000000000017a914d24d3816be8a250cbdde7eaa674f80170cda944e878403000000000000116a0f736574656320617374726f6e6f6d7900000000"
158+
}

0 commit comments

Comments
 (0)