Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: zevm message passing #2034

Merged
merged 33 commits into from
Apr 19, 2024
Merged
Show file tree
Hide file tree
Changes from 10 commits
Commits
Show all changes
33 commits
Select commit Hold shift + click to select a range
bdc0902
add evm unit tests
kingpinXD Apr 9, 2024
bb9e2da
add unit tests for ZevmOnReceive and ZevmOnRevert
kingpinXD Apr 9, 2024
5442c3c
add unit tests for reverts
kingpinXD Apr 10, 2024
63687c0
changes to evm deposti
kingpinXD Apr 10, 2024
ef33edc
refactor call to use connector for deposit to contract
kingpinXD Apr 11, 2024
a3549bc
fix unit tests for ZEVMdeposit
kingpinXD Apr 11, 2024
1e3bd71
add unit tests for revert
kingpinXD Apr 11, 2024
ce24f6f
add todo for message encoding and decoding
kingpinXD Apr 15, 2024
b1678ec
add base54 encoding and decoding
kingpinXD Apr 15, 2024
8878984
add e2e test for revert
kingpinXD Apr 15, 2024
a7623fc
add e2e test for revert
kingpinXD Apr 16, 2024
1b81398
add e2e test for revert
kingpinXD Apr 16, 2024
0a36524
add debugging for issue
kingpinXD Apr 17, 2024
d16f239
add logs
kingpinXD Apr 17, 2024
c7d66e1
add refund for gas meter
kingpinXD Apr 17, 2024
a46ca10
increase gas limit to 400000 for msg passing
kingpinXD Apr 17, 2024
a620311
add zEVM to EVM messages
kingpinXD Apr 18, 2024
ba8fd85
add tests for onRevert
kingpinXD Apr 18, 2024
534a538
fix unit tests
kingpinXD Apr 18, 2024
7da933b
fix unit tests
kingpinXD Apr 18, 2024
f490018
add comments
kingpinXD Apr 19, 2024
5571598
rebase develop
kingpinXD Apr 19, 2024
704e507
add changelog
kingpinXD Apr 19, 2024
53e56f7
Fix the error in execution
lumtis Apr 19, 2024
a426a91
Update testutil/contracts/Dapp.sol
kingpinXD Apr 19, 2024
ca1c113
fixed logs and resolved comments 1
kingpinXD Apr 19, 2024
d895bb4
Merge remote-tracking branch 'origin/zevm-message-passing' into zevm-…
kingpinXD Apr 19, 2024
274cfc2
move end to end tests to zeta advanced tests
kingpinXD Apr 19, 2024
9b5be21
move end to end tests to zeta advanced tests
kingpinXD Apr 19, 2024
9f684b6
revert a cctx instead of aborting when message decode fails
kingpinXD Apr 19, 2024
aee2916
separate processing for ZEVM orginating and non ZEVM originating txs …
kingpinXD Apr 19, 2024
ff90f37
fix lint issues
kingpinXD Apr 19, 2024
ee8142e
Merge branch 'develop' into zevm-message-passing
kingpinXD Apr 19, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion cmd/zetae2e/config/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -104,7 +104,7 @@ func ExportContractsFromRunner(r *runner.E2ERunner, conf config.Config) config.C
conf.Contracts.ZEVM.WZetaAddr = r.WZetaAddr.Hex()
conf.Contracts.ZEVM.ZEVMSwapAppAddr = r.ZEVMSwapAppAddr.Hex()
conf.Contracts.ZEVM.ContextAppAddr = r.ContextAppAddr.Hex()
conf.Contracts.ZEVM.TestDappAddr = r.TestDAppAddr.Hex()
conf.Contracts.ZEVM.TestDappAddr = r.EvmTestDAppAddr.Hex()

return conf
}
4 changes: 2 additions & 2 deletions cmd/zetae2e/config/contracts.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,9 @@ import (
"github.com/zeta-chain/protocol-contracts/pkg/contracts/evm/erc20custody.sol"
zetaeth "github.com/zeta-chain/protocol-contracts/pkg/contracts/evm/zeta.eth.sol"
zetaconnectoreth "github.com/zeta-chain/protocol-contracts/pkg/contracts/evm/zetaconnector.eth.sol"
"github.com/zeta-chain/protocol-contracts/pkg/contracts/zevm/connectorzevm.sol"
"github.com/zeta-chain/protocol-contracts/pkg/contracts/zevm/systemcontract.sol"
"github.com/zeta-chain/protocol-contracts/pkg/contracts/zevm/wzeta.sol"
connectorzevm "github.com/zeta-chain/protocol-contracts/pkg/contracts/zevm/zetaconnectorzevm.sol"
"github.com/zeta-chain/protocol-contracts/pkg/contracts/zevm/zrc20.sol"
"github.com/zeta-chain/protocol-contracts/pkg/uniswap/v2-core/contracts/uniswapv2factory.sol"
uniswapv2router "github.com/zeta-chain/protocol-contracts/pkg/uniswap/v2-periphery/contracts/uniswapv2router02.sol"
Expand Down Expand Up @@ -181,7 +181,7 @@ func setContractsFromConfig(r *runner.E2ERunner, conf config.Config) error {
if !ethcommon.IsHexAddress(c) {
return fmt.Errorf("invalid TestDappAddr: %s", c)
}
r.TestDAppAddr = ethcommon.HexToAddress(c)
r.EvmTestDAppAddr = ethcommon.HexToAddress(c)
}

return nil
Expand Down
2 changes: 2 additions & 0 deletions cmd/zetae2e/local/local.go
Original file line number Diff line number Diff line change
Expand Up @@ -241,6 +241,8 @@ func localE2ETest(cmd *cobra.Command, _ []string) {
e2etests.TestERC20DepositRestrictedName,
}
zetaTests := []string{
e2etests.TestMessagePassingZEVMName,
e2etests.TestMessagePassingZEVMRevertName,
e2etests.TestZetaWithdrawName,
e2etests.TestMessagePassingName,
e2etests.TestMessagePassingRevertFailName,
Expand Down
26 changes: 26 additions & 0 deletions e2e/e2etests/e2etests.go
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,8 @@ const (
TestCrosschainSwapName = "crosschain_swap"
TestMessagePassingRevertFailName = "message_passing_revert_fail"
TestMessagePassingRevertSuccessName = "message_passing_revert_success"
TestMessagePassingZEVMName = "message_passing_zevm"
TestMessagePassingZEVMRevertName = "message_passing_revert_zevm"
TestERC20DepositAndCallRefundName = "erc20_deposit_and_call_refund"
TestEtherDepositAndCallName = "eth_deposit_and_call"
TestDepositEtherLiquidityCapName = "deposit_eth_liquidity_cap"
Expand Down Expand Up @@ -211,6 +213,30 @@ var AllE2ETests = []runner.E2ETest{
},
TestMessagePassingRevertSuccess,
),
runner.NewE2ETest(
TestMessagePassingZEVMName,
"evm -> zevm message passing contract call ",
[]runner.ArgDefinition{
runner.ArgDefinition{Description: "amount in azeta", DefaultValue: "10000000000000000000"},
},
TestMessagePassingZEVM,
),
runner.NewE2ETest(
TestMessagePassingZEVMRevertName,
"evm -> zevm message passing and revert back to evm",
[]runner.ArgDefinition{
runner.ArgDefinition{Description: "amount in azeta", DefaultValue: "10000000000000000000"},
},
TestMessagePassingZEVMRevert,
),
runner.NewE2ETest(
kingpinXD marked this conversation as resolved.
Show resolved Hide resolved
TestMessagePassingName,
"evm->evm message passing contract call",
[]runner.ArgDefinition{
runner.ArgDefinition{Description: "amount in azeta", DefaultValue: "10000000000000000000"},
},
TestMessagePassing,
),
runner.NewE2ETest(
TestPauseZRC20Name,
"pausing ZRC20 on ZetaChain",
Expand Down
8 changes: 4 additions & 4 deletions e2e/e2etests/test_message_passing.go
Original file line number Diff line number Diff line change
Expand Up @@ -190,7 +190,7 @@ func TestMessagePassingRevertSuccess(r *runner.E2ERunner, args []string) {

auth := r.EVMAuth

tx, err := r.ZetaEth.Approve(auth, r.TestDAppAddr, amount)
tx, err := r.ZetaEth.Approve(auth, r.EvmTestDAppAddr, amount)
if err != nil {
panic(err)
}
Expand All @@ -202,8 +202,8 @@ func TestMessagePassingRevertSuccess(r *runner.E2ERunner, args []string) {
}
r.Logger.Info("Approve tx receipt: %d", receipt.Status)

r.Logger.Info("Calling TestDApp.SendHello on contract address %s", r.TestDAppAddr.Hex())
testDApp, err := testdapp.NewTestDApp(r.TestDAppAddr, r.EVMClient)
r.Logger.Info("Calling TestDApp.SendHello on contract address %s", r.EvmTestDAppAddr.Hex())
testDApp, err := testdapp.NewTestDApp(r.EvmTestDAppAddr, r.EVMClient)
if err != nil {
panic(err)
}
Expand All @@ -216,7 +216,7 @@ func TestMessagePassingRevertSuccess(r *runner.E2ERunner, args []string) {
}
r.Logger.Info("$$$ Before: SUPPLY OF AZETA: %d", res2.Amount.Amount)

tx, err = testDApp.SendHelloWorld(auth, r.TestDAppAddr, chainID, amount, true)
tx, err = testDApp.SendHelloWorld(auth, r.EvmTestDAppAddr, chainID, amount, true)
if err != nil {
panic(err)
}
Expand Down
116 changes: 116 additions & 0 deletions e2e/e2etests/test_message_passing_zevm.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,116 @@
package e2etests

import (
"fmt"
"math/big"

"github.com/zeta-chain/zetacore/e2e/contracts/testdapp"
"github.com/zeta-chain/zetacore/e2e/runner"
"github.com/zeta-chain/zetacore/e2e/utils"
cctxtypes "github.com/zeta-chain/zetacore/x/crosschain/types"
kingpinXD marked this conversation as resolved.
Show resolved Hide resolved
)

func TestMessagePassingZEVM(r *runner.E2ERunner, args []string) {
if len(args) != 1 {
panic("TestMessagePassing requires exactly one argument for the amount.")
}

amount, ok := big.NewInt(0).SetString(args[0], 10)
if !ok {
panic("Invalid amount specified for TestMessagePassing.")
}

zEVMChainID, err := r.ZEVMClient.ChainID(r.Ctx)
if err != nil {
panic(err)
}
destinationAddress := r.ZevmTestDAppAddr
lumtis marked this conversation as resolved.
Show resolved Hide resolved

//Use TestDapp to call the Send function on the EVM connector to create a message
auth := r.EVMAuth
kingpinXD marked this conversation as resolved.
Show resolved Hide resolved

tx, err := r.ZetaEth.Approve(auth, r.EvmTestDAppAddr, amount)
if err != nil {
panic(err)
}
r.Logger.Info("Approve tx hash: %s", tx.Hash().Hex())

receipt := utils.MustWaitForTxReceipt(r.Ctx, r.EVMClient, tx, r.Logger, r.ReceiptTimeout)
if receipt.Status != 1 {
panic("tx failed")
kingpinXD marked this conversation as resolved.
Show resolved Hide resolved
}
r.Logger.Info("Approve tx receipt: %d", receipt.Status)

testDAppEVM, err := testdapp.NewTestDApp(r.EvmTestDAppAddr, r.EVMClient)
if err != nil {
panic(err)
}

tx, err = testDAppEVM.SendHelloWorld(auth, destinationAddress, zEVMChainID, amount, false)
if err != nil {
panic(err)
}
r.Logger.Info("TestDApp.SendHello tx hash: %s", tx.Hash().Hex())
receipt = utils.MustWaitForTxReceipt(r.Ctx, r.EVMClient, tx, r.Logger, r.ReceiptTimeout)

// New inbound message picked up by zeta-clients and voted on by observers to initiate a contract call on zEVM
cctx := utils.WaitCctxMinedByInTxHash(r.Ctx, receipt.TxHash.String(), r.CctxClient, r.Logger, r.CctxTimeout)
if cctx.CctxStatus.Status != cctxtypes.CctxStatus_OutboundMined {
panic("expected cctx to be outbound_mined")
}
r.Logger.Print(fmt.Sprintf("🔄 Cctx mined for contract call chain zevm %s", cctx.Index))
}

func TestMessagePassingZEVMRevert(r *runner.E2ERunner, args []string) {

if len(args) != 1 {
panic("TestMessagePassingRevert requires exactly one argument for the amount.")
}

amount, ok := big.NewInt(0).SetString(args[0], 10)
if !ok {
panic("Invalid amount specified for TestMessagePassingRevert.")
}

zEVMChainID, err := r.ZEVMClient.ChainID(r.Ctx)
if err != nil {
panic(err)
}
destinationAddress := r.ZevmTestDAppAddr

//Use TestDapp to call the Send function on the EVM connector to create a message
auth := r.EVMAuth

tx, err := r.ZetaEth.Approve(auth, r.EvmTestDAppAddr, amount)
if err != nil {
panic(err)
}
r.Logger.Info("Approve tx hash: %s", tx.Hash().Hex())

receipt := utils.MustWaitForTxReceipt(r.Ctx, r.EVMClient, tx, r.Logger, r.ReceiptTimeout)
if receipt.Status != 1 {
panic("tx failed")
}
r.Logger.Info("Approve tx receipt: %d", receipt.Status)

testDAppEVM, err := testdapp.NewTestDApp(r.EvmTestDAppAddr, r.EVMClient)
if err != nil {
panic(err)
}

tx, err = testDAppEVM.SendHelloWorld(auth, destinationAddress, zEVMChainID, amount, true)
if err != nil {
panic(err)
}
r.Logger.Info("TestDApp.SendHello tx hash: %s", tx.Hash().Hex())
receipt = utils.MustWaitForTxReceipt(r.Ctx, r.EVMClient, tx, r.Logger, r.ReceiptTimeout)

r.Logger.Print(fmt.Sprintf("🔄 Revert tx intx : %d", receipt.TxHash.String()))

Check failure on line 108 in e2e/e2etests/test_message_passing_zevm.go

View workflow job for this annotation

GitHub Actions / lint

printf: fmt.Sprintf format %d has arg receipt.TxHash.String() of wrong type string (govet)

Check failure on line 108 in e2e/e2etests/test_message_passing_zevm.go

View workflow job for this annotation

GitHub Actions / build-and-test

fmt.Sprintf format %d has arg receipt.TxHash.String() of wrong type string

Check failure on line 108 in e2e/e2etests/test_message_passing_zevm.go

View workflow job for this annotation

GitHub Actions / build-and-test

fmt.Sprintf format %d has arg receipt.TxHash.String() of wrong type string

// New inbound message picked up by zeta-clients and voted on by observers to initiate a contract call on zEVM
cctx := utils.WaitCctxMinedByInTxHash(r.Ctx, receipt.TxHash.String(), r.CctxClient, r.Logger, r.CctxTimeout)
if cctx.CctxStatus.Status != cctxtypes.CctxStatus_Reverted {
panic("expected cctx to be outbound_mined")
}
r.Logger.Print(fmt.Sprintf("🔄 Cctx mined for revert contract call chain zevm %s", cctx.Index))
}
2 changes: 1 addition & 1 deletion e2e/e2etests/test_zeta_withdraw.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import (
"math/big"

ethcommon "github.com/ethereum/go-ethereum/common"
"github.com/zeta-chain/protocol-contracts/pkg/contracts/zevm/connectorzevm.sol"
connectorzevm "github.com/zeta-chain/protocol-contracts/pkg/contracts/zevm/zetaconnectorzevm.sol"
"github.com/zeta-chain/zetacore/e2e/runner"
"github.com/zeta-chain/zetacore/e2e/utils"
"github.com/zeta-chain/zetacore/pkg/chains"
Expand Down
11 changes: 7 additions & 4 deletions e2e/runner/runner.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,9 @@ import (
"github.com/zeta-chain/protocol-contracts/pkg/contracts/evm/erc20custody.sol"
zetaeth "github.com/zeta-chain/protocol-contracts/pkg/contracts/evm/zeta.eth.sol"
zetaconnectoreth "github.com/zeta-chain/protocol-contracts/pkg/contracts/evm/zetaconnector.eth.sol"
"github.com/zeta-chain/protocol-contracts/pkg/contracts/zevm/connectorzevm.sol"
"github.com/zeta-chain/protocol-contracts/pkg/contracts/zevm/systemcontract.sol"
"github.com/zeta-chain/protocol-contracts/pkg/contracts/zevm/wzeta.sol"
connectorzevm "github.com/zeta-chain/protocol-contracts/pkg/contracts/zevm/zetaconnectorzevm.sol"
"github.com/zeta-chain/protocol-contracts/pkg/contracts/zevm/zrc20.sol"
"github.com/zeta-chain/protocol-contracts/pkg/uniswap/v2-core/contracts/uniswapv2factory.sol"
uniswapv2router "github.com/zeta-chain/protocol-contracts/pkg/uniswap/v2-periphery/contracts/uniswapv2router02.sol"
Expand Down Expand Up @@ -71,6 +71,7 @@ type E2ERunner struct {
ERC20Custody *erc20custody.ERC20Custody
ERC20Addr ethcommon.Address
ERC20 *erc20.ERC20
EvmTestDAppAddr ethcommon.Address

// contracts zevm
ERC20ZRC20Addr ethcommon.Address
Expand All @@ -87,13 +88,13 @@ type E2ERunner struct {
ConnectorZEVM *connectorzevm.ZetaConnectorZEVM
WZetaAddr ethcommon.Address
WZeta *wzeta.WETH9
TestDAppAddr ethcommon.Address
ZEVMSwapAppAddr ethcommon.Address
ZEVMSwapApp *zevmswap.ZEVMSwapApp
ContextAppAddr ethcommon.Address
ContextApp *contextapp.ContextApp
SystemContractAddr ethcommon.Address
SystemContract *systemcontract.SystemContract
ZevmTestDAppAddr ethcommon.Address

// config
CctxTimeout time.Duration
Expand Down Expand Up @@ -175,10 +176,11 @@ func (runner *E2ERunner) CopyAddressesFrom(other *E2ERunner) (err error) {
runner.UniswapV2RouterAddr = other.UniswapV2RouterAddr
runner.ConnectorZEVMAddr = other.ConnectorZEVMAddr
runner.WZetaAddr = other.WZetaAddr
runner.TestDAppAddr = other.TestDAppAddr
runner.EvmTestDAppAddr = other.EvmTestDAppAddr
runner.ZEVMSwapAppAddr = other.ZEVMSwapAppAddr
runner.ContextAppAddr = other.ContextAppAddr
runner.SystemContractAddr = other.SystemContractAddr
runner.ZevmTestDAppAddr = other.ZevmTestDAppAddr

// create instances of contracts
runner.ZetaEth, err = zetaeth.NewZetaEth(runner.ZetaEthAddr, runner.EVMClient)
Expand Down Expand Up @@ -268,12 +270,13 @@ func (runner *E2ERunner) PrintContractAddresses() {

runner.Logger.Print("ZEVMSwapApp: %s", runner.ZEVMSwapAppAddr.Hex())
runner.Logger.Print("ContextApp: %s", runner.ContextAppAddr.Hex())
runner.Logger.Print("TestDapp: %s", runner.TestDAppAddr.Hex())
runner.Logger.Print("TestDappZEVM: %s", runner.ZevmTestDAppAddr.Hex())

// evm contracts
runner.Logger.Print(" --- 📜EVM contracts ---")
runner.Logger.Print("ZetaEth: %s", runner.ZetaEthAddr.Hex())
runner.Logger.Print("ConnectorEth: %s", runner.ConnectorEthAddr.Hex())
runner.Logger.Print("ERC20Custody: %s", runner.ERC20CustodyAddr.Hex())
runner.Logger.Print("ERC20: %s", runner.ERC20Addr.Hex())
runner.Logger.Print("TestDappEVM: %s", runner.EvmTestDAppAddr.Hex())
}
2 changes: 1 addition & 1 deletion e2e/runner/setup_evm.go
Original file line number Diff line number Diff line change
Expand Up @@ -131,7 +131,7 @@ func (runner *E2ERunner) SetupEVM(contractsDeployed bool, whitelistERC20 bool) {
if err != nil {
panic(err)
}
runner.TestDAppAddr = appAddr
runner.EvmTestDAppAddr = appAddr
runner.Logger.Info("TestDApp contract address: %s, tx hash: %s", appAddr.Hex(), txApp.Hash().Hex())

// check contract deployment receipt
Expand Down
12 changes: 11 additions & 1 deletion e2e/runner/setup_zeta.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,13 +7,14 @@ import (
"github.com/btcsuite/btcutil"
"github.com/ethereum/go-ethereum/accounts/abi/bind"
ethcommon "github.com/ethereum/go-ethereum/common"
"github.com/zeta-chain/protocol-contracts/pkg/contracts/zevm/connectorzevm.sol"
"github.com/zeta-chain/protocol-contracts/pkg/contracts/zevm/systemcontract.sol"
"github.com/zeta-chain/protocol-contracts/pkg/contracts/zevm/wzeta.sol"
connectorzevm "github.com/zeta-chain/protocol-contracts/pkg/contracts/zevm/zetaconnectorzevm.sol"
"github.com/zeta-chain/protocol-contracts/pkg/contracts/zevm/zrc20.sol"
"github.com/zeta-chain/protocol-contracts/pkg/uniswap/v2-core/contracts/uniswapv2factory.sol"
uniswapv2router "github.com/zeta-chain/protocol-contracts/pkg/uniswap/v2-periphery/contracts/uniswapv2router02.sol"
"github.com/zeta-chain/zetacore/e2e/contracts/contextapp"
"github.com/zeta-chain/zetacore/e2e/contracts/testdapp"
"github.com/zeta-chain/zetacore/e2e/contracts/zevmswap"
"github.com/zeta-chain/zetacore/e2e/txserver"
e2eutils "github.com/zeta-chain/zetacore/e2e/utils"
Expand Down Expand Up @@ -141,6 +142,14 @@ func (runner *E2ERunner) SetZEVMContracts() {
runner.SetupETHZRC20()
runner.SetupBTCZRC20()

// deploy TestDApp contract on zEVM
appAddr, txApp, _, err := testdapp.DeployTestDApp(runner.ZEVMAuth, runner.ZEVMClient, runner.ConnectorZEVMAddr, runner.WZetaAddr)
if err != nil {
panic(err)
}
runner.ZevmTestDAppAddr = appAddr
runner.Logger.Info("TestDApp Zevm contract address: %s, tx hash: %s", appAddr.Hex(), txApp.Hash().Hex())

// deploy ZEVMSwapApp and ContextApp
zevmSwapAppAddr, txZEVMSwapApp, zevmSwapApp, err := zevmswap.DeployZEVMSwapApp(
runner.ZEVMAuth,
Expand Down Expand Up @@ -170,6 +179,7 @@ func (runner *E2ERunner) SetZEVMContracts() {
}
runner.ContextAppAddr = contextAppAddr
runner.ContextApp = contextApp

}

// SetupETHZRC20 sets up the ETH ZRC20 in the runner from the values queried from the chain
Expand Down
Loading
Loading