Table of Contents
Overview
FIO Relic is a fork of Antelope Memento and is intended to receive FIO Chain data stream from the FIO Chain Node via EOS Chronicle. FIO specific data is extracted from the stream and stored in a Relational Database (RDB) for future query via API. The following document is intended to be functional specification for the FIO Relic System.
Components
Data Transformation
This component is responsible for reading the data in the data stream and looking for FIO-specific data, parsing it, and inserting into RDB.
Example:
When an action registering FIO Domain is observed, insert it into domains table.
Query API
This component is responsible for receiving an API request, fetching relevant data from the RDB and returning to the API user.
Example:
Fetch all FIO Domains registered in specific time-frame.
Push Notification System
This component will be developed in Phase 2.
This component allows an API user to subscribe to specific events and then receive notification if such event has occurred during data transformation.
Examples
“Notify supplied webhook on every new FIO Domain registration”
“Notify when a FIO Request for specific FIO Handle is observed”
Specification
Data Model
blocks
Add only. Every block is a new entry.
Field | Description | Relationship |
---|---|---|
number | Block number as generated by FIO Node | transactions → block_num |
id | Block ID as generated by FIO Node | |
timestamp | Timestamp as generated by FIO Node | |
producer | Account name of producer which produced the block | |
schedule_version | Version of BP schedule |
transactions
Add only. Every transaction is a new entry.
Field | Description | Relationship |
---|---|---|
block_number | Block which contained this transaction | blocks → number |
id | Transaction id | traces → transaction_id |
action_account | Account name for action | |
action_name | Action name | |
account | Account which executed the transaction | |
tpid | TPID which was recorded in tranaction | |
fee | FIO Chain fee paid for this transaction | |
request_data | Raw request data for primary trace | |
response_data | Raw response data for primary trace | |
status | Transaction status |
traces
Add only. Every trace is a new entry.
Field | Description | Relationship |
---|---|---|
id | Trace ID - generated. | |
transaction_id | Transaction ID | transactions → id |
action_ordinal | Sequential order of trace in transaction | |
action_account | Account name for trace | |
action_name | Action name fro trace | |
request_data | Raw request data for trace |
accounts
Add only. Every account created is a new entry.
Field | Description | Relationship |
---|---|---|
account | Account name | account_activity → account domains → account handles → account token_transfers → payer_account token_transfers → payee_account token_staking → staker_account fio_requests → payee_account fio_requests → payer_account fio_data → payee_account fio_data → payer_account |
public_key | Primary public key |
account_activity
Add only. Every activity is a new entry.
Field | Description | Relationship |
---|---|---|
account | Account name | accounts → account |
transaction_id | Transaction ID | transactions → id |
type | Type of activity |
domains
Add and update. Represents current state of domains. Will be updated every time domain info changes. Records will not be removed, just marked burned.
Field | Description | Relationship |
---|---|---|
domain | Domain name | domain_activity → domain |
account | Account name of current owner | accounts → account |
is_public | Is domain public | |
expiration | Timestamp of domain expiration | |
status | Current status of domain |
domain_activity
Add only. Every activity is a new entry
Field | Description | Relationship |
---|---|---|
domain | Domain name | domains → domain |
transaction_id | Transaction ID | transactions → id |
type | Type of activity |
handles
Add and update. Represents current state of handles. Will be updated every time handle info changes. Records will not be removed, just marked burned.
Field | Description | Relationship |
---|---|---|
handle | Handle name | handle_activity → handle pub_addresses → handle nft_signatures → handle fio_requests → payer_handle fio_requests → payee_handle fio_data → payer_handle fio_data → payee_handle |
account | Account name of current owner | accounts → account |
encryption_key | Encryption public key | |
encryption_key_set | Defines if encryption key was specifically set | |
bundled_tx | Bundled tx count | |
expiration | Timestamp of handle expiration | |
status | Current status of handle |
handle_activity
Add only. Every activity is a new entry
Field | Description | Relationship |
---|---|---|
handle | Handle name | handles → handle |
transaction_id | Transaction ID | transactions → id |
type | Type of activity |
pub_addresses
Add, update, delete. Represents current state of mapped public addresses. Will be updated every time mapping changes. Records will be removed if needed.
Field | Description | Relationship |
---|---|---|
handle | Handle name | handles → handle |
chain_code | Chain code | |
token_code | Token code | |
public_address | Public Address |
nft_signatures
Add, update, delete. Represents current state of NFT signatures. Will be updated every time signatures are changed. Records will be removed if needed.
Field | Description | Relationship |
---|---|---|
handle | Handle name | handles → handle |
chain_code | Chain code | |
contract_address | Contract address | |
token_id | Token ID | |
url | url | |
hash | hash | |
metadata | metadata |
token_transfers
Add only. Every transfer is a new entry. Includes internal transfers.
Field | Description | Relationship |
---|---|---|
payer_account | Account of payer (sender) | accounts → account |
payee_account | Account of payee (receiver) | accounts → account |
transaction_id | Transaction ID | transactions → id |
amount | Token amount in FIO | |
type | Type of transfer | |
memo | Memo in transfer |
token_staking
Add only. Every stake or unstake is a new entry. Includes internal transfers.
Field | Description | Relationship |
---|---|---|
staker_account | Account of staker | accounts → account |
transaction_id | Transaction ID | transactions → id |
amount | Token amount in FIO, unstake will be negative |
fio_requests
Add and update. Represents current state of requests. Will be updated every time request status changes. Records will not be removed.
Field | Description | Relationship |
---|---|---|
id | FIO Request ID | fio_data → request_id |
payee_handle | Handle of payer | handles → handle |
payer_handle | Handle of payee | handles → handle |
content | Encrypted blob | |
payee_pub_key | Public Key of payee | |
payer_pub_key | Public Key of payer | |
status | Status of request | |
transaction_id | Transaction ID | transactions → id |
fio_data
Add and update. Represents current state of FIO Data. Will be updated every time request status changes. Records will not be removed.
Field | Description | Relationship |
---|---|---|
request_id | FIO Request ID (optional) | fio_requests → id |
payee_handle | Handle of payer | handles → handle |
payer_handle | Handle of payee | handles → handle |
content | Encrypted blob | |
payee_pub_key | Public Key of payee | |
payer_pub_key | Public Key of payer | |
status | Status of data | |
transaction_id | Transaction ID | transactions → id |
Parsing Rules
The parsing rules below are triggered by any of the following:
block
transaction
trace
specific
account
andname
insidetrace
→action_traces
→act
. It will be presented as Trigger: action_account:action:name, e.g. Trigger: eosio:newaccount
and are organized by defining the table where record needs to be added as well as data source, typically from the trace.
Please pay attention to sequence of traces to accommodate relationships, e.g. when transferring tokens to a new account, the account has to be inserted into accounts table, before transfer is recorded.
Trigger: every block
Table: blocks NEW RECORD
Field | Source Data |
---|---|
number |
|
id |
|
timestamp |
|
producer |
|
schedule_version |
|
Trigger: every trace where action_ordinal = 1
Table: transactions NEW RECORD
Field | Source Data |
---|---|
block_number |
|
id |
|
action_account |
|
action_name |
|
account |
|
tpid |
|
fee |
|
request_data |
|
response_data |
|
status |
|
Table: account_activity NEW RECORD
Field | Source Data |
---|---|
account |
|
transaction_id | Transaction ID |
type | “sender” |
Trigger: every trace where action_ordinal > 1
Table: traces NEW RECORD
Field | Source Data |
---|---|
id | Trace id. Auto-generated ID or transaction_id + action_ordinal, e.g. 770989df18fac96e48ca03d6702991d4462bebacceab8cf6b389507e998ca7fe-2 |
transaction_id |
|
action_ordinal |
|
action_account |
|
action_name |
|
request_data |
|
Trigger: fio.address:bind2eosio
Table: accounts NEW RECORD
Field | Source Data |
---|---|
account |
|
public_key |
|
Table: account_activity NEW RECORD
Field | Source Data |
---|---|
account |
|
transaction_id |
|
type | “account_created” |
Trigger: fio.token:trnsfiopubky and action_ordinal = 1
Table: token_transfers NEW RECORD
Field | Source Data |
---|---|
payer_account |
|
payee_account |
|
transaction_id |
|
amount |
|
type | “transfer” |
memo |
Trigger: fio.token:trnsloctoks and action_ordinal = 1
Table: token_transfers NEW RECORD
Field | Source Data |
---|---|
payer_account |
|
payee_account |
|
transaction_id |
|
amount |
|
type | “transfer_locked” |
memo |
Trigger: fio.token:transfer and receiver = fio.token
Table: token_transfers NEW RECORD
Field | Source Data |
---|---|
payer_account |
|
payee_account |
|
transaction_id |
|
amount |
|
type | If If If If If If If |
memo |
|
Trigger: fio.token:issue and receiver = fio.token
Table: token_transfers NEW RECORD
Field | Source Data |
---|---|
payer_account | “eosio” |
payee_account |
|
transaction_id |
|
amount |
|
type | “token_mint” |
memo |
|
Trigger: fio.token:wraptokens and action_ordinal = 1
Table: token_transfers NEW RECORD
Field | Source Data |
---|---|
payer_account |
|
payee_account | “fio.oracle" |
transaction_id |
|
amount |
|
type | “wrap” |
memo |
Trigger: fio.token:stakefio and action_ordinal = 1
Table: token_staking NEW RECORD
Field | Source Data |
---|---|
staker_account |
|
transaction_id |
|
amount |
|
Trigger: fio.token:retire and action_ordinal = 1
Table: token_transfers NEW RECORD
Field | Source Data |
---|---|
payer_account |
|
payee_account | |
transaction_id |
|
amount |
|
type | “retire” |
memo |
|
Trigger: fio.token:unstakefio and action_ordinal = 1
Table: token_staking NEW RECORD
Field | Source Data |
---|---|
staker_account |
|
transaction_id |
|
amount | Negative of ( |
Trigger: fio.address:regdomain and action_ordinal = 1
Table: domains NEW RECORD or UPDATE (if exists based on domain
)
Field | Source Data |
---|---|
domain |
|
account |
|
is_public | “false” |
expiration |
|
status | “active" |
Table: domain_activity NEW RECORD
Field | Source Data |
---|---|
domain |
|
transaction_id |
|
type | “register” |
Trigger: fio.address:renewdomain and action_ordinal = 1
Table: domains UPDATE
Field | Source Data |
---|---|
domain |
|
expiration |
|
Table: domain_activity NEW RECORD
Field | Source Data |
---|---|
domain |
|
transaction_id |
|
type | “renew” |
Trigger: fio.address:xferdomain and action_ordinal = 1
Table: domains UPDATE
Field | Source Data |
---|---|
domain |
|
account |
|
Table: domain_activity NEW RECORD
Field | Source Data |
---|---|
domain |
|
transaction_id |
|
type | “transfer” |
Trigger: fio.address:setdomainpub and action_ordinal = 1
Table: domains UPDATE
Field | Source Data |
---|---|
domain |
|
is_public |
|
Table: domain_activity NEW RECORD
Field | Source Data |
---|---|
domain |
|
transaction_id |
|
type | is_public: 1 type is “public” is_public: 0 type is “non-public” |
Trigger: fio.address:wrapdomain and action_ordinal = 1
Table: domains UPDATE
Field | Source Data |
---|---|
domain |
|
account | “fio.oracle” |
Table: domain_activity NEW RECORD
Field | Source Data |
---|---|
domain |
|
transaction_id |
|
type | “wrap” |
Trigger: fio.address:xferescrow
Table: domains UPDATE
Field | Source Data |
---|---|
domain |
|
account |
|
Table: domain_activity NEW RECORD
Field | Source Data |
---|---|
domain |
|
transaction_id |
|
type | “unwrap” |
Trigger: fio.address:regaddress and action_ordinal = 1
Table: handles NEW RECORD or UPDATE (if exists based on handle
)
Field | Source Data |
---|---|
handle |
|
account |
|
encryption_key |
|
encryption_key_set | “false” |
bundled_tx | “100” |
expiration |
|
status | “active" |
Table: handle_activity NEW RECORD
Field | Source Data |
---|---|
handle |
|
transaction_id |
|
type | “register” |
Table: pub_addresses NEW RECORD
Field | Source Data |
---|---|
handle |
|
chain_code | “FIO” |
token_code | “FIO” |
public_address |
|
Trigger: fio.address:renewaddress and action_ordinal = 1
Table: handles UPDATE
Field | Source Data |
---|---|
handle |
|
bundled_tx | Increment current value by “100” |
expiration |
|
Table: handle_activity NEW RECORD
Field | Source Data |
---|---|
handle |
|
transaction_id |
|
type | “renew” |
Trigger: fio.address:xferaddress and action_ordinal = 1
Table: handles UPDATE
Field | Source Data |
---|---|
handle |
|
account |
|
encryption_key |
|
encryption_key_set | “false” |
Table: handle_activity NEW RECORD
Field | Source Data |
---|---|
handle |
|
transaction_id |
|
type | “transfer” |
Table: pub_addresses DELETE and NEW RECORD
Remove all objects matching in trace
→ action_traces
→ act
→ data
→ fio_address
and add:
Field | Source Data |
---|---|
handle |
|
chain_code | “FIO” |
token_code | “FIO” |
public_address |
|
Table: nft_signatures DELETE
Remove all objects matching in trace
→ action_traces
→ act
→ data
→ fio_address
Trigger: fio.address:addbundles and action_ordinal = 1
Table: handles UPDATE
Field | Source Data |
---|---|
handle |
|
bundled_tx | Increment current value by |
Table: handle_activity NEW RECORD
Field | Source Data |
---|---|
handle |
|
transaction_id |
|
type | “add_bundles” |
Trigger: fio.address:addaddress and action_ordinal = 1
Table: handle_activity NEW RECORD
Field | Source Data |
---|---|
handle |
|
transaction_id |
|
type | “add_pubbadd” |
Table: pub_addresses NEW RECORD or UPDATE (if exists)
For each object in trace
→ action_traces
→ act
→ data
→ public_addresses
update or insert new record
Field | Source Data |
---|---|
handle |
|
chain_code |
|
token_code |
|
public_address |
|
Table: handles UPDATE
Update only if encryption_key_set = false and chain_code = “FIO” and (token_code = “FIO” or token_code = “*”)
Field | Source Data |
---|---|
handle |
|
encryption_key |
|
Trigger: fio.address:remaddress and action_ordinal = 1
Table: handle_activity NEW RECORD
Field | Source Data |
---|---|
handle |
|
transaction_id |
|
type | “rem_pubbadd” |
Table: pub_addresses DELETE
Remove each object in trace
→ action_traces
→ act
→ data
→ public_addresses
which matches
Field | Source Data |
---|---|
handle |
|
chain_code |
|
token_code |
|
public_address |
|
Trigger: fio.address:remalladdr and action_ordinal = 1
Table: handle_activity NEW RECORD
Field | Source Data |
---|---|
handle |
|
transaction_id |
|
type | “rem_all_pubbadd” |
Table: pub_addresses DELETE
Remove all objects matching in trace
→ action_traces
→ act
→ data
→ fio_address
Trigger: fio.address:addnft and action_ordinal = 1
Table: handle_activity NEW RECORD
Field | Source Data |
---|---|
handle |
|
transaction_id |
|
type | “add_nft” |
Table: nft_signatures NEW RECORD or UPDATE (if exists)
For each object in trace
→ action_traces
→ act
→ data
→ nfts
update or insert new record
Field | Source Data |
---|---|
handle |
|
chain_code |
|
contract_address |
|
token_id |
|
url |
|
hash |
|
metadata |
|
Trigger: fio.address:remnft and action_ordinal = 1
Table: handle_activity NEW RECORD
Field | Source Data |
---|---|
handle |
|
transaction_id |
|
type | “rem_nft” |
Table: nft_signatures DELETE
Remove each object in trace
→ action_traces
→ act
→ data
→ nfts
which matches
Field | Source Data |
---|---|
handle |
|
chain_code |
|
contract_address |
|
token_id |
|
url |
|
hash |
|
metadata |
|
Trigger: fio.address:remallnfts and action_ordinal = 1
Table: handle_activity NEW RECORD
Field | Source Data |
---|---|
handle |
|
transaction_id |
|
type | “rem_all_nft” |
Table: nft_signatures DELETE
Remove all objects matching in trace
→ action_traces
→ act
→ data
→ fio_address
Trigger: fio.address:updcryptkey and action_ordinal = 1
Table: handles UPDATE
Field | Source Data |
---|---|
handle |
|
encryption_key |
|
encryption_key_set | “true” |
Table: handle_activity NEW RECORD
Field | Source Data |
---|---|
handle |
|
transaction_id |
|
type | “upd_encryptkey” |
Trigger: fio.address:regdomadd and action_ordinal = 1
Execute same as for trigger fio.address:regdomain and fio.address:regaddress
Trigger: fio.address:burnaddress and action_ordinal = 1
Table: handles UPDATE
Field | Source Data |
---|---|
handle |
|
status | “burnt” |
Table: handle_activity NEW RECORD
Field | Source Data |
---|---|
handle |
|
transaction_id |
|
type | “self_burn” |
Table: pub_addresses DELETE
Remove all objects matching in trace
→ action_traces
→ act
→ data
→ fio_address
Table: nft_signatures DELETE
Remove all objects matching in trace
→ action_traces
→ act
→ data
→ fio_address
Trigger: fio.address:newfundsreq and action_ordinal = 1
Table: handle_activity NEW RECORD
Field | Source Data |
---|---|
handle |
|
transaction_id |
|
type | “new_request” |
Table: fio_requests NEW RECORD
Field | Source Data |
---|---|
id |
|
payee_handle |
|
payer_handle |
|
content |
|
payee_pub_key | Look-up |
payer_pub_key | Look-up |
status | “pending” |
transaction_id |
|
Trigger: fio.address:cancelfndreq and action_ordinal = 1
Table: handle_activity NEW RECORD
Field | Source Data |
---|---|
handle |
|
transaction_id |
|
type | “cancel_request” |
Table: fio_requests UPDATE
Field | Source Data |
---|---|
id |
|
status | “cancelled” |
Trigger: fio.address:recordobt and action_ordinal = 1
Table: handle_activity NEW RECORD
Field | Source Data |
---|---|
handle |
|
transaction_id |
|
type | “record_obt” |
Table: fio_data NEW RECORD
Field | Source Data |
---|---|
request_id |
|
payee_handle |
|
payer_handle |
|
content |
|
payee_pub_key | Look-up |
payer_pub_key | Look-up |
status | “sent_to_blockchain” |
transaction_id |
|
Table: fio_requests UPDATE
Update only if trace
→ action_traces
→ act
→ data
→ fio_request_id
is present
Field | Source Data |
---|---|
id |
|
status | “sent_to_blockchain” |
Trigger: fio.address:burndomain
Table: domains UPDATE
Field | Source Data |
---|---|
domain |
|
status | “burnt” |
Table: domain_activity NEW RECORD
Field | Source Data |
---|---|
domain |
|
transaction_id |
|
type | “auto_burn” |
API
/get_blocks
Returns block information from blocks table.
Request
Parameter | Description |
---|---|
time_start | OPTIONAL Filters block by |
time_end | OPTIONAL Filters block by |
producer | OPTIONAL Filters block by |
sort | OPTIONAL Sorting: timestamp_asc timestamp_desc |
Response
Field | Source Data |
---|---|
number |
|
id |
|
timestamp |
|
producer |
|
schedule_version |
|
Example
[ { "number": "2", "id": "00000002953a8ab87a1855c0c40786e6a910a86cb2dd160f181418d05d233ea7", "timestamp": "2020-03-25T00:05:21.000", "producer": "eosio", "schedule_version": "1" } ]
/get_transactions
Returns transaction information from transactions table.
Request
Parameter | Description |
---|---|
time_start | OPTIONAL Filters block by |
time_end | OPTIONAL Filters block by |
block_number | OPTIONAL Filters block by |
action_account | OPTIONAL Filters block by |
action_name | OPTIONAL Filters block by |
sort | OPTIONAL Sorting: timestamp_asc timestamp_desc |
Response
Field | Source Data |
---|---|
id |
|
block_number |
|
action_account |
|
action_name |
|
account |
|
tpid |
|
fee |
|
request_data |
|
request_data |
|
status |
|
type_specific_data |
Example
[ { } ]
TODO
burned addresses and domains pre JAN-2024 - maybe table deltas?
Add Comment