Skip to content

Commit b21eca4

Browse files
committed
use cached lengths for loops
1 parent 9fca6ad commit b21eca4

File tree

1 file changed

+25
-15
lines changed

1 file changed

+25
-15
lines changed

contracts/escrow/Escrow.sol

+25-15
Original file line numberDiff line numberDiff line change
@@ -124,15 +124,16 @@ contract Escrow is
124124
require(token!=address(0),'Invalid token');
125125
require(payee!=address(0),'Invalid payee');
126126
uint256 i;
127-
for(i=0;i<userAuths[msg.sender][token].length;i++){
127+
uint256 length=userAuths[msg.sender][token].length;
128+
for(i=0;i<length;i++){
128129
if(userAuths[msg.sender][token][i].payee==payee){
129130
userAuths[msg.sender][token][i].maxLockedAmount=maxLockedAmount;
130131
userAuths[msg.sender][token][i].maxLockSeconds=maxLockSeconds;
131132
userAuths[msg.sender][token][i].maxLockCounts=maxLockCounts;
132133
break;
133134
}
134135
}
135-
if(i==userAuths[msg.sender][token].length){ //not found
136+
if(i==length){ //not found
136137
userAuths[msg.sender][token].push(auth(payee,maxLockedAmount,0,maxLockSeconds,maxLockCounts,0));
137138
}
138139
emit Auth(msg.sender,payee,maxLockedAmount,maxLockSeconds,maxLockCounts);
@@ -161,7 +162,8 @@ contract Escrow is
161162
function getLocks(address token,address payer,address payee) public view returns (lock[] memory){
162163
// since solidty does not supports dynamic memory arrays, we need to calculate the return size first
163164
uint256 size=0;
164-
for(uint256 i=0;i<locks.length;i++){
165+
uint256 length=locks.length;
166+
for(uint256 i=0;i<length;i++){
165167
if(
166168
(address(token)==address(0) || address(token)==locks[i].token) ||
167169
(address(payee)==address(0) || address(payee)==locks[i].payee) ||
@@ -173,7 +175,7 @@ contract Escrow is
173175

174176
lock[] memory tempPendings=new lock[](size);
175177
size=0;
176-
for(uint256 i=0;i<locks.length;i++){
178+
for(uint256 i=0;i<length;i++){
177179
if(
178180
(address(token)==address(0) || address(token)==locks[i].token) ||
179181
(address(payee)==address(0) || address(payee)==locks[i].payee) ||
@@ -200,12 +202,13 @@ contract Escrow is
200202
require(token!=address(0),'Invalid token');
201203
// since solidty does not supports dynamic memory arrays, we need to calculate the return size first
202204
uint256 size=0;
203-
for(uint256 i=0;i<userAuths[payer][token].length;i++){
205+
uint256 length=userAuths[payer][token].length;
206+
for(uint256 i=0;i<length;i++){
204207
if(address(payee)==address(0) || address(payee)==userAuths[payer][token][i].payee) size++;
205208
}
206209
auth[] memory tempAuths=new auth[](size);
207210
size=0;
208-
for(uint256 i=0;i<userAuths[payer][token].length;i++){
211+
for(uint256 i=0;i<length;i++){
209212
if(address(payee)==address(0) || address(payee)==userAuths[payer][token][i].payee){
210213
tempAuths[size]=userAuths[payer][token][i];
211214
size++;
@@ -231,11 +234,12 @@ contract Escrow is
231234
require(token!=address(0),'Invalid token');
232235
require(amount>0,"Invalid amount");
233236
require(jobId>0,"Invalid jobId");
234-
auth memory tempAuth;
237+
auth memory tempAuth=auth(address(0),0,0,0,0,0);
235238
uint256 index;
236239
uint256 ts=block.timestamp;
237240
require(funds[payer][token].available>=amount,"Payer does not have enough funds");
238-
for(index=0;index<userAuths[payer][token].length;index++){
241+
uint256 length=userAuths[payer][token].length;
242+
for(index=0;index<length;index++){
239243
if(msg.sender==userAuths[payer][token][index].payee) {
240244
tempAuth=userAuths[payer][token][index];
241245
break;
@@ -247,7 +251,8 @@ contract Escrow is
247251
require(tempAuth.currentLockedAmount+amount<=tempAuth.maxLockedAmount,"Exceeds maxLockedAmount");
248252
require(tempAuth.currentLocks<tempAuth.maxLockCounts,"Exceeds maxLockCounts");
249253
// check jobId
250-
for(uint256 i=0;i<locks.length;i++){
254+
length=locks.length;
255+
for(uint256 i=0;i<length;i++){
251256
if(locks[i].payer==payer && locks[i].payee==msg.sender && locks[i].jobId==jobId){
252257
revert("JobId already exists");
253258
}
@@ -282,7 +287,8 @@ contract Escrow is
282287
require(jobId>0,'Invalid jobId');
283288
lock memory tempLock;
284289
uint256 index;
285-
for(index=0;index<locks.length;index++){
290+
uint256 length=locks.length;
291+
for(index=0;index<length;index++){
286292
if(
287293
msg.sender==locks[index].payee &&
288294
payer==locks[index].payer &&
@@ -302,7 +308,8 @@ contract Escrow is
302308
require(tempLock.amount>=amount,"Amount too high");
303309

304310
//update auths
305-
for(uint256 i=0;i<userAuths[payer][token].length;i++){
311+
length=userAuths[payer][token].length;
312+
for(uint256 i=0;i<length;i++){
306313
if(userAuths[payer][token][i].payee==msg.sender){
307314
userAuths[payer][token][i].currentLockedAmount-=tempLock.amount;
308315
userAuths[payer][token][i].currentLocks-=1;
@@ -335,7 +342,8 @@ contract Escrow is
335342
uint256 index;
336343
//since solidy does not supports dynamic arrays, we need to count first
337344
uint256 found=0;
338-
for(index=0;index<locks.length;index++){
345+
uint256 length=locks.length;
346+
for(index=0;index<length;index++){
339347
if(locks[index].expiry<block.timestamp &&
340348
(
341349
(jobId==0 || jobId==locks[index].jobId) &&
@@ -352,7 +360,7 @@ contract Escrow is
352360
uint256[] memory indexToDelete=new uint256[](found);
353361
uint256 currentIndex=0;
354362
// now actually do the work
355-
for(index=0;index<locks.length;index++){
363+
for(index=0;index<length;index++){
356364
if(locks[index].expiry<block.timestamp &&
357365
(
358366
(jobId==0 || jobId==locks[index].jobId) &&
@@ -363,7 +371,8 @@ contract Escrow is
363371
){
364372
//cancel each lock, one by one
365373
//update auths
366-
for(uint256 i=0;i<userAuths[locks[index].payer][locks[index].token].length;i++){
374+
uint256 authsLength=userAuths[locks[index].payer][locks[index].token].length;
375+
for(uint256 i=0;i<authsLength;i++){
367376
if(userAuths[payer][token][i].payee==locks[index].payee){
368377
userAuths[payer][token][i].currentLockedAmount-=locks[index].amount;
369378
userAuths[payer][token][i].currentLocks-=1;
@@ -379,7 +388,8 @@ contract Escrow is
379388
}
380389
}
381390
//delete the locks
382-
for(index=0;index<indexToDelete.length;index++){
391+
uint256 delLength=indexToDelete.length;
392+
for(index=0;index<delLength;index++){
383393
locks[indexToDelete[index]]=locks[locks.length-1];
384394
locks.pop();
385395
}

0 commit comments

Comments
 (0)