Commit 30211b7e authored by James Kim's avatar James Kim

install Multicall3 using forge install

parent 0fd4ba77
[submodule "tests"] [submodule "tests"]
path = l2geth/tests/testdata path = l2geth/tests/testdata
url = https://github.com/ethereum/tests url = https://github.com/ethereum/tests
[submodule "packages/contracts-periphery/lib/multicall"]
path = packages/contracts-periphery/lib/multicall
url = https://github.com/mds1/multicall
[submodule "lib/multicall"]
branch = v3.1.0
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import { Multicall3 } from "multicall/src/Multicall3.sol";
/**
* Just exists so we can compile this contract.
*/
contract MulticallContractCompiler {
}
//SPDX-License-Identifier: MIT //SPDX-License-Identifier: MIT
pragma solidity 0.8.15; pragma solidity >=0.6.2 <0.9.0;
/* Testing utilities */ /* Testing utilities */
import { Test } from "forge-std/Test.sol"; import { Test } from "forge-std/Test.sol";
...@@ -8,10 +8,27 @@ import { Optimist } from "../universal/op-nft/Optimist.sol"; ...@@ -8,10 +8,27 @@ import { Optimist } from "../universal/op-nft/Optimist.sol";
import { OptimistAllowlist } from "../universal/op-nft/OptimistAllowlist.sol"; import { OptimistAllowlist } from "../universal/op-nft/OptimistAllowlist.sol";
import { OptimistInviter } from "../universal/op-nft/OptimistInviter.sol"; import { OptimistInviter } from "../universal/op-nft/OptimistInviter.sol";
import { OptimistInviterHelper } from "../testing/helpers/OptimistInviterHelper.sol"; import { OptimistInviterHelper } from "../testing/helpers/OptimistInviterHelper.sol";
import { Multicall3 } from "../testing/helpers/Multicall3.sol";
import { Strings } from "@openzeppelin/contracts/utils/Strings.sol"; import { Strings } from "@openzeppelin/contracts/utils/Strings.sol";
import { IERC721 } from "@openzeppelin/contracts/token/ERC721/IERC721.sol"; import { IERC721 } from "@openzeppelin/contracts/token/ERC721/IERC721.sol";
interface IMulticall3 {
struct Call3 {
address target;
bool allowFailure;
bytes callData;
}
struct Result {
bool success;
bytes returnData;
}
function aggregate3(Call3[] calldata calls)
external
payable
returns (Result[] memory returnData);
}
contract Optimist_Initializer is Test { contract Optimist_Initializer is Test {
event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
event Initialized(uint8); event Initialized(uint8);
...@@ -35,7 +52,7 @@ contract Optimist_Initializer is Test { ...@@ -35,7 +52,7 @@ contract Optimist_Initializer is Test {
OptimistInviterHelper optimistInviterHelper; OptimistInviterHelper optimistInviterHelper;
// To test multicall for claiming and minting in one call // To test multicall for claiming and minting in one call
Multicall3 multicall3; IMulticall3 multicall3;
address internal carol_baseURIAttestor; address internal carol_baseURIAttestor;
address internal alice_allowlistAttestor; address internal alice_allowlistAttestor;
...@@ -216,7 +233,8 @@ contract Optimist_Initializer is Test { ...@@ -216,7 +233,8 @@ contract Optimist_Initializer is Test {
_optimistAllowlist: optimistAllowlist _optimistAllowlist: optimistAllowlist
}); });
multicall3 = new Multicall3(); // address test = deployCode("Multicall3.sol");
multicall3 = IMulticall3(deployCode("Multicall3.sol"));
} }
} }
...@@ -599,10 +617,10 @@ contract OptimistTest is Optimist_Initializer { ...@@ -599,10 +617,10 @@ contract OptimistTest is Optimist_Initializer {
// wait minimum commitment period // wait minimum commitment period
vm.warp(optimistInviter.MIN_COMMITMENT_PERIOD() + block.timestamp); vm.warp(optimistInviter.MIN_COMMITMENT_PERIOD() + block.timestamp);
Multicall3.Call3[] memory calls = new Multicall3.Call3[](2); IMulticall3.Call3[] memory calls = new IMulticall3.Call3[](2);
// First call is to claim the invite, receiving the attestation // First call is to claim the invite, receiving the attestation
calls[0] = Multicall3.Call3({ calls[0] = IMulticall3.Call3({
target: address(optimistInviter), target: address(optimistInviter),
callData: abi.encodeWithSelector( callData: abi.encodeWithSelector(
optimistInviter.claimInvite.selector, optimistInviter.claimInvite.selector,
...@@ -614,7 +632,7 @@ contract OptimistTest is Optimist_Initializer { ...@@ -614,7 +632,7 @@ contract OptimistTest is Optimist_Initializer {
}); });
// Second call is to mint the Optimist NFT // Second call is to mint the Optimist NFT
calls[1] = Multicall3.Call3({ calls[1] = IMulticall3.Call3({
target: address(optimist), target: address(optimist),
callData: abi.encodeWithSelector(optimist.mint.selector, bob), callData: abi.encodeWithSelector(optimist.mint.selector, bob),
allowFailure: false allowFailure: false
......
...@@ -3,6 +3,7 @@ pragma solidity ^0.8.0; ...@@ -3,6 +3,7 @@ pragma solidity ^0.8.0;
import { ProxyAdmin } from "@eth-optimism/contracts-bedrock/contracts/universal/ProxyAdmin.sol"; import { ProxyAdmin } from "@eth-optimism/contracts-bedrock/contracts/universal/ProxyAdmin.sol";
import { Proxy } from "@eth-optimism/contracts-bedrock/contracts/universal/Proxy.sol"; import { Proxy } from "@eth-optimism/contracts-bedrock/contracts/universal/Proxy.sol";
import { Multicall3 } from "multicall/src/Multicall3.sol";
/** /**
* Just exists so we can compile external contracts. * Just exists so we can compile external contracts.
......
...@@ -16,9 +16,13 @@ remappings = [ ...@@ -16,9 +16,13 @@ remappings = [
'@rari-capital/solmate/=node_modules/@rari-capital/solmate', '@rari-capital/solmate/=node_modules/@rari-capital/solmate',
'forge-std/=node_modules/forge-std/src', 'forge-std/=node_modules/forge-std/src',
'ds-test/=node_modules/ds-test/src', 'ds-test/=node_modules/ds-test/src',
'multicall/=lib/multicall',
'@openzeppelin/contracts/=node_modules/@openzeppelin/contracts/', '@openzeppelin/contracts/=node_modules/@openzeppelin/contracts/',
'@openzeppelin/contracts-upgradeable/=node_modules/@openzeppelin/contracts-upgradeable/', '@openzeppelin/contracts-upgradeable/=node_modules/@openzeppelin/contracts-upgradeable/',
'@eth-optimism/contracts-bedrock/=../../node_modules/@eth-optimism/contracts-bedrock', '@eth-optimism/contracts-bedrock/=../../node_modules/@eth-optimism/contracts-bedrock',
] ]
# The metadata hash can be removed from the bytecode by setting "none" # The metadata hash can be removed from the bytecode by setting "none"
bytecode_hash = "none" bytecode_hash = "none"
libs = ["node_modules", "lib"]
# Required to use `deployCode` to deploy the multicall contract which has incompatible version
fs_permissions = [{ access = "read", path = "./forge-artifacts/Multicall3.sol/Multicall3.json"}]
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment