Skip to content

Commit 770f8b6

Browse files
authored
Merge pull request #74 from Merit-Systems/feat/batch-deposit-limit
batch deposit limit
2 parents 7729603 + b33dd11 commit 770f8b6

File tree

12 files changed

+97
-76
lines changed

12 files changed

+97
-76
lines changed

interface/IEscrow.sol

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ interface IEscrow {
3838
event TokenRemovedFromWhitelist(address indexed token);
3939
event BatchDeposited (uint indexed batchId, uint repoId, uint timestamp, uint[] depositIds);
4040
event SignerSet (address indexed newSigner);
41+
event BatchDepositLimitSet (uint newLimit);
4142

4243
/**
4344
* @notice Deposits tokens into the escrow on behalf of a specified sender and recipient.

libraries/Errors.sol

Lines changed: 34 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -2,36 +2,38 @@
22
pragma solidity =0.8.26;
33

44
library Errors {
5-
string internal constant NOT_OWNER = "Not Owner";
6-
string internal constant NOT_SUPPORTED = "Not Supported";
7-
string internal constant ALREADY_INITIALIZED = "Already Initialized";
8-
string internal constant LENGTH_MISMATCH = "Length Mismatch";
9-
string internal constant ZERO_SHARE = "Zero Share";
10-
string internal constant NO_TIME_ELAPSED = "No Time Elapsed";
11-
string internal constant NO_NEW_MINTED_SHARES = "No New Minted Shares";
12-
string internal constant NO_PULL_REQUESTS = "No Pull Requests";
13-
string internal constant NO_WEIGHTS = "No Weights";
14-
string internal constant NOT_INITIALIZED = "Not Initialized";
15-
string internal constant NOT_ACCOUNT_OWNER = "Not Account Owner";
16-
string internal constant ALREADY_CLAIMED = "Already Claimed";
17-
string internal constant INVALID_PROOF = "Invalid Proof";
18-
string internal constant INVALID_ROOT = "Invalid Root";
19-
string internal constant NO_CONTRIBUTORS = "No Contributors";
20-
string internal constant TOO_MANY_CONTRIBUTORS = "Too Many Contributors";
21-
string internal constant TOO_MANY_PULL_REQUESTS = "Too Many Pull Requests";
22-
string internal constant NO_PAYMENT_PERMISSION = "No Payment Permission";
23-
string internal constant CLAIM_EXPIRED = "Claim Expired";
24-
string internal constant STILL_CLAIMABLE = "Still Claimable";
25-
string internal constant INVALID_SIGNATURE = "Invalid Signature";
26-
string internal constant INVALID_ADDRESS = "Invalid Address";
27-
string internal constant INVALID_AMOUNT = "Invalid Amount";
28-
string internal constant INVALID_CLAIM_PERIOD = "Invalid Claim Period";
29-
string internal constant INVALID_RECIPIENT = "Invalid Recipient";
30-
string internal constant TOKEN_NOT_WHITELISTED = "Token Not Whitelisted";
31-
string internal constant TOKEN_ALREADY_WHITELISTED = "Token Already Whitelisted";
32-
string internal constant SIGNATURE_EXPIRED = "Signature Expired";
33-
string internal constant INVALID_DEPOSIT_ID = "Invalid Deposit ID";
34-
string internal constant INVALID_TOKEN = "Invalid Token";
35-
string internal constant INVALID_FEE = "Invalid Fee";
36-
string internal constant INVALID_AMOUNT_AFTER_FEE = "Invalid Amount After Fee";
5+
string internal constant NOT_OWNER = "Not Owner";
6+
string internal constant NOT_SUPPORTED = "Not Supported";
7+
string internal constant ALREADY_INITIALIZED = "Already Initialized";
8+
string internal constant LENGTH_MISMATCH = "Length Mismatch";
9+
string internal constant ZERO_SHARE = "Zero Share";
10+
string internal constant NO_TIME_ELAPSED = "No Time Elapsed";
11+
string internal constant NO_NEW_MINTED_SHARES = "No New Minted Shares";
12+
string internal constant NO_PULL_REQUESTS = "No Pull Requests";
13+
string internal constant NO_WEIGHTS = "No Weights";
14+
string internal constant NOT_INITIALIZED = "Not Initialized";
15+
string internal constant NOT_ACCOUNT_OWNER = "Not Account Owner";
16+
string internal constant ALREADY_CLAIMED = "Already Claimed";
17+
string internal constant INVALID_PROOF = "Invalid Proof";
18+
string internal constant INVALID_ROOT = "Invalid Root";
19+
string internal constant NO_CONTRIBUTORS = "No Contributors";
20+
string internal constant TOO_MANY_CONTRIBUTORS = "Too Many Contributors";
21+
string internal constant TOO_MANY_PULL_REQUESTS = "Too Many Pull Requests";
22+
string internal constant NO_PAYMENT_PERMISSION = "No Payment Permission";
23+
string internal constant CLAIM_EXPIRED = "Claim Expired";
24+
string internal constant STILL_CLAIMABLE = "Still Claimable";
25+
string internal constant INVALID_SIGNATURE = "Invalid Signature";
26+
string internal constant INVALID_ADDRESS = "Invalid Address";
27+
string internal constant INVALID_AMOUNT = "Invalid Amount";
28+
string internal constant INVALID_CLAIM_PERIOD = "Invalid Claim Period";
29+
string internal constant INVALID_RECIPIENT = "Invalid Recipient";
30+
string internal constant TOKEN_NOT_WHITELISTED = "Token Not Whitelisted";
31+
string internal constant TOKEN_ALREADY_WHITELISTED = "Token Already Whitelisted";
32+
string internal constant SIGNATURE_EXPIRED = "Signature Expired";
33+
string internal constant INVALID_DEPOSIT_ID = "Invalid Deposit ID";
34+
string internal constant INVALID_TOKEN = "Invalid Token";
35+
string internal constant INVALID_FEE = "Invalid Fee";
36+
string internal constant INVALID_AMOUNT_AFTER_FEE = "Invalid Amount After Fee";
37+
string internal constant INVALID_BATCH_DEPOSIT_LIMIT = "Invalid Batch Deposit Limit";
38+
string internal constant BATCH_DEPOSIT_LIMIT_EXCEEDED = "Batch Deposit Limit Exceeded";
3739
}

libraries/Params.sol

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ library Params {
66
address constant OWNER = 0x9d8A62f656a8d1615C1294fd71e9CFb3E4855A4F;
77
address constant SIGNER = 0x9d8A62f656a8d1615C1294fd71e9CFb3E4855A4F;
88

9+
uint constant BATCH_DEPOSIT_LIMIT = 500;
10+
911
// BASE
1012
address constant BASE_WETH = 0x4200000000000000000000000000000000000006;
1113
address constant BASE_USDC = 0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913;

script/Deploy.Base.s.sol

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,12 @@ contract DeployBase is Deploy {
1111
address[] memory initialWhitelistedTokens = new address[](1);
1212
initialWhitelistedTokens[0] = Params.BASE_USDC;
1313

14-
escrow = deploy(Params.OWNER, Params.SIGNER, initialWhitelistedTokens, Params.BASE_FEE_BPS);
14+
escrow = deploy(
15+
Params.OWNER,
16+
Params.SIGNER,
17+
initialWhitelistedTokens,
18+
Params.BASE_FEE_BPS,
19+
Params.BATCH_DEPOSIT_LIMIT
20+
);
1521
}
1622
}

script/Deploy.Test.Base.s.sol

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ abstract contract DeployTestBase is Deploy {
3535
initialWhitelistedTokens[1] = usdc;
3636
initialWhitelistedTokens[2] = address(mockUSDC);
3737

38-
escrow = deploy(owner, signer, initialWhitelistedTokens, 0);
38+
escrow = deploy(owner, signer, initialWhitelistedTokens, 0, Params.BATCH_DEPOSIT_LIMIT);
3939
}
4040

4141
function createTestPayments(

script/Deploy.s.sol

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@ contract Deploy is Script {
1010
address owner,
1111
address signer,
1212
address[] memory initialWhitelistedTokens,
13-
uint feeBps
13+
uint feeBps,
14+
uint batchDepositLimit
1415
)
1516
public
1617
returns (Escrow escrow)
@@ -21,7 +22,8 @@ contract Deploy is Script {
2122
owner,
2223
signer,
2324
initialWhitelistedTokens,
24-
feeBps
25+
feeBps,
26+
batchDepositLimit
2527
);
2628

2729
vm.stopBroadcast();

script/utils/CreatePayments.s.sol

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ contract CreatePayments is Script {
1414
uint constant AMOUNT_PER_DEPOSIT = 100 * 10**6;
1515
address constant ESCROW_ADDRESS = 0x18578b0168D940623b89Dd0Be880fF994305Fd7e;
1616
address constant TOKEN = 0x883066fabE2CC5b8f5dC626bF2eb47C6FBD4BE03;
17+
uint constant REPO_ID = 1234;
1718

1819
function run() public {
1920
deploy(
@@ -53,7 +54,7 @@ contract CreatePayments is Script {
5354

5455
mockUSDC.mint(sender, amountPerDeposit * numberOfDeposits);
5556
mockUSDC.approve(address(escrow), amountPerDeposit * numberOfDeposits);
56-
escrow.batchDeposit(depositParams, numberOfDeposits, block.timestamp);
57+
escrow.batchDeposit(depositParams, REPO_ID, block.timestamp);
5758

5859
vm.stopBroadcast();
5960

script/utils/Gas.s.sol

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ contract DeploySepolia is Script {
2020
address[] memory initialWhitelistedTokens = new address[](1);
2121
initialWhitelistedTokens[0] = address(mockUSDC);
2222

23-
Escrow escrow = new Deploy().deploy(Params.OWNER, Params.SIGNER, initialWhitelistedTokens, 0);
23+
Escrow escrow = new Deploy().deploy(Params.OWNER, Params.SIGNER, initialWhitelistedTokens, 0, Params.BATCH_DEPOSIT_LIMIT);
2424

2525
for (uint256 j = 0; j < NUM_DEPOSITS.length; j++) {
2626
uint256 numDeposits = NUM_DEPOSITS[j];

src/Escrow.sol

Lines changed: 34 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -46,19 +46,22 @@ contract Escrow is Owned, IEscrow {
4646
uint public batchCount;
4747
uint public protocolFeeBps;
4848
address public feeRecipient;
49+
uint public batchDepositLimit;
4950

5051
constructor(
5152
address _owner,
5253
address _signer,
5354
address[] memory _initialWhitelistedTokens,
54-
uint _initialFeeBps
55+
uint _initialFeeBps,
56+
uint _initialBatchDepositLimit
5557
) Owned(_owner) {
5658
require(_initialFeeBps <= MAX_FEE_BPS, Errors.INVALID_FEE);
5759
feeRecipient = _owner;
5860
protocolFeeBps = _initialFeeBps;
5961
CLAIM_INITIAL_CHAIN_ID = block.chainid;
6062
CLAIM_INITIAL_DOMAIN_SEPARATOR = _computeClaimDomainSeparator();
6163
signer = _signer;
64+
batchDepositLimit = _initialBatchDepositLimit;
6265

6366
for (uint256 i = 0; i < _initialWhitelistedTokens.length; i++) {
6467
_whitelistedTokens.add(_initialWhitelistedTokens[i]);
@@ -129,6 +132,7 @@ contract Escrow is Owned, IEscrow {
129132
external
130133
returns (uint[] memory depositIds)
131134
{
135+
require(params.length <= batchDepositLimit, Errors.BATCH_DEPOSIT_LIMIT_EXCEEDED);
132136
depositIds = new uint[](params.length);
133137

134138
for (uint256 i = 0; i < params.length; i++) {
@@ -274,7 +278,7 @@ contract Escrow is Owned, IEscrow {
274278
}
275279

276280
/*//////////////////////////////////////////////////////////////
277-
WHITELIST
281+
OWNER OPERATIONS
278282
//////////////////////////////////////////////////////////////*/
279283
function addWhitelistedToken(address token) external onlyOwner {
280284
require(token != address(0), Errors.INVALID_ADDRESS);
@@ -291,31 +295,6 @@ contract Escrow is Owned, IEscrow {
291295
return _whitelistedTokens.contains(token);
292296
}
293297

294-
function getWhitelistedTokens() external view returns (address[] memory) {
295-
uint256 length = _whitelistedTokens.length();
296-
address[] memory tokens = new address[](length);
297-
298-
for (uint256 i = 0; i < length; i++) {
299-
tokens[i] = _whitelistedTokens.at(i);
300-
}
301-
302-
return tokens;
303-
}
304-
305-
/*//////////////////////////////////////////////////////////////
306-
GETTERS
307-
//////////////////////////////////////////////////////////////*/
308-
function getDepositsBySender(address sender) external view returns (uint[] memory) {
309-
return senderDeposits[sender];
310-
}
311-
312-
function getDepositsByRecipient(address recipient) external view returns (uint[] memory) {
313-
return recipientDeposits[recipient];
314-
}
315-
316-
/*//////////////////////////////////////////////////////////////
317-
FEE MANAGEMENT (Owner Only)
318-
//////////////////////////////////////////////////////////////*/
319298
function setProtocolFeeBps(uint _newFeeBps) external onlyOwner {
320299
require(_newFeeBps <= MAX_FEE_BPS, Errors.INVALID_FEE);
321300
protocolFeeBps = _newFeeBps;
@@ -328,12 +307,37 @@ contract Escrow is Owned, IEscrow {
328307
emit FeeRecipientSet(_newFeeRecipient);
329308
}
330309

331-
/*//////////////////////////////////////////////////////////////
332-
SIGNER MANAGEMENT (Owner Only)
333-
//////////////////////////////////////////////////////////////*/
334310
function setSigner(address _newSigner) external onlyOwner {
335311
require(_newSigner != address(0), Errors.INVALID_ADDRESS);
336312
signer = _newSigner;
337313
emit SignerSet(_newSigner);
338314
}
315+
316+
function setBatchDepositLimit(uint _newLimit) external onlyOwner {
317+
require(_newLimit > 0, Errors.INVALID_BATCH_DEPOSIT_LIMIT);
318+
batchDepositLimit = _newLimit;
319+
emit BatchDepositLimitSet(_newLimit);
320+
}
321+
322+
/*//////////////////////////////////////////////////////////////
323+
GETTERS
324+
//////////////////////////////////////////////////////////////*/
325+
function getDepositsBySender(address sender) external view returns (uint[] memory) {
326+
return senderDeposits[sender];
327+
}
328+
329+
function getDepositsByRecipient(address recipient) external view returns (uint[] memory) {
330+
return recipientDeposits[recipient];
331+
}
332+
333+
function getWhitelistedTokens() external view returns (address[] memory) {
334+
uint256 length = _whitelistedTokens.length();
335+
address[] memory tokens = new address[](length);
336+
337+
for (uint256 i = 0; i < length; i++) {
338+
tokens[i] = _whitelistedTokens.at(i);
339+
}
340+
341+
return tokens;
342+
}
339343
}

test/Deploy.t.sol

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,13 @@ contract Deploy_Test is Test {
1717
function test_deploy() public {
1818
Escrow escrow = deployer.run();
1919

20-
assertTrue(address(escrow) != address(0), "Escrow not deployed");
21-
assertTrue(escrow.isTokenWhitelisted(Params.BASE_USDC), "WETH not whitelisted");
22-
assertEq (escrow.owner(), Params.OWNER, "Incorrect owner");
23-
assertEq (escrow.signer(), Params.SIGNER, "Incorrect signer");
24-
assertEq (escrow.feeRecipient(), Params.OWNER, "Incorrect fee recipient");
25-
assertEq (escrow.protocolFeeBps(), Params.BASE_FEE_BPS, "Incorrect fee");
20+
assertTrue(address(escrow) != address(0), "Escrow not deployed");
21+
assertTrue(escrow.isTokenWhitelisted(Params.BASE_USDC), "WETH not whitelisted");
22+
23+
assertEq (escrow.owner(), Params.OWNER, "Incorrect owner");
24+
assertEq (escrow.signer(), Params.SIGNER, "Incorrect signer");
25+
assertEq (escrow.feeRecipient(), Params.OWNER, "Incorrect fee recipient");
26+
assertEq (escrow.protocolFeeBps(), Params.BASE_FEE_BPS, "Incorrect fee");
27+
assertEq (escrow.batchDepositLimit(), Params.BATCH_DEPOSIT_LIMIT, "Incorrect batch deposit limit");
2628
}
2729
}

0 commit comments

Comments
 (0)