Delegable Actions
Overview
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.
User Interaction Functions
Delegation in PluginDelegable.sol
isDelegate()
Description: Determines whether a delegate address has permission to act on behalf of a specified user.
Contract: CentralRegistry
Function signature:
function isDelegate(address user, address delegate) public view returns (bool)
address
user
The address to check whether delegate has delegation permissions for.
address
delegate
The address to check delegation permissions of user.
Return data:
bool
Returns true if delegate is authorized to act on behalf of user.
setDelegateApproval()
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:
function setDelegateApproval(address delegate, bool isApproved) external
address
delegate
The address that will be approved or restricted from delegated actions.
bool
isApproved
Whether delegate is being approved (true) or restricted (false).
Events:
event DelegateApproval(
address indexed owner,
address indexed delegate,
uint256 approvalIndex,
bool isApproved
);
getUserApprovalIndex()
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:
function getUserApprovalIndex(address user) public view returns (uint256)
address
user
The user to check delegated approval index for.
Return data:
address
user
The user to check delegated approval index for.
checkDelegationDisabled()
Description: Checks whether delegation is temporarily or permanently disabled for a specified user.
Contract: CentralRegistry
Function signature:
function checkDelegationDisabled(address user) public view returns (bool)
address
user
The user to check delegation status for.
Return data:
bool
Returns true if user has delegation disabled or if their cooldown period has not expired.
Delegable Actions in ActionRegistry.sol
getUserApprovalIndex()
Description: Returns a user's approval index, which is used to authorize delegates across the entire protocol.
Contract: CentralRegistry
Function signature:
function getUserApprovalIndex(address user) external view returns (uint256)
address
user
The user to check delegated approval index for.
Return data:
uint256
Current approval index for the specified user.
incrementApprovalIndex()
Description: Increments a caller's approval index, immediately revoking all delegate permissions across all Curvance contracts.
Contract: CentralRegistry
Function signature:
function incrementApprovalIndex() external
Events:
event ApprovalIndexIncremented(address indexed user, uint256 newIndex);
checkDelegationDisabled()
Description: Determines whether a user has delegation disabled, either intentionally or due to a cooldown period.
Function signature:
function checkDelegationDisabled(address user) external view returns (bool)
address
user
The user to check delegation status for.
Return data:
bool
Returns true if user has delegation disabled or if their cooldown period has not expired.
setDelegable()
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:
function setDelegable(bool delegationDisabled) external
Parameters:
bool
delegationDisabled
true to disable delegation, false to enable delegation (after cooldown).
Events:
event DelegableStatusChanged(
address indexed user,
bool delegable,
uint256 delegationEnabledTimestamp
);
Last updated