Skip to content

Commit b817bd6

Browse files
committed
Refactored Token Gte Enforcers to TokenBalanceChange
1 parent 0f8e128 commit b817bd6

16 files changed

Lines changed: 802 additions & 546 deletions

.cursorrules

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ Caveat enforcers allow you to add specific conditions or restrictions to delegat
4545
- `BlockNumberEnforcer.sol`
4646
- `DeployedEnforcer.sol`
4747
- `ERC20TransferAmountEnforcer.sol`
48-
- `ERC20BalanceGteEnforcer.sol`
48+
- `ERC20BalanceChangeEnforcer.sol`
4949
- `NonceEnforcer.sol`
5050
- `LimitedCallsEnforcer.sol`
5151
- `IdEnforcer.sol`

.gas-snapshot

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -69,13 +69,13 @@ DeployedEnforcerTest:test_revertIfContractIsEmpty() (gas: 57826)
6969
DeployedEnforcerTest:test_revertIfPredictedAddressDoesNotMatch() (gas: 113981)
7070
DeployedEnforcerTest:test_revertIfTermsLengthIsInvalid() (gas: 26457)
7171
DeployedEnforcerTest:test_revertsIfBytecodeDoesntExist() (gas: 113615)
72-
ERC20BalanceGteEnforcerTest:test_allow_ifBalanceIncreases() (gas: 145796)
73-
ERC20BalanceGteEnforcerTest:test_decodedTheTerms() (gas: 9371)
74-
ERC20BalanceGteEnforcerTest:test_invalid_decodedTheTerms() (gas: 15278)
75-
ERC20BalanceGteEnforcerTest:test_invalid_tokenAddress() (gas: 62209)
76-
ERC20BalanceGteEnforcerTest:test_notAllow_expectingOverflow() (gas: 82733)
77-
ERC20BalanceGteEnforcerTest:test_notAllow_insufficientIncrease() (gas: 107898)
78-
ERC20BalanceGteEnforcerTest:test_notAllow_reenterALockedEnforcer() (gas: 166416)
72+
ERC20BalanceChangeEnforcerTest:test_allow_ifBalanceIncreases() (gas: 145796)
73+
ERC20BalanceChangeEnforcerTest:test_decodedTheTerms() (gas: 9371)
74+
ERC20BalanceChangeEnforcerTest:test_invalid_decodedTheTerms() (gas: 15278)
75+
ERC20BalanceChangeEnforcerTest:test_invalid_tokenAddress() (gas: 62209)
76+
ERC20BalanceChangeEnforcerTest:test_notAllow_expectingOverflow() (gas: 82733)
77+
ERC20BalanceChangeEnforcerTest:test_notAllow_insufficientIncrease() (gas: 107898)
78+
ERC20BalanceChangeEnforcerTest:test_notAllow_reenterALockedEnforcer() (gas: 166416)
7979
ERC20TransferAmountEnforcerTest:test_methodFailsIfInvokesInvalidContract() (gas: 35068)
8080
ERC20TransferAmountEnforcerTest:test_methodFailsIfInvokesInvalidMethod() (gas: 33268)
8181
ERC20TransferAmountEnforcerTest:test_methodFailsIfInvokesInvalidTermsLength() (gas: 32374)
@@ -362,12 +362,12 @@ NativeAllowanceEnforcerTest:test_decodesTheTerms() (gas: 6235)
362362
NativeAllowanceEnforcerTest:test_transferFailsIfAllowanceExceeded() (gas: 49982)
363363
NativeAllowanceEnforcerTest:test_transferSucceedsIfCalledBelowAllowance() (gas: 55151)
364364
NativeAllowanceEnforcerTest:test_transferSucceedsIfCalledBelowAllowanceMultipleCalls() (gas: 77077)
365-
NativeBalanceGteEnforcerTest:test_allow_ifBalanceIncreases() (gas: 89672)
366-
NativeBalanceGteEnforcerTest:test_decodedTheTerms() (gas: 9399)
367-
NativeBalanceGteEnforcerTest:test_invalid_decodedTheTerms() (gas: 15265)
368-
NativeBalanceGteEnforcerTest:test_notAllow_expectingOverflow() (gas: 63355)
369-
NativeBalanceGteEnforcerTest:test_notAllow_insufficientIncrease() (gas: 66957)
370-
NativeBalanceGteEnforcerTest:test_notAllow_reenterALockedEnforcer() (gas: 103828)
365+
NativeBalanceChangeEnforcerTest:test_allow_ifBalanceIncreases() (gas: 89672)
366+
NativeBalanceChangeEnforcerTest:test_decodedTheTerms() (gas: 9399)
367+
NativeBalanceChangeEnforcerTest:test_invalid_decodedTheTerms() (gas: 15265)
368+
NativeBalanceChangeEnforcerTest:test_notAllow_expectingOverflow() (gas: 63355)
369+
NativeBalanceChangeEnforcerTest:test_notAllow_insufficientIncrease() (gas: 66957)
370+
NativeBalanceChangeEnforcerTest:test_notAllow_reenterALockedEnforcer() (gas: 103828)
371371
NativeTokenPaymentEnforcerTest:test_allowsRedelegationAddingExtraCosts() (gas: 683336)
372372
NativeTokenPaymentEnforcerTest:test_chargePaymentFromAllowance() (gas: 1191883)
373373
NativeTokenPaymentEnforcerTest:test_decodesTheTerms() (gas: 9274)

documents/CaveatEnforcers.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,6 @@ The `NativeTokenPaymentEnforcer` is a mechanism used within a delegation (D1) th
3333

3434
This redemption may alter the state of other contracts. For example, the balance of the delegator providing the allowance will decrease, while the balance of the recipient specified by the payment delegation will increase. These state changes can impact other enforcers that rely on balance validations, depending on their order in the caveats array.
3535

36-
Consider a scenario where D1 includes an array of caveats: one caveat is the `NativeBalanceGteEnforcer`, which verifies that Bob’s balance has increased as a result of the execution attached to D1. The second caveat is the `NativeTokenPaymentEnforcer`, which deducts from Bob’s balance by redeeming D2. If these enforcers are not correctly ordered, they could conflict. For instance, if the `NativeTokenPaymentEnforcer` is executed before the `NativeBalanceGteEnforcer`, Bob’s balance would be reduced first, potentially causing the `NativeBalanceGteEnforcer` to fail its validation of ensuring Bob’s balance exceeds a certain threshold.
36+
Consider a scenario where D1 includes an array of caveats: one caveat is the `NativeBalanceChangeEnforcer`, which verifies that Bob’s balance has increased as a result of the execution attached to D1. The second caveat is the `NativeTokenPaymentEnforcer`, which deducts from Bob’s balance by redeeming D2. If these enforcers are not correctly ordered, they could conflict. For instance, if the `NativeTokenPaymentEnforcer` is executed before the `NativeBalanceChangeEnforcer`, Bob’s balance would be reduced first, potentially causing the `NativeBalanceChangeEnforcer` to fail its validation of ensuring Bob’s balance exceeds a certain threshold.
3737

38-
Because the `NativeTokenPaymentEnforcer` modifies the state of external contracts, it is essential to carefully order enforcers in the delegation to prevent conflicts. The enforcers are designed to protect the execution process, but they do not guarantee a final state after the redemption. This means that even if the `NativeBalanceGteEnforcer` validates Bob’s balance at one point, subsequent enforcers, such as the `NativeTokenPaymentEnforcer`, may modify it later.
38+
Because the `NativeTokenPaymentEnforcer` modifies the state of external contracts, it is essential to carefully order enforcers in the delegation to prevent conflicts. The enforcers are designed to protect the execution process, but they do not guarantee a final state after the redemption. This means that even if the `NativeBalanceChangeEnforcer` validates Bob’s balance at one point, subsequent enforcers, such as the `NativeTokenPaymentEnforcer`, may modify it later.

lcov.info

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -797,12 +797,12 @@ BRF:6
797797
BRH:6
798798
end_of_record
799799
TN:
800-
SF:src/enforcers/ERC20BalanceGteEnforcer.sol
801-
FN:32,ERC20BalanceGteEnforcer.getHashKey
802-
FNDA:1,ERC20BalanceGteEnforcer.getHashKey
800+
SF:src/enforcers/ERC20BalanceChangeEnforcer.sol
801+
FN:32,ERC20BalanceChangeEnforcer.getHashKey
802+
FNDA:1,ERC20BalanceChangeEnforcer.getHashKey
803803
DA:33,1
804-
FN:43,ERC20BalanceGteEnforcer.beforeHook
805-
FNDA:8,ERC20BalanceGteEnforcer.beforeHook
804+
FN:43,ERC20BalanceChangeEnforcer.beforeHook
805+
FNDA:8,ERC20BalanceChangeEnforcer.beforeHook
806806
DA:55,8
807807
DA:56,8
808808
DA:57,8
@@ -811,24 +811,24 @@ BRDA:57,0,1,7
811811
DA:58,7
812812
DA:59,7
813813
DA:60,6
814-
FN:68,ERC20BalanceGteEnforcer.afterHook
815-
FNDA:5,ERC20BalanceGteEnforcer.afterHook
814+
FN:68,ERC20BalanceChangeEnforcer.afterHook
815+
FNDA:5,ERC20BalanceChangeEnforcer.afterHook
816816
DA:80,5
817817
DA:81,5
818818
DA:82,5
819819
DA:83,5
820820
DA:84,5
821821
BRDA:84,1,0,2
822822
BRDA:84,1,1,3
823-
FN:93,ERC20BalanceGteEnforcer.getTermsInfo
824-
FNDA:3,ERC20BalanceGteEnforcer.getTermsInfo
823+
FN:93,ERC20BalanceChangeEnforcer.getTermsInfo
824+
FNDA:3,ERC20BalanceChangeEnforcer.getTermsInfo
825825
DA:94,16
826826
BRDA:94,2,0,2
827827
BRDA:94,2,1,14
828828
DA:95,14
829829
DA:96,14
830-
FN:104,ERC20BalanceGteEnforcer._getHashKey
831-
FNDA:14,ERC20BalanceGteEnforcer._getHashKey
830+
FN:104,ERC20BalanceChangeEnforcer._getHashKey
831+
FNDA:14,ERC20BalanceChangeEnforcer._getHashKey
832832
DA:105,14
833833
FNF:5
834834
FNH:5
@@ -925,36 +925,36 @@ BRF:4
925925
BRH:4
926926
end_of_record
927927
TN:
928-
SF:src/enforcers/NativeBalanceGteEnforcer.sol
929-
FN:29,NativeBalanceGteEnforcer.getHashKey
930-
FNDA:1,NativeBalanceGteEnforcer.getHashKey
928+
SF:src/enforcers/NativeBalanceChangeEnforcer.sol
929+
FN:29,NativeBalanceChangeEnforcer.getHashKey
930+
FNDA:1,NativeBalanceChangeEnforcer.getHashKey
931931
DA:30,1
932-
FN:41,NativeBalanceGteEnforcer.beforeHook
933-
FNDA:7,NativeBalanceGteEnforcer.beforeHook
932+
FN:41,NativeBalanceChangeEnforcer.beforeHook
933+
FNDA:7,NativeBalanceChangeEnforcer.beforeHook
934934
DA:53,7
935935
DA:54,7
936936
DA:56,7
937937
BRDA:56,0,0,1
938938
BRDA:56,0,1,6
939939
DA:57,6
940940
DA:58,6
941-
FN:67,NativeBalanceGteEnforcer.afterHook
942-
FNDA:5,NativeBalanceGteEnforcer.afterHook
941+
FN:67,NativeBalanceChangeEnforcer.afterHook
942+
FNDA:5,NativeBalanceChangeEnforcer.afterHook
943943
DA:79,5
944944
DA:80,5
945945
DA:81,5
946946
DA:82,5
947947
BRDA:82,1,0,1
948948
BRDA:82,1,1,3
949-
FN:92,NativeBalanceGteEnforcer.getTermsInfo
950-
FNDA:3,NativeBalanceGteEnforcer.getTermsInfo
949+
FN:92,NativeBalanceChangeEnforcer.getTermsInfo
950+
FNDA:3,NativeBalanceChangeEnforcer.getTermsInfo
951951
DA:93,15
952952
BRDA:93,2,0,2
953953
BRDA:93,2,1,13
954954
DA:94,13
955955
DA:95,13
956-
FN:103,NativeBalanceGteEnforcer._getHashKey
957-
FNDA:13,NativeBalanceGteEnforcer._getHashKey
956+
FN:103,NativeBalanceChangeEnforcer._getHashKey
957+
FNDA:13,NativeBalanceChangeEnforcer._getHashKey
958958
DA:104,13
959959
FNF:5
960960
FNH:5

script/DeployCaveatEnforcers.s.sol

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -12,20 +12,20 @@ import { AllowedTargetsEnforcer } from "../src/enforcers/AllowedTargetsEnforcer.
1212
import { ArgsEqualityCheckEnforcer } from "../src/enforcers/ArgsEqualityCheckEnforcer.sol";
1313
import { BlockNumberEnforcer } from "../src/enforcers/BlockNumberEnforcer.sol";
1414
import { DeployedEnforcer } from "../src/enforcers/DeployedEnforcer.sol";
15-
import { ERC20BalanceGteEnforcer } from "../src/enforcers/ERC20BalanceGteEnforcer.sol";
15+
import { ERC20BalanceChangeEnforcer } from "../src/enforcers/ERC20BalanceChangeEnforcer.sol";
1616
import { ERC20TransferAmountEnforcer } from "../src/enforcers/ERC20TransferAmountEnforcer.sol";
1717
import { ERC20StreamingEnforcer } from "../src/enforcers/ERC20StreamingEnforcer.sol";
1818
import { ERC20PeriodTransferEnforcer } from "../src/enforcers/ERC20PeriodTransferEnforcer.sol";
19-
import { ERC721BalanceGteEnforcer } from "../src/enforcers/ERC721BalanceGteEnforcer.sol";
19+
import { ERC721BalanceChangeEnforcer } from "../src/enforcers/ERC721BalanceChangeEnforcer.sol";
2020
import { ERC721TransferEnforcer } from "../src/enforcers/ERC721TransferEnforcer.sol";
21-
import { ERC1155BalanceGteEnforcer } from "../src/enforcers/ERC1155BalanceGteEnforcer.sol";
21+
import { ERC1155BalanceChangeEnforcer } from "../src/enforcers/ERC1155BalanceChangeEnforcer.sol";
2222
import { ExactCalldataEnforcer } from "../src/enforcers/ExactCalldataEnforcer.sol";
2323
import { ExactExecutionBatchEnforcer } from "../src/enforcers/ExactExecutionBatchEnforcer.sol";
2424
import { ExactExecutionEnforcer } from "../src/enforcers/ExactExecutionEnforcer.sol";
2525
import { IdEnforcer } from "../src/enforcers/IdEnforcer.sol";
2626
import { LimitedCallsEnforcer } from "../src/enforcers/LimitedCallsEnforcer.sol";
2727
import { MultiTokenPeriodEnforcer } from "../src/enforcers/MultiTokenPeriodEnforcer.sol";
28-
import { NativeBalanceGteEnforcer } from "../src/enforcers/NativeBalanceGteEnforcer.sol";
28+
import { NativeBalanceChangeEnforcer } from "../src/enforcers/NativeBalanceChangeEnforcer.sol";
2929
import { NativeTokenPaymentEnforcer } from "../src/enforcers/NativeTokenPaymentEnforcer.sol";
3030
import { NativeTokenPeriodTransferEnforcer } from "../src/enforcers/NativeTokenPeriodTransferEnforcer.sol";
3131
import { NativeTokenStreamingEnforcer } from "../src/enforcers/NativeTokenStreamingEnforcer.sol";
@@ -82,8 +82,8 @@ contract DeployCaveatEnforcers is Script {
8282
deployedAddress = address(new DeployedEnforcer{ salt: salt }());
8383
console2.log("DeployedEnforcer: %s", deployedAddress);
8484

85-
deployedAddress = address(new ERC20BalanceGteEnforcer{ salt: salt }());
86-
console2.log("ERC20BalanceGteEnforcer: %s", deployedAddress);
85+
deployedAddress = address(new ERC20BalanceChangeEnforcer{ salt: salt }());
86+
console2.log("ERC20BalanceChangeEnforcer: %s", deployedAddress);
8787

8888
deployedAddress = address(new ERC20TransferAmountEnforcer{ salt: salt }());
8989
console2.log("ERC20TransferAmountEnforcer: %s", deployedAddress);
@@ -94,14 +94,14 @@ contract DeployCaveatEnforcers is Script {
9494
deployedAddress = address(new ERC20StreamingEnforcer{ salt: salt }());
9595
console2.log("ERC20StreamingEnforcer: %s", deployedAddress);
9696

97-
deployedAddress = address(new ERC721BalanceGteEnforcer{ salt: salt }());
98-
console2.log("ERC721BalanceGteEnforcer: %s", deployedAddress);
97+
deployedAddress = address(new ERC721BalanceChangeEnforcer{ salt: salt }());
98+
console2.log("ERC721BalanceChangeEnforcer: %s", deployedAddress);
9999

100100
deployedAddress = address(new ERC721TransferEnforcer{ salt: salt }());
101101
console2.log("ERC721TransferEnforcer: %s", deployedAddress);
102102

103-
deployedAddress = address(new ERC1155BalanceGteEnforcer{ salt: salt }());
104-
console2.log("ERC1155BalanceGteEnforcer: %s", deployedAddress);
103+
deployedAddress = address(new ERC1155BalanceChangeEnforcer{ salt: salt }());
104+
console2.log("ERC1155BalanceChangeEnforcer: %s", deployedAddress);
105105

106106
deployedAddress = address(new ExactCalldataEnforcer{ salt: salt }());
107107
console2.log("ExactCalldataEnforcer: %s", deployedAddress);
@@ -121,8 +121,8 @@ contract DeployCaveatEnforcers is Script {
121121
deployedAddress = address(new MultiTokenPeriodEnforcer{ salt: salt }());
122122
console2.log("MultiTokenPeriodEnforcer: %s", deployedAddress);
123123

124-
deployedAddress = address(new NativeBalanceGteEnforcer{ salt: salt }());
125-
console2.log("NativeBalanceGteEnforcer: %s", deployedAddress);
124+
deployedAddress = address(new NativeBalanceChangeEnforcer{ salt: salt }());
125+
console2.log("NativeBalanceChangeEnforcer: %s", deployedAddress);
126126

127127
address argsEqualityCheckEnforcer = address(new ArgsEqualityCheckEnforcer{ salt: salt }());
128128
console2.log("ArgsEqualityCheckEnforcer: %s", argsEqualityCheckEnforcer);

0 commit comments

Comments
 (0)