-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathFund.s.sol
161 lines (139 loc) · 6.62 KB
/
Fund.s.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
// SPDX-License-Identifier: UNLICENSED
pragma solidity 0.8.18;
import "forge-std/Script.sol";
import "forge-std/console.sol";
import "../src/fund/Fund.sol";
import "../src/fund/CommitmentManager.sol";
import "../src/compliance/ComplianceRegistry.sol";
import "openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol";
contract FundDemoScript is Script {
Fund fund;
ComplianceRegistry registry;
address[] accounts = new address[](2);
function run() public {
// Setup
address usdc = address(0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48);
address lp1 = vm.addr(1);
address lp2 = vm.addr(2);
address fundAdmin = vm.addr(3);
address kycAdmin = vm.addr(4);
address amlAdmin = vm.addr(5);
address proxyAdmin = vm.addr(6);
accounts[0] = lp1;
accounts[1] = lp2;
address registryImpl = address(new ComplianceRegistry());
TransparentUpgradeableProxy registryProxy = new TransparentUpgradeableProxy(registryImpl, proxyAdmin, "");
registry = ComplianceRegistry(address(registryProxy));
registry.initialize(kycAdmin, amlAdmin);
uint32 expiry = uint32(block.timestamp + 30 days);
vm.startPrank(kycAdmin);
registry.setKycStatus(lp1, expiry, ComplianceRegistry.Status.Compliant);
registry.setKycStatus(lp2, expiry, ComplianceRegistry.Status.Compliant);
vm.stopPrank();
vm.startPrank(amlAdmin);
registry.setAmlStatus(lp1, expiry, ComplianceRegistry.Status.Compliant);
registry.setAmlStatus(lp2, expiry, ComplianceRegistry.Status.Compliant);
vm.stopPrank();
vm.startPrank(fundAdmin);
// Step 1: Deploy fund
address fundImpl = address(new Fund());
TransparentUpgradeableProxy fundProxy = new TransparentUpgradeableProxy(fundImpl, proxyAdmin, "");
fund = Fund(address(fundProxy));
fund.initialize({
name_: "Demo Fund",
symbol_: "DEMO",
registryAddress_: address(registry),
usdc_: address(usdc),
initialClosing_: uint32(block.timestamp + 1 days),
finalClosing_: uint32(block.timestamp + 30 days),
endDate_: uint32(block.timestamp + 60 days),
commitmentDate_: uint32(block.timestamp + 15 days),
blockSize_: 10000,
scale_: 8,
price_: 100,
prefRate_: 8,
compoundingInterval_: InterestPayments.CompoundingPeriod.ANNUAL_COMPOUNDING,
gpClawback_: 20,
carriedInterest_: 20,
managementFee_: 2
});
console.log("Step 1: Fund deployed successfully");
showFundDetails();
// Step 2: LP1 commits
fund.addLpCommit(lp1, 20000000);
console.log("Step 2: LP1 commitment added successfully");
showFundDetails();
// Step 3: LP2 commits
fund.addLpCommit(lp2, 40000000);
console.log("Step 3: LP2 commitment added successfully");
showFundDetails();
// Step 4: Approve commits
vm.warp(block.timestamp + 1 days);
fund.approveCommits(accounts);
console.log("Step 4: LP1 and LP2 commits approved");
showFundDetails();
// Step 5: Admin calls capital
vm.warp(block.timestamp + 1 days);
uint16 callId = fund.capitalCall(10000000, "invest A");
console.log("Step 6: Capital called");
showFundDetails();
// Step 6: Admin confirms capital call for LP1
fund.capitalCallDone(callId, lp1, 100);
console.log("Step 7: Capital call confirmed for LP1");
showFundDetails();
// Step 7: Admin confirms capital call for LP2
fund.capitalCallDone(callId, lp2, 100);
console.log("Step 8: Capital call confirmed for LP2");
showFundDetails();
}
function showFundDetails() private view {
console.log("--------------------------------------------------------");
console.log("%s Details", fund.name());
console.log("--------------------------------------------------------");
// Print general fund details
uint256 fundSize = fund.blockSize();
uint256 fundPrice = fund.price();
uint256 totalCommitted = fund.totalCommitted();
uint256 totalCommittedGp = fund.totalCommittedGp();
uint256 totalCommittedLp = fund.totalCommittedLp();
uint256 totalCalled = fund.totalCalled();
console.log("Block Size | %d", fundSize);
console.log("Price | %d", fundPrice);
console.log("Total Committed | %d", totalCommitted);
console.log(unicode" ├─ Committed by GPs | %d", totalCommittedGp);
console.log(unicode" └- Committed by LPs | %d", totalCommittedLp);
console.log("Total Called | %d", totalCalled);
console.log("--------------------------------------------------------");
console.log("Account Details");
console.log("--------------------------------------------------------");
for (uint256 i = 0; i < accounts.length; i++) {
console.log("Account: %s (LP%s)", accounts[i], i + 1);
// Print account commitments
(uint256 amount, Fund.CommitState status) = fund.lpCommitments(accounts[i]);
console.log(" Commitment: %d, Status: %s", amount, commitStateToString(uint8(status)));
// Print LP commit token balance
uint256 lpCommitAmount = fund.lpCommitToken().balanceOf(accounts[i]);
console.log(" LP Commit Tokens : %d", lpCommitAmount);
// Print GP commit token balance
uint256 gpCommitAmount = fund.gpCommitToken().balanceOf(accounts[i]);
console.log(" GP Commit Tokens : %d", gpCommitAmount);
// Print LP Fund Token balance
uint256 lpFundAmount = fund.lpFundToken().balanceOf(accounts[i]);
console.log(" LP Fund Tokens : %d", lpFundAmount);
// Print GP Fund Token balance
uint256 gpFundAmount = fund.gpFundToken().balanceOf(accounts[i]);
console.log(" GP Fund Tokens : %d", gpFundAmount);
console.log("--------------------------------------------------------");
}
console.log("\n\n");
}
function commitStateToString(uint8 state) private pure returns (string memory) {
if (state == 0) return "COMMIT_NONE";
if (state == 1) return "COMMIT_PENDING";
if (state == 2) return "COMMIT_APPROVED";
if (state == 3) return "COMMIT_CANCELLED";
if (state == 4) return "COMMIT_REJECTED";
if (state == 5) return "COMMIT_BLOCKED";
return "Unknown";
}
}