Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .cursorrules
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ Caveat enforcers allow you to add specific conditions or restrictions to delegat
- `BlockNumberEnforcer.sol`
- `DeployedEnforcer.sol`
- `ERC20TransferAmountEnforcer.sol`
- `ERC20BalanceGteEnforcer.sol`
- `ERC20BalanceChangeEnforcer.sol`
- `NonceEnforcer.sol`
- `LimitedCallsEnforcer.sol`
- `IdEnforcer.sol`
Expand Down
26 changes: 13 additions & 13 deletions .gas-snapshot
Original file line number Diff line number Diff line change
Expand Up @@ -69,13 +69,13 @@ DeployedEnforcerTest:test_revertIfContractIsEmpty() (gas: 57826)
DeployedEnforcerTest:test_revertIfPredictedAddressDoesNotMatch() (gas: 113981)
DeployedEnforcerTest:test_revertIfTermsLengthIsInvalid() (gas: 26457)
DeployedEnforcerTest:test_revertsIfBytecodeDoesntExist() (gas: 113615)
ERC20BalanceGteEnforcerTest:test_allow_ifBalanceIncreases() (gas: 145796)
ERC20BalanceGteEnforcerTest:test_decodedTheTerms() (gas: 9371)
ERC20BalanceGteEnforcerTest:test_invalid_decodedTheTerms() (gas: 15278)
ERC20BalanceGteEnforcerTest:test_invalid_tokenAddress() (gas: 62209)
ERC20BalanceGteEnforcerTest:test_notAllow_expectingOverflow() (gas: 82733)
ERC20BalanceGteEnforcerTest:test_notAllow_insufficientIncrease() (gas: 107898)
ERC20BalanceGteEnforcerTest:test_notAllow_reenterALockedEnforcer() (gas: 166416)
ERC20BalanceChangeEnforcerTest:test_allow_ifBalanceIncreases() (gas: 145796)
ERC20BalanceChangeEnforcerTest:test_decodedTheTerms() (gas: 9371)
ERC20BalanceChangeEnforcerTest:test_invalid_decodedTheTerms() (gas: 15278)
ERC20BalanceChangeEnforcerTest:test_invalid_tokenAddress() (gas: 62209)
ERC20BalanceChangeEnforcerTest:test_notAllow_expectingOverflow() (gas: 82733)
ERC20BalanceChangeEnforcerTest:test_notAllow_insufficientIncrease() (gas: 107898)
ERC20BalanceChangeEnforcerTest:test_notAllow_reenterALockedEnforcer() (gas: 166416)
ERC20TransferAmountEnforcerTest:test_methodFailsIfInvokesInvalidContract() (gas: 35068)
ERC20TransferAmountEnforcerTest:test_methodFailsIfInvokesInvalidMethod() (gas: 33268)
ERC20TransferAmountEnforcerTest:test_methodFailsIfInvokesInvalidTermsLength() (gas: 32374)
Expand Down Expand Up @@ -362,12 +362,12 @@ NativeAllowanceEnforcerTest:test_decodesTheTerms() (gas: 6235)
NativeAllowanceEnforcerTest:test_transferFailsIfAllowanceExceeded() (gas: 49982)
NativeAllowanceEnforcerTest:test_transferSucceedsIfCalledBelowAllowance() (gas: 55151)
NativeAllowanceEnforcerTest:test_transferSucceedsIfCalledBelowAllowanceMultipleCalls() (gas: 77077)
NativeBalanceGteEnforcerTest:test_allow_ifBalanceIncreases() (gas: 89672)
NativeBalanceGteEnforcerTest:test_decodedTheTerms() (gas: 9399)
NativeBalanceGteEnforcerTest:test_invalid_decodedTheTerms() (gas: 15265)
NativeBalanceGteEnforcerTest:test_notAllow_expectingOverflow() (gas: 63355)
NativeBalanceGteEnforcerTest:test_notAllow_insufficientIncrease() (gas: 66957)
NativeBalanceGteEnforcerTest:test_notAllow_reenterALockedEnforcer() (gas: 103828)
NativeBalanceChangeEnforcerTest:test_allow_ifBalanceIncreases() (gas: 89672)
NativeBalanceChangeEnforcerTest:test_decodedTheTerms() (gas: 9399)
NativeBalanceChangeEnforcerTest:test_invalid_decodedTheTerms() (gas: 15265)
NativeBalanceChangeEnforcerTest:test_notAllow_expectingOverflow() (gas: 63355)
NativeBalanceChangeEnforcerTest:test_notAllow_insufficientIncrease() (gas: 66957)
NativeBalanceChangeEnforcerTest:test_notAllow_reenterALockedEnforcer() (gas: 103828)
NativeTokenPaymentEnforcerTest:test_allowsRedelegationAddingExtraCosts() (gas: 683336)
NativeTokenPaymentEnforcerTest:test_chargePaymentFromAllowance() (gas: 1191883)
NativeTokenPaymentEnforcerTest:test_decodesTheTerms() (gas: 9274)
Expand Down
4 changes: 2 additions & 2 deletions documents/CaveatEnforcers.md
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,6 @@ The `NativeTokenPaymentEnforcer` is a mechanism used within a delegation (D1) th

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.

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.
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.

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.
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.
44 changes: 22 additions & 22 deletions lcov.info
Original file line number Diff line number Diff line change
Expand Up @@ -797,12 +797,12 @@ BRF:6
BRH:6
end_of_record
TN:
SF:src/enforcers/ERC20BalanceGteEnforcer.sol
FN:32,ERC20BalanceGteEnforcer.getHashKey
FNDA:1,ERC20BalanceGteEnforcer.getHashKey
SF:src/enforcers/ERC20BalanceChangeEnforcer.sol
FN:32,ERC20BalanceChangeEnforcer.getHashKey
FNDA:1,ERC20BalanceChangeEnforcer.getHashKey
DA:33,1
FN:43,ERC20BalanceGteEnforcer.beforeHook
FNDA:8,ERC20BalanceGteEnforcer.beforeHook
FN:43,ERC20BalanceChangeEnforcer.beforeHook
FNDA:8,ERC20BalanceChangeEnforcer.beforeHook
DA:55,8
DA:56,8
DA:57,8
Expand All @@ -811,24 +811,24 @@ BRDA:57,0,1,7
DA:58,7
DA:59,7
DA:60,6
FN:68,ERC20BalanceGteEnforcer.afterHook
FNDA:5,ERC20BalanceGteEnforcer.afterHook
FN:68,ERC20BalanceChangeEnforcer.afterHook
FNDA:5,ERC20BalanceChangeEnforcer.afterHook
DA:80,5
DA:81,5
DA:82,5
DA:83,5
DA:84,5
BRDA:84,1,0,2
BRDA:84,1,1,3
FN:93,ERC20BalanceGteEnforcer.getTermsInfo
FNDA:3,ERC20BalanceGteEnforcer.getTermsInfo
FN:93,ERC20BalanceChangeEnforcer.getTermsInfo
FNDA:3,ERC20BalanceChangeEnforcer.getTermsInfo
DA:94,16
BRDA:94,2,0,2
BRDA:94,2,1,14
DA:95,14
DA:96,14
FN:104,ERC20BalanceGteEnforcer._getHashKey
FNDA:14,ERC20BalanceGteEnforcer._getHashKey
FN:104,ERC20BalanceChangeEnforcer._getHashKey
FNDA:14,ERC20BalanceChangeEnforcer._getHashKey
DA:105,14
FNF:5
FNH:5
Expand Down Expand Up @@ -925,36 +925,36 @@ BRF:4
BRH:4
end_of_record
TN:
SF:src/enforcers/NativeBalanceGteEnforcer.sol
FN:29,NativeBalanceGteEnforcer.getHashKey
FNDA:1,NativeBalanceGteEnforcer.getHashKey
SF:src/enforcers/NativeBalanceChangeEnforcer.sol
FN:29,NativeBalanceChangeEnforcer.getHashKey
FNDA:1,NativeBalanceChangeEnforcer.getHashKey
DA:30,1
FN:41,NativeBalanceGteEnforcer.beforeHook
FNDA:7,NativeBalanceGteEnforcer.beforeHook
FN:41,NativeBalanceChangeEnforcer.beforeHook
FNDA:7,NativeBalanceChangeEnforcer.beforeHook
DA:53,7
DA:54,7
DA:56,7
BRDA:56,0,0,1
BRDA:56,0,1,6
DA:57,6
DA:58,6
FN:67,NativeBalanceGteEnforcer.afterHook
FNDA:5,NativeBalanceGteEnforcer.afterHook
FN:67,NativeBalanceChangeEnforcer.afterHook
FNDA:5,NativeBalanceChangeEnforcer.afterHook
DA:79,5
DA:80,5
DA:81,5
DA:82,5
BRDA:82,1,0,1
BRDA:82,1,1,3
FN:92,NativeBalanceGteEnforcer.getTermsInfo
FNDA:3,NativeBalanceGteEnforcer.getTermsInfo
FN:92,NativeBalanceChangeEnforcer.getTermsInfo
FNDA:3,NativeBalanceChangeEnforcer.getTermsInfo
DA:93,15
BRDA:93,2,0,2
BRDA:93,2,1,13
DA:94,13
DA:95,13
FN:103,NativeBalanceGteEnforcer._getHashKey
FNDA:13,NativeBalanceGteEnforcer._getHashKey
FN:103,NativeBalanceChangeEnforcer._getHashKey
FNDA:13,NativeBalanceChangeEnforcer._getHashKey
DA:104,13
FNF:5
FNH:5
Expand Down
24 changes: 12 additions & 12 deletions script/DeployCaveatEnforcers.s.sol
Original file line number Diff line number Diff line change
Expand Up @@ -12,20 +12,20 @@ import { AllowedTargetsEnforcer } from "../src/enforcers/AllowedTargetsEnforcer.
import { ArgsEqualityCheckEnforcer } from "../src/enforcers/ArgsEqualityCheckEnforcer.sol";
import { BlockNumberEnforcer } from "../src/enforcers/BlockNumberEnforcer.sol";
import { DeployedEnforcer } from "../src/enforcers/DeployedEnforcer.sol";
import { ERC20BalanceGteEnforcer } from "../src/enforcers/ERC20BalanceGteEnforcer.sol";
import { ERC20BalanceChangeEnforcer } from "../src/enforcers/ERC20BalanceChangeEnforcer.sol";
import { ERC20TransferAmountEnforcer } from "../src/enforcers/ERC20TransferAmountEnforcer.sol";
import { ERC20StreamingEnforcer } from "../src/enforcers/ERC20StreamingEnforcer.sol";
import { ERC20PeriodTransferEnforcer } from "../src/enforcers/ERC20PeriodTransferEnforcer.sol";
import { ERC721BalanceGteEnforcer } from "../src/enforcers/ERC721BalanceGteEnforcer.sol";
import { ERC721BalanceChangeEnforcer } from "../src/enforcers/ERC721BalanceChangeEnforcer.sol";
import { ERC721TransferEnforcer } from "../src/enforcers/ERC721TransferEnforcer.sol";
import { ERC1155BalanceGteEnforcer } from "../src/enforcers/ERC1155BalanceGteEnforcer.sol";
import { ERC1155BalanceChangeEnforcer } from "../src/enforcers/ERC1155BalanceChangeEnforcer.sol";
import { ExactCalldataEnforcer } from "../src/enforcers/ExactCalldataEnforcer.sol";
import { ExactExecutionBatchEnforcer } from "../src/enforcers/ExactExecutionBatchEnforcer.sol";
import { ExactExecutionEnforcer } from "../src/enforcers/ExactExecutionEnforcer.sol";
import { IdEnforcer } from "../src/enforcers/IdEnforcer.sol";
import { LimitedCallsEnforcer } from "../src/enforcers/LimitedCallsEnforcer.sol";
import { MultiTokenPeriodEnforcer } from "../src/enforcers/MultiTokenPeriodEnforcer.sol";
import { NativeBalanceGteEnforcer } from "../src/enforcers/NativeBalanceGteEnforcer.sol";
import { NativeBalanceChangeEnforcer } from "../src/enforcers/NativeBalanceChangeEnforcer.sol";
import { NativeTokenPaymentEnforcer } from "../src/enforcers/NativeTokenPaymentEnforcer.sol";
import { NativeTokenPeriodTransferEnforcer } from "../src/enforcers/NativeTokenPeriodTransferEnforcer.sol";
import { NativeTokenStreamingEnforcer } from "../src/enforcers/NativeTokenStreamingEnforcer.sol";
Expand Down Expand Up @@ -82,8 +82,8 @@ contract DeployCaveatEnforcers is Script {
deployedAddress = address(new DeployedEnforcer{ salt: salt }());
console2.log("DeployedEnforcer: %s", deployedAddress);

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

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

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

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

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

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

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

address argsEqualityCheckEnforcer = address(new ArgsEqualityCheckEnforcer{ salt: salt }());
console2.log("ArgsEqualityCheckEnforcer: %s", argsEqualityCheckEnforcer);
Expand Down
Loading
Loading