arkecosystem-crypto 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
 - data/lib/arkecosystem/crypto.rb +49 -0
 - data/lib/arkecosystem/crypto/builder/delegate_registration.rb +33 -0
 - data/lib/arkecosystem/crypto/builder/multi_signature_registration.rb +45 -0
 - data/lib/arkecosystem/crypto/builder/second_signature_registration.rb +27 -0
 - data/lib/arkecosystem/crypto/builder/transaction.rb +109 -0
 - data/lib/arkecosystem/crypto/builder/transfer.rb +32 -0
 - data/lib/arkecosystem/crypto/builder/vote.rb +28 -0
 - data/lib/arkecosystem/crypto/configuration/fee.rb +30 -0
 - data/lib/arkecosystem/crypto/configuration/network.rb +18 -0
 - data/lib/arkecosystem/crypto/crypto.rb +144 -0
 - data/lib/arkecosystem/crypto/deserialiser.rb +94 -0
 - data/lib/arkecosystem/crypto/deserialisers/base.rb +15 -0
 - data/lib/arkecosystem/crypto/deserialisers/delegate_registration.rb +22 -0
 - data/lib/arkecosystem/crypto/deserialisers/delegate_resignation.rb +12 -0
 - data/lib/arkecosystem/crypto/deserialisers/ipfs.rb +18 -0
 - data/lib/arkecosystem/crypto/deserialisers/multi_payment.rb +38 -0
 - data/lib/arkecosystem/crypto/deserialisers/multi_signature_registration.rb +32 -0
 - data/lib/arkecosystem/crypto/deserialisers/second_signature_registration.rb +18 -0
 - data/lib/arkecosystem/crypto/deserialisers/timelock_transfer.rb +19 -0
 - data/lib/arkecosystem/crypto/deserialisers/transfer.rb +18 -0
 - data/lib/arkecosystem/crypto/deserialisers/vote.rb +31 -0
 - data/lib/arkecosystem/crypto/enums/fees.rb +18 -0
 - data/lib/arkecosystem/crypto/enums/types.rb +18 -0
 - data/lib/arkecosystem/crypto/identity/address.rb +35 -0
 - data/lib/arkecosystem/crypto/identity/private_key.rb +14 -0
 - data/lib/arkecosystem/crypto/identity/public_key.rb +18 -0
 - data/lib/arkecosystem/crypto/identity/wif.rb +22 -0
 - data/lib/arkecosystem/crypto/message.rb +42 -0
 - data/lib/arkecosystem/crypto/models/transaction.rb +16 -0
 - data/lib/arkecosystem/crypto/networks/devnet.rb +24 -0
 - data/lib/arkecosystem/crypto/networks/mainnet.rb +24 -0
 - data/lib/arkecosystem/crypto/networks/testnet.rb +24 -0
 - data/lib/arkecosystem/crypto/serialiser.rb +84 -0
 - data/lib/arkecosystem/crypto/serialisers/base.rb +13 -0
 - data/lib/arkecosystem/crypto/serialisers/delegate_registration.rb +17 -0
 - data/lib/arkecosystem/crypto/serialisers/delegate_resignation.rb +12 -0
 - data/lib/arkecosystem/crypto/serialisers/ipfs.rb +17 -0
 - data/lib/arkecosystem/crypto/serialisers/multi_payment.rb +23 -0
 - data/lib/arkecosystem/crypto/serialisers/multi_signature_registration.rb +31 -0
 - data/lib/arkecosystem/crypto/serialisers/second_signature_registration.rb +14 -0
 - data/lib/arkecosystem/crypto/serialisers/timelock_transfer.rb +21 -0
 - data/lib/arkecosystem/crypto/serialisers/transfer.rb +20 -0
 - data/lib/arkecosystem/crypto/serialisers/vote.rb +23 -0
 - data/lib/arkecosystem/crypto/version.rb +15 -0
 - metadata +159 -0
 
| 
         @@ -0,0 +1,94 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require 'arkecosystem/crypto/identity/address'
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            module ArkEcosystem
         
     | 
| 
      
 4 
     | 
    
         
            +
              module Crypto
         
     | 
| 
      
 5 
     | 
    
         
            +
                # The base deserialiser for transactions.
         
     | 
| 
      
 6 
     | 
    
         
            +
                class Deserialiser
         
     | 
| 
      
 7 
     | 
    
         
            +
                  def initialize(serialised)
         
     | 
| 
      
 8 
     | 
    
         
            +
                    @serialised = serialised
         
     | 
| 
      
 9 
     | 
    
         
            +
                    @binary = BTC::Data.data_from_hex(@serialised)
         
     | 
| 
      
 10 
     | 
    
         
            +
             
     | 
| 
      
 11 
     | 
    
         
            +
                    @handlers = %w[
         
     | 
| 
      
 12 
     | 
    
         
            +
                      Transfer
         
     | 
| 
      
 13 
     | 
    
         
            +
                      SecondSignatureRegistration
         
     | 
| 
      
 14 
     | 
    
         
            +
                      DelegateRegistration
         
     | 
| 
      
 15 
     | 
    
         
            +
                      Vote
         
     | 
| 
      
 16 
     | 
    
         
            +
                      MultiSignatureRegistration
         
     | 
| 
      
 17 
     | 
    
         
            +
                      Ipfs
         
     | 
| 
      
 18 
     | 
    
         
            +
                      TimelockTransfer
         
     | 
| 
      
 19 
     | 
    
         
            +
                      MultiPayment
         
     | 
| 
      
 20 
     | 
    
         
            +
                      DelegateResignation
         
     | 
| 
      
 21 
     | 
    
         
            +
                    ]
         
     | 
| 
      
 22 
     | 
    
         
            +
                  end
         
     | 
| 
      
 23 
     | 
    
         
            +
             
     | 
| 
      
 24 
     | 
    
         
            +
                  def deserialise
         
     | 
| 
      
 25 
     | 
    
         
            +
                    transaction = {}
         
     | 
| 
      
 26 
     | 
    
         
            +
                    transaction[:version] = @binary.unpack('C2').last
         
     | 
| 
      
 27 
     | 
    
         
            +
                    transaction[:network] = @binary.unpack('C3').last
         
     | 
| 
      
 28 
     | 
    
         
            +
                    transaction[:type] = @binary.unpack('C4').last
         
     | 
| 
      
 29 
     | 
    
         
            +
                    transaction[:timestamp] = @binary.unpack('V2').last
         
     | 
| 
      
 30 
     | 
    
         
            +
                    transaction[:sender_public_key] = @binary.unpack('H16H66').last
         
     | 
| 
      
 31 
     | 
    
         
            +
                    transaction[:fee] = @binary.unpack('C41Q<').last
         
     | 
| 
      
 32 
     | 
    
         
            +
             
     | 
| 
      
 33 
     | 
    
         
            +
                    vendor_field_length = @binary.unpack('C49C1').last
         
     | 
| 
      
 34 
     | 
    
         
            +
             
     | 
| 
      
 35 
     | 
    
         
            +
                    if vendor_field_length > 0
         
     | 
| 
      
 36 
     | 
    
         
            +
                      vendor_field_offset = (41 + 8 + 1) * 2
         
     | 
| 
      
 37 
     | 
    
         
            +
                      vendor_field_take = vendor_field_length * 2
         
     | 
| 
      
 38 
     | 
    
         
            +
             
     | 
| 
      
 39 
     | 
    
         
            +
                      transaction[:vendor_field_hex] = @binary.unpack("H#{vendor_field_offset}H#{vendor_field_take}").last
         
     | 
| 
      
 40 
     | 
    
         
            +
                    end
         
     | 
| 
      
 41 
     | 
    
         
            +
             
     | 
| 
      
 42 
     | 
    
         
            +
                    asset_offset = (41 + 8 + 1) * 2 + vendor_field_length * 2
         
     | 
| 
      
 43 
     | 
    
         
            +
             
     | 
| 
      
 44 
     | 
    
         
            +
                    transaction = handle_type(asset_offset, transaction)
         
     | 
| 
      
 45 
     | 
    
         
            +
             
     | 
| 
      
 46 
     | 
    
         
            +
                    transaction[:amount] = 0 unless transaction[:amount]
         
     | 
| 
      
 47 
     | 
    
         
            +
             
     | 
| 
      
 48 
     | 
    
         
            +
                    if transaction[:version] == 1 || transaction[:version].empty?
         
     | 
| 
      
 49 
     | 
    
         
            +
                      transaction = handle_version_one(transaction)
         
     | 
| 
      
 50 
     | 
    
         
            +
                    end
         
     | 
| 
      
 51 
     | 
    
         
            +
             
     | 
| 
      
 52 
     | 
    
         
            +
                    transaction
         
     | 
| 
      
 53 
     | 
    
         
            +
                  end
         
     | 
| 
      
 54 
     | 
    
         
            +
             
     | 
| 
      
 55 
     | 
    
         
            +
                  private
         
     | 
| 
      
 56 
     | 
    
         
            +
             
     | 
| 
      
 57 
     | 
    
         
            +
                  def handle_type(asset_offset, transaction)
         
     | 
| 
      
 58 
     | 
    
         
            +
                    deserialiser = @handlers[transaction[:type]]
         
     | 
| 
      
 59 
     | 
    
         
            +
                    deserialiser = Object.const_get("ArkEcosystem::Crypto::Deserialisers::#{deserialiser}")
         
     | 
| 
      
 60 
     | 
    
         
            +
                    deserialiser.new(@serialised, @binary, asset_offset, transaction).deserialise
         
     | 
| 
      
 61 
     | 
    
         
            +
                  end
         
     | 
| 
      
 62 
     | 
    
         
            +
             
     | 
| 
      
 63 
     | 
    
         
            +
                  def handle_version_one(transaction)
         
     | 
| 
      
 64 
     | 
    
         
            +
                    if transaction[:second_signature]
         
     | 
| 
      
 65 
     | 
    
         
            +
                      transaction[:sign_signature] = transaction[:second_signature]
         
     | 
| 
      
 66 
     | 
    
         
            +
                    end
         
     | 
| 
      
 67 
     | 
    
         
            +
             
     | 
| 
      
 68 
     | 
    
         
            +
                    if transaction[:type] == ArkEcosystem::Crypto::Enums::Types::SECOND_SIGNATURE_REGISTRATION
         
     | 
| 
      
 69 
     | 
    
         
            +
                      transaction[:recipient_id] = ArkEcosystem::Crypto::Identity::Address.from_public_key(transaction[:sender_public_key])
         
     | 
| 
      
 70 
     | 
    
         
            +
                    end
         
     | 
| 
      
 71 
     | 
    
         
            +
             
     | 
| 
      
 72 
     | 
    
         
            +
                    if transaction[:type] == ArkEcosystem::Crypto::Enums::Types::VOTE
         
     | 
| 
      
 73 
     | 
    
         
            +
                      transaction[:recipient_id] = ArkEcosystem::Crypto::Identity::Address.from_public_key(transaction[:sender_public_key])
         
     | 
| 
      
 74 
     | 
    
         
            +
                    end
         
     | 
| 
      
 75 
     | 
    
         
            +
             
     | 
| 
      
 76 
     | 
    
         
            +
                    if transaction[:type] == ArkEcosystem::Crypto::Enums::Types::MULTI_SIGNATURE_REGISTRATION
         
     | 
| 
      
 77 
     | 
    
         
            +
                      # The "recipientId" doesn't exist on v1 multi signature registrations
         
     | 
| 
      
 78 
     | 
    
         
            +
                      # transaction[:recipient_id] = ArkEcosystem::Crypto::Identity::Address::from_public_key(transaction[:sender_public_key]);
         
     | 
| 
      
 79 
     | 
    
         
            +
                      transaction[:asset][:multisignature][:keysgroup] = transaction[:asset][:multisignature][:keysgroup].map! { |key| '+' + key }
         
     | 
| 
      
 80 
     | 
    
         
            +
                    end
         
     | 
| 
      
 81 
     | 
    
         
            +
             
     | 
| 
      
 82 
     | 
    
         
            +
                    if transaction[:vendor_field_hex]
         
     | 
| 
      
 83 
     | 
    
         
            +
                      transaction[:vendor_field] = BTC::Data.data_from_hex(transaction[:vendor_field_hex])
         
     | 
| 
      
 84 
     | 
    
         
            +
                    end
         
     | 
| 
      
 85 
     | 
    
         
            +
             
     | 
| 
      
 86 
     | 
    
         
            +
                    unless transaction[:id]
         
     | 
| 
      
 87 
     | 
    
         
            +
                      transaction[:id] = ArkEcosystem::Crypto::Crypto.get_id(transaction)
         
     | 
| 
      
 88 
     | 
    
         
            +
                    end
         
     | 
| 
      
 89 
     | 
    
         
            +
             
     | 
| 
      
 90 
     | 
    
         
            +
                    transaction
         
     | 
| 
      
 91 
     | 
    
         
            +
                  end
         
     | 
| 
      
 92 
     | 
    
         
            +
                end
         
     | 
| 
      
 93 
     | 
    
         
            +
              end
         
     | 
| 
      
 94 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,15 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            module ArkEcosystem
         
     | 
| 
      
 2 
     | 
    
         
            +
              module Crypto
         
     | 
| 
      
 3 
     | 
    
         
            +
                module Deserialisers
         
     | 
| 
      
 4 
     | 
    
         
            +
                  # The base deserialiser for transactions.
         
     | 
| 
      
 5 
     | 
    
         
            +
                  class Base
         
     | 
| 
      
 6 
     | 
    
         
            +
                    def initialize(serialised, binary, asset_offset, transaction)
         
     | 
| 
      
 7 
     | 
    
         
            +
                      @serialised = serialised
         
     | 
| 
      
 8 
     | 
    
         
            +
                      @binary = binary
         
     | 
| 
      
 9 
     | 
    
         
            +
                      @asset_offset = asset_offset
         
     | 
| 
      
 10 
     | 
    
         
            +
                      @transaction = transaction
         
     | 
| 
      
 11 
     | 
    
         
            +
                    end
         
     | 
| 
      
 12 
     | 
    
         
            +
                  end
         
     | 
| 
      
 13 
     | 
    
         
            +
                end
         
     | 
| 
      
 14 
     | 
    
         
            +
              end
         
     | 
| 
      
 15 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,22 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            module ArkEcosystem
         
     | 
| 
      
 2 
     | 
    
         
            +
              module Crypto
         
     | 
| 
      
 3 
     | 
    
         
            +
                module Deserialisers
         
     | 
| 
      
 4 
     | 
    
         
            +
                  # The deserialiser for delegate registration transactions.
         
     | 
| 
      
 5 
     | 
    
         
            +
                  class DelegateRegistration < Base
         
     | 
| 
      
 6 
     | 
    
         
            +
                    def deserialise
         
     | 
| 
      
 7 
     | 
    
         
            +
                      @transaction[:asset] = {
         
     | 
| 
      
 8 
     | 
    
         
            +
                        delegate: {}
         
     | 
| 
      
 9 
     | 
    
         
            +
                      }
         
     | 
| 
      
 10 
     | 
    
         
            +
             
     | 
| 
      
 11 
     | 
    
         
            +
                      username_length = @binary.unpack("C#{@asset_offset / 2}Q<").last & 0xff
         
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
      
 13 
     | 
    
         
            +
                      username = @serialised[@asset_offset + 2, username_length * 2]
         
     | 
| 
      
 14 
     | 
    
         
            +
             
     | 
| 
      
 15 
     | 
    
         
            +
                      @transaction[:asset][:delegate][:username] = BTC::Data.data_from_hex(username)
         
     | 
| 
      
 16 
     | 
    
         
            +
             
     | 
| 
      
 17 
     | 
    
         
            +
                      ArkEcosystem::Crypto::Crypto.parse_signatures(@serialised, @transaction, @asset_offset + (username_length + 1) * 2)
         
     | 
| 
      
 18 
     | 
    
         
            +
                    end
         
     | 
| 
      
 19 
     | 
    
         
            +
                  end
         
     | 
| 
      
 20 
     | 
    
         
            +
                end
         
     | 
| 
      
 21 
     | 
    
         
            +
              end
         
     | 
| 
      
 22 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,12 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            module ArkEcosystem
         
     | 
| 
      
 2 
     | 
    
         
            +
              module Crypto
         
     | 
| 
      
 3 
     | 
    
         
            +
                module Deserialisers
         
     | 
| 
      
 4 
     | 
    
         
            +
                  # The deserialiser for delegate resignation transactions.
         
     | 
| 
      
 5 
     | 
    
         
            +
                  class DelegateResignation < Base
         
     | 
| 
      
 6 
     | 
    
         
            +
                    def deserialise
         
     | 
| 
      
 7 
     | 
    
         
            +
                      ArkEcosystem::Crypto::Crypto.parse_signatures(@serialised, @transaction, @asset_offset)
         
     | 
| 
      
 8 
     | 
    
         
            +
                    end
         
     | 
| 
      
 9 
     | 
    
         
            +
                  end
         
     | 
| 
      
 10 
     | 
    
         
            +
                end
         
     | 
| 
      
 11 
     | 
    
         
            +
              end
         
     | 
| 
      
 12 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,18 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            module ArkEcosystem
         
     | 
| 
      
 2 
     | 
    
         
            +
              module Crypto
         
     | 
| 
      
 3 
     | 
    
         
            +
                module Deserialisers
         
     | 
| 
      
 4 
     | 
    
         
            +
                  # The deserialiser for IPFS transactions.
         
     | 
| 
      
 5 
     | 
    
         
            +
                  class IPFS < Base
         
     | 
| 
      
 6 
     | 
    
         
            +
                    def deserialise
         
     | 
| 
      
 7 
     | 
    
         
            +
                      @transaction[:asset] = {}
         
     | 
| 
      
 8 
     | 
    
         
            +
             
     | 
| 
      
 9 
     | 
    
         
            +
                      dag_length = @binary.unpack("C#{@asset_offset / 2}Q<").last & 0xff
         
     | 
| 
      
 10 
     | 
    
         
            +
             
     | 
| 
      
 11 
     | 
    
         
            +
                      @transaction[:asset][:dag] = @serialised[@asset_offset + 2, dag_length * 2]
         
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
      
 13 
     | 
    
         
            +
                      ArkEcosystem::Crypto::Crypto.parse_signatures(@serialised, @transaction, @asset_offset + 2 + length * 2)
         
     | 
| 
      
 14 
     | 
    
         
            +
                    end
         
     | 
| 
      
 15 
     | 
    
         
            +
                  end
         
     | 
| 
      
 16 
     | 
    
         
            +
                end
         
     | 
| 
      
 17 
     | 
    
         
            +
              end
         
     | 
| 
      
 18 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,38 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            module ArkEcosystem
         
     | 
| 
      
 2 
     | 
    
         
            +
              module Crypto
         
     | 
| 
      
 3 
     | 
    
         
            +
                module Deserialisers
         
     | 
| 
      
 4 
     | 
    
         
            +
                  # The deserialiser for multi payment transactions.
         
     | 
| 
      
 5 
     | 
    
         
            +
                  class MultiPayment < Base
         
     | 
| 
      
 6 
     | 
    
         
            +
                    def deserialise
         
     | 
| 
      
 7 
     | 
    
         
            +
                      @transaction[:asset] = {
         
     | 
| 
      
 8 
     | 
    
         
            +
                        amount: 0,
         
     | 
| 
      
 9 
     | 
    
         
            +
                        payments: []
         
     | 
| 
      
 10 
     | 
    
         
            +
                      }
         
     | 
| 
      
 11 
     | 
    
         
            +
             
     | 
| 
      
 12 
     | 
    
         
            +
                      total = @binary.unpack("C#{@asset_offset / 2}Q<").last & 0xff
         
     | 
| 
      
 13 
     | 
    
         
            +
                      offset = @asset_offset / 2 + 1
         
     | 
| 
      
 14 
     | 
    
         
            +
             
     | 
| 
      
 15 
     | 
    
         
            +
                      i = 0
         
     | 
| 
      
 16 
     | 
    
         
            +
                      while i < total
         
     | 
| 
      
 17 
     | 
    
         
            +
                        recipient_id = @binary.unpack("H#{(offset + 1) * 2}H42").last
         
     | 
| 
      
 18 
     | 
    
         
            +
             
     | 
| 
      
 19 
     | 
    
         
            +
                        payment = {
         
     | 
| 
      
 20 
     | 
    
         
            +
                          amount: @binary.unpack("C#{@asset_offset / 2}Q<").last,
         
     | 
| 
      
 21 
     | 
    
         
            +
                          recipient_id: BTC::Base58.base58check_from_data([recipient_id].pack('H*'))
         
     | 
| 
      
 22 
     | 
    
         
            +
                        }
         
     | 
| 
      
 23 
     | 
    
         
            +
             
     | 
| 
      
 24 
     | 
    
         
            +
                        @transaction[:asset][:payments].push(payment)
         
     | 
| 
      
 25 
     | 
    
         
            +
             
     | 
| 
      
 26 
     | 
    
         
            +
                        offset += 22
         
     | 
| 
      
 27 
     | 
    
         
            +
             
     | 
| 
      
 28 
     | 
    
         
            +
                        i += 1
         
     | 
| 
      
 29 
     | 
    
         
            +
                      end
         
     | 
| 
      
 30 
     | 
    
         
            +
             
     | 
| 
      
 31 
     | 
    
         
            +
                      products.each { |item| @transaction[:amount] += item[:amount] }
         
     | 
| 
      
 32 
     | 
    
         
            +
             
     | 
| 
      
 33 
     | 
    
         
            +
                      ArkEcosystem::Crypto::Crypto.parse_signatures(@serialised, @transaction, offset * 2)
         
     | 
| 
      
 34 
     | 
    
         
            +
                    end
         
     | 
| 
      
 35 
     | 
    
         
            +
                  end
         
     | 
| 
      
 36 
     | 
    
         
            +
                end
         
     | 
| 
      
 37 
     | 
    
         
            +
              end
         
     | 
| 
      
 38 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,32 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            module ArkEcosystem
         
     | 
| 
      
 2 
     | 
    
         
            +
              module Crypto
         
     | 
| 
      
 3 
     | 
    
         
            +
                module Deserialisers
         
     | 
| 
      
 4 
     | 
    
         
            +
                  # The deserialiser for multi signature registrations transactions.
         
     | 
| 
      
 5 
     | 
    
         
            +
                  class MultiSignatureRegistration < Base
         
     | 
| 
      
 6 
     | 
    
         
            +
                    def deserialise
         
     | 
| 
      
 7 
     | 
    
         
            +
                      @transaction[:asset] = {
         
     | 
| 
      
 8 
     | 
    
         
            +
                        multisignature: {
         
     | 
| 
      
 9 
     | 
    
         
            +
                          keysgroup: []
         
     | 
| 
      
 10 
     | 
    
         
            +
                        }
         
     | 
| 
      
 11 
     | 
    
         
            +
                      }
         
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
      
 13 
     | 
    
         
            +
                      @transaction[:asset][:multisignature][:min] = @binary.unpack("C#{@asset_offset / 2}Q<").last & 0xff
         
     | 
| 
      
 14 
     | 
    
         
            +
                      @transaction[:asset][:multisignature][:lifetime] = @binary.unpack("C#{@asset_offset / 2 + 2}Q<").last & 0xff
         
     | 
| 
      
 15 
     | 
    
         
            +
             
     | 
| 
      
 16 
     | 
    
         
            +
                      count = @binary.unpack("C#{@asset_offset / 2 + 1}Q<").last & 0xff
         
     | 
| 
      
 17 
     | 
    
         
            +
             
     | 
| 
      
 18 
     | 
    
         
            +
                      i = 0
         
     | 
| 
      
 19 
     | 
    
         
            +
                      while i < count
         
     | 
| 
      
 20 
     | 
    
         
            +
                        index_start = @asset_offset + 6 + i * 66
         
     | 
| 
      
 21 
     | 
    
         
            +
             
     | 
| 
      
 22 
     | 
    
         
            +
                        @transaction[:asset][:multisignature][:keysgroup].push(@serialised[index_start, 66])
         
     | 
| 
      
 23 
     | 
    
         
            +
             
     | 
| 
      
 24 
     | 
    
         
            +
                        i += 1
         
     | 
| 
      
 25 
     | 
    
         
            +
                      end
         
     | 
| 
      
 26 
     | 
    
         
            +
             
     | 
| 
      
 27 
     | 
    
         
            +
                      ArkEcosystem::Crypto::Crypto.parse_signatures(@serialised, @transaction, @asset_offset + 6 + count * 66)
         
     | 
| 
      
 28 
     | 
    
         
            +
                    end
         
     | 
| 
      
 29 
     | 
    
         
            +
                  end
         
     | 
| 
      
 30 
     | 
    
         
            +
                end
         
     | 
| 
      
 31 
     | 
    
         
            +
              end
         
     | 
| 
      
 32 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,18 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            module ArkEcosystem
         
     | 
| 
      
 2 
     | 
    
         
            +
              module Crypto
         
     | 
| 
      
 3 
     | 
    
         
            +
                module Deserialisers
         
     | 
| 
      
 4 
     | 
    
         
            +
                  # The deserialiser for second signature registrations transactions.
         
     | 
| 
      
 5 
     | 
    
         
            +
                  class SecondSignatureRegistration < Base
         
     | 
| 
      
 6 
     | 
    
         
            +
                    def deserialise
         
     | 
| 
      
 7 
     | 
    
         
            +
                      @transaction[:asset] = {
         
     | 
| 
      
 8 
     | 
    
         
            +
                        signature: {}
         
     | 
| 
      
 9 
     | 
    
         
            +
                      }
         
     | 
| 
      
 10 
     | 
    
         
            +
             
     | 
| 
      
 11 
     | 
    
         
            +
                      @transaction[:asset][:signature][:public_key] = @serialised[@asset_offset, 66]
         
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
      
 13 
     | 
    
         
            +
                      ArkEcosystem::Crypto::Crypto.parse_signatures(@serialised, @transaction, @asset_offset + 66)
         
     | 
| 
      
 14 
     | 
    
         
            +
                    end
         
     | 
| 
      
 15 
     | 
    
         
            +
                  end
         
     | 
| 
      
 16 
     | 
    
         
            +
                end
         
     | 
| 
      
 17 
     | 
    
         
            +
              end
         
     | 
| 
      
 18 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,19 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            module ArkEcosystem
         
     | 
| 
      
 2 
     | 
    
         
            +
              module Crypto
         
     | 
| 
      
 3 
     | 
    
         
            +
                module Deserialisers
         
     | 
| 
      
 4 
     | 
    
         
            +
                  # The deserialiser for timelock transfer transactions.
         
     | 
| 
      
 5 
     | 
    
         
            +
                  class TimelockTransfer < Base
         
     | 
| 
      
 6 
     | 
    
         
            +
                    def deserialise
         
     | 
| 
      
 7 
     | 
    
         
            +
                      @transaction[:amount] = @binary.unpack("C#{@asset_offset / 2}Q<").last
         
     | 
| 
      
 8 
     | 
    
         
            +
                      @transaction[:timelocktype] = @binary.unpack("C#{@asset_offset / 2 + 8}").last & 0xff
         
     | 
| 
      
 9 
     | 
    
         
            +
                      @transaction[:timelock] = @binary.unpack("C#{@asset_offset / 2 + 9}Q<").last
         
     | 
| 
      
 10 
     | 
    
         
            +
             
     | 
| 
      
 11 
     | 
    
         
            +
                      recipient_id = @binary.unpack("H#{(@asset_offset / 2 + 13) * 2}H42").last
         
     | 
| 
      
 12 
     | 
    
         
            +
                      @transaction[:recipient_id] = BTC::Base58.base58check_from_data([recipient_id].pack('H*'))
         
     | 
| 
      
 13 
     | 
    
         
            +
             
     | 
| 
      
 14 
     | 
    
         
            +
                      ArkEcosystem::Crypto::Crypto.parse_signatures(@serialised, @transaction, @asset_offset + (21 + 13) * 2)
         
     | 
| 
      
 15 
     | 
    
         
            +
                    end
         
     | 
| 
      
 16 
     | 
    
         
            +
                  end
         
     | 
| 
      
 17 
     | 
    
         
            +
                end
         
     | 
| 
      
 18 
     | 
    
         
            +
              end
         
     | 
| 
      
 19 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,18 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            module ArkEcosystem
         
     | 
| 
      
 2 
     | 
    
         
            +
              module Crypto
         
     | 
| 
      
 3 
     | 
    
         
            +
                module Deserialisers
         
     | 
| 
      
 4 
     | 
    
         
            +
                  # The deserialiser for transfer transactions.
         
     | 
| 
      
 5 
     | 
    
         
            +
                  class Transfer < Base
         
     | 
| 
      
 6 
     | 
    
         
            +
                    def deserialise
         
     | 
| 
      
 7 
     | 
    
         
            +
                      @transaction[:amount] = @binary.unpack("C#{@asset_offset / 2}Q<").last
         
     | 
| 
      
 8 
     | 
    
         
            +
                      @transaction[:expiration] = @binary.unpack("C#{@asset_offset / 2 + 8}").last
         
     | 
| 
      
 9 
     | 
    
         
            +
             
     | 
| 
      
 10 
     | 
    
         
            +
                      recipient_id = @binary.unpack("H#{(@asset_offset / 2 + 12) * 2}H42").last
         
     | 
| 
      
 11 
     | 
    
         
            +
                      @transaction[:recipient_id] = BTC::Base58.base58check_from_data([recipient_id].pack('H*'))
         
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
      
 13 
     | 
    
         
            +
                      ArkEcosystem::Crypto::Crypto.parse_signatures(@serialised, @transaction, @asset_offset + (21 + 12) * 2)
         
     | 
| 
      
 14 
     | 
    
         
            +
                    end
         
     | 
| 
      
 15 
     | 
    
         
            +
                  end
         
     | 
| 
      
 16 
     | 
    
         
            +
                end
         
     | 
| 
      
 17 
     | 
    
         
            +
              end
         
     | 
| 
      
 18 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,31 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            module ArkEcosystem
         
     | 
| 
      
 2 
     | 
    
         
            +
              module Crypto
         
     | 
| 
      
 3 
     | 
    
         
            +
                module Deserialisers
         
     | 
| 
      
 4 
     | 
    
         
            +
                  # The deserialiser for vote transactions.
         
     | 
| 
      
 5 
     | 
    
         
            +
                  class Vote < Base
         
     | 
| 
      
 6 
     | 
    
         
            +
                    def deserialise
         
     | 
| 
      
 7 
     | 
    
         
            +
                      @transaction[:asset] = {
         
     | 
| 
      
 8 
     | 
    
         
            +
                        votes: []
         
     | 
| 
      
 9 
     | 
    
         
            +
                      }
         
     | 
| 
      
 10 
     | 
    
         
            +
             
     | 
| 
      
 11 
     | 
    
         
            +
                      vote_length = @binary.unpack("C#{@asset_offset / 2}Q<").last & 0xff
         
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
      
 13 
     | 
    
         
            +
                      i = 0
         
     | 
| 
      
 14 
     | 
    
         
            +
                      while i < vote_length
         
     | 
| 
      
 15 
     | 
    
         
            +
                        index_start = @asset_offset + 2 + i * 2 * 34
         
     | 
| 
      
 16 
     | 
    
         
            +
                        index_end = 2 * 34
         
     | 
| 
      
 17 
     | 
    
         
            +
             
     | 
| 
      
 18 
     | 
    
         
            +
                        vote = @serialised[index_start, index_end]
         
     | 
| 
      
 19 
     | 
    
         
            +
                        vote = (vote[1] == '1' ? '+' : '-') + vote[2..-1]
         
     | 
| 
      
 20 
     | 
    
         
            +
             
     | 
| 
      
 21 
     | 
    
         
            +
                        @transaction[:asset][:votes].push(vote)
         
     | 
| 
      
 22 
     | 
    
         
            +
             
     | 
| 
      
 23 
     | 
    
         
            +
                        i += 1
         
     | 
| 
      
 24 
     | 
    
         
            +
                      end
         
     | 
| 
      
 25 
     | 
    
         
            +
             
     | 
| 
      
 26 
     | 
    
         
            +
                      ArkEcosystem::Crypto::Crypto.parse_signatures(@serialised, @transaction, @asset_offset + 2 + vote_length * 34 * 2)
         
     | 
| 
      
 27 
     | 
    
         
            +
                    end
         
     | 
| 
      
 28 
     | 
    
         
            +
                  end
         
     | 
| 
      
 29 
     | 
    
         
            +
                end
         
     | 
| 
      
 30 
     | 
    
         
            +
              end
         
     | 
| 
      
 31 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,18 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            module ArkEcosystem
         
     | 
| 
      
 2 
     | 
    
         
            +
              module Crypto
         
     | 
| 
      
 3 
     | 
    
         
            +
                module Enums
         
     | 
| 
      
 4 
     | 
    
         
            +
                  # The list of available tansaction fees.
         
     | 
| 
      
 5 
     | 
    
         
            +
                  class Fees
         
     | 
| 
      
 6 
     | 
    
         
            +
                    TRANSFER = 10_000_000
         
     | 
| 
      
 7 
     | 
    
         
            +
                    SECOND_SIGNATURE_REGISTRATION = 500_000_000
         
     | 
| 
      
 8 
     | 
    
         
            +
                    DELEGATE_REGISTRATION = 2_500_000_000
         
     | 
| 
      
 9 
     | 
    
         
            +
                    VOTE = 100_000_000
         
     | 
| 
      
 10 
     | 
    
         
            +
                    MULTI_SIGNATURE_REGISTRATION = 500_000_000
         
     | 
| 
      
 11 
     | 
    
         
            +
                    IPFS = 0
         
     | 
| 
      
 12 
     | 
    
         
            +
                    TIMELOCK_TRANSFER = 0
         
     | 
| 
      
 13 
     | 
    
         
            +
                    MULTI_PAYMENT = 0
         
     | 
| 
      
 14 
     | 
    
         
            +
                    DELEGATE_RESIGNATION = 0
         
     | 
| 
      
 15 
     | 
    
         
            +
                  end
         
     | 
| 
      
 16 
     | 
    
         
            +
                end
         
     | 
| 
      
 17 
     | 
    
         
            +
              end
         
     | 
| 
      
 18 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,18 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            module ArkEcosystem
         
     | 
| 
      
 2 
     | 
    
         
            +
              module Crypto
         
     | 
| 
      
 3 
     | 
    
         
            +
                module Enums
         
     | 
| 
      
 4 
     | 
    
         
            +
                  # The list of available tansaction types.
         
     | 
| 
      
 5 
     | 
    
         
            +
                  class Types
         
     | 
| 
      
 6 
     | 
    
         
            +
                    TRANSFER = 0
         
     | 
| 
      
 7 
     | 
    
         
            +
                    SECOND_SIGNATURE_REGISTRATION = 1
         
     | 
| 
      
 8 
     | 
    
         
            +
                    DELEGATE_REGISTRATION = 2
         
     | 
| 
      
 9 
     | 
    
         
            +
                    VOTE = 3
         
     | 
| 
      
 10 
     | 
    
         
            +
                    MULTI_SIGNATURE_REGISTRATION = 4
         
     | 
| 
      
 11 
     | 
    
         
            +
                    IPFS = 5
         
     | 
| 
      
 12 
     | 
    
         
            +
                    TIMELOCK_TRANSFER = 6
         
     | 
| 
      
 13 
     | 
    
         
            +
                    MULTI_PAYMENT = 7
         
     | 
| 
      
 14 
     | 
    
         
            +
                    DELEGATE_RESIGNATION = 8
         
     | 
| 
      
 15 
     | 
    
         
            +
                  end
         
     | 
| 
      
 16 
     | 
    
         
            +
                end
         
     | 
| 
      
 17 
     | 
    
         
            +
              end
         
     | 
| 
      
 18 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,35 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require 'btcruby'
         
     | 
| 
      
 2 
     | 
    
         
            +
            require 'arkecosystem/crypto/configuration/network'
         
     | 
| 
      
 3 
     | 
    
         
            +
             
     | 
| 
      
 4 
     | 
    
         
            +
            module ArkEcosystem
         
     | 
| 
      
 5 
     | 
    
         
            +
              module Crypto
         
     | 
| 
      
 6 
     | 
    
         
            +
                module Identity
         
     | 
| 
      
 7 
     | 
    
         
            +
                  # The identity utility for an address.
         
     | 
| 
      
 8 
     | 
    
         
            +
                  class Address
         
     | 
| 
      
 9 
     | 
    
         
            +
                    def self.from_secret(secret, network = nil)
         
     | 
| 
      
 10 
     | 
    
         
            +
                      private_key = PrivateKey.from_secret(secret)
         
     | 
| 
      
 11 
     | 
    
         
            +
             
     | 
| 
      
 12 
     | 
    
         
            +
                      from_private_key(private_key, network)
         
     | 
| 
      
 13 
     | 
    
         
            +
                    end
         
     | 
| 
      
 14 
     | 
    
         
            +
             
     | 
| 
      
 15 
     | 
    
         
            +
                    def self.from_public_key(public_key, network = nil)
         
     | 
| 
      
 16 
     | 
    
         
            +
                      private_key = BTC::Key.new(public_key: [public_key].pack('H*'))
         
     | 
| 
      
 17 
     | 
    
         
            +
             
     | 
| 
      
 18 
     | 
    
         
            +
                      from_private_key(private_key, network)
         
     | 
| 
      
 19 
     | 
    
         
            +
                    end
         
     | 
| 
      
 20 
     | 
    
         
            +
             
     | 
| 
      
 21 
     | 
    
         
            +
                    def self.from_private_key(private_key, network = nil)
         
     | 
| 
      
 22 
     | 
    
         
            +
                      network ||= ArkEcosystem::Crypto::Configuration::Network.get
         
     | 
| 
      
 23 
     | 
    
         
            +
             
     | 
| 
      
 24 
     | 
    
         
            +
                      public_key = Digest::RMD160.digest(private_key.public_key)
         
     | 
| 
      
 25 
     | 
    
         
            +
             
     | 
| 
      
 26 
     | 
    
         
            +
                      BTC::Base58.base58check_from_data([network.version.to_i(16)].pack('c') + public_key)
         
     | 
| 
      
 27 
     | 
    
         
            +
                    end
         
     | 
| 
      
 28 
     | 
    
         
            +
             
     | 
| 
      
 29 
     | 
    
         
            +
                    def self.validate(address)
         
     | 
| 
      
 30 
     | 
    
         
            +
                      BTC::Address.parse(address)
         
     | 
| 
      
 31 
     | 
    
         
            +
                    end
         
     | 
| 
      
 32 
     | 
    
         
            +
                  end
         
     | 
| 
      
 33 
     | 
    
         
            +
                end
         
     | 
| 
      
 34 
     | 
    
         
            +
              end
         
     | 
| 
      
 35 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,14 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require 'btcruby'
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            module ArkEcosystem
         
     | 
| 
      
 4 
     | 
    
         
            +
              module Crypto
         
     | 
| 
      
 5 
     | 
    
         
            +
                module Identity
         
     | 
| 
      
 6 
     | 
    
         
            +
                  # The identity utility for a private key.
         
     | 
| 
      
 7 
     | 
    
         
            +
                  class PrivateKey
         
     | 
| 
      
 8 
     | 
    
         
            +
                    def self.from_secret(secret)
         
     | 
| 
      
 9 
     | 
    
         
            +
                      BTC::Key.new(private_key: Digest::SHA256.digest(secret), public_key_compressed: true)
         
     | 
| 
      
 10 
     | 
    
         
            +
                    end
         
     | 
| 
      
 11 
     | 
    
         
            +
                  end
         
     | 
| 
      
 12 
     | 
    
         
            +
                end
         
     | 
| 
      
 13 
     | 
    
         
            +
              end
         
     | 
| 
      
 14 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,18 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require 'btcruby'
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            module ArkEcosystem
         
     | 
| 
      
 4 
     | 
    
         
            +
              module Crypto
         
     | 
| 
      
 5 
     | 
    
         
            +
                module Identity
         
     | 
| 
      
 6 
     | 
    
         
            +
                  # The identity utility for a public key.
         
     | 
| 
      
 7 
     | 
    
         
            +
                  class PublicKey
         
     | 
| 
      
 8 
     | 
    
         
            +
                    def self.from_secret(secret)
         
     | 
| 
      
 9 
     | 
    
         
            +
                      PrivateKey.from_secret(secret).public_key
         
     | 
| 
      
 10 
     | 
    
         
            +
                    end
         
     | 
| 
      
 11 
     | 
    
         
            +
             
     | 
| 
      
 12 
     | 
    
         
            +
                    def self.from_secret_as_hex(secret)
         
     | 
| 
      
 13 
     | 
    
         
            +
                      from_secret(secret).unpack('H*').first
         
     | 
| 
      
 14 
     | 
    
         
            +
                    end
         
     | 
| 
      
 15 
     | 
    
         
            +
                  end
         
     | 
| 
      
 16 
     | 
    
         
            +
                end
         
     | 
| 
      
 17 
     | 
    
         
            +
              end
         
     | 
| 
      
 18 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,22 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require 'btcruby'
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            module ArkEcosystem
         
     | 
| 
      
 4 
     | 
    
         
            +
              module Crypto
         
     | 
| 
      
 5 
     | 
    
         
            +
                module Identity
         
     | 
| 
      
 6 
     | 
    
         
            +
                  # The identity utility for a WIF.
         
     | 
| 
      
 7 
     | 
    
         
            +
                  class WIF
         
     | 
| 
      
 8 
     | 
    
         
            +
                    def self.from_secret(secret, network = nil)
         
     | 
| 
      
 9 
     | 
    
         
            +
                      network ||= ArkEcosystem::Crypto::Configuration::Network.get
         
     | 
| 
      
 10 
     | 
    
         
            +
             
     | 
| 
      
 11 
     | 
    
         
            +
                      secret = Digest::SHA256.digest(secret)
         
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
      
 13 
     | 
    
         
            +
                      seed = [network.wif].pack('C*')
         
     | 
| 
      
 14 
     | 
    
         
            +
                      seed << secret
         
     | 
| 
      
 15 
     | 
    
         
            +
                      seed << [0x01].pack('C*')
         
     | 
| 
      
 16 
     | 
    
         
            +
             
     | 
| 
      
 17 
     | 
    
         
            +
                      BTC::Base58.base58check_from_data(seed)
         
     | 
| 
      
 18 
     | 
    
         
            +
                    end
         
     | 
| 
      
 19 
     | 
    
         
            +
                  end
         
     | 
| 
      
 20 
     | 
    
         
            +
                end
         
     | 
| 
      
 21 
     | 
    
         
            +
              end
         
     | 
| 
      
 22 
     | 
    
         
            +
            end
         
     |