diff --git a/.gitignore b/.gitignore index c89e189..dd484dc 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ +.vscode/ *.keys cache/ out/ diff --git a/contracts/Addresses.sol b/contracts/Addresses.sol index e995b3a..de713be 100644 --- a/contracts/Addresses.sol +++ b/contracts/Addresses.sol @@ -2,31 +2,54 @@ pragma solidity ^0.8.0; -// dev.kimlikdao.eth -// dev.kimlikdao.avax -address constant DEV_KASASI = 0xC152e02e54CbeaCB51785C174994c2084bd9EF51; - +// +// The protocol funds on Ethereum L2s forward the funds to Ethereum +// periodically. The redemption happens on zkSync Era. +// +// The protocol funds on alt L1s stay on its native chain and redeemed in-kind +// on the corresponding chain. The redemption signal is forwarded to the chain +// by the KimlikDAO signer nodes using BLS signatures. +// +// // kimlikdao.eth -// kimlikdao.avax -address payable constant DAO_KASASI = payable( - 0xcCc0106Dbc0291A0d5C97AAb42052Cb46dE60cCc -); -address constant DAO_KASASI_DEPLOYER = 0x0DabB96F2320A170ac0dDc985d105913D937ea9A; - -// OYLAMA addresses -address constant OYLAMA = 0xcCc01Ec0E6Fb38Cce8b313c3c8dbfe66efD01cCc; -address constant OYLAMA_DEPLOYER = 0xD808C187Ef7D6f9999b6D9538C72E095db8c6df9; - -// TCKT addresses -address constant TCKT_ADDR = 0xcCc0a9b023177549fcf26c947edb5bfD9B230cCc; -address constant TCKT_DEPLOYER = 0x305166299B002a9aDE0e907dEd848878FD2237D7; -address constant TCKT_SIGNERS = 0xcCc09aA0d174271259D093C598FCe9Feb2791cCc; -address constant TCKT_SIGNERS_DEPLOYER = 0x4DeA92Bcb2C22011217C089797A270DfA5A51d53; - -// TCKO addresses -address constant TCKO_ADDR = 0xcCc0AC04C9251B74b0b30A20Fc7cb26EB62B0cCc; -address constant TCKO_DEPLOYER = 0xe7671eb60A45c905387df2b19A3803c6Be0Eb8f9; - -// TCKOK addresses -address constant TCKOK = 0xcCc0c4e5d57d251551575CEd12Aba80B43fF1cCc; -address constant TCKOK_DEPLOYER = 0x2EF1308e8641a20b509DC90d0568b96359498BBa; +address payable constant PROTOCOL_FUND = payable(0xcCc0106Dbc0291A0d5C97AAb42052Cb46dE60cCc); +address constant PROTOCOL_FUND_DEPLOYER = 0x0DabB96F2320A170ac0dDc985d105913D937ea9A; + +// +// eravm.kimlikdao.eth +// +address payable constant ERAVM_PROTOCOL_FUND = payable(0xcCc0f14de126FD0D2707Ad39F1b7698921550cCc); +address constant ERAVM_PROTOCOL_FUND_DEPLOYER = 0xadBde24bfC12829b30FaEe9cF5daB0F91AdC9400; + +// KPASS addresses +address constant KPASS_ADDR = 0xcCc0a9b023177549fcf26c947edb5bfD9B230cCc; +address constant KPASS_DEPLOYER = 0x305166299B002a9aDE0e907dEd848878FD2237D7; +address constant ERAVM_KPASS_ADDR = 0xcCc053d81e3B85Eac133a5333be4D7cBDd120cCc; +address constant ERAVM_KPASS_DEPLOYER = 0x1F7766565AaDD753379181678623273A82f8603c; + +// KDAO addresses +address constant KDAO_ADDR = 0xcCc0AC04C9251B74b0b30A20Fc7cb26EB62B0cCc; +address constant KDAO_DEPLOYER = 0xe7671eb60A45c905387df2b19A3803c6Be0Eb8f9; +address constant ERAVM_KDAO_ADDR = 0xcCc0b95cE2e18223bA8059F2c9Fad9d914450cCc; +address constant ERAVM_KDAO_DEPLOYER = 0x0410641e73f261b98EB7aB189F6b4e1052833c2A; + +// KDAO-l addresses +address constant KDAOL = 0xcCc0c4e5d57d251551575CEd12Aba80B43fF1cCc; +address constant KDAOL_DEPLOYER = 0x2EF1308e8641a20b509DC90d0568b96359498BBa; +address constant ERAVM_KDAOL = 0xcCc0948D9e47Ab3932271DA380B3525DD05a1cCc; +address constant ERAVM_KDAOL_DEPLOYER = 0xb81bFa6348ACc1Dab88cc2b35d7eEce4A68aE2b2; + +// Voting contract +address constant VOTING = 0xcCc01Ec0E6Fb38Cce8b313c3c8dbfe66efD01cCc; +address constant VOTING_DEPLOYER = 0xD808C187Ef7D6f9999b6D9538C72E095db8c6df9; +address constant ERAVM_VOTING = 0xcCc0a523f5392AD629EfAA49E71844E61AB81cCc; +address constant ERAVM_VOTING_DEPLOYER = 0x526F38A49130169412B00De254bDafbaAB4E7E91; + +// KPASS Signers +address constant KPASS_SIGNERS = 0xcCc09aA0d174271259D093C598FCe9Feb2791cCc; +address constant KPASS_SIGNERS_DEPLOYER = 0x4DeA92Bcb2C22011217C089797A270DfA5A51d53; +address constant ERAVM_KPASS_SIGNERS = 0xcCc0b54E5538fa5B4E0EcE1f2B0ba9C01c8A1cCc; +address constant ERAVM_KPASS_SIGNERS_DEPLOYER = 0x755DDeBf547DD2e9838d16b51525fe8e925a56D0; + +// dev.kimlikdao.eth +address constant DEV_FUND = 0xC152e02e54CbeaCB51785C174994c2084bd9EF51; diff --git a/contracts/AvalancheTokens.sol b/contracts/AvalancheTokens.sol index 79956fb..f9efd66 100644 --- a/contracts/AvalancheTokens.sol +++ b/contracts/AvalancheTokens.sol @@ -3,38 +3,12 @@ pragma solidity ^0.8.0; import "./IERC20Permit.sol"; -import {TCKO_ADDR} from "./Addresses.sol"; +import {KDAO_ADDR} from "./Addresses.sol"; -IERC20Permit constant FRAX = IERC20Permit( - 0xD24C2Ad096400B6FBcd2ad8B24E7acBc21A1da64 -); +IERC20Permit constant TCKO = IERC20Permit(KDAO_ADDR); -IERC20Permit constant MIM = IERC20Permit( - 0x130966628846BFd36ff31a822705796e8cb8C18D -); +IERC20Permit constant TRYB = IERC20Permit(0x564A341Df6C126f90cf3ECB92120FD7190ACb401); -IERC20Permit constant TCKO = IERC20Permit(TCKO_ADDR); +IERC20Permit constant USDC = IERC20Permit(0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E); -IERC20Permit constant TRYB = IERC20Permit( - 0x564A341Df6C126f90cf3ECB92120FD7190ACb401 -); - -IERC20Permit constant USDC = IERC20Permit( - 0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E -); - -IERC20Permit constant USDD = IERC20Permit( - 0xcf799767d366d789e8B446981C2D578E241fa25c -); - -IERC20Permit constant USDT = IERC20Permit( - 0x9702230A8Ea53601f5cD2dc00fDBc13d4dF4A8c7 -); - -IERC20Permit constant YUSD = IERC20Permit( - 0x111111111111ed1D73f860F57b2798b683f2d325 -); - -IERC20Permit constant BUSD = IERC20Permit( - 0x9C9e5fD8bbc25984B178FdCE6117Defa39d2db39 -); +IERC20Permit constant USDT = IERC20Permit(0x9702230A8Ea53601f5cD2dc00fDBc13d4dF4A8c7); diff --git a/contracts/IDAOKasasi.sol b/contracts/IDAOKasasi.sol deleted file mode 100644 index 0b5d855..0000000 --- a/contracts/IDAOKasasi.sol +++ /dev/null @@ -1,28 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "./DistroStage.sol"; - -uint256 constant AMOUNT_OFFSET = 208; - -uint256 constant SUPPLY_OFFSET = 160; - -interface IDAOKasasi { - /** - * Sends amount / supply fraction of all treasury assets to the redeemer. - * - *`amountSupplyRedeemer` layout: - * |-- amount --|-- supply --|-- redeemer --| - * |-- 48 --|-- 48 --|-- 160 --| - * - * @param amountSupplyRedeemer Packed amount, supply, and redeemer. - */ - function redeem(uint256 amountSupplyRedeemer) external; - - function distroStageUpdated(DistroStage) external; - - function versionHash() external pure returns (bytes32); - - function migrateToCode(IDAOKasasi codeAddress) external; -} diff --git a/contracts/IDIDSigners.sol b/contracts/IDIDSigners.sol index 6569676..e68f9f7 100644 --- a/contracts/IDIDSigners.sol +++ b/contracts/IDIDSigners.sol @@ -2,6 +2,13 @@ pragma solidity ^0.8.0; +struct Signature { + bytes32 r; + uint256 yParityAndS; +} + +uint256 constant DEPOSIT_OFFSET = 64; + uint256 constant END_TS_OFFSET = 112; uint256 constant END_TS_MASK = uint256(type(uint64).max) << 112; @@ -10,13 +17,39 @@ uint256 constant WITHDRAW_OFFSET = 176; uint256 constant WITHDRAW_MASK = uint256(type(uint48).max) << 176; +type uint128x2 is uint256; + +/** + * + * `signerInfo` layout: + * |-- color --|-- withdraw --|-- endTs --|-- deposit --|-- startTs --| + * |-- 32 --|-- 48 --|-- 64 --|-- 48 --|-- 64 --| + */ +type SignerInfo is uint256; + interface IDIDSigners { + function authenticateExposureReportID3Sigs( + bytes32 exposureReportID, + uint128x2 weightThresholdAndSignatureTs, + Signature[3] calldata sigs + ) external view; + + function authenticateHumanID3Sigs( + bytes32 exposureReportID, + uint128x2 weightThresholdAndSignatureTs, + bytes32 commitmentR, + Signature[3] calldata sigs + ) external view; + + function authenticateHumanID5Sigs( + bytes32 humanID, + uint128x2 weightThresholdAndSignatureTs, + bytes32 commitmentR, + Signature[5] calldata sigs + ) external view; + /** * Maps a signer node address to a bit packed struct. - * - *`signerInfo` layout: - * |-- color --|-- withdraw --|-- endTs --|-- deposit --|-- startTs --| - * |-- 32 --|-- 48 --|-- 64 --|-- 48 --|-- 64 --| */ - function signerInfo(address signer) external view returns (uint256); + function signerInfo(address signer) external view returns (SignerInfo); } diff --git a/contracts/DistroStage.sol b/contracts/IDistroStage.sol similarity index 91% rename from contracts/DistroStage.sol rename to contracts/IDistroStage.sol index 560c23e..4d871ff 100644 --- a/contracts/DistroStage.sol +++ b/contracts/IDistroStage.sol @@ -13,6 +13,6 @@ enum DistroStage { FinalUnlock } -interface HasDistroStage { +interface IDistroStage { function distroStage() external view returns (DistroStage); } diff --git a/contracts/IERC20.sol b/contracts/IERC20.sol index 6b6b302..c817a50 100644 --- a/contracts/IERC20.sol +++ b/contracts/IERC20.sol @@ -15,24 +15,13 @@ interface IERC20 { function transfer(address to, uint256 amount) external returns (bool); - function transferFrom( - address from, - address to, - uint256 amount - ) external returns (bool); + function transferFrom(address from, address to, uint256 amount) external returns (bool); - function allowance(address owner, address spender) - external - view - returns (uint256); + function allowance(address owner, address spender) external view returns (uint256); function approve(address spender, uint256 amount) external returns (bool); event Transfer(address indexed from, address indexed to, uint256 amount); - event Approval( - address indexed owner, - address indexed spender, - uint256 amount - ); + event Approval(address indexed owner, address indexed spender, uint256 amount); } diff --git a/contracts/IERC20Permit.sol b/contracts/IERC20Permit.sol index 4ee817a..3e5be6c 100644 --- a/contracts/IERC20Permit.sol +++ b/contracts/IERC20Permit.sol @@ -5,15 +5,8 @@ pragma solidity ^0.8.0; import "./IERC20.sol"; interface IERC20Permit is IERC20 { - function permit( - address owner, - address spender, - uint256 amount, - uint256 deadline, - uint8 v, - bytes32 r, - bytes32 s - ) external; + function permit(address owner, address spender, uint256 amount, uint256 deadline, uint8 v, bytes32 r, bytes32 s) + external; function nonces(address owner) external view returns (uint256); diff --git a/contracts/IERC721.sol b/contracts/IERC721.sol index c05bbf3..c7224f8 100644 --- a/contracts/IERC721.sol +++ b/contracts/IERC721.sol @@ -13,9 +13,5 @@ interface IERC721 { function supportsInterface(bytes4 interfaceId) external pure returns (bool); - event Transfer( - address indexed from, - address indexed to, - uint256 indexed tokenId - ); + event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); } diff --git a/contracts/IProtocolFund.sol b/contracts/IProtocolFund.sol new file mode 100644 index 0000000..a0b74e1 --- /dev/null +++ b/contracts/IProtocolFund.sol @@ -0,0 +1,26 @@ +// SPDX-License-Identifier: MIT + +pragma solidity ^0.8.0; + +uint256 constant REDEEM_INFO_AMOUNT_OFFSET = 208; + +uint256 constant REDEEM_INFO_SUPPLY_OFFSET = 160; + +/** + * `RedeemInfo` layout + * |-- amount --|-- supply --|-- redeemer --| + * |-- 48 --|-- 48 --|-- 160 --| + */ +type RedeemInfo is uint256; + +interface IProtocolFund { + /** + * @param redeemInfo the packed struct containing redeemed amount out of the + * total supply and the redeemer address. + * + * In the signal chain `ProtocolFund`, the method completes the asset transfer + * atomically. The remote `ProtocolFund` + * + */ + function redeem(RedeemInfo redeemInfo) external; +} diff --git a/contracts/IUpgradable.sol b/contracts/IUpgradable.sol new file mode 100644 index 0000000..4b790be --- /dev/null +++ b/contracts/IUpgradable.sol @@ -0,0 +1,9 @@ +// SPDX-License-Identifier: MIT + +pragma solidity ^0.8.0; + +interface IUpgradable { + function versionHash() external pure returns (bytes32); + + function migrateToCode(IUpgradable codeAddress) external; +} diff --git a/contracts/testing/MockDAOKasasiV1.sol b/contracts/testing/MockDAOKasasiV1.sol deleted file mode 100644 index 2aa8a5d..0000000 --- a/contracts/testing/MockDAOKasasiV1.sol +++ /dev/null @@ -1,29 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../IDAOKasasi.sol"; -import "forge-std/console.sol"; - -contract MockDAOKasasiV1 is IDAOKasasi { - function redeem(uint256 amountSupplyRedeemer) external { - uint256 amount = amountSupplyRedeemer >> 208; - uint256 supply = uint48(amountSupplyRedeemer >> 160); - address payable redeemer = payable( - address(uint160(amountSupplyRedeemer)) - ); - console.log("MockDAOKasasiV1.redeem()", redeemer, amount, supply); - uint256 toSendNative = (address(this).balance * amount) / supply; - if (toSendNative > 0) redeemer.transfer(toSendNative); - } - - function distroStageUpdated(DistroStage stage) external view { - console.log("MockDAOKasasiV1.distroStageUpdated()", uint256(stage)); - } - - function versionHash() external pure returns (bytes32) { - return 0; - } - - function migrateToCode(IDAOKasasi) external {} -} diff --git a/contracts/testing/MockDAOKasasi.sol b/contracts/testing/MockProtocolFund.sol similarity index 60% rename from contracts/testing/MockDAOKasasi.sol rename to contracts/testing/MockProtocolFund.sol index 71c0921..487f5fe 100644 --- a/contracts/testing/MockDAOKasasi.sol +++ b/contracts/testing/MockProtocolFund.sol @@ -17,22 +17,11 @@ contract MockDAOKasasi { assembly { let codeAddress := sload(CODE_SLOT) calldatacopy(0, 0, calldatasize()) - let result := delegatecall( - gas(), - codeAddress, - 0, - calldatasize(), - 0, - 0 - ) + let result := delegatecall(gas(), codeAddress, 0, calldatasize(), 0, 0) returndatacopy(0, 0, returndatasize()) switch result - case 0 { - revert(0, returndatasize()) - } - default { - return(0, returndatasize()) - } + case 0 { revert(0, returndatasize()) } + default { return(0, returndatasize()) } } } } diff --git a/contracts/testing/MockProtocolFundV1.sol b/contracts/testing/MockProtocolFundV1.sol new file mode 100644 index 0000000..6624923 --- /dev/null +++ b/contracts/testing/MockProtocolFundV1.sol @@ -0,0 +1,29 @@ +// SPDX-License-Identifier: MIT + +pragma solidity ^0.8.0; + +import "forge-std/console.sol"; +import {DistroStage} from "../IDistroStage.sol"; +import {IProtocolFund, RedeemInfo, REDEEM_INFO_AMOUNT_OFFSET, REDEEM_INFO_SUPPLY_OFFSET} from "../IProtocolFund.sol"; +import {IUpgradable} from "../IUpgradable.sol"; + +contract MockProtocolFundV1 is IProtocolFund, IUpgradable { + function redeem(RedeemInfo redeemInfo) external { + uint256 amount = RedeemInfo.unwrap(redeemInfo) >> REDEEM_INFO_AMOUNT_OFFSET; + uint256 supply = uint48(RedeemInfo.unwrap(redeemInfo) >> REDEEM_INFO_SUPPLY_OFFSET); + address payable redeemer = payable(address(uint160(RedeemInfo.unwrap(redeemInfo)))); + console.log("MockProtocolFundV1.redeem()", redeemer, amount, supply); + uint256 toSendNative = (address(this).balance * amount) / supply; + if (toSendNative > 0) redeemer.transfer(toSendNative); + } + + function distroStageUpdated(DistroStage stage) external view { + console.log("MockProtocolFundV1.distroStageUpdated()", uint256(stage)); + } + + function versionHash() external pure returns (bytes32) { + return 0; + } + + function migrateToCode(IUpgradable) external {} +} diff --git a/contracts/testing/MockTokens.sol b/contracts/testing/MockTokens.sol index 25a736e..6d50073 100644 --- a/contracts/testing/MockTokens.sol +++ b/contracts/testing/MockTokens.sol @@ -52,8 +52,7 @@ function DeployMockTokens() { */ contract MockERC20Permit is IERC20Permit { // keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)"); - bytes32 public constant PERMIT_TYPEHASH = - 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9; + bytes32 public constant PERMIT_TYPEHASH = 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9; bytes32 public immutable override DOMAIN_SEPARATOR; uint8 public immutable override decimals; @@ -64,24 +63,18 @@ contract MockERC20Permit is IERC20Permit { mapping(address => mapping(address => uint256)) public override allowance; mapping(address => uint256) public override nonces; - constructor( - string memory tokenSymbol, - string memory tokenName, - uint8 tokenDecimals - ) { + constructor(string memory tokenSymbol, string memory tokenName, uint8 tokenDecimals) { name = tokenName; symbol = tokenSymbol; decimals = tokenDecimals; - uint256 toMint = 100 * 10**decimals; + uint256 toMint = 100 * 10 ** decimals; balanceOf[msg.sender] = toMint; totalSupply = toMint; emit Transfer(address(this), msg.sender, toMint); DOMAIN_SEPARATOR = 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(tokenSymbol)), keccak256(bytes("1")), 43114, @@ -105,14 +98,11 @@ 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) + if (allowed != type(uint256).max) { allowance[from][msg.sender] = allowed - amount; + } balanceOf[from] -= amount; unchecked { balanceOf[to] += amount; @@ -121,31 +111,16 @@ contract MockERC20Permit is IERC20Permit { return true; } - function permit( - address owner, - address spender, - uint256 amount, - uint256 deadline, - uint8 v, - bytes32 r, - bytes32 s - ) external { + 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); diff --git a/contracts/testing/eravm.sol b/contracts/testing/eravm.sol new file mode 100644 index 0000000..b717602 --- /dev/null +++ b/contracts/testing/eravm.sol @@ -0,0 +1,10 @@ +// SPDX-License-Identifier: MIT + +pragma solidity ^0.8.0; + +bytes32 constant CREATE_PREFIX = 0x63bae3a9951d38e8a3fbb7b70909afc1200610fc5bc55ade242f815974674f23; + +function computeCreateAddress(address deployer, uint256 nonce) pure returns (address) { + bytes32 hash = keccak256(bytes.concat(CREATE_PREFIX, bytes32(uint256(uint160(deployer))), bytes32(nonce))); + return address(uint160(uint256(hash))); +} diff --git a/foundry.toml b/foundry.toml index 895ac7a..0bae6d4 100644 --- a/foundry.toml +++ b/foundry.toml @@ -1,2 +1,6 @@ [profile.default] src = 'contracts' +solc_version = "0.8.25" +optimier = true +optimizer_runs = 20_000 +remappings = ['forge-std/=lib/forge-std/src/'] diff --git a/lib/forge-std b/lib/forge-std index 662ae0d..bb4ceea 160000 --- a/lib/forge-std +++ b/lib/forge-std @@ -1 +1 @@ -Subproject commit 662ae0d6936654c5d1fb79fc15f521de28edb60e +Subproject commit bb4ceea94d6f10eeb5b41dc2391c6c8bf8e734ef diff --git a/remappings.txt b/remappings.txt deleted file mode 100644 index 845bd0a..0000000 --- a/remappings.txt +++ /dev/null @@ -1,2 +0,0 @@ -ds-test/=lib/forge-std/lib/ds-test/src/ -forge-std/=lib/forge-std/src/ diff --git a/test/AddressesTest.sol b/test/AddressesTest.sol index 91b881c..73ece05 100644 --- a/test/AddressesTest.sol +++ b/test/AddressesTest.sol @@ -4,41 +4,26 @@ pragma solidity ^0.8.0; import "contracts/Addresses.sol"; import "forge-std/Test.sol"; - -contract Dummy {} +import {computeCreateAddress as computeEraVMCreateAddress} from "contracts/testing/eravm.sol"; contract AddressesTest is Test { - function testDeployerConsistency() public { - // DAO_KASASI - vm.prank(DAO_KASASI_DEPLOYER); - Dummy daoKasasi = new Dummy(); - - assertEq(address(daoKasasi), DAO_KASASI); - - // OYLAMA - vm.prank(OYLAMA_DEPLOYER); - Dummy oylama = new Dummy(); - - assertEq(address(oylama), OYLAMA); - - // TCKO - vm.prank(TCKO_DEPLOYER); - Dummy tcko = new Dummy(); + function testDeployerConsistency() public pure { + assertEq(computeCreateAddress(PROTOCOL_FUND_DEPLOYER, 0), PROTOCOL_FUND); + assertEq(computeEraVMCreateAddress(ERAVM_PROTOCOL_FUND_DEPLOYER, 0), ERAVM_PROTOCOL_FUND); - assertEq(address(tcko), TCKO_ADDR); + assertEq(computeCreateAddress(KDAO_DEPLOYER, 0), KDAO_ADDR); + assertEq(computeEraVMCreateAddress(ERAVM_KDAO_DEPLOYER, 0), ERAVM_KDAO_ADDR); - vm.prank(TCKOK_DEPLOYER); - Dummy tckok = new Dummy(); + assertEq(computeCreateAddress(KDAO_DEPLOYER, 0), KDAO_ADDR); + assertEq(computeEraVMCreateAddress(ERAVM_KDAO_DEPLOYER, 0), ERAVM_KDAO_ADDR); - assertEq(address(tckok), TCKOK); + assertEq(computeCreateAddress(KDAOL_DEPLOYER, 0), KDAOL); + assertEq(computeEraVMCreateAddress(ERAVM_KDAOL_DEPLOYER, 0), ERAVM_KDAOL); - // TCKT - vm.prank(TCKT_DEPLOYER); - Dummy tckt = new Dummy(); - vm.prank(TCKT_SIGNERS_DEPLOYER); - Dummy tcktSigners = new Dummy(); + assertEq(computeCreateAddress(VOTING_DEPLOYER, 0), VOTING); + assertEq(computeEraVMCreateAddress(ERAVM_VOTING_DEPLOYER, 0), ERAVM_VOTING); - assertEq(address(tckt), TCKT_ADDR); - assertEq(address(tcktSigners), TCKT_SIGNERS); + assertEq(computeCreateAddress(KPASS_SIGNERS_DEPLOYER, 0), KPASS_SIGNERS); + assertEq(computeEraVMCreateAddress(ERAVM_KPASS_SIGNERS_DEPLOYER, 0), ERAVM_KPASS_SIGNERS); } }