185 lines
7.2 KiB
Solidity
185 lines
7.2 KiB
Solidity
|
// SPDX-License-Identifier: CC0-1.0
|
||
|
pragma solidity ^0.8.16;
|
||
|
|
||
|
/**
|
||
|
* @title An immutable registry contract to be deployed as a standalone primitive
|
||
|
* @dev New project launches can read previous cold wallet -> hot wallet delegations
|
||
|
* from here and integrate those permissions into their flow
|
||
|
*/
|
||
|
interface IDelegationRegistry {
|
||
|
/// @notice Delegation type
|
||
|
enum DelegationType {
|
||
|
NONE,
|
||
|
ALL,
|
||
|
CONTRACT,
|
||
|
TOKEN
|
||
|
}
|
||
|
|
||
|
/// @notice Info about a single delegation, used for onchain enumeration
|
||
|
struct DelegationInfo {
|
||
|
DelegationType type_;
|
||
|
address vault;
|
||
|
address delegate;
|
||
|
address contract_;
|
||
|
uint256 tokenId;
|
||
|
}
|
||
|
|
||
|
/// @notice Info about a single contract-level delegation
|
||
|
struct ContractDelegation {
|
||
|
address contract_;
|
||
|
address delegate;
|
||
|
}
|
||
|
|
||
|
/// @notice Info about a single token-level delegation
|
||
|
struct TokenDelegation {
|
||
|
address contract_;
|
||
|
uint256 tokenId;
|
||
|
address delegate;
|
||
|
}
|
||
|
|
||
|
/// @notice Emitted when a user delegates their entire wallet
|
||
|
event DelegateForAll(address vault, address delegate, bool value);
|
||
|
|
||
|
/// @notice Emitted when a user delegates a specific contract
|
||
|
event DelegateForContract(address vault, address delegate, address contract_, bool value);
|
||
|
|
||
|
/// @notice Emitted when a user delegates a specific token
|
||
|
event DelegateForToken(address vault, address delegate, address contract_, uint256 tokenId, bool value);
|
||
|
|
||
|
/// @notice Emitted when a user revokes all delegations
|
||
|
event RevokeAllDelegates(address vault);
|
||
|
|
||
|
/// @notice Emitted when a user revoes all delegations for a given delegate
|
||
|
event RevokeDelegate(address vault, address delegate);
|
||
|
|
||
|
/**
|
||
|
* ----------- WRITE -----------
|
||
|
*/
|
||
|
|
||
|
/**
|
||
|
* @notice Allow the delegate to act on your behalf for all contracts
|
||
|
* @param delegate The hotwallet to act on your behalf
|
||
|
* @param value Whether to enable or disable delegation for this address, true for setting and false for revoking
|
||
|
*/
|
||
|
function delegateForAll(address delegate, bool value) external;
|
||
|
|
||
|
/**
|
||
|
* @notice Allow the delegate to act on your behalf for a specific contract
|
||
|
* @param delegate The hotwallet to act on your behalf
|
||
|
* @param contract_ The address for the contract you're delegating
|
||
|
* @param value Whether to enable or disable delegation for this address, true for setting and false for revoking
|
||
|
*/
|
||
|
function delegateForContract(address delegate, address contract_, bool value) external;
|
||
|
|
||
|
/**
|
||
|
* @notice Allow the delegate to act on your behalf for a specific token
|
||
|
* @param delegate The hotwallet to act on your behalf
|
||
|
* @param contract_ The address for the contract you're delegating
|
||
|
* @param tokenId The token id for the token you're delegating
|
||
|
* @param value Whether to enable or disable delegation for this address, true for setting and false for revoking
|
||
|
*/
|
||
|
function delegateForToken(address delegate, address contract_, uint256 tokenId, bool value) external;
|
||
|
|
||
|
/**
|
||
|
* @notice Revoke all delegates
|
||
|
*/
|
||
|
function revokeAllDelegates() external;
|
||
|
|
||
|
/**
|
||
|
* @notice Revoke a specific delegate for all their permissions
|
||
|
* @param delegate The hotwallet to revoke
|
||
|
*/
|
||
|
function revokeDelegate(address delegate) external;
|
||
|
|
||
|
/**
|
||
|
* @notice Remove yourself as a delegate for a specific vault
|
||
|
* @param vault The vault which delegated to the msg.sender, and should be removed
|
||
|
*/
|
||
|
function revokeSelf(address vault) external;
|
||
|
|
||
|
/**
|
||
|
* ----------- READ -----------
|
||
|
*/
|
||
|
|
||
|
/**
|
||
|
* @notice Returns all active delegations a given delegate is able to claim on behalf of
|
||
|
* @param delegate The delegate that you would like to retrieve delegations for
|
||
|
* @return info Array of DelegationInfo structs
|
||
|
*/
|
||
|
function getDelegationsByDelegate(address delegate) external view returns (DelegationInfo[] memory);
|
||
|
|
||
|
/**
|
||
|
* @notice Returns an array of wallet-level delegates for a given vault
|
||
|
* @param vault The cold wallet who issued the delegation
|
||
|
* @return addresses Array of wallet-level delegates for a given vault
|
||
|
*/
|
||
|
function getDelegatesForAll(address vault) external view returns (address[] memory);
|
||
|
|
||
|
/**
|
||
|
* @notice Returns an array of contract-level delegates for a given vault and contract
|
||
|
* @param vault The cold wallet who issued the delegation
|
||
|
* @param contract_ The address for the contract you're delegating
|
||
|
* @return addresses Array of contract-level delegates for a given vault and contract
|
||
|
*/
|
||
|
function getDelegatesForContract(address vault, address contract_) external view returns (address[] memory);
|
||
|
|
||
|
/**
|
||
|
* @notice Returns an array of contract-level delegates for a given vault's token
|
||
|
* @param vault The cold wallet who issued the delegation
|
||
|
* @param contract_ The address for the contract holding the token
|
||
|
* @param tokenId The token id for the token you're delegating
|
||
|
* @return addresses Array of contract-level delegates for a given vault's token
|
||
|
*/
|
||
|
function getDelegatesForToken(address vault, address contract_, uint256 tokenId)
|
||
|
external
|
||
|
view
|
||
|
returns (address[] memory);
|
||
|
|
||
|
/**
|
||
|
* @notice Returns all contract-level delegations for a given vault
|
||
|
* @param vault The cold wallet who issued the delegations
|
||
|
* @return delegations Array of ContractDelegation structs
|
||
|
*/
|
||
|
function getContractLevelDelegations(address vault)
|
||
|
external
|
||
|
view
|
||
|
returns (ContractDelegation[] memory delegations);
|
||
|
|
||
|
/**
|
||
|
* @notice Returns all token-level delegations for a given vault
|
||
|
* @param vault The cold wallet who issued the delegations
|
||
|
* @return delegations Array of TokenDelegation structs
|
||
|
*/
|
||
|
function getTokenLevelDelegations(address vault) external view returns (TokenDelegation[] memory delegations);
|
||
|
|
||
|
/**
|
||
|
* @notice Returns true if the address is delegated to act on the entire vault
|
||
|
* @param delegate The hotwallet to act on your behalf
|
||
|
* @param vault The cold wallet who issued the delegation
|
||
|
*/
|
||
|
function checkDelegateForAll(address delegate, address vault) external view returns (bool);
|
||
|
|
||
|
/**
|
||
|
* @notice Returns true if the address is delegated to act on your behalf for a token contract or an entire vault
|
||
|
* @param delegate The hotwallet to act on your behalf
|
||
|
* @param contract_ The address for the contract you're delegating
|
||
|
* @param vault The cold wallet who issued the delegation
|
||
|
*/
|
||
|
function checkDelegateForContract(address delegate, address vault, address contract_)
|
||
|
external
|
||
|
view
|
||
|
returns (bool);
|
||
|
|
||
|
/**
|
||
|
* @notice Returns true if the address is delegated to act on your behalf for a specific token, the token's contract or an entire vault
|
||
|
* @param delegate The hotwallet to act on your behalf
|
||
|
* @param contract_ The address for the contract you're delegating
|
||
|
* @param tokenId The token id for the token you're delegating
|
||
|
* @param vault The cold wallet who issued the delegation
|
||
|
*/
|
||
|
function checkDelegateForToken(address delegate, address vault, address contract_, uint256 tokenId)
|
||
|
external
|
||
|
view
|
||
|
returns (bool);
|
||
|
}
|