github.com/trezor/blockbook@v0.4.1-0.20240328132726-e9a08582ee2c/bchain/coins/dogecoin/dogecoinparser_test.go (about) 1 //go:build unittest 2 3 package dogecoin 4 5 import ( 6 "bytes" 7 "encoding/hex" 8 "fmt" 9 "io/ioutil" 10 "math/big" 11 "os" 12 "path/filepath" 13 "reflect" 14 "testing" 15 16 "github.com/martinboehm/btcutil/chaincfg" 17 "github.com/trezor/blockbook/bchain" 18 "github.com/trezor/blockbook/bchain/coins/btc" 19 ) 20 21 func TestMain(m *testing.M) { 22 c := m.Run() 23 chaincfg.ResetParams() 24 os.Exit(c) 25 } 26 27 func Test_GetAddrDescFromAddress_Mainnet(t *testing.T) { 28 type args struct { 29 address string 30 } 31 tests := []struct { 32 name string 33 args args 34 want string 35 wantErr bool 36 }{ 37 { 38 name: "P2PKH1", 39 args: args{address: "DHZYinsaM9nW5piCMN639ELRKbZomThPnZ"}, 40 want: "76a9148841590909747c0f97af158f22fadacb1652522088ac", 41 wantErr: false, 42 }, 43 { 44 name: "P2PKH2", 45 args: args{address: "DSzaAYEYyy9ngjoJ294r7jzFM3xhD6bKHK"}, 46 want: "76a914efb6158f75743c611858fdfd0f4aaec6cc6196bc88ac", 47 wantErr: false, 48 }, 49 { 50 name: "P2PKH3", 51 args: args{address: "DHobAps6DjZ5n4xMV75n7kJv299Zi85FCG"}, 52 want: "76a9148ae937291e72f7368421dbaa966c44950eb14db788ac", 53 wantErr: false, 54 }, 55 { 56 name: "P2SH1", 57 args: args{address: "9tg1kVUk339Tk58ewu5T8QT82Z6cE4UvSU"}, 58 want: "a9141889a089400ea25d28694fd98aa7702b21eeeab187", 59 wantErr: false, 60 }, 61 { 62 name: "P2SH2", 63 args: args{address: "9sLa1AKzjWuNTe1CkLh5GDYyRP9enb1Spp"}, 64 want: "a91409e41aff9f97412ab3d4a07cf0667fdba84caf4487", 65 wantErr: false, 66 }, 67 } 68 parser := NewDogecoinParser(GetChainParams("main"), &btc.Configuration{}) 69 70 for _, tt := range tests { 71 t.Run(tt.name, func(t *testing.T) { 72 got, err := parser.GetAddrDescFromAddress(tt.args.address) 73 if (err != nil) != tt.wantErr { 74 t.Errorf("GetAddrDescFromAddress() error = %v, wantErr %v", err, tt.wantErr) 75 return 76 } 77 h := hex.EncodeToString(got) 78 if !reflect.DeepEqual(h, tt.want) { 79 t.Errorf("GetAddrDescFromAddress() = %v, want %v", h, tt.want) 80 } 81 }) 82 } 83 } 84 85 func Test_GetAddrDescFromAddress_Testnet(t *testing.T) { 86 type args struct { 87 address string 88 } 89 tests := []struct { 90 name string 91 args args 92 want string 93 wantErr bool 94 }{ 95 { 96 name: "P2PKH1", 97 args: args{address: "neYNjrnowpYrbS4QanPngXBi6MQcX6FsWV"}, 98 want: "76a9147183fdc10d664551d151922f95e58ab548d8ad2688ac", 99 wantErr: false, 100 }, 101 { 102 name: "P2PKH2", 103 args: args{address: "nYrWFiv3zz5MewmN6ZJUpEfLQwz63Ptf1i"}, 104 want: "76a9143320ff38bc2d44e404cc3f0b36202f3a4897e05088ac", 105 wantErr: false, 106 }, 107 { 108 name: "P2PKH3", 109 args: args{address: "nbn2EWCDp2xcb7jTxhcXytLKZuctY8xXiB"}, 110 want: "76a914533051d74f660325166fd342250f99fd366214ec88ac", 111 wantErr: false, 112 }, 113 { 114 name: "P2SH1", 115 args: args{address: "2MyChfh5WfqzDTyFibZq2uSF3WcYFE1G5te"}, 116 want: "a91441569cc9dbdc08a99d20079bfd12071a2bdbf8e987", 117 wantErr: false, 118 }, 119 { 120 name: "P2SH2", 121 args: args{address: "2NCnuCgdAAQHQvSQVw9eJA8UfbffupFLaYm"}, 122 want: "a914d66804cbba3b9035f2447b5454699f657dd3275087", 123 wantErr: false, 124 }, 125 { 126 name: "P2SH3", 127 args: args{address: "2N2ju8ukjDQbJRB4ptNtekDzYNiqSQHARvd"}, 128 want: "a9146825756d503c3a81659409636d6e6c40755fcdcf87", 129 wantErr: false, 130 }, 131 } 132 parser := NewDogecoinParser(GetChainParams("test"), &btc.Configuration{}) 133 134 for _, tt := range tests { 135 t.Run(tt.name, func(t *testing.T) { 136 got, err := parser.GetAddrDescFromAddress(tt.args.address) 137 if (err != nil) != tt.wantErr { 138 t.Errorf("GetAddrDescFromAddress() error = %v, wantErr %v", err, tt.wantErr) 139 return 140 } 141 h := hex.EncodeToString(got) 142 if !reflect.DeepEqual(h, tt.want) { 143 t.Errorf("GetAddrDescFromAddress() = %v, want %v", h, tt.want) 144 } 145 }) 146 } 147 } 148 149 func Test_GetAddressesFromAddrDesc_Mainnet(t *testing.T) { 150 type args struct { 151 script string 152 } 153 tests := []struct { 154 name string 155 args args 156 want []string 157 want2 bool 158 wantErr bool 159 }{ 160 { 161 name: "P2PKH1", 162 args: args{script: "76a9148841590909747c0f97af158f22fadacb1652522088ac"}, 163 want: []string{"DHZYinsaM9nW5piCMN639ELRKbZomThPnZ"}, 164 want2: true, 165 wantErr: false, 166 }, 167 { 168 name: "P2PKH2", 169 args: args{script: "76a914efb6158f75743c611858fdfd0f4aaec6cc6196bc88ac"}, 170 want: []string{"DSzaAYEYyy9ngjoJ294r7jzFM3xhD6bKHK"}, 171 want2: true, 172 wantErr: false, 173 }, 174 { 175 name: "P2PKH3", 176 args: args{script: "76a91450e86eeac599ad023b8981296d01b50bdabcdd9788ac"}, 177 want: []string{"DCWu3MLz9xBGFuuLyNDf6QjuGp49f5tfc9"}, 178 want2: true, 179 wantErr: false, 180 }, 181 { 182 name: "P2SH1", 183 args: args{script: "a9141889a089400ea25d28694fd98aa7702b21eeeab187"}, 184 want: []string{"9tg1kVUk339Tk58ewu5T8QT82Z6cE4UvSU"}, 185 want2: true, 186 wantErr: false, 187 }, 188 { 189 name: "OP_RETURN ascii", 190 args: args{script: "6a0461686f6a"}, 191 want: []string{"OP_RETURN (ahoj)"}, 192 want2: false, 193 wantErr: false, 194 }, 195 { 196 name: "OP_RETURN hex", 197 args: args{script: "6a072020f1686f6a20"}, 198 want: []string{"OP_RETURN 2020f1686f6a20"}, 199 want2: false, 200 wantErr: false, 201 }, 202 } 203 204 parser := NewDogecoinParser(GetChainParams("main"), &btc.Configuration{}) 205 206 for _, tt := range tests { 207 t.Run(tt.name, func(t *testing.T) { 208 b, _ := hex.DecodeString(tt.args.script) 209 got, got2, err := parser.GetAddressesFromAddrDesc(b) 210 if (err != nil) != tt.wantErr { 211 t.Errorf("GetAddressesFromAddrDesc() error = %v, wantErr %v", err, tt.wantErr) 212 return 213 } 214 if !reflect.DeepEqual(got, tt.want) { 215 t.Errorf("GetAddressesFromAddrDesc() = %v, want %v", got, tt.want) 216 } 217 if !reflect.DeepEqual(got2, tt.want2) { 218 t.Errorf("GetAddressesFromAddrDesc() = %v, want %v", got2, tt.want2) 219 } 220 }) 221 } 222 } 223 224 func Test_GetAddressesFromAddrDesc_Testnet(t *testing.T) { 225 type args struct { 226 script string 227 } 228 tests := []struct { 229 name string 230 args args 231 want []string 232 want2 bool 233 wantErr bool 234 }{ 235 { 236 name: "P2PKH1", 237 args: args{script: "76a9147183fdc10d664551d151922f95e58ab548d8ad2688ac"}, 238 want: []string{"neYNjrnowpYrbS4QanPngXBi6MQcX6FsWV"}, 239 want2: true, 240 wantErr: false, 241 }, 242 { 243 name: "P2PKH2", 244 args: args{script: "76a9143320ff38bc2d44e404cc3f0b36202f3a4897e05088ac"}, 245 want: []string{"nYrWFiv3zz5MewmN6ZJUpEfLQwz63Ptf1i"}, 246 want2: true, 247 wantErr: false, 248 }, 249 { 250 name: "P2PKH3", 251 args: args{script: "76a914533051d74f660325166fd342250f99fd366214ec88ac"}, 252 want: []string{"nbn2EWCDp2xcb7jTxhcXytLKZuctY8xXiB"}, 253 want2: true, 254 wantErr: false, 255 }, 256 { 257 name: "P2SH1", 258 args: args{script: "a91441569cc9dbdc08a99d20079bfd12071a2bdbf8e987"}, 259 want: []string{"2MyChfh5WfqzDTyFibZq2uSF3WcYFE1G5te"}, 260 want2: true, 261 wantErr: false, 262 }, 263 { 264 name: "P2SH2", 265 args: args{script: "a914d66804cbba3b9035f2447b5454699f657dd3275087"}, 266 want: []string{"2NCnuCgdAAQHQvSQVw9eJA8UfbffupFLaYm"}, 267 want2: true, 268 wantErr: false, 269 }, 270 { 271 name: "P2SH3", 272 args: args{script: "a9146825756d503c3a81659409636d6e6c40755fcdcf87"}, 273 want: []string{"2N2ju8ukjDQbJRB4ptNtekDzYNiqSQHARvd"}, 274 want2: true, 275 wantErr: false, 276 }, 277 { 278 name: "OP_RETURN ascii", 279 args: args{script: "6a0c48656c6c6f20746865726521"}, 280 want: []string{"OP_RETURN (Hello there!)"}, 281 want2: false, 282 wantErr: false, 283 }, 284 { 285 name: "OP_RETURN hex", 286 args: args{script: "6a072020f1686f6a20"}, 287 want: []string{"OP_RETURN 2020f1686f6a20"}, 288 want2: false, 289 wantErr: false, 290 }, 291 } 292 293 parser := NewDogecoinParser(GetChainParams("test"), &btc.Configuration{}) 294 295 for _, tt := range tests { 296 t.Run(tt.name, func(t *testing.T) { 297 b, _ := hex.DecodeString(tt.args.script) 298 got, got2, err := parser.GetAddressesFromAddrDesc(b) 299 if (err != nil) != tt.wantErr { 300 t.Errorf("GetAddressesFromAddrDesc() error = %v, wantErr %v", err, tt.wantErr) 301 return 302 } 303 if !reflect.DeepEqual(got, tt.want) { 304 t.Errorf("GetAddressesFromAddrDesc() = %v, want %v", got, tt.want) 305 } 306 if !reflect.DeepEqual(got2, tt.want2) { 307 t.Errorf("GetAddressesFromAddrDesc() = %v, want %v", got2, tt.want2) 308 } 309 }) 310 } 311 } 312 313 var ( 314 testTx1 bchain.Tx 315 testTxPacked1 = "00030e6d8ba8d7aa2001000000016b3c0c53267964120acf7f7e72217e3f463e52ce622f89659f6a6bb8e69a4d91000000006c493046022100a96454237e3a020994534583e28c04757881374bceac89f933ea9ff00b4db259022100fbb757ff7ea4f02c4e42556b2834c61eba1f1af605db089d836a0614d90a3b46012103cebdde6d1046e285df4f48497bc50dc20a4a258ca5b7308cb0a929c9fdadcd9dffffffff0217e823ca7f0200001976a914eef21768a546590993e313c7f3dfadf6a6efa1e888acaddf4cba010000001976a914e0fee2ea29dd9c6c759d8341bd0da4c4f738cced88ac00000000" 316 317 testTx2 bchain.Tx 318 testTxPacked2 = "0001193a8ba8d7835601000000016d0211b5656f1b8c2ac002445638e247082090ffc5d5fa7c38b445b84a2c2054000000006b4830450221008856f2f620df278c0fc6a5d5e2d50451c0a65a75aaf7a4a9cbfcac3918b5536802203dc685a784d49e2a95eb72763ad62f02094af78507c57b0a3c3f1d8a60f74db6012102db814cd43df584804fde1949365a6309714e342aef0794dc58385d7e413444cdffffffff0237daa2ee0a4715001976a9149355c01ed20057eac9fe0bbf8b07d87e62fe712d88ac8008389e7e8d03001976a9145b4f2511c94e4fcaa8f8835b2458f8cb6542ca7688ac00000000" 319 320 testTx1_Testnet bchain.Tx 321 testTxPacked1_Testnet = "0030d40b8c8bc4d552010000000104207e905afaf6facfafe7f63cac0afaab07c36b8aab34d5a6b6402859cfbb3b010000006b483045022100daf5631310f5f8ffa4b6a5e9151e3eefbc797ab67ee52e78621526d32694705b02206c038bd527397d3d6f01cd72011a61b58f5d8b74c2d067274d09a8f70f436d330121031d716677bfa840265c32f02b1ff519e59b2d76fcc1753c59516d6891058e6826ffffffff0256b54009000000001976a914e56f55dbb600c10e1f4f6d5da38eea5e664504cf88ac220d5871030000001976a914e8600a08d053bcd41bc316be574efbba6e126d3088ac00000000" 322 323 testTx2_Testnet bchain.Tx 324 testTxPacked2_Testnet = "0030d4068c8bc4c770010000000342dd48439e8fe54b161be919bd9a34e887fa88ca38b1200fc26f4edffc3e69950000000069463043021f48a06f76e53665563090919d01dab845039d7ca4050ea00d65dd6542f2e219022024ae5e8806d737c80e83aa969dd549afbf675a94582889b61a630c0a328969870121036a0a9600ef07072a55fdd770fe4c6e4a138ce3c409eb4328f37fb3066d12e598feffffff9883d80ffa7af541808640940b2a7fb69c8ad817ef51049cdf9ee09731460a12010000006a47304402201d6a14b9a2f275a64edfa447e13347e53023bc192de577a0f7fa5309f26d987b0220386ba58a20032395c8c773cc9be405251b9f5d47182f3be5055dbe01ce0894650121038548fe799340b63c4e05e1edee6a36c5a2b82abec4efecc60bef0205969fb9befeffffffd7d88db648983248f58adb62a428baad726e9d6f40a9dfbf8181c7cd013d2dad000000006b483045022100880a8e9c9fdf43ef8f8c2e6817327d6cee89f12e47d77eb6e470a1b2d99b695d0220755911c3ec6d6704c34d8fd447875c9dbaf37c83a2079352be827c558e1b3f3b012103ddd9ebd38c8891b2ee56b17a155367edcc251fc7aca30130523c834d94fd04d2feffffff021ed9092c000000001976a91433bc558a159810fe4353b09b38b270a74a02621f88ac29ebe9a50000000017a914d0e87f2ab081c1c00e3dca9b653d654889ddb7148705d43000" 325 ) 326 327 func init() { 328 testTx1 = bchain.Tx{ 329 Hex: "01000000016b3c0c53267964120acf7f7e72217e3f463e52ce622f89659f6a6bb8e69a4d91000000006c493046022100a96454237e3a020994534583e28c04757881374bceac89f933ea9ff00b4db259022100fbb757ff7ea4f02c4e42556b2834c61eba1f1af605db089d836a0614d90a3b46012103cebdde6d1046e285df4f48497bc50dc20a4a258ca5b7308cb0a929c9fdadcd9dffffffff0217e823ca7f0200001976a914eef21768a546590993e313c7f3dfadf6a6efa1e888acaddf4cba010000001976a914e0fee2ea29dd9c6c759d8341bd0da4c4f738cced88ac00000000", 330 Blocktime: 1519053456, 331 Txid: "097ea09ba284f3f2a9e880e11f837edf7e5cea81c8da2238f5bc7c2c4c407943", 332 LockTime: 0, 333 Version: 1, 334 Vin: []bchain.Vin{ 335 { 336 ScriptSig: bchain.ScriptSig{ 337 Hex: "493046022100a96454237e3a020994534583e28c04757881374bceac89f933ea9ff00b4db259022100fbb757ff7ea4f02c4e42556b2834c61eba1f1af605db089d836a0614d90a3b46012103cebdde6d1046e285df4f48497bc50dc20a4a258ca5b7308cb0a929c9fdadcd9d", 338 }, 339 Txid: "914d9ae6b86b6a9f65892f62ce523e463f7e21727e7fcf0a12647926530c3c6b", 340 Vout: 0, 341 Sequence: 4294967295, 342 }, 343 }, 344 Vout: []bchain.Vout{ 345 { 346 ValueSat: *big.NewInt(2747875452951), 347 N: 0, 348 ScriptPubKey: bchain.ScriptPubKey{ 349 Hex: "76a914eef21768a546590993e313c7f3dfadf6a6efa1e888ac", 350 Addresses: []string{ 351 "DSvXNiqvG42wdteLqh3i6inxgDTs8Y9w2i", 352 }, 353 }, 354 }, 355 { 356 ValueSat: *big.NewInt(7420567469), 357 N: 1, 358 ScriptPubKey: bchain.ScriptPubKey{ 359 Hex: "76a914e0fee2ea29dd9c6c759d8341bd0da4c4f738cced88ac", 360 Addresses: []string{ 361 "DRemF3ZcqJ1PFeM7e7sXzzwQJKR8GNUtwK", 362 }, 363 }, 364 }, 365 }, 366 } 367 368 testTx2 = bchain.Tx{ 369 Hex: "01000000016d0211b5656f1b8c2ac002445638e247082090ffc5d5fa7c38b445b84a2c2054000000006b4830450221008856f2f620df278c0fc6a5d5e2d50451c0a65a75aaf7a4a9cbfcac3918b5536802203dc685a784d49e2a95eb72763ad62f02094af78507c57b0a3c3f1d8a60f74db6012102db814cd43df584804fde1949365a6309714e342aef0794dc58385d7e413444cdffffffff0237daa2ee0a4715001976a9149355c01ed20057eac9fe0bbf8b07d87e62fe712d88ac8008389e7e8d03001976a9145b4f2511c94e4fcaa8f8835b2458f8cb6542ca7688ac00000000", 370 Blocktime: 1519050987, 371 Txid: "b276545af246e3ed5a4e3e5b60d359942a1808579effc53ff4f343e4f6cfc5a0", 372 LockTime: 0, 373 Version: 1, 374 Vin: []bchain.Vin{ 375 { 376 ScriptSig: bchain.ScriptSig{ 377 Hex: "4830450221008856f2f620df278c0fc6a5d5e2d50451c0a65a75aaf7a4a9cbfcac3918b5536802203dc685a784d49e2a95eb72763ad62f02094af78507c57b0a3c3f1d8a60f74db6012102db814cd43df584804fde1949365a6309714e342aef0794dc58385d7e413444cd", 378 }, 379 Txid: "54202c4ab845b4387cfad5c5ff90200847e238564402c02a8c1b6f65b511026d", 380 Vout: 0, 381 Sequence: 4294967295, 382 }, 383 }, 384 Vout: []bchain.Vout{ 385 { 386 ValueSat: *big.NewInt(5989086789818935), 387 N: 0, 388 ScriptPubKey: bchain.ScriptPubKey{ 389 Hex: "76a9149355c01ed20057eac9fe0bbf8b07d87e62fe712d88ac", 390 Addresses: []string{ 391 "DJa8bWDrZKu4HgsYRYWuJrvxt6iTYuvXJ6", 392 }, 393 }, 394 }, 395 { 396 ValueSat: *big.NewInt(999999890000000), 397 N: 1, 398 ScriptPubKey: bchain.ScriptPubKey{ 399 Hex: "76a9145b4f2511c94e4fcaa8f8835b2458f8cb6542ca7688ac", 400 Addresses: []string{ 401 "DDTtqnuZ5kfRT5qh2c7sNtqrJmV3iXYdGG", 402 }, 403 }, 404 }, 405 }, 406 } 407 408 testTx1_Testnet = bchain.Tx{ 409 Hex: "010000000104207e905afaf6facfafe7f63cac0afaab07c36b8aab34d5a6b6402859cfbb3b010000006b483045022100daf5631310f5f8ffa4b6a5e9151e3eefbc797ab67ee52e78621526d32694705b02206c038bd527397d3d6f01cd72011a61b58f5d8b74c2d067274d09a8f70f436d330121031d716677bfa840265c32f02b1ff519e59b2d76fcc1753c59516d6891058e6826ffffffff0256b54009000000001976a914e56f55dbb600c10e1f4f6d5da38eea5e664504cf88ac220d5871030000001976a914e8600a08d053bcd41bc316be574efbba6e126d3088ac00000000", 410 Blocktime: 1622709609, 411 Txid: "43cfbc6db77a8e9aad25913c2298da81421e513e216420b8af2562e744a030c9", 412 LockTime: 0, 413 Version: 1, 414 Vin: []bchain.Vin{ 415 { 416 ScriptSig: bchain.ScriptSig{ 417 Hex: "483045022100daf5631310f5f8ffa4b6a5e9151e3eefbc797ab67ee52e78621526d32694705b02206c038bd527397d3d6f01cd72011a61b58f5d8b74c2d067274d09a8f70f436d330121031d716677bfa840265c32f02b1ff519e59b2d76fcc1753c59516d6891058e6826", 418 }, 419 Txid: "3bbbcf592840b6a6d534ab8a6bc307abfa0aac3cf6e7afcffaf6fa5a907e2004", 420 Vout: 1, 421 Sequence: 4294967295, 422 }, 423 }, 424 Vout: []bchain.Vout{ 425 { 426 ValueSat: *big.NewInt(155235670), 427 N: 0, 428 ScriptPubKey: bchain.ScriptPubKey{ 429 Hex: "76a914e56f55dbb600c10e1f4f6d5da38eea5e664504cf88ac", 430 Addresses: []string{ 431 "nq7JNvDtsGxB7wRjqc6DQ7JRzzXtHT2ETD", 432 }, 433 }, 434 }, 435 { 436 ValueSat: *big.NewInt(14786497826), 437 N: 1, 438 ScriptPubKey: bchain.ScriptPubKey{ 439 Hex: "76a914e8600a08d053bcd41bc316be574efbba6e126d3088ac", 440 Addresses: []string{ 441 "nqNr5hLREhQTjx4DA4TfJfeFR9YjMQXrxn", 442 }, 443 }, 444 }, 445 }, 446 } 447 448 testTx2_Testnet = bchain.Tx{ 449 Hex: "010000000342dd48439e8fe54b161be919bd9a34e887fa88ca38b1200fc26f4edffc3e69950000000069463043021f48a06f76e53665563090919d01dab845039d7ca4050ea00d65dd6542f2e219022024ae5e8806d737c80e83aa969dd549afbf675a94582889b61a630c0a328969870121036a0a9600ef07072a55fdd770fe4c6e4a138ce3c409eb4328f37fb3066d12e598feffffff9883d80ffa7af541808640940b2a7fb69c8ad817ef51049cdf9ee09731460a12010000006a47304402201d6a14b9a2f275a64edfa447e13347e53023bc192de577a0f7fa5309f26d987b0220386ba58a20032395c8c773cc9be405251b9f5d47182f3be5055dbe01ce0894650121038548fe799340b63c4e05e1edee6a36c5a2b82abec4efecc60bef0205969fb9befeffffffd7d88db648983248f58adb62a428baad726e9d6f40a9dfbf8181c7cd013d2dad000000006b483045022100880a8e9c9fdf43ef8f8c2e6817327d6cee89f12e47d77eb6e470a1b2d99b695d0220755911c3ec6d6704c34d8fd447875c9dbaf37c83a2079352be827c558e1b3f3b012103ddd9ebd38c8891b2ee56b17a155367edcc251fc7aca30130523c834d94fd04d2feffffff021ed9092c000000001976a91433bc558a159810fe4353b09b38b270a74a02621f88ac29ebe9a50000000017a914d0e87f2ab081c1c00e3dca9b653d654889ddb7148705d43000", 450 Blocktime: 1622708728, 451 Txid: "91e2f3a9dde1e2da53f29c73033084b3d1a3b0c0ba6737d6418cfa9cad62be3c", 452 LockTime: 3200005, 453 Version: 1, 454 Vin: []bchain.Vin{ 455 { 456 ScriptSig: bchain.ScriptSig{ 457 Hex: "463043021f48a06f76e53665563090919d01dab845039d7ca4050ea00d65dd6542f2e219022024ae5e8806d737c80e83aa969dd549afbf675a94582889b61a630c0a328969870121036a0a9600ef07072a55fdd770fe4c6e4a138ce3c409eb4328f37fb3066d12e598", 458 }, 459 Txid: "95693efcdf4e6fc20f20b138ca88fa87e8349abd19e91b164be58f9e4348dd42", 460 Vout: 0, 461 Sequence: 4294967294, // Locktime is enabled for this transaction; see BIP-125 462 }, 463 { 464 ScriptSig: bchain.ScriptSig{ 465 Hex: "47304402201d6a14b9a2f275a64edfa447e13347e53023bc192de577a0f7fa5309f26d987b0220386ba58a20032395c8c773cc9be405251b9f5d47182f3be5055dbe01ce0894650121038548fe799340b63c4e05e1edee6a36c5a2b82abec4efecc60bef0205969fb9be", 466 }, 467 Txid: "120a463197e09edf9c0451ef17d88a9cb67f2a0b9440868041f57afa0fd88398", 468 Vout: 1, 469 Sequence: 4294967294, 470 }, 471 { 472 ScriptSig: bchain.ScriptSig{ 473 Hex: "483045022100880a8e9c9fdf43ef8f8c2e6817327d6cee89f12e47d77eb6e470a1b2d99b695d0220755911c3ec6d6704c34d8fd447875c9dbaf37c83a2079352be827c558e1b3f3b012103ddd9ebd38c8891b2ee56b17a155367edcc251fc7aca30130523c834d94fd04d2", 474 }, 475 Txid: "ad2d3d01cdc78181bfdfa9406f9d6e72adba28a462db8af548329848b68dd8d7", 476 Vout: 0, 477 Sequence: 4294967294, 478 }, 479 }, 480 Vout: []bchain.Vout{ 481 { 482 ValueSat: *big.NewInt(738842910), 483 N: 0, 484 ScriptPubKey: bchain.ScriptPubKey{ 485 Hex: "76a91433bc558a159810fe4353b09b38b270a74a02621f88ac", 486 Addresses: []string{ 487 "nYuiLjsDCVCBwZ3XhNv3qiiDiwmtQRLNhY", 488 }, 489 }, 490 }, 491 { 492 ValueSat: *big.NewInt(2783570729), 493 N: 1, 494 ScriptPubKey: bchain.ScriptPubKey{ 495 Hex: "a914d0e87f2ab081c1c00e3dca9b653d654889ddb71487", 496 Addresses: []string{ 497 "2NCHq4LmqvjB9mqrHMWNUjfDs2FdsmJah6b", 498 }, 499 }, 500 }, 501 }, 502 } 503 } 504 505 func Test_PackTx(t *testing.T) { 506 type args struct { 507 tx bchain.Tx 508 height uint32 509 blockTime int64 510 parser *DogecoinParser 511 } 512 tests := []struct { 513 name string 514 args args 515 want string 516 wantErr bool 517 }{ 518 { 519 name: "dogecoin-1", 520 args: args{ 521 tx: testTx1, 522 height: 200301, 523 blockTime: 1519053456, 524 parser: NewDogecoinParser(GetChainParams("main"), &btc.Configuration{}), 525 }, 526 want: testTxPacked1, 527 wantErr: false, 528 }, 529 { 530 name: "dogecoin-2", 531 args: args{ 532 tx: testTx2, 533 height: 71994, 534 blockTime: 1519050987, 535 parser: NewDogecoinParser(GetChainParams("main"), &btc.Configuration{}), 536 }, 537 want: testTxPacked2, 538 wantErr: false, 539 }, 540 } 541 for _, tt := range tests { 542 t.Run(tt.name, func(t *testing.T) { 543 got, err := tt.args.parser.PackTx(&tt.args.tx, tt.args.height, tt.args.blockTime) 544 if (err != nil) != tt.wantErr { 545 t.Errorf("packTx() error = %v, wantErr %v", err, tt.wantErr) 546 return 547 } 548 h := hex.EncodeToString(got) 549 if !reflect.DeepEqual(h, tt.want) { 550 t.Errorf("packTx() = %v, want %v", h, tt.want) 551 } 552 }) 553 } 554 } 555 556 func Test_PackTx_Testnet(t *testing.T) { 557 type args struct { 558 tx bchain.Tx 559 height uint32 560 blockTime int64 561 parser *DogecoinParser 562 } 563 tests := []struct { 564 name string 565 args args 566 want string 567 wantErr bool 568 }{ 569 { 570 name: "dogecoin-testnet-1", 571 args: args{ 572 tx: testTx1_Testnet, 573 height: 3200011, 574 blockTime: 1622709609, 575 parser: NewDogecoinParser(GetChainParams("test"), &btc.Configuration{}), 576 }, 577 want: testTxPacked1_Testnet, 578 wantErr: false, 579 }, 580 { 581 name: "dogecoin-testnet-2", 582 args: args{ 583 tx: testTx2_Testnet, 584 height: 3200006, 585 blockTime: 1622708728, 586 parser: NewDogecoinParser(GetChainParams("test"), &btc.Configuration{}), 587 }, 588 want: testTxPacked2_Testnet, 589 wantErr: false, 590 }, 591 } 592 for _, tt := range tests { 593 t.Run(tt.name, func(t *testing.T) { 594 got, err := tt.args.parser.PackTx(&tt.args.tx, tt.args.height, tt.args.blockTime) 595 if (err != nil) != tt.wantErr { 596 t.Errorf("packTx() error = %v, wantErr %v", err, tt.wantErr) 597 return 598 } 599 h := hex.EncodeToString(got) 600 if !reflect.DeepEqual(h, tt.want) { 601 t.Errorf("packTx() = %v, want %v", h, tt.want) 602 } 603 }) 604 } 605 } 606 607 func Test_UnpackTx(t *testing.T) { 608 type args struct { 609 packedTx string 610 parser *DogecoinParser 611 } 612 tests := []struct { 613 name string 614 args args 615 want *bchain.Tx 616 want1 uint32 617 wantErr bool 618 }{ 619 { 620 name: "dogecoin-1", 621 args: args{ 622 packedTx: testTxPacked1, 623 parser: NewDogecoinParser(GetChainParams("main"), &btc.Configuration{}), 624 }, 625 want: &testTx1, 626 want1: 200301, 627 wantErr: false, 628 }, 629 { 630 name: "dogecoin-2", 631 args: args{ 632 packedTx: testTxPacked2, 633 parser: NewDogecoinParser(GetChainParams("main"), &btc.Configuration{}), 634 }, 635 want: &testTx2, 636 want1: 71994, 637 wantErr: false, 638 }, 639 } 640 for _, tt := range tests { 641 t.Run(tt.name, func(t *testing.T) { 642 b, _ := hex.DecodeString(tt.args.packedTx) 643 got, got1, err := tt.args.parser.UnpackTx(b) 644 if (err != nil) != tt.wantErr { 645 t.Errorf("unpackTx() error = %v, wantErr %v", err, tt.wantErr) 646 return 647 } 648 if !reflect.DeepEqual(got, tt.want) { 649 t.Errorf("unpackTx() got = %v, want %v", got, tt.want) 650 } 651 if got1 != tt.want1 { 652 t.Errorf("unpackTx() got1 = %v, want %v", got1, tt.want1) 653 } 654 }) 655 } 656 } 657 658 func Test_UnpackTx_Testnet(t *testing.T) { 659 type args struct { 660 packedTx string 661 parser *DogecoinParser 662 } 663 tests := []struct { 664 name string 665 args args 666 want *bchain.Tx 667 want1 uint32 668 wantErr bool 669 }{ 670 { 671 name: "dogecoin-testnet-1", 672 args: args{ 673 packedTx: testTxPacked1_Testnet, 674 parser: NewDogecoinParser(GetChainParams("test"), &btc.Configuration{}), 675 }, 676 want: &testTx1_Testnet, 677 want1: 3200011, 678 wantErr: false, 679 }, 680 { 681 name: "dogecoin-testnet-2", 682 args: args{ 683 packedTx: testTxPacked2_Testnet, 684 parser: NewDogecoinParser(GetChainParams("test"), &btc.Configuration{}), 685 }, 686 want: &testTx2_Testnet, 687 want1: 3200006, 688 wantErr: false, 689 }, 690 } 691 for _, tt := range tests { 692 t.Run(tt.name, func(t *testing.T) { 693 b, _ := hex.DecodeString(tt.args.packedTx) 694 got, got1, err := tt.args.parser.UnpackTx(b) 695 if (err != nil) != tt.wantErr { 696 t.Errorf("unpackTx() error = %v, wantErr %v", err, tt.wantErr) 697 return 698 } 699 if !reflect.DeepEqual(got, tt.want) { 700 t.Errorf("unpackTx() got = %v, want %v", got, tt.want) 701 } 702 if got1 != tt.want1 { 703 t.Errorf("unpackTx() got1 = %v, want %v", got1, tt.want1) 704 } 705 }) 706 } 707 } 708 709 type testBlock struct { 710 size int 711 time int64 712 txs []string 713 } 714 715 var testParseBlockTxs = map[int]testBlock{ 716 // block without auxpow 717 12345: { 718 size: 8582, 719 time: 1387104223, 720 txs: []string{ 721 "9d1662dcc1443af9999c4fd1d6921b91027b5e2d0d3ebfaa41d84163cb99cad5", 722 "8284292cedeb0c9c509f9baa235802d52a546e1e9990040d35d018b97ad11cfa", 723 "3299d93aae5c3d37c795c07150ceaf008aefa5aad3205ea2519f94a35adbbe10", 724 "3f03016f32b63db48fdc0b17443c2d917ba5e307dcc2fc803feeb21c7219ee1b", 725 "a889449e9bc618c131c01f564cd309d2217ba1c5731480314795e44f1e02609b", 726 "29f79d91c10bc311ff5b69fe7ba57101969f68b6391cf0ca67d5f37ca1f0601b", 727 "b794ebc7c0176c35b125cd8b84a980257cf3dd9cefe2ed47da4ed1d73ee568f3", 728 "0ec479ba3c954dd422d75c4c5488a6edc3c588deb10ebdbfa8bd8edb7afcfea0", 729 "f357b6e667dfa456e7988bfa474377df25d0e0bfe07e5f97fc97ea3a0155f031", 730 "4ff189766f0455721a93d6be27a91eafa750383c800cb053fad2f86c434122d2", 731 "446d164e2ec4c9f2ac6c499c110735606d949a3625fb849274ac627c033eddbc", 732 "c489edebd8a2e17fd08f2801f528b95663aaafe15c897d56686423dd430e2d1f", 733 "3f42a7f1a356897da324d41eed94169c79438212bb9874eea58e9cbaf07481df", 734 "62c88fdd0fb111676844fcbaebc9e2211a0c990aa7e7529539cb25947a307a1b", 735 "522c47e315bc1949826339c535d419eb206aec4a332f91dfbd25c206f3c9527b", 736 "18ea78346e7e34cbdf2d2b6ba1630f8b15f9ef9a940114a3e6ee92d26f96691e", 737 "43dc0fbd1b9b87bcfc9a51c89457a7b3274855c01d429193aff1181791225f3c", 738 "d78cdfaadbe5b6b591529cb5c6869866a4cabe46ef82aa835fd2432056b4a383", 739 "d181759c7a3900ccaf4958f1f25a44949163ceefc306006502efc7a1de6f579e", 740 "8610b9230188854c7871258163cd1c2db353443d631c5512bff17224a24e95bf", 741 "e82f40a6bea32122f1d568d427c92708dcb684bdb3035ff3905617230e5ae5b8", 742 "c50ae6c127f8c346c60e7438fbd10c44c3629f3fe426646db77a2250fb2939f9", 743 "585202c03894ecaf25188ba4e5447dadd413f2010c2dc2a65c37598dbc6ad907", 744 "8bd766fde8c65e2f724dad581944dde4e23e4dbb4f7f7faf55bc348923f4d5ee", 745 "2d2fa25691088181569e508dd8f683b21f2b80ceefb5ccbd6714ebe2a697139f", 746 "5954622ffc602bec177d61da6c26a68990c42c1886627b218c3ab0e9e3491f4a", 747 "01b634bc53334df1cd9f04522729a34d811c418c2535144c3ed156cbc319e43e", 748 "c429a6c8265482b2d824af03afe1c090b233a856f243791485cb4269f2729649", 749 "dbe79231b916b6fb47a91ef874f35150270eb571af60c2d640ded92b41749940", 750 "1c396493a8dfd59557052b6e8643123405894b64f48b2eb6eb7a003159034077", 751 "2e2816ffb7bf1378f11acf5ba30d498efc8fd219d4b67a725e8254ce61b1b7ee", 752 }, 753 }, 754 // 1st block with auxpow 755 371337: { 756 size: 1704, 757 time: 1410464577, 758 txs: []string{ 759 "4547b14bc16db4184fa9f141d645627430dd3dfa662d0e6f418fba497091da75", 760 "a965dba2ed06827ed9a24f0568ec05b73c431bc7f0fb6913b144e62db7faa519", 761 "5e3ab18cb7ba3abc44e62fb3a43d4c8168d00cf0a2e0f8dbeb2636bb9a212d12", 762 "f022935ac7c4c734bd2c9c6a780f8e7280352de8bd358d760d0645b7fe734a93", 763 "ec063cc8025f9f30a6ed40fc8b1fe63b0cbd2ea2c62664eb26b365e6243828ca", 764 "02c16e3389320da3e77686d39773dda65a1ecdf98a2ef9cfb938c9f4b58f7a40", 765 }, 766 }, 767 // block with auxpow 768 567890: { 769 size: 3833, 770 time: 1422855443, 771 txs: []string{ 772 "db20feea53be1f60848a66604d5bca63df62de4f6c66220f9c84436d788625a8", 773 "cf7e9e27c0f56f0b100eaf5c776ce106025e3412bd5927c6e1ce575500e24eaa", 774 "af84e010c1cf0bd927740d08e5e8163db45397b70f00df07aea5339c14d5f3aa", 775 "7362e25e8131255d101e5d874e6b6bb2faa7a821356cb041f1843d0901dffdbd", 776 "3b875344302e8893f6d5c9e7269d806ed27217ec67944940ae9048fc619bdae9", 777 "e3b95e269b7c251d87e8e241ea2a08a66ec14d12a1012762be368b3db55471e3", 778 "6ba3f95a37bcab5d0cb5b8bd2fe48040db0a6ae390f320d6dcc8162cc096ff8f", 779 "3211ccc66d05b10959fa6e56d1955c12368ea52b40303558b254d7dc22570382", 780 "54c1b279e78b924dfa15857c80131c3ddf835ab02f513dc03aa514f87b680493", 781 }, 782 }, 783 // recent block 784 2264125: { 785 size: 8531, 786 time: 1529099968, 787 txs: []string{ 788 "76f0126562c99e020b5fba41b68dd8141a4f21eef62012b76a1e0635092045e9", 789 "7bb6688bec16de94014574e3e1d3f6f5fb956530d6b179b28db367f1fd8ae099", 790 "d7e2ee30c3d179ac896651fc09c1396333f41d952d008af8d5d6665cbea377bf", 791 "8e4783878df782003c43d014fcbb9c57d2034dfd1d9fcd7319bb1a9f501dbbb7", 792 "8d2a4ae226b6f23eea545957be5d71c68cd08674d96a3502d4ca21ffadacb5a9", 793 "a0da2b49de881133655c54b1b5c23af443a71c2b937e2d9bbdf3f498247e6b7b", 794 "c780a19b9cf46ed70b53c5d5722e8d33951211a4051cb165b25fb0c22a4ae1ff", 795 "ce29c2644d642bb4fedd09d0840ed98c9945bf292967fede8fcc6b26054b4058", 796 "a360b0566f68c329e2757918f67ee6421d3d76f70f1b452cdd32266805986119", 797 "17e85bd33cc5fb5035e489c5188979f45e75e92d14221eca937e14f5f7d7b074", 798 "3973eb930fd2d0726abbd81912eae645384268cd3500b9ec84d806fdd65a426a", 799 "b91cc1c98e5c77e80eec9bf93e86af27f810b00dfbce3ee2646758797a28d5f2", 800 "1a8c7bd3389dcbbc1133ee600898ed9e082f7a9c75f9eb52f33940ed7c2247ef", 801 "9b1782449bbd3fc3014c363167777f7bdf41f5ef6db192fbda784b29603911b0", 802 "afab4bcdc1a32891d638579c3029ae49ee72be3303425c6d62e1f8eaebe0ce18", 803 "5f839f9cd5293c02ff4f7cf5589c53dec52adb42a077599dc7a2c5842a156ca9", 804 "756d2dfd1d2872ba2531fae3b8984008506871bec41d19cb299f5e0f216cfb9b", 805 "6aa82514ab7a9cc624fabf3d06ccbd46ecb4009b3c784768e6243d7840d4bf93", 806 "d1430b3f7ecf147534796c39ba631ea22ac03530e25b9428367c0dc381b10863", 807 "2aeb69b1eb9eef8039da6b97d7851e46f57325851e6998ef5a84fc9a826c2c74", 808 "fc61d13eef806af8da693cfa621fe92110694f1514567b186a35c54e7ef4a188", 809 "a02dd44e60ba62fa00c83a67116f8079bf71062939b207bee0808cb98b30cf22", 810 "279f97cfc606fe62777b44614ff28675ce661687904e068e3ec79f619c4fdae7", 811 "d515d271849717b091a9c46bf11c47efb9d975e72b668c137786a208cf0a9739", 812 "a800da44e6eed944043561fe22ee0a6e11341e6bc1a8ec2789b83930cc9b170e", 813 }, 814 }, 815 } 816 817 func helperLoadBlock(t *testing.T, height int) []byte { 818 name := fmt.Sprintf("block_dump.%d", height) 819 path := filepath.Join("testdata", name) 820 821 d, err := ioutil.ReadFile(path) 822 if err != nil { 823 t.Fatal(err) 824 } 825 826 d = bytes.TrimSpace(d) 827 828 b := make([]byte, hex.DecodedLen(len(d))) 829 _, err = hex.Decode(b, d) 830 if err != nil { 831 t.Fatal(err) 832 } 833 834 return b 835 } 836 837 func TestParseBlock(t *testing.T) { 838 p := NewDogecoinParser(GetChainParams("main"), &btc.Configuration{}) 839 840 for height, tb := range testParseBlockTxs { 841 b := helperLoadBlock(t, height) 842 843 blk, err := p.ParseBlock(b) 844 if err != nil { 845 t.Fatal(err) 846 } 847 848 if blk.Size != tb.size { 849 t.Errorf("ParseBlock() block size: got %d, want %d", blk.Size, tb.size) 850 } 851 852 if blk.Time != tb.time { 853 t.Errorf("ParseBlock() block time: got %d, want %d", blk.Time, tb.time) 854 } 855 856 if len(blk.Txs) != len(tb.txs) { 857 t.Errorf("ParseBlock() number of transactions: got %d, want %d", len(blk.Txs), len(tb.txs)) 858 } 859 860 for ti, tx := range tb.txs { 861 if blk.Txs[ti].Txid != tx { 862 t.Errorf("ParseBlock() transaction %d: got %s, want %s", ti, blk.Txs[ti].Txid, tx) 863 } 864 } 865 } 866 } 867 868 var testParseBlockTxs_Testnet = map[int]testBlock{ 869 // block without auxpow 870 99999: { 871 size: 789, 872 time: 1401525639, 873 txs: []string{ 874 "a4006895a14f5eb8796c784e6845d6aaea57b87325ccd066e900dc53aa8bf6a4", 875 "63c8d9dff87bf56804748e33c6c69f66d4930c4403b01cfd9a9d520fb91e4e17", 876 "3fa993ca67bcd2b2dec15c61b7fc2947e268ebe71bcf77dc00236c99c15eaa72", 877 }, 878 }, 879 // 1st block with auxpow – see https://github.com/dogecoin/dogecoin/releases/tag/v1.8.0-beta-1 880 158100: { 881 size: 227, 882 time: 1407217902, 883 txs: []string{ 884 "f09d8c02cd8a3da1af2a9722860fc58c593ffb3b6c51ffe09f978c89744561a7", 885 }, 886 }, 887 // random block with auxpow 888 1234580: { 889 size: 850, 890 time: 1521801579, 891 txs: []string{ 892 "b16bd42a4718fa8db2f88fd7f5d268582af1b9cfd378600ba4e615708d7550cf", 893 "2786caddf5c090be0554fe39511299b5daf5644024e80643c70c6573465252f1", 894 "423f4c0efa75a521a29c21100b90d4f6bdbafeb0778657154cedb638b9c3b439", 895 }, 896 }, 897 // recent block 898 3274642: { 899 size: 847, 900 time: 1627931191, 901 txs: []string{ 902 "aefc849cd9522e6d93a0ef4c2647dec96386756f02238bb05507407a589fb9a9", 903 "877a2b2bf1f5b52e4893866aff3d573c49e22666662a510b0ff313bdf10e76b3", 904 "8c9130974b68a81c652f3b43c6d352b892d920fe498d1f2fb566c1155169f443", 905 "7fee19b12f19f426bc3e90b36d0149917695bcc4c57a07f0efebbdd30820a079", 906 }, 907 }, 908 } 909 910 func helperLoadBlock_Testnet(t *testing.T, height int) []byte { 911 name := fmt.Sprintf("block_dump_testnet.%d", height) 912 path := filepath.Join("testdata", name) 913 914 d, err := ioutil.ReadFile(path) 915 if err != nil { 916 t.Fatal(err) 917 } 918 919 d = bytes.TrimSpace(d) 920 921 b := make([]byte, hex.DecodedLen(len(d))) 922 _, err = hex.Decode(b, d) 923 if err != nil { 924 t.Fatal(err) 925 } 926 927 return b 928 } 929 930 func TestParseBlock_Testnet(t *testing.T) { 931 p := NewDogecoinParser(GetChainParams("test"), &btc.Configuration{}) 932 933 for height, tb := range testParseBlockTxs_Testnet { 934 b := helperLoadBlock_Testnet(t, height) 935 936 blk, err := p.ParseBlock(b) 937 if err != nil { 938 t.Fatal(err) 939 } 940 941 if blk.Size != tb.size { 942 t.Errorf("ParseBlock() block size: got %d, want %d", blk.Size, tb.size) 943 } 944 945 if blk.Time != tb.time { 946 t.Errorf("ParseBlock() block time: got %d, want %d", blk.Time, tb.time) 947 } 948 949 if len(blk.Txs) != len(tb.txs) { 950 t.Errorf("ParseBlock() number of transactions: got %d, want %d", len(blk.Txs), len(tb.txs)) 951 } 952 953 for ti, tx := range tb.txs { 954 if blk.Txs[ti].Txid != tx { 955 t.Errorf("ParseBlock() transaction %d: got %s, want %s", ti, blk.Txs[ti].Txid, tx) 956 } 957 } 958 } 959 }