github.com/fibonacci-chain/fbc@v0.0.0-20231124064014-c7636198c1e9/x/vmbridge/types/protoclo_test.go (about)

     1  package types
     2  
     3  import (
     4  	"math/big"
     5  	"testing"
     6  
     7  	"github.com/ethereum/go-ethereum/common"
     8  	sdk "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/types"
     9  	"github.com/stretchr/testify/require"
    10  )
    11  
    12  func TestGetEVMABIConfig(t *testing.T) {
    13  	testCase := []struct {
    14  		name      string
    15  		data      []byte
    16  		isErr     bool
    17  		expectErr string
    18  	}{
    19  		{
    20  			name:  "normal abi json",
    21  			data:  abiJson,
    22  			isErr: false,
    23  		},
    24  		{
    25  			name:  "normal abi json have more func",
    26  			data:  []byte("[\n  {\n    \"anonymous\": false,\n    \"inputs\": [\n      {\n        \"indexed\": false,\n        \"internalType\": \"string\",\n        \"name\": \"wasmAddr\",\n        \"type\": \"string\"\n      },\n      {\n        \"indexed\": false,\n        \"internalType\": \"string\",\n        \"name\": \"recipient\",\n        \"type\": \"string\"\n      },\n      {\n        \"indexed\": false,\n        \"internalType\": \"uint256\",\n        \"name\": \"amount\",\n        \"type\": \"uint256\"\n      }\n    ],\n    \"name\": \"__OKCSendToWasm\",\n    \"type\": \"event\"\n  },\n  {\n    \"inputs\": [\n      {\n        \"internalType\": \"string\",\n        \"name\": \"caller\",\n        \"type\": \"string\"\n      },\n      {\n        \"internalType\": \"address\",\n        \"name\": \"recipient\",\n        \"type\": \"address\"\n      },\n      {\n        \"internalType\": \"uint256\",\n        \"name\": \"amount\",\n        \"type\": \"uint256\"\n      }\n    ],\n    \"name\": \"mintERC20\",\n    \"outputs\": [\n      {\n        \"internalType\": \"bool\",\n        \"name\": \"success\",\n        \"type\": \"bool\"\n      }\n    ],\n    \"stateMutability\": \"nonpayable\",\n    \"type\": \"function\"\n  },\n  {\n    \"inputs\": [\n      {\n        \"internalType\": \"string\",\n        \"name\": \"caller\",\n        \"type\": \"string\"\n      },\n      {\n        \"internalType\": \"address\",\n        \"name\": \"recipient\",\n        \"type\": \"address\"\n      },\n      {\n        \"internalType\": \"uint256\",\n        \"name\": \"amount\",\n        \"type\": \"uint256\"\n      }\n    ],\n    \"name\": \"mintERC201\",\n    \"outputs\": [\n      {\n        \"internalType\": \"bool\",\n        \"name\": \"success\",\n        \"type\": \"bool\"\n      }\n    ],\n    \"stateMutability\": \"nonpayable\",\n    \"type\": \"function\"\n  }\n]\n"),
    27  			isErr: false,
    28  		},
    29  		{
    30  			name:  "normal abi json have more event",
    31  			data:  []byte("[\n  {\n    \"anonymous\": false,\n    \"inputs\": [\n      {\n        \"indexed\": false,\n        \"internalType\": \"string\",\n        \"name\": \"wasmAddr\",\n        \"type\": \"string\"\n      },\n      {\n        \"indexed\": false,\n        \"internalType\": \"string\",\n        \"name\": \"recipient\",\n        \"type\": \"string\"\n      },\n      {\n        \"indexed\": false,\n        \"internalType\": \"uint256\",\n        \"name\": \"amount\",\n        \"type\": \"uint256\"\n      }\n    ],\n    \"name\": \"__OKCSendToWasm\",\n    \"type\": \"event\"\n  },\n  {\n    \"inputs\": [\n      {\n        \"internalType\": \"string\",\n        \"name\": \"caller\",\n        \"type\": \"string\"\n      },\n      {\n        \"internalType\": \"address\",\n        \"name\": \"recipient\",\n        \"type\": \"address\"\n      },\n      {\n        \"internalType\": \"uint256\",\n        \"name\": \"amount\",\n        \"type\": \"uint256\"\n      }\n    ],\n    \"name\": \"mintERC20\",\n    \"outputs\": [\n      {\n        \"internalType\": \"bool\",\n        \"name\": \"success\",\n        \"type\": \"bool\"\n      }\n    ],\n    \"stateMutability\": \"nonpayable\",\n    \"type\": \"function\"\n  },\n  {\n    \"anonymous\": false,\n    \"inputs\": [\n      {\n        \"indexed\": false,\n        \"internalType\": \"string\",\n        \"name\": \"wasmAddr\",\n        \"type\": \"string\"\n      },\n      {\n        \"indexed\": false,\n        \"internalType\": \"string\",\n        \"name\": \"recipient\",\n        \"type\": \"string\"\n      },\n      {\n        \"indexed\": false,\n        \"internalType\": \"uint256\",\n        \"name\": \"amount\",\n        \"type\": \"uint256\"\n      }\n    ],\n    \"name\": \"__OKCSendToWasmTest\",\n    \"type\": \"event\"\n  }\n]\n"),
    32  			isErr: false,
    33  		},
    34  		{
    35  			name:      "normal abi json have less event",
    36  			data:      []byte("[\n  {\n    \"inputs\": [\n      {\n        \"internalType\": \"string\",\n        \"name\": \"caller\",\n        \"type\": \"string\"\n      },\n      {\n        \"internalType\": \"address\",\n        \"name\": \"recipient\",\n        \"type\": \"address\"\n      },\n      {\n        \"internalType\": \"uint256\",\n        \"name\": \"amount\",\n        \"type\": \"uint256\"\n      }\n    ],\n    \"name\": \"mintERC20\",\n    \"outputs\": [\n      {\n        \"internalType\": \"bool\",\n        \"name\": \"success\",\n        \"type\": \"bool\"\n      }\n    ],\n    \"stateMutability\": \"nonpayable\",\n    \"type\": \"function\"\n  }\n]\n"),
    37  			isErr:     true,
    38  			expectErr: "abi must have event event",
    39  		},
    40  		{
    41  			name:  "normal abi json have less func",
    42  			data:  []byte("[\n  {\n    \"anonymous\": false,\n    \"inputs\": [\n      {\n        \"indexed\": false,\n        \"internalType\": \"string\",\n        \"name\": \"wasmAddr\",\n        \"type\": \"string\"\n      },\n      {\n        \"indexed\": false,\n        \"internalType\": \"string\",\n        \"name\": \"recipient\",\n        \"type\": \"string\"\n      },\n      {\n        \"indexed\": false,\n        \"internalType\": \"uint256\",\n        \"name\": \"amount\",\n        \"type\": \"uint256\"\n      }\n    ],\n    \"name\": \"__OKCSendToWasm\",\n    \"type\": \"event\"\n  }\n]"),
    43  			isErr: false,
    44  		},
    45  		{
    46  			name:      "error abi json",
    47  			data:      []byte("[\n  {\n    : false,\n    \"inputs\": [\n      {\n        \"indexed\": false,\n        \"internalType\": \"string\",\n        \"name\": \"wasmAddr\",\n        \"type\": \"string\"\n      },\n      {\n        \"indexed\": false,\n        \"internalType\": \"string\",\n        \"name\": \"recipient\",\n        \"type\": \"string\"\n      },\n      {\n        \"indexed\": false,\n        \"internalType\": \"uint256\",\n        \"name\": \"amount\",\n        \"type\": \"uint256\"\n      }\n    ],\n    \"name\": \"__OKCSendToWasm\",\n    \"type\": \"event\"\n  }\n]"),
    48  			isErr:     true,
    49  			expectErr: "json decode failed",
    50  		},
    51  	}
    52  	for _, tc := range testCase {
    53  		t.Run(tc.name, func(tt *testing.T) {
    54  			if tc.isErr {
    55  				defer func() {
    56  					r := recover()
    57  					require.NotNil(tt, r)
    58  					err := r.(error)
    59  					require.ErrorContains(tt, err, tc.expectErr)
    60  				}()
    61  			}
    62  			GetEVMABIConfig(tc.data)
    63  		})
    64  	}
    65  
    66  }
    67  
    68  func TestGetMintERC20Input(t *testing.T) {
    69  	ethAddress := common.Address{0x1}
    70  	addrStr := ethAddress.String()
    71  	testCases := []struct {
    72  		name      string
    73  		caller    string
    74  		recipient common.Address
    75  		amount    *big.Int
    76  		isErr     bool
    77  		expectErr string
    78  	}{
    79  		{
    80  			name:      "normal",
    81  			caller:    addrStr,
    82  			recipient: ethAddress,
    83  			amount:    sdk.NewInt(1).BigInt(),
    84  		},
    85  	}
    86  
    87  	for _, tc := range testCases {
    88  		_, err := GetMintERC20Input(tc.caller, tc.recipient, tc.amount)
    89  		if tc.isErr {
    90  			require.Error(t, err)
    91  		}
    92  	}
    93  
    94  }
    95  
    96  func TestGetMintERC20Output(t *testing.T) {
    97  	testCases := []struct {
    98  		name      string
    99  		data      []byte
   100  		isErr     bool
   101  		expectErr string
   102  		expect    bool
   103  	}{
   104  		{
   105  			name: "normal true 1",
   106  			data: func() []byte {
   107  				buffer := make([]byte, 31, 64)
   108  				buffer = append(buffer, byte(0x1))
   109  				return buffer
   110  			}(),
   111  			expect: true,
   112  		},
   113  		{
   114  			name: "normal false",
   115  			data: func() []byte {
   116  				buffer := make([]byte, 31, 64)
   117  				buffer = append(buffer, byte(0x0))
   118  				return buffer
   119  			}(),
   120  			expect: false,
   121  		},
   122  		{
   123  			name: "normal true 2",
   124  			data: func() []byte {
   125  				buffer := make([]byte, 32)
   126  				buffer[31] = byte(0x1)
   127  				return buffer
   128  			}(),
   129  			expect: true,
   130  		},
   131  		{
   132  			name: "err data input no enough ",
   133  			data: func() []byte {
   134  				buffer := make([]byte, 28)
   135  				return buffer
   136  			}(),
   137  			isErr:  true,
   138  			expect: false,
   139  		},
   140  		{
   141  			name: "err data input more ",
   142  			data: func() []byte {
   143  				buffer := make([]byte, 33)
   144  				return buffer
   145  			}(),
   146  			isErr:  true,
   147  			expect: false,
   148  		},
   149  	}
   150  
   151  	for _, tc := range testCases {
   152  		t.Run(tc.name, func(tt *testing.T) {
   153  			result, err := GetMintERC20Output(tc.data)
   154  			if tc.isErr {
   155  				require.Error(tt, err)
   156  			}
   157  			require.Equal(tt, tc.expect, result)
   158  		})
   159  	}
   160  }
   161  
   162  func TestGetMintCW20Input(t *testing.T) {
   163  	testCases := []struct {
   164  		name      string
   165  		amount    string
   166  		reicient  string
   167  		isErr     bool
   168  		expectErr string
   169  		expect    string
   170  	}{
   171  		{
   172  			name: "normal true",
   173  			reicient: func() string {
   174  				addr := sdk.AccAddress{0x1}
   175  				return addr.String()
   176  			}(),
   177  			amount: sdk.NewInt(1).String(),
   178  			expect: "{\"mint_c_w20\":{\"amount\":\"1\",\"recipient\":\"cosmos1qyfkm2y3\"}}",
   179  		},
   180  		{
   181  			name: "amount -1",
   182  			reicient: func() string {
   183  				addr := sdk.AccAddress{0x1}
   184  				return addr.String()
   185  			}(),
   186  			amount: sdk.NewInt(-1).String(),
   187  			expect: "{\"mint_c_w20\":{\"amount\":\"-1\",\"recipient\":\"cosmos1qyfkm2y3\"}}",
   188  		},
   189  		{
   190  			name:     "addr is error",
   191  			reicient: "hehe",
   192  			amount:   sdk.NewInt(-1).String(),
   193  			expect:   "{\"mint_c_w20\":{\"amount\":\"-1\",\"recipient\":\"hehe\"}}",
   194  		},
   195  	}
   196  	for _, tc := range testCases {
   197  		t.Run(tc.name, func(tt *testing.T) {
   198  			result, err := GetMintCW20Input(tc.amount, tc.reicient)
   199  			if tc.isErr {
   200  				require.Error(tt, err)
   201  			}
   202  			require.Equal(tt, tc.expect, string(result))
   203  		})
   204  	}
   205  }