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  }