Skip to content

Commit 223d773

Browse files
committed
tests: invariant balance operator
1 parent 3f3ab1f commit 223d773

1 file changed

Lines changed: 95 additions & 0 deletions

File tree

test/finance/TrustlessEscrow.sol

Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
// SPDX-License-Identifier: BUSL-1.1
2+
pragma solidity 0.8.26;
3+
4+
import "forge-std/Test.sol";
5+
6+
import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
7+
import { ITollgate } from "@synaps3/core/interfaces/economics/ITollgate.sol";
8+
import { ILedgerVault } from "@synaps3/core/interfaces/financial/ILedgerVault.sol";
9+
import { IAgreementManager } from "@synaps3/core/interfaces/financial/IAgreementManager.sol";
10+
import { IAgreementSettler } from "@synaps3/core/interfaces/financial/IAgreementSettler.sol";
11+
import { BaseTest } from "test/BaseTest.t.sol";
12+
import { T } from "contracts/core/primitives/Types.sol";
13+
import { C } from "contracts/core/primitives/Constants.sol";
14+
15+
contract MockArbiter {
16+
IAgreementSettler public immutable AGREEMENT_SETTLER;
17+
18+
constructor(address agreementSettler) {
19+
AGREEMENT_SETTLER = IAgreementSettler(agreementSettler);
20+
}
21+
22+
function executeAgreement(uint256 proof, address counterparty) external returns (T.Agreement memory agreement) {
23+
agreement = AGREEMENT_SETTLER.settleAgreement(proof, counterparty);
24+
}
25+
}
26+
27+
contract TrustlessEscrowTest is BaseTest {
28+
MockArbiter arbiter;
29+
30+
function setUp() public initialize {
31+
deployAgreementSettler();
32+
arbiter = MockArbiter(agreementSettler);
33+
34+
uint256 fees = 500; // 5%
35+
vm.prank(governor);
36+
ITollgate(tollgate).setFees(T.Scheme.BPS, address(arbiter), fees, token);
37+
38+
vm.startPrank(admin);
39+
40+
uint256 amount = 100 * 1e18;
41+
IERC20(token).approve(ledger, amount);
42+
ILedgerVault(ledger).deposit(user, amount, token);
43+
vm.stopPrank();
44+
}
45+
46+
function test_PreviewAgreement_ReturnExpectedAgreement() public {
47+
uint256 amount = 10 * 1e18;
48+
IAgreementManager manager = IAgreementManager(agreementManager);
49+
(uint256 feesBPS, ) = ITollgate(tollgate).getFees(address(arbiter),token);
50+
51+
address[] memory parties = new address[](2);
52+
parties[0] = vm.addr(1);
53+
parties[1] = vm.addr(2);
54+
55+
vm.prank(user);
56+
T.Agreement memory agreement = manager.previewAgreement(amount, token, address(arbiter), parties, "");
57+
uint256 fees = (feesBPS * amount) / 10_000; // 5% configured
58+
59+
assertEq(agreement.total, amount);
60+
assertEq(agreement.initiator, user);
61+
assertEq(agreement.fees, fees);
62+
assertEq(agreement.locked, amount); // eq amount if not exceed allowed parties
63+
assertEq(agreement.currency, token);
64+
assertEq(agreement.arbiter, address(arbiter));
65+
assertEq(agreement.parties, parties);
66+
assertEq(agreement.payload, "");
67+
}
68+
69+
function testFuzz_PreviewAgreement_ReturnPenalizedAgreement(uint256 partiesLen) public {
70+
uint256 amount = 100 * 1e18;
71+
// max 18 are allowed with soft cap maxParties = 5
72+
// force penalization with min 6, maxParties + 13 = 18
73+
uint256 capped = bound(partiesLen, 6, 18);
74+
IAgreementManager manager = IAgreementManager(agreementManager);
75+
76+
// max is 5, per each extra 1% in accumulated succession,
77+
// eg: 6, 7, 8 = 1 + 2 + 3 = 6% penalization
78+
address[] memory parties = new address[](capped);
79+
for (uint256 i = 0; i < capped; i++) {
80+
parties[i] = vm.addr(i + 1);
81+
}
82+
83+
T.Agreement memory agreement = manager.previewAgreement(amount, token, address(arbiter), parties, "");
84+
85+
uint256 exceed = capped - 5; // default maxParties = 5;
86+
uint256 expectedPercentage = (exceed * (exceed + 1)) / 2;
87+
uint256 expectedPenalizationBPS = expectedPercentage * 100;
88+
uint256 expectedPenalizationAmount = (amount * expectedPenalizationBPS) / C.BPS_MAX;
89+
uint256 expectedLocked = amount + expectedPenalizationAmount;
90+
91+
assertEq(agreement.total, amount);
92+
assertEq(agreement.locked, expectedLocked);
93+
assertEq(agreement.parties, parties);
94+
}
95+
}

0 commit comments

Comments
 (0)