Skip to content

Commit

Permalink
Call from EVM
Browse files Browse the repository at this point in the history
  • Loading branch information
fadeev committed Oct 3, 2024
1 parent 2f1b130 commit cc57caa
Show file tree
Hide file tree
Showing 9 changed files with 169 additions and 51 deletions.
46 changes: 38 additions & 8 deletions examples/hello/README.md
Original file line number Diff line number Diff line change
@@ -1,15 +1,45 @@
# ZetaChain Contracts Template
# Hello Example

## Getting Started
```
yarn deploy
```

## EVM

Successful call:

```
npx hardhat call-from-evm --contract 0xE6E340D132b5f46d1e472DebcD681B2aBc16e57E --receiver 0x67d269191c92Caf3cD7723F116c85e6E9bf55933 --network localhost --types '["string"]' hello
```

Failed call:

```
npx hardhat call-from-evm --contract 0xE6E340D132b5f46d1e472DebcD681B2aBc16e57E --receiver 0x67d269191c92Caf3cD7723F116c85e6E9bf55933 --network localhost --types '["uint256"]' 42
```

Install dependencies:
Failed call with handled revert:

```
yarn
npx hardhat call-from-evm --contract 0xE6E340D132b5f46d1e472DebcD681B2aBc16e57E --receiver 0x67d269191c92Caf3cD7723F116c85e6E9bf55933 --network localhost --revert-address 0xE6E340D132b5f46d1e472DebcD681B2aBc16e57E --revert-message 0x --call-on-revert --types '["uint256"]' 42
```

## Next Steps
## ZetaChain

Ready to dive in? Follow our [**🚀 smart contract
tutorials**](https://www.zetachain.com/docs/developers/tutorials/intro/) to
start building universal app contracts.
Successful call:

```
npx hardhat call-from-zetachain --contract 0x67d269191c92Caf3cD7723F116c85e6E9bf55933 --receiver 0xE6E340D132b5f46d1e472DebcD681B2aBc16e57E --zrc20 0x2ca7d64A7EFE2D62A725E2B35Cf7230D6677FfEe --function "hello(string)" --network localhost --types '["string"]' hello
```

Failed call:

```
npx hardhat call-from-zetachain --contract 0x67d269191c92Caf3cD7723F116c85e6E9bf55933 --receiver 0xE6E340D132b5f46d1e472DebcD681B2aBc16e57E --zrc20 0x2ca7d64A7EFE2D62A725E2B35Cf7230D6677FfEe --function "hello(string)" --network localhost --types '["uint256"]' 42
```

Failed call with handled revert:

```
npx hardhat call-from-zetachain --contract 0x67d269191c92Caf3cD7723F116c85e6E9bf55933 --receiver 0xE6E340D132b5f46d1e472DebcD681B2aBc16e57E --zrc20 0x2ca7d64A7EFE2D62A725E2B35Cf7230D6677FfEe --function "hello(string)" --network localhost --revert-address 0x67d269191c92Caf3cD7723F116c85e6E9bf55933 --revert-message 0x --call-on-revert --types '["uint256"]' 42
```
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,18 @@
pragma solidity 0.8.26;

import {RevertContext} from "@zetachain/protocol-contracts/contracts/Revert.sol";
import "@zetachain/protocol-contracts/contracts/evm/GatewayEVM.sol";

contract Echo {
GatewayEVM public gateway;

Check warning

Code scanning / Slither

State variables that could be declared immutable Warning

Echo.gateway should be immutable

contract Revert {
event RevertEvent(string, RevertContext);
event HelloEvent(string, string);

constructor(address payable gatewayAddress) {
gateway = GatewayEVM(gatewayAddress);
}

function hello(string memory message) external {
emit HelloEvent("Hello on EVM", message);
}
Expand All @@ -15,6 +22,14 @@ contract Revert {
emit RevertEvent("Revert on EVM", revertContext);
}

function gatewayCall(
address receiver,
bytes calldata message,
RevertOptions memory revertOptions
) external {
gateway.call(receiver, message, revertOptions);
}

receive() external payable {}

fallback() external payable {}
Expand Down
4 changes: 2 additions & 2 deletions examples/hello/hardhat.config.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import "./tasks/deploy";
import "./tasks/deployRevert";
import "./tasks/gatewayCall";
import "./tasks/callFromZetachain";
import "./tasks/callFromEVM";
import "@zetachain/localnet/tasks";
import "@nomicfoundation/hardhat-toolbox";
import "@zetachain/toolkit/tasks";
Expand Down
4 changes: 2 additions & 2 deletions examples/hello/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
"test": "echo \"Error: no test specified\" && exit 1",
"lint:fix": "npx eslint . --ext .js,.ts --fix",
"lint": "npx eslint . --ext .js,.ts",
"deploy": "npx hardhat compile --force && npx hardhat deploy --network localhost && npx hardhat deploy-revert --network localhost"
"deploy": "npx hardhat compile --force && npx hardhat deploy --network localhost && npx hardhat deploy --name Echo --network localhost --gateway 0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0"
},
"keywords": [],
"author": "",
Expand Down Expand Up @@ -59,4 +59,4 @@
"@solana/web3.js": "^1.95.2",
"@zetachain/protocol-contracts": "10.0.0-rc10"
}
}
}
103 changes: 103 additions & 0 deletions examples/hello/tasks/callFromEVM.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,103 @@
import { task, types } from "hardhat/config";
import type { HardhatRuntimeEnvironment } from "hardhat/types";

const main = async (args: any, hre: HardhatRuntimeEnvironment) => {
const { ethers } = hre;
const [signer] = await ethers.getSigners();

const txOptions = {
gasPrice: args.txOptionsGasPrice,
gasLimit: args.txOptionsGasLimit,
};

const revertOptions = {
abortAddress: "0x0000000000000000000000000000000000000000", // not used
callOnRevert: args.callOnRevert,
onRevertGasLimit: args.onRevertGasLimit,
revertAddress: args.revertAddress,
revertMessage: ethers.utils.hexlify(
ethers.utils.toUtf8Bytes(args.revertMessage)
),
};

const types = JSON.parse(args.types);

const valuesArray = args.values.map((value: any, index: number) => {
const type = types[index];

if (type === "bool") {
try {
return JSON.parse(value.toLowerCase());
} catch (e) {
throw new Error(`Invalid boolean value: ${value}`);
}
} else if (type.startsWith("uint") || type.startsWith("int")) {
return ethers.BigNumber.from(value);
} else {
return value;
}
});
const encodedParameters = ethers.utils.defaultAbiCoder.encode(
types,
valuesArray
);

const gasLimit = hre.ethers.BigNumber.from(args.gasLimit);

const factory = (await hre.ethers.getContractFactory(args.name)) as any;
const contract = factory.attach(args.contract);

const tx = await contract.gatewayCall(
args.receiver,
encodedParameters,
revertOptions,
txOptions
);

console.log(`Transaction hash: ${tx.hash}`);
await tx.wait();
console.log("gatewayCall executed successfully");
};

task("call-from-evm", "Calls the gateway on a contract on EVM", main)
.addParam("contract", "The address of the deployed contract")
.addOptionalParam(
"gasLimit",
"Gas limit for for a cross-chain call",
7000000,
types.int
)
.addOptionalParam(
"txOptionsGasPrice",
"The gas price for the transaction",
10000000000,
types.int
)
.addOptionalParam(
"txOptionsGasLimit",
"The gas limit for the transaction",
7000000,
types.int
)
.addFlag("callOnRevert", "Whether to call on revert")
.addOptionalParam(
"revertAddress",
"Revert address",
"0x0000000000000000000000000000000000000000"
)
.addOptionalParam("revertMessage", "Revert message", "0x")
.addParam(
"receiver",
"The address of the receiver contract on a connected chain"
)
.addOptionalParam(
"onRevertGasLimit",
"The gas limit for the revert transaction",
7000000,
types.int
)
.addParam("name", "The name of the contract", "Echo")
.addParam("types", `The types of the parameters (example: '["string"]')`)
.addVariadicPositionalParam("values", "The values of the parameters");

module.exports = {};
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ const main = async (args: any, hre: HardhatRuntimeEnvironment) => {

await zrc20TransferTx.wait();

const factory = await hre.ethers.getContractFactory("Hello");
const factory = (await hre.ethers.getContractFactory(args.name)) as any;
const contract = factory.attach(args.contract);

const tx = await contract.gatewayCall(
Expand All @@ -78,8 +78,8 @@ const main = async (args: any, hre: HardhatRuntimeEnvironment) => {
};

task(
"gateway-call",
"Calls the gatewayCall function on the Hello contract",
"call-from-zetachain",
"Calls the gatewayCall function on a contract on ZetaChain",
main
)
.addParam("contract", "The address of the deployed Hello contract")
Expand Down Expand Up @@ -120,6 +120,7 @@ task(
types.int
)
.addParam("function", `Function to call (example: "hello(string)")`)
.addParam("name", "The name of the contract", "Hello")
.addParam("types", `The types of the parameters (example: '["string"]')`)
.addVariadicPositionalParam("values", "The values of the parameters");

Expand Down
6 changes: 3 additions & 3 deletions examples/hello/tasks/deploy.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ const main = async (args: any, hre: HardhatRuntimeEnvironment) => {
}

const factory = await hre.ethers.getContractFactory(args.name);
const contract = await (factory as any).deploy(args.gatewayZetaChain);
const contract = await (factory as any).deploy(args.gateway);
await contract.deployed();

if (args.json) {
Expand All @@ -30,7 +30,7 @@ task("deploy", "Deploy the contract", main)
.addFlag("json", "Output in JSON")
.addOptionalParam("name", "Contract to deploy", "Hello")
.addOptionalParam(
"gatewayZetaChain",
"Gateway address",
"gateway",
"Gateway address (default: ZetaChain Gateway)",
"0xA51c1fc2f0D1a1b8494Ed1FE312d7C3a78Ed91C0"
);
31 changes: 0 additions & 31 deletions examples/hello/tasks/deployRevert.ts

This file was deleted.

2 changes: 1 addition & 1 deletion examples/swap/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -59,4 +59,4 @@
"@zetachain/protocol-contracts": "10.0.0-rc10",
"@zetachain/toolkit": "13.0.0-rc4"
}
}
}

0 comments on commit cc57caa

Please sign in to comment.