Setting Up Genesis Node
While you are reading this article keep in mind that these are steps that Ultra will be performing on their Genesis Node. These are not steps that are going to be taken by the Block Producers.
The Ultra system token is UOS and has a decimal count of 4. This will be used to launch the system contract and ensure everything is synchronized between the eosio.token contract and eosio.system contract.
Ultra will be providing pre-compiled contract ABIs and WASMs.
Important: Before launch, any default chain parameters inside of the source files need to be DISCUSSED and ADJUSTED before the system contract is used.
Creating System Accounts
The first thing that we’re going to do is create the system accounts. Here’s a full list of the system accounts.
eosio
eosio.token
eosio.system
eosio.msig
eosio.ram: store ram payment
eosio.ramfee: store ram fee
eosio.stake: store staked token
eosio.wrap: for the wrap contract
ultra: ultra root account
Note: All of the accounts should be placed under the same genesis key except for ULTRA. As these accounts will eventually forfeit their permissions to the producers. The creation of these accounts can be done through the following action.
cleos create account eosio <account_name>
We will ensure that all accounts are created by checking them manually.
cleos get account <account_name>
Accounts which EOS mainnet use whereas ultra doesn't
eosio.rex, as we don't have res
eosio.names, as we don't have premium name policy yet, no name bidding
eosio.saving, as we don't have extra inflation, so we don't need the saving account
eosio.bpay: producers' block reward, as we inflate token when doing reward for each BP, we don't need the cache
eosio.vpay
Setting Up for Chain Feature Activation
The chain features must be manually activated before launch; here’s how we can do that.
curl -X POST http://127.0.0.1:8888/v1/producer/schedule_protocol_feature_activations -d '{"protocol_features_to_activate": ["0ec7e080177b2c02b278d5088611686b49d739925a92d9bfcacd7fc6b74053bd"]}' | jq
Initializing the BIOS Contract
The BIOS contract must be deployed on eosio before we continue any further.
Ultra provides a compiled version of this contract.
cleos set contract eosio ./eosio.contracts/contracts/eosio.bios.x.x.x eosio.bios.wasm eosio.bios.abi -p eosio
Activating the Chain Features
These chain features must be activated manually. In order, the following features are going to be activated.
GET_SENDER
FORWARD_SETCODE
ONLY_BILL_FIRST_AUTHORIZER
RESTRICT_ACTION_TO_SELF
DISALLOW_EMPTY_PRODUCER_SCHEDULE
FIX_LINKAUTH_RESTRICTION
REPLACE_DEFERRED
NO_DUPLICATE_DEFERRED_ID
ONLY_LINK_TO_EXISTING_PERMISSION
RAM_RESTRICTIONS
WEBAUTHN_KEYS
WTMSIG_BLOCK_SIGNATURES
cleos push action eosio activate '["f0af56d2c5a48d60a4a5b5c903edfb7db3a736a94ed589d0b797df33ff9d3e1d"]' -p eosio
cleos push action eosio activate '["2652f5f96006294109b3dd0bbde63693f55324af452b799ee137a81a905eed25"]' -p eosio
cleos push action eosio activate '["8ba52fe7a3956c5cd3a656a3174b931d3bb2abb45578befc59f283ecd816a405"]' -p eosio
cleos push action eosio activate '["ad9e3d8f650687709fd68f4b90b41f7d825a365b02c23a636cef88ac2ac00c43"]' -p eosio
cleos push action eosio activate '["68dcaa34c0517d19666e6b33add67351d8c5f69e999ca1e37931bc410a297428"]' -p eosio
cleos push action eosio activate '["e0fb64b1085cc5538970158d05a009c24e276fb94e1a0bf6a528b48fbc4ff526"]' -p eosio
cleos push action eosio activate '["ef43112c6543b88db2283a2e077278c315ae2c84719a8b25f25cc88565fbea99"]' -p eosio
cleos push action eosio activate '["4a90c00d55454dc5b059055ca213579c6ea856967712a56017487886a4d4cc0f"]' -p eosio
cleos push action eosio activate '["1a99a59d87e06e09ec5b028a9cbb7749b4a5ad8819004365d02dc4379a8b7241"]' -p eosio
cleos push action eosio activate '["4e7bf348da00a945489b2a681749eb56f5de00b900014e137ddae39f48f69d67"]' -p eosio
cleos push action eosio activate '["4fca8bd82bbd181e714e283f83e1b45d95ca5af40fb89ad3977b653c448f78c2"]' -p eosio
cleos push action eosio activate '["299dcb6af692324b899b39f16d5a530a33062804e41f09dc97e9f156b4476707"]' -p eosio
We will verify all of these are activated by running the following command.
curl -X POST http://127.0.0.1:8888/v1/producer/get_supported_protocol_features -d '{}' | jq
Initialize Base Contracts
We’re first going to initialize the eosio.token and eosio.msig contracts. This is entirely dependent on the directory you are in, but it should be a similar process. Ensure the keys for the accounts are inside of your wallet at this time.
After we’ll start with setting both the eosio.token and eosio.msig contracts. We’ll be using the ‘eosio.contracts/contracts’ the folder in this reference.
cleos set contract eosio.token ./eosio.token
cleos set contract eosio.msig ./eosio.msig
After that, we'll be adding some permissions to the token account.
cleos set account permission eosio.token active --add-code eosio.token owner -p eosio.token
cleos set account permission ultra active --add-code eosio.token owner -p ultra
Then we’ll initialize the actual eosio.token contract immediately after; putting reserved symbols into the eosio.token table.
cleos push action eosio.token init '[]' -p ultra
Then we’ll initialize the system currency. Please replace MAX_SUPPLY with the maximum tokens agreed upon in the IEO, which was 1,000,000,000 tokens.
cleos push action eosio.token create '["ultra","1000000000.0000 UOS"]' -p ultra
Ultra needs to take into consideration their token pre-sale. This should match the pre-sale numbers and will be distributed after launch.
cleos push action eosio.token issue '["ultra","AMOUNT.0000 UOS", "Init"]' -p ultra
Initialize the System Contract
We’ll start off by setting the contract for the account eosio.
cleos set contract eosio ./eosio.system
After setting this contract we need to initialize the system contract with our currency. Remember that we’re using 8
for the precision of our system currency.
cleos push action eosio init '[0,"8,UOS"]' -f -p eosio
We also cannot forget to reserve some RAM for ultra.
cleos push action eosio resvrambytes '["1073741824"]' -p ultra
Registering New Accounts
At this point, we will need to register accounts for our Block Producer partners. Our Block Producer partners will need to provide their account names as well as their public key. We will use the system contract to make new accounts from this point forward.
cleos system newaccount ultra <account_name> <public_key> --transfer --stake-net "0.00000000 UOS" --stake-cpu "0.00000000 UOS" --gift-ram-kbytes 4k -p ultra
Resigning Genesis Account to Block Producers
At this stage we will be resigning our genesis account and removing all of the associated permissions. The eosio.system contract will be distributing its permissions to our Block Producers from here on in. After this step Ultra will no longer be responsible for anything that the system contract does and it will be fully automated by the block production schedule.
There are additional details on how this is done in the following article: Resigning eosio and system accounts