Skip to content

Commit 35bdd8b

Browse files
OttoAllmendingerllm-git
andcommitted
feat(utxo-lib): support external wallet outputs
Add option to disable derivation info on outputs, allowing creation of external wallet outputs in PSBTs. Also add support for creating OP_RETURN outputs in test utilities and expose a function to create wallet keys from custom seeds. Issue: BTC-2742 Co-authored-by: llm-git <[email protected]>
1 parent 83c85ea commit 35bdd8b

File tree

53 files changed

+2546
-674
lines changed

Some content is hidden

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

53 files changed

+2546
-674
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: 87 additions & 51 deletions
Large diffs are not rendered by default.

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

Lines changed: 64 additions & 28 deletions
Large diffs are not rendered by default.

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

Lines changed: 52 additions & 16 deletions
Large diffs are not rendered by default.

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

Lines changed: 51 additions & 15 deletions
Large diffs are not rendered by default.

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

Lines changed: 44 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,16 @@
44
"xprv9s21ZrQH143K2eBLSVNk4zhjDzqzqM29aS9cjr4CcoNrKLYwLHtwgTURSk7RPV3cH9zNZQeR1zGw3MEwSjvARSfWEGpxfaBmduhW3TKsH5g",
55
"xprv9s21ZrQH143K39N9shF9hAsTwh1FvQuBk8UVsZVwr4XtpqF7stCu2LH358NLuqkkK6pu1Af7TJHr5FZERQoLLtnC7wkoM9sdFo1HuP7dWuv"
66
],
7-
"psbtBase64": "cHNidP8BAHwCAAAAAlx5eyWbgnIrhOwGKs52BsAJLUxtcR60t3VnvhO0cMavAAAAAAD/////f7uvM8nANwD38dz5OjQDmJdlZkbCQouPqoi39X0dPZ8BAAAAAP////8BhAMAAAAAAAAXqRTZCUdEBMEko9BMP7/2H6pJz0PFi4cAAAAATwEEiLIeAAAAAAAAAAAAOpIuKfDI6w2ypgSEy9y2MfaxB8nKrj/9zz59LsH2vNADEhSHFfNh2raFpmnUJDHl1tP5c0BNq5yf0blQsnmtdjQEzBiuCE8BBIiyHgAAAAAAAAAAAG0dZW093ZHBlMBFZaNgNwKiEBbO0UomXziYLWJ15ntkA9O6wjE6fGshy7EbFLDRA0H5IsCkA6i9jIfw3IIPNa9uBPZc2GlPAQSIsh4AAAAAAAAAAADLBP1jqzTZD+ZGa4gOKgLM+KhjN0MSmRr4kRsaqrRDNAM27yKP/puO//ugUsMtM0Zg3R+DZs+P5Erlqmcra2KQlQTy7wOJAAEBIOgDAAAAAAAAF6kUVnzXtE+fOgfDE483v5hLYPu68kOHIgID9vQHZL1dY/IAoneIg6z3XpbxUJXJmCY8CHJw0Ml+fn9IMEUCIQCHYx9Uvql7pvsTWvwOaqUAD0BfjH9AdftEYk/LEAEQ8QIgPzwmpjLu8TGzLCNVN+jQjwBEsuz89HY7vO5Aqe4E4QxBAQMEQQAAAAEEaVIhA/b0B2S9XWPyAKJ3iIOs916W8VCVyZgmPAhycNDJfn5/IQNf+3q8cBWeBGn0uYmm1eF4WikEFp/wULL0aP5dPV278iED4VJNf2/FerPqy7ZZt4cQZ4CkddHbSDlSwjELfpo4l1tTriIGA1/7erxwFZ4EafS5iabV4XhaKQQWn/BQsvRo/l09XbvyFMwYrggAAAAAAAAAAAEAAAAAAAAAIgYD4VJNf2/FerPqy7ZZt4cQZ4CkddHbSDlSwjELfpo4l1sU9lzYaQAAAAAAAAAAAQAAAAAAAAAiBgP29AdkvV1j8gCid4iDrPdelvFQlcmYJjwIcnDQyX5+fxTy7wOJAAAAAAAAAAABAAAAAAAAAAABASDoAwAAAAAAABepFCCzcJTYKlE0Uf8MzZ2yOroFvF7zhyICAzbvIo/+m47/+6BSwy0zRmDdH4Nmz4/kSuWqZytrYpCVSDBFAiEAhk4utvMvq1+A5rMhVJ0LLSozXeZVvnxzS8L4m8HxCFoCIHt0jbPPC6nNTOVkyB2iD6nD4B95ds3AWjcEAEzmDpISQQEDBEEAAAABBCMhAzbvIo/+m47/+6BSwy0zRmDdH4Nmz4/kSuWqZytrYpCVrAABAGlSIQLMTQ+kEcrCREhvjrLAjgNf90EPRgo1nKf4gQmRvTtCCSEC1y/Q0NkCk0NK1fyhYPJ44DxhRJeqTkJc9FTiwTMPlqshA0TYhBNt9VAgKGX/vGIYx/nIj+bOOclFeYGQuts4p1LxU64iAgLMTQ+kEcrCREhvjrLAjgNf90EPRgo1nKf4gQmRvTtCCRTy7wOJAAAAAAAAAAAAAAAAAAAAACICAtcv0NDZApNDStX8oWDyeOA8YUSXqk5CXPRU4sEzD5arFMwYrggAAAAAAAAAAAAAAAAAAAAAIgIDRNiEE231UCAoZf+8YhjH+ciP5s45yUV5gZC62zinUvEU9lzYaQAAAAAAAAAAAAAAAAAAAAAA",
7+
"psbtBase64": "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",
88
"psbtBase64Finalized": null,
99
"inputs": [
1010
{
11-
"hash": "5c797b259b82722b84ec062ace7606c0092d4c6d711eb4b77567be13b470c6af",
11+
"hash": "d5df75305768ede101a3153cb6af28cc61cdca81651bdfa36aa7c4404349e5ed",
1212
"index": 0,
1313
"sequence": 4294967295
1414
},
1515
{
16-
"hash": "7fbbaf33c9c03700f7f1dcf93a34039897656646c2428b8faa88b7f57d1d3d9f",
16+
"hash": "016c265c7f7f066aac9b307256e68e4db09015691a9242e51cee607d001fa7f3",
1717
"index": 1,
1818
"sequence": 4294967295
1919
}
@@ -24,7 +24,7 @@
2424
"partialSig": [
2525
{
2626
"pubkey": "03f6f40764bd5d63f200a2778883acf75e96f15095c998263c087270d0c97e7e7f",
27-
"signature": "304502210087631f54bea97ba6fb135afc0e6aa5000f405f8c7f4075fb44624fcb100110f102203f3c26a632eef131b32c235537e8d08f0044b2ecfcf4763bbcee40a9ee04e10c41"
27+
"signature": "3044022046713fe71727277b2721a1e9945c584e06fa364e2d125f955b8ee4ace1a0375e0220205e5658b790f2ab08dcf7cf3f67730afd98dd0a82ce30612d49110430917e2441"
2828
}
2929
],
3030
"sighashType": 65,
@@ -47,7 +47,7 @@
4747
}
4848
],
4949
"witnessUtxo": {
50-
"value": "1000",
50+
"value": "2000",
5151
"script": "a914567cd7b44f9f3a07c3138f37bf984b60fbbaf24387"
5252
}
5353
},
@@ -56,13 +56,13 @@
5656
"partialSig": [
5757
{
5858
"pubkey": "0336ef228ffe9b8efffba052c32d334660dd1f8366cf8fe44ae5aa672b6b629095",
59-
"signature": "3045022100864e2eb6f32fab5f80e6b321549d0b2d2a335de655be7c734bc2f89bc1f1085a02207b748db3cf0ba9cd4ce564c81da20fa9c3e01f7976cdc05a3704004ce60e921241"
59+
"signature": "304402201e125f8f91514f8a9d7a20142b5603e997bac1f38aeb4d92af4bc070c6ed114e022020af42c1bdb349fc48e722ca0d5ec36f1e2debafe722428ef5eb693aa8c0871741"
6060
}
6161
],
6262
"sighashType": 65,
6363
"redeemScript": "210336ef228ffe9b8efffba052c32d334660dd1f8366cf8fe44ae5aa672b6b629095ac",
6464
"witnessUtxo": {
65-
"value": "1000",
65+
"value": "2000",
6666
"script": "a91420b37094d82a513451ff0ccd9db23aba05bc5ef387"
6767
}
6868
}
@@ -73,6 +73,20 @@
7373
"script": "a914d909474404c124a3d04c3fbff61faa49cf43c58b87",
7474
"value": "900",
7575
"address": "3MUbfqvBeD7g1R3b9g8ZQxDwjR7SjQWciv"
76+
},
77+
{
78+
"script": "a9144efd761e9be61caa421c8aac4a902ad6f2a54bcf87",
79+
"value": "900",
80+
"address": "38tgGK9PBA4aV6wWA7yf3D9xjAdNNKpu3D"
81+
},
82+
{
83+
"script": "a914d24d3816be8a250cbdde7eaa674f80170cda944e87",
84+
"value": "900",
85+
"address": "3LrzL73h2RSmuGnSF5YsvuVZ4J8nr5sUwu"
86+
},
87+
{
88+
"script": "6a0f736574656320617374726f6e6f6d79",
89+
"value": "900"
7690
}
7791
],
7892
"psbtOutputs": [
@@ -95,7 +109,29 @@
95109
"path": "0/0/0/0"
96110
}
97111
]
98-
}
112+
},
113+
{
114+
"redeemScript": "5221036b7910b591d3a756d5ee75a5e8cc0e27e745e85530feabd27d4f5847a50f30862102afe12d577d1a20a3edafc2fd3d255ace7d1b8b183d0af9dd3fbe5bf5543abc7d21034a26b036df0f5f03df4474d07924a98a05e11ba2584476e1addb4482acea401153ae",
115+
"bip32Derivation": [
116+
{
117+
"masterFingerprint": "d4ad8372",
118+
"pubkey": "02afe12d577d1a20a3edafc2fd3d255ace7d1b8b183d0af9dd3fbe5bf5543abc7d",
119+
"path": "0/0/0/1"
120+
},
121+
{
122+
"masterFingerprint": "405c65bd",
123+
"pubkey": "034a26b036df0f5f03df4474d07924a98a05e11ba2584476e1addb4482acea4011",
124+
"path": "0/0/0/1"
125+
},
126+
{
127+
"masterFingerprint": "547f4576",
128+
"pubkey": "036b7910b591d3a756d5ee75a5e8cc0e27e745e85530feabd27d4f5847a50f3086",
129+
"path": "0/0/0/1"
130+
}
131+
]
132+
},
133+
{},
134+
{}
99135
],
100136
"extractedTransaction": null
101137
}

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

Lines changed: 42 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,16 @@
44
"xprv9s21ZrQH143K2eBLSVNk4zhjDzqzqM29aS9cjr4CcoNrKLYwLHtwgTURSk7RPV3cH9zNZQeR1zGw3MEwSjvARSfWEGpxfaBmduhW3TKsH5g",
55
"xprv9s21ZrQH143K39N9shF9hAsTwh1FvQuBk8UVsZVwr4XtpqF7stCu2LH358NLuqkkK6pu1Af7TJHr5FZERQoLLtnC7wkoM9sdFo1HuP7dWuv"
66
],
7-
"psbtBase64": "cHNidP8BAHwCAAAAAlx5eyWbgnIrhOwGKs52BsAJLUxtcR60t3VnvhO0cMavAAAAAAD/////f7uvM8nANwD38dz5OjQDmJdlZkbCQouPqoi39X0dPZ8BAAAAAP////8BhAMAAAAAAAAXqRTZCUdEBMEko9BMP7/2H6pJz0PFi4cAAAAATwEEiLIeAAAAAAAAAAAAOpIuKfDI6w2ypgSEy9y2MfaxB8nKrj/9zz59LsH2vNADEhSHFfNh2raFpmnUJDHl1tP5c0BNq5yf0blQsnmtdjQEzBiuCE8BBIiyHgAAAAAAAAAAAG0dZW093ZHBlMBFZaNgNwKiEBbO0UomXziYLWJ15ntkA9O6wjE6fGshy7EbFLDRA0H5IsCkA6i9jIfw3IIPNa9uBPZc2GlPAQSIsh4AAAAAAAAAAADLBP1jqzTZD+ZGa4gOKgLM+KhjN0MSmRr4kRsaqrRDNAM27yKP/puO//ugUsMtM0Zg3R+DZs+P5Erlqmcra2KQlQTy7wOJAAEBIOgDAAAAAAAAF6kUVnzXtE+fOgfDE483v5hLYPu68kOHAQMEQQAAAAEEaVIhA/b0B2S9XWPyAKJ3iIOs916W8VCVyZgmPAhycNDJfn5/IQNf+3q8cBWeBGn0uYmm1eF4WikEFp/wULL0aP5dPV278iED4VJNf2/FerPqy7ZZt4cQZ4CkddHbSDlSwjELfpo4l1tTriIGA1/7erxwFZ4EafS5iabV4XhaKQQWn/BQsvRo/l09XbvyFMwYrggAAAAAAAAAAAEAAAAAAAAAIgYD4VJNf2/FerPqy7ZZt4cQZ4CkddHbSDlSwjELfpo4l1sU9lzYaQAAAAAAAAAAAQAAAAAAAAAiBgP29AdkvV1j8gCid4iDrPdelvFQlcmYJjwIcnDQyX5+fxTy7wOJAAAAAAAAAAABAAAAAAAAAAABASDoAwAAAAAAABepFCCzcJTYKlE0Uf8MzZ2yOroFvF7zhwEDBEEAAAABBCMhAzbvIo/+m47/+6BSwy0zRmDdH4Nmz4/kSuWqZytrYpCVrAABAGlSIQLMTQ+kEcrCREhvjrLAjgNf90EPRgo1nKf4gQmRvTtCCSEC1y/Q0NkCk0NK1fyhYPJ44DxhRJeqTkJc9FTiwTMPlqshA0TYhBNt9VAgKGX/vGIYx/nIj+bOOclFeYGQuts4p1LxU64iAgLMTQ+kEcrCREhvjrLAjgNf90EPRgo1nKf4gQmRvTtCCRTy7wOJAAAAAAAAAAAAAAAAAAAAACICAtcv0NDZApNDStX8oWDyeOA8YUSXqk5CXPRU4sEzD5arFMwYrggAAAAAAAAAAAAAAAAAAAAAIgIDRNiEE231UCAoZf+8YhjH+ciP5s45yUV5gZC62zinUvEU9lzYaQAAAAAAAAAAAAAAAAAAAAAA",
7+
"psbtBase64": "cHNidP8BANYCAAAAAtXfdTBXaO3hAaMVPLavKMxhzcqBZRvfo2qnxEBDSeXtAAAAAAD/////AWwmXH9/BmqsmzByVuaOTbCQFWkakkLlHO5gfQAfp/MBAAAAAP////8EhAMAAAAAAAAXqRTZCUdEBMEko9BMP7/2H6pJz0PFi4eEAwAAAAAAABepFE79dh6b5hyqQhyKrEqQKtbypUvPh4QDAAAAAAAAF6kU0k04Fr6KJQy93n6qZ0+AFwzalE6HhAMAAAAAAAARag9zZXRlYyBhc3Ryb25vbXkAAAAATwEEiLIeAAAAAAAAAAAAOpIuKfDI6w2ypgSEy9y2MfaxB8nKrj/9zz59LsH2vNADEhSHFfNh2raFpmnUJDHl1tP5c0BNq5yf0blQsnmtdjQEzBiuCE8BBIiyHgAAAAAAAAAAAG0dZW093ZHBlMBFZaNgNwKiEBbO0UomXziYLWJ15ntkA9O6wjE6fGshy7EbFLDRA0H5IsCkA6i9jIfw3IIPNa9uBPZc2GlPAQSIsh4AAAAAAAAAAADLBP1jqzTZD+ZGa4gOKgLM+KhjN0MSmRr4kRsaqrRDNAM27yKP/puO//ugUsMtM0Zg3R+DZs+P5Erlqmcra2KQlQTy7wOJAAEBINAHAAAAAAAAF6kUVnzXtE+fOgfDE483v5hLYPu68kOHAQMEQQAAAAEEaVIhA/b0B2S9XWPyAKJ3iIOs916W8VCVyZgmPAhycNDJfn5/IQNf+3q8cBWeBGn0uYmm1eF4WikEFp/wULL0aP5dPV278iED4VJNf2/FerPqy7ZZt4cQZ4CkddHbSDlSwjELfpo4l1tTriIGA1/7erxwFZ4EafS5iabV4XhaKQQWn/BQsvRo/l09XbvyFMwYrggAAAAAAAAAAAEAAAAAAAAAIgYD4VJNf2/FerPqy7ZZt4cQZ4CkddHbSDlSwjELfpo4l1sU9lzYaQAAAAAAAAAAAQAAAAAAAAAiBgP29AdkvV1j8gCid4iDrPdelvFQlcmYJjwIcnDQyX5+fxTy7wOJAAAAAAAAAAABAAAAAAAAAAABASDQBwAAAAAAABepFCCzcJTYKlE0Uf8MzZ2yOroFvF7zhwEDBEEAAAABBCMhAzbvIo/+m47/+6BSwy0zRmDdH4Nmz4/kSuWqZytrYpCVrAABAGlSIQLMTQ+kEcrCREhvjrLAjgNf90EPRgo1nKf4gQmRvTtCCSEC1y/Q0NkCk0NK1fyhYPJ44DxhRJeqTkJc9FTiwTMPlqshA0TYhBNt9VAgKGX/vGIYx/nIj+bOOclFeYGQuts4p1LxU64iAgLMTQ+kEcrCREhvjrLAjgNf90EPRgo1nKf4gQmRvTtCCRTy7wOJAAAAAAAAAAAAAAAAAAAAACICAtcv0NDZApNDStX8oWDyeOA8YUSXqk5CXPRU4sEzD5arFMwYrggAAAAAAAAAAAAAAAAAAAAAIgIDRNiEE231UCAoZf+8YhjH+ciP5s45yUV5gZC62zinUvEU9lzYaQAAAAAAAAAAAAAAAAAAAAAAAQBpUiEDa3kQtZHTp1bV7nWl6MwOJ+dF6FUw/qvSfU9YR6UPMIYhAq/hLVd9GiCj7a/C/T0lWs59G4sYPQr53T++W/VUOrx9IQNKJrA23w9fA99EdNB5JKmKBeEbolhEduGt20SCrOpAEVOuIgICr+EtV30aIKPtr8L9PSVazn0bixg9CvndP75b9VQ6vH0U1K2DcgAAAAAAAAAAAAAAAAEAAAAiAgNKJrA23w9fA99EdNB5JKmKBeEbolhEduGt20SCrOpAERRAXGW9AAAAAAAAAAAAAAAAAQAAACICA2t5ELWR06dW1e51pejMDifnRehVMP6r0n1PWEelDzCGFFR/RXYAAAAAAAAAAAAAAAABAAAAAAAA",
88
"psbtBase64Finalized": null,
99
"inputs": [
1010
{
11-
"hash": "5c797b259b82722b84ec062ace7606c0092d4c6d711eb4b77567be13b470c6af",
11+
"hash": "d5df75305768ede101a3153cb6af28cc61cdca81651bdfa36aa7c4404349e5ed",
1212
"index": 0,
1313
"sequence": 4294967295
1414
},
1515
{
16-
"hash": "7fbbaf33c9c03700f7f1dcf93a34039897656646c2428b8faa88b7f57d1d3d9f",
16+
"hash": "016c265c7f7f066aac9b307256e68e4db09015691a9242e51cee607d001fa7f3",
1717
"index": 1,
1818
"sequence": 4294967295
1919
}
@@ -41,7 +41,7 @@
4141
}
4242
],
4343
"witnessUtxo": {
44-
"value": "1000",
44+
"value": "2000",
4545
"script": "a914567cd7b44f9f3a07c3138f37bf984b60fbbaf24387"
4646
}
4747
},
@@ -50,7 +50,7 @@
5050
"sighashType": 65,
5151
"redeemScript": "210336ef228ffe9b8efffba052c32d334660dd1f8366cf8fe44ae5aa672b6b629095ac",
5252
"witnessUtxo": {
53-
"value": "1000",
53+
"value": "2000",
5454
"script": "a91420b37094d82a513451ff0ccd9db23aba05bc5ef387"
5555
}
5656
}
@@ -61,6 +61,20 @@
6161
"script": "a914d909474404c124a3d04c3fbff61faa49cf43c58b87",
6262
"value": "900",
6363
"address": "3MUbfqvBeD7g1R3b9g8ZQxDwjR7SjQWciv"
64+
},
65+
{
66+
"script": "a9144efd761e9be61caa421c8aac4a902ad6f2a54bcf87",
67+
"value": "900",
68+
"address": "38tgGK9PBA4aV6wWA7yf3D9xjAdNNKpu3D"
69+
},
70+
{
71+
"script": "a914d24d3816be8a250cbdde7eaa674f80170cda944e87",
72+
"value": "900",
73+
"address": "3LrzL73h2RSmuGnSF5YsvuVZ4J8nr5sUwu"
74+
},
75+
{
76+
"script": "6a0f736574656320617374726f6e6f6d79",
77+
"value": "900"
6478
}
6579
],
6680
"psbtOutputs": [
@@ -83,7 +97,29 @@
8397
"path": "0/0/0/0"
8498
}
8599
]
86-
}
100+
},
101+
{
102+
"redeemScript": "5221036b7910b591d3a756d5ee75a5e8cc0e27e745e85530feabd27d4f5847a50f30862102afe12d577d1a20a3edafc2fd3d255ace7d1b8b183d0af9dd3fbe5bf5543abc7d21034a26b036df0f5f03df4474d07924a98a05e11ba2584476e1addb4482acea401153ae",
103+
"bip32Derivation": [
104+
{
105+
"masterFingerprint": "d4ad8372",
106+
"pubkey": "02afe12d577d1a20a3edafc2fd3d255ace7d1b8b183d0af9dd3fbe5bf5543abc7d",
107+
"path": "0/0/0/1"
108+
},
109+
{
110+
"masterFingerprint": "405c65bd",
111+
"pubkey": "034a26b036df0f5f03df4474d07924a98a05e11ba2584476e1addb4482acea4011",
112+
"path": "0/0/0/1"
113+
},
114+
{
115+
"masterFingerprint": "547f4576",
116+
"pubkey": "036b7910b591d3a756d5ee75a5e8cc0e27e745e85530feabd27d4f5847a50f3086",
117+
"path": "0/0/0/1"
118+
}
119+
]
120+
},
121+
{},
122+
{}
87123
],
88124
"extractedTransaction": null
89125
}

0 commit comments

Comments
 (0)