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

refactor: disable precompiles #3048

Merged
merged 4 commits into from
Oct 28, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
10 changes: 5 additions & 5 deletions cmd/zetae2e/local/local.go
Original file line number Diff line number Diff line change
Expand Up @@ -332,14 +332,14 @@ func localE2ETest(cmd *cobra.Command, _ []string) {

if !skipPrecompiles {
precompiledContractTests = []string{
e2etests.TestPrecompilesPrototypeName,
e2etests.TestPrecompilesPrototypeThroughContractName,
e2etests.TestPrecompilesStakingName,
//e2etests.TestPrecompilesPrototypeName,
//e2etests.TestPrecompilesPrototypeThroughContractName,
//e2etests.TestPrecompilesStakingName,
// Disabled until further notice, check https://github.com/zeta-chain/node/issues/3005.
// e2etests.TestPrecompilesStakingThroughContractName,
e2etests.TestPrecompilesBankName,
e2etests.TestPrecompilesBankFailName,
e2etests.TestPrecompilesBankThroughContractName,
//e2etests.TestPrecompilesBankFailName,
//e2etests.TestPrecompilesBankThroughContractName,
}
}

Expand Down
238 changes: 131 additions & 107 deletions e2e/e2etests/test_precompiles_bank.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,8 @@ func TestPrecompilesBank(r *runner.E2ERunner, args []string) {

totalAmount := big.NewInt(1e3)
depositAmount := big.NewInt(500)
higherBalanceAmount := big.NewInt(1001)
higherAllowanceAmount := big.NewInt(501)
//higherBalanceAmount := big.NewInt(1001)
//higherAllowanceAmount := big.NewInt(501)
spender := r.EVMAddress()
bankAddress := bank.ContractAddress

Expand Down Expand Up @@ -55,98 +55,116 @@ func TestPrecompilesBank(r *runner.E2ERunner, args []string) {
require.NoError(r, err, "Failed to create bank contract caller")

// Cosmos coin balance should be 0 at this point.
cosmosBalance, err := bankContract.BalanceOf(&bind.CallOpts{Context: r.Ctx}, r.ERC20ZRC20Addr, spender)
require.NoError(r, err, "Call bank.BalanceOf()")
require.Equal(r, uint64(0), cosmosBalance.Uint64(), "spender cosmos coin balance should be 0")

// Approve allowance of 500 ERC20ZRC20 tokens for the bank contract. Should pass.
tx, err := r.ERC20ZRC20.Approve(r.ZEVMAuth, bankAddress, depositAmount)
require.NoError(r, err)
receipt := utils.MustWaitForTxReceipt(r.Ctx, r.ZEVMClient, tx, r.Logger, r.ReceiptTimeout)
utils.RequireTxSuccessful(r, receipt, "Approve ETHZRC20 bank allowance tx failed")

// Deposit 501 ERC20ZRC20 tokens to the bank contract.
// It's higher than allowance but lower than balance, should fail.
tx, err = bankContract.Deposit(r.ZEVMAuth, r.ERC20ZRC20Addr, higherAllowanceAmount)
require.NoError(r, err, "Call bank.Deposit() with amout higher than allowance")
receipt = utils.MustWaitForTxReceipt(r.Ctx, r.ZEVMClient, tx, r.Logger, r.ReceiptTimeout)
utils.RequiredTxFailed(r, receipt, "Depositting an amount higher than allowed should fail")

_, err = bankContract.BalanceOf(&bind.CallOpts{Context: r.Ctx}, r.ERC20ZRC20Addr, spender)
require.Error(r, err)

//require.NoError(r, err, "Call bank.BalanceOf()")
//require.Equal(r, uint64(0), cosmosBalance.Uint64(), "spender cosmos coin balance should be 0")

//// Approve allowance of 500 ERC20ZRC20 tokens for the bank contract. Should pass.
//tx, err := r.ERC20ZRC20.Approve(r.ZEVMAuth, bankAddress, depositAmount)
//require.NoError(r, err)
//receipt := utils.MustWaitForTxReceipt(r.Ctx, r.ZEVMClient, tx, r.Logger, r.ReceiptTimeout)
//utils.RequireTxSuccessful(r, receipt, "Approve ETHZRC20 bank allowance tx failed")
//
//// Deposit 501 ERC20ZRC20 tokens to the bank contract.
//// It's higher than allowance but lower than balance, should fail.
//tx, err = bankContract.Deposit(r.ZEVMAuth, r.ERC20ZRC20Addr, higherAllowanceAmount)
//require.NoError(r, err)
//receipt = utils.MustWaitForTxReceipt(r.Ctx, r.ZEVMClient, tx, r.Logger, r.ReceiptTimeout)
//utils.RequiredTxFailed(r, receipt)
//
//// disabled
//require.NoError(r, err, "Call bank.Deposit() with amout higher than allowance")
//receipt = utils.MustWaitForTxReceipt(r.Ctx, r.ZEVMClient, tx, r.Logger, r.ReceiptTimeout)
//utils.RequiredTxFailed(r, receipt, "Depositting an amount higher than allowed should fail")
//
// Approve allowance of 1000 ERC20ZRC20 tokens.
tx, err = r.ERC20ZRC20.Approve(r.ZEVMAuth, bankAddress, big.NewInt(1e3))
tx, err := r.ERC20ZRC20.Approve(r.ZEVMAuth, bankAddress, big.NewInt(1e3))
require.NoError(r, err)
receipt = utils.MustWaitForTxReceipt(r.Ctx, r.ZEVMClient, tx, r.Logger, r.ReceiptTimeout)
receipt := utils.MustWaitForTxReceipt(r.Ctx, r.ZEVMClient, tx, r.Logger, r.ReceiptTimeout)
utils.RequireTxSuccessful(r, receipt, "Approve ETHZRC20 bank allowance tx failed")

// Deposit 1001 ERC20ZRC20 tokens to the bank contract.
// It's higher than spender balance but within approved allowance, should fail.
tx, err = bankContract.Deposit(r.ZEVMAuth, r.ERC20ZRC20Addr, higherBalanceAmount)
require.NoError(r, err, "Call bank.Deposit() with amout higher than balance")
receipt = utils.MustWaitForTxReceipt(r.Ctx, r.ZEVMClient, tx, r.Logger, r.ReceiptTimeout)
utils.RequiredTxFailed(r, receipt, "Depositting an amount higher than balance should fail")
//
//// Deposit 1001 ERC20ZRC20 tokens to the bank contract.
//// It's higher than spender balance but within approved allowance, should fail.
//tx, err = bankContract.Deposit(r.ZEVMAuth, r.ERC20ZRC20Addr, higherBalanceAmount)
//require.NoError(r, err, "Call bank.Deposit() with amout higher than balance")
//receipt = utils.MustWaitForTxReceipt(r.Ctx, r.ZEVMClient, tx, r.Logger, r.ReceiptTimeout)
//utils.RequiredTxFailed(r, receipt, "Depositting an amount higher than balance should fail")

// Deposit 500 ERC20ZRC20 tokens to the bank contract. Should pass.
tx, err = bankContract.Deposit(r.ZEVMAuth, r.ERC20ZRC20Addr, depositAmount)
require.NoError(r, err, "Call bank.Deposit() with correct amount")
receipt = utils.MustWaitForTxReceipt(r.Ctx, r.ZEVMClient, tx, r.Logger, r.ReceiptTimeout)
utils.RequireTxSuccessful(r, receipt, "Depositting a correct amount should pass")
utils.RequireTxSuccessful(r, receipt, "Depositing a correct amount should not fail")

// Check the deposit event.
eventDeposit, err := bankContract.ParseDeposit(*receipt.Logs[0])
require.NoError(r, err, "Parse Deposit event")
require.Equal(r, r.EVMAddress(), eventDeposit.Zrc20Depositor, "Deposit event token should be r.EVMAddress()")
require.Equal(r, r.ERC20ZRC20Addr, eventDeposit.Zrc20Token, "Deposit event token should be ERC20ZRC20Addr")
require.Equal(r, depositAmount, eventDeposit.Amount, "Deposit event amount should be 500")
// Temporary while bank is disabled.
require.Empty(r, receipt.Logs, "No logs should be emitted")

// Spender: cosmos coin balance should be 500 at this point.
cosmosBalance, err = bankContract.BalanceOf(&bind.CallOpts{Context: r.Ctx}, r.ERC20ZRC20Addr, spender)
require.NoError(r, err, "Call bank.BalanceOf()")
require.Equal(r, uint64(500), cosmosBalance.Uint64(), "spender cosmos coin balance should be 500")
// Check the deposit event.
// Temporary: bank is disabled so no events should have been emitted.
// eventDeposit, err = bankContract.ParseDeposit(*receipt.Logs[0])
// require.NoError(r, err, "Parse Deposit event")
// require.Equal(r, r.EVMAddress(), eventDeposit.Zrc20Depositor, "Deposit event token should be r.EVMAddress()")
// require.Equal(r, r.ERC20ZRC20Addr, eventDeposit.Zrc20Token, "Deposit event token should be ERC20ZRC20Addr")
// require.Equal(r, depositAmount, eventDeposit.Amount, "Deposit event amount should be 500")
//
//// Spender: cosmos coin balance should be 500 at this point.
// cosmosBalance, err := bankContract.BalanceOf(&bind.CallOpts{Context: r.Ctx}, r.ERC20ZRC20Addr, spender)
// require.NoError(r, err, "Call bank.BalanceOf()")
// require.Equal(r, uint64(0), cosmosBalance.Uint64(), "spender cosmos coin balance should be 500")

// Bank: ERC20ZRC20 balance should be 500 tokens locked.
bankZRC20Balance, err := r.ERC20ZRC20.BalanceOf(&bind.CallOpts{Context: r.Ctx}, bankAddress)
require.NoError(r, err, "Call ERC20ZRC20.BalanceOf")
require.Equal(r, uint64(500), bankZRC20Balance.Uint64(), "bank ERC20ZRC20 balance should be 500")

// Try to withdraw 501 ERC20ZRC20 tokens. Should fail.
tx, err = bankContract.Withdraw(r.ZEVMAuth, r.ERC20ZRC20Addr, big.NewInt(501))
require.NoError(r, err, "Error calling bank.withdraw()")
receipt = utils.MustWaitForTxReceipt(r.Ctx, r.ZEVMClient, tx, r.Logger, r.ReceiptTimeout)
utils.RequiredTxFailed(r, receipt, "Withdrawing more than cosmos coin balance amount should fail")

// Bank: ERC20ZRC20 balance should be 500 tokens locked after a failed withdraw.
// No tokens should be unlocked with a failed withdraw.
bankZRC20Balance, err = r.ERC20ZRC20.BalanceOf(&bind.CallOpts{Context: r.Ctx}, bankAddress)
require.NoError(r, err, "Call ERC20ZRC20.BalanceOf")
require.Equal(r, uint64(500), bankZRC20Balance.Uint64(), "bank ERC20ZRC20 balance should be 500")

// Try to withdraw 500 ERC20ZRC20 tokens. Should pass.
tx, err = bankContract.Withdraw(r.ZEVMAuth, r.ERC20ZRC20Addr, depositAmount)
require.NoError(r, err, "Error calling bank.withdraw()")
receipt = utils.MustWaitForTxReceipt(r.Ctx, r.ZEVMClient, tx, r.Logger, r.ReceiptTimeout)
utils.RequireTxSuccessful(r, receipt, "Withdraw correct amount should pass")

// Check the withdraw event.
eventWithdraw, err := bankContract.ParseWithdraw(*receipt.Logs[0])
require.NoError(r, err, "Parse Withdraw event")
require.Equal(r, r.EVMAddress(), eventWithdraw.Zrc20Withdrawer, "Withdrawer should be r.EVMAddress()")
require.Equal(r, r.ERC20ZRC20Addr, eventWithdraw.Zrc20Token, "Withdraw event token should be ERC20ZRC20Addr")
require.Equal(r, depositAmount, eventWithdraw.Amount, "Withdraw event amount should be 500")

// Spender: cosmos coin balance should be 0 at this point.
cosmosBalance, err = bankContract.BalanceOf(&bind.CallOpts{Context: r.Ctx}, r.ERC20ZRC20Addr, spender)
require.NoError(r, err, "Call bank.BalanceOf()")
require.Equal(r, uint64(0), cosmosBalance.Uint64(), "spender cosmos coin balance should be 0")

// Spender: ERC20ZRC20 balance should be 1000 at this point.
zrc20Balance, err := r.ERC20ZRC20.BalanceOf(&bind.CallOpts{Context: r.Ctx}, spender)
require.NoError(r, err, "Call bank.BalanceOf()")
require.Equal(r, uint64(1000), zrc20Balance.Uint64(), "spender ERC20ZRC20 balance should be 1000")

// Bank: ERC20ZRC20 balance should be 0 tokens locked.
bankZRC20Balance, err = r.ERC20ZRC20.BalanceOf(&bind.CallOpts{Context: r.Ctx}, bankAddress)
require.NoError(r, err, "Call ERC20ZRC20.BalanceOf")
require.Equal(r, uint64(0), bankZRC20Balance.Uint64(), "bank ERC20ZRC20 balance should be 0")
require.Equal(
r,
uint64(0),
bankZRC20Balance.Uint64(),
"bank ERC20ZRC20 balance should be 0",
) // temporary while bank is disabled.

////Try to withdraw 501 ERC20ZRC20 tokens. Should fail.
//tx, err = bankContract.Withdraw(r.ZEVMAuth, r.ERC20ZRC20Addr, big.NewInt(501))
//require.Error(r, err)
//
//require.NoError(r, err, "Error calling bank.withdraw()")
//receipt = utils.MustWaitForTxReceipt(r.Ctx, r.ZEVMClient, tx, r.Logger, r.ReceiptTimeout)
//utils.RequiredTxFailed(r, receipt, "Withdrawing more than cosmos coin balance amount should fail")
//
//// Bank: ERC20ZRC20 balance should be 500 tokens locked after a failed withdraw.
//// No tokens should be unlocked with a failed withdraw.
//bankZRC20Balance, err = r.ERC20ZRC20.BalanceOf(&bind.CallOpts{Context: r.Ctx}, bankAddress)
//require.NoError(r, err, "Call ERC20ZRC20.BalanceOf")
//require.Equal(r, uint64(500), bankZRC20Balance.Uint64(), "bank ERC20ZRC20 balance should be 500")
//
//// Try to withdraw 500 ERC20ZRC20 tokens. Should pass.
//tx, err = bankContract.Withdraw(r.ZEVMAuth, r.ERC20ZRC20Addr, depositAmount)
//require.NoError(r, err, "Error calling bank.withdraw()")
//receipt = utils.MustWaitForTxReceipt(r.Ctx, r.ZEVMClient, tx, r.Logger, r.ReceiptTimeout)
//utils.RequireTxSuccessful(r, receipt, "Withdraw correct amount should pass")
//
//// Check the withdraw event.
//eventWithdraw, err := bankContract.ParseWithdraw(*receipt.Logs[0])
//require.NoError(r, err, "Parse Withdraw event")
//require.Equal(r, r.EVMAddress(), eventWithdraw.Zrc20Withdrawer, "Withdrawer should be r.EVMAddress()")
//require.Equal(r, r.ERC20ZRC20Addr, eventWithdraw.Zrc20Token, "Withdraw event token should be ERC20ZRC20Addr")
//require.Equal(r, depositAmount, eventWithdraw.Amount, "Withdraw event amount should be 500")
//
//// Spender: cosmos coin balance should be 0 at this point.
//cosmosBalance, err = bankContract.BalanceOf(&bind.CallOpts{Context: r.Ctx}, r.ERC20ZRC20Addr, spender)
//require.NoError(r, err, "Call bank.BalanceOf()")
//require.Equal(r, uint64(0), cosmosBalance.Uint64(), "spender cosmos coin balance should be 0")
//
//// Spender: ERC20ZRC20 balance should be 1000 at this point.
//zrc20Balance, err := r.ERC20ZRC20.BalanceOf(&bind.CallOpts{Context: r.Ctx}, spender)
//require.NoError(r, err, "Call bank.BalanceOf()")
//require.Equal(r, uint64(1000), zrc20Balance.Uint64(), "spender ERC20ZRC20 balance should be 1000")
//
//// Bank: ERC20ZRC20 balance should be 0 tokens locked.
//bankZRC20Balance, err = r.ERC20ZRC20.BalanceOf(&bind.CallOpts{Context: r.Ctx}, bankAddress)
//require.NoError(r, err, "Call ERC20ZRC20.BalanceOf")
//require.Equal(r, uint64(0), bankZRC20Balance.Uint64(), "bank ERC20ZRC20 balance should be 0")
}

func TestPrecompilesBankNonZRC20(r *runner.E2ERunner, args []string) {
Expand All @@ -159,7 +177,7 @@ func TestPrecompilesBankNonZRC20(r *runner.E2ERunner, args []string) {
r.ZEVMAuth.GasLimit = previousGasLimit
}()

spender, bankAddress := r.EVMAddress(), bank.ContractAddress
spender, _ := r.EVMAddress(), bank.ContractAddress

// Create a bank contract caller.
bankContract, err := bank.NewIBank(bank.ContractAddress, r.ZEVMClient)
Expand All @@ -171,34 +189,40 @@ func TestPrecompilesBankNonZRC20(r *runner.E2ERunner, args []string) {

// Non ZRC20 balanceOf check should fail.
_, err = bankContract.BalanceOf(&bind.CallOpts{Context: r.Ctx}, r.WZetaAddr, spender)
require.Error(r, err, "bank.balanceOf() should error out when checking for non ZRC20 balance")
require.Contains(
r,
err.Error(),
"invalid token 0x5F0b1a82749cb4E2278EC87F8BF6B618dC71a8bf: token is not a whitelisted ZRC20",
"Error should be 'token is not a whitelisted ZRC20'",
)

// Allow the bank contract to spend 25 WZeta tokens.
tx, err := r.WZeta.Approve(r.ZEVMAuth, bankAddress, big.NewInt(25))
require.NoError(r, err, "Error approving allowance for bank contract")
receipt := utils.MustWaitForTxReceipt(r.Ctx, r.ZEVMClient, tx, r.Logger, r.ReceiptTimeout)
require.EqualValues(r, uint64(1), receipt.Status, "approve allowance tx failed")

// Check the allowance of the bank in WZeta tokens. Should be 25.
allowance, err := r.WZeta.Allowance(&bind.CallOpts{Context: r.Ctx}, spender, bankAddress)
require.NoError(r, err, "Error retrieving bank allowance")
require.EqualValues(r, uint64(25), allowance.Uint64(), "Error allowance for bank contract")
require.Error(r, err)

//require.Error(r, err, "bank.balanceOf() should error out when checking for non ZRC20 balance")
//require.Contains(
// r,
// err.Error(),
// "invalid token 0x5F0b1a82749cb4E2278EC87F8BF6B618dC71a8bf: token is not a whitelisted ZRC20",
// "Error should be 'token is not a whitelisted ZRC20'",
//)

//// Allow the bank contract to spend 25 WZeta tokens.
//tx, err := r.WZeta.Approve(r.ZEVMAuth, bankAddress, big.NewInt(25))
//require.NoError(r, err, "Error approving allowance for bank contract")
//receipt := utils.MustWaitForTxReceipt(r.Ctx, r.ZEVMClient, tx, r.Logger, r.ReceiptTimeout)
//require.EqualValues(r, uint64(1), receipt.Status, "approve allowance tx failed")
//
//// Check the allowance of the bank in WZeta tokens. Should be 25.
//allowance, err := r.WZeta.Allowance(&bind.CallOpts{Context: r.Ctx}, spender, bankAddress)
//require.NoError(r, err, "Error retrieving bank allowance")
//require.EqualValues(r, uint64(25), allowance.Uint64(), "Error allowance for bank contract")

// Call Deposit with 25 Non ZRC20 tokens. Should fail.
tx, err = bankContract.Deposit(r.ZEVMAuth, r.WZetaAddr, big.NewInt(25))
require.NoError(r, err, "Error calling bank.deposit()")
receipt = utils.MustWaitForTxReceipt(r.Ctx, r.ZEVMClient, tx, r.Logger, r.ReceiptTimeout)
require.Equal(r, uint64(0), receipt.Status, "Non ZRC20 deposit should fail")
_, err = bankContract.Deposit(r.ZEVMAuth, r.WZetaAddr, big.NewInt(25))
require.Error(r, err)

//require.NoError(r, err, "Error calling bank.deposit()")
//receipt = utils.MustWaitForTxReceipt(r.Ctx, r.ZEVMClient, tx, r.Logger, r.ReceiptTimeout)
//require.Equal(r, uint64(0), receipt.Status, "Non ZRC20 deposit should fail")

// Call Withdraw with 25 on ZRC20 tokens. Should fail.
tx, err = bankContract.Withdraw(r.ZEVMAuth, r.WZetaAddr, big.NewInt(25))
require.NoError(r, err, "Error calling bank.withdraw()")
receipt = utils.MustWaitForTxReceipt(r.Ctx, r.ZEVMClient, tx, r.Logger, r.ReceiptTimeout)
require.Equal(r, uint64(0), receipt.Status, "Non ZRC20 withdraw should fail")
_, err = bankContract.Withdraw(r.ZEVMAuth, r.WZetaAddr, big.NewInt(25))
require.Error(r, err)

//require.NoError(r, err, "Error calling bank.withdraw()")
//receipt = utils.MustWaitForTxReceipt(r.Ctx, r.ZEVMClient, tx, r.Logger, r.ReceiptTimeout)
//require.Equal(r, uint64(0), receipt.Status, "Non ZRC20 withdraw should fail")
}
6 changes: 3 additions & 3 deletions precompiles/precompiles.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,9 +21,9 @@ import (
// This is useful for listing and reading from other packages, such as BlockedAddrs() function.
// Setting to false a contract here will disable it, not being included in the blockchain.
var EnabledStatefulContracts = map[common.Address]bool{
prototype.ContractAddress: true,
staking.ContractAddress: true,
bank.ContractAddress: true,
prototype.ContractAddress: false,
staking.ContractAddress: false,
bank.ContractAddress: false,
}

// StatefulContracts returns all the registered precompiled contracts.
Expand Down
Loading