github.com/cryptohub-digital/blockbook-fork@v0.0.0-20230713133354-673c927af7f1/bchain/coins/xcb/xcbparser_test.go (about)

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