All examples from this tutorial can be found as fully functional scripts on GitHub:
This tutorial shows how to interact with the Steem blockchain, Steem database and Steem Engine using Ruby. When accessing Steem Engine using Ruby their only one APIs available to chose: radiator.
In this particular chapter you learn how to access the current steem engine token balances of any account.
Basic knowledge of Ruby programming is needed. It is necessary to install at least Ruby 2.5 as well as the following ruby gems:
gem install bundler
gem install colorize
gem install contracts
gem install radiator
The tutorial build on top of the following previous chapters:
For reader with programming experience this tutorial is basic level.
Just like the last tutorial the majority of the work is done inside a newly written class. This class can read the ballances from the database and converts the JSON ovjects returned into propper ruby classes.
A simple standard constructor for the various properties a balance holds:
symbol | ID of token held |
account | ID of account holding |
balance | balance held |
stake | balance staked |
delegated_stake | stake delegated |
received_stake | stake stake |
pending_unstake | delegated stake to be returned to owner. |
loki | some internal informations |
module SCC
class Balance < SCC::Steem_Engine
include Contracts::Core
include Contracts::Builtin
attr_reader :key, :value,
:symbol,
:account,
:balance,
:stake,
:delegated_Stake,
:received_stake,
:pending_unstake,
:loki
public
Contract Any => nil
def initialize(balance)
super(:symbol, balance.symbol)
@symbol = balance.symbol
@account = balance.account
@balance = balance.balance.to_f
@stake = balance.stake.to_f
@delegated_stake = balance.delegatedStake.to_f
@received_stake = balance.receivedStake.to_f
@pending_unstake = balance.pendingUnstake.to_f
@loki = balance["$loki"]
return
end
Convert the current balance into steem using the metric class from the last tutorial.
Contract None => Radiator::Type::Amount
def to_steem
_steem = if @symbol == "STEEMP" then
@balance
else
@balance * metric.last_price
end
return Radiator::Type::Amount.to_amount(
_steem,
Radiator::Type::Amount::STEEM)
end
Convert the current balance into SBD using the amount class from the print balances tutorial.
Contract None => Radiator::Type::Amount
def to_sbd
return to_steem.to_sbd
end
The metrics of the balance as lazy initialized property. The metric is used to convert the balance into Steem.
Contract None => SCC::Metric
def metric
if @metric == nil then
@metric = SCC::Metric.symbol @symbol
end
return @metric
end
The token information of the balance also as lazy initialized property. The token informations contain, among other, the display name of the token which we will later use.
Contract None => SCC::Token
def token
if @token == nil then
@token = SCC::Token.symbol @symbol
end
return @token
end
Create a colourised string showing the amount in SDB, STEEM and the steem engine token. The actual value is colourised in blue while the converted values are colourised in grey (aka dark white).
A try catch is used for token which have no metics and therefore no steem value.
Contract None => String
def to_ansi_s
begin
_steem = self.to_steem
_sbd = self.to_sbd
_retval = (
"%1$15.3f %2$s".white +
" " +
"%3$15.3f %4$s".white +
" " +
"%5$18.6f %6$s".blue) % [
_sbd.to_f,
_sbd.asset,
_steem.to_f,
_steem.asset,
@balance,
@symbol]
rescue KeyError
_na = "N/A"
_retval = (
"%1$15s %2$s".white +
" " +
"%3$15s %4$5s".white +
" " +
"%5$18.6f %6$s".blue) % [
_na,
_na,
_na,
_na,
@balance,
@symbol]
end
return _retval
end
Get the list of balances for a gives account using the find function from contracs API. The find function has been explained in the previous chapter.
class << self
Contract String => ArrayOf[SCC::Balance]
def account (name)
_retval = []
_current = 0
_query = {
"account": name
}
loop do
# Read the next batch of balances using
# the find function.
#
_balances = Steem_Engine.contracts_api.find(
contract: "tokens",
table: "balances",
query: _query,
limit: SCC::Steem_Engine::QUERY_LIMIT,
offset: _current,
descending: false)
# Exit loop when no result set is
# returned.
#
break if (not _balances) || (_balances.length == 0)
# convert each returned JSON object into
# a class instacnce.
#
_retval += _balances.map do |_balance|
SCC::Balance.new _balance
end
# Move current by the actual amount of
# rows returned
#
_current = _current + _balances.length
end
return _retval
end
end # self
end # Balance
end # SCC
In addition to this method the balance class committed to git has examples for retriving the balances for a given token and all balances in the database. All three methods are very similar. For this only one method has been described.
Hint: Follow this link to Github for the complete script with comments and syntax highlighting : Balance.rb.
Most of the Steem-Print-Balances.rb script has already been described in Print Account Balances improved and there are only few changes needed to print the steem engine balances as well:
Most of the functionality is not encapsulated in classes which have been explained previously. All that is needed is to require
those classes.
require_relative 'Radiator/Amount'
require_relative 'Radiator/Price'
require_relative 'SCC/Balance'
require_relative 'SCC/Token'
Frist print the account value without the steem engine token added.
puts((" Account Value (steem)= " + "%1$15.3f %2$s".green) % [
_account_value.to_f,
_account_value.asset])
Then retrieve all balances for the currently account from the steem engine database
_scc_balances = SCC::Balance.account account.name
Loop over all balances printing the balance and adding the value (in SBD) to the account value. For the latter a try catch is used for token which don't have a Steem value.
_scc_balances.each do |_scc_balance|
token = _scc_balance.token
puts(" %1$-20.20s = %2$s" % [token.name, _scc_balance.to_ansi_s])
begin
_sbd = _scc_balance.to_sbd
_account_value = _account_value + _sbd
rescue KeyError
# do nothing.
end
end
Lastly print the account value with the value of the steem engine token added.
puts((" Account Value (total)= " + "%1$15.3f %2$s".green) % [
_account_value.to_f,
_account_value.asset])
Hint: Follow this link to Github for the complete script with comments and syntax highlighting : Steem-Print-Balances.rb.
The output of the command changes from previous only printing the steem token:
to now printing the values of the Steem Engine Token as well: