From fbed55902bd1491d6ed1074e84df505486677a01 Mon Sep 17 00:00:00 2001 From: KimlikDAO-bot Date: Thu, 2 May 2024 22:31:39 -0700 Subject: [PATCH] =?UTF-8?q?=F0=9F=AA=99=20Add=20Ethereum=20mock=20tokens?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ethereum/addresses.sol | 7 +++++ ethereum/mockTokens.sol | 32 +++++++++++++++++++++++ foundry.toml | 4 +-- kimlikdao/IDIDSigners.sol | 15 ++++++++--- test/avalanche/addresses.t.sol | 4 ++- test/kimlikdao/addresses.t.sol | 5 +++- test/zksync/L2Log.t.sol | 3 ++- testing/MockERC20Permit.sol | 48 +++++++++++++++++++++++----------- zksync/mockTokens.sol | 14 +++++----- 9 files changed, 100 insertions(+), 32 deletions(-) create mode 100644 ethereum/addresses.sol create mode 100644 ethereum/mockTokens.sol diff --git a/ethereum/addresses.sol b/ethereum/addresses.sol new file mode 100644 index 0000000..be24f76 --- /dev/null +++ b/ethereum/addresses.sol @@ -0,0 +1,7 @@ +// SPDX-License-Identifier: MIT + +pragma solidity ^0.8.0; + +import {IERC20, IERC20Permit} from "../erc/IERC20Permit.sol"; + +IERC20 constant USDT = IERC20(0xdAC17F958D2ee523a2206206994597C13D831ec7); diff --git a/ethereum/mockTokens.sol b/ethereum/mockTokens.sol new file mode 100644 index 0000000..7de0c55 --- /dev/null +++ b/ethereum/mockTokens.sol @@ -0,0 +1,32 @@ +// SPDX-License-Identifier: MIT + +pragma solidity ^0.8.0; + +import {IERC20Permit} from "../erc/IERC20Permit.sol"; +import {MockERC20, MockERC20Permit} from "../testing/MockERC20Permit.sol"; +import {USDT} from "./addresses.sol"; +import {Vm} from "forge-std/Vm.sol"; + +contract USDTImpl is MockERC20 { + function name() public pure returns (string memory) { + return "Tether USD"; + } + + function symbol() public pure returns (string memory) { + return "USDT"; + } + + function decimals() public pure override returns (uint8) { + return 6; + } +} + +address constant USDT_DEPLOYER = 0x36928500Bc1dCd7af6a2B4008875CC336b927D57; + +function deployMockTokens() { + Vm vm = Vm(address(uint160(uint256(keccak256("hevm cheat code"))))); + + vm.setNonce(USDT_DEPLOYER, 6); + vm.prank(USDT_DEPLOYER); + new USDTImpl(); +} diff --git a/foundry.toml b/foundry.toml index 8c19396..9a08e6b 100644 --- a/foundry.toml +++ b/foundry.toml @@ -1,9 +1,9 @@ [fmt] -sort_imports = true +line_length = 100 single_line_statement_blocks = "single" +sort_imports = true [profile.default] -test = "test" optimizer = true optimizer_runs = 20_000 remappings = ['forge-std/=lib/forge-std/src/'] diff --git a/kimlikdao/IDIDSigners.sol b/kimlikdao/IDIDSigners.sol index 0b68be0..7364803 100644 --- a/kimlikdao/IDIDSigners.sol +++ b/kimlikdao/IDIDSigners.sol @@ -11,14 +11,14 @@ interface IDIDSigners { uint128x2 weightThresholdAndSignatureTs, bytes32 commitmentR, Signature[3] calldata sigs - ) external view; + ) external view returns (bool); function authenticateHumanIDv1( bytes32 humanID, uint128x2 weightThresholdAndSignatureTs, bytes32 commitmentR, Signature[5] calldata sigs - ) external view; + ) external view returns (bool); /** * Maps a signer node address to a bit packed struct. @@ -27,7 +27,11 @@ interface IDIDSigners { } interface IDIDSignersExposureReport { - function reportExposure(bytes32 exposureReportID, uint256 signatureTs, Signature[3] calldata sigs) external; + function reportExposure( + bytes32 exposureReportID, + uint256 signatureTs, + Signature[3] calldata sigs + ) external; } uint256 constant SIGNER_INFO_END_TS_MASK = uint256(type(uint64).max) << 112; @@ -41,7 +45,10 @@ uint256 constant SIGNER_INFO_WITHDRAW_MASK = uint256(type(uint48).max) << 176; */ type SignerInfo is uint256; -function SignerInfoFrom(uint256 _color, uint256 _deposit, uint256 _startTs) pure returns (SignerInfo) { +function SignerInfoFrom(uint256 _color, uint256 _deposit, uint256 _startTs) + pure + returns (SignerInfo) +{ return SignerInfo.wrap((_color << 224) | (_deposit << 64) | _startTs); } diff --git a/test/avalanche/addresses.t.sol b/test/avalanche/addresses.t.sol index 5451076..b6274a2 100644 --- a/test/avalanche/addresses.t.sol +++ b/test/avalanche/addresses.t.sol @@ -2,7 +2,9 @@ pragma solidity ^0.8.0; -import {TRYB, TRYB_DEPLOYER, USDC, USDC_DEPLOYER, USDT, USDT_DEPLOYER} from "avalanche/addresses.sol"; +import { + TRYB, TRYB_DEPLOYER, USDC, USDC_DEPLOYER, USDT, USDT_DEPLOYER +} from "avalanche/addresses.sol"; import {Test} from "forge-std/Test.sol"; contract addressesTest is Test { diff --git a/test/kimlikdao/addresses.t.sol b/test/kimlikdao/addresses.t.sol index a12dfdd..29b4b18 100644 --- a/test/kimlikdao/addresses.t.sol +++ b/test/kimlikdao/addresses.t.sol @@ -20,7 +20,10 @@ import { PROTOCOL_FUND_ZKSYNC, PROTOCOL_FUND_ZKSYNC_DEPLOYER } from "kimlikdao/addresses.sol"; -import {applyL1ToL2Alias, computeCreateAddress as computeZkSyncCreateAddress} from "zksync/IZkSync.sol"; +import { + applyL1ToL2Alias, + computeCreateAddress as computeZkSyncCreateAddress +} from "zksync/IZkSync.sol"; contract addressesTest is Test { function testDeployerConsistency() public pure { diff --git a/test/zksync/L2Log.t.sol b/test/zksync/L2Log.t.sol index b0135b1..4b6493e 100644 --- a/test/zksync/L2Log.t.sol +++ b/test/zksync/L2Log.t.sol @@ -17,7 +17,8 @@ contract L2LogLocatorTest is Test { assertEq(k.messageIndex(), type(uint112).max); assertEq(k.txNumber(), type(uint16).max); - L2LogLocator m = L2LogLocatorFrom(type(uint128).max - 1, type(uint112).max - 1, type(uint16).max - 1); + L2LogLocator m = + L2LogLocatorFrom(type(uint128).max - 1, type(uint112).max - 1, type(uint16).max - 1); assertEq(m.batchNumber(), type(uint128).max - 1); assertEq(m.messageIndex(), type(uint112).max - 1); assertEq(m.txNumber(), type(uint16).max - 1); diff --git a/testing/MockERC20Permit.sol b/testing/MockERC20Permit.sol index d418dc4..256f799 100644 --- a/testing/MockERC20Permit.sol +++ b/testing/MockERC20Permit.sol @@ -2,16 +2,12 @@ pragma solidity ^0.8.0; -import {IERC20Permit} from "../erc/IERC20Permit.sol"; - -abstract contract MockERC20Permit is IERC20Permit { - // keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)"); - bytes32 public constant PERMIT_TYPEHASH = 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9; +import {IERC20, IERC20Permit} from "../erc/IERC20Permit.sol"; +abstract contract MockERC20 is IERC20 { uint256 public override totalSupply; mapping(address => uint256) public override balanceOf; mapping(address => mapping(address => uint256)) public override allowance; - mapping(address => uint256) public override nonces; function approve(address spender, uint256 amount) external returns (bool) { allowance[msg.sender][spender] = amount; @@ -28,7 +24,11 @@ abstract contract MockERC20Permit is IERC20Permit { return true; } - function transferFrom(address from, address to, uint256 amount) external override returns (bool) { + function transferFrom(address from, address to, uint256 amount) + external + override + returns (bool) + { uint256 allowed = allowance[from][msg.sender]; if (allowed != type(uint256).max) allowance[from][msg.sender] = allowed - amount; balanceOf[from] -= amount; @@ -39,16 +39,38 @@ abstract contract MockERC20Permit is IERC20Permit { return true; } - function permit(address owner, address spender, uint256 amount, uint256 deadline, uint8 v, bytes32 r, bytes32 s) - external - { + function mint(uint256 amount) external { + balanceOf[msg.sender] += amount; + } +} + +abstract contract MockERC20Permit is MockERC20, IERC20Permit { + // keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)"); + bytes32 public constant PERMIT_TYPEHASH = + 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9; + + mapping(address => uint256) public override nonces; + + function permit( + address owner, + address spender, + uint256 amount, + uint256 deadline, + uint8 v, + bytes32 r, + bytes32 s + ) external { require(deadline >= block.timestamp); unchecked { bytes32 digest = keccak256( abi.encodePacked( "\x19\x01", DOMAIN_SEPARATOR(), - keccak256(abi.encode(PERMIT_TYPEHASH, owner, spender, amount, nonces[owner]++, deadline)) + keccak256( + abi.encode( + PERMIT_TYPEHASH, owner, spender, amount, nonces[owner]++, deadline + ) + ) ) ); address recovered = ecrecover(digest, v, r, s); @@ -59,8 +81,4 @@ abstract contract MockERC20Permit is IERC20Permit { } function DOMAIN_SEPARATOR() public pure virtual override returns (bytes32); - - function mint(uint256 amount) external { - balanceOf[msg.sender] += amount; - } } diff --git a/zksync/mockTokens.sol b/zksync/mockTokens.sol index 5036170..7886b63 100644 --- a/zksync/mockTokens.sol +++ b/zksync/mockTokens.sol @@ -6,15 +6,14 @@ import {IERC20Permit} from "../erc/IERC20Permit.sol"; import {MockERC20Permit} from "../testing/MockERC20Permit.sol"; import {USDT} from "./addresses.sol"; import {Vm} from "forge-std/Vm.sol"; -import {console2} from "forge-std/console2.sol"; - -address constant USDT_DEPLOYER = 0x493257fD37EDB34451f62EDf8D2a0C418852bA4C; contract USDTImpl is MockERC20Permit { function DOMAIN_SEPARATOR() public pure override returns (bytes32) { return keccak256( abi.encode( - keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"), + keccak256( + "EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)" + ), keccak256(bytes("KPASS")), keccak256(bytes("1")), 0x144, @@ -35,7 +34,7 @@ contract USDTImpl is MockERC20Permit { return 6; } - constructor() { + function initialize() external { uint256 toMint = 100 * 10e6; balanceOf[msg.sender] = toMint; totalSupply = toMint; @@ -46,7 +45,6 @@ contract USDTImpl is MockERC20Permit { function deployMockTokens() { Vm vm = Vm(address(uint160(uint256(keccak256("hevm cheat code"))))); - vm.setNonce(USDT_DEPLOYER, 4); - vm.prank(USDT_DEPLOYER); - new USDTImpl(); + vm.etch(address(USDT), type(USDTImpl).runtimeCode); + USDTImpl(address(USDT)).initialize(); }