github.com/bchainhub/blockbook@v0.3.2/bchain/coins/eth/erc20_test.go (about)

     1  // +build unittest
     2  
     3  package eth
     4  
     5  import (
     6  	"blockbook/bchain"
     7  	"blockbook/tests/dbtestdata"
     8  	fmt "fmt"
     9  	"math/big"
    10  	"strings"
    11  	"testing"
    12  )
    13  
    14  func TestErc20_erc20GetTransfersFromLog(t *testing.T) {
    15  	tests := []struct {
    16  		name    string
    17  		args    []*rpcLog
    18  		want    []bchain.Erc20Transfer
    19  		wantErr bool
    20  	}{
    21  		{
    22  			name: "1",
    23  			args: []*rpcLog{
    24  				{
    25  					Address: "0x76a45e8976499ab9ae223cc584019341d5a84e96",
    26  					Topics: []string{
    27  						"0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef",
    28  						"0x0000000000000000000000002aacf811ac1a60081ea39f7783c0d26c500871a8",
    29  						"0x000000000000000000000000e9a5216ff992cfa01594d43501a56e12769eb9d2",
    30  					},
    31  					Data: "0x0000000000000000000000000000000000000000000000000000000000000123",
    32  				},
    33  			},
    34  			want: []bchain.Erc20Transfer{
    35  				{
    36  					Contract: "0x76a45e8976499ab9ae223cc584019341d5a84e96",
    37  					From:     "0x2aacf811ac1a60081ea39f7783c0d26c500871a8",
    38  					To:       "0xe9a5216ff992cfa01594d43501a56e12769eb9d2",
    39  					Tokens:   *big.NewInt(0x123),
    40  				},
    41  			},
    42  		},
    43  		{
    44  			name: "2",
    45  			args: []*rpcLog{
    46  				{ // Transfer
    47  					Address: "0x0d0f936ee4c93e25944694d6c121de94d9760f11",
    48  					Topics: []string{
    49  						"0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef",
    50  						"0x0000000000000000000000006f44cceb49b4a5812d54b6f494fc2febf25511ed",
    51  						"0x0000000000000000000000004bda106325c335df99eab7fe363cac8a0ba2a24d",
    52  					},
    53  					Data: "0x0000000000000000000000000000000000000000000000006a8313d60b1f606b",
    54  				},
    55  				{ // Transfer
    56  					Address: "0xc778417e063141139fce010982780140aa0cd5ab",
    57  					Topics: []string{
    58  						"0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef",
    59  						"0x0000000000000000000000004bda106325c335df99eab7fe363cac8a0ba2a24d",
    60  						"0x0000000000000000000000006f44cceb49b4a5812d54b6f494fc2febf25511ed",
    61  					},
    62  					Data: "0x000000000000000000000000000000000000000000000000000308fd0e798ac0",
    63  				},
    64  				{ // not Transfer
    65  					Address: "0x479cc461fecd078f766ecc58533d6f69580cf3ac",
    66  					Topics: []string{
    67  						"0x0d0b9391970d9a25552f37d436d2aae2925e2bfe1b2a923754bada030c498cb3",
    68  						"0x0000000000000000000000006f44cceb49b4a5812d54b6f494fc2febf25511ed",
    69  						"0x0000000000000000000000000000000000000000000000000000000000000000",
    70  						"0x5af266c0a89a07c1917deaa024414577e6c3c31c8907d079e13eb448c082594f",
    71  					},
    72  					Data: "0x0000000000000000000000004bda106325c335df99eab7fe363cac8a0ba2a24d0000000000000",
    73  				},
    74  				{ // not Transfer
    75  					Address: "0x0d0f936ee4c93e25944694d6c121de94d9760f11",
    76  					Topics: []string{
    77  						"0x0d0b9391970d9a25552f37d436d2aae2925e2bfe1b2a923754bada030c498cb3",
    78  						"0x0000000000000000000000007b62eb7fe80350dc7ec945c0b73242cb9877fb1b",
    79  						"0xb0b69dad58df6032c3b266e19b1045b19c87acd2c06fb0c598090f44b8e263aa",
    80  					},
    81  					Data: "0x0000000000000000000000004bda106325c335df99eab7fe363cac8a0ba2a24d000000000000000000000000c778417e063141139fce010982780140aa0cd5ab0000000000000000000000000d0f936ee4c93e25944694d6c121de94d9760f1100000000000000000000000000000000000000000000000000031855667df7a80000000000000000000000000000000000000000000000006a8313d60b1f800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
    82  				},
    83  			},
    84  			want: []bchain.Erc20Transfer{
    85  				{
    86  					Contract: "0x0d0f936ee4c93e25944694d6c121de94d9760f11",
    87  					From:     "0x6f44cceb49b4a5812d54b6f494fc2febf25511ed",
    88  					To:       "0x4bda106325c335df99eab7fe363cac8a0ba2a24d",
    89  					Tokens:   *big.NewInt(0x6a8313d60b1f606b),
    90  				},
    91  				{
    92  					Contract: "0xc778417e063141139fce010982780140aa0cd5ab",
    93  					From:     "0x4bda106325c335df99eab7fe363cac8a0ba2a24d",
    94  					To:       "0x6f44cceb49b4a5812d54b6f494fc2febf25511ed",
    95  					Tokens:   *big.NewInt(0x308fd0e798ac0),
    96  				},
    97  			},
    98  		},
    99  	}
   100  	for _, tt := range tests {
   101  		t.Run(tt.name, func(t *testing.T) {
   102  			got, err := erc20GetTransfersFromLog(tt.args)
   103  			if (err != nil) != tt.wantErr {
   104  				t.Errorf("erc20GetTransfersFromLog error = %v, wantErr %v", err, tt.wantErr)
   105  				return
   106  			}
   107  			// the addresses could have different case
   108  			if strings.ToLower(fmt.Sprint(got)) != strings.ToLower(fmt.Sprint(tt.want)) {
   109  				t.Errorf("erc20GetTransfersFromLog = %+v, want %+v", got, tt.want)
   110  			}
   111  		})
   112  	}
   113  }
   114  
   115  func TestErc20_parseErc20StringProperty(t *testing.T) {
   116  	tests := []struct {
   117  		name string
   118  		args string
   119  		want string
   120  	}{
   121  		{
   122  			name: "1",
   123  			args: "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000758504c4f44444500000000000000000000000000000000000000000000000000",
   124  			want: "XPLODDE",
   125  		},
   126  		{
   127  			name: "2",
   128  			args: "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000022426974436c617665202d20436f6e73756d657220416374697669747920546f6b656e00000000000000",
   129  			want: "BitClave - Consumer Activity Token",
   130  		},
   131  		{
   132  			name: "short",
   133  			args: "0x44616920537461626c65636f696e2076312e3000000000000000000000000000",
   134  			want: "Dai Stablecoin v1.0",
   135  		},
   136  		{
   137  			name: "short2",
   138  			args: "0x44616920537461626c65636f696e2076312e3020444444444444444444444444",
   139  			want: "Dai Stablecoin v1.0 DDDDDDDDDDDD",
   140  		},
   141  	}
   142  	for _, tt := range tests {
   143  		t.Run(tt.name, func(t *testing.T) {
   144  			got := parseErc20StringProperty(nil, tt.args)
   145  			// the addresses could have different case
   146  			if got != tt.want {
   147  				t.Errorf("parseErc20StringProperty = %v, want %v", got, tt.want)
   148  			}
   149  		})
   150  	}
   151  }
   152  
   153  func TestErc20_erc20GetTransfersFromTx(t *testing.T) {
   154  	p := NewEthereumParser(1)
   155  	b := dbtestdata.GetTestEthereumTypeBlock1(p)
   156  	bn, _ := new(big.Int).SetString("21e19e0c9bab2400000", 16)
   157  	tests := []struct {
   158  		name string
   159  		args *rpcTransaction
   160  		want []bchain.Erc20Transfer
   161  	}{
   162  		{
   163  			name: "0",
   164  			args: (b.Txs[0].CoinSpecificData.(completeTransaction)).Tx,
   165  			want: []bchain.Erc20Transfer{},
   166  		},
   167  		{
   168  			name: "1",
   169  			args: (b.Txs[1].CoinSpecificData.(completeTransaction)).Tx,
   170  			want: []bchain.Erc20Transfer{
   171  				{
   172  					Contract: "0x4af4114f73d1c1c903ac9e0361b379d1291808a2",
   173  					From:     "0x20cd153de35d469ba46127a0c8f18626b59a256a",
   174  					To:       "0x555ee11fbddc0e49a9bab358a8941ad95ffdb48f",
   175  					Tokens:   *bn,
   176  				},
   177  			},
   178  		},
   179  	}
   180  	for _, tt := range tests {
   181  		t.Run(tt.name, func(t *testing.T) {
   182  			got, err := erc20GetTransfersFromTx(tt.args)
   183  			if err != nil {
   184  				t.Errorf("erc20GetTransfersFromTx error = %v", err)
   185  				return
   186  			}
   187  			// the addresses could have different case
   188  			if strings.ToLower(fmt.Sprint(got)) != strings.ToLower(fmt.Sprint(tt.want)) {
   189  				t.Errorf("erc20GetTransfersFromTx = %+v, want %+v", got, tt.want)
   190  			}
   191  		})
   192  	}
   193  }