|
| 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