Skip to content

Commit 625e4f6

Browse files
authored
Merge pull request #120 from BootNodeDev/mainnet-demo-core-changes
Mainnet demo core changes
2 parents bc2822a + a4e76ed commit 625e4f6

File tree

78 files changed

+4111
-3172
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

78 files changed

+4111
-3172
lines changed

.gitignore

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,8 @@ web_modules/
7474

7575
# dotenv environment variable files
7676
.env
77+
.env.testnet
78+
.env.mainnet
7779
.env.development.local
7880
.env.test.local
7981
.env.production.local
@@ -133,3 +135,6 @@ dist
133135
.idea
134136
.vscode
135137
.pnotes/
138+
139+
.env
140+
.env.testnet

solidity/README.md

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,8 @@ cases and requirements.
6666
| Gnosis | [`0x9245A985d2055CeA7576B293Da8649bb6C5af9D0`](https://gnosisscan.io/address/0x9245A985d2055CeA7576B293Da8649bb6C5af9D0) | [`0x8f9508C68ED70A7A02A4f8190604a81Ca8D79BEc`](https://gnosisscan.io/address/0x8f9508C68ED70A7A02A4f8190604a81Ca8D79BEc) |
6767
| Berachain | [`0x9245A985d2055CeA7576B293Da8649bb6C5af9D0`](https://berascan.com/address/0x9245A985d2055CeA7576B293Da8649bb6C5af9D0) | [`0x8f9508C68ED70A7A02A4f8190604a81Ca8D79BEc`](https://berascan.com/address/0x8f9508C68ED70A7A02A4f8190604a81Ca8D79BEc) |
6868
| Form | [`0x9245A985d2055CeA7576B293Da8649bb6C5af9D0`](https://explorer.form.network/address/0x9245A985d2055CeA7576B293Da8649bb6C5af9D0) | [`0x8f9508C68ED70A7A02A4f8190604a81Ca8D79BEc`](https://explorer.form.network/address/0x8f9508C68ED70A7A02A4f8190604a81Ca8D79BEc) |
69+
| Unichain | [`0x9245A985d2055CeA7576B293Da8649bb6C5af9D0`](https://uniscan.xyz/address/0x9245A985d2055CeA7576B293Da8649bb6C5af9D0) | [`0x8f9508C68ED70A7A02A4f8190604a81Ca8D79BEc`](https://uniscan.xyz/address/0x8f9508C68ED70A7A02A4f8190604a81Ca8D79BEc) |
70+
| Artela | [`0x9245A985d2055CeA7576B293Da8649bb6C5af9D0`](https://artscan.artela.network/address/0x9245A985d2055CeA7576B293Da8649bb6C5af9D0) | [`0x8f9508C68ED70A7A02A4f8190604a81Ca8D79BEc`](https://artscan.artela.network/address/0x8f9508C68ED70A7A02A4f8190604a81Ca8D79BEc) |
6971

7072

7173
## Scripts
@@ -85,7 +87,7 @@ Set the following environment variables required for running all the scripts, on
8587
If the network is not listed under the `rpc_endpoints` section of the [foundry.toml file](./foundry.toml) you'll have to
8688
add a new entry for it.
8789

88-
For deploying the router you have to run the `npm run run:deployHyperlane7683`. Make sure the following environment
90+
For deploying the router you have to run the `yarn run:deployHyperlane7683`. Make sure the following environment
8991
variable are set:
9092

9193
- `DEPLOYER_PK`: deployer private key
@@ -101,7 +103,7 @@ variable are set:
101103

102104
### Open an Order
103105

104-
For opening an onchain order you can run `npm run run:openOrder`. Make sure the following environment variable are set:
106+
For opening an onchain order you can run `yarn run:openOrder`. Make sure the following environment variable are set:
105107

106108
- `ROUTER_OWNER_PK`: the router's owner private key. Only the owner can enroll routers
107109
- `ORDER_SENDER`: address of order sender
@@ -112,6 +114,18 @@ For opening an onchain order you can run `npm run run:openOrder`. Make sure the
112114
- `AMOUNT_OUT`: amount out
113115
- `DESTINATION_DOMAIN`: destination domain id
114116

117+
### Refund Order
118+
119+
For refunding an expired order you can run `yarn run:refundOrder`. Make sure the following environment variable are set:
120+
121+
- `NETWORK`: the name of the network you want to run the script, it should be the destination network of your order
122+
- `USER_PK`: the private key to use for executing the tx, the address should own some gas to pay for the Hyperlane message
123+
- `ORDER_ORIGIN`: the chain id of the order's origin chain
124+
- `ORDER_FILL_DEADLINE`: the `fillDeadline` used when opening the order
125+
- `ORDER_DATA`: the `orderData` used when opening the order
126+
127+
you can find the `fillDeadline` and `orderData` inspecting the open transaction on etherscan
128+
115129
---
116130

117131
## Usage

solidity/foundry.toml

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,12 @@
2828
base = { key = "${API_KEY_BASESCAN}" }
2929
berachain = { key = "${API_KEY_BERACAHAINSCAN}", url = "https://api.routescan.io/v2/network/mainnet/evm/80094/etherscan/api/" }
3030
form = { key = "${API_KEY_FORMSCAN}", url = "https://explorer.form.network/api" }
31+
gnosis_chain = { key = "${API_KEY_GNOSISSCAN}" }
32+
unichain = { key = "${API_KEY_UNICHAIN}" }
33+
artela = { key = "${API_KEY_ALTERA}", url = "https://artscan.artela.network/api" }
3134

3235
avalanche = { key = "${API_KEY_SNOWTRACE}" }
3336
bnb_smart_chain = { key = "${API_KEY_BSCSCAN}" }
34-
gnosis_chain = { key = "${API_KEY_GNOSISSCAN}" }
3537
goerli = { key = "${API_KEY_ETHERSCAN}" }
3638
polygon = { key = "${API_KEY_POLYGONSCAN}" }
3739
sepolia = { key = "${API_KEY_ETHERSCAN}" }
@@ -54,6 +56,8 @@
5456
berachain = "https://rpc.berachain.com"
5557
form = "https://rpc.form.network/http"
5658
gnosis_chain = "https://rpc.gnosischain.com"
59+
unichain = "https://mainnet.unichain.org"
60+
altera = "https://node-euro.artela.network/rpc"
5761

5862
avalanche = "https://avalanche-mainnet.g.alchemy.com/v2/${API_KEY_ALCHEMY}"
5963
bnb_smart_chain = "https://bsc-dataseed.binance.org"

solidity/package.json

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,15 +62,21 @@
6262
"test:coverage:report": "forge coverage --no-match-coverage \"(test|mock|node_modules|script)\" --report lcov && genhtml lcov.info --ignore-errors inconsistent,inconsistent --branch-coverage --output-dir coverage",
6363
"deployHyperlane7683": "forge script script/DeployHyperlane7683.s.sol:DeployHyperlane7683 -f $NETWORK --broadcast --verify --slow -vvv",
6464
"run:deployHyperlane7683": "dotenv-run-script deployHyperlane7683",
65-
"deploySimple": "forge script script/DeploySimple.s.sol:DeploySimple -f $NETWORK --broadcast --verify --slow -vvv",
65+
"deploySimple": "forge script script/DeploySimple.s.sol:DeploySimple -f $NETWORK --broadcast --slow -vvv",
6666
"run:deploySimple": "dotenv-run-script deploySimple",
6767
"deployToken": "forge script script/DeployToken.s.sol:DeployToken -f $NETWORK --broadcast --verify --slow -vvv",
6868
"run:deployToken": "dotenv-run-script deployToken",
6969
"openOrder": "forge script script/OpenOrder.s.sol:OpenOrder -f $NETWORK --broadcast --verify --slow -vvv",
7070
"run:openOrder": "dotenv-run-script openOrder",
71+
"deployBatchOpen": "forge script script/DeployBatchOpen.s.sol:DeployBatchOpen -f $NETWORK --broadcast --verify --slow -vvv",
72+
"run:deployBatchOpen": "dotenv-run-script deployBatchOpen",
73+
"openBatchOrder": "forge script script/OpenBatchOrder.s.sol:OpenBatchOrder -f $NETWORK --broadcast --verify --slow -vvv",
74+
"run:openBatchOrder": "dotenv-run-script openBatchOrder",
7175
"enrollRouter": "forge script script/EnrollRouter.s.sol:EnrollRouter -f $NETWORK --broadcast --slow -vvv",
7276
"run:enrollRouter": "dotenv-run-script enrollRouter",
7377
"upgradeSimple": "forge script script/UpgradeSimple.s.sol:UpgradeSimple -f $NETWORK --broadcast --slow -vvv",
74-
"run:upgradeSimple": "dotenv-run-script upgradeSimple"
78+
"run:upgradeSimple": "dotenv-run-script upgradeSimple",
79+
"refundOrder": "forge script script/RefundOrder.s.sol:RefundOrder -f $NETWORK --broadcast --slow -vvv",
80+
"run:refundOrder": "dotenv-run-script refundOrder"
7581
}
7682
}
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
// SPDX-License-Identifier: UNLICENSED
2+
pragma solidity >=0.8.25 <0.9.0;
3+
4+
import { Script } from "forge-std/Script.sol";
5+
import { console2 } from "forge-std/console2.sol";
6+
7+
import { TypeCasts } from "@hyperlane-xyz/libs/TypeCasts.sol";
8+
import { ERC20 } from "@openzeppelin/contracts/token/ERC20/ERC20.sol";
9+
10+
import { Hyperlane7683 } from "../src/Hyperlane7683.sol";
11+
import { OrderData, OrderEncoder } from "../src/libs/OrderEncoder.sol";
12+
13+
import {
14+
OnchainCrossChainOrder
15+
} from "../src/ERC7683/IERC7683.sol";
16+
17+
contract BatchOpen {
18+
Hyperlane7683 public router;
19+
constructor(address _router) {
20+
router = Hyperlane7683(_router);
21+
}
22+
23+
function openOrders(OnchainCrossChainOrder[] memory orders, address token, uint256 total) external {
24+
ERC20(token).transferFrom(msg.sender, address(this), total);
25+
ERC20(token).approve(address(router), total);
26+
for (uint256 i = 0; i < orders.length; i++) {
27+
router.open(orders[i]);
28+
}
29+
}
30+
}
31+
32+
/// @dev See the Solidity Scripting tutorial: https://book.getfoundry.sh/tutorials/solidity-scripting
33+
contract DeployBatchOpen is Script {
34+
function run() public {
35+
uint256 deployerPrivateKey = vm.envUint("DEPLOYER_PK");
36+
address router = vm.envAddress("ROUTER_ADDRESS");
37+
38+
vm.startBroadcast(deployerPrivateKey);
39+
40+
new BatchOpen(router);
41+
42+
vm.stopBroadcast();
43+
}
44+
}

solidity/script/DeploySimple.s.sol

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,9 @@ contract DeploySimple is Script {
2727
address owner = vm.envAddress("ROUTER_OWNER");
2828

2929
uint256[] memory domains = vm.envUint("DOMAINS", ",");
30+
uint256[] memory gasDomains = vm.envUint("GAS_BY_DOMAIN", ",");
3031
address[] memory routers = vm.envAddress("ROUTERS", ",");
31-
assert(routers.length == domains.length);
32+
assert(routers.length == domains.length && domains.length == gasDomains.length);
3233
uint32[] memory _domains = new uint32[](domains.length);
3334
bytes32[] memory _routers = new bytes32[](domains.length);
3435
GasRouter.GasRouterConfig[] memory gasConfigs = new GasRouter.GasRouterConfig[](domains.length);
@@ -42,8 +43,7 @@ contract DeploySimple is Script {
4243
for (uint i = 0; i < domains.length; i++) {
4344
_routers[i] = TypeCasts.addressToBytes32(routers[i]);
4445
_domains[i] = uint32(domains[i]);
45-
// TODO - amount is based on gas report from tests multiply 2
46-
gasConfigs[i] = GasRouter.GasRouterConfig(_domains[i], 1070688);
46+
gasConfigs[i] = GasRouter.GasRouterConfig(_domains[i], gasDomains[i]);
4747
}
4848

4949
Hyperlane7683(address(proxy)).enrollRemoteRouters(_domains, _routers);
@@ -61,15 +61,12 @@ contract DeploySimple is Script {
6161
}
6262

6363
function deployProxyAdmin() internal returns (ProxyAdmin proxyAdmin) {
64-
string memory ROUTER_SALT = vm.envString("HYPERLANE7683_SALT");
6564
address proxyAdminOwner = vm.envAddress("PROXY_ADMIN_OWNER");
6665

6766
proxyAdmin = new OwnableProxyAdmin(proxyAdminOwner);
6867
}
6968

7069
function deployImplementation() internal returns (address routerImpl) {
71-
uint256 deployerPrivateKey = vm.envUint("DEPLOYER_PK");
72-
string memory ROUTER_SALT = vm.envString("HYPERLANE7683_SALT");
7370
address mailbox = vm.envAddress("MAILBOX");
7471
address permit2 = vm.envAddress("PERMIT2");
7572

@@ -78,7 +75,6 @@ contract DeploySimple is Script {
7875

7976
function deployProxy(address routerImpl, address proxyAdmin) internal returns (TransparentUpgradeableProxy proxy) {
8077
uint256 deployerPrivateKey = vm.envUint("DEPLOYER_PK");
81-
string memory ROUTER_SALT = vm.envString("HYPERLANE7683_SALT");
8278
address initialOwner = vm.addr(deployerPrivateKey);
8379

8480
proxy = new TransparentUpgradeableProxy(

solidity/script/EnrollRouter.s.sol

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import { Script } from "forge-std/Script.sol";
55
import { console2 } from "forge-std/console2.sol";
66

77
import { TypeCasts } from "@hyperlane-xyz/libs/TypeCasts.sol";
8+
import { GasRouter } from "@hyperlane-xyz/client/GasRouter.sol";
89

910
import { Hyperlane7683 } from "../src/Hyperlane7683.sol";
1011

@@ -15,12 +16,26 @@ contract EnrollRouter is Script {
1516
uint256 deployerPrivateKey = vm.envUint("OWNER_PK");
1617

1718
address localRouter = vm.envAddress("ROUTER");
18-
address remoteRouter = vm.envAddress("REMOTE_ROUTER");
19-
uint256 chainId = vm.envUint("ENROLL_CHAIN");
19+
address[] memory routers = vm.envAddress("REMOTE_ROUTERS", ",");
20+
uint256[] memory domains = vm.envUint("ENROLL_CHAINS", ",");
21+
uint256[] memory gasDomains = vm.envUint("GAS_BY_DOMAIN", ",");
22+
23+
assert(routers.length == domains.length && domains.length == gasDomains.length);
24+
uint32[] memory _domains = new uint32[](domains.length);
25+
bytes32[] memory _routers = new bytes32[](domains.length);
26+
GasRouter.GasRouterConfig[] memory gasConfigs = new GasRouter.GasRouterConfig[](domains.length);
27+
28+
for (uint i = 0; i < domains.length; i++) {
29+
_routers[i] = TypeCasts.addressToBytes32(routers[i]);
30+
_domains[i] = uint32(domains[i]);
31+
gasConfigs[i] = GasRouter.GasRouterConfig(_domains[i], gasDomains[i]);
32+
}
2033

2134
vm.startBroadcast(deployerPrivateKey);
2235

23-
Hyperlane7683(localRouter).enrollRemoteRouter(uint32(chainId), TypeCasts.addressToBytes32(remoteRouter));
36+
Hyperlane7683(localRouter).enrollRemoteRouters(_domains, _routers);
37+
38+
Hyperlane7683(localRouter).setDestinationGas(gasConfigs);
2439

2540
vm.stopBroadcast();
2641
}
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
// SPDX-License-Identifier: UNLICENSED
2+
pragma solidity >=0.8.25 <0.9.0;
3+
4+
import { Script } from "forge-std/Script.sol";
5+
import { console2 } from "forge-std/console2.sol";
6+
7+
import { TypeCasts } from "@hyperlane-xyz/libs/TypeCasts.sol";
8+
import { ERC20 } from "@openzeppelin/contracts/token/ERC20/ERC20.sol";
9+
10+
import { Hyperlane7683 } from "../src/Hyperlane7683.sol";
11+
import { OrderData, OrderEncoder } from "../src/libs/OrderEncoder.sol";
12+
import { BatchOpen } from "./DeployBatchOpen.s.sol";
13+
14+
import {
15+
OnchainCrossChainOrder
16+
} from "../src/ERC7683/IERC7683.sol";
17+
18+
/// @dev See the Solidity Scripting tutorial: https://book.getfoundry.sh/tutorials/solidity-scripting
19+
contract OpenBatchOrder is Script {
20+
function run() public {
21+
uint256 deployerPrivateKey = vm.envUint("DEPLOYER_PK");
22+
23+
vm.startBroadcast(deployerPrivateKey);
24+
25+
address localRouter = vm.envAddress("ROUTER_ADDRESS");
26+
address sender = vm.envAddress("ORDER_SENDER");
27+
address recipient = vm.envAddress("ORDER_RECIPIENT");
28+
address inputToken = vm.envAddress("ITT_INPUT");
29+
address outputToken = vm.envAddress("ITT_OUTPUT");
30+
uint256 amountIn = vm.envUint("AMOUNT_IN");
31+
uint256 amountOut = vm.envUint("AMOUNT_OUT");
32+
uint256 senderNonce = vm.envUint("SENDER_NONCE");
33+
uint32 originDomain = Hyperlane7683(localRouter).localDomain();
34+
uint256 destinationDomain = vm.envUint("DESTINATION_DOMAIN");
35+
uint32 fillDeadline = type(uint32).max;
36+
address batchOpen = vm.envAddress("BATCH_OPEN");
37+
38+
ERC20(inputToken).approve(batchOpen, amountIn * 3);
39+
40+
OrderData memory order = OrderData(
41+
TypeCasts.addressToBytes32(sender),
42+
TypeCasts.addressToBytes32(recipient),
43+
TypeCasts.addressToBytes32(inputToken),
44+
TypeCasts.addressToBytes32(outputToken),
45+
amountIn,
46+
amountOut,
47+
senderNonce,
48+
originDomain,
49+
uint32(destinationDomain),
50+
TypeCasts.addressToBytes32(localRouter),
51+
fillDeadline,
52+
new bytes(0)
53+
);
54+
55+
OnchainCrossChainOrder[] memory onchainOrders = new OnchainCrossChainOrder[](3);
56+
57+
onchainOrders[0] = OnchainCrossChainOrder(
58+
fillDeadline,
59+
OrderEncoder.orderDataType(),
60+
OrderEncoder.encode(order)
61+
);
62+
63+
order.senderNonce = senderNonce + 1;
64+
onchainOrders[1] = OnchainCrossChainOrder(
65+
fillDeadline,
66+
OrderEncoder.orderDataType(),
67+
OrderEncoder.encode(order)
68+
);
69+
70+
order.senderNonce = senderNonce + 2;
71+
onchainOrders[2] = OnchainCrossChainOrder(
72+
fillDeadline,
73+
OrderEncoder.orderDataType(),
74+
OrderEncoder.encode(order)
75+
);
76+
77+
BatchOpen(batchOpen).openOrders(onchainOrders, inputToken, amountIn * 3);
78+
79+
vm.stopBroadcast();
80+
}
81+
}

solidity/script/RefundOrder.s.sol

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
// SPDX-License-Identifier: UNLICENSED
2+
pragma solidity >=0.8.25 <0.9.0;
3+
4+
import { Script } from "forge-std/Script.sol";
5+
import { console2 } from "forge-std/console2.sol";
6+
7+
import { TypeCasts } from "@hyperlane-xyz/libs/TypeCasts.sol";
8+
9+
import {
10+
OnchainCrossChainOrder
11+
} from "../src/ERC7683/IERC7683.sol";
12+
13+
import { Hyperlane7683 } from "../src/Hyperlane7683.sol";
14+
import { OrderEncoder } from "../src/libs/OrderEncoder.sol";
15+
16+
17+
/// @dev See the Solidity Scripting tutorial: https://book.getfoundry.sh/tutorials/solidity-scripting
18+
contract RefundOrder is Script {
19+
function run() public {
20+
uint256 deployerPrivateKey = vm.envUint("USER_PK");
21+
22+
address router = vm.envAddress("ROUTER");
23+
uint32 fillDeadline = uint32(vm.envUint("ORDER_FILL_DEADLINE"));
24+
uint32 orderOrigin = uint32(vm.envUint("ORDER_ORIGIN"));
25+
bytes memory orderData = vm.envBytes("ORDER_DATA");
26+
27+
vm.startBroadcast(deployerPrivateKey);
28+
29+
OnchainCrossChainOrder[] memory orders = new OnchainCrossChainOrder[](1);
30+
orders[0].fillDeadline = fillDeadline;
31+
orders[0].orderDataType = OrderEncoder.orderDataType();
32+
orders[0].orderData = orderData;
33+
34+
uint256 quote = Hyperlane7683(router).quoteGasPayment(orderOrigin);
35+
36+
Hyperlane7683(router).refund{value: quote}(orders);
37+
38+
vm.stopBroadcast();
39+
}
40+
}

typescript/solver/.gitignore

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
1-
typechain
1+
typechain
2+
**/local.db

0 commit comments

Comments
 (0)