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  }