Deploy a Delegation Using the Delegation Factory
An entire Delegation can be deployed using the Delegation Factory in a single transaction. You can use the Delegation Factory on the EthereansOS platform here (link coming soon).
The Delegation Factory, which is a custom Factory, allows you to clone (via the
deploy
function) your Delegation, link Components and initialize everything at once.A Delegation is cloned with the following Components:
- Proposal Manager
- Treasury Manager
- Delegation Token Manager
The deploy method of the Factory takes as input the
deployData
parameter:function deploy(bytes calldata deployData) external payable override(Factory, IFactory) virtual returns(address productAddress, bytes memory productInitResponse)
The
deployData
is the encoded value of the OrganizationDeployData
struct composed as follows:struct OrganizationDeployData {
string uri;
bytes[] mandatoryComponentsDeployData;
uint256[] additionalComponents;
bytes[] additionalComponentsDeployData;
bytes[] specialComponentsData;
bytes specificOrganizationData;
}
string
uri
-> this uri parameter contains the Delegation's metadata. The Delegation contract implements theDynamicMetadataCapableElement
, so that you can set a traditional or a dynamic uri (see here to learn more).bytes[]
mandatoryComponentsDeployData
-> thisinit
data is used to initialize the Proposal Manager, Treasury Manager, and Delegation Tokens Manager that are mandatory Components of the Delegation.uint256[]
additionalComponents
-> this is an index of the additional Components that you want to link to the Delegation. Look below to find the Component indices.bytes[]
additionalComponentsDeployData
-> this init data is used to initialize the additional chosen Components. Each position in the bytes array corresponds to the sequentially equivalent position in theadditionalComponents
array.bytes[]
specialComponentsData
-> pass empty.bytes
specificOrganizationData
-> pass empty.
The proposeToAttach function can be used, after the Delegation deployment, to attach it to a Delegations Manager.
This function can be called only by the address that called the deploy function to deploy the Delegation.
function proposeToAttachOrDetach(address delegationAddress, address delegationsManagerAddress) public returns(bytes32 proposalId)
The function takes as input:
- address delegationAddress -> address of the Delegation to attach.
- address delegationsManagerAddres -> address of the Delegations Manager to which the Delegation is going to be attached.
The
deployData
to pass is composed as follows:// Proposal Manager init data
mandatoryComponentsDeployData[0] = abi.encode(['tuple(address[],uint256[],uint256[],address,address,address[],address[])'], [
[
[], //address[] collections
[], //uint256[] objectIds
[], //uint256[] weights
utilities.voidEthereumAddress, //address creationRules
utilities.voidEthereumAddress, //triggeringRules
[], //address[] canTerminateAddresses
[] //address[] validatorsAddresses
]
]);
//Treasury Manager init data
mandatoryComponentsDeployData[1] = abi.encode(['addresss'], [
[
utilities.voidEthereumAddress
]
]);
//Delegation Tokens Manager init data
mandatoryComponentsDeployData[2] = abi.encode(["tuple(address,string,string,string)"], [
[
utilities.voidEthereumAddress, //host address
"yourName", //name
"yourSymbol", //symbol
"yourUri", //uri
]
]);
var organizationDeployData = {
uri: "",
mandatoryComponentsDeployData,
additionalComponents: [],
additionalComponentsDeployData: "0x",
specialComponentsData: '0x';
specificOrganizationData: '0x'
}
data = abi.encode(["tuple(string,bytes,bytes[],uint256[],bytes[],bytes)"], [Object.values(organizationDeployData)]);
organizationFactory.methods.deploy(data).send({from : myAddress})
Use this example pattern to create your own
deployData
.Last modified 1yr ago