github.com/trezor/blockbook@v0.4.1-0.20240328132726-e9a08582ee2c/bchain/coins/bitzeny/bitzenyparser_test.go (about)

     1  //go:build unittest
     2  
     3  package bitzeny
     4  
     5  import (
     6  	"encoding/hex"
     7  	"math/big"
     8  	"os"
     9  	"reflect"
    10  	"testing"
    11  
    12  	"github.com/trezor/blockbook/bchain"
    13  	"github.com/trezor/blockbook/bchain/coins/btc"
    14  
    15  	"github.com/martinboehm/btcutil/chaincfg"
    16  )
    17  
    18  func TestMain(m *testing.M) {
    19  	c := m.Run()
    20  	chaincfg.ResetParams()
    21  	os.Exit(c)
    22  }
    23  
    24  func Test_GetAddrDescFromAddress_Mainnet(t *testing.T) {
    25  	type args struct {
    26  		address string
    27  	}
    28  	tests := []struct {
    29  		name    string
    30  		args    args
    31  		want    string
    32  		wantErr bool
    33  	}{
    34  		{
    35  			name:    "P2PKH1",
    36  			args:    args{address: "Zw74N1RSU2xV3a7SBERBiCP11fMwX5yvMu"},
    37  			want:    "76a914d8658ca5c406149071687d370d1d22d972d2f88488ac",
    38  			wantErr: false,
    39  		},
    40  		{
    41  			name:    "P2PKH2",
    42  			args:    args{address: "ZiSn1vTSxGu2kFcnkjjm7bYGhT5BVAVfEG"},
    43  			want:    "76a9144d869697281ad18370313122795e56dfdc3a331388ac",
    44  			wantErr: false,
    45  		},
    46  		{
    47  			name:    "P2SH1",
    48  			args:    args{address: "3CZ3357bm1K81StpEDQtEH3ho3ULx19nc8"},
    49  			want:    "a9147726fc1144eae1b7bd301d87d0a7f846cadb591887",
    50  			wantErr: false,
    51  		},
    52  		{
    53  			name:    "P2SH2",
    54  			args:    args{address: "3M1AjZEuBzScbd9pchiGJSVT4yNfwzSmXP"},
    55  			want:    "a914d3d93b5d7f57b94a4fecde93d4489f2b423fd3c287",
    56  			wantErr: false,
    57  		},
    58  		{
    59  			name:    "witness_v0_keyhash",
    60  			args:    args{address: "bz1q7rfrdacyyfwx8gppd8ah9hka8npgqsm44prfnd"},
    61  			want:    "0014f0d236f704225c63a02169fb72dedd3cc2804375",
    62  			wantErr: false,
    63  		},
    64  		{
    65  			name:    "witness_v0_scripthashx",
    66  			args:    args{address: "bz1qd2mspe6m2wpztw4q2mccyvyess6569eu59sfvf0u0vdmdwltr5lse8d7sw"},
    67  			want:    "00206ab700e75b538225baa056f182309984354d173ca1609625fc7b1bb6bbeb1d3f",
    68  			wantErr: false,
    69  		},
    70  	}
    71  	parser := NewBitZenyParser(GetChainParams("main"), &btc.Configuration{})
    72  
    73  	for _, tt := range tests {
    74  		t.Run(tt.name, func(t *testing.T) {
    75  			got, err := parser.GetAddrDescFromAddress(tt.args.address)
    76  			if (err != nil) != tt.wantErr {
    77  				t.Errorf("GetAddrDescFromAddress() error = %v, wantErr %v", err, tt.wantErr)
    78  				return
    79  			}
    80  			h := hex.EncodeToString(got)
    81  			if !reflect.DeepEqual(h, tt.want) {
    82  				t.Errorf("GetAddrDescFromAddress() = %v, want %v", h, tt.want)
    83  			}
    84  		})
    85  	}
    86  }
    87  
    88  func Test_GetAddressesFromAddrDesc(t *testing.T) {
    89  	type args struct {
    90  		script string
    91  	}
    92  	tests := []struct {
    93  		name    string
    94  		args    args
    95  		want    []string
    96  		want2   bool
    97  		wantErr bool
    98  	}{
    99  		{
   100  			name:    "P2PKH",
   101  			args:    args{script: "76a914d8658ca5c406149071687d370d1d22d972d2f88488ac"},
   102  			want:    []string{"Zw74N1RSU2xV3a7SBERBiCP11fMwX5yvMu"},
   103  			want2:   true,
   104  			wantErr: false,
   105  		},
   106  		{
   107  			name:    "P2SH",
   108  			args:    args{script: "a9147726fc1144eae1b7bd301d87d0a7f846cadb591887"},
   109  			want:    []string{"3CZ3357bm1K81StpEDQtEH3ho3ULx19nc8"},
   110  			want2:   true,
   111  			wantErr: false,
   112  		},
   113  		{
   114  			name:    "P2WPKH",
   115  			args:    args{script: "0014f0d236f704225c63a02169fb72dedd3cc2804375"},
   116  			want:    []string{"bz1q7rfrdacyyfwx8gppd8ah9hka8npgqsm44prfnd"},
   117  			want2:   true,
   118  			wantErr: false,
   119  		},
   120  		{
   121  			name:    "P2WSH",
   122  			args:    args{script: "00206ab700e75b538225baa056f182309984354d173ca1609625fc7b1bb6bbeb1d3f"},
   123  			want:    []string{"bz1qd2mspe6m2wpztw4q2mccyvyess6569eu59sfvf0u0vdmdwltr5lse8d7sw"},
   124  			want2:   true,
   125  			wantErr: false,
   126  		},
   127  		{
   128  			name:    "OP_RETURN ascii",
   129  			args:    args{script: "6a0461686f6a"},
   130  			want:    []string{"OP_RETURN (ahoj)"},
   131  			want2:   false,
   132  			wantErr: false,
   133  		},
   134  		{
   135  			name:    "OP_RETURN hex",
   136  			args:    args{script: "6a072020f1686f6a20"},
   137  			want:    []string{"OP_RETURN 2020f1686f6a20"},
   138  			want2:   false,
   139  			wantErr: false,
   140  		},
   141  	}
   142  
   143  	parser := NewBitZenyParser(GetChainParams("main"), &btc.Configuration{})
   144  
   145  	for _, tt := range tests {
   146  		t.Run(tt.name, func(t *testing.T) {
   147  			b, _ := hex.DecodeString(tt.args.script)
   148  			got, got2, err := parser.GetAddressesFromAddrDesc(b)
   149  			if (err != nil) != tt.wantErr {
   150  				t.Errorf("outputScriptToAddresses() error = %v, wantErr %v", err, tt.wantErr)
   151  				return
   152  			}
   153  			if !reflect.DeepEqual(got, tt.want) {
   154  				t.Errorf("GetAddressesFromAddrDesc() = %v, want %v", got, tt.want)
   155  			}
   156  			if !reflect.DeepEqual(got2, tt.want2) {
   157  				t.Errorf("GetAddressesFromAddrDesc() = %v, want %v", got2, tt.want2)
   158  			}
   159  		})
   160  	}
   161  }
   162  
   163  var (
   164  	testTx1 bchain.Tx
   165  
   166  	testTxPacked1 = "001c3f1a8be6859d3e0100000001aef422fb91cd91e556966fed4121ac44017a761d71385596536bb447ae05213e000000006a47304402202341ac4297925257dc72eb418a069c45e76f7070340e27501f6308cc7eff45f802204a347915adceff5f6fc9b8075d95d47887d46b344c7bbc8066d315931b189ad001210228c2520812b7f8c63e7a088c61b6348b22fa0c98812e736a1fd896bc828d3c65feffffff028041f13d000000001976a91478379ea136bb5783b675cd11e412bf0703995aeb88aca9983141000000001976a9144d869697281ad18370313122795e56dfdc3a331388ac193f1c00"
   167  )
   168  
   169  func init() {
   170  	testTx1 = bchain.Tx{
   171  		Hex:       "0100000001aef422fb91cd91e556966fed4121ac44017a761d71385596536bb447ae05213e000000006a47304402202341ac4297925257dc72eb418a069c45e76f7070340e27501f6308cc7eff45f802204a347915adceff5f6fc9b8075d95d47887d46b344c7bbc8066d315931b189ad001210228c2520812b7f8c63e7a088c61b6348b22fa0c98812e736a1fd896bc828d3c65feffffff028041f13d000000001976a91478379ea136bb5783b675cd11e412bf0703995aeb88aca9983141000000001976a9144d869697281ad18370313122795e56dfdc3a331388ac193f1c00",
   172  		Blocktime: 1583392607,
   173  		Txid:      "f81c34b300961877328c3aaa7cd5e69068457868309fbf1e92544e3a6a915bcb",
   174  		LockTime:  1851161,
   175  		Version:   1,
   176  		Vin: []bchain.Vin{
   177  			{
   178  				ScriptSig: bchain.ScriptSig{
   179  					Hex: "47304402202341ac4297925257dc72eb418a069c45e76f7070340e27501f6308cc7eff45f802204a347915adceff5f6fc9b8075d95d47887d46b344c7bbc8066d315931b189ad001210228c2520812b7f8c63e7a088c61b6348b22fa0c98812e736a1fd896bc828d3c65",
   180  				},
   181  				Txid:     "3e2105ae47b46b53965538711d767a0144ac2141ed6f9656e591cd91fb22f4ae",
   182  				Vout:     0,
   183  				Sequence: 4294967294,
   184  			},
   185  		},
   186  		Vout: []bchain.Vout{
   187  			{
   188  				ValueSat: *big.NewInt(1039221120),
   189  				N:        0,
   190  				ScriptPubKey: bchain.ScriptPubKey{
   191  					Hex: "76a91478379ea136bb5783b675cd11e412bf0703995aeb88ac",
   192  					Addresses: []string{
   193  						"ZnLWULVbAzjy1TSKxGnpkomeeaEDTHk5Nj",
   194  					},
   195  				},
   196  			},
   197  			{
   198  				ValueSat: *big.NewInt(1093769385),
   199  				N:        1,
   200  				ScriptPubKey: bchain.ScriptPubKey{
   201  					Hex: "76a9144d869697281ad18370313122795e56dfdc3a331388ac",
   202  					Addresses: []string{
   203  						"ZiSn1vTSxGu2kFcnkjjm7bYGhT5BVAVfEG",
   204  					},
   205  				},
   206  			},
   207  		},
   208  	}
   209  }
   210  
   211  func Test_PackTx(t *testing.T) {
   212  	type args struct {
   213  		tx        bchain.Tx
   214  		height    uint32
   215  		blockTime int64
   216  		parser    *BitZenyParser
   217  	}
   218  	tests := []struct {
   219  		name    string
   220  		args    args
   221  		want    string
   222  		wantErr bool
   223  	}{
   224  		{
   225  			name: "BitZeny-1",
   226  			args: args{
   227  				tx:        testTx1,
   228  				height:    1851162,
   229  				blockTime: 1583392607,
   230  				parser:    NewBitZenyParser(GetChainParams("main"), &btc.Configuration{}),
   231  			},
   232  			want:    testTxPacked1,
   233  			wantErr: false,
   234  		},
   235  	}
   236  	for _, tt := range tests {
   237  		t.Run(tt.name, func(t *testing.T) {
   238  			got, err := tt.args.parser.PackTx(&tt.args.tx, tt.args.height, tt.args.blockTime)
   239  			if (err != nil) != tt.wantErr {
   240  				t.Errorf("packTx() error = %v, wantErr %v", err, tt.wantErr)
   241  				return
   242  			}
   243  			h := hex.EncodeToString(got)
   244  			if !reflect.DeepEqual(h, tt.want) {
   245  				t.Errorf("packTx() = %v, want %v", h, tt.want)
   246  			}
   247  		})
   248  	}
   249  }
   250  
   251  func Test_UnpackTx(t *testing.T) {
   252  	type args struct {
   253  		packedTx string
   254  		parser   *BitZenyParser
   255  	}
   256  	tests := []struct {
   257  		name    string
   258  		args    args
   259  		want    *bchain.Tx
   260  		want1   uint32
   261  		wantErr bool
   262  	}{
   263  		{
   264  			name: "BitZeny-1",
   265  			args: args{
   266  				packedTx: testTxPacked1,
   267  				parser:   NewBitZenyParser(GetChainParams("main"), &btc.Configuration{}),
   268  			},
   269  			want:    &testTx1,
   270  			want1:   1851162,
   271  			wantErr: false,
   272  		},
   273  	}
   274  	for _, tt := range tests {
   275  		t.Run(tt.name, func(t *testing.T) {
   276  			b, _ := hex.DecodeString(tt.args.packedTx)
   277  			got, got1, err := tt.args.parser.UnpackTx(b)
   278  			if (err != nil) != tt.wantErr {
   279  				t.Errorf("unpackTx() error = %v, wantErr %v", err, tt.wantErr)
   280  				return
   281  			}
   282  			if !reflect.DeepEqual(got, tt.want) {
   283  				t.Errorf("unpackTx() got = %v, want %v", got, tt.want)
   284  			}
   285  			if got1 != tt.want1 {
   286  				t.Errorf("unpackTx() got1 = %v, want %v", got1, tt.want1)
   287  			}
   288  		})
   289  	}
   290  }