La documentation des smart contracts est essentielle pour comprendre le fonctionnement interne de la DAO RealToken. Elle comprend :
REGGovernor.sol : Contrat de gouvernance principal, ce contrat gère le processus de gouvernance, y compris la création de propositions, le vote et l'exécution.
Fonctions principales non standard ajoutées :
function setProposerMode(ProposerMode proposerMode) external
Description : Permet à la gouvernance de définir le mode de proposant, déterminant les critères que les adresses doivent respecter pour créer des propositions.
Paramètres :
proposerMode : Le nouveau mode de proposant à définir, qui peut être l'un des suivants :
ProposerWithRole
: Seules les adresses avec le rôle PROPOSER_ROLE
peuvent proposer.ProposerWithVotingPower
: Seules les adresses avec une puissance de vote suffisante peuvent proposer.ProposerWithRoleAndVotingPower
: Seules les adresses avec le rôle PROPOSER_ROLE
et une puissance de vote suffisante peuvent proposer.ProposerWithRoleOrVotingPower
: Les adresses avec soit le rôle PROPOSER_ROLE
, soit une puissance de vote suffisante peuvent proposer.Contrôle d'accès : Ne peut être appelée que via une proposition de gouvernance réussie (onlyGovernance
).
Événement Émis : SetProposerMode
function setIncentiveEnabled(bool status) external
Description : Active ou désactive le mécanisme d'incitation, qui enregistre les votes dans le coffre d'incitation pour récompenser les participants.
Paramètres : status
Un booléen indiquant s'il faut activer (true
) ou désactiver (false
) le mécanisme d'incitation.
Contrôle d'accès : Ne peut être appelée que via une proposition de gouvernance réussie.
Événement Émis : SetIncentiveEnabled
function setRegIncentiveVault(IREGIncentiveVault regIncentiveVault) external
Description : Définit l'adresse du contrat du coffre d'incitation REG utilisé pour enregistrer les votes et distribuer les incitations.
Paramètres : regIncentiveVault
L'adresse du nouveau contrat du coffre d'incitation REG.
Contrôle d'accès : Ne peut être appelée que via une proposition de gouvernance réussie.
Événement Émis : SetRegIncentiveVault
function getProposerMode() external view returns (ProposerMode)
Description : Renvoie le mode de proposant actuel, indiquant les critères requis pour qu'une adresse puisse créer des propositions.
Retourne : Le ProposerMode
actuel.
function getIncentiveEnabled() external view returns (bool)
Description : Indique si le mécanisme d'incitation est actuellement activé.
Retourne : true
si le mécanisme d'incitation est activé, false
sinon.
function getRegIncentiveVault() external view returns (IREGIncentiveVault)
Description : Renvoie l'adresse du contrat du coffre d'incitation REG.
Retourne : L'adresse du contrat IREGIncentiveVault
.
function cancelByAdmin(address[] memory targets, uint256[] memory values, bytes[] memory calldatas, bytes32 descriptionHash) external returns (uint256)
Description : Permet à un administrateur avec le rôle CANCELLER_ROLE
d'annuler une proposition correspondant aux paramètres donnés.
Paramètres :
targets
: Un tableau des adresses cibles pour les actions de la proposition.values
: Un tableau des valeurs ETH à envoyer avec chaque action.calldatas
: Un tableau des données d'appel pour chaque action.descriptionHash
: Le hachage keccak256 de la description de la proposition.Retourne : L'ID de la proposition annulée.
Contrôle d'accès : Restreint aux adresses avec le rôle CANCELLER_ROLE
.
REGTreasuryDAO.sol : Gestion de la trésorerie de la DAO, ce contrat gère les fonds de la DAO et exécute les transactions approuvées après un délai de timelock de sécurité.
Il n'y a pas de fonction principale non standard ajouté.
REGIncentiveVault.sol : Système d'incitation et de récompenses, ce contrat gère le calcul et la distribution des récompenses aux participants de la DAO si activé par la DAO.
Contrat entièrement créé par RealT, les fonctions principales sont :
function setNewEpoch(uint256 subscriptionStart,uint256 subscriptionEnd,uint256 lockPeriodEnd,address bonusToken,uint256 totalBonus ) external onlyRole(DEFAULT_ADMIN_ROLE)
Description : Définit un nouvel epoch (période) pour le programme d'incitation. Cette fonction initialise un nouvel epoch avec les paramètres spécifiés.
Paramètres :
subscriptionStart
: Timestamp du début de la période de souscription.subscriptionEnd
: Timestamp de la fin de la période de souscription.lockPeriodEnd
: Timestamp de la fin de la période de verrouillage.bonusToken
: Adresse du token utilisé comme récompense.totalBonus
: Montant total des tokens de bonus à distribuer pour cet epoch.Contrôle d'accès : Seul le rôle DEFAULT_ADMIN_ROLE
peut appeler cette fonction.
Événement Émis : SetNewEpoch
function deposit(uint256 amount) public whenNotPaused;
Description : Permet aux utilisateurs de déposer des tokens REG dans le vault pendant la période de souscription pour participer au programme d'incitation.
Paramètres : amount
: Montant de tokens REG à déposer.
Conditions : La fonction ne peut être appelée que lorsque le contrat n'est pas en pause et pendant la période de souscription.
Événement Émis : Deposit
function depositWithPermit(uint256 amount, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external whenNotPaused;
Description : Permet aux utilisateurs de déposer des tokens REG en utilisant l'approbation EIP-2612 (permit), ce qui permet le dépôt en une seule transaction sans approbation préalable.
Paramètres :
amount
: Montant de tokens REG à déposer.deadline
: Timestamp après lequel la signature n'est plus valide.v, r, s
: Composants de la signature pour l'approbation.Conditions : La fonction ne peut être appelée que lorsque le contrat n'est pas en pause et pendant la période de souscription.
Événement Émis : Deposit
function withdraw(uint256 amount) external whenNotPaused;
Description : Permet aux utilisateurs de retirer leurs tokens REG déposés après la fin de la période de verrouillage.
Paramètres : amount
: Montant de tokens REG à retirer.
Conditions : La fonction ne peut être appelée que lorsque le contrat n'est pas en pause et après la fin de la période de verrouillage.
Événement Émis : Withdraw
function recordVote(address user, uint256 proposalId) external onlyGovernance;
Description : Enregistre le vote d'un utilisateur sur une proposition pendant la période de verrouillage afin de calculer les récompenses d'incitation.
Paramètres :
user
: Adresse de l'utilisateur qui a voté.proposalId
: Identifiant de la proposition sur laquelle l'utilisateur a voté.Contrôle d'accès : Seul le contrat de gouvernance peut appeler cette fonction.
Événement Émis : RecordVote
ou RecordVoteNotActive
function calculateBonus(address user) external view returns (address[] memory, uint256[] memory)
Description : Calcule le montant du bonus qu'un utilisateur peut réclamer pour chaque epoch passé.
Paramètres :
user
: Adresse de l'utilisateur pour lequel calculer le bonus.Retourne :
address[]
: Tableau des adresses des tokens de bonus.uint256[]
: Tableau des montants de bonus correspondants.function claimBonus() public whenNotPaused;
Description : Permet aux utilisateurs de réclamer leurs bonus accumulés pour tous les epochs éligibles.
Conditions : La fonction ne peut être appelée que lorsque le contrat n'est pas en pause.
Événement Émis : ClaimBonus
function getRegGovernor() external view returns (address)
Description : Renvoie l'adresse du contrat de gouvernance REG associé.
function getRegToken() external view returns (IERC20)
Description : Renvoie l'adresse du token REG utilisé par le vault.
function getCurrentTotalDeposit() external view returns (uint256)
Description : Renvoie le montant total de tokens REG actuellement déposés dans le vault.
function getCurrentEpoch() external view returns (uint256)
Description : Renvoie le numéro de l'epoch actuel.
function getCurrentEpochState() external view returns (EpochState memory)
Description : Renvoie les informations sur l'état de l'epoch actuel.
function getEpochState(uint256 epoch) external view returns (EpochState memory)
Description : Renvoie les informations sur l'état d'un epoch spécifique.
Paramètres :epoch
Numéro de l'epoch pour lequel obtenir les informations.
function getUserEpochState(address user, uint256 epoch) external view returns (UserEpochState memory)
Description : Renvoie les informations sur l'état d'un utilisateur pour un epoch spécifique.
Paramètres :
user
: Adresse de l'utilisateur.epoch
: Numéro de l'epoch.function getUserGlobalState(address user) external view returns (UserGlobalState memory)
Description : Renvoie les informations globales sur l'état d'un utilisateur.
Paramètres :
user
: Adresse de l'utilisateur.REGPowerVotingRegistry.sol : Enregistrement des pouvoirs de vote, ce contrat enregistre le pouvoir de vote des participants calculé off-chain par RealT selon l'algorithme défini et validé par la DAO.
Contrat entièrement créé par RealT, les fonctions principales sont :
registerVotingPower(VotingPower[] calldata votingPower) external override onlyRole(REGISTER_ROLE)
Vous noterez que pour des raisons de compatibilité avec les standards et le fonctionnement du contrat Governor, le contrat PowerVotingRegistry est basé sur le standard ERC20 avec une modification des comportements des fonctions de base comme :
REGVotingPowerRegistryErrors.DelegateToOtherNotAllowed()
si un utilisateur essaie de déléguer son vote à un autre utilisateur.
propose()
dans REGGovernor pour créer une proposition,castVote()
dans REGGovernor pour voter sur une proposition,queue()
dans REGGovernor pour mettre en file d'attente une proposition,execute()
dans REGTreasuryDAO pour exécuter une proposition approuvée.ProposalCreated
émis lors de la création d'une proposition,VoteCast
émis lorsqu'un vote est enregistré,callExecuted()
émis lorsqu'une action de la proposition est exécutée.[Un diagramme montrant les interactions entre les contrats]
Il n'y a pas de rapport d'audit de sécurité pour le moment. Les contrats étant proches des versions standards (déjà audité) et la gouvernance étant exercée avec des restrictions de droits, il a été jugé plus pertinent de conserver les ressources pour des audits futurs de la v2. La v1 étant une version provisoire expérimentale destinée à initialiser la DAO et donc le champ d'action est limité.
Cette section détaille les processus de gouvernance de la DAO :
Les interactions se font principalement avec les interfaces suivantes :