github.com/trezor/blockbook@v0.4.1-0.20240328132726-e9a08582ee2c/bchain/coins/ecash/ecashparser_test.go (about) 1 //go:build unittest 2 3 package ecash 4 5 import ( 6 "encoding/hex" 7 "math/big" 8 "os" 9 "reflect" 10 "testing" 11 12 "github.com/martinboehm/btcutil/chaincfg" 13 "github.com/trezor/blockbook/bchain" 14 "github.com/trezor/blockbook/bchain/coins/btc" 15 ) 16 17 func TestMain(m *testing.M) { 18 c := m.Run() 19 chaincfg.ResetParams() 20 os.Exit(c) 21 } 22 23 func Test_GetAddrDescFromAddress(t *testing.T) { 24 mainParserCashAddr, mainParserLegacy, testParserCashAddr, _ := setupParsers(t) 25 tests := []struct { 26 name string 27 parser *ECashParser 28 addresses []string 29 hex string 30 wantErr bool 31 }{ 32 { 33 name: "test-P2PKH-0", 34 parser: testParserCashAddr, 35 addresses: []string{"mnnAKPTSrWjgoi3uEYaQkHA1QEC5btFeBr"}, 36 hex: "76a9144fa927fd3bcf57d4e3c582c3d2eb2bd3df8df47c88ac", 37 wantErr: false, 38 }, 39 { 40 name: "test-P2PKH-1", 41 parser: testParserCashAddr, 42 addresses: []string{"ectest:qp86jfla8084048rckpv85ht90falr050s59h7rejp"}, 43 hex: "76a9144fa927fd3bcf57d4e3c582c3d2eb2bd3df8df47c88ac", 44 wantErr: false, 45 }, 46 { 47 name: "main-P2PKH-0", 48 parser: mainParserLegacy, 49 addresses: []string{"129HiRqekqPVucKy2M8zsqvafGgKypciPp"}, 50 hex: "76a9140c8967e6382c7a2ca64d8e850bfc99b7736e1a0d88ac", 51 wantErr: false, 52 }, 53 { 54 name: "main-P2PKH-1", 55 parser: mainParserCashAddr, 56 addresses: []string{"ecash:qqxgjelx8qk85t9xfk8g2zlunxmhxms6p5dtfghs9r"}, 57 hex: "76a9140c8967e6382c7a2ca64d8e850bfc99b7736e1a0d88ac", 58 wantErr: false, 59 }, 60 { 61 name: "main-P2SH-0", 62 parser: mainParserCashAddr, 63 addresses: []string{"3EBEFWPtDYWCNszQ7etoqtWmmygccayLiH"}, 64 hex: "a91488f772450c830a30eddfdc08a93d5f2ae1a30e1787", 65 wantErr: false, 66 }, 67 { 68 name: "main-P2SH-1", 69 parser: mainParserLegacy, 70 addresses: []string{"ecash:pzy0wuj9pjps5v8dmlwq32fatu4wrgcwzuyf5lgn3q"}, 71 hex: "a91488f772450c830a30eddfdc08a93d5f2ae1a30e1787", 72 wantErr: false, 73 }, 74 } 75 76 for _, tt := range tests { 77 t.Run(tt.name, func(t *testing.T) { 78 got, err := tt.parser.GetAddrDescFromAddress(tt.addresses[0]) 79 if (err != nil) != tt.wantErr { 80 t.Errorf("%v", tt.addresses[0]) 81 t.Errorf("GetAddrDescFromAddress() error = %v, wantErr %v", err, tt.wantErr) 82 return 83 } 84 h := hex.EncodeToString(got) 85 if !reflect.DeepEqual(h, tt.hex) { 86 t.Errorf("GetAddrDescFromAddress() = %v, want %v", h, tt.hex) 87 } 88 }) 89 } 90 } 91 92 func Test_GetAddressesFromAddrDesc(t *testing.T) { 93 mainParserCashAddr, mainParserLegacy, testParserCashAddr, testParserLegacy := setupParsers(t) 94 tests := []struct { 95 name string 96 parser *ECashParser 97 addresses []string 98 searchable bool 99 hex string 100 wantErr bool 101 }{ 102 { 103 name: "test-P2PKH-0", 104 parser: testParserLegacy, 105 addresses: []string{"mnnAKPTSrWjgoi3uEYaQkHA1QEC5btFeBr"}, 106 searchable: true, 107 hex: "76a9144fa927fd3bcf57d4e3c582c3d2eb2bd3df8df47c88ac", 108 109 wantErr: false, 110 }, 111 { 112 name: "test-P2PKH-1", 113 parser: testParserCashAddr, 114 addresses: []string{"ectest:qp86jfla8084048rckpv85ht90falr050s59h7rejp"}, 115 searchable: true, 116 hex: "76a9144fa927fd3bcf57d4e3c582c3d2eb2bd3df8df47c88ac", 117 wantErr: false, 118 }, 119 { 120 name: "main-P2PKH-0", 121 parser: mainParserLegacy, 122 addresses: []string{"129HiRqekqPVucKy2M8zsqvafGgKypciPp"}, 123 searchable: true, 124 hex: "76a9140c8967e6382c7a2ca64d8e850bfc99b7736e1a0d88ac", 125 wantErr: false, 126 }, 127 { 128 name: "main-P2PKH-0", 129 parser: mainParserCashAddr, 130 addresses: []string{"ecash:qqxgjelx8qk85t9xfk8g2zlunxmhxms6p5dtfghs9r"}, 131 searchable: true, 132 hex: "76a9140c8967e6382c7a2ca64d8e850bfc99b7736e1a0d88ac", 133 wantErr: false, 134 }, 135 { 136 name: "main-P2SH-0", 137 parser: mainParserLegacy, 138 addresses: []string{"3EBEFWPtDYWCNszQ7etoqtWmmygccayLiH"}, 139 searchable: true, 140 hex: "a91488f772450c830a30eddfdc08a93d5f2ae1a30e1787", 141 wantErr: false, 142 }, 143 { 144 name: "main-P2SH-1", 145 parser: mainParserCashAddr, 146 addresses: []string{"ecash:pzy0wuj9pjps5v8dmlwq32fatu4wrgcwzuyf5lgn3q"}, 147 searchable: true, 148 hex: "a91488f772450c830a30eddfdc08a93d5f2ae1a30e1787", 149 wantErr: false, 150 }, 151 { 152 name: "main-P2PK", 153 parser: mainParserCashAddr, 154 addresses: []string{"ecash:qqr95pwp0w5jqnh9vcjl4qm4x45atr0er587pw66cr"}, 155 searchable: true, 156 hex: "2103db3c3977c5165058bf38c46f72d32f4e872112dbafc13083a948676165cd1603ac", 157 wantErr: false, 158 }, 159 { 160 name: "OP_RETURN ascii", 161 parser: mainParserCashAddr, 162 addresses: []string{"OP_RETURN (ahoj)"}, 163 searchable: false, 164 hex: "6a0461686f6a", 165 wantErr: false, 166 }, 167 { 168 name: "OP_RETURN hex", 169 parser: mainParserCashAddr, 170 addresses: []string{"OP_RETURN 2020f1686f6a20"}, 171 searchable: false, 172 hex: "6a072020f1686f6a20", 173 wantErr: false, 174 }, 175 { 176 name: "empty", 177 parser: mainParserCashAddr, 178 addresses: []string{}, 179 searchable: false, 180 hex: "", 181 wantErr: false, 182 }, 183 } 184 185 for _, tt := range tests { 186 t.Run(tt.name, func(t *testing.T) { 187 b, _ := hex.DecodeString(tt.hex) 188 got, got2, err := tt.parser.GetAddressesFromAddrDesc(b) 189 if (err != nil) != tt.wantErr { 190 t.Errorf("GetAddressesFromAddrDesc() error = %v, wantErr %v", err, tt.wantErr) 191 return 192 } 193 if !reflect.DeepEqual(got, tt.addresses) { 194 t.Errorf("GetAddressesFromAddrDesc() = %v, want %v", got, tt.addresses) 195 } 196 if !reflect.DeepEqual(got2, tt.searchable) { 197 t.Errorf("GetAddressesFromAddrDesc() = %v, want %v", got2, tt.searchable) 198 } 199 }) 200 } 201 } 202 203 var ( 204 testTx1, testTx2 bchain.Tx 205 testTxPacked1 = "0001e2408ba8d7af5401000000017f9a22c9cbf54bd902400df746f138f37bcf5b4d93eb755820e974ba43ed5f42040000006a4730440220037f4ed5427cde81d55b9b6a2fd08c8a25090c2c2fff3a75c1a57625ca8a7118022076c702fe55969fa08137f71afd4851c48e31082dd3c40c919c92cdbc826758d30121029f6da5623c9f9b68a9baf9c1bc7511df88fa34c6c2f71f7c62f2f03ff48dca80feffffff019c9700000000000017a9146144d57c8aff48492c9dfb914e120b20bad72d6f8773d00700" 206 testTxPacked2 = "0007c91a899ab7da6a010000000001019d64f0c72a0d206001decbffaa722eb1044534c74eee7a5df8318e42a4323ec10000000017160014550da1f5d25a9dae2eafd6902b4194c4c6500af6ffffffff02809698000000000017a914cd668d781ece600efa4b2404dc91fd26b8b8aed8870553d7360000000017a914246655bdbd54c7e477d0ea2375e86e0db2b8f80a8702473044022076aba4ad559616905fa51d4ddd357fc1fdb428d40cb388e042cdd1da4a1b7357022011916f90c712ead9a66d5f058252efd280439ad8956a967e95d437d246710bc9012102a80a5964c5612bb769ef73147b2cf3c149bc0fd4ecb02f8097629c94ab013ffd00000000" 207 ) 208 209 func setupParsers(t *testing.T) (mainParserCashAddr, mainParserLegacy, testParserCashAddr, testParserLegacy *ECashParser) { 210 parser1, err := NewECashParser(GetChainParams("main"), &btc.Configuration{AddressFormat: "cashaddr"}) 211 if err != nil { 212 t.Fatalf("NewECashParser() error = %v", err) 213 } 214 parser2, err := NewECashParser(GetChainParams("main"), &btc.Configuration{AddressFormat: "legacy"}) 215 if err != nil { 216 t.Fatalf("NewECashParser() error = %v", err) 217 } 218 parser3, err := NewECashParser(GetChainParams("test"), &btc.Configuration{AddressFormat: "cashaddr"}) 219 if err != nil { 220 t.Fatalf("NewECashParser() error = %v", err) 221 } 222 parser4, err := NewECashParser(GetChainParams("test"), &btc.Configuration{AddressFormat: "legacy"}) 223 if err != nil { 224 t.Fatalf("NewECashParser() error = %v", err) 225 } 226 return parser1, parser2, parser3, parser4 227 } 228 229 func init() { 230 231 testTx1 = bchain.Tx{ 232 Hex: "01000000017f9a22c9cbf54bd902400df746f138f37bcf5b4d93eb755820e974ba43ed5f42040000006a4730440220037f4ed5427cde81d55b9b6a2fd08c8a25090c2c2fff3a75c1a57625ca8a7118022076c702fe55969fa08137f71afd4851c48e31082dd3c40c919c92cdbc826758d30121029f6da5623c9f9b68a9baf9c1bc7511df88fa34c6c2f71f7c62f2f03ff48dca80feffffff019c9700000000000017a9146144d57c8aff48492c9dfb914e120b20bad72d6f8773d00700", 233 Blocktime: 1519053802, 234 Txid: "056e3d82e5ffd0e915fb9b62797d76263508c34fe3e5dbed30dd3e943930f204", 235 LockTime: 512115, 236 Version: 1, 237 Vin: []bchain.Vin{ 238 { 239 ScriptSig: bchain.ScriptSig{ 240 Hex: "4730440220037f4ed5427cde81d55b9b6a2fd08c8a25090c2c2fff3a75c1a57625ca8a7118022076c702fe55969fa08137f71afd4851c48e31082dd3c40c919c92cdbc826758d30121029f6da5623c9f9b68a9baf9c1bc7511df88fa34c6c2f71f7c62f2f03ff48dca80", 241 }, 242 Txid: "425fed43ba74e9205875eb934d5bcf7bf338f146f70d4002d94bf5cbc9229a7f", 243 Vout: 4, 244 Sequence: 4294967294, 245 }, 246 }, 247 Vout: []bchain.Vout{ 248 { 249 ValueSat: *big.NewInt(38812), 250 N: 0, 251 ScriptPubKey: bchain.ScriptPubKey{ 252 Hex: "a9146144d57c8aff48492c9dfb914e120b20bad72d6f87", 253 Addresses: []string{ 254 "ecash:pps5f4tu3tl5sjfvnhaeznsjpvst44eddu3yvcmmzj", 255 }, 256 }, 257 }, 258 }, 259 } 260 261 testTx2 = bchain.Tx{ 262 Hex: "010000000001019d64f0c72a0d206001decbffaa722eb1044534c74eee7a5df8318e42a4323ec10000000017160014550da1f5d25a9dae2eafd6902b4194c4c6500af6ffffffff02809698000000000017a914cd668d781ece600efa4b2404dc91fd26b8b8aed8870553d7360000000017a914246655bdbd54c7e477d0ea2375e86e0db2b8f80a8702473044022076aba4ad559616905fa51d4ddd357fc1fdb428d40cb388e042cdd1da4a1b7357022011916f90c712ead9a66d5f058252efd280439ad8956a967e95d437d246710bc9012102a80a5964c5612bb769ef73147b2cf3c149bc0fd4ecb02f8097629c94ab013ffd00000000", 263 Blocktime: 1235678901, 264 Txid: "474e6795760ebe81cb4023dc227e5a0efe340e1771c89a0035276361ed733de7", 265 LockTime: 0, 266 Version: 1, 267 Vin: []bchain.Vin{ 268 { 269 ScriptSig: bchain.ScriptSig{ 270 Hex: "160014550da1f5d25a9dae2eafd6902b4194c4c6500af6", 271 }, 272 Txid: "c13e32a4428e31f85d7aee4ec7344504b12e72aaffcbde0160200d2ac7f0649d", 273 Vout: 0, 274 Sequence: 4294967295, 275 }, 276 }, 277 Vout: []bchain.Vout{ 278 { 279 ValueSat: *big.NewInt(10000000), 280 N: 0, 281 ScriptPubKey: bchain.ScriptPubKey{ 282 Hex: "a914cd668d781ece600efa4b2404dc91fd26b8b8aed887", 283 Addresses: []string{ 284 "ectest:prxkdrtcrm8xqrh6fvjqfhy3l5nt3w9wmq7a4ujkec", 285 }, 286 }, 287 }, 288 { 289 ValueSat: *big.NewInt(920081157), 290 N: 1, 291 ScriptPubKey: bchain.ScriptPubKey{ 292 Hex: "a914246655bdbd54c7e477d0ea2375e86e0db2b8f80a87", 293 Addresses: []string{ 294 "ectest:pqjxv4dah42v0erh6r4zxa0gdcxm9w8cpg55qt4qtq", 295 }, 296 }, 297 }, 298 }, 299 } 300 } 301 302 func Test_UnpackTx(t *testing.T) { 303 mainParser, _, testParser, _ := setupParsers(t) 304 305 type args struct { 306 packedTx string 307 parser *ECashParser 308 } 309 tests := []struct { 310 name string 311 args args 312 want *bchain.Tx 313 want1 uint32 314 wantErr bool 315 }{ 316 { 317 name: "ecash-1", 318 args: args{ 319 packedTx: testTxPacked1, 320 parser: mainParser, 321 }, 322 want: &testTx1, 323 want1: 123456, 324 wantErr: false, 325 }, 326 { 327 name: "testnet-1", 328 args: args{ 329 packedTx: testTxPacked2, 330 parser: testParser, 331 }, 332 want: &testTx2, 333 want1: 510234, 334 wantErr: false, 335 }, 336 } 337 for _, tt := range tests { 338 t.Run(tt.name, func(t *testing.T) { 339 b, _ := hex.DecodeString(tt.args.packedTx) 340 got, got1, err := tt.args.parser.UnpackTx(b) 341 if (err != nil) != tt.wantErr { 342 t.Errorf("unpackTx() error = %v, wantErr %v", err, tt.wantErr) 343 return 344 } 345 // ignore witness unpacking 346 for i := range got.Vin { 347 got.Vin[i].Witness = nil 348 } 349 if !reflect.DeepEqual(got, tt.want) { 350 t.Errorf("unpackTx() got = %v, want %v", got, tt.want) 351 } 352 if got1 != tt.want1 { 353 t.Errorf("unpackTx() got1 = %v, want %v", got1, tt.want1) 354 } 355 }) 356 } 357 }