From 505d1e808cc858cbf15ea62ee7c7381155c640c0 Mon Sep 17 00:00:00 2001 From: Charlie Chen Date: Thu, 15 Aug 2024 13:04:13 -0500 Subject: [PATCH 1/5] initiate Solana deposit and call --- cmd/zetae2e/local/local.go | 3 ++ contrib/localnet/docker-compose.yml | 3 -- e2e/e2etests/e2etests.go | 13 +++++- e2e/e2etests/test_eth_deposit_call.go | 12 +----- e2e/e2etests/test_solana_deposit.go | 17 +++++++- e2e/e2etests/test_solana_deposit_call.go | 53 ++++++++++++++++++++++++ e2e/e2etests/test_solana_withdraw.go | 12 +++--- e2e/runner/solana.go | 10 ++++- e2e/utils/example_contract.go | 28 +++++++++++++ 9 files changed, 127 insertions(+), 24 deletions(-) create mode 100644 e2e/e2etests/test_solana_deposit_call.go create mode 100644 e2e/utils/example_contract.go diff --git a/cmd/zetae2e/local/local.go b/cmd/zetae2e/local/local.go index 86adfac7c4..5ddfa0b45b 100644 --- a/cmd/zetae2e/local/local.go +++ b/cmd/zetae2e/local/local.go @@ -100,6 +100,8 @@ func localE2ETest(cmd *cobra.Command, _ []string) { testTSSMigration = must(cmd.Flags().GetBool(flagTestTSSMigration)) ) + testSolana = true + logger := runner.NewLogger(verbose, color.FgWhite, "setup") testStartTime := time.Now() @@ -325,6 +327,7 @@ func localE2ETest(cmd *cobra.Command, _ []string) { solanaTests := []string{ e2etests.TestSolanaDepositName, e2etests.TestSolanaWithdrawName, + e2etests.TestSolanaDepositAndCallName, } eg.Go(solanaTestRoutine(conf, deployerRunner, verbose, solanaTests...)) } diff --git a/contrib/localnet/docker-compose.yml b/contrib/localnet/docker-compose.yml index 606b4db4be..4a254e5b8c 100644 --- a/contrib/localnet/docker-compose.yml +++ b/contrib/localnet/docker-compose.yml @@ -231,9 +231,6 @@ services: image: solana-local:latest container_name: solana hostname: solana - profiles: - - solana - - all ports: - "8899:8899" networks: diff --git a/e2e/e2etests/e2etests.go b/e2e/e2etests/e2etests.go index 402eed367e..1ec0f3663b 100644 --- a/e2e/e2etests/e2etests.go +++ b/e2e/e2etests/e2etests.go @@ -54,8 +54,9 @@ const ( /* Solana tests */ - TestSolanaDepositName = "solana_deposit" - TestSolanaWithdrawName = "solana_withdraw" + TestSolanaDepositName = "solana_deposit" + TestSolanaWithdrawName = "solana_withdraw" + TestSolanaDepositAndCallName = "solana_deposit_and_call" /* Bitcoin tests @@ -352,6 +353,14 @@ var AllE2ETests = []runner.E2ETest{ }, TestSolanaWithdraw, ), + runner.NewE2ETest( + TestSolanaDepositAndCallName, + "deposit SOL into ZEVM and call a contract", + []runner.ArgDefinition{ + {Description: "amount in lamport", DefaultValue: "44780000"}, + }, + TestSolanaDepositAndCall, + ), /* Bitcoin tests */ diff --git a/e2e/e2etests/test_eth_deposit_call.go b/e2e/e2etests/test_eth_deposit_call.go index 7fd928266d..e2b52c1c48 100644 --- a/e2e/e2etests/test_eth_deposit_call.go +++ b/e2e/e2etests/test_eth_deposit_call.go @@ -3,7 +3,6 @@ package e2etests import ( "math/big" - "github.com/ethereum/go-ethereum/accounts/abi/bind" ethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/stretchr/testify/require" @@ -57,16 +56,7 @@ func TestEtherDepositAndCall(r *runner.E2ERunner, args []string) { utils.RequireCCTXStatus(r, cctx, types.CctxStatus_OutboundMined) // Checking example contract has been called, bar value should be set to amount - bar, err := exampleContract.Bar(&bind.CallOpts{}) - require.NoError(r, err) - require.Equal( - r, - 0, - bar.Cmp(value), - "cross-chain call failed bar value %s should be equal to amount %s", - bar.String(), - value.String(), - ) + utils.MustHaveCalledExampleContract(r, exampleContract, value) r.Logger.Info("Cross-chain call succeeded") r.Logger.Info("Deploying reverter contract") diff --git a/e2e/e2etests/test_solana_deposit.go b/e2e/e2etests/test_solana_deposit.go index 486ae89782..f5b2378f2c 100644 --- a/e2e/e2etests/test_solana_deposit.go +++ b/e2e/e2etests/test_solana_deposit.go @@ -3,6 +3,7 @@ package e2etests import ( "math/big" + "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/gagliardetto/solana-go" "github.com/stretchr/testify/require" @@ -14,6 +15,11 @@ import ( func TestSolanaDeposit(r *runner.E2ERunner, args []string) { require.Len(r, args, 1) + // get ERC20 SOL balance before deposit + balanceBefore, err := r.SOLZRC20.BalanceOf(&bind.CallOpts{}, r.EVMAddress()) + require.NoError(r, err) + r.Logger.Info("runner balance of SOL before deposit: %d", balanceBefore) + // parse deposit amount (in lamports) // #nosec G115 e2e - always in range depositAmount := big.NewInt(int64(parseInt(r, args[0]))) @@ -23,7 +29,7 @@ func TestSolanaDeposit(r *runner.E2ERunner, args []string) { require.NoError(r, err) // create 'deposit' instruction - instruction := r.CreateDepositInstruction(privkey.PublicKey(), r.EVMAddress(), depositAmount.Uint64()) + instruction := r.CreateDepositInstruction(privkey.PublicKey(), r.EVMAddress(), nil, depositAmount.Uint64()) // create and sign the transaction signedTx := r.CreateSignedTransaction([]solana.Instruction{instruction}, privkey) @@ -35,4 +41,13 @@ func TestSolanaDeposit(r *runner.E2ERunner, args []string) { // wait for the cctx to be mined cctx := utils.WaitCctxMinedByInboundHash(r.Ctx, sig.String(), r.CctxClient, r.Logger, r.CctxTimeout) utils.RequireCCTXStatus(r, cctx, crosschaintypes.CctxStatus_OutboundMined) + + // get ERC20 SOL balance after deposit + balanceAfter, err := r.SOLZRC20.BalanceOf(&bind.CallOpts{}, r.EVMAddress()) + require.NoError(r, err) + r.Logger.Info("runner balance of SOL after deposit: %d", balanceAfter) + + // the runner balance should be increased by the deposit amount + amountIncreased := new(big.Int).Sub(balanceAfter, balanceBefore) + require.Equal(r, depositAmount.String(), amountIncreased.String()) } diff --git a/e2e/e2etests/test_solana_deposit_call.go b/e2e/e2etests/test_solana_deposit_call.go new file mode 100644 index 0000000000..52396a94b8 --- /dev/null +++ b/e2e/e2etests/test_solana_deposit_call.go @@ -0,0 +1,53 @@ +package e2etests + +import ( + "math/big" + + "github.com/gagliardetto/solana-go" + "github.com/stretchr/testify/require" + + "github.com/zeta-chain/zetacore/e2e/runner" + "github.com/zeta-chain/zetacore/e2e/utils" + testcontract "github.com/zeta-chain/zetacore/testutil/contracts" + crosschaintypes "github.com/zeta-chain/zetacore/x/crosschain/types" +) + +// TestSolanaDepositAndCall tests deposit of lamports calling a example contract +func TestSolanaDepositAndCall(r *runner.E2ERunner, args []string) { + require.Len(r, args, 1) + + // parse deposit amount (in lamports) + // #nosec G115 e2e - always in range + depositAmount := big.NewInt(int64(parseInt(r, args[0]))) + + // deploy an example contract in ZEVM + contractAddr, _, contract, err := testcontract.DeployExample(r.ZEVMAuth, r.ZEVMClient) + require.NoError(r, err) + + r.Logger.Info("Example contract deployed at: %s", contractAddr.String()) + + // ---------------------------------------- execute the deposit transaction ---------------------------------------- + // load deployer private key + privkey, err := solana.PrivateKeyFromBase58(r.Account.SolanaPrivateKey.String()) + require.NoError(r, err) + + // create 'deposit' instruction + data := []byte("hello lamports") + instruction := r.CreateDepositInstruction(privkey.PublicKey(), contractAddr, data, depositAmount.Uint64()) + + // create and sign the transaction + signedTx := r.CreateSignedTransaction([]solana.Instruction{instruction}, privkey) + + // broadcast the transaction and wait for finalization + sig, out := r.BroadcastTxSync(signedTx) + r.Logger.Print("deposit logs: %v", out.Meta.LogMessages) + + // ---------------------------------------- verify the cross-chain call -------------------------------------------- + // wait for the cctx to be mined + cctx := utils.WaitCctxMinedByInboundHash(r.Ctx, sig.String(), r.CctxClient, r.Logger, r.CctxTimeout) + utils.RequireCCTXStatus(r, cctx, crosschaintypes.CctxStatus_OutboundMined) + + // check if example contract has been called, bar value should be set to amount + utils.MustHaveCalledExampleContract(r, contract, depositAmount) + r.Logger.Info("cross-chain call succeeded") +} diff --git a/e2e/e2etests/test_solana_withdraw.go b/e2e/e2etests/test_solana_withdraw.go index 776944c9b3..d062570dd3 100644 --- a/e2e/e2etests/test_solana_withdraw.go +++ b/e2e/e2etests/test_solana_withdraw.go @@ -13,10 +13,10 @@ import ( func TestSolanaWithdraw(r *runner.E2ERunner, args []string) { require.Len(r, args, 1) - // print balanceAfter of from address - balanceBefore, err := r.SOLZRC20.BalanceOf(&bind.CallOpts{}, r.ZEVMAuth.From) + // get ERC20 SOL balance before withdraw + balanceBefore, err := r.SOLZRC20.BalanceOf(&bind.CallOpts{}, r.EVMAddress()) require.NoError(r, err) - r.Logger.Info("from address %s balance of SOL before: %d", r.ZEVMAuth.From, balanceBefore) + r.Logger.Info("runner balance of SOL before withdraw: %d", balanceBefore) // parse withdraw amount (in lamports), approve amount is 1 SOL approvedAmount := new(big.Int).SetUint64(solana.LAMPORTS_PER_SOL) @@ -36,10 +36,10 @@ func TestSolanaWithdraw(r *runner.E2ERunner, args []string) { // withdraw r.WithdrawSOLZRC20(privkey.PublicKey(), withdrawAmount, approvedAmount) - // print balance of from address after withdraw - balanceAfter, err := r.SOLZRC20.BalanceOf(&bind.CallOpts{}, r.ZEVMAuth.From) + // get ERC20 SOL balance after withdraw + balanceAfter, err := r.SOLZRC20.BalanceOf(&bind.CallOpts{}, r.EVMAddress()) require.NoError(r, err) - r.Logger.Info("from address %s balance of SOL after: %d", r.ZEVMAuth.From, balanceAfter) + r.Logger.Info("runner balance of SOL after withdraw: %d", balanceAfter) // check if the balance is reduced correctly amountReduced := new(big.Int).Sub(balanceBefore, balanceAfter) diff --git a/e2e/runner/solana.go b/e2e/runner/solana.go index 71d2cfb629..4f2bac7b2f 100644 --- a/e2e/runner/solana.go +++ b/e2e/runner/solana.go @@ -31,6 +31,7 @@ func (r *E2ERunner) ComputePdaAddress() solana.PublicKey { func (r *E2ERunner) CreateDepositInstruction( signer solana.PublicKey, receiver ethcommon.Address, + data []byte, amount uint64, ) solana.Instruction { // compute the gateway PDA address @@ -51,7 +52,7 @@ func (r *E2ERunner) CreateDepositInstruction( inst.DataBytes, err = borsh.Serialize(solanacontract.DepositInstructionParams{ Discriminator: solanacontract.DiscriminatorDeposit(), Amount: amount, - Memo: receiver.Bytes(), + Memo: append(receiver.Bytes(), data...), }) require.NoError(r, err) @@ -96,9 +97,16 @@ func (r *E2ERunner) BroadcastTxSync(tx *solana.Transaction) (solana.Signature, * require.NoError(r, err) r.Logger.Info("broadcast success! tx sig %s; waiting for confirmation...", sig) + var ( + start = time.Now() + timeout = 2 * time.Minute // Solana tx expires automatically after 2 minutes + ) + // wait for the transaction to be finalized var out *rpc.GetTransactionResult for { + require.False(r, time.Since(start) > timeout, "waiting solana tx timeout") + time.Sleep(1 * time.Second) out, err = r.SolanaClient.GetTransaction(r.Ctx, sig, &rpc.GetTransactionOpts{}) if err == nil { diff --git a/e2e/utils/example_contract.go b/e2e/utils/example_contract.go new file mode 100644 index 0000000000..326da42fd5 --- /dev/null +++ b/e2e/utils/example_contract.go @@ -0,0 +1,28 @@ +package utils + +import ( + "math/big" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/stretchr/testify/require" + + testcontract "github.com/zeta-chain/zetacore/testutil/contracts" +) + +// MustHaveCalledExampleContract checks if the contract has been called correctly +func MustHaveCalledExampleContract( + t require.TestingT, + contract *testcontract.Example, + amount *big.Int, +) { + bar, err := contract.Bar(&bind.CallOpts{}) + require.NoError(t, err) + require.Equal( + t, + 0, + bar.Cmp(amount), + "cross-chain call failed bar value %s should be equal to amount %s", + bar.String(), + amount.String(), + ) +} From 732496dd5ba1fa34460a80a452ed336b296c919a Mon Sep 17 00:00:00 2001 From: Charlie Chen Date: Thu, 15 Aug 2024 17:33:22 -0500 Subject: [PATCH 2/5] add Solana E2E deposit_and_call_refund --- cmd/zetae2e/local/local.go | 3 +- contrib/localnet/docker-compose.yml | 3 ++ e2e/e2etests/e2etests.go | 17 ++++-- e2e/e2etests/test_eth_deposit_call.go | 3 +- e2e/e2etests/test_solana_deposit_call.go | 2 +- e2e/e2etests/test_solana_deposit_refund.go | 54 +++++++++++++++++++ .../{example_contract.go => contracts.go} | 5 ++ x/fungible/keeper/evm_test.go | 5 +- 8 files changed, 81 insertions(+), 11 deletions(-) create mode 100644 e2e/e2etests/test_solana_deposit_refund.go rename e2e/utils/{example_contract.go => contracts.go} (83%) diff --git a/cmd/zetae2e/local/local.go b/cmd/zetae2e/local/local.go index 5ddfa0b45b..4a34450cb9 100644 --- a/cmd/zetae2e/local/local.go +++ b/cmd/zetae2e/local/local.go @@ -100,8 +100,6 @@ func localE2ETest(cmd *cobra.Command, _ []string) { testTSSMigration = must(cmd.Flags().GetBool(flagTestTSSMigration)) ) - testSolana = true - logger := runner.NewLogger(verbose, color.FgWhite, "setup") testStartTime := time.Now() @@ -328,6 +326,7 @@ func localE2ETest(cmd *cobra.Command, _ []string) { e2etests.TestSolanaDepositName, e2etests.TestSolanaWithdrawName, e2etests.TestSolanaDepositAndCallName, + e2etests.TestSolanaDepositAndCallRefundName, } eg.Go(solanaTestRoutine(conf, deployerRunner, verbose, solanaTests...)) } diff --git a/contrib/localnet/docker-compose.yml b/contrib/localnet/docker-compose.yml index 4a254e5b8c..606b4db4be 100644 --- a/contrib/localnet/docker-compose.yml +++ b/contrib/localnet/docker-compose.yml @@ -231,6 +231,9 @@ services: image: solana-local:latest container_name: solana hostname: solana + profiles: + - solana + - all ports: - "8899:8899" networks: diff --git a/e2e/e2etests/e2etests.go b/e2e/e2etests/e2etests.go index 1ec0f3663b..8544ed8db6 100644 --- a/e2e/e2etests/e2etests.go +++ b/e2e/e2etests/e2etests.go @@ -54,9 +54,10 @@ const ( /* Solana tests */ - TestSolanaDepositName = "solana_deposit" - TestSolanaWithdrawName = "solana_withdraw" - TestSolanaDepositAndCallName = "solana_deposit_and_call" + TestSolanaDepositName = "solana_deposit" + TestSolanaWithdrawName = "solana_withdraw" + TestSolanaDepositAndCallName = "solana_deposit_and_call" + TestSolanaDepositAndCallRefundName = "solana_deposit_and_call_refund" /* Bitcoin tests @@ -357,10 +358,18 @@ var AllE2ETests = []runner.E2ETest{ TestSolanaDepositAndCallName, "deposit SOL into ZEVM and call a contract", []runner.ArgDefinition{ - {Description: "amount in lamport", DefaultValue: "44780000"}, + {Description: "amount in lamport", DefaultValue: "4478000"}, }, TestSolanaDepositAndCall, ), + runner.NewE2ETest( + TestSolanaDepositAndCallRefundName, + "deposit SOL into ZEVM and call a contract that reverts; should refund", + []runner.ArgDefinition{ + {Description: "amount in lamport", DefaultValue: "4477000"}, + }, + TestSolanaDepositAndCallRefund, + ), /* Bitcoin tests */ diff --git a/e2e/e2etests/test_eth_deposit_call.go b/e2e/e2etests/test_eth_deposit_call.go index e2b52c1c48..ef4de364a7 100644 --- a/e2e/e2etests/test_eth_deposit_call.go +++ b/e2e/e2etests/test_eth_deposit_call.go @@ -90,6 +90,5 @@ func TestEtherDepositAndCall(r *runner.E2ERunner, args []string) { r.Logger.Info("Cross-chain call to reverter reverted") // check the status message contains revert error hash in case of revert - // 0xbfb4ebcf is the hash of "Foo()" - require.Contains(r, cctx.CctxStatus.StatusMessage, "0xbfb4ebcf") + require.Contains(r, cctx.CctxStatus.StatusMessage, utils.ErrHashRevert) } diff --git a/e2e/e2etests/test_solana_deposit_call.go b/e2e/e2etests/test_solana_deposit_call.go index 52396a94b8..45456be4a3 100644 --- a/e2e/e2etests/test_solana_deposit_call.go +++ b/e2e/e2etests/test_solana_deposit_call.go @@ -40,7 +40,7 @@ func TestSolanaDepositAndCall(r *runner.E2ERunner, args []string) { // broadcast the transaction and wait for finalization sig, out := r.BroadcastTxSync(signedTx) - r.Logger.Print("deposit logs: %v", out.Meta.LogMessages) + r.Logger.Info("deposit logs: %v", out.Meta.LogMessages) // ---------------------------------------- verify the cross-chain call -------------------------------------------- // wait for the cctx to be mined diff --git a/e2e/e2etests/test_solana_deposit_refund.go b/e2e/e2etests/test_solana_deposit_refund.go new file mode 100644 index 0000000000..03af2ea58b --- /dev/null +++ b/e2e/e2etests/test_solana_deposit_refund.go @@ -0,0 +1,54 @@ +package e2etests + +import ( + "math/big" + + "github.com/gagliardetto/solana-go" + "github.com/stretchr/testify/require" + + "github.com/zeta-chain/zetacore/e2e/runner" + "github.com/zeta-chain/zetacore/e2e/utils" + testcontract "github.com/zeta-chain/zetacore/testutil/contracts" + crosschaintypes "github.com/zeta-chain/zetacore/x/crosschain/types" +) + +// TestSolanaDepositAndCallRefund tests deposit of lamports calling a example contract +func TestSolanaDepositAndCallRefund(r *runner.E2ERunner, args []string) { + require.Len(r, args, 1) + + // parse deposit amount (in lamports) + // #nosec G115 e2e - always in range + depositAmount := big.NewInt(int64(parseInt(r, args[0]))) + + // deploy a reverter contract in ZEVM + r.Logger.Info("Deploying reverter contract") + reverterAddr, _, _, err := testcontract.DeployReverter(r.ZEVMAuth, r.ZEVMClient) + require.NoError(r, err) + + r.Logger.Info("Reverter contract deployed at: %s", reverterAddr.String()) + + // ---------------------------------------- execute the deposit transaction ---------------------------------------- + // load deployer private key + privkey, err := solana.PrivateKeyFromBase58(r.Account.SolanaPrivateKey.String()) + require.NoError(r, err) + + // create 'deposit' instruction + data := []byte("hello reverter") + instruction := r.CreateDepositInstruction(privkey.PublicKey(), reverterAddr, data, depositAmount.Uint64()) + + // create and sign the transaction + signedTx := r.CreateSignedTransaction([]solana.Instruction{instruction}, privkey) + + // broadcast the transaction and wait for finalization + sig, out := r.BroadcastTxSync(signedTx) + r.Logger.Info("deposit logs: %v", out.Meta.LogMessages) + + // ---------------------------------------- verify the cross-chain revert -------------------------------------------- + // wait for the cctx to be mined + cctx := utils.WaitCctxMinedByInboundHash(r.Ctx, sig.String(), r.CctxClient, r.Logger, r.CctxTimeout) + utils.RequireCCTXStatus(r, cctx, crosschaintypes.CctxStatus_Reverted) + r.Logger.Info("cross-chain call reverted: %v", cctx.CctxStatus.StatusMessage) + + // check the status message contains revert error hash in case of revert + require.Contains(r, cctx.CctxStatus.StatusMessage, utils.ErrHashRevert) +} diff --git a/e2e/utils/example_contract.go b/e2e/utils/contracts.go similarity index 83% rename from e2e/utils/example_contract.go rename to e2e/utils/contracts.go index 326da42fd5..d08e2aeac8 100644 --- a/e2e/utils/example_contract.go +++ b/e2e/utils/contracts.go @@ -9,6 +9,11 @@ import ( testcontract "github.com/zeta-chain/zetacore/testutil/contracts" ) +const ( + // ErrHashRevert is the keccak256 hash of custom error "Foo()" on reverter contract + ErrHashRevert = "0xbfb4ebcf" +) + // MustHaveCalledExampleContract checks if the contract has been called correctly func MustHaveCalledExampleContract( t require.TestingT, diff --git a/x/fungible/keeper/evm_test.go b/x/fungible/keeper/evm_test.go index 2ef0f4dfb9..7e772caa29 100644 --- a/x/fungible/keeper/evm_test.go +++ b/x/fungible/keeper/evm_test.go @@ -2,6 +2,7 @@ package keeper_test import ( "encoding/json" + "fmt" "math/big" "testing" @@ -16,6 +17,7 @@ import ( "github.com/zeta-chain/protocol-contracts/pkg/contracts/zevm/wzeta.sol" zrc20 "github.com/zeta-chain/protocol-contracts/pkg/contracts/zevm/zrc20.sol" + "github.com/zeta-chain/zetacore/e2e/utils" "github.com/zeta-chain/zetacore/pkg/chains" "github.com/zeta-chain/zetacore/pkg/coin" "github.com/zeta-chain/zetacore/server/config" @@ -574,8 +576,7 @@ func TestKeeper_CallEVMWithData(t *testing.T) { require.True(t, types.IsContractReverted(res, err)) // check reason is included for revert error - // 0xbfb4ebcf is the hash of "Foo()" - require.ErrorContains(t, err, "reason: 0xbfb4ebcf") + require.ErrorContains(t, err, fmt.Sprintf("reason: %s", utils.ErrHashRevert)) res, err = k.CallEVM( ctx, From 3f11b235cf7c7c99f9830370c22a2320bfda2f66 Mon Sep 17 00:00:00 2001 From: Charlie Chen Date: Fri, 16 Aug 2024 00:14:52 -0500 Subject: [PATCH 3/5] add changelog entry and adjust e2e default arguments --- changelog.md | 4 ++++ e2e/e2etests/e2etests.go | 8 ++++---- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/changelog.md b/changelog.md index 4cbbc55a9d..97e3b6e071 100644 --- a/changelog.md +++ b/changelog.md @@ -14,6 +14,10 @@ * [2615](https://github.com/zeta-chain/node/pull/2615) - Refactor cleanup of outbound trackers +### Tests + +* [2726](https://github.com/zeta-chain/node/pull/2726) - add e2e tests for deposit and call, deposit and revert + ### Fixes * [2654](https://github.com/zeta-chain/node/pull/2654) - add validation for authorization list in when validating genesis state for authorization module diff --git a/e2e/e2etests/e2etests.go b/e2e/e2etests/e2etests.go index 8544ed8db6..e7068ee1d6 100644 --- a/e2e/e2etests/e2etests.go +++ b/e2e/e2etests/e2etests.go @@ -342,7 +342,7 @@ var AllE2ETests = []runner.E2ETest{ TestSolanaDepositName, "deposit SOL into ZEVM", []runner.ArgDefinition{ - {Description: "amount in lamport", DefaultValue: "13370000"}, + {Description: "amount in lamport", DefaultValue: "1200000"}, }, TestSolanaDeposit, ), @@ -350,7 +350,7 @@ var AllE2ETests = []runner.E2ETest{ TestSolanaWithdrawName, "withdraw SOL from ZEVM", []runner.ArgDefinition{ - {Description: "amount in lamport", DefaultValue: "1336000"}, + {Description: "amount in lamport", DefaultValue: "1000000"}, }, TestSolanaWithdraw, ), @@ -358,7 +358,7 @@ var AllE2ETests = []runner.E2ETest{ TestSolanaDepositAndCallName, "deposit SOL into ZEVM and call a contract", []runner.ArgDefinition{ - {Description: "amount in lamport", DefaultValue: "4478000"}, + {Description: "amount in lamport", DefaultValue: "1200000"}, }, TestSolanaDepositAndCall, ), @@ -366,7 +366,7 @@ var AllE2ETests = []runner.E2ETest{ TestSolanaDepositAndCallRefundName, "deposit SOL into ZEVM and call a contract that reverts; should refund", []runner.ArgDefinition{ - {Description: "amount in lamport", DefaultValue: "4477000"}, + {Description: "amount in lamport", DefaultValue: "1200000"}, }, TestSolanaDepositAndCallRefund, ), From 92d67f5897576fc119b93838893b0aaf9a43ec08 Mon Sep 17 00:00:00 2001 From: Charlie Chen Date: Fri, 16 Aug 2024 14:20:33 -0500 Subject: [PATCH 4/5] added parseBigInt() helper func for E2E tests; created SOLDepositAndCall util function; misc --- e2e/e2etests/helpers.go | 7 +++++ e2e/e2etests/test_context_upgrade.go | 4 +-- e2e/e2etests/test_donation.go | 6 ++-- e2e/e2etests/test_erc20_deposit.go | 6 ++-- .../test_erc20_deposit_restricted_address.go | 6 ++-- e2e/e2etests/test_erc20_multiple_deposits.go | 8 ++--- e2e/e2etests/test_erc20_multiple_withdraws.go | 8 ++--- e2e/e2etests/test_eth_deposit.go | 6 ++-- e2e/e2etests/test_eth_deposit_call.go | 8 ++--- e2e/e2etests/test_eth_deposit_refund.go | 4 +-- .../test_message_passing_evm_to_zevm.go | 4 +-- ...test_message_passing_evm_to_zevm_revert.go | 4 +-- ...message_passing_evm_to_zevm_revert_fail.go | 6 ++-- .../test_message_passing_external_chains.go | 4 +-- ..._message_passing_external_chains_revert.go | 6 ++-- ...age_passing_external_chains_revert_fail.go | 4 +-- .../test_message_passing_zevm_to_evm.go | 4 +-- ...test_message_passing_zevm_to_evm_revert.go | 4 +-- ...message_passing_zevm_to_evm_revert_fail.go | 4 +-- e2e/e2etests/test_solana_deposit.go | 20 +++---------- e2e/e2etests/test_solana_deposit_call.go | 26 +++------------- e2e/e2etests/test_solana_deposit_refund.go | 30 ++++--------------- e2e/e2etests/test_solana_withdraw.go | 3 +- e2e/e2etests/test_stress_eth_deposit.go | 6 ++-- e2e/e2etests/test_stress_eth_withdraw.go | 4 +-- e2e/e2etests/test_zeta_deposit.go | 6 ++-- e2e/e2etests/test_zeta_deposit_new_address.go | 6 ++-- .../test_zeta_deposit_restricted_address.go | 6 ++-- e2e/e2etests/test_zeta_withdraw.go | 6 ++-- .../test_zeta_withdraw_bitcoin_revert.go | 4 +-- e2e/runner/solana.go | 27 +++++++++++++++++ e2e/utils/contracts.go | 4 +-- x/fungible/keeper/evm_test.go | 2 +- 33 files changed, 104 insertions(+), 149 deletions(-) diff --git a/e2e/e2etests/helpers.go b/e2e/e2etests/helpers.go index 4dc37498d9..8146ff52b8 100644 --- a/e2e/e2etests/helpers.go +++ b/e2e/e2etests/helpers.go @@ -108,6 +108,13 @@ func parseInt(t require.TestingT, s string) int { return v } +func parseBigInt(t require.TestingT, s string) *big.Int { + v, ok := big.NewInt(0).SetString(s, 10) + require.True(t, ok, "unable to parse big.Int from %q", s) + + return v +} + // bigIntFromFloat64 takes float64 (e.g. 0.001) that represents btc amount // and converts it to big.Int for downstream usage. func btcAmountFromFloat64(t require.TestingT, amount float64) *big.Int { diff --git a/e2e/e2etests/test_context_upgrade.go b/e2e/e2etests/test_context_upgrade.go index 4a71b07428..82e81f2147 100644 --- a/e2e/e2etests/test_context_upgrade.go +++ b/e2e/e2etests/test_context_upgrade.go @@ -2,7 +2,6 @@ package e2etests import ( "bytes" - "math/big" "time" "github.com/ethereum/go-ethereum/accounts/abi/bind" @@ -17,8 +16,7 @@ func TestContextUpgrade(r *runner.E2ERunner, args []string) { require.Len(r, args, 1) // parse the value from the provided arguments - value, ok := big.NewInt(0).SetString(args[0], 10) - require.True(r, ok, "Invalid value specified for TestContextUpgrade.") + value := parseBigInt(r, args[0]) data := make([]byte, 0, 32) data = append(data, r.ContextAppAddr.Bytes()...) diff --git a/e2e/e2etests/test_donation.go b/e2e/e2etests/test_donation.go index 2347e97e23..d628cce62e 100644 --- a/e2e/e2etests/test_donation.go +++ b/e2e/e2etests/test_donation.go @@ -1,8 +1,6 @@ package e2etests import ( - "math/big" - "github.com/stretchr/testify/require" "github.com/zeta-chain/zetacore/e2e/runner" @@ -14,8 +12,8 @@ import ( func TestDonationEther(r *runner.E2ERunner, args []string) { require.Len(r, args, 1) - amount, ok := big.NewInt(0).SetString(args[0], 10) - require.True(r, ok, "Invalid amount specified for TestDonationEther.") + // parse the donation amount + amount := parseBigInt(r, args[0]) txDonation, err := r.SendEther(r.TSSAddress, amount, []byte(constant.DonationMessage)) require.NoError(r, err) diff --git a/e2e/e2etests/test_erc20_deposit.go b/e2e/e2etests/test_erc20_deposit.go index c7f1d4fc5f..66d640f0c4 100644 --- a/e2e/e2etests/test_erc20_deposit.go +++ b/e2e/e2etests/test_erc20_deposit.go @@ -1,8 +1,6 @@ package e2etests import ( - "math/big" - "github.com/stretchr/testify/require" "github.com/zeta-chain/zetacore/e2e/runner" @@ -12,8 +10,8 @@ import ( func TestERC20Deposit(r *runner.E2ERunner, args []string) { require.Len(r, args, 1) - amount, ok := big.NewInt(0).SetString(args[0], 10) - require.True(r, ok, "Invalid amount specified for TestERC20Deposit.") + // parse the deposit amount + amount := parseBigInt(r, args[0]) hash := r.DepositERC20WithAmountAndMessage(r.EVMAddress(), amount, []byte{}) diff --git a/e2e/e2etests/test_erc20_deposit_restricted_address.go b/e2e/e2etests/test_erc20_deposit_restricted_address.go index 758da5a969..ea5dd81252 100644 --- a/e2e/e2etests/test_erc20_deposit_restricted_address.go +++ b/e2e/e2etests/test_erc20_deposit_restricted_address.go @@ -1,8 +1,6 @@ package e2etests import ( - "math/big" - ethcommon "github.com/ethereum/go-ethereum/common" "github.com/stretchr/testify/require" @@ -13,8 +11,8 @@ import ( func TestERC20DepositRestricted(r *runner.E2ERunner, args []string) { require.Len(r, args, 1) - amount, ok := big.NewInt(0).SetString(args[0], 10) - require.True(r, ok) + // parse the deposit amount + amount := parseBigInt(r, args[0]) // deposit ERC20 to restricted address r.DepositERC20WithAmountAndMessage(ethcommon.HexToAddress(testutils.RestrictedEVMAddressTest), amount, []byte{}) diff --git a/e2e/e2etests/test_erc20_multiple_deposits.go b/e2e/e2etests/test_erc20_multiple_deposits.go index 87b8309924..8948bc3fe7 100644 --- a/e2e/e2etests/test_erc20_multiple_deposits.go +++ b/e2e/e2etests/test_erc20_multiple_deposits.go @@ -15,11 +15,9 @@ import ( func TestMultipleERC20Deposit(r *runner.E2ERunner, args []string) { require.Len(r, args, 2) - depositAmount, ok := big.NewInt(0).SetString(args[0], 10) - require.True(r, ok) - - numberOfDeposits, ok := big.NewInt(0).SetString(args[1], 10) - require.True(r, ok) + // parse the deposit amount and count + depositAmount := parseBigInt(r, args[0]) + numberOfDeposits := parseBigInt(r, args[1]) require.NotZero(r, numberOfDeposits.Int64()) initialBal, err := r.ERC20ZRC20.BalanceOf(&bind.CallOpts{}, r.EVMAddress()) diff --git a/e2e/e2etests/test_erc20_multiple_withdraws.go b/e2e/e2etests/test_erc20_multiple_withdraws.go index 53a45d1b41..80bdcac46e 100644 --- a/e2e/e2etests/test_erc20_multiple_withdraws.go +++ b/e2e/e2etests/test_erc20_multiple_withdraws.go @@ -16,17 +16,15 @@ func TestMultipleERC20Withdraws(r *runner.E2ERunner, args []string) { approvedAmount := big.NewInt(1e18) - withdrawalAmount, ok := big.NewInt(0).SetString(args[0], 10) - require.True(r, ok) + // parse the withdrawal amount and number of withdrawals + withdrawalAmount := parseBigInt(r, args[0]) require.Equal( r, -1, withdrawalAmount.Cmp(approvedAmount), "Invalid withdrawal amount specified for TestMultipleWithdraws.", ) - - numberOfWithdrawals, ok := big.NewInt(0).SetString(args[1], 10) - require.True(r, ok) + numberOfWithdrawals := parseBigInt(r, args[1]) require.NotEmpty(r, numberOfWithdrawals.Int64()) // calculate total withdrawal to ensure it doesn't exceed approved amount. diff --git a/e2e/e2etests/test_eth_deposit.go b/e2e/e2etests/test_eth_deposit.go index c5f0701516..419dbe2298 100644 --- a/e2e/e2etests/test_eth_deposit.go +++ b/e2e/e2etests/test_eth_deposit.go @@ -1,8 +1,6 @@ package e2etests import ( - "math/big" - "github.com/stretchr/testify/require" "github.com/zeta-chain/zetacore/e2e/runner" @@ -13,8 +11,8 @@ import ( func TestEtherDeposit(r *runner.E2ERunner, args []string) { require.Len(r, args, 1) - amount, ok := big.NewInt(0).SetString(args[0], 10) - require.True(r, ok, "Invalid amount specified for TestEtherDeposit.") + // parse the deposit amount + amount := parseBigInt(r, args[0]) hash := r.DepositEtherWithAmount(amount) // in wei // wait for the cctx to be mined diff --git a/e2e/e2etests/test_eth_deposit_call.go b/e2e/e2etests/test_eth_deposit_call.go index ef4de364a7..9d024e146a 100644 --- a/e2e/e2etests/test_eth_deposit_call.go +++ b/e2e/e2etests/test_eth_deposit_call.go @@ -1,8 +1,6 @@ package e2etests import ( - "math/big" - ethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/stretchr/testify/require" @@ -16,8 +14,8 @@ import ( func TestEtherDepositAndCall(r *runner.E2ERunner, args []string) { require.Len(r, args, 1) - value, ok := big.NewInt(0).SetString(args[0], 10) - require.True(r, ok, "Invalid amount specified for TestEtherDepositAndCall.") + // parse deposit amount + value := parseBigInt(r, args[0]) r.Logger.Info("Deploying example contract") exampleAddr, _, exampleContract, err := testcontract.DeployExample(r.ZEVMAuth, r.ZEVMClient) @@ -90,5 +88,5 @@ func TestEtherDepositAndCall(r *runner.E2ERunner, args []string) { r.Logger.Info("Cross-chain call to reverter reverted") // check the status message contains revert error hash in case of revert - require.Contains(r, cctx.CctxStatus.StatusMessage, utils.ErrHashRevert) + require.Contains(r, cctx.CctxStatus.StatusMessage, utils.ErrHashRevertFoo) } diff --git a/e2e/e2etests/test_eth_deposit_refund.go b/e2e/e2etests/test_eth_deposit_refund.go index 946c457927..343452cdf1 100644 --- a/e2e/e2etests/test_eth_deposit_refund.go +++ b/e2e/e2etests/test_eth_deposit_refund.go @@ -15,8 +15,8 @@ import ( func TestEtherDepositAndCallRefund(r *runner.E2ERunner, args []string) { require.Len(r, args, 1) - value, ok := big.NewInt(0).SetString(args[0], 10) - require.True(r, ok, "Invalid amount specified for TestEtherDepositAndCallRefund.") + // parse the deposit amount + value := parseBigInt(r, args[0]) evmClient := r.EVMClient diff --git a/e2e/e2etests/test_message_passing_evm_to_zevm.go b/e2e/e2etests/test_message_passing_evm_to_zevm.go index 4a7ac7f906..6dfb1b53c2 100644 --- a/e2e/e2etests/test_message_passing_evm_to_zevm.go +++ b/e2e/e2etests/test_message_passing_evm_to_zevm.go @@ -17,8 +17,8 @@ import ( func TestMessagePassingEVMtoZEVM(r *runner.E2ERunner, args []string) { require.Len(r, args, 1) - amount, ok := big.NewInt(0).SetString(args[0], 10) - require.True(r, ok, "Invalid amount specified for TestMessagePassingEVMtoZEVM.") + // parse the amount + amount := parseBigInt(r, args[0]) // Set destination details zEVMChainID, err := r.ZEVMClient.ChainID(r.Ctx) diff --git a/e2e/e2etests/test_message_passing_evm_to_zevm_revert.go b/e2e/e2etests/test_message_passing_evm_to_zevm_revert.go index 85aca0caae..8d5a1e9469 100644 --- a/e2e/e2etests/test_message_passing_evm_to_zevm_revert.go +++ b/e2e/e2etests/test_message_passing_evm_to_zevm_revert.go @@ -22,8 +22,8 @@ func TestMessagePassingEVMtoZEVMRevert(r *runner.E2ERunner, args []string) { fungibleEthAddress := ethcommon.HexToAddress(fungibleModuleAddress) require.True(r, fungibleEthAddress != ethcommon.Address{}, "invalid fungible module address") - amount, ok := big.NewInt(0).SetString(args[0], 10) - require.True(r, ok) + // parse the amount + amount := parseBigInt(r, args[0]) // Set destination details zEVMChainID, err := r.ZEVMClient.ChainID(r.Ctx) diff --git a/e2e/e2etests/test_message_passing_evm_to_zevm_revert_fail.go b/e2e/e2etests/test_message_passing_evm_to_zevm_revert_fail.go index a767f619ad..271c33e9c8 100644 --- a/e2e/e2etests/test_message_passing_evm_to_zevm_revert_fail.go +++ b/e2e/e2etests/test_message_passing_evm_to_zevm_revert_fail.go @@ -1,8 +1,6 @@ package e2etests import ( - "math/big" - "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/stretchr/testify/require" @@ -15,8 +13,8 @@ import ( func TestMessagePassingEVMtoZEVMRevertFail(r *runner.E2ERunner, args []string) { require.Len(r, args, 1) - amount, ok := big.NewInt(0).SetString(args[0], 10) - require.True(r, ok, "Invalid amount specified for TestMessagePassingEVMtoZEVMRevertFail.") + // parse the amount + amount := parseBigInt(r, args[0]) // Deploying a test contract not containing a logic for reverting the cctx testDappNoRevertEVMAddr, tx, testDappNoRevertEVM, err := testdappnorevert.DeployTestDAppNoRevert( diff --git a/e2e/e2etests/test_message_passing_external_chains.go b/e2e/e2etests/test_message_passing_external_chains.go index 2c2ed65997..5172821450 100644 --- a/e2e/e2etests/test_message_passing_external_chains.go +++ b/e2e/e2etests/test_message_passing_external_chains.go @@ -18,8 +18,8 @@ import ( func TestMessagePassingExternalChains(r *runner.E2ERunner, args []string) { require.Len(r, args, 1) - amount, ok := big.NewInt(0).SetString(args[0], 10) - require.True(r, ok, "Invalid amount specified for TestMessagePassing.") + // parse the amount + amount := parseBigInt(r, args[0]) chainID, err := r.EVMClient.ChainID(r.Ctx) require.NoError(r, err) diff --git a/e2e/e2etests/test_message_passing_external_chains_revert.go b/e2e/e2etests/test_message_passing_external_chains_revert.go index 37146a4c78..0f2f5c1c7b 100644 --- a/e2e/e2etests/test_message_passing_external_chains_revert.go +++ b/e2e/e2etests/test_message_passing_external_chains_revert.go @@ -1,8 +1,6 @@ package e2etests import ( - "math/big" - banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" ethcommon "github.com/ethereum/go-ethereum/common" "github.com/stretchr/testify/require" @@ -19,8 +17,8 @@ import ( func TestMessagePassingRevertSuccessExternalChains(r *runner.E2ERunner, args []string) { require.Len(r, args, 1) - amount, ok := big.NewInt(0).SetString(args[0], 10) - require.True(r, ok) + // parse the amount + amount := parseBigInt(r, args[0]) chainID, err := r.EVMClient.ChainID(r.Ctx) require.NoError(r, err) diff --git a/e2e/e2etests/test_message_passing_external_chains_revert_fail.go b/e2e/e2etests/test_message_passing_external_chains_revert_fail.go index 9cc1ee8d8f..4a10eb83ed 100644 --- a/e2e/e2etests/test_message_passing_external_chains_revert_fail.go +++ b/e2e/e2etests/test_message_passing_external_chains_revert_fail.go @@ -19,8 +19,8 @@ import ( func TestMessagePassingRevertFailExternalChains(r *runner.E2ERunner, args []string) { require.Len(r, args, 1) - amount, ok := big.NewInt(0).SetString(args[0], 10) - require.True(r, ok, "Invalid amount specified for TestMessagePassingRevertFail.") + // parse the amount + amount := parseBigInt(r, args[0]) chainID, err := r.EVMClient.ChainID(r.Ctx) require.NoError(r, err) diff --git a/e2e/e2etests/test_message_passing_zevm_to_evm.go b/e2e/e2etests/test_message_passing_zevm_to_evm.go index dde161f2f9..4e791b57c7 100644 --- a/e2e/e2etests/test_message_passing_zevm_to_evm.go +++ b/e2e/e2etests/test_message_passing_zevm_to_evm.go @@ -16,8 +16,8 @@ import ( func TestMessagePassingZEVMtoEVM(r *runner.E2ERunner, args []string) { require.Len(r, args, 1) - amount, ok := big.NewInt(0).SetString(args[0], 10) - require.True(r, ok, "Invalid amount specified for TestMessagePassingZEVMtoEVM.") + // parse the amount + amount := parseBigInt(r, args[0]) // Set destination details EVMChainID, err := r.EVMClient.ChainID(r.Ctx) diff --git a/e2e/e2etests/test_message_passing_zevm_to_evm_revert.go b/e2e/e2etests/test_message_passing_zevm_to_evm_revert.go index 85f81f0a04..e837c1c05c 100644 --- a/e2e/e2etests/test_message_passing_zevm_to_evm_revert.go +++ b/e2e/e2etests/test_message_passing_zevm_to_evm_revert.go @@ -16,8 +16,8 @@ import ( func TestMessagePassingZEVMtoEVMRevert(r *runner.E2ERunner, args []string) { require.Len(r, args, 1) - amount, ok := big.NewInt(0).SetString(args[0], 10) - require.True(r, ok, "Invalid amount specified for TestMessagePassingZEVMtoEVMRevert.") + // parse the amount + amount := parseBigInt(r, args[0]) // Set destination details EVMChainID, err := r.EVMClient.ChainID(r.Ctx) diff --git a/e2e/e2etests/test_message_passing_zevm_to_evm_revert_fail.go b/e2e/e2etests/test_message_passing_zevm_to_evm_revert_fail.go index cc22db23a3..506bb562cd 100644 --- a/e2e/e2etests/test_message_passing_zevm_to_evm_revert_fail.go +++ b/e2e/e2etests/test_message_passing_zevm_to_evm_revert_fail.go @@ -15,8 +15,8 @@ import ( func TestMessagePassingZEVMtoEVMRevertFail(r *runner.E2ERunner, args []string) { require.Len(r, args, 1) - amount, ok := big.NewInt(0).SetString(args[0], 10) - require.True(r, ok, "Invalid amount specified for TestMessagePassingZEVMtoEVMRevertFail.") + // parse the amount + amount := parseBigInt(r, args[0]) // Deploying a test contract not containing a logic for reverting the cctx testDappNoRevertAddr, tx, testDappNoRevert, err := testdappnorevert.DeployTestDAppNoRevert( diff --git a/e2e/e2etests/test_solana_deposit.go b/e2e/e2etests/test_solana_deposit.go index f5b2378f2c..b1c7622c8c 100644 --- a/e2e/e2etests/test_solana_deposit.go +++ b/e2e/e2etests/test_solana_deposit.go @@ -4,7 +4,6 @@ import ( "math/big" "github.com/ethereum/go-ethereum/accounts/abi/bind" - "github.com/gagliardetto/solana-go" "github.com/stretchr/testify/require" "github.com/zeta-chain/zetacore/e2e/runner" @@ -21,25 +20,14 @@ func TestSolanaDeposit(r *runner.E2ERunner, args []string) { r.Logger.Info("runner balance of SOL before deposit: %d", balanceBefore) // parse deposit amount (in lamports) - // #nosec G115 e2e - always in range - depositAmount := big.NewInt(int64(parseInt(r, args[0]))) + depositAmount := parseBigInt(r, args[0]) - // load deployer private key - privkey, err := solana.PrivateKeyFromBase58(r.Account.SolanaPrivateKey.String()) - require.NoError(r, err) - - // create 'deposit' instruction - instruction := r.CreateDepositInstruction(privkey.PublicKey(), r.EVMAddress(), nil, depositAmount.Uint64()) - - // create and sign the transaction - signedTx := r.CreateSignedTransaction([]solana.Instruction{instruction}, privkey) - - // broadcast the transaction and wait for finalization - sig, out := r.BroadcastTxSync(signedTx) - r.Logger.Info("deposit logs: %v", out.Meta.LogMessages) + // execute the deposit transaction + sig := r.SOLDepositAndCall(nil, r.EVMAddress(), depositAmount, nil) // wait for the cctx to be mined cctx := utils.WaitCctxMinedByInboundHash(r.Ctx, sig.String(), r.CctxClient, r.Logger, r.CctxTimeout) + r.Logger.CCTX(*cctx, "solana_deposit") utils.RequireCCTXStatus(r, cctx, crosschaintypes.CctxStatus_OutboundMined) // get ERC20 SOL balance after deposit diff --git a/e2e/e2etests/test_solana_deposit_call.go b/e2e/e2etests/test_solana_deposit_call.go index 45456be4a3..edb0239af9 100644 --- a/e2e/e2etests/test_solana_deposit_call.go +++ b/e2e/e2etests/test_solana_deposit_call.go @@ -1,9 +1,6 @@ package e2etests import ( - "math/big" - - "github.com/gagliardetto/solana-go" "github.com/stretchr/testify/require" "github.com/zeta-chain/zetacore/e2e/runner" @@ -17,37 +14,22 @@ func TestSolanaDepositAndCall(r *runner.E2ERunner, args []string) { require.Len(r, args, 1) // parse deposit amount (in lamports) - // #nosec G115 e2e - always in range - depositAmount := big.NewInt(int64(parseInt(r, args[0]))) + depositAmount := parseBigInt(r, args[0]) // deploy an example contract in ZEVM contractAddr, _, contract, err := testcontract.DeployExample(r.ZEVMAuth, r.ZEVMClient) require.NoError(r, err) - r.Logger.Info("Example contract deployed at: %s", contractAddr.String()) - // ---------------------------------------- execute the deposit transaction ---------------------------------------- - // load deployer private key - privkey, err := solana.PrivateKeyFromBase58(r.Account.SolanaPrivateKey.String()) - require.NoError(r, err) - - // create 'deposit' instruction + // execute the deposit transaction data := []byte("hello lamports") - instruction := r.CreateDepositInstruction(privkey.PublicKey(), contractAddr, data, depositAmount.Uint64()) - - // create and sign the transaction - signedTx := r.CreateSignedTransaction([]solana.Instruction{instruction}, privkey) - - // broadcast the transaction and wait for finalization - sig, out := r.BroadcastTxSync(signedTx) - r.Logger.Info("deposit logs: %v", out.Meta.LogMessages) + sig := r.SOLDepositAndCall(nil, contractAddr, depositAmount, data) - // ---------------------------------------- verify the cross-chain call -------------------------------------------- // wait for the cctx to be mined cctx := utils.WaitCctxMinedByInboundHash(r.Ctx, sig.String(), r.CctxClient, r.Logger, r.CctxTimeout) + r.Logger.CCTX(*cctx, "solana_deposit_and_call") utils.RequireCCTXStatus(r, cctx, crosschaintypes.CctxStatus_OutboundMined) // check if example contract has been called, bar value should be set to amount utils.MustHaveCalledExampleContract(r, contract, depositAmount) - r.Logger.Info("cross-chain call succeeded") } diff --git a/e2e/e2etests/test_solana_deposit_refund.go b/e2e/e2etests/test_solana_deposit_refund.go index 03af2ea58b..07fe6c64e2 100644 --- a/e2e/e2etests/test_solana_deposit_refund.go +++ b/e2e/e2etests/test_solana_deposit_refund.go @@ -1,9 +1,6 @@ package e2etests import ( - "math/big" - - "github.com/gagliardetto/solana-go" "github.com/stretchr/testify/require" "github.com/zeta-chain/zetacore/e2e/runner" @@ -17,38 +14,23 @@ func TestSolanaDepositAndCallRefund(r *runner.E2ERunner, args []string) { require.Len(r, args, 1) // parse deposit amount (in lamports) - // #nosec G115 e2e - always in range - depositAmount := big.NewInt(int64(parseInt(r, args[0]))) + depositAmount := parseBigInt(r, args[0]) // deploy a reverter contract in ZEVM - r.Logger.Info("Deploying reverter contract") + // TODO: consider removing repeated deployments of reverter contract reverterAddr, _, _, err := testcontract.DeployReverter(r.ZEVMAuth, r.ZEVMClient) require.NoError(r, err) - r.Logger.Info("Reverter contract deployed at: %s", reverterAddr.String()) - // ---------------------------------------- execute the deposit transaction ---------------------------------------- - // load deployer private key - privkey, err := solana.PrivateKeyFromBase58(r.Account.SolanaPrivateKey.String()) - require.NoError(r, err) - - // create 'deposit' instruction + // execute the deposit transaction data := []byte("hello reverter") - instruction := r.CreateDepositInstruction(privkey.PublicKey(), reverterAddr, data, depositAmount.Uint64()) - - // create and sign the transaction - signedTx := r.CreateSignedTransaction([]solana.Instruction{instruction}, privkey) - - // broadcast the transaction and wait for finalization - sig, out := r.BroadcastTxSync(signedTx) - r.Logger.Info("deposit logs: %v", out.Meta.LogMessages) + sig := r.SOLDepositAndCall(nil, reverterAddr, depositAmount, data) - // ---------------------------------------- verify the cross-chain revert -------------------------------------------- // wait for the cctx to be mined cctx := utils.WaitCctxMinedByInboundHash(r.Ctx, sig.String(), r.CctxClient, r.Logger, r.CctxTimeout) + r.Logger.CCTX(*cctx, "solana_deposit_and_refund") utils.RequireCCTXStatus(r, cctx, crosschaintypes.CctxStatus_Reverted) - r.Logger.Info("cross-chain call reverted: %v", cctx.CctxStatus.StatusMessage) // check the status message contains revert error hash in case of revert - require.Contains(r, cctx.CctxStatus.StatusMessage, utils.ErrHashRevert) + require.Contains(r, cctx.CctxStatus.StatusMessage, utils.ErrHashRevertFoo) } diff --git a/e2e/e2etests/test_solana_withdraw.go b/e2e/e2etests/test_solana_withdraw.go index d062570dd3..6ef0354a06 100644 --- a/e2e/e2etests/test_solana_withdraw.go +++ b/e2e/e2etests/test_solana_withdraw.go @@ -20,8 +20,7 @@ func TestSolanaWithdraw(r *runner.E2ERunner, args []string) { // parse withdraw amount (in lamports), approve amount is 1 SOL approvedAmount := new(big.Int).SetUint64(solana.LAMPORTS_PER_SOL) - // #nosec G115 e2e - always in range - withdrawAmount := big.NewInt(int64(parseInt(r, args[0]))) + withdrawAmount := parseBigInt(r, args[0]) require.Equal( r, -1, diff --git a/e2e/e2etests/test_stress_eth_deposit.go b/e2e/e2etests/test_stress_eth_deposit.go index 04ef846889..dc5c51c7e4 100644 --- a/e2e/e2etests/test_stress_eth_deposit.go +++ b/e2e/e2etests/test_stress_eth_deposit.go @@ -2,7 +2,6 @@ package e2etests import ( "fmt" - "math/big" "time" ethcommon "github.com/ethereum/go-ethereum/common" @@ -18,9 +17,8 @@ import ( func TestStressEtherDeposit(r *runner.E2ERunner, args []string) { require.Len(r, args, 2) - depositAmount, ok := big.NewInt(0).SetString(args[0], 10) - require.True(r, ok) - + // parse deposit amount and number of deposits + depositAmount := parseBigInt(r, args[0]) numDeposits := parseInt(r, args[1]) r.Logger.Print("starting stress test of %d deposits", numDeposits) diff --git a/e2e/e2etests/test_stress_eth_withdraw.go b/e2e/e2etests/test_stress_eth_withdraw.go index 2abd036a25..39ff484054 100644 --- a/e2e/e2etests/test_stress_eth_withdraw.go +++ b/e2e/e2etests/test_stress_eth_withdraw.go @@ -19,8 +19,8 @@ import ( func TestStressEtherWithdraw(r *runner.E2ERunner, args []string) { require.Len(r, args, 2) - withdrawalAmount, ok := big.NewInt(0).SetString(args[0], 10) - require.True(r, ok, "Invalid withdrawal amount specified for TestStressEtherWithdraw.") + // parse withdraw amount and number of withdraws + withdrawalAmount := parseBigInt(r, args[0]) numWithdraws, err := strconv.Atoi(args[1]) require.NoError(r, err) diff --git a/e2e/e2etests/test_zeta_deposit.go b/e2e/e2etests/test_zeta_deposit.go index eb8021876d..00b672ee61 100644 --- a/e2e/e2etests/test_zeta_deposit.go +++ b/e2e/e2etests/test_zeta_deposit.go @@ -1,8 +1,6 @@ package e2etests import ( - "math/big" - "github.com/stretchr/testify/require" "github.com/zeta-chain/zetacore/e2e/runner" @@ -12,8 +10,8 @@ import ( func TestZetaDeposit(r *runner.E2ERunner, args []string) { require.Len(r, args, 1) - amount, ok := big.NewInt(0).SetString(args[0], 10) - require.True(r, ok, "Invalid amount specified for TestZetaDeposit.") + // parse deposit amount + amount := parseBigInt(r, args[0]) hash := r.DepositZetaWithAmount(r.EVMAddress(), amount) diff --git a/e2e/e2etests/test_zeta_deposit_new_address.go b/e2e/e2etests/test_zeta_deposit_new_address.go index 047fbd7042..79a1360db9 100644 --- a/e2e/e2etests/test_zeta_deposit_new_address.go +++ b/e2e/e2etests/test_zeta_deposit_new_address.go @@ -1,8 +1,6 @@ package e2etests import ( - "math/big" - "github.com/stretchr/testify/require" "github.com/zeta-chain/zetacore/e2e/runner" @@ -13,8 +11,8 @@ import ( func TestZetaDepositNewAddress(r *runner.E2ERunner, args []string) { require.Len(r, args, 1) - amount, ok := big.NewInt(0).SetString(args[0], 10) - require.True(r, ok) + // parse deposit amount + amount := parseBigInt(r, args[0]) newAddress := sample.EthAddress() hash := r.DepositZetaWithAmount(newAddress, amount) diff --git a/e2e/e2etests/test_zeta_deposit_restricted_address.go b/e2e/e2etests/test_zeta_deposit_restricted_address.go index d525a97d79..d760ccafbd 100644 --- a/e2e/e2etests/test_zeta_deposit_restricted_address.go +++ b/e2e/e2etests/test_zeta_deposit_restricted_address.go @@ -1,8 +1,6 @@ package e2etests import ( - "math/big" - ethcommon "github.com/ethereum/go-ethereum/common" "github.com/stretchr/testify/require" @@ -13,8 +11,8 @@ import ( func TestZetaDepositRestricted(r *runner.E2ERunner, args []string) { require.Len(r, args, 1) - amount, ok := big.NewInt(0).SetString(args[0], 10) - require.True(r, ok, "Invalid amount specified for TestZetaDepositRestricted.") + // parse the deposit amount + amount := parseBigInt(r, args[0]) // Deposit amount to restricted address r.DepositZetaWithAmount(ethcommon.HexToAddress(testutils.RestrictedEVMAddressTest), amount) diff --git a/e2e/e2etests/test_zeta_withdraw.go b/e2e/e2etests/test_zeta_withdraw.go index 25b9d3d34a..7695c28bab 100644 --- a/e2e/e2etests/test_zeta_withdraw.go +++ b/e2e/e2etests/test_zeta_withdraw.go @@ -1,8 +1,6 @@ package e2etests import ( - "math/big" - "github.com/stretchr/testify/require" "github.com/zeta-chain/zetacore/e2e/runner" @@ -13,8 +11,8 @@ import ( func TestZetaWithdraw(r *runner.E2ERunner, args []string) { require.Len(r, args, 1) - amount, ok := big.NewInt(0).SetString(args[0], 10) - require.True(r, ok) + // parse withdraw amount + amount := parseBigInt(r, args[0]) r.DepositAndApproveWZeta(amount) tx := r.WithdrawZeta(amount, true) diff --git a/e2e/e2etests/test_zeta_withdraw_bitcoin_revert.go b/e2e/e2etests/test_zeta_withdraw_bitcoin_revert.go index 3685dccfb3..2e7bc3ee95 100644 --- a/e2e/e2etests/test_zeta_withdraw_bitcoin_revert.go +++ b/e2e/e2etests/test_zeta_withdraw_bitcoin_revert.go @@ -14,8 +14,8 @@ import ( func TestZetaWithdrawBTCRevert(r *runner.E2ERunner, args []string) { require.Len(r, args, 1) - amount, ok := big.NewInt(0).SetString(args[0], 10) - require.True(r, ok) + // parse withdraw amount + amount := parseBigInt(r, args[0]) r.ZEVMAuth.Value = amount tx, err := r.WZeta.Deposit(r.ZEVMAuth) diff --git a/e2e/runner/solana.go b/e2e/runner/solana.go index 4f2bac7b2f..ba6f240279 100644 --- a/e2e/runner/solana.go +++ b/e2e/runner/solana.go @@ -117,6 +117,33 @@ func (r *E2ERunner) BroadcastTxSync(tx *solana.Transaction) (solana.Signature, * return sig, out } +// SOLDepositAndCall deposits an amount of ZRC20 SOL tokens (in lamports) and calls a contract (if data is provided) +func (r *E2ERunner) SOLDepositAndCall( + signerPrivKey *solana.PrivateKey, + receiver ethcommon.Address, + amount *big.Int, + data []byte, +) solana.Signature { + // if signer is not provided, use the runner account as default + if signerPrivKey == nil { + privkey, err := solana.PrivateKeyFromBase58(r.Account.SolanaPrivateKey.String()) + require.NoError(r, err) + signerPrivKey = &privkey + } + + // create 'deposit' instruction + instruction := r.CreateDepositInstruction(signerPrivKey.PublicKey(), receiver, data, amount.Uint64()) + + // create and sign the transaction + signedTx := r.CreateSignedTransaction([]solana.Instruction{instruction}, *signerPrivKey) + + // broadcast the transaction and wait for finalization + sig, out := r.BroadcastTxSync(signedTx) + r.Logger.Info("deposit logs: %v", out.Meta.LogMessages) + + return sig +} + // WithdrawSOLZRC20 withdraws an amount of ZRC20 SOL tokens func (r *E2ERunner) WithdrawSOLZRC20(to solana.PublicKey, amount *big.Int, approveAmount *big.Int) { // approve diff --git a/e2e/utils/contracts.go b/e2e/utils/contracts.go index d08e2aeac8..605e458a22 100644 --- a/e2e/utils/contracts.go +++ b/e2e/utils/contracts.go @@ -10,8 +10,8 @@ import ( ) const ( - // ErrHashRevert is the keccak256 hash of custom error "Foo()" on reverter contract - ErrHashRevert = "0xbfb4ebcf" + // ErrHashRevertFoo is the keccak256 hash of custom error "Foo()" on reverter contract + ErrHashRevertFoo = "0xbfb4ebcf" ) // MustHaveCalledExampleContract checks if the contract has been called correctly diff --git a/x/fungible/keeper/evm_test.go b/x/fungible/keeper/evm_test.go index 7e772caa29..dfb57145e1 100644 --- a/x/fungible/keeper/evm_test.go +++ b/x/fungible/keeper/evm_test.go @@ -576,7 +576,7 @@ func TestKeeper_CallEVMWithData(t *testing.T) { require.True(t, types.IsContractReverted(res, err)) // check reason is included for revert error - require.ErrorContains(t, err, fmt.Sprintf("reason: %s", utils.ErrHashRevert)) + require.ErrorContains(t, err, fmt.Sprintf("reason: %s", utils.ErrHashRevertFoo)) res, err = k.CallEVM( ctx, From 6657ce1808aac41738212344c562506a2b18239b Mon Sep 17 00:00:00 2001 From: lumtis Date: Mon, 19 Aug 2024 09:43:58 +0200 Subject: [PATCH 5/5] go import --- x/fungible/keeper/evm_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/x/fungible/keeper/evm_test.go b/x/fungible/keeper/evm_test.go index 4c0c88bc5c..cd45aa8cc1 100644 --- a/x/fungible/keeper/evm_test.go +++ b/x/fungible/keeper/evm_test.go @@ -3,8 +3,6 @@ package keeper_test import ( "encoding/json" "fmt" - "github.com/zeta-chain/protocol-contracts/v2/pkg/erc1967proxy.sol" - "github.com/zeta-chain/protocol-contracts/v2/pkg/gatewayzevm.sol" "math/big" "testing" @@ -17,6 +15,8 @@ import ( "github.com/stretchr/testify/require" "github.com/zeta-chain/protocol-contracts/v1/pkg/contracts/zevm/systemcontract.sol" "github.com/zeta-chain/protocol-contracts/v1/pkg/contracts/zevm/wzeta.sol" + "github.com/zeta-chain/protocol-contracts/v2/pkg/erc1967proxy.sol" + "github.com/zeta-chain/protocol-contracts/v2/pkg/gatewayzevm.sol" "github.com/zeta-chain/protocol-contracts/v2/pkg/zrc20.sol" "github.com/zeta-chain/zetacore/e2e/utils"