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

     1  package xcb
     2  
     3  import (
     4  	"math/big"
     5  	"reflect"
     6  	"testing"
     7  
     8  	"github.com/core-coin/go-core/v2/common"
     9  	"github.com/cryptohub-digital/blockbook-fork/bchain"
    10  	"github.com/cryptohub-digital/blockbook-fork/tests/dbtestdata"
    11  )
    12  
    13  func TestCrc20_getTokenTransfersFromLog(t *testing.T) {
    14  	tests := []struct {
    15  		name    string
    16  		args    []*RpcLog
    17  		want    bchain.TokenTransfers
    18  		wantErr bool
    19  	}{
    20  		{
    21  			name: "1",
    22  			args: []*RpcLog{
    23  				{
    24  					Address: "ab98e5e2ba00469ce51440c22d4d4b79a56da712297f",
    25  					Topics: []string{
    26  						"0xc17a9d92b89f27cb79cc390f23a1a5d302fefab8c7911075ede952ac2b5607a1",
    27  						"0x00000000000000000000ab44de35413ee2b672d322938e2fcc932d5c0cf8ec88",
    28  						"0x00000000000000000000ab27b691efe91718cb73207207d92dbd175e6b10c756",
    29  					},
    30  					Data: "0x000000000000000000000000000000000000000000000002b5e3af16b1880000",
    31  				},
    32  			},
    33  			want: bchain.TokenTransfers{
    34  				{
    35  					Contract: "ab98e5e2ba00469ce51440c22d4d4b79a56da712297f",
    36  					From:     "ab44de35413ee2b672d322938e2fcc932d5c0cf8ec88",
    37  					To:       "ab27b691efe91718cb73207207d92dbd175e6b10c756",
    38  					Value:    *big.NewInt(0).SetBytes([]byte{0x02, 0xB5, 0xE3, 0xAF, 0x16, 0xB1, 0x88, 0x00, 0x00}),
    39  					Type:     bchain.FungibleToken,
    40  				},
    41  			},
    42  		},
    43  		{
    44  			name: "2",
    45  			args: []*RpcLog{
    46  				{ // Transfer
    47  					Address: "ab788e6c1e3bb2174aa05358a903dd93b2f3d361e2b6",
    48  					Topics: []string{
    49  						"0xc17a9d92b89f27cb79cc390f23a1a5d302fefab8c7911075ede952ac2b5607a1",
    50  						"0x00000000000000000000ab325f035d28ec052ea69198a1089064e9c4244eec3f",
    51  						"0x00000000000000000000ab8497b008b094d916aa63e60e1f4e626c7334c4eb62",
    52  					},
    53  					Data: "0x000000000000000000000000000000000000000000000000000051c821a88000",
    54  				},
    55  				{ // Transfer
    56  					Address: "ab788e6c1e3bb2174aa05358a903dd93b2f3d361e2b6",
    57  					Topics: []string{
    58  						"0xc17a9d92b89f27cb79cc390f23a1a5d302fefab8c7911075ede952ac2b5607a1",
    59  						"0x00000000000000000000ab06fc08a2b40a25883f2e91bca36db89a3dd79989ba",
    60  						"0x00000000000000000000ab8497b008b094d916aa63e60e1f4e626c7334c4eb62",
    61  					},
    62  					Data: "0x0000000000000000000000000000000000000000000000000000a39043510000",
    63  				},
    64  				{ // not Transfer
    65  					Address: "ab8497b008b094d916aa63e60e1f4e626c7334c4eb62",
    66  					Topics: []string{
    67  						"0xd5e9cd7af10b71d0052610468eba244b812851c4e582629a8e52faa2484c56aa",
    68  						"0x0000000000000000000000000000000000000000000000000000000000000021",
    69  						"0x00000000000000000000ab325f035d28ec052ea69198a1089064e9c4244eec3f",
    70  						"0x00000000000000000000ab06fc08a2b40a25883f2e91bca36db89a3dd79989ba",
    71  					},
    72  					Data: "0x000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000024e1cc78e2b605b726e9da5c9d497c38f95567defbd1953c034596206560189adafe80b37d53a8b6b516635fa5588638169f062a55db158e70bc226f5f3fd5dff0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000028e410d44000000000000000000000000000000000000000000000000000000028e410d44000",
    73  				},
    74  				{ // not Transfer
    75  					Address: "ab788e6c1e3bb2174aa05358a903dd93b2f3d361e2b6",
    76  					Topics: []string{
    77  						"0xafa504e0962ad93dec232a2c88581b4028671c11f4571f9edec54fb75bd7293d",
    78  						"0x00000000000000000000ab06fc08a2b40a25883f2e91bca36db89a3dd79989ba",
    79  						"0x00000000000000000000ab8497b008b094d916aa63e60e1f4e626c7334c4eb62",
    80  					},
    81  					Data: "0x0000000000000000000000000000000000000000000000000000000000000000",
    82  				},
    83  			},
    84  			want: bchain.TokenTransfers{
    85  				{
    86  					Contract: "ab788e6c1e3bb2174aa05358a903dd93b2f3d361e2b6",
    87  					From:     "ab325f035d28ec052ea69198a1089064e9c4244eec3f",
    88  					To:       "ab8497b008b094d916aa63e60e1f4e626c7334c4eb62",
    89  					Value:    *big.NewInt(0).SetBytes([]byte{0x51, 0xc8, 0x21, 0xa8, 0x80, 0x00}),
    90  					Type:     bchain.FungibleToken,
    91  				},
    92  				{
    93  					Contract: "ab788e6c1e3bb2174aa05358a903dd93b2f3d361e2b6",
    94  					From:     "ab06fc08a2b40a25883f2e91bca36db89a3dd79989ba",
    95  					To:       "ab8497b008b094d916aa63e60e1f4e626c7334c4eb62",
    96  					Value:    *big.NewInt(0).SetBytes([]byte{0xa3, 0x90, 0x43, 0x51, 0x00, 0x00}),
    97  					Type:     bchain.FungibleToken,
    98  				},
    99  			},
   100  		},
   101  		{
   102  			name: "2",
   103  			args: []*RpcLog{
   104  				{ // Transfer
   105  					Address: "ab98e5e2ba00469ce51440c22d4d4b79a56da712297f",
   106  					Topics: []string{
   107  						"0xc17a9d92b89f27cb79cc390f23a1a5d302fefab8c7911075ede952ac2b5607a1",
   108  						"0x00000000000000000000ab228a4d4263e067df56b1dd226acb939f532ff7ab5b",
   109  						"0x00000000000000000000ab094a15c3dc43095c7450c59bf56263e9827065f306",
   110  					},
   111  					Data: "0x0000000000000000000000000000000000000000000000000de0b6b3a7640000",
   112  				},
   113  			},
   114  			want: bchain.TokenTransfers{
   115  				{
   116  					Contract: "ab98e5e2ba00469ce51440c22d4d4b79a56da712297f",
   117  					From:     "ab228a4d4263e067df56b1dd226acb939f532ff7ab5b",
   118  					To:       "ab094a15c3dc43095c7450c59bf56263e9827065f306",
   119  					Value:    *big.NewInt(0).SetBytes([]byte{0x0D, 0xE0, 0xB6, 0xB3, 0xA7, 0x64, 0x00, 0x00}),
   120  					Type:     bchain.FungibleToken,
   121  				},
   122  			},
   123  		},
   124  	}
   125  	common.DefaultNetworkID = common.NetworkID(3)
   126  	for _, tt := range tests {
   127  		t.Run(tt.name, func(t *testing.T) {
   128  			got, err := getTokenTransfersFromLog(tt.args)
   129  			if (err != nil) != tt.wantErr {
   130  				t.Errorf("getTokenTransfersFromLog error = %v, wantErr %v", err, tt.wantErr)
   131  				return
   132  			}
   133  
   134  			// the addresses could have different case
   135  			if !reflect.DeepEqual(got, tt.want) {
   136  				t.Errorf("getTokenTransfersFromLog = %+v, want %+v", got, tt.want)
   137  			}
   138  		})
   139  	}
   140  }
   141  
   142  func TestCrc20_parseCRC20StringProperty(t *testing.T) {
   143  	tests := []struct {
   144  		name string
   145  		args string
   146  		want string
   147  	}{
   148  		{
   149  			name: "1",
   150  			args: "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000758504c4f44444500000000000000000000000000000000000000000000000000",
   151  			want: "XPLODDE",
   152  		},
   153  		{
   154  			name: "2",
   155  			args: "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000022426974436c617665202d20436f6e73756d657220416374697669747920546f6b656e00000000000000",
   156  			want: "BitClave - Consumer Activity Token",
   157  		},
   158  		{
   159  			name: "short",
   160  			args: "0x44616920537461626c65636f696e2076312e3000000000000000000000000000",
   161  			want: "Dai Stablecoin v1.0",
   162  		},
   163  		{
   164  			name: "short2",
   165  			args: "0x44616920537461626c65636f696e2076312e3020444444444444444444444444",
   166  			want: "Dai Stablecoin v1.0 DDDDDDDDDDDD",
   167  		},
   168  		{
   169  			name: "long",
   170  			args: "0x556e6973776170205631000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
   171  			want: "Uniswap V1",
   172  		},
   173  		{
   174  			name: "garbage",
   175  			args: "0x2234880850896048596206002535425366538144616734015984380565810000",
   176  			want: "",
   177  		},
   178  	}
   179  	for _, tt := range tests {
   180  		t.Run(tt.name, func(t *testing.T) {
   181  			got := parseCRC20StringProperty(nil, tt.args)
   182  			// the addresses could have different case
   183  			if got != tt.want {
   184  				t.Errorf("parseCRC20StringProperty = %v, want %v", got, tt.want)
   185  			}
   186  		})
   187  	}
   188  }
   189  
   190  func TestCrc20_getTokenTransfersFromTx(t *testing.T) {
   191  	common.DefaultNetworkID = common.NetworkID(3)
   192  	p := NewCoreCoinParser(1)
   193  	b := dbtestdata.GetTestCoreCoinTypeBlock1(p)
   194  	bn, _ := new(big.Int).SetString("1000000000000000000", 10)
   195  	tests := []struct {
   196  		name string
   197  		args *RpcTransaction
   198  		want bchain.TokenTransfers
   199  	}{
   200  		{
   201  			name: "0",
   202  			args: (b.Txs[0].CoinSpecificData.(CoreCoinSpecificData)).Tx,
   203  			want: bchain.TokenTransfers{},
   204  		},
   205  		{
   206  			name: "1",
   207  			args: (b.Txs[1].CoinSpecificData.(CoreCoinSpecificData)).Tx,
   208  			want: bchain.TokenTransfers{
   209  				{
   210  					Contract: "ab98e5e2ba00469ce51440c22d4d4b79a56da712297f",
   211  					From:     "ab228a4d4263e067df56b1dd226acb939f532ff7ab5b",
   212  					To:       "ab094a15c3dc43095c7450c59bf56263e9827065f306",
   213  					Value:    *bn,
   214  					Type:     bchain.FungibleToken,
   215  				},
   216  			},
   217  		},
   218  	}
   219  	for _, tt := range tests {
   220  		t.Run(tt.name, func(t *testing.T) {
   221  			got, err := getTokenTransfersFromTx(tt.args)
   222  			if err != nil {
   223  				t.Errorf("getTokenTransfersFromTx error = %v", err)
   224  				return
   225  			}
   226  			// the addresses could have different case
   227  			if len(got) > 0 && len(tt.want) > 0 && !reflect.DeepEqual(got, tt.want) {
   228  				t.Errorf("getTokenTransfersFromTx = %+v, want %+v", got, tt.want)
   229  			}
   230  		})
   231  	}
   232  }