diff --git a/.gitignore b/.gitignore index f045f5f..c095a6e 100644 --- a/.gitignore +++ b/.gitignore @@ -5,6 +5,7 @@ out/ # Ignores development broadcast logs !/broadcast +/broadcast/*/1337/ /broadcast/*/31337/ /broadcast/*/41144114/ /broadcast/**/dry-run/ diff --git a/Makefile b/Makefile index f390ac0..a9fdebf 100644 --- a/Makefile +++ b/Makefile @@ -6,10 +6,16 @@ install: .PHONY: foundry foundry: + @if [[ "$(cmd)" == anvil* ]]; then \ + extra_flags="-p 8545:8545"; \ + else \ + extra_flags=""; \ + fi; \ docker run --rm \ - -v $$(pwd):/app/foundry \ - -u $$(id -u):$$(id -g) \ - -p 8545:8545 \ - ghcr.io/paradigmxyz/foundry-alphanet:latest \ - --foundry-directory /app/foundry \ - --foundry-command "$(cmd)" \ No newline at end of file + --env-file .env \ + -v "$$(pwd):/app/foundry" \ + -u "$$(id -u):$$(id -g)" \ + $$extra_flags \ + ghcr.io/paradigmxyz/foundry-alphanet:latest \ + --foundry-directory /app/foundry \ + --foundry-command "$(cmd)" \ No newline at end of file diff --git a/README.md b/README.md index 3a6ed95..eeef1b6 100644 --- a/README.md +++ b/README.md @@ -63,7 +63,7 @@ make cmd="anvil" Deploy the `BatchInvoker` contract to the network. ```shell -make cmd="forge script Deploy --sig 'deploy()' --rpc-url $RPC_URL --private-key $EXECUTOR_PRIVATE_KEY --broadcast" +make cmd="forge script Deploy --sig deploy() --rpc-url $RPC_URL --private-key $EXECUTOR_PRIVATE_KEY --broadcast" ``` **Note:** if the `$RPC_URL` you're pointing to is on host, you should use http://host.docker.internal:8545 instead of http://localhost:8545. See Docker's networking docs [here](https://docs.docker.com/desktop/networking/#i-want-to-connect-from-a-container-to-a-service-on-the-host). @@ -73,7 +73,7 @@ make cmd="forge script Deploy --sig 'deploy()' --rpc-url $RPC_URL --private-key We can test the `BatchInvoker` by sending a transaction via the contract. ```shell -make cmd="forge script Executor --sig 'sendEth(address,address,uint256)' $INVOKER_ADDRESS 0x3074ca113074ca113074ca113074ca113074ca11 0.01ether --rpc-url $RPC_URL --broadcast" +make cmd="forge script Executor --sig sendEth(address,address,uint256) $INVOKER_ADDRESS 0x3074ca113074ca113074ca113074ca113074ca11 0.01ether --rpc-url $RPC_URL --broadcast" ``` ## 3074-Compatible Networks diff --git a/remappings.txt b/remappings.txt new file mode 100644 index 0000000..f0a1ed5 --- /dev/null +++ b/remappings.txt @@ -0,0 +1 @@ +@3074-invokers/contracts/=src/ \ No newline at end of file diff --git a/script/Deploy.s.sol b/script/Deploy.s.sol index 3c61799..f9489c5 100644 --- a/script/Deploy.s.sol +++ b/script/Deploy.s.sol @@ -6,7 +6,7 @@ import { BatchInvoker } from "../src/BatchInvoker.sol"; contract Deploy is Script { // deploy: - // make cmd="forge script Deploy --sig 'deploy()' --rpc-url $RPC_URL --private-key $EXECUTOR_PRIVATE_KEY --broadcast" + // make cmd="forge script Deploy --sig deploy() --rpc-url $RPC_URL --private-key $EXECUTOR_PRIVATE_KEY --broadcast" function deploy() public { vm.broadcast(); new BatchInvoker(); diff --git a/script/Execute.s.sol b/script/Execute.s.sol index a4e3972..8c0e2b1 100644 --- a/script/Execute.s.sol +++ b/script/Execute.s.sol @@ -7,6 +7,7 @@ import { BatchInvoker } from "../src/BatchInvoker.sol"; import { vToYParity, packCalls } from "../test/utils.sol"; import { Script } from "forge-std/Script.sol"; import { Test } from "forge-std/Test.sol"; +import { LibString } from "solady/utils/LibString.sol"; contract Executor is Script, Test { uint256 apk = vm.envUint("AUTHORITY_PRIVATE_KEY"); @@ -43,4 +44,27 @@ contract Executor is Script, Test { call(invoker, recipient, value, ""); assertEq(recipient.balance, balanceBefore + value); } + + function test_fork_sendEth() public { + // set up fork, skip if localhost or docker.internal + string memory rpcUrl = vm.envString("RPC_URL"); + if (bytes(rpcUrl).length > 0 && (LibString.contains(rpcUrl, "localhost") || LibString.contains(rpcUrl, "docker.internal"))) { + return; + } + uint256 forkId = vm.createFork(rpcUrl); + vm.selectFork(forkId); + + // deploy batchinvoker + BatchInvoker invoker = new BatchInvoker(); + // send 10 eth to authority + vm.broadcast(epk); + address authority = vm.addr(apk); + authority.call{value: 10 ether}(""); + assertEq(authority.balance, 10 ether); + + // send 1 eth to 0x3074 via invoker + sendEth(address(invoker), address(0x3074), 1 ether); + assertEq(address(0x3074).balance, 1 ether); + assertEq(authority.balance, 9 ether); + } } diff --git a/src/BaseInvoker.sol b/src/BaseInvoker.sol index 0da981e..fb3f14d 100644 --- a/src/BaseInvoker.sol +++ b/src/BaseInvoker.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: MIT OR Apache-2.0 pragma solidity ^0.8.20; -import { Auth } from "src/Auth.sol"; +import { Auth } from "./Auth.sol"; /// @title BaseInvoker /// @author Anna Carroll diff --git a/src/BatchInvoker.sol b/src/BatchInvoker.sol index 9b4c183..a8120ba 100644 --- a/src/BatchInvoker.sol +++ b/src/BatchInvoker.sol @@ -1,8 +1,8 @@ // SPDX-License-Identifier: MIT OR Apache-2.0 pragma solidity ^0.8.20; -import { BaseInvoker } from "src/BaseInvoker.sol"; -import { MultiSendAuthCallOnly } from "src/MultiSendAuthCallOnly.sol"; +import { BaseInvoker } from "./BaseInvoker.sol"; +import { MultiSendAuthCallOnly } from "./MultiSendAuthCallOnly.sol"; /// @title BatchInvoker /// @author Anna Carroll