class DbchainClient::Transaction

Public Class Methods

new(base_url, chain_id, private_key_hex) click to toggle source
# File lib/dbchain_client/transaction.rb, line 8
def initialize(base_url, chain_id, private_key_hex)
  @rest_lib = DbchainClient::RestLib.new(base_url)
  @chain_id = chain_id
  @private_key = PrivateKey.new(private_key_hex)
  @from_address = @private_key.public_key.address
end

Public Instance Methods

sign_and_broadcast(messages, gas: '99999999', memo: '') click to toggle source
# File lib/dbchain_client/transaction.rb, line 15
def sign_and_broadcast(messages, gas: '99999999', memo: '')
  tx = {
    fee: {
      amount: [],
      gas:    gas
    },
    memo: memo,
    msg: messages
  }

  sign_message = make_sign_message(tx, messages)
  signature = @private_key.sign(sign_message)
  signed_tx = {
    signature: Base64.strict_encode64(signature.compact),
    pub_key:   {
        type:  'tendermint/PubKeySecp256k1',
        value: Base64.strict_encode64([@private_key.public_key.public_key_hex].pack("H*"))
    }
  }

  tx[:signatures] = [signed_tx]
  broadcastBody = {
    tx: tx,
    mode: 'async'
  }.to_json

  response = rest_post("/txs", broadcastBody)
  response#.data.txhash
end

Private Instance Methods

get_account() click to toggle source
# File lib/dbchain_client/transaction.rb, line 60
def get_account
  response = rest_get("/auth/accounts/#{@from_address}")
  account = JSON.parse(response.body)
  return account['result']['value']
end
make_sign_message(tx, messages) click to toggle source
# File lib/dbchain_client/transaction.rb, line 47
def make_sign_message(tx, messages)
  account = get_account
  sign_obj = {
    account_number: account["account_number"],
    chain_id:       @chain_id,
    fee:            tx[:fee],
    memo:           tx[:memo],
    msgs:           tx[:msg],
    sequence:       account["sequence"]
  }
  to_deep_sorted_json(sign_obj)
end
rest_get(url) click to toggle source
# File lib/dbchain_client/transaction.rb, line 66
def rest_get(url)
  @rest_lib.rest_get(url)
end
rest_post(url, data) click to toggle source
# File lib/dbchain_client/transaction.rb, line 70
def rest_post(url, data)
  @rest_lib.rest_post(url, data)
end
to_deep_sorted_json(obj) click to toggle source
# File lib/dbchain_client/transaction.rb, line 74
def to_deep_sorted_json(obj)
  if obj.instance_of?(Array)
    return '[' + obj.map{|o|to_deep_sorted_json(o)}.join(',') + ']'
  end

  if obj.instance_of?(Hash)
    keys = obj.keys.sort
    return '{' + keys.map{|k| JSON.generate(k) + ':' + to_deep_sorted_json(obj[k])}.join(',') + '}'
  end

  JSON.generate(obj)
end