LimitedCalls Enforcer
The LimitedCallsEnforcer.sol
smart contract gives the delegator the flexibility to pre-set how many times his delegate is allowed to repeat a specific action.
Deployments
- Mainnet: Coming Soon
- Polygon: Coming Soon
- Optimism: Coming Soon
How It Works
The terms
field is expected to contain the FUNCTION_SELECTOR
of the specific function the delegate is allowed to call. In case he is allowed to call more than one functions, insert the appropriate FUNCTION_SELECTOR objects
in the caveats[]
.
Javascript Example
const delegation = {
delegate: '0xd8da6bf26964af9d7eed9e03e53415d37aa96045', // vitalik.eth
authority:
'0x0000000000000000000000000000000000000000000000000000000000000000',
caveats: [
{
enforcer: LimitedCallsEnforcer.address,
// in terms delegator specifies what the max number of calls is (e.g. 2)
terms:
'0x0000000000000000000000000000000000000000000000000000000000000002',
},
],
};
Smart Contract
contract LimitedCallsEnforcer is CaveatEnforcer {
mapping(address => mapping(bytes32 => uint256)) callCounts;
/**
* @notice Allows the delegator to specify a maximum number of times the recipient may perform transactions on their behalf.
* @param terms - The maximum number of times the delegate may perform transactions on their behalf.
* @param transaction - The transaction the delegate might try to perform.
* @param delegationHash - The hash of the delegation being operated on.
*/
function enforceCaveat(
bytes calldata terms,
Transaction calldata transaction,
bytes32 delegationHash
) public override returns (bool) {
uint256 limit = BytesLib.toUint256(terms, 0);
uint256 callCount = callCounts[msg.sender][delegationHash];
require(callCount < limit, "LimitedCallsEnforcer:limit-exceeded");
callCounts[msg.sender][delegationHash]++;
return true;
}
}