class Keoken::Backend::Trezor::Transaction

Attributes

to_json[RW]

Public Instance Methods

build_for_creation(address, path, script, xpubs = []) click to toggle source

Create the transaction to broadcast in order to create tokens.

@param address [String] Address that will contain the token. @param path [Array] Address derivation path. @param script [String] The token script. @param xpubs [Array] The xpubs corresponding to the multisig address.

@return [Keoken::Backend::Trezor::Transaction] A serialized object ready for Trezor signing.

# File lib/keoken/backend/trezor/transaction.rb, line 18
def build_for_creation(address, path, script, xpubs = [])
  build_inputs([address])
  total, fee = build_fee(:create)
  output_amount = total - fee.to_i
  create(inputs: @inputs,
         path: path,
         address: address,
         output_amount: output_amount,
         script: script,
         xpubs: xpubs)
end
build_for_empty_wallet(addresses, address_dest, path, xpubs = []) click to toggle source

Create the transaction to broadcast in order to empty the wallet.

@param addresses [Array] Addresses that will contain the token and will be emptied. @param address_dest [String] Address to receive the tokens. @param path [Array] Address derivation path. @param xpubs [Array] The xpubs corresponding to the multisig address.

@return [Keoken::Backend::Trezor::Transaction] A serialized object ready for Trezor signing.

# File lib/keoken/backend/trezor/transaction.rb, line 64
def build_for_empty_wallet(addresses, address_dest, path, xpubs = [])
  build_inputs(addresses)
  total, fee = build_fee(:send)
  raise Keoken::Error::NoToken if @tokens.empty?

  send(inputs: @inputs,
       path: path,
       output_amount: total - (fee.to_i * 2),
       address: nil,
       output_amount_to_addr2: fee.to_i,
       addr2: address_dest,
       script: token_script_for_inputs,
       xpubs: xpubs)
end
build_for_send_amount(address, address_dest, path, script, xpubs = []) click to toggle source

Create the transaction to broadcast in order to send amount between tokens.

@param address [String] Address that will contain the token. @param address_dest [String] Address to receive the tokens. @param path [Array] Address derivation path. @param script [String] The token script. @param xpubs [Array] The xpubs corresponding to the multisig address.

@return [Keoken::Backend::Trezor::Transaction] A serialized object ready for Trezor signing.

# File lib/keoken/backend/trezor/transaction.rb, line 40
def build_for_send_amount(address, address_dest, path, script, xpubs = [])
  build_inputs([address])
  total, fee = build_fee(:send)
  output_amount = total - (fee.to_i * 2)
  output_amount_to_addr2 = fee.to_i
  send(inputs: @inputs,
       path: path,
       output_amount: output_amount,
       address: address,
       output_amount_to_addr2: output_amount_to_addr2,
       addr2: address_dest,
       script: script,
       xpubs: xpubs)
end

Private Instance Methods

build_multisig(address, path, xpubs) click to toggle source
# File lib/keoken/backend/trezor/transaction.rb, line 143
def build_multisig(address, path, xpubs)
  if xpubs.empty?
    {}
  else
    {
      script_type: 'SPENDMULTISIG',
      multisig:
        {
          signatures: ['', '', ''],
          m: 2,
          pubkeys: xpubs.map do |xpub|
            node = MoneyTree::Node.from_bip32(xpub)
            {
              address_n: path,
              node:
                {
                  chain_code: node.chain_code.to_s(16),
                  depth: 0,
                  child_num: 0,
                  fingerprint: 0,
                  public_key: node.public_key.key
                }
            }
          end
        }
    }
  end
end
build_trezor_inputs(inputs, path, address, xpubs) click to toggle source
# File lib/keoken/backend/trezor/transaction.rb, line 130
def build_trezor_inputs(inputs, path, address, xpubs)
  inputs.map do |input|
    hash =
      {
        address_n: path,
        prev_index: input[:position],
        prev_hash: input[:tx_id],
        amount: input[:input_amount].to_s
      }
    hash.merge(build_multisig(address, path, xpubs))
  end
end
create(options = {}) click to toggle source
# File lib/keoken/backend/trezor/transaction.rb, line 81
def create(options = {})
  {
    inputs: build_trezor_inputs(options[:inputs], options[:path], options[:address], options[:xpubs]),
    outputs: [
      {
        address: Cashaddress.from_legacy(options[:address]),
        amount: options[:output_amount].to_s,
        script_type: 'PAYTOADDRESS'
      },
      {
        op_return_data: options[:script],
        amount: '0',
        script_type: 'PAYTOOPRETURN'
      }
    ]
  }
end
send(options = {}) click to toggle source
# File lib/keoken/backend/trezor/transaction.rb, line 99
def send(options = {})
  first_output = if options[:address]
                   [
                     {
                       address: Cashaddress.from_legacy(options[:address]),
                       amount: options[:output_amount].to_s,
                       script_type: 'PAYTOADDRESS'
                     }
                   ]
                 else
                   []
                 end
  {
    inputs: build_trezor_inputs(options[:inputs], options[:path], options[:address], options[:xpubs]),
    outputs: first_output.concat(
      [
        {
          address: Cashaddress.from_legacy(options[:addr2]),
          amount: options[:output_amount_to_addr2].to_s,
          script_type: 'PAYTOADDRESS'
        },
        {
          op_return_data: options[:script],
          amount: '0',
          script_type: 'PAYTOOPRETURN'
        }
      ]
    )
  }
end
token_script_for_inputs() click to toggle source
# File lib/keoken/backend/trezor/transaction.rb, line 172
def token_script_for_inputs
  token = Token.new(id: @tokens.first.id)
  token.send_amount(@tokens.map(&:amount).inject(:+))
  token.hex
end