Le protocole Organigram est un framework Solidity pour construire des systèmes de gouvernance incorruptibles sur Ethereum.
En assemblant trois concepts simples, il permet l'exécution automatisée de n'importe quelle règle métier de manière décentralisée et auditable :
Pour une documentation complète, consultez notre site officiel.
Installez le paquet NPM avec :
# npm:npm install @organigram/protocol# pnpm: pnpm add @organigram/protocol
Avec ce paquet, vous pouvez interagir directement avec les smart contracts du protocole Organigram dans votre code Solidity et JavaScript, ou utiliser nos clients officiels pour bâtir vos propres applications sur le protocole.
Importez les sources des contrats dans votre code Solidity :
import "@organigram/protocol/Organ.sol";
Importez les artefacts des contrats dans votre code JS :
import OrganContractABI from '@organigram/protocol/abi/Organ.sol/Organ.json' with { type: 'json' }import { getContract, type Abi } from 'viem'const contract = getContract({ address: getAddress(address as Address), abi: OrganContractABI.abi as Abi, client: { // ... viem client configuration }})
Utilisez le client JavaScript/TypeScript officiel, qui déploie et opère les contrats, et les composants React, qui les dessinent.
Ce paquet utilise Foundry (Forge/Anvil) pour le développement local. Installez la chaîne d'outils Foundry avec :
curl -L https://foundry.paradigm.xyz | bashfoundryup
Démarrez un nœud local de développement avec Anvil :
pnpm anvil
Compilez les contrats avec :
pnpm build
Déployez les contrats du protocole sur une liste de réseaux :
pnpm deploy:protocol <comma-separated list of network names or chain ids>
Nécessite un fichier .env avec MNEMONIC et NEXT_PUBLIC_THIRDWEB_CLIENT_ID. Le compte de déploiement doit disposer de fonds suffisants sur chaque réseau cible pour couvrir les frais de déploiement.
Par exemple :
pnpm deploy:protocol mainnet,base,11155111
Pour déployer sur le nœud Anvil local :
pnpm deploy:protocol anvil
Par défaut, les URL RPC des réseaux sont construites à partir de Thirdweb. Vous pouvez remplacer celle d'un réseau donné avec RPC_URL_<chain id>, ou RPC_URL_<network name>, par exemple RPC_URL_11155111.
Le script de déploiement accepte aussi une option --resume facultative pour reprendre la dernière exécution si le déploiement a échoué.
Nous recherchons des développeurs et testeurs Solidity pour garder nos contrats sûrs et à jour. Ouvrez des tickets sur notre page GitHub, forkez et créez des pull requests, ou contactez-nous sur notre Discord ou à hello@organigram.ai.
Le OrganigramClient est le point d'entrée du protocole sur chaque chaîne. Il tient le registre des types de procédures et déploie organes, actifs et procédures comme clones de leurs implémentations, un par un ou sous forme d'organigramme complet en une seule transaction. L'adresse d'un clone dépend de son sel et du compte qui le déploie, si bien que personne ne peut prendre une adresse prédite par quelqu'un d'autre.
Point d'entrée du protocole sur une chaîne : le registre des types de procédures, et la fabrique des organes, actifs et procédures, déployés comme clones de leurs implémentations.
constructor(string cid, address trustedForwarder, bytes32 salt);
Implémentation dont les actifs sont clonés.
function asset() view returns (address);
Déployer un clone d'actif unique et l'initialiser en tant que token ERC-20.
function deployAsset(string name, string symbol, uint256 initialSupply, bytes32 salt) returns (address clone);
Paramètres
| Nom | Type | Description |
|---|---|---|
name | string | Nom du token. |
symbol | string | Symbole du token. |
initialSupply | uint256 | Approvisionnement initial du token versé au destinataire. |
salt | bytes32 | Sel de clone déterministe. |
| Retourne |
| Nom | Type | Description |
|---|---|---|
clone | address | Adresse de la copie de l'actif déployé. |
Déployer plusieurs clones d'actifs en un seul appel.
function deployAssets((string, string, uint256, bytes32, bool, address)[] batch) returns (address[] clones);
Paramètres
| Nom | Type | Description |
|---|---|---|
batch | (string, string, uint256, bytes32, bool, address)[] | Données de déploiement des actifs. |
| Retourne |
| Nom | Type | Description |
|---|---|---|
clones | address[] | Adresses des clones d'actifs déployés. |
Déployer un clone d'organe unique et l'initialiser.
function deployOrgan(address[] _permissionAddresses, bytes2[] _permissionValues, string cid, (address, string)[] entries, bytes32 salt) returns (address clone);
Paramètres
| Nom | Type | Description |
|---|---|---|
_permissionAddresses | address[] | Adresses recevant des permissions sur l'organe. |
_permissionValues | bytes2[] | Masques de permissions alignés sur _permissionAddresses. |
cid | string | CID de métadonnées attribué à l'organe déployé. |
entries | (address, string)[] | Entrées initiales stockées dans l'organe. |
salt | bytes32 | Sel de clone déterministe. |
| Retourne |
| Nom | Type | Description |
|---|---|---|
clone | address | Adresse du clone d'organe déployé. |
Déployer un organigramme complet en une transaction.
function deployOrganigram((address[], bytes2[], string, (address, string)[], bytes32)[] organBatch, (string, string, uint256, bytes32, bool, address)[] assetBatch, (address, bytes, bytes32)[] procedureBatch) returns (address[] organsDeployed, address[] assetsDeployed, address[] proceduresDeployed);
Paramètres
| Nom | Type | Description |
|---|---|---|
organBatch | (address[], bytes2[], string, (address, string)[], bytes32)[] | Données de déploiement des organes. |
assetBatch | (string, string, uint256, bytes32, bool, address)[] | Données de déploiement des actifs. |
procedureBatch | (address, bytes, bytes32)[] | Données de déploiement des procédures. |
| Retourne |
| Nom | Type | Description |
|---|---|---|
organsDeployed | address[] | Adresses des organes déployés. |
assetsDeployed | address[] | Adresses des actifs déployés. |
proceduresDeployed | address[] | Adresses des procédures déployées. |
Déployer plusieurs clones d'organes en un seul appel.
function deployOrgans((address[], bytes2[], string, (address, string)[], bytes32)[] batch) returns (address[] clones);
Paramètres
| Nom | Type | Description |
|---|---|---|
batch | (address[], bytes2[], string, (address, string)[], bytes32)[] | Données de déploiement des organes. |
| Retourne |
| Nom | Type | Description |
|---|---|---|
clones | address[] | Adresses des clones d'organes déployés. |
Déployer un clone de procédure à partir d'une implémentation de procédure enregistrée.
function deployProcedure(address procedureType, bytes data, bytes32 salt) returns (address procedure);
Paramètres
| Nom | Type | Description |
|---|---|---|
procedureType | address | Implémentation de procédure enregistrée à cloner. |
data | bytes | Calldata d'initialisation optionnelle exécuté immédiatement après le déploiement. |
salt | bytes32 | Sel de clone déterministe. |
| Retourne |
| Nom | Type | Description |
|---|---|---|
procedure | address | Adresse du clone de procédure déployé. |
Déployer plusieurs clones de procédures en un seul appel.
function deployProcedures((address, bytes, bytes32)[] batch) returns (address[] created);
Paramètres
| Nom | Type | Description |
|---|---|---|
batch | (address, bytes, bytes32)[] | Données de déploiement des procédures. |
| Retourne |
| Nom | Type | Description |
|---|---|---|
created | address[] | Adresses des clones de procédures déployés. |
Implémentation dont les jetons de capital sont clonés.
function equityToken() view returns (address);
Retourne si une adresse est le forwarder ERC-2771 de confiance.
function isTrustedForwarder(address forwarder) view returns (bool);
Paramètres
| Nom | Type | Description |
|---|---|---|
forwarder | address | L'adresse du forwarder à tester. |
Implémentation dont les organes sont clonés.
function organ() view returns (address);
Compte autorisé à enregistrer des types de procédures.
function owner() view returns (address);
Organe listant les types de procédures enregistrés.
function proceduresRegistry() view returns (address);
Enregistrer les implémentations de procédures prises en charge dans le registre des procédures.
function registerProcedures((address, string)[] entries);
Paramètres
| Nom | Type | Description |
|---|---|---|
entries | (address, string)[] | Entrées du registre qui pointent vers des implémentations de procédures valides. |
Retourne le forwarder ERC-2771 de confiance utilisé par ce contrat.
function trustedForwarder() view returns (address);
Un actif a été déployé.
event assetDeployed(address asset);
Un organe a été déployé.
event organDeployed(address organ);
Une procédure a été déployée à partir d'un type de procédure enregistré.
event procedureDeployed(address procedureType, address procedure);
Un organe est un groupe : un registre d'entrées, chacune une adresse, une référence de document ou les deux, une liste de permissions et un solde d'ether et de jetons. Chaque modification exige une permission détenue par l'appelant. Les organes peuvent aussi appeler des contrats extérieurs, mais uniquement les appels listés dans leur liste blanche d'exécution.
Un groupe d'une organisation : un registre d'entrées, chacune une adresse, une référence de document ou les deux, une liste de permissions et un solde d'ether et de jetons.
Chaque modification exige une permission détenue par l'appelant. Dans une organisation gouvernée, ce sont les procédures qui détiennent ces permissions, afin que tout changement passe par une décision.
Il possède toutes les fonctions et tous les événements de IOrgan, ainsi que ceux ci-dessous.
constructor();
Initialiser un organe fraîchement cloné.
function initialize(address[] permissionAddresses, bytes2[] permissionValues, string cid, (address, string)[] entries, address forwarder);
Paramètres
| Nom | Type | Description |
|---|---|---|
permissionAddresses | address[] | |
permissionValues | bytes2[] | |
cid | string | Identifiant de contenu décrivant les métadonnées de l'organe. |
entries | (address, string)[] | Entrées initiales stockées dans l'organe. |
forwarder | address |
Retourne si une adresse est le forwarder ERC-2771 de confiance.
function isTrustedForwarder(address forwarder) view returns (bool);
Paramètres
| Nom | Type | Description |
|---|---|---|
forwarder | address | L'adresse du forwarder à tester. |
Hook ERC-1155 acceptant des jetons. Les jetons ERC-1155 ne sont pas enregistrés par l'organe.
function onERC1155BatchReceived(address arg0, address arg1, uint256[] arg2, uint256[] arg3, bytes arg4) returns (bytes4);
Hook ERC-1155 acceptant un jeton. Les jetons ERC-1155 ne sont pas enregistrés par l'organe.
function onERC1155Received(address arg0, address arg1, uint256 arg2, uint256 arg3, bytes arg4) returns (bytes4);
ERC-721 hook recording a token sent to the organ.
function onERC721Received(address operator, address from, uint256 tokenId, bytes arg3) returns (bytes4);
Indiquer si l'organe prend en charge une interface : ERC-165, IOrgan, et les récepteurs ERC-777, ERC-721 et ERC-1155.
function supportsInterface(bytes4 interfaceId) view returns (bool);
ERC-777 hook recording tokens sent to the organ.
function tokensReceived(address operator, address from, address to, uint256 amount, bytes arg4, bytes arg5);
Envoyer des jetons ERC-20 détenus par l'organe. Nécessite la permission WITHDRAW_COINS .
Le second paramètre est ignoré.
function transferCoins(address token, address arg1, address to, uint256 amount);
Envoyer un jeton ERC-721 détenu par l'organe. Nécessite la permission WITHDRAW_COLLECTIBLES .
Le second paramètre est ignoré.
function transferCollectible(address token, address arg1, address to, uint256 tokenId);
Envoyer de l'ether détenu par l'organe. Nécessite la permission WITHDRAW_ETHER .
function transferEther(address to, uint256 value);
Retourne le forwarder ERC-2771 de confiance utilisé par ce contrat.
function trustedForwarder() view returns (address);
L'organe a envoyé de l'ether.
event etherTransferred(address from, address to, uint256 amount);
Déclenché quand le contrat a été initialisé ou réinitialisé.
event Initialized(uint64 version);
Les fonctions que les organes exposent aux procédures et aux applications : entrées, permissions, métadonnées et appels en liste blanche.
Ajouter des entrées à l'annuaire de l'organe.
function addEntries((address, string)[] entries) returns (uint256[] indexes);
Paramètres
| Nom | Type | Description |
|---|---|---|
entries | (address, string)[] | Entrées à ajouter. |
| Retourne |
| Nom | Type | Description |
|---|---|---|
indexes | uint256[] | Index attribués aux entrées nouvellement insérées. |
Accorder des permissions à une adresse ou à un procédé.
function addPermission(address permissionAddress, bytes2 permissionValue);
Paramètres
| Nom | Type | Description |
|---|---|---|
permissionAddress | address | Adresse recevant le masque de bits de permission. |
permissionValue | bytes2 | Masque de bits de permission à accorder. |
Exécuter une appel externe qui a été approuvé par une politique de liste blanche.
L'organe valide l'appel contre la politique configurée pour target + selector avant de faire passer l'appel. Chaque contrainte configurée doit passer.
function executeWhitelisted(address target, uint256 value, bytes data) returns (bytes result);
Paramètres
| Nom | Type | Description |
|---|---|---|
target | address | Le contrat externe à appeler. |
value | uint256 | La quantité de jeton natif à transférer avec l'appel. |
data | bytes | Les données calldata encodées transférées à target. |
| Retourne |
| Nom | Type | Description |
|---|---|---|
result | bytes | Les données brutes de retour produites par l'appel externe. |
Retour d'informations synthétiques sur une politique de appel.
function getCallPolicy(address target, bytes4 selector) view returns (bool enabled, uint256 constraintsLength, uint256 whitelistedAddressesLength);
Paramètres
| Nom | Type | Description |
|---|---|---|
target | address | Le contrat externe clé par la politique. |
selector | bytes4 | Le sélecteur de fonction clé par la politique. |
| Retourne |
| Nom | Type | Description |
|---|---|---|
enabled | bool | Indique si la politique existe et est active. |
constraintsLength | uint256 | Le nombre de contraintes de paramètres configurées sur la politique. |
whitelistedAddressesLength | uint256 | Le nombre d'adresses stockées dans la liste blanche de la politique. |
Retourner une contrainte d'un paramètre d'une politique d'appel.
function getCallPolicyConstraint(address target, bytes4 selector, uint256 index) view returns (uint8 paramIndex, uint8 constraintType, bytes32 minValue, bytes32 maxValue, bytes32 exactValue);
Paramètres
| Nom | Type | Description |
|---|---|---|
target | address | Le contrat externe clé par la politique. |
selector | bytes4 | Le sélecteur de fonction clé par la politique. |
index | uint256 | La position de la contrainte à l'intérieur de la politique. |
| Retourne |
| Nom | Type | Description |
|---|---|---|
paramIndex | uint8 | L'index zéro basé du paramètre calldata contraint par cette règle. |
constraintType | uint8 | Le type de validation appliqué à ce paramètre. |
minValue | bytes32 | La borne inférieure utilisée par les contraintes de plage. |
maxValue | bytes32 | La borne supérieure utilisée par les contraintes de plage. |
exactValue | bytes32 | La valeur exacte utilisée par les contraintes de correspondance exacte. |
Retournez un élément stocké.
function getEntry(uint256 index) view returns ((address, string) entry);
Paramètres
| Nom | Type | Description |
|---|---|---|
index | uint256 | Index de l'élément à lire. |
| Retourne |
| Nom | Type | Description |
|---|---|---|
entry | (address, string) | Chargement de l'élément stocké index. |
Trouvez l'index d'une adresse d'élément.
function getEntryIndexForAddress(address addr) view returns (uint256 index);
Paramètres
| Nom | Type | Description |
|---|---|---|
addr | address | L'adresse stockée dans l'entrée. |
| Retourne |
| Nom | Type | Description |
|---|---|---|
index | uint256 | Index de l'entrée associée à addr. |
Retourner le résumé principal de l'organe.
function getOrgan() view returns (string cid, uint256 permissionsLength, uint256 entriesLength, uint256 entriesCount, bytes4 interfaceId);
Retourne
| Nom | Type | Description |
|---|---|---|
cid | string | CID des métadonnées actuellement attaché à l'organe. |
permissionsLength | uint256 | Nombre d'entrées de permission configurées sur l'organe. |
entriesLength | uint256 | Nombre de places d'entrée allouées. |
entriesCount | uint256 | Nombre d'entrées actives. |
interfaceId | bytes4 | Identifiant de l'interface ERC-165 implémentée par l'organe. |
Retourner une entrée de permission par index.
function getPermission(uint256 index) view returns (address addr, bytes2 perms);
Paramètres
| Nom | Type | Description |
|---|---|---|
index | uint256 | Index de l'entrée de permission à lire. |
| Retourne |
| Nom | Type | Description |
|---|---|---|
addr | address | Adresse détenant la permission. |
perms | bytes2 | Masque de bits de permission détenue addr. |
Retournez le masque de bits de permission assigné à une adresse.
function getPermissions(address addr) view returns (bytes2 perms);
Paramètres
| Nom | Type | Description |
|---|---|---|
addr | address | Adresse à inspecter. |
| Retourne |
| Nom | Type | Description |
|---|---|---|
perms | bytes2 | Masque de bits de permission actuellement assigné à addr. |
Initialiser un organe fraîchement cloné.
function initialize(address[] procedures, bytes2[] permissions, string cid, (address, string)[] entries, address trustedForwarder);
Paramètres
| Nom | Type | Description |
|---|---|---|
procedures | address[] | Adresses qui reçoivent des permissions sur l'organe. |
permissions | bytes2[] | Masques de permissions alignés sur procedures. |
cid | string | Identifiant de contenu décrivant les métadonnées de l'organe. |
entries | (address, string)[] | Entrées initiales stockées dans l'organe. |
trustedForwarder | address | Forwarder ERC-2771 de confiance de l'organe. |
Vérifiez si une adresse figure dans la liste blanche d'une politique d'appel.
function isCallPolicyWhitelistedAddress(address target, bytes4 selector, address candidate) view returns (bool);
Paramètres
| Nom | Type | Description |
|---|---|---|
target | address | Le contrat externe clé par la politique. |
selector | bytes4 | Le sélecteur de fonction clé par la politique. |
candidate | address | L'adresse à tester contre la liste blanche. |
Supprimez une politique d'appel externe précédemment configurée.
function removeCallPolicy(address target, bytes4 selector);
Paramètres
| Nom | Type | Description |
|---|---|---|
target | address | Le contrat externe dont la politique doit être retirée. |
selector | bytes4 | Le sélecteur de fonction dont la politique doit être retirée. |
Supprimer les entrées du répertoire organ.
function removeEntries(uint256[] indexes);
Paramètres
| Nom | Type | Description |
|---|---|---|
indexes | uint256[] | Indices à supprimer. |
Retirer tous les bits de permission d'une adresse ou procédure.
function removePermission(address permissionAddress);
Paramètres
| Nom | Type | Description |
|---|---|---|
permissionAddress | address | Adresse dont les permissions doivent être retirées. |
Remplacer une entrée à un index donné.
function replaceEntry(uint256 index, (address, string) entry);
Paramètres
| Nom | Type | Description |
|---|---|---|
index | uint256 | Index de l'entrée à remplacer. |
entry | (address, string) | Nouvelle entrée stockée à index. |
Remplacer un détenteur de permission par un autre.
function replacePermission(address oldPermission, address newPermission, bytes2 newPermissionValue);
Paramètres
| Nom | Type | Description |
|---|---|---|
oldPermission | address | Adresse actuellement détentrice de la permission. |
newPermission | address | Adresse qui devrait recevoir la permission à la place. |
newPermissionValue | bytes2 | Masque de permission assigné à newPermission. |
Configurer une politique de liste blanche pour un appel externe.
Les politiques sont indexées par target + selector. Chaque politique peut contraindre les arguments de calldata avec NONE, EXACT, RANGE, SELF, ou WHITELISTED_ADDRESS. La liste blanche n'est consultée que par les contraintes qui utilisent WHITELISTED_ADDRESS.
function setCallPolicy(address target, bytes4 selector, (uint8, uint8, bytes32, bytes32, bytes32)[] constraints, address[] whitelistedAddresses);
Paramètres
| Nom | Type | Description |
|---|---|---|
target | address | Le contrat externe que l'organe peut appeler. |
selector | bytes4 | Le sélecteur de fonction autorisé sur target. |
constraints | (uint8, uint8, bytes32, bytes32, bytes32)[] | Les contraintes de calldata à satisfaire pour exécuter l'appel. |
whitelistedAddresses | address[] | Les adresses acceptées par les contraintes fondées sur la liste blanche. |
Mettre à jour le CID des métadonnées de l'organe.
function updateCid(string cid);
Paramètres
| Nom | Type | Description |
|---|---|---|
cid | string | Nouvel identifiant de contenu décrivant l'organe. |
Organisation du stockage et règles des organes, liées dans le contrat Organ .
Permission d'ajouter des entrées.
function PERMISSION_ADD_ENTRIES() view returns (bytes2);
Permission d'accorder des permissions.
function PERMISSION_ADD_PERMISSIONS() view returns (bytes2);
Permission de faire appeler par l'organe un contrat extérieur en liste blanche.
function PERMISSION_EXECUTE_WHITELISTED() view returns (bytes2);
Permission de modifier les appels que l'organe peut faire à des contrats extérieurs.
function PERMISSION_MANAGE_EXECUTION_WHITELIST() view returns (bytes2);
Permission de retirer des entrées.
function PERMISSION_REMOVE_ENTRIES() view returns (bytes2);
Permission de révoquer des permissions.
function PERMISSION_REMOVE_PERMISSIONS() view returns (bytes2);
Permission de remplacer la référence de métadonnées.
function PERMISSION_UPDATE_METADATA() view returns (bytes2);
Permission d'envoyer des jetons détenus par l'organe.
function PERMISSION_WITHDRAW_COINS() view returns (bytes2);
Permission d'envoyer des jetons ERC-721 détenus par l'organe.
function PERMISSION_WITHDRAW_COLLECTIBLES() view returns (bytes2);
Permission d'envoyer de l'ether détenu par l'organe.
function PERMISSION_WITHDRAW_ETHER() view returns (bytes2);
L'organe ne peut plus appeler une fonction d'un contrat extérieur.
event callPolicyRemoved(address indexed caller, address indexed target, bytes4 indexed selector);
L'organe peut désormais appeler une fonction d'un contrat extérieur.
event callPolicySet(address indexed caller, address indexed target, bytes4 indexed selector);
Une adresse a été autorisée comme argument d'un appel en liste blanche.
event callPolicyWhitelistedAddressAdded(bytes32 indexed policyKey, address indexed candidate);
Une adresse n'est plus autorisée comme argument d'un appel en liste blanche.
event callPolicyWhitelistedAddressRemoved(bytes32 indexed policyKey, address indexed candidate);
La référence de métadonnées de l'organe a changé.
event cidUpdated(address from, string cid);
L'organe a reçu des jetons.
event coinsReceived(address operator, address from, address to, uint256 amount);
L'organe a envoyé des jetons.
event coinsTransferred(address operator, address from, address to, uint256 amount);
L'organe a reçu un jeton ERC-721.
event collectibleReceived(address operator, address from, uint256 tokenId);
L'organe a envoyé un jeton ERC-721.
event collectibleTransferred(address operator, address to, uint256 tokenId);
Une entrée a été ajoutée à l'organe.
event entryAdded(address from, uint256 index, address addr, string cid);
Une entrée a été retirée de l'organe.
event entryRemoved(address from, uint256 index);
L'organe a reçu de l'ether.
event etherReceived(address from, uint256 amount);
L'organe a envoyé de l'ether.
event etherTransferred(address from, address to, uint256 amount);
Une adresse a reçu des permissions sur l'organe.
event permissionAdded(address from, address permissionAddress, bytes2 permissionValue);
Une adresse a perdu ses permissions sur l'organe.
event permissionRemoved(address from, address permissionAddress);
L'organe a effectué un appel en liste blanche vers un contrat extérieur.
event whitelistedExecution(address indexed caller, address indexed target, bytes4 indexed selector, uint256 value);
Une procédure permet aux membres de certains organes de modifier d'autres organes par des propositions. Les proposants soumettent une liste d'opérations ; avec modération, les modérateurs la présentent ou la bloquent ; les décideurs l'adoptent ou la rejettent, et l'adoption exécute les opérations. Chaque action a une variante …BySig qui vérifie une signature EIP-712, afin qu'un relais puisse la soumettre au nom du signataire.
Permet aux membres de certains organes de modifier d'autres organes par des propositions : des listes d'opérations que les proposants soumettent, que les modérateurs peuvent présenter ou bloquer, et que les décideurs adoptent ou rejettent.
L'adoption exécute les opérations. Chaque action a une variante …BySig vérifiant une signature EIP-712, afin qu'un relais puisse la soumettre au nom du signataire.
constructor();
Appliquer la proposition.
function applyProposal(uint256 proposalKey);
Régler une proposition avec une application signée par un compte et relayée par un autre.
function applyProposalBySig(uint256 proposalKey, uint256 nonce, uint256 deadline, bytes signature);
Bloquer une proposition en tant que modérateur, avec un motif.
function blockProposal(uint256 proposalKey, string reason);
Bloquer une proposition avec un blocage signé par un modérateur, relayé par n'importe quel compte.
function blockProposalBySig(uint256 proposalKey, string reason, uint256 nonce, uint256 deadline, bytes signature);
retourne les champs et valeurs qui décrivent le séparateur de domaine utilisé par ce contrat pour la signature EIP-712.
function eip712Domain() view returns (bytes1 fields, string name, string version, uint256 chainId, address verifyingContract, bytes32 salt, uint256[] extensions);
Permet à la cible d'une opération d'identifier de façon sûre la proposition en cours d'application.
function getExecutionContext() view returns (bool isApplying, uint256 proposalKey, address proposalCreator);
Lire le prochain nonce de signature d'un compte.
function getNonce(address account) view returns (uint256);
Lire la référence de métadonnées, les rôles et le nombre de propositions de la procédure.
function getProcedure() view returns (string cid, address proposers, address moderators, address deciders, bool withModeration, uint256 proposalsLength, bytes4 interfaceId);
Lire une proposition.
function getProposal(uint256 proposalKey) view returns ((address, string, string, bool, bool, bool, bool, (uint256, address, bytes, uint256, bool)[]));
Initialiser un clone de procédure avec ses rôles.
function initialize(string _cid, address _proposers, address _moderators, address _deciders, bool _withModeration, address _trustedForwarder);
Paramètres
| Nom | Type | Description |
|---|---|---|
_cid | string | Référence aux métadonnées de la procédure. |
_proposers | address | Organe dont les membres peuvent soumettre des propositions, ou une adresse unique. |
_moderators | address | Organe dont les membres peuvent présenter ou bloquer les propositions. |
_deciders | address | Organe dont les membres adoptent ou rejettent les propositions, ou une adresse unique. |
_withModeration | bool | Indique si les propositions doivent être présentées par un modérateur avant la décision. |
_trustedForwarder | address | Forwarder relayant les transactions sans gas. |
Identifiant d'interface ERC-165 des procédures.
function INTERFACE_ID() view returns (bytes4);
Indiquer si une opération ne peut être proposée que par le compte qu'elle concerne.
function isOwnerBoundProposalOperation(bytes operationData) pure returns (bool);
Retourne si une adresse est le forwarder ERC-2771 de confiance.
function isTrustedForwarder(address forwarder) view returns (bool);
Paramètres
| Nom | Type | Description |
|---|---|---|
forwarder | address | L'adresse du forwarder à tester. |
Lorsque la modération est activée, les modérateurs doivent accepter la proposition.
function presentProposal(uint256 proposalKey);
Présenter une proposition avec une présentation signée par un modérateur, relayée par n'importe quel compte.
function presentProposalBySig(uint256 proposalKey, uint256 nonce, uint256 deadline, bytes signature);
API publique : création et mise à jour des propositions.
function propose(string cid, (uint256, address, bytes, uint256, bool)[] operations) returns (uint256 proposalKey);
Soumettre une proposition signée par un proposant, relayée par n'importe quel compte.
function proposeBySig(string cid, (uint256, address, bytes, uint256, bool)[] operations, uint256 nonce, uint256 deadline, bytes signature) returns (uint256 proposalKey);
Retourne true si ce contrat implémente l'interface définie par interfaceId. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[ERC section] to learn more about how these ids are created. This function call must use less than 30 000 gas.
function supportsInterface(bytes4 interfaceId) view returns (bool);
Transfère le capital du créateur de la proposition ; le jeton émet l'enregistrement du mouvement.
function transferEquity(address asset, address recipient, uint256 amount, string movementCid);
Retourne le forwarder ERC-2771 de confiance utilisé par ce contrat.
function trustedForwarder() view returns (address);
Échouer sauf si le créateur d'une proposition peut proposer cette opération.
function validateProposalCreator(address creator, bytes operationData) view;
PEUT être émis pour signaler que le domaine a pu changer.
event EIP712DomainChanged();
Déclenché quand le contrat a été initialisé ou réinitialisé.
event Initialized(uint64 version);
Une procédure dans laquelle n'importe quel membre de l'organe décideur adopte ou rejette seul une proposition.
Il possède toutes les fonctions et tous les événements de Procédure, ainsi que ceux ci-dessous.
Initialiser un clone de procédure avec ses rôles.
function initialize(string _cid, address _proposers, address _moderators, address _deciders, bool _withModeration, address _trustedForwarder);
Paramètres
| Nom | Type | Description |
|---|---|---|
_cid | string | Référence aux métadonnées de la procédure. |
_proposers | address | Organe dont les membres peuvent soumettre des propositions, ou une adresse unique. |
_moderators | address | Organe dont les membres peuvent présenter ou bloquer les propositions. |
_deciders | address | Organe dont les membres adoptent ou rejettent les propositions, ou une adresse unique. |
_withModeration | bool | Indique si les propositions doivent être présentées par un modérateur avant la décision. |
_trustedForwarder | address | Forwarder relayant les transactions sans gas. |
Appliquer la nomination.
function nominate(uint256 proposalKey);
Paramètres
| Nom | Type | Description |
|---|---|---|
proposalKey | uint256 | La clé utilisée pour identifier la proposition. |
Adopter une proposition avec une adoption signée par un décideur, relayée par n'importe quel compte.
function nominateBySig(uint256 proposalKey, uint256 nonce, uint256 deadline, bytes signature);
Rejeter une nomination sans appliquer les opérations de sa proposition.
function reject(uint256 proposalKey);
Paramètres
| Nom | Type | Description |
|---|---|---|
proposalKey | uint256 | La proposition à rejeter. |
Une proposition a été réglée.
event ProposalApplied(uint256 indexed proposalKey);
Une procédure dans laquelle les membres de l'organe décideur votent sur chaque proposition.
Le vote s'ouvre lorsqu'une proposition est présentée. Une fois le vote terminé, n'importe qui appelle applyProposal pour compter les bulletins et régler la proposition.
Il possède toutes les fonctions et tous les événements de Procédure, ainsi que ceux ci-dessous.
Compter les votes à la fin de l'élection.
@todo Gérer la délégation des votes.
function count(uint256 proposalKey) view returns (bool approved);
Retourne
| Nom | Type | Description |
|---|---|---|
approved | bool | Vrai si la proposition est adoptée. |
Obtenir des informations sur une élection en cours
function getElection(uint256 _proposalKey) view returns (uint256 start, bool hasVoted, uint256 votesCount);
Retourne
| Nom | Type | Description |
|---|---|---|
start | uint256 | Le temps UNIX lors de l'ouverture de l'élection. |
hasVoted | bool | Vrai si le votant a déjà voté. |
votesCount | uint256 | Le nombre de votes enregistrés jusqu'à présent. |
Obtenir la répartition actuelle des votes et la base de votants éligibles.
ERC20VoteProcedure redéfinit cette fonction pour utiliser le pouvoir de vote à l'instantané.
function getElectionResults(uint256 proposalKey) view returns (uint256 approvals, uint256 objections, uint256 eligibleVotes);
Retourne
| Nom | Type | Description |
|---|---|---|
approvals | uint256 | Le nombre de votes favorables. |
objections | uint256 | Le nombre de votes défavorables. |
eligibleVotes | uint256 | Le nombre de votes éligibles. |
Initialiser la procédure.
function initialize(string _cid, address _proposers, address _moderators, address _deciders, bool _withModeration, address _trustedForwarder, uint32 _quorumSize, uint32 _voteDuration, uint32 _majoritySize);
Part des bulletins qui doivent approuver, en millièmes de pour cent.
function majoritySize() view returns (uint32);
Part des votants qui doivent voter, en millièmes de pour cent.
function quorumSize() view returns (uint32);
Créer une élection.
function vote(uint256 proposalKey, bool approval);
Émettre un vote signé par un décideur, relayé par n'importe quel compte.
function voteBySig(uint256 proposalKey, bool approval, uint256 nonce, uint256 deadline, bytes signature);
Durée d'un vote, en secondes.
function voteDuration() view returns (uint32);
Une proposition a été réglée.
event ProposalApplied(uint256 indexed proposalKey);
Un modérateur a bloqué une proposition.
event ProposalBlocked(address indexed moderator, uint256 indexed proposalKey, string reason);
Une proposition a été soumise.
event ProposalCreated(address indexed creator, uint256 indexed proposalKey);
Un modérateur a présenté une proposition aux décideurs.
event ProposalPresented(address indexed presenter, uint256 indexed proposalKey);
Une procédure de vote dans laquelle chaque bulletin pèse le solde de jetons du votant.
Les bulletins pèsent les soldes détenus juste avant l'ouverture du vote, si bien que les jetons déplacés pendant le vote ne comptent pas deux fois.
Il possède toutes les fonctions et tous les événements de Procédure de vote, ainsi que ceux ci-dessous.
Initialiser un vote ERC-20 dont les rôles sont tenus par les membres d'un organe, les détenteurs du jeton ou personne.
function initialize(string _metadata, address _proposers, address _moderators, address _deciders, bool _withModeration, address _trustedForwarder, uint32 _quorumSize, uint32 _voteDuration, uint32 _majoritySize, address _tokenContract, uint8[3] _roleModes);
Paramètres
| Nom | Type | Description |
|---|---|---|
_metadata | string | |
_proposers | address | |
_moderators | address | |
_deciders | address | |
_withModeration | bool | |
_trustedForwarder | address | |
_quorumSize | uint32 | |
_voteDuration | uint32 | |
_majoritySize | uint32 | |
_tokenContract | address | |
_roleModes | uint8[3] | Modes des rôles des proposants, des modérateurs et des votants. |
Initialiser la procédure.
function initialize(string _metadata, address _proposers, address _moderators, address _deciders, bool _withModeration, address _trustedForwarder, uint32 _quorumSize, uint32 _voteDuration, uint32 _majoritySize, address _tokenContract);
Paramètres
| Nom | Type | Description |
|---|---|---|
_metadata | string | Métadonnées de la procédure. |
_proposers | address | L'organe dont les entrées pourront proposer des propositions. |
_moderators | address | L'organe dont les entrées pourront modérer des propositions. |
_deciders | address | L'organe dont les entrées seront autorisées à adopter ou refuser des propositions. |
_withModeration | bool | Si la procédure nécessite ou non la modération. |
_trustedForwarder | address | Le contrat du forwarder de confiance. |
_quorumSize | uint32 | Le pourcentage minimum de votes requis pour valider une élection. |
_voteDuration | uint32 | Durée du vote en seconds. |
_majoritySize | uint32 | Le pourcentage minimum de votes requis pour valider une élection. |
_tokenContract | address | Le contrat du token ERC20 représentant les droits de vote. |
Initialiser un vote ERC-20 avec validation facultative par une majorité des membres.
function initialize(string _metadata, address _proposers, address _moderators, address _deciders, bool _withModeration, address _trustedForwarder, uint32 _quorumSize, uint32 _voteDuration, uint32 _majoritySize, address _tokenContract, uint8[3] _roleModes, bool _requireMemberMajority);
Indique si les modérateurs sont les membres d'un organe, les détenteurs du jeton, ou personne.
function moderatorMode() view returns (uint8);
Indique si les proposants sont les membres d'un organe, les détenteurs du jeton, ou personne.
function proposerMode() view returns (uint8);
Quand les votants viennent d'un organe, exiger une majorité de ses membres en plus du quorum et de la majorité habituels pondérés par le jeton.
function requireMemberMajority() view returns (bool);
tokenContract est un contrat ERC20Votes-compatible représentant les droits de vote.
function tokenContract() view returns (address);
Indique si les votants sont les membres d'un organe ou les détenteurs du jeton.
function voterMode() view returns (uint8);
Organisation du stockage et règles des propositions, liées dans les contrats de procédure.
Utils.
function isInOrgan(address organ, address caller) view returns (bool);
Une proposition a été réglée.
event ProposalApplied(uint256 indexed proposalKey);
Un modérateur a bloqué une proposition.
event ProposalBlocked(address indexed moderator, uint256 indexed proposalKey, string reason);
Une proposition a été soumise.
event ProposalCreated(address indexed creator, uint256 indexed proposalKey);
Un modérateur a présenté une proposition aux décideurs.
event ProposalPresented(address indexed presenter, uint256 indexed proposalKey);
Les actifs sont des jetons ERC-20 avec des points de contrôle de vote, afin qu'un vote puisse peser les soldes à un moment passé. Un EquityToken représente des parts de société : ses transferts doivent être approuvés par une procédure.
Un jeton ERC-20 avec points de contrôle de vote, détenu par des organes.
constructor();
Renvoie le nombre restant de jetons que spender sera autorisé à dépenser au nom de owner via {transferFrom}. Vaut zéro par défaut. Cette valeur change quand {approve} ou {transferFrom} sont appelées.
function allowance(address owner, address spender) view returns (uint256);
See {IERC20-approve}. NOTE: If value est le maximum uint256, l'autorisation n'est pas mise à jour sur transferFrom. C'est sémantiquement équivalent à une approbation infinie. Exigences : - spender ne peut pas être l'adresse zéro.
function approve(address spender, uint256 value) returns (bool);
Renvoie la quantité de jetons détenue par account.
function balanceOf(address account) view returns (uint256);
Obtenir le pos-ième point de contrôle de account.
function checkpoints(address account, uint32 pos) view returns ((uint48, uint208));
Horloge utilisée pour marquer les points de contrôle. Peut être redéfinie pour implémenter des points de contrôle (et des votes) fondés sur l'horodatage, auquel cas {CLOCK_MODE} doit aussi être redéfinie pour correspondre.
function clock() view returns (uint48);
Description de l'horloge lisible par une machine, telle que spécifiée dans l'ERC-6372.
function CLOCK_MODE() view returns (string);
Renvoie le nombre de décimales utilisées pour obtenir sa représentation pour l'utilisateur. Par exemple, si decimals vaut 2, un solde de 505 jetons doit être affiché à l'utilisateur comme 5.05 (505 / 10 ** 2). Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei. This is the default value returned by this function, unless it's overridden. NOTE: This information is only used for display purposes: it in no way affects any of the arithmetic of the contract, including {IERC20-balanceOf} and {IERC20-transfer}.
function decimals() view returns (uint8);
Délègue les votes de l'expéditeur à delegatee.
function delegate(address delegatee);
Délègue les votes du signataire à delegatee.
function delegateBySig(address delegatee, uint256 nonce, uint256 expiry, uint8 v, bytes32 r, bytes32 s);
Renvoie le délégué que account a choisi.
function delegates(address account) view returns (address);
retourne les champs et valeurs qui décrivent le séparateur de domaine utilisé par ce contrat pour la signature EIP-712.
function eip712Domain() view returns (bytes1 fields, string name, string version, uint256 chainId, address verifyingContract, bytes32 salt, uint256[] extensions);
Renvoie l'offre totale de votes disponible à un moment donné du passé. Si l' clock() est configurée pour utiliser des numéros de bloc, renvoie la valeur à la fin du bloc correspondant. NOTE : cette valeur est la somme de tous les votes disponibles, qui n'est pas nécessairement la somme de tous les votes délégués. Les votes non délégués font toujours partie de l'offre totale, même s'ils ne participeraient pas à un vote. Exigences : - timepoint doit être dans le passé. En fonctionnement par numéros de bloc, le bloc doit déjà être miné.
function getPastTotalSupply(uint256 timepoint) view returns (uint256);
Renvoie le nombre de votes que account avait à un moment donné du passé. Si l' clock() est configurée pour utiliser des numéros de bloc, renvoie la valeur à la fin du bloc correspondant. Exigences : - timepoint doit être dans le passé. En fonctionnement par numéros de bloc, le bloc doit déjà être miné.
function getPastVotes(address account, uint256 timepoint) view returns (uint256);
Renvoie le nombre actuel de votes que account détient.
function getVotes(address account) view returns (uint256);
Initialiser un clone d'actif et émettre son offre.
function initialize(string name_, string symbol_, address initialReceiver_, uint256 initialSupply_);
Paramètres
| Nom | Type | Description |
|---|---|---|
name_ | string | Nom du token. |
symbol_ | string | Symbole du token. |
initialReceiver_ | address | Compte recevant l'offre initiale. |
initialSupply_ | uint256 | Offre émise à l'initialisation. |
Renvoie le nom du jeton.
function name() view returns (string);
Renvoie le prochain nonce inutilisé d'une adresse.
function nonces(address owner) view returns (uint256);
Obtenir le nombre de points de contrôle de account.
function numCheckpoints(address account) view returns (uint32);
Renvoie le symbole du jeton, généralement une version abrégée du nom.
function symbol() view returns (string);
Renvoie la quantité de jetons en circulation.
function totalSupply() view returns (uint256);
Voir {IERC20-transfer}. Exigences : - to ne peut pas être l'adresse zéro. - l'appelant doit avoir un solde d'au moins value.
function transfer(address to, uint256 value) returns (bool);
Voir {IERC20-transferFrom}. N'émet pas d'événement {Approval} signalant une mise à jour de l'autorisation. Ce n'est pas exigé par l'ERC. Voir {xref-ERC20-_approve-address-address-uint256-bool-}[_approve]. NOTE : ne met pas à jour l'autorisation si l'autorisation actuelle est le maximum uint256. Exigences : - from et to ne peut pas être l'adresse zéro. - from doit avoir un solde d'au moins value. - l'appelant doit avoir une autorisation sur les jetons de fromd'au moins value.
function transferFrom(address from, address to, uint256 value) returns (bool);
Émis quand l'autorisation d'un spender pour un owner est définie par un appel à {approve}. value est la nouvelle autorisation.
event Approval(address indexed owner, address indexed spender, uint256 value);
Émis quand un compte change de délégué.
event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate);
Émis quand un transfert de jetons ou un changement de délégué modifie le nombre d'unités de vote d'un délégué.
event DelegateVotesChanged(address indexed delegate, uint256 previousVotes, uint256 newVotes);
PEUT être émis pour signaler que le domaine a pu changer.
event EIP712DomainChanged();
Déclenché quand le contrat a été initialisé ou réinitialisé.
event Initialized(uint64 version);
Émis quand value jetons sont déplacés d'un compte (from) vers un autre (to). Notez que value peut valoir zéro.
event Transfer(address indexed from, address indexed to, uint256 value);
Représentation ERC-20 de titres de capital dont les mouvements sont réglés par une procédure approuvée.
Il possède toutes les fonctions et tous les événements de Actif, ainsi que ceux ci-dessous.
constructor();
Rôle des procédures qui modifient quelles procédures détiennent un rôle.
function ADMIN_PROCEDURE_ROLE() view returns (bytes32);
Initialiser un clone de jeton de capital et émettre son offre.
function initialize(string name_, string symbol_, address initialHolder_, uint256 initialSupply_, address transferProcedure_);
Paramètres
| Nom | Type | Description |
|---|---|---|
name_ | string | Nom du token. |
symbol_ | string | Symbole du token. |
initialHolder_ | address | Compte recevant l'offre initiale. |
initialSupply_ | uint256 | Offre émise à l'initialisation. |
transferProcedure_ | address | Procédure réglant les transferts, qui reçoit aussi le rôle d'administration. |
Indiquer si une procédure détient un rôle.
function isProcedureAuthorized(bytes32 role, address procedure) view returns (bool);
Indiquer si une procédure peut régler des transferts.
function isTransferProcedure(address procedure) view returns (bool);
Accorder ou révoquer une procédure de transfert ou d'administration par la gouvernance.
function setProcedureAuthorization(bytes32 role, address procedure, bool authorized);
Règle un transfert du créateur de la proposition appliquée et enregistre le mouvement.
function settleTransfer(address recipient, uint256 amount, string movementCid);
Rôle des procédures qui règlent les transferts.
function TRANSFER_PROCEDURE_ROLE() view returns (bytes32);
Vérifie les conditions du transfert lors de la création de la proposition.
function validateTransfer(address creator, address recipient, uint256 amount, string movementCid) view;
Enregistrement du mouvement d'un transfert réglé, à partir duquel est construit le registre des mouvements de titres.
event MovementSettled(address indexed procedure, uint256 indexed proposalKey, address indexed seller, address recipient, uint256 amount, string movementCid);
Une procédure a reçu ou perdu un rôle.
event ProcedureAuthorizationUpdated(bytes32 indexed role, address indexed procedure, bool authorized);
Le MetaGasStation est le forwarder de confiance des contrats du protocole : il relaie les transactions signées par des utilisateurs qui ne détiennent pas d'ether, et les contrats lisent le signataire d'origine plutôt que le relais.
Forwarder de confiance des contrats du protocole : il relaie les requêtes signées par des comptes qui ne détiennent pas d'ether, et les contrats lisent le signataire plutôt que le relais.
constructor(string name);
retourne les champs et valeurs qui décrivent le séparateur de domaine utilisé par ce contrat pour la signature EIP-712.
function eip712Domain() view returns (bytes1 fields, string name, string version, uint256 chainId, address verifyingContract, bytes32 salt, uint256[] extensions);
Exécute une request au nom du signataire de signature via le protocole ERC-2771. Le gas fourni à l'appel demandé peut ne pas être exactement le montant demandé, mais l'appel ne manquera pas de gas. Échoue si la requête est invalide ou si l'appel échoue ; dans ce cas, le nonce n'est pas consommé. Exigences : - la valeur de la requête doit être égale à la msg.value. - The request should be valid according to {verify}.
function execute((address, address, uint256, uint256, uint48, bytes, bytes) request) payable;
Version par lots de {execute} avec remboursement facultatif et exécution atomique. Si un lot contient au moins une requête invalide (voir {verify}), la requête est ignorée et le paramètre refundReceiver reçoit en retour la valeur demandée inutilisée à la fin de l'exécution. Cela évite de faire échouer tout le lot quand une requête est invalide ou a déjà été soumise. Si le refundReceiver est l' address(0), cette fonction échoue dès qu'au moins une des requêtes est invalide, au lieu de l'ignorer. Cela peut être utile si un lot doit être exécuté de façon atomique (au moins au premier niveau). Par exemple, le remboursement (et donc l'atomicité) peut être désactivé si le relais utilise un service qui évite d'inclure les transactions échouées. Exigences : - la somme des valeurs des requêtes doit être égale à la msg.value. - Toutes les requêtes doivent être valides (voir {verify}) quand refundReceiver est l'adresse zéro. NOTE : un refundReceiver nul ne garantit une exécution tout-ou-rien que pour les appels relayés de premier niveau. Si une requête relayée appelle un contrat qui fait lui-même un sous-appel, l'appel de second niveau peut échouer sans que l'appel de premier niveau échoue.
function executeBatch((address, address, uint256, uint256, uint48, bytes, bytes)[] requests, address refundReceiver) payable;
Renvoie le prochain nonce inutilisé d'une adresse.
function nonces(address owner) view returns (uint256);
Retourne true si une requête est valide pour une signature fournie à l'horodatage du bloc courant. Une transaction est considérée comme valide quand la cible fait confiance à ce forwarder, que la requête n'a pas expiré (l'échéance n'est pas atteinte) et que le signataire correspond au paramètre from parameter of the signed request. NOTE: A request may return false here but it won't cause {executeBatch} to revert if a refund receiver is provided.
function verify((address, address, uint256, uint256, uint48, bytes, bytes) request) view returns (bool);
PEUT être émis pour signaler que le domaine a pu changer.
event EIP712DomainChanged();
Émis quand une ForwardRequest est exécutée. NOTE : l'échec d'une requête relayée peut être dû à une signature invalide, à une échéance dépassée ou simplement à l'échec de l'appel demandé. Le contrat garantit que le relais ne peut pas forcer l'appel demandé à manquer de gas.
event ExecutedForwardRequest(address indexed signer, uint256 nonce, bool success);
Modifier cette page
Sur cette page:
© 2026 Organigram SAS
Tous droits réservés.