Initiating a Customizable Staking Pool
Before Initiation:
32 Ether
Creating a Pool is permissionless, anyone can claim any pool name.
To prevent sybil attacks, initiation requires exactly 1 validator worth of funds. However, you can deposit more Ether later.
However, this amount will be used to create your first validator.
Pool ID
Every Pool will have a unique ID.
It will be used for your Pool operations, and you can find your ID from both our frontend or Portal.
const pool_ID = Portal.generateId(pool_name, 5);
Maintainers
Maintainers are useful to automate pool owners' daily tasks, such as choosing your Node Operators.
⛏️MaintainersInitiate Your Pool!
Geode uses an initiator function to set some parameters for your staking pool and derivative.
Portal.initiatePool(
NAME,
fee,
interfaceVersion,
maintainer,
interface_data,
config,
{value: 32 Ether}
);
NAME: Unique name of your Pool. Can not be changed later.
FEE: Maintenance fee that will be charged for your services as the pool owner. 10^10 represents 100%, can be set to up to 10% (10^9). Can be changed later.
Interface Version: Can be empty, or can be any interfaces from the list below. Can not be changed later.
Maintainer: Any other address that will manage your pool's Node Operators. Can be a community owned Maintainer, or the address of an automation script, etc. Can be changed later.
Interface Data: some interfaces require data to be present along with a gETH address and Pool id.
Config: initial configuration of your Pool as:
True if a private pool - Can be changed later.
True if uses an interface. Can not be changed later.
True if uses a liquidity Pool - Can be changed later.
Example of Pool Creation Transaction
Basic Pool Initiation
The below transaction creates a Private Staking Pool with no maintenance fee, no interface, and no Liquidity Pool:
// Pool
const your_address="0xabcdf....abcdf";
const pool_name= "IceBear's Pool";
// send the transaction
Portal
.initiatePool(
0,
0,
your_address,
pool_name,
"0x",
[true, false, false])
.send({
value: String(32e18),
});
pool_ID = Portal.generateId(pool_name, 5);
Complex Initiation
The below transaction creates a Public Staking Pool with a 5% maintenance fee, and ERC20InterfacePermitUpgradable interface, which also has a bound Liquidity Pool:
const getBytes = (key) => {
return Web3.utils.toHex(key);
};
const intToBytes32 = (x) => {
return ethers.utils.hexZeroPad(ethers.utils.hexlify(x), 32);
};
// EDIT HERE
// Pool
const your_address="0xabcdf....abcdf";
const pool_name= "IceBear's Pool";
const pool_fee = 5 // 5%
// interfaces = ["ERC20", "ERC20Permit"];
const interface_version = "ERC20Permit";
const interface_name = "IceBear Staked Ether";
const interface_symbol= "IETH"
// Config
const is_private_pool = false;
const use_interface = true;
const use_liquidity_pool = true;
// EDIT HERE
// DO NOT TOUCH HERE
const name_bytes = getBytes(interface_name ).substr(2);
const symbol_bytes = getBytes(interface_symbol).substr(2);
const interface_data =
intToBytes32(nameBytes.length / 2) + nameBytes + symbolBytes;
const interface_id = await Portal.generateId(interface_version, 31);
const denominator=10 ** 10;
await Portal
.initiatePool(
Math.floor((pool_fee * denominator) / 100),
interface_id,
deployer.address,
getBytes(pool_name),
interfaceData,
[is_private_pool , use_interface , use_liquidity_pool ],
{
from: deployer,
log: true,
value: String(32e18),
},
);
const pool_ID = Portal.generateId(pool_name, 5);
console.log("your pool id:", pool_ID);
Last updated