Skip to content

Commit

Permalink
πŸ’‰ Improve tests
Browse files Browse the repository at this point in the history
  • Loading branch information
KimlikDAO-bot committed May 3, 2024
1 parent 8b71b0f commit 9d3e431
Show file tree
Hide file tree
Showing 9 changed files with 400 additions and 64 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -12,3 +12,4 @@ deployments-zk
node_modules
out
zkout
remappings.txt
4 changes: 1 addition & 3 deletions ethereum/KDAO.sol
Original file line number Diff line number Diff line change
Expand Up @@ -126,9 +126,7 @@ contract KDAO is IERC20Permit {

// 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("KDAO")),
// keccak256(bytes("1")),
// 0x1,
Expand Down
111 changes: 111 additions & 0 deletions test/ethereum/KDAO.permit.t.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,111 @@
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import {KDAO} from "ethereum/KDAO.sol";
import {Test, stdError} from "forge-std/Test.sol";
import {KDAO_ETHEREUM, KDAO_ETHEREUM_DEPLOYER} from "interfaces/kimlikdao/addresses.sol";

contract KDAOPermitTest is Test {
KDAO private kdao;

function setUp() external {
vm.prank(KDAO_ETHEREUM_DEPLOYER);
kdao = new KDAO();
}

function testDomainSeparator() external view {
assertEq(
kdao.DOMAIN_SEPARATOR(),
keccak256(
abi.encode(
keccak256(
"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"
),
keccak256(bytes("KDAO")),
keccak256(bytes("1")),
0x1,
KDAO_ETHEREUM
)
)
);
}

function authorizePayment(
uint256 ownerPrivateKey,
address spender,
uint256 amount,
uint256 deadline,
uint256 nonce
) internal view returns (uint8, bytes32, bytes32) {
bytes32 digest = keccak256(
abi.encodePacked(
"\x19\x01",
kdao.DOMAIN_SEPARATOR(),
keccak256(
abi.encode(
0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9,
vm.addr(ownerPrivateKey),
spender,
amount,
nonce,
deadline
)
)
)
);
return vm.sign(ownerPrivateKey, digest);
}

function testPermit() external {
{
uint256 deadline = block.timestamp + 1000;
(uint8 v, bytes32 r, bytes32 s) =
authorizePayment(1337, address(888), 100_000e6, deadline, 0);
kdao.permit(vm.addr(1337), address(888), 100_000e6, deadline, v, r, s);

assertEq(kdao.allowance(vm.addr(1337), address(888)), 100_000e6);
}

{
uint256 deadline = block.timestamp + 2000;
(uint8 v, bytes32 r, bytes32 s) =
authorizePayment(1337, address(888), 200_000e6, deadline, 1);
kdao.permit(vm.addr(1337), address(888), 200_000e6, deadline, v, r, s);

assertEq(kdao.allowance(vm.addr(1337), address(888)), 200_000e6);
}

{
uint256 deadline = block.timestamp + 3000;
(uint8 v, bytes32 r, bytes32 s) =
authorizePayment(1337, address(999), 300_000e6, deadline, 2);
kdao.permit(vm.addr(1337), address(999), 300_000e6, deadline, v, r, s);

assertEq(kdao.allowance(vm.addr(1337), address(999)), 300_000e6);
}
}

function testPermitMalformedSignature() external {
uint256 deadline = block.timestamp + 1000;
(uint8 v, bytes32 r, bytes32 s) =
authorizePayment(1337, address(888), 100_000e6, deadline, 0);

vm.expectRevert();
kdao.permit(vm.addr(1337), address(888), 100_000e6, deadline, 2, r, s);

vm.expectRevert();
kdao.permit(vm.addr(1338), address(888), 100_000e6, deadline, 2, r, s);

kdao.permit(vm.addr(1337), address(888), 100_000e6, deadline, v, r, s);
}

function testExpiredPermitSignature() external {
uint256 deadline = block.timestamp + 1000;
(uint8 v, bytes32 r, bytes32 s) =
authorizePayment(1337, address(888), 100_000e6, deadline, 0);
vm.warp(deadline + 1);
vm.expectRevert();
kdao.permit(vm.addr(1337), address(888), 100_000e6, deadline, v, r, s);
}
}
94 changes: 94 additions & 0 deletions test/ethereum/KDAO.redeem.t.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import {KDAO, MockKDAO} from "./MockKDAO.sol";
import {Test, console, stdError} from "forge-std/Test.sol";
import {USDT} from "interfaces/ethereum/addresses.sol";
import {deployMockTokens} from "interfaces/ethereum/mockTokens.sol";
import {IProtocolFund, ProtocolFund, RedeemInfoFrom} from "interfaces/kimlikdao/IProtocolFund.sol";
import {
KDAO_ETHEREUM,
KDAO_ETHEREUM_DEPLOYER,
PROTOCOL_FUND,
PROTOCOL_FUND_DEPLOYER
} from "interfaces/kimlikdao/addresses.sol";
import {MockERC20} from "interfaces/testing/MockERC20Permit.sol";
import {MockProtocolFundV1} from "interfaces/testing/MockProtocolFundV1.sol";
import {uint48x2From} from "interfaces/types/uint48x2.sol";

contract KDAORedeemTest is Test {
KDAO private kdao;
IProtocolFund private protocolFund;

function setUp() external {
vm.prank(KDAO_ETHEREUM_DEPLOYER);
kdao = new MockKDAO();

vm.prank(PROTOCOL_FUND_DEPLOYER);
protocolFund = new MockProtocolFundV1();

assertEq(address(protocolFund), PROTOCOL_FUND);

deployMockTokens();
vm.deal(PROTOCOL_FUND, 100 ether);

vm.prank(PROTOCOL_FUND);
MockERC20(address(USDT)).mint(100_000_000e6);
}

function testInitialBalances() external view {
assertEq(PROTOCOL_FUND.balance, 100 ether);
assertEq(USDT.balanceOf(PROTOCOL_FUND), 100_000_000e6);
}

function testRedeem() external {
// KimlikDAO protocol has 100M USDT and 100 ethere.
// address(20) owns 1% of the KimlikDAO protocol.
// address(20) redeems their entire stake.
assertEq(address(20).balance, 0);
assertEq(USDT.balanceOf(address(20)), 0);
assertEq(kdao.balanceOf(address(20)), 1_000_000e6);
assertEq(kdao.totalSupply(), 1_002_000e6);
assertEq(kdao.maxSupply(), 100_000_000e6);
assertEq(kdao.circulatingSupply(), 1_002_000e6);

vm.prank(address(20), address(20));
kdao.redeem(1_000_000e6);

assertEq(kdao.balanceOf(address(20)), 0);
assertEq(address(20).balance, 1 ether);
assertEq(USDT.balanceOf(address(20)), 1_000_000e6);
assertEq(kdao.maxSupply(), 99_000_000e6);
assertEq(kdao.totalSupply(), 2_000e6);
assertEq(kdao.circulatingSupply(), 2_000e6);
}

function testRedeemViaTransfer() external {
// KimlikDAO protocol has 100M USDT and 100 ethere.
// address(20) owns 1% of the KimlikDAO protocol.
// address(20) redeems their entire stake.
assertEq(address(20).balance, 0);
assertEq(USDT.balanceOf(address(20)), 0);
assertEq(kdao.balanceOf(address(20)), 1_000_000e6);
assertEq(kdao.totalSupply(), 1_002_000e6);
assertEq(kdao.maxSupply(), 100_000_000e6);
assertEq(kdao.circulatingSupply(), 1_002_000e6);

vm.prank(address(20), address(20));
kdao.transfer(PROTOCOL_FUND, 1_000_000e6);

assertEq(kdao.balanceOf(address(20)), 0);
assertEq(address(20).balance, 1 ether);
assertEq(USDT.balanceOf(address(20)), 1_000_000e6);
assertEq(kdao.maxSupply(), 99_000_000e6);
assertEq(kdao.totalSupply(), 2_000e6);
assertEq(kdao.circulatingSupply(), 2_000e6);
}

function testRedeemOnlyEOA() external {
vm.prank(address(20), address(21));
vm.expectRevert();
kdao.redeem(1_000_000e6);
}
}
Loading

0 comments on commit 9d3e431

Please sign in to comment.