code.vegaprotocol.io/vega@v0.79.0/core/bridges/erc20_logic_test.go (about)

     1  // Copyright (C) 2023 Gobalsky Labs Limited
     2  //
     3  // This program is free software: you can redistribute it and/or modify
     4  // it under the terms of the GNU Affero General Public License as
     5  // published by the Free Software Foundation, either version 3 of the
     6  // License, or (at your option) any later version.
     7  //
     8  // This program is distributed in the hope that it will be useful,
     9  // but WITHOUT ANY WARRANTY; without even the implied warranty of
    10  // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    11  // GNU Affero General Public License for more details.
    12  //
    13  // You should have received a copy of the GNU Affero General Public License
    14  // along with this program.  If not, see <http://www.gnu.org/licenses/>.
    15  
    16  package bridges_test
    17  
    18  import (
    19  	"testing"
    20  	"time"
    21  
    22  	"code.vegaprotocol.io/vega/core/bridges"
    23  	"code.vegaprotocol.io/vega/libs/num"
    24  
    25  	"github.com/stretchr/testify/assert"
    26  )
    27  
    28  const (
    29  	erc20BridgeAddr  = "0xcB84d72e61e383767C4DFEb2d8ff7f4FB89abc6e"
    30  	erc20AssetVegaID = "e74758a6708a866cd9262aae09170087f1b8afd7187fca752cd640cb93915fad"
    31  	erc20AssetAddr   = "0x1FaA74E181092A97Fecc923015293ce57eE1208A"
    32  	ethPartyAddr     = "0x1ebe188952ab6035adad21ea1c4f64fd2eac60e1"
    33  )
    34  
    35  func TestERC20Logic(t *testing.T) {
    36  	t.Run("list asset", testListAsset)
    37  	t.Run("remove asset", testRemoveAsset)
    38  	t.Run("withdraw asset", testWithdrawAsset)
    39  }
    40  
    41  func testListAsset(t *testing.T) {
    42  	tcs := []struct {
    43  		name     string
    44  		v1       bool
    45  		expected string
    46  	}{
    47  		{
    48  			name:     "v1 scheme",
    49  			v1:       true,
    50  			expected: "a39fa614b7b4bb0cf5819840164ca48472d1bda98a49053f891dfb004f053d2c29a60df5423927dad057f1d3d6a04c6e6d82f1bf128db5d5a7a01bcc8b70ab0e",
    51  		},
    52  		{
    53  			name:     "v2 scheme",
    54  			v1:       false,
    55  			expected: "d6810cef5534e232396ab0c572ca079fa41f728a20d98da3bfb59b81f183a96adee103d5f94348e9a8ce823446392109bc8bf10a27076cd0e232a1f808e0810c",
    56  		},
    57  	}
    58  
    59  	for _, tc := range tcs {
    60  		t.Run(tc.name, func(tt *testing.T) {
    61  			signer := testSigner{}
    62  			bridge := bridges.NewERC20Logic(signer, erc20BridgeAddr, chainID, tc.v1)
    63  			sig, err := bridge.ListAsset(
    64  				erc20AssetAddr,
    65  				erc20AssetVegaID,
    66  				num.NewUint(10),
    67  				num.NewUint(42),
    68  				num.NewUint(42),
    69  			)
    70  
    71  			assert.NoError(t, err)
    72  			assert.NotNil(t, sig.Message)
    73  			assert.NotNil(t, sig.Signature)
    74  			assert.True(t, signer.Verify(sig.Message, sig.Signature))
    75  			assert.Equal(t, tc.expected, sig.Signature.Hex())
    76  		})
    77  	}
    78  }
    79  
    80  func testRemoveAsset(t *testing.T) {
    81  	tcs := []struct {
    82  		name     string
    83  		v1       bool
    84  		expected string
    85  	}{
    86  		{
    87  			name:     "v1 scheme",
    88  			v1:       true,
    89  			expected: "a1c183d1c076c518297fa75f0fa3fddf6e5e83e76800a2efdbce36be12d4a23e2b61bce8097fea701f5a274ec89d70f92ffdd83a82a4d2c65f82b905109c3d0f",
    90  		},
    91  		{
    92  			name:     "v2 scheme",
    93  			v1:       false,
    94  			expected: "f11d5e0fa1c68edd1b43db30a0d02aaff8cef26c6140d30a4570615fa12a0e4e858a30b73a3763590a88614f366e9f433978653445b901e058dc07fe77595901",
    95  		},
    96  	}
    97  
    98  	for _, tc := range tcs {
    99  		t.Run(tc.name, func(tt *testing.T) {
   100  			signer := testSigner{}
   101  			bridge := bridges.NewERC20Logic(signer, erc20BridgeAddr, chainID, tc.v1)
   102  			sig, err := bridge.RemoveAsset(
   103  				erc20AssetAddr,
   104  				num.NewUint(42),
   105  			)
   106  
   107  			assert.NoError(t, err)
   108  			assert.NotNil(t, sig.Message)
   109  			assert.NotNil(t, sig.Signature)
   110  			assert.True(t, signer.Verify(sig.Message, sig.Signature))
   111  			assert.Equal(t, tc.expected, sig.Signature.Hex())
   112  		})
   113  	}
   114  }
   115  
   116  func testWithdrawAsset(t *testing.T) {
   117  	tcs := []struct {
   118  		name     string
   119  		v1       bool
   120  		expected string
   121  	}{
   122  		{
   123  			name:     "v1 scheme",
   124  			v1:       true,
   125  			expected: "8c70e1bb8a74a9112ef475cdca37f63149453f5d3729164847aabf329c8932774922bb3cf41dfd7112fa8a0bdbe3f845b170e8f38406ae51fd7da00177dbc807",
   126  		},
   127  		{
   128  			name:     "v2 scheme",
   129  			v1:       false,
   130  			expected: "057bcb000d6961d4c8cd67f5a8a8ffac501f7077c23dcb4aab0127f1f4530e865d8627bccfb71559b9ddca0cb938b96c709fdf419d2f350ec9ab6416b888c70f",
   131  		},
   132  	}
   133  
   134  	for _, tc := range tcs {
   135  		t.Run(tc.name, func(tt *testing.T) {
   136  			signer := testSigner{}
   137  			bridge := bridges.NewERC20Logic(signer, erc20BridgeAddr, chainID, tc.v1)
   138  			sig, err := bridge.WithdrawAsset(
   139  				erc20AssetAddr,
   140  				num.NewUint(42), // amount
   141  				ethPartyAddr,
   142  				time.Unix(1000, 0),
   143  				num.NewUint(1000), // nonce
   144  			)
   145  
   146  			assert.NoError(t, err)
   147  			assert.NotNil(t, sig.Message)
   148  			assert.NotNil(t, sig.Signature)
   149  			assert.True(t, signer.Verify(sig.Message, sig.Signature))
   150  			assert.Equal(t, tc.expected, sig.Signature.Hex())
   151  		})
   152  	}
   153  }