Delegable Actions allow third-party contracts (plugins) to perform specific operations on behalf of users within the Curvance ecosystem. This delegation system offers a more flexible and powerful alternative to standard ERC20 approvals, enabling opportunities for automation, complex strategies, and improved user experiences.
Any Curvance contract that inherits from PluginDelegable can support delegate-triggered operations through functions that typically end with a for postfix (e.g., borrowFor, withdrawFor, leverageFor). This pattern ensures consistent delegate authorization checks across the protocol.
The delegation system provides several security advantages over traditional approaches:
Granular control: Users can grant and revoke specific action permissions to different addresses
Emergency revocation: Users can revoke all delegations at once by incrementing their approval index
Time-lock protection: Optional delegation lockdown with a cooldown period
Delegations exist across all Curvance contracts simultaneously, using the Central Registry to track and validate delegation permissions throughout the protocol.
Description: Determines whether a delegate address has permission to act on behalf of a specified user.
Contract: CentralRegistry
Function signature:
Return data:
Description: Approves or restricts a delegate's authority to operate on the caller's behalf. This is the primary method for users to control their delegation permissions.
Contract: CentralRegistry
Function signature:
Events:
Description: Retrieves a user's current approval index from the Central Registry. This index is incremented when a user wants to revoke all delegations.
Contract: CentralRegistry
Function signature:
Return data:
Description: Checks whether delegation is temporarily or permanently disabled for a specified user.
Contract: CentralRegistry
Function signature:
Return data:
Description: Returns a user's approval index, which is used to authorize delegates across the entire protocol.
Contract: CentralRegistry
Function signature:
Return data:
Description: Increments a caller's approval index, immediately revoking all delegate permissions across all Curvance contracts.
Contract: CentralRegistry
Function signature:
Events:
Description: Determines whether a user has delegation disabled, either intentionally or due to a cooldown period.
Function signature:
Return data:
Description: Sets a caller's status for whether to allow new delegations or not. When re-enabling delegation, the user's configured cooldown period applies.
Function signature:
Parameters:
Events:
address
user
The address to check whether delegate has delegation permissions for.
address
delegate
The address to check delegation permissions of user.
bool
Returns true if delegate is authorized to act on behalf of user.
address
delegate
The address that will be approved or restricted from delegated actions.
bool
isApproved
Whether delegate is being approved (true) or restricted (false).
address
user
The user to check delegated approval index for.
address
user
The user to check delegated approval index for.
address
user
The user to check delegation status for.
bool
Returns true if user has delegation disabled or if their cooldown period has not expired.
address
user
The user to check delegated approval index for.
uint256
Current approval index for the specified user.
address
user
The user to check delegation status for.
bool
Returns true if user has delegation disabled or if their cooldown period has not expired.
bool
delegationDisabled
true to disable delegation, false to enable delegation (after cooldown).
function isDelegate(address user, address delegate) public view returns (bool)function setDelegateApproval(address delegate, bool isApproved) externalevent DelegateApproval(
address indexed owner,
address indexed delegate,
uint256 approvalIndex,
bool isApproved
);function getUserApprovalIndex(address user) public view returns (uint256)function checkDelegationDisabled(address user) public view returns (bool)function getUserApprovalIndex(address user) external view returns (uint256)function incrementApprovalIndex() externalevent ApprovalIndexIncremented(address indexed user, uint256 newIndex);function checkDelegationDisabled(address user) external view returns (bool)function setDelegable(bool delegationDisabled) externalevent DelegableStatusChanged(
address indexed user,
bool delegable,
uint256 delegationEnabledTimestamp
);