github.com/cryptohub-digital/blockbook-fork@v0.0.0-20230713133354-673c927af7f1/bchain/coins/xcb/xcbparser_test.go (about) 1 package xcb 2 3 import ( 4 "encoding/hex" 5 "fmt" 6 "math/big" 7 "reflect" 8 "testing" 9 10 "github.com/core-coin/go-core/v2/common" 11 "github.com/cryptohub-digital/blockbook-fork/bchain" 12 "github.com/cryptohub-digital/blockbook-fork/tests/dbtestdata" 13 ) 14 15 func TestXcbParser_GetAddrDescFromAddress(t *testing.T) { 16 type args struct { 17 address string 18 } 19 tests := []struct { 20 name string 21 args args 22 want string 23 wantErr bool 24 networkID int32 25 }{ 26 { 27 name: "with ab prefix", 28 args: args{address: "ab57dde1a47041fc3c570c0318a713128ced55fd2ada"}, 29 want: "ab57dde1a47041fc3c570c0318a713128ced55fd2ada", 30 networkID: 3, 31 }, 32 { 33 name: "with cb prefix", 34 args: args{address: "cb79fbc0290a1a3cf017f702e604ba234568533110af"}, 35 want: "cb79fbc0290a1a3cf017f702e604ba234568533110af", 36 networkID: 1, 37 }, 38 { 39 name: "address of wrong length", 40 args: args{address: "7526228d673e9f079630d6cdaff5a2ed13e0e60"}, 41 want: "", 42 wantErr: true, 43 }, 44 { 45 name: "ErrAddressMissing", 46 args: args{address: ""}, 47 want: "", 48 wantErr: true, 49 }, 50 { 51 name: "error - not xcb address", 52 args: args{address: "1JKgN43B9SyLuZH19H5ECvr4KcfrbVHzZ6"}, 53 want: "", 54 wantErr: true, 55 }, 56 } 57 for _, tt := range tests { 58 if tt.networkID != 0 { 59 common.DefaultNetworkID = common.NetworkID(tt.networkID) 60 } 61 t.Run(tt.name, func(t *testing.T) { 62 p := NewCoreCoinParser(1) 63 got, err := p.GetAddrDescFromAddress(tt.args.address) 64 if (err != nil) != tt.wantErr { 65 t.Errorf("XcbParser.GetAddrDescFromAddress() error = %v, wantErr %v", err, tt.wantErr) 66 return 67 } 68 h := hex.EncodeToString(got) 69 if !reflect.DeepEqual(h, tt.want) { 70 t.Errorf("XcbParser.GetAddrDescFromAddress() = %v, want %v", h, tt.want) 71 } 72 }) 73 } 74 } 75 76 var testTx1, testTx2, testTx3, testTx1Failed, testTx1NoStatus bchain.Tx 77 78 func init() { 79 80 testTx1 = bchain.Tx{ 81 Blocktime: 1534858022, 82 Time: 1534858022, 83 Txid: "0x998d535fb50fc55eafc591c20acf9ae13cebb96676fe90fcd136ea1f94113520", 84 Vin: []bchain.Vin{ 85 { 86 Addresses: []string{"cb656dadee521bea601692312454a655a0f49051ddc9"}, 87 }, 88 }, 89 Vout: []bchain.Vout{ 90 { 91 ValueSat: *big.NewInt(1999622000000000000), 92 ScriptPubKey: bchain.ScriptPubKey{ 93 Addresses: []string{"cb79fbc0290a1a3cf017f702e604ba234568533110af"}, 94 }, 95 }, 96 }, 97 CoinSpecificData: CoreCoinSpecificData{ 98 Tx: &RpcTransaction{ 99 AccountNonce: "0xb26c", 100 EnergyPrice: "0x430e23400", 101 EnergyLimit: "0x5208", 102 To: "cb79fbc0290a1a3cf017f702e604ba234568533110af", 103 Value: "0x1bc0159d530e6000", 104 Payload: "0x", 105 Hash: "0x998d535fb50fc55eafc591c20acf9ae13cebb96676fe90fcd136ea1f94113520", 106 BlockNumber: "0x41eee8", 107 From: "cb656dadee521bea601692312454a655a0f49051ddc9", 108 TransactionIndex: "0xa", 109 }, 110 Receipt: &RpcReceipt{ 111 EnergyUsed: "0x5208", 112 Status: "0x1", 113 Logs: []*RpcLog{}, 114 }, 115 }, 116 } 117 118 testTx2 = bchain.Tx{ 119 Blocktime: 1534858022, 120 Time: 1534858022, 121 Txid: "0x6fc698f1f6037551826fd86fa1b77c27a16c62f8916f9fe9942cd89b2fc8118a", 122 Vin: []bchain.Vin{ 123 { 124 Addresses: []string{"ab44de35413ee2b672d322938e2fcc932d5c0cf8ec88"}, 125 }, 126 }, 127 Vout: []bchain.Vout{ 128 { 129 ValueSat: *big.NewInt(0), 130 ScriptPubKey: bchain.ScriptPubKey{ 131 Addresses: []string{"ab98e5e2ba00469ce51440c22d4d4b79a56da712297f"}, 132 }, 133 }, 134 }, 135 CoinSpecificData: CoreCoinSpecificData{ 136 Tx: &RpcTransaction{ 137 AccountNonce: "0x3a0", 138 EnergyPrice: "0x3b9aca00", 139 EnergyLimit: "0x941a", 140 To: "ab98e5e2ba00469ce51440c22d4d4b79a56da712297f", 141 Value: "0x0", 142 Payload: "0xe86e7c5f00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000100000000000000000000ab27b691efe91718cb73207207d92dbd175e6b10c7560000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000002b5e3af16b1880000", 143 Hash: "0x6fc698f1f6037551826fd86fa1b77c27a16c62f8916f9fe9942cd89b2fc8118a", 144 BlockNumber: "0x48b929", 145 From: "ab44de35413ee2b672d322938e2fcc932d5c0cf8ec88", 146 TransactionIndex: "0x0", 147 }, 148 Receipt: &RpcReceipt{ 149 EnergyUsed: "0x941a", 150 Status: "0x1", 151 Logs: []*RpcLog{ 152 { 153 Address: "ab98e5e2ba00469ce51440c22d4d4b79a56da712297f", 154 Data: "0x000000000000000000000000000000000000000000000002b5e3af16b1880000", 155 Topics: []string{ 156 "0xc17a9d92b89f27cb79cc390f23a1a5d302fefab8c7911075ede952ac2b5607a1", 157 "0x00000000000000000000ab44de35413ee2b672d322938e2fcc932d5c0cf8ec88", 158 "0x00000000000000000000ab27b691efe91718cb73207207d92dbd175e6b10c756", 159 }, 160 }, 161 }, 162 }, 163 }, 164 } 165 166 testTx3 = bchain.Tx{ 167 Blocktime: 1534858022, 168 Time: 1534858022, 169 Txid: "0x4f65e846f570bb121b959bd37fbe57f4a6a61598095cbc4c6eaaa66aed7f66bd", 170 Vin: []bchain.Vin{ 171 { 172 Addresses: []string{"ab228a4d4263e067df56b1dd226acb939f532ff7ab5b "}, 173 }, 174 }, 175 Vout: []bchain.Vout{ 176 { 177 ValueSat: *big.NewInt(0), 178 ScriptPubKey: bchain.ScriptPubKey{ 179 Addresses: []string{"ab98e5e2ba00469ce51440c22d4d4b79a56da712297f"}, 180 }, 181 }, 182 }, 183 CoinSpecificData: CoreCoinSpecificData{ 184 Tx: &RpcTransaction{ 185 AccountNonce: "0x3", 186 EnergyPrice: "0x3b9aca00", 187 EnergyLimit: "0x8c80", 188 To: "ab98e5e2ba00469ce51440c22d4d4b79a56da712297f", 189 Value: "0x0", 190 Payload: "0x4b40e90100000000000000000000ab094a15c3dc43095c7450c59bf56263e9827065f3060000000000000000000000000000000000000000000000000de0b6b3a7640000", 191 Hash: "0x4f65e846f570bb121b959bd37fbe57f4a6a61598095cbc4c6eaaa66aed7f66bd", 192 BlockNumber: "0x48c147", 193 From: "ab228a4d4263e067df56b1dd226acb939f532ff7ab5b", 194 TransactionIndex: "0x0", 195 }, 196 Receipt: &RpcReceipt{ 197 EnergyUsed: "0x8c80", 198 Status: "0x1", 199 Logs: []*RpcLog{ 200 { 201 Address: "ab98e5e2ba00469ce51440c22d4d4b79a56da712297f", 202 Data: "0x0000000000000000000000000000000000000000000000000de0b6b3a7640000", 203 Topics: []string{ 204 "0xc17a9d92b89f27cb79cc390f23a1a5d302fefab8c7911075ede952ac2b5607a1", 205 "0x00000000000000000000ab228a4d4263e067df56b1dd226acb939f532ff7ab5b", 206 "0x00000000000000000000ab094a15c3dc43095c7450c59bf56263e9827065f306", 207 }, 208 }, 209 }, 210 }, 211 }, 212 } 213 214 testTx1Failed = bchain.Tx{ 215 Blocktime: 1534858022, 216 Time: 1534858022, 217 Txid: "0x998d535fb50fc55eafc591c20acf9ae13cebb96676fe90fcd136ea1f94113520", 218 Vin: []bchain.Vin{ 219 { 220 Addresses: []string{"cb656dadee521bea601692312454a655a0f49051ddc9"}, 221 }, 222 }, 223 Vout: []bchain.Vout{ 224 { 225 ValueSat: *big.NewInt(1999622000000000000), 226 ScriptPubKey: bchain.ScriptPubKey{ 227 Addresses: []string{"cb79fbc0290a1a3cf017f702e604ba234568533110af"}, 228 }, 229 }, 230 }, 231 CoinSpecificData: CoreCoinSpecificData{ 232 Tx: &RpcTransaction{ 233 AccountNonce: "0xb26c", 234 EnergyPrice: "0x430e23400", 235 EnergyLimit: "0x5208", 236 To: "cb79fbc0290a1a3cf017f702e604ba234568533110af", 237 Value: "0x1bc0159d530e6000", 238 Payload: "0x", 239 Hash: "0x998d535fb50fc55eafc591c20acf9ae13cebb96676fe90fcd136ea1f94113520", 240 BlockNumber: "0x41eee8", 241 From: "cb656dadee521bea601692312454a655a0f49051ddc9", 242 TransactionIndex: "0xa", 243 }, 244 Receipt: &RpcReceipt{ 245 EnergyUsed: "0x5208", 246 Status: "0x0", 247 Logs: []*RpcLog{}, 248 }, 249 }, 250 } 251 252 testTx1NoStatus = bchain.Tx{ 253 Blocktime: 1534858022, 254 Time: 1534858022, 255 Txid: "0x998d535fb50fc55eafc591c20acf9ae13cebb96676fe90fcd136ea1f94113520", 256 Vin: []bchain.Vin{ 257 { 258 Addresses: []string{"cb656dadee521bea601692312454a655a0f49051ddc9"}, 259 }, 260 }, 261 Vout: []bchain.Vout{ 262 { 263 ValueSat: *big.NewInt(1999622000000000000), 264 ScriptPubKey: bchain.ScriptPubKey{ 265 Addresses: []string{"cb79fbc0290a1a3cf017f702e604ba234568533110af"}, 266 }, 267 }, 268 }, 269 CoinSpecificData: CoreCoinSpecificData{ 270 Tx: &RpcTransaction{ 271 AccountNonce: "0xb26c", 272 EnergyPrice: "0x430e23400", 273 EnergyLimit: "0x5208", 274 To: "cb79fbc0290a1a3cf017f702e604ba234568533110af", 275 Value: "0x1bc0159d530e6000", 276 Payload: "0x", 277 Hash: "0x998d535fb50fc55eafc591c20acf9ae13cebb96676fe90fcd136ea1f94113520", 278 BlockNumber: "0x41eee8", 279 From: "cb656dadee521bea601692312454a655a0f49051ddc9", 280 TransactionIndex: "0xa", 281 }, 282 Receipt: &RpcReceipt{ 283 EnergyUsed: "0x5208", 284 Status: "", 285 Logs: []*RpcLog{}, 286 }, 287 }, 288 } 289 290 } 291 292 func TestCoreCoinParser_PackTx(t *testing.T) { 293 type args struct { 294 tx *bchain.Tx 295 height uint32 296 blockTime int64 297 } 298 tests := []struct { 299 name string 300 p *CoreCoinParser 301 args args 302 want string 303 wantErr bool 304 networkID common.NetworkID 305 }{ 306 { 307 name: "1", 308 args: args{ 309 tx: &testTx1, 310 height: 4321000, 311 blockTime: 1534858022, 312 }, 313 want: dbtestdata.XcbTx1Packed, 314 networkID: common.NetworkID(1), 315 }, 316 { 317 name: "2", 318 args: args{ 319 tx: &testTx2, 320 height: 4321000, 321 blockTime: 1534858022, 322 }, 323 want: dbtestdata.XcbTx2Packed, 324 networkID: common.NetworkID(3), 325 }, 326 { 327 name: "3", 328 args: args{ 329 tx: &testTx1Failed, 330 height: 4321000, 331 blockTime: 1534858022, 332 }, 333 want: dbtestdata.XcbTx1FailedPacked, 334 networkID: common.NetworkID(1), 335 }, 336 { 337 name: "4", 338 args: args{ 339 tx: &testTx1NoStatus, 340 height: 4321000, 341 blockTime: 1534858022, 342 }, 343 want: dbtestdata.XcbTx1NoStatusPacked, 344 networkID: common.NetworkID(1), 345 }, 346 { 347 name: "4", 348 args: args{ 349 tx: &testTx3, 350 height: 4321000, 351 blockTime: 1534858022, 352 }, 353 want: dbtestdata.XcbTx3Packed, 354 networkID: common.NetworkID(3), 355 }, 356 } 357 p := NewCoreCoinParser(1) 358 for _, tt := range tests { 359 if tt.networkID != 0 { 360 common.DefaultNetworkID = tt.networkID 361 } 362 t.Run(tt.name, func(t *testing.T) { 363 got, err := p.PackTx(tt.args.tx, tt.args.height, tt.args.blockTime) 364 if (err != nil) != tt.wantErr { 365 t.Errorf("CoreCoinParser.PackTx() error = %v, wantErr %v", err, tt.wantErr) 366 return 367 } 368 h := hex.EncodeToString(got) 369 if !reflect.DeepEqual(h, tt.want) { 370 t.Errorf("CoreCoinParser.PackTx() = %v, want %v", h, tt.want) 371 } 372 }) 373 } 374 } 375 376 func TestCoreCoinParser_UnpackTx(t *testing.T) { 377 type args struct { 378 hex string 379 } 380 tests := []struct { 381 name string 382 p *CoreCoinParser 383 args args 384 want *bchain.Tx 385 want1 uint32 386 wantErr bool 387 networkID common.NetworkID 388 }{ 389 { 390 name: "1", 391 args: args{hex: dbtestdata.XcbTx1Packed}, 392 want: &testTx1, 393 want1: 4321000, 394 networkID: common.NetworkID(1), 395 }, 396 { 397 name: "2", 398 args: args{hex: dbtestdata.XcbTx2Packed}, 399 want: &testTx2, 400 want1: 4765993, 401 networkID: common.NetworkID(3), 402 }, 403 { 404 name: "3", 405 args: args{hex: dbtestdata.XcbTx1FailedPacked}, 406 want: &testTx1Failed, 407 want1: 4321000, 408 networkID: common.NetworkID(1), 409 }, 410 { 411 name: "4", 412 args: args{hex: dbtestdata.XcbTx1NoStatusPacked}, 413 want: &testTx1NoStatus, 414 want1: 4321000, 415 networkID: common.NetworkID(1), 416 }, 417 } 418 p := NewCoreCoinParser(1) 419 for _, tt := range tests { 420 if tt.networkID != 0 { 421 common.DefaultNetworkID = tt.networkID 422 } 423 t.Run(tt.name, func(t *testing.T) { 424 b, err := hex.DecodeString(tt.args.hex) 425 if err != nil { 426 panic(err) 427 } 428 got, got1, err := p.UnpackTx(b) 429 if (err != nil) != tt.wantErr { 430 t.Errorf("CoreCoinParser.UnpackTx() error = %v, wantErr %v", err, tt.wantErr) 431 return 432 } 433 // DeepEqual has problems with pointers in CoreCoinSpecificData 434 gs := got.CoinSpecificData.(CoreCoinSpecificData) 435 ws := tt.want.CoinSpecificData.(CoreCoinSpecificData) 436 gc := *got 437 wc := *tt.want 438 gc.CoinSpecificData = nil 439 wc.CoinSpecificData = nil 440 if fmt.Sprint(gc) != fmt.Sprint(wc) { 441 // if !reflect.DeepEqual(gc, wc) { 442 t.Errorf("CoreCoinParser.UnpackTx() gc got = %+v, want %+v", gc, wc) 443 } 444 if !reflect.DeepEqual(gs.Tx, ws.Tx) { 445 t.Errorf("CoreCoinParser.UnpackTx() gs.Tx got = %+v, want %+v", gs.Tx, ws.Tx) 446 } 447 if !reflect.DeepEqual(gs.Receipt, ws.Receipt) { 448 t.Errorf("CoreCoinParser.UnpackTx() gs.Receipt got = %+v, want %+v", gs.Receipt, ws.Receipt) 449 } 450 if got1 != tt.want1 { 451 t.Errorf("CoreCoinParser.UnpackTx() got1 = %v, want %v", got1, tt.want1) 452 } 453 }) 454 } 455 } 456 457 func TestCoreCoinParser_GetCoreblockchainTxData(t *testing.T) { 458 tests := []struct { 459 name string 460 tx *bchain.Tx 461 want string 462 }{ 463 { 464 name: "Test empty data", 465 tx: &testTx1, 466 want: "0x", 467 }, 468 { 469 name: "Test non empty data", 470 tx: &testTx2, 471 want: "0xe86e7c5f00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000100000000000000000000ab27b691efe91718cb73207207d92dbd175e6b10c7560000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000002b5e3af16b1880000", 472 }, 473 } 474 for _, tt := range tests { 475 t.Run(tt.name, func(t *testing.T) { 476 got := GetCoreCoinTxData(tt.tx) 477 if got.Data != tt.want { 478 t.Errorf("CoreCoinParser.GetCoreCoinTxData() = %v, want %v", got.Data, tt.want) 479 } 480 }) 481 } 482 }