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"]}' | jqInitializing 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 eosioActivating 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 eosioWe 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 '{}' | jqInitialize 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.msigAfter 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 ultraThen 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 ultraThen 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 ultraUltra 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 ultraInitialize the System Contract 
We’ll start off by setting the contract for the account eosio.
cleos set contract eosio ./eosio.systemAfter 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 eosioWe also cannot forget to reserve some RAM for ultra.
cleos push action eosio resvrambytes '["1073741824"]' -p ultraRegistering 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 ultraResigning 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