Skip to content

Commit 089f9b5

Browse files
Support Witness property in Electrum integration (#3441)
In #3421 a Witness field was added to the bitcoin. Transaction structure. Here we populate the field with a value decoded from the transaction returned by electrum. Depends on #3406 Depends on #3421
2 parents 5320218 + 39a8ad5 commit 089f9b5

File tree

4 files changed

+300
-95
lines changed

4 files changed

+300
-95
lines changed

go.mod

+2-2
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,9 @@ require (
1818
github.com/bnb-chain/tss-lib v1.3.5
1919
github.com/btcsuite/btcd v0.23.1
2020
github.com/btcsuite/btcd/btcec/v2 v2.2.0
21+
github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1
2122
github.com/btcsuite/btcd/v2 v2.0.0-00010101000000-000000000000
23+
github.com/btcsuite/btcutil v1.0.3-0.20201208143702-a53e38424cce
2224
github.com/checksum0/go-electrum v0.0.0-20220912200153-b862ac442cf9
2325
github.com/ethereum/go-ethereum v1.10.19
2426
github.com/go-test/deep v1.0.8
@@ -55,9 +57,7 @@ require (
5557
github.com/benbjohnson/clock v1.3.0 // indirect
5658
github.com/beorn7/perks v1.0.1 // indirect
5759
github.com/btcsuite/btcd/btcutil v1.1.1 // indirect
58-
github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 // indirect
5960
github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f // indirect
60-
github.com/btcsuite/btcutil v1.0.3-0.20201208143702-a53e38424cce // indirect
6161
github.com/cespare/xxhash/v2 v2.1.2 // indirect
6262
github.com/cheekybits/genny v1.0.0 // indirect
6363
github.com/containerd/cgroups v0.0.0-20201119153540-4cbc285b3327 // indirect
+242
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,242 @@
1+
package bitcoin
2+
3+
import (
4+
"encoding/hex"
5+
6+
"github.com/keep-network/keep-core/pkg/bitcoin"
7+
)
8+
9+
// Transactions holds details of the transactions used as test vectors.
10+
var Transactions = map[string]struct {
11+
TxHash bitcoin.Hash
12+
BlockHeight uint
13+
BitcoinTx bitcoin.Transaction
14+
}{
15+
// Transactions data taken from TBTCv2 Deposit Sweeps
16+
// See: https://github.com/keep-network/tbtc-v2/blob/8b9d2629bf4333e650a54f32a4da7cf86bf6785e/solidity/test/data/deposit-sweep.ts
17+
18+
// https://blockstream.info/testnet/api/tx/c580e0e352570d90e303d912a506055ceeb0ee06f97dce6988c69941374f5479
19+
"input: P2PKH, output: P2SH, P2WPKH": {
20+
hashFromString("c580e0e352570d90e303d912a506055ceeb0ee06f97dce6988c69941374f5479"),
21+
2135049,
22+
bitcoin.Transaction{
23+
Version: 1,
24+
Inputs: []*bitcoin.TransactionInput{
25+
{
26+
Outpoint: &bitcoin.TransactionOutpoint{
27+
TransactionHash: hashFromString("e788a344a86f7e369511fe37ebd1d74686dde694ee99d06db5db3d4a14719b1d"),
28+
OutputIndex: 1,
29+
},
30+
SignatureScript: decodeString("47304402206f8553c07bcdc0c3b906311888103d623ca9096ca0b28b7d04650a029a01fcf9022064cda02e39e65ace712029845cfcf58d1b59617d753c3fd3556f3551b609bbb00121039d61d62dcd048d3f8550d22eb90b4af908db60231d117aeede04e7bc11907bfa"),
31+
Sequence: 4294967295,
32+
},
33+
},
34+
Outputs: []*bitcoin.TransactionOutput{
35+
{
36+
PublicKeyScript: decodeString("a9143ec459d0f3c29286ae5df5fcc421e2786024277e87"),
37+
Value: 20000,
38+
},
39+
{
40+
PublicKeyScript: decodeString("0014e257eccafbc07c381642ce6e7e55120fb077fbed"),
41+
Value: 1360550,
42+
},
43+
},
44+
Locktime: 0,
45+
},
46+
},
47+
// https://blockstream.info/testnet/api/tx/f5b9ad4e8cd5317925319ebc64dc923092bef3b56429c6b1bc2261bbdc73f351
48+
"input: P2SH, output: P2WPKH": {
49+
hashFromString("f5b9ad4e8cd5317925319ebc64dc923092bef3b56429c6b1bc2261bbdc73f351"),
50+
2135502,
51+
bitcoin.Transaction{
52+
Version: 1,
53+
Inputs: []*bitcoin.TransactionInput{
54+
{
55+
Outpoint: &bitcoin.TransactionOutpoint{
56+
TransactionHash: hashFromString("c580e0e352570d90e303d912a506055ceeb0ee06f97dce6988c69941374f5479"),
57+
OutputIndex: 0,
58+
},
59+
SignatureScript: decodeString("47304402205eff3ae003a5903eb33f32737e3442b6516685a1addb19339c2d02d400cf67ce0220707435fc2a0577373c63c99d242c30bea5959ec180169978d43ece50618fe0ff012103989d253b17a6a0f41838b84ff0d20e8898f9d7b1a98f2564da4cc29dcf8581d94c5c14934b98637ca318a4d6e7ca6ffd1690b8e77df6377508f9f0c90d000395237576a9148db50eb52063ea9d98b3eac91489a90f738986f68763ac6776a914e257eccafbc07c381642ce6e7e55120fb077fbed8804e0250162b175ac68"),
60+
Sequence: 4294967295,
61+
},
62+
},
63+
Outputs: []*bitcoin.TransactionOutput{
64+
{
65+
PublicKeyScript: decodeString("00148db50eb52063ea9d98b3eac91489a90f738986f6"),
66+
Value: 18500,
67+
},
68+
},
69+
Locktime: 0,
70+
},
71+
},
72+
// https://blockstream.info/testnet/api/tx/c1082c460527079a84e39ec6481666db72e5a22e473a78db03b996d26fd1dc83
73+
"input: P2WPKH, output: P2WSH + P2WPKH": {
74+
hashFromString("c1082c460527079a84e39ec6481666db72e5a22e473a78db03b996d26fd1dc83"),
75+
2137779,
76+
bitcoin.Transaction{
77+
Version: 1,
78+
Inputs: []*bitcoin.TransactionInput{
79+
{
80+
Outpoint: &bitcoin.TransactionOutpoint{
81+
TransactionHash: hashFromString("e2131bdd5017d078ec2c17d463c9bc17abf79a9c8a37746f032b2d48ac2ff189"),
82+
OutputIndex: 1,
83+
},
84+
Sequence: 4294967295,
85+
SignatureScript: []byte{},
86+
Witness: [][]byte{
87+
decodeString("304402205e28ad48e4b128ce8b30dae8c98c8422a5a1e9aa079c0aa9d21cae999831851d02204603961ea369acfdff28a5fee1b095a9ee6a338d5c13cf8775023418e1e7c4d801"),
88+
decodeString("02ee067a0273f2e3ba88d23140a24fdb290f27bbcd0f94117a9c65be3911c5c04e"),
89+
},
90+
},
91+
},
92+
Outputs: []*bitcoin.TransactionOutput{
93+
{
94+
PublicKeyScript: decodeString("0020ef0b4d985752aa5ef6243e4c6f6bebc2a007e7d671ef27d4b1d0db8dcc93bc1c"),
95+
Value: 80000,
96+
},
97+
{
98+
PublicKeyScript: decodeString("00147ac2d9378a1c47e589dfb8095ca95ed2140d2726"),
99+
Value: 2741370,
100+
},
101+
},
102+
Locktime: 0,
103+
},
104+
},
105+
// https://blockstream.info/testnet/api/tx/9efc9d555233e12e06378a35a7b988d54f7043b5c3156adc79c7af0a0fd6f1a0
106+
"input: P2WSH, output: P2WPKH": {
107+
hashFromString("9efc9d555233e12e06378a35a7b988d54f7043b5c3156adc79c7af0a0fd6f1a0"),
108+
2137780,
109+
bitcoin.Transaction{
110+
Version: 1,
111+
Inputs: []*bitcoin.TransactionInput{
112+
{
113+
Outpoint: &bitcoin.TransactionOutpoint{
114+
TransactionHash: hashFromString("c1082c460527079a84e39ec6481666db72e5a22e473a78db03b996d26fd1dc83"),
115+
OutputIndex: 0,
116+
},
117+
Sequence: 4294967295,
118+
SignatureScript: []byte{},
119+
Witness: [][]byte{
120+
decodeString("3045022100bcb5b2fa3fab8d24d5ef4f601d6bc0374319162b0f534e905ffaec7abee1c69902202c25189466157797cdc5ec5049f7a2122afb89be49172f3b8c176a0bc6caf02801"),
121+
decodeString("03989d253b17a6a0f41838b84ff0d20e8898f9d7b1a98f2564da4cc29dcf8581d9"),
122+
decodeString("14f4292022f75add9b079b0573d0fd63c376a85f417508b0bb0e4d6083951d7576a9148db50eb52063ea9d98b3eac91489a90f738986f68763ac6776a914056514a7032b0b486e56a607fb434756c61d1f74880438421962b175ac68"),
123+
},
124+
},
125+
},
126+
Outputs: []*bitcoin.TransactionOutput{
127+
{
128+
PublicKeyScript: decodeString("00148db50eb52063ea9d98b3eac91489a90f738986f6"),
129+
Value: 78000,
130+
},
131+
},
132+
Locktime: 0,
133+
},
134+
},
135+
// https://blockstream.info/testnet/api/tx/4459881f4964ee08dd298a12dfc1f461bf35cca8a105974d8baf0955c830d836
136+
"multiple inputs": {
137+
hashFromString("4459881f4964ee08dd298a12dfc1f461bf35cca8a105974d8baf0955c830d836"),
138+
2137896,
139+
bitcoin.Transaction{
140+
Version: 1,
141+
Inputs: []*bitcoin.TransactionInput{
142+
{
143+
Outpoint: &bitcoin.TransactionOutpoint{
144+
TransactionHash: hashFromString("2a5d5f472e376dc28964e1b597b1ca5ee5ac042101b5199a3ca8dae2deec3538"),
145+
OutputIndex: 0,
146+
},
147+
Sequence: 4294967295,
148+
SignatureScript: []byte{},
149+
Witness: [][]byte{
150+
decodeString("3045022100cdd1df1d2a4e15fa6824dc7a028fc0613af78fb40e2174abea22317ea5f69bcc02206dec476a49ed4e7ac900a924ef9b424f06c7d800ec15d126c0280fa5aa6535a201"),
151+
decodeString("03989d253b17a6a0f41838b84ff0d20e8898f9d7b1a98f2564da4cc29dcf8581d9"),
152+
},
153+
},
154+
{
155+
Outpoint: &bitcoin.TransactionOutpoint{
156+
TransactionHash: hashFromString("71b13c7b1e2968f869c832ccdb72bbdccd35d64b78826d251d350d79a7a32f30"),
157+
OutputIndex: 0,
158+
},
159+
Sequence: 4294967295,
160+
SignatureScript: []byte{},
161+
Witness: [][]byte{
162+
decodeString("30450221009494cfbe0cd015182c05be8618fd144e4cd6db7ba9adea3909720741d530ca9502207bb2637c066af408ea0feb8021858741e542c05407322f2cd3a4703305e5bd0501"),
163+
decodeString("03989d253b17a6a0f41838b84ff0d20e8898f9d7b1a98f2564da4cc29dcf8581d9"),
164+
decodeString("14208ff63189df8749780917cb5901183075dbabc175088bdbb150483eb2f27576a9148db50eb52063ea9d98b3eac91489a90f738986f68763ac6776a91473f3252d5e6b9f501dfafbfbca40836cc1f505f78804b80f1762b175ac68"),
165+
},
166+
},
167+
{
168+
Outpoint: &bitcoin.TransactionOutpoint{
169+
TransactionHash: hashFromString("68f4041f6bbddb146f672d31e4a2cce6431e1583bb24a33a2c836a7f238625d3"),
170+
OutputIndex: 0,
171+
},
172+
Sequence: 4294967295,
173+
SignatureScript: decodeString("483045022100afeb157db4284ab218a3d27b6962aabe1905eb205c6c6216dfad7e76615c0bb702205ffd88f2d2dea7509b7ea3b01910002544a785efa93c7ecd1cabafbdec508d3f012103989d253b17a6a0f41838b84ff0d20e8898f9d7b1a98f2564da4cc29dcf8581d94c5c1435d54bc29e0a5170c3ac73e64c7fa539a867f0fe7508dfe75a3a6ed52db67576a9148db50eb52063ea9d98b3eac91489a90f738986f68763ac6776a91411d6c57c31ea78b48020dcbf42c34ccd60d92c8c880428531862b175ac68"),
174+
Witness: [][]byte{},
175+
},
176+
{
177+
Outpoint: &bitcoin.TransactionOutpoint{
178+
TransactionHash: hashFromString("468e0be44cf5b2a529f22c49d8006fb29a147a4f1b6a54326a8c181208560ec6"),
179+
OutputIndex: 0,
180+
},
181+
Sequence: 4294967295,
182+
SignatureScript: decodeString("47304402200abefbc8d4d6bbe668c97ee305fde12f3c6c796ab6fbf84f00289ad5910ed8ac02200b81dcd12d45a83237569d53bcc629db559ce8c2cfd62d11fe5c58d501f785e0012103989d253b17a6a0f41838b84ff0d20e8898f9d7b1a98f2564da4cc29dcf8581d94c5c142219eac966fbc0454c4a2e122717e4429dd7608f7508251c7239917eae297576a9148db50eb52063ea9d98b3eac91489a90f738986f68763ac6776a914032a5188c34f2fb56a4228b2bb2b7165a797eb95880488c61762b175ac68"),
183+
Witness: [][]byte{},
184+
},
185+
{
186+
Outpoint: &bitcoin.TransactionOutpoint{
187+
TransactionHash: hashFromString("8c535793b98f1dbd638773e7ee07ebbbc5f86a55b5ae31ba91f63a67682e95aa"),
188+
OutputIndex: 0,
189+
},
190+
Sequence: 4294967295,
191+
SignatureScript: []byte{},
192+
Witness: [][]byte{
193+
decodeString("3045022100be74b99f0b3a616ee650a980a536ad4ba08d121ea11f15d7f51445347105dad102201f5c5becb32d2545839554fe1076fb4e6911f225f136b17232aad022fb4a5cd901"),
194+
decodeString("03989d253b17a6a0f41838b84ff0d20e8898f9d7b1a98f2564da4cc29dcf8581d9"),
195+
decodeString("14462418b7495561bf2872a0786109a11f5d494aa27508eca429ef209bf5007576a9148db50eb52063ea9d98b3eac91489a90f738986f68763ac6776a91446c5760250ab89b3d4b956cee325561fa7effff888046c4b1862b175ac68"),
196+
},
197+
},
198+
{
199+
Outpoint: &bitcoin.TransactionOutpoint{
200+
TransactionHash: hashFromString("85eb466ed605916ea764860ceda68fa05e7448cc772558c866a409366b997a85"),
201+
OutputIndex: 0,
202+
},
203+
Sequence: 4294967295,
204+
SignatureScript: []byte{},
205+
Witness: [][]byte{
206+
decodeString("3045022100d94df77c599c3b443203735c966396ded29db08f3538ad60a50dc7c2c0d685f802205a3d7e5c0534a4aeb6d9a4fad4133abfa465dd814e9ac1e27d12eaffe0c6963a01"),
207+
decodeString("03989d253b17a6a0f41838b84ff0d20e8898f9d7b1a98f2564da4cc29dcf8581d9"),
208+
decodeString("147f62cdde8a86328d63b9517bc70b255017f25eea75081d5c0a1bc9528ea27576a9148db50eb52063ea9d98b3eac91489a90f738986f68763ac6776a91464c2b58db5259ecc3c169b76c6bd83f3a94210908804e8fb1862b175ac68"),
209+
},
210+
},
211+
},
212+
Outputs: []*bitcoin.TransactionOutput{
213+
{
214+
PublicKeyScript: decodeString("00148db50eb52063ea9d98b3eac91489a90f738986f6"),
215+
Value: 4145001,
216+
},
217+
},
218+
Locktime: 0,
219+
},
220+
},
221+
}
222+
223+
func hashFromString(s string) bitcoin.Hash {
224+
hash, err := bitcoin.NewHashFromString(
225+
s,
226+
bitcoin.ReversedByteOrder,
227+
)
228+
if err != nil {
229+
panic(err)
230+
}
231+
232+
return hash
233+
}
234+
235+
func decodeString(s string) []byte {
236+
bytes, err := hex.DecodeString(s)
237+
if err != nil {
238+
panic(err)
239+
}
240+
241+
return bytes
242+
}

0 commit comments

Comments
 (0)