The eosio.system smart contract is provided by block.one as a sample system contract, and it defines the structures and actions needed for blockchain's core functionality.

Just like in the eosio.bios sample contract implementation, there are a few actions which are not implemented at the contract level (newaccount, updateauth, deleteauth, linkauth, unlinkauth, canceldelay, onerror, setabi, setcode), they are just declared in the contract so they will show in the contract's ABI and users will be able to push those actions to the chain via the account holding the eosio.system contract, but the implementation is at the EOSIO core level. They are referred to as EOSIO native actions.

  • Users can stake tokens for CPU and Network bandwidth, and then vote for producers or delegate their vote to a proxy.
  • Producers register in order to be voted for, and can claim per-block and per-vote rewards.
  • Users can buy and sell RAM at a market-determined price.
  • Users can bid on premium names.
  • A resource exchange system (REX) allows token holders to lend their tokens, and users to rent CPU and Network resources in return for a market-determined fee.

system

Type: class

The eosio.system smart contract is provided by block.one as a sample system contract, and it defines the structures and actions needed for blockchain's core functionality.

Just like in the eosio.bios sample contract implementation, there are a few actions which are not implemented at the contract level (newaccount, updateauth, deleteauth, linkauth, unlinkauth, canceldelay, onerror, setabi, setcode), they are just declared in the contract so they will show in the contract's ABI and users will be able to push those actions to the chain via the account holding the eosio.system contract, but the implementation is at the EOSIO core level. They are referred to as EOSIO native actions.

  • Users can stake tokens for CPU and Network bandwidth, and then vote for producers or delegate their vote to a proxy.
  • Producers register in order to be voted for, and can claim per-block and per-vote rewards.
  • Users can buy and sell RAM at a market-determined price.
  • Users can bid on premium names.
  • A resource exchange system (REX) allows token holders to lend their tokens, and users to rent CPU and Network resources in return for a market-determined fee.
  • A resource market separate from REX: power.

init

Type: void

The Init action initializes the system contract for a version and a symbol. Only succeeds when:

  • version is 0 and
  • symbol is found and
  • system token supply is greater than 0,
  • and system contract wasn’t already been initialized.
Parameter Name Description
version - the version, has to be 0,
core - the system symbol.

onblock

Type: void

On block action. This special action is triggered when a block is applied by the given producer and cannot be generated from any other source. It is used to pay producers and calculate missed blocks of other producers. Producer pay is deposited into the producer's stake balance and can be withdrawn over time. If blocknum is the start of a new round this may update the active producer config from the producer votes.

Parameter Name Description
header - the block header produced.

setalimits

Type: void

Set account limits action sets the resource limits of an account

Parameter Name Description
account - name of the account whose resource limit to be set,
ram_bytes - ram limit in absolute bytes,
net_weight - fractionally proportionate net limit of available resources based on (weight / total_weight_of_all_accounts),
cpu_weight - fractionally proportionate cpu limit of available resources based on (weight / total_weight_of_all_accounts).

setacctram

Type: void

Set account RAM limits action, which sets the RAM limits of an account

Parameter Name Description
account - name of the account whose resource limit to be set,
ram_bytes - ram limit in absolute bytes.

setacctnet

Type: void

Set account NET limits action, which sets the NET limits of an account

Parameter Name Description
account - name of the account whose resource limit to be set,
net_weight - fractionally proportionate net limit of available resources based on (weight / total_weight_of_all_accounts).

setacctcpu

Type: void

Set account CPU limits action, which sets the CPU limits of an account

Parameter Name Description
account - name of the account whose resource limit to be set,
cpu_weight - fractionally proportionate cpu limit of available resources based on (weight / total_weight_of_all_accounts).

activate

Type: void

The activate action, activates a protocol feature

Parameter Name Description
feature_digest - hash of the protocol feature to activate.

delegatebw

Type: void

Delegate bandwidth and/or cpu action. Stakes SYS from the balance of from for the benefit of receiver.

Parameter Name Description
from - the account to delegate bandwidth from, that is, the account holding tokens to be staked,
receiver - the account to delegate bandwith to, that is, the account to whose resources staked tokens are added
stake_net_quantity - tokens staked for NET bandwidth,
stake_cpu_quantity - tokens staked for CPU bandwidth,
transfer - if true, ownership of staked tokens is transfered to receiver.

setrex

Type: void

Setrex action, sets total_rent balance of REX pool to the passed value.

Parameter Name Description
balance - amount to set the REX pool balance.

deposit

Type: void

Deposit to REX fund action. Deposits core tokens to user REX fund. All proceeds and expenses related to REX are added to or taken out of this fund. An inline transfer from 'owner' liquid balance is executed. All REX-related costs and proceeds are deducted from and added to 'owner' REX fund, with one exception being buying REX using staked tokens. Storage change is billed to 'owner'.

Parameter Name Description
owner - REX fund owner account,
amount - amount of tokens to be deposited.

withdraw

Type: void

Withdraw from REX fund action, withdraws core tokens from user REX fund. An inline token transfer to user balance is executed.

Parameter Name Description
owner - REX fund owner account,
amount - amount of tokens to be withdrawn.

buyrex

Type: void

Buyrex action, buys REX in exchange for tokens taken out of user's REX fund by transfering core tokens from user REX fund and converts them to REX stake. By buying REX, user is lending tokens in order to be rented as CPU or NET resourses. Storage change is billed to 'from' account.

Parameter Name Description
from - owner account name,
amount - amount of tokens taken out of 'from' REX fund.

unstaketorex

Type: void

Unstaketorex action, uses staked core tokens to buy REX. Storage change is billed to 'owner' account.

Parameter Name Description
owner - owner of staked tokens,
receiver - account name that tokens have previously been staked to,
from_net - amount of tokens to be unstaked from NET bandwidth and used for REX purchase,
from_cpu - amount of tokens to be unstaked from CPU bandwidth and used for REX purchase.

sellrex

Type: void

Sellrex action, sells REX in exchange for core tokens by converting REX stake back into core tokens at current exchange rate. If order cannot be processed, it gets queued until there is enough in REX pool to fill order, and will be processed within 30 days at most. If successful, user votes are updated, that is, proceeds are deducted from user's voting power. In case sell order is queued, storage change is billed to 'from' account.

Parameter Name Description
from - owner account of REX,
rex - amount of REX to be sold.

cnclrexorder

Type: void

Cnclrexorder action, cancels unfilled REX sell order by owner if one exists.

Parameter Name Description
owner - owner account name.

rentcpu

Type: void

Rentcpu action, uses payment to rent as many SYS tokens as possible as determined by market price and stake them for CPU for the benefit of receiver, after 30 days the rented core delegation of CPU will expire. At expiration, if balance is greater than or equal to loan_payment, loan_payment is taken out of loan balance and used to renew the loan. Otherwise, the loan is closed and user is refunded any remaining balance. Owner can fund or refund a loan at any time before its expiration. All loan expenses and refunds come out of or are added to owner's REX fund.

Parameter Name Description
from - account creating and paying for CPU loan, 'from' account can add tokens to loan balance using action fundcpuloan and withdraw from loan balance using defcpuloan
receiver - account receiving rented CPU resources,
loan_payment - tokens paid for the loan, it has to be greater than zero, amount of rented resources is calculated from loan_payment,
loan_fund - additional tokens can be zero, and is added to loan balance. Loan balance represents a reserve that is used at expiration for automatic loan renewal.

rentnet

Type: void

Rentnet action, uses payment to rent as many SYS tokens as possible as determined by market price and stake them for NET for the benefit of receiver, after 30 days the rented core delegation of NET will expire. At expiration, if balance is greater than or equal to loan_payment, loan_payment is taken out of loan balance and used to renew the loan. Otherwise, the loan is closed and user is refunded any remaining balance. Owner can fund or refund a loan at any time before its expiration. All loan expenses and refunds come out of or are added to owner's REX fund.

Parameter Name Description
from - account creating and paying for NET loan, 'from' account can add tokens to loan balance using action fundnetloan and withdraw from loan balance using defnetloan,
receiver - account receiving rented NET resources,
loan_payment - tokens paid for the loan, it has to be greater than zero, amount of rented resources is calculated from loan_payment,
loan_fund - additional tokens can be zero, and is added to loan balance. Loan balance represents a reserve that is used at expiration for automatic loan renewal.

fundcpuloan

Type: void

Fundcpuloan action, transfers tokens from REX fund to the fund of a specific CPU loan in order to be used for loan renewal at expiry.

Parameter Name Description
from - loan creator account,
loan_num - loan id,
payment - tokens transfered from REX fund to loan fund.

fundnetloan

Type: void

Fundnetloan action, transfers tokens from REX fund to the fund of a specific NET loan in order to be used for loan renewal at expiry.

Parameter Name Description
from - loan creator account,
loan_num - loan id,
payment - tokens transfered from REX fund to loan fund.

defcpuloan

Type: void

Defcpuloan action, withdraws tokens from the fund of a specific CPU loan and adds them to REX fund.

Parameter Name Description
from - loan creator account,
loan_num - loan id,
amount - tokens transfered from CPU loan fund to REX fund.

defnetloan

Type: void

Defnetloan action, withdraws tokens from the fund of a specific NET loan and adds them to REX fund.

Parameter Name Description
from - loan creator account,
loan_num - loan id,
amount - tokens transfered from NET loan fund to REX fund.

updaterex

Type: void

Updaterex action, updates REX owner vote weight to current value of held REX tokens.

Parameter Name Description
owner - REX owner account.

rexexec

Type: void

Rexexec action, processes max CPU loans, max NET loans, and max queued sellrex orders. Action does not execute anything related to a specific user.

Parameter Name Description
user - any account can execute this action,
max - number of each of CPU loans, NET loans, and sell orders to be processed.

consolidate

Type: void

Consolidate action, consolidates REX maturity buckets into one bucket that can be sold after 4 days starting from the end of the day.

Parameter Name Description
owner - REX owner account name.

mvtosavings

Type: void

Mvtosavings action, moves a specified amount of REX into savings bucket. REX savings bucket never matures. In order for it to be sold, it has to be moved explicitly out of that bucket. Then the moved amount will have the regular maturity period of 4 days starting from the end of the day.

Parameter Name Description
owner - REX owner account name.
rex - amount of REX to be moved.

mvfrsavings

Type: void

Mvfrsavings action, moves a specified amount of REX out of savings bucket. The moved amount will have the regular REX maturity period of 4 days.

Parameter Name Description
owner - REX owner account name.
rex - amount of REX to be moved.

closerex

Type: void

Closerex action, deletes owner records from REX tables and frees used RAM. Owner must not have an outstanding REX balance.

owner REX balance entry is deleted. REX fund entry is deleted.

Parameter Name Description
owner - user account name.

undelegatebw

Type: void

Undelegate bandwitdh action, decreases the total tokens delegated by from to receiver and/or frees the memory associated with the delegation if there is nothing left to delegate. This will cause an immediate reduction in net/cpu bandwidth of the receiver. A transaction is scheduled to send the tokens back to from after the staking period has passed. If existing transaction is scheduled, it will be canceled and a new transaction issued that has the combined undelegated amount. The from account loses voting power as a result of this call and all producer tallies are updated.

deferred transaction with a delay of 3 days. action, pending action is canceled and timer is reset.

Parameter Name Description
from - the account to undelegate bandwidth from, that is, the account whose tokens will be unstaked,
receiver - the account to undelegate bandwith to, that is, the account to whose benefit tokens have been staked,
unstake_net_quantity - tokens to be unstaked from NET bandwidth,
unstake_cpu_quantity - tokens to be unstaked from CPU bandwidth,

buyram

Type: void

Buy ram action, increases receiver's ram quota based upon current price and quantity of tokens provided. An inline transfer from receiver to system contract of tokens will be executed.

Parameter Name Description
payer - the ram buyer,
receiver - the ram receiver,
quant - the quntity of tokens to buy ram with.

buyrambytes

Type: void

Buy a specific amount of ram bytes action. Increases receiver's ram in quantity of bytes provided. An inline transfer from receiver to system contract of tokens will be executed.

Parameter Name Description
payer - the ram buyer,
receiver - the ram receiver,
bytes - the quntity of ram to buy specified in bytes.

sellram

Type: void

Sell ram action, reduces quota by bytes and then performs an inline transfer of tokens to receiver based upon the average purchase price of the original quota.

Parameter Name Description
account - the ram seller account,
bytes - the amount of ram to sell in bytes.

refund

Type: void

Refund action, this action is called after the delegation-period to claim all pending unstaked tokens belonging to owner.

Parameter Name Description
owner - the owner of the tokens claimed.

regproducer

Type: void

Register producer action, indicates that a particular account wishes to become a producer, this action will create a producer_config and a producer_info object for producer scope in producers tables.

Parameter Name Description
producer - account registering to be a producer candidate,
producer_key - the public key of the block producer, this is the key used by block producer to sign blocks,
url - the url of the block producer, normally the url of the block producer presentation website,
location - is the country code as defined in the ISO 3166, https://en.wikipedia.org/wiki/List_of_ISO_3166_country_codes

regproducer2

Type: void

Register producer action, indicates that a particular account wishes to become a producer, this action will create a producer_config and a producer_info object for producer scope in producers tables.

Parameter Name Description
producer - account registering to be a producer candidate,
producer_authority - the weighted threshold multisig block signing authority of the block producer used to sign blocks,
url - the url of the block producer, normally the url of the block producer presentation website,
location - is the country code as defined in the ISO 3166, https://en.wikipedia.org/wiki/List_of_ISO_3166_country_codes

unregprod

Type: void

Unregister producer action, deactivates the block producer with account name producer.

Deactivate the block producer with account name producer.

Parameter Name Description
producer - the block producer account to unregister.

setram

Type: void

Set ram action sets the ram supply.

Parameter Name Description
max_ram_size - the amount of ram supply to set.

setramrate

Type: void

Set ram rate action, sets the rate of increase of RAM in bytes per block. It is capped by the uint16_t to a maximum rate of 3 TB per year. If update_ram_supply hasn't been called for the most recent block, then new ram will be allocated at the old rate up to the present block before switching the rate.

Parameter Name Description
bytes_per_block - the amount of bytes per block increase to set.

voteproducer

Type: void

Vote producer action, votes for a set of producers. This action updates the list of producers voted for, for voter account. If voting for a proxy, the producer votes will not change until the proxy updates their own vote. Voter can vote for a proxy or a list of at most 30 producers. Storage change is billed to voter.

Parameter Name Description
voter - the account to change the voted producers for,
proxy - the proxy to change the voted producers for,
producers - the list of producers to vote for, a maximum of 30 producers is allowed.

regproxy

Type: void

Register proxy action, sets proxy account as proxy. An account marked as a proxy can vote with the weight of other accounts which have selected it as a proxy. Other accounts must refresh their voteproducer to update the proxy's weight. Storage change is billed to proxy.

Parameter Name Description
rpoxy - the account registering as voter proxy (or unregistering),
isproxy - if true, proxy is registered; if false, proxy is unregistered.

setparams

Type: void

Set the blockchain parameters. By tunning these parameters a degree of customization can be achieved.

Parameter Name Description
params - New blockchain parameters to set.

claimrewards

Type: void

Claim rewards action, claims block producing and vote rewards.

Parameter Name Description
owner - producer account claiming per-block and per-vote rewards.

setpriv

Type: void

Set privilege status for an account. Allows to set privilege status for an account (turn it on/off).

Parameter Name Description
account - the account to set the privileged status for.
is_priv - 0 for false, > 0 for true.

rmvproducer

Type: void

Remove producer action, deactivates a producer by name, if not found asserts.

Parameter Name Description
producer - the producer account to deactivate.

updtrevision

Type: void

Update revision action, updates the current revision. than or equal 1 (“set upper bound to greatest revision supported in the code”).

Parameter Name Description
revision - it has to be incremented by 1 compared with current revision.

bidname

Type: void

Bid name action, allows an account bidder to place a bid for a name newname.

Parameter Name Description
bidder - the account placing the bid,
newname - the name the bid is placed for,
bid - the amount of system tokens payed for the bid.

bidrefund

Type: void

Bid refund action, allows the account bidder to get back the amount it bid so far on a newname name.

Parameter Name Description
bidder - the account that gets refunded,
newname - the name for which the bid was placed and now it gets refunded for.

setinflation

Type: void

Change the annual inflation rate of the core token supply and specify how the new issued tokens will be distributed based on the following structure.

Parameter Name Description
annual_rate - Annual inflation rate of the core token supply. (eg. For 5% Annual inflation => annual_rate=500 For 1.5% Annual inflation => annual_rate=150
inflation_pay_factor - Inverse of the fraction of the inflation used to reward block producers. The remaining inflation will be sent to the eosio.saving account. (eg. For 20% of inflation going to block producer rewards => inflation_pay_factor = 50000 For 100% of inflation going to block producer rewards => inflation_pay_factor = 10000).
votepay_factor - Inverse of the fraction of the block producer rewards to be distributed proportional to blocks produced. The remaining rewards will be distributed proportional to votes received. (eg. For 25% of block producer rewards going towards block pay => votepay_factor = 40000 For 75% of block producer rewards going towards block pay => votepay_factor = 13333).

cfgpowerup

Type: void

Configure the power market. The market becomes available the first time this action is invoked.

powerupexec

Type: void

Process power queue and update state. Action does not execute anything related to a specific user.

Parameter Name Description
user - any account can execute this action
max - number of queue items to process

powerup

Type: void

Powerup NET and CPU resources by percentage

Parameter Name Description
payer - the resource buyer
receiver - the resource receiver
days - number of days of resource availability. Must match market configuration.
net_frac - fraction of net (100% = 10^15) managed by this market
cpu_frac - fraction of cpu (100% = 10^15) managed by this market
max_payment - the maximum amount payer is willing to pay. Tokens are withdrawn from payer's token balance.