nis-ruby 0.0.14 → 0.0.15
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 +4 -4
- data/README.md +11 -13
- data/examples/block.rb +2 -4
- data/examples/local.rb +1 -1
- data/examples/transactions/mosaic_definition_creation.rb +1 -1
- data/examples/transactions/mosaic_supply_change.rb +1 -1
- data/examples/transactions/multisig.rb +8 -6
- data/examples/transactions/multisig_add_cosignatory.rb +11 -11
- data/examples/transactions/multisig_aggregate_modification.rb +5 -4
- data/examples/transactions/multisig_signature.rb +10 -10
- data/examples/transactions/provision_namespace.rb +2 -2
- data/examples/transactions/transfer.rb +4 -4
- data/examples/transactions/transfer_mosaic.rb +30 -26
- data/examples/transactions/transfer_remote.rb +4 -4
- data/examples/util/deserialize.rb +14 -0
- data/lib/nis/fee/provision_namespace.rb +2 -2
- data/lib/nis/request/announce.rb +21 -6
- data/lib/nis/request/prepare_announce.rb +19 -4
- data/lib/nis/util/deserializer.rb +134 -9
- data/lib/nis/util/serializer.rb +155 -96
- data/lib/nis/version.rb +1 -1
- data/nis.gemspec +8 -0
- metadata +7 -3
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA1:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: aa8c49e0cd78c5bdde006099b1fcda37b2708a64
         | 
| 4 | 
            +
              data.tar.gz: cb8a3175db3121d2f761265423b93407ae8013e7
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: 563b492199ffbce3d85d8914eff9d166e60c3f2a6751082980ae2a8a722006a78c07cfd66271433bfbe9b09a42a883e1f493ddcdba52d331d5b48c5bb9c85cb6
         | 
| 7 | 
            +
              data.tar.gz: 254df0dfe30be08e4bd7ec23241c181001db04d9d5ca005b7b74f72e636617fff7438a5816fb948a99bd8c27e96e8bcde0722bcc3d0664fc3d8ca1b286200028
         | 
    
        data/README.md
    CHANGED
    
    | @@ -35,11 +35,13 @@ gem 'nis-ruby' | |
| 35 35 |  | 
| 36 36 | 
             
            ### Examples
         | 
| 37 37 |  | 
| 38 | 
            -
            More specific example codes are in **examples | 
| 38 | 
            +
            More specific example codes are in **[examples/](examples/)** directory.
         | 
| 39 39 |  | 
| 40 40 | 
             
            ### Methods
         | 
| 41 41 |  | 
| 42 42 | 
             
            ```ruby
         | 
| 43 | 
            +
            require 'rubygems'
         | 
| 44 | 
            +
            require 'nis'
         | 
| 43 45 | 
             
            nis = Nis.new
         | 
| 44 46 |  | 
| 45 47 | 
             
            nis.heartbeat
         | 
| @@ -53,7 +55,7 @@ nis.status | |
| 53 55 | 
             
            kp = Nis::Keypair.new(SENDER_PRIV_KEY)
         | 
| 54 56 | 
             
            tx = Nis::Transaction::Transfer.new(
         | 
| 55 57 | 
             
              RECIPIENT_ADDRESS,
         | 
| 56 | 
            -
               | 
| 58 | 
            +
              1, # send 1xem
         | 
| 57 59 | 
             
              'Message'
         | 
| 58 60 | 
             
            )
         | 
| 59 61 | 
             
            req = Nis::Request::PrepareAnnounce.new(tx, kp)
         | 
| @@ -63,12 +65,15 @@ nis.transaction_prepare_announce(req) | |
| 63 65 | 
             
            # => {innerTransactionHash: {}, code: 1, type: 1, message: "SUCCESS", transactionHash: {data: "9da41fd6c6886740ae6a15c869df0470015d78103e5b216971aa09fdbcce9cde"}}
         | 
| 64 66 |  | 
| 65 67 | 
             
            # Request to remote node.
         | 
| 68 | 
            +
            # nis = Nis.new(host: '104.128.226.60')
         | 
| 66 69 | 
             
            # nis.transaction_announce(req)
         | 
| 67 70 | 
             
            ```
         | 
| 68 71 |  | 
| 69 72 | 
             
            ### Requesting
         | 
| 70 73 |  | 
| 71 74 | 
             
            ```ruby
         | 
| 75 | 
            +
            require 'rubygems'
         | 
| 76 | 
            +
            require 'nis'
         | 
| 72 77 | 
             
            nis = Nis.new
         | 
| 73 78 |  | 
| 74 79 | 
             
            nis.request(:get, '/account/get',
         | 
| @@ -102,22 +107,22 @@ $ nis request get account/harvests --params=address:TALICELCD3XPH4FFI5STGGNSNSWP | |
| 102 107 |  | 
| 103 108 | 
             
            ## Connection
         | 
| 104 109 |  | 
| 105 | 
            -
            You can  | 
| 110 | 
            +
            You can choose nodes from [NEM Node Rewards](https://supernodes.nem.io/).
         | 
| 106 111 |  | 
| 107 112 | 
             
            ### Hash
         | 
| 108 113 |  | 
| 109 114 | 
             
            ```ruby
         | 
| 110 115 | 
             
            # Passing hostname
         | 
| 111 | 
            -
            Nis.new(host: ' | 
| 116 | 
            +
            Nis.new(host: '104.128.226.60')
         | 
| 112 117 |  | 
| 113 118 | 
             
            # Passing url
         | 
| 114 | 
            -
            Nis.new(url: 'http:// | 
| 119 | 
            +
            Nis.new(url: 'http://104.128.226.60:7890')
         | 
| 115 120 | 
             
            ```
         | 
| 116 121 |  | 
| 117 122 | 
             
            ### Environment Variable
         | 
| 118 123 |  | 
| 119 124 | 
             
            ```bash
         | 
| 120 | 
            -
            $ export NIS_URL=http:// | 
| 125 | 
            +
            $ export NIS_URL=http://104.128.226.60:7890
         | 
| 121 126 | 
             
            $ nis heartbeat # => {"code":1,"type":2,"message":"ok"}
         | 
| 122 127 | 
             
            ```
         | 
| 123 128 |  | 
| @@ -127,13 +132,6 @@ Environment variable used as default value. | |
| 127 132 |  | 
| 128 133 | 
             
            * [Documentation for nis-ruby - rubydoc.info](http://www.rubydoc.info/gems/nis-ruby)
         | 
| 129 134 |  | 
| 130 | 
            -
            ## TODO
         | 
| 131 | 
            -
             | 
| 132 | 
            -
            * Do more improvements
         | 
| 133 | 
            -
              * Encryption message
         | 
| 134 | 
            -
              * Failover connection
         | 
| 135 | 
            -
              * Be more easy to use
         | 
| 136 | 
            -
             | 
| 137 135 | 
             
            ## Contact
         | 
| 138 136 |  | 
| 139 137 | 
             
            Feel free to ask me if you have any questions.
         | 
    
        data/examples/block.rb
    CHANGED
    
    | @@ -1,11 +1,9 @@ | |
| 1 1 | 
             
            require 'nis'
         | 
| 2 | 
            -
            hr = '-' * 64
         | 
| 3 2 |  | 
| 4 3 | 
             
            nis = Nis.new
         | 
| 5 4 |  | 
| 6 | 
            -
            block = nis.block_at_public(block_height:  | 
| 5 | 
            +
            block = nis.block_at_public(block_height: 890_761)
         | 
| 6 | 
            +
             | 
| 7 7 | 
             
            puts block.to_hash
         | 
| 8 | 
            -
            puts hr
         | 
| 9 8 |  | 
| 10 9 | 
             
            puts nis.block_get(block_hash: 'fb5e76bf137eb27451926d29fd2b308e672e5d9ec405d9cbcd47cc0f83492cd0')
         | 
| 11 | 
            -
            puts hr
         | 
    
        data/examples/local.rb
    CHANGED
    
    
| @@ -1,16 +1,18 @@ | |
| 1 1 | 
             
            require 'nis'
         | 
| 2 2 |  | 
| 3 3 | 
             
            # multisig
         | 
| 4 | 
            -
             | 
| 4 | 
            +
            M_PUBLIC_KEY  = '00f077782658ae91b77f238ba5fcd7ef110564b5c189072e4d4590d9b17f9d76f3'
         | 
| 5 5 |  | 
| 6 6 | 
             
            # cosignatory
         | 
| 7 | 
            -
             | 
| 8 | 
            -
            B_ADDRESS = 'TAWKJTUP4DWKLDKKS534TYP6G324CBNMXKBA4X7B'
         | 
| 7 | 
            +
            A_PRIVATE_KEY = '4ce5c8f9fce571db0d9ac1adf00b8d3ba0f078ed40835fd3d730a2f24b834214'
         | 
| 9 8 |  | 
| 10 | 
            -
             | 
| 9 | 
            +
            # recipient
         | 
| 10 | 
            +
            B_ADDRESS = 'TA4TX6U5HG2MROAESH2JE5524T4ZOY2EQKQ6ELHF'
         | 
| 11 11 |  | 
| 12 | 
            -
             | 
| 13 | 
            -
             | 
| 12 | 
            +
            kp = Nis::Keypair.new(A_PRIVATE_KEY)
         | 
| 13 | 
            +
             | 
| 14 | 
            +
            ttx = Nis::Transaction::Transfer.new(B_ADDRESS, 1, 'Good luck!')
         | 
| 15 | 
            +
            tx = Nis::Transaction::Multisig.new(ttx, M_PUBLIC_KEY)
         | 
| 14 16 | 
             
            puts "Fee: #{tx.fee.to_i}"
         | 
| 15 17 |  | 
| 16 18 | 
             
            nis = Nis.new
         | 
| @@ -1,24 +1,24 @@ | |
| 1 1 | 
             
            require 'nis'
         | 
| 2 2 |  | 
| 3 | 
            -
            #  | 
| 4 | 
            -
             | 
| 3 | 
            +
            # multisig
         | 
| 4 | 
            +
            M_PUBLIC_KEY  = '6d72b57d2bc199d328e7ea3e24775f7f614760bc18f3f8501cd3daa9870cc40c'
         | 
| 5 5 |  | 
| 6 | 
            -
            #  | 
| 7 | 
            -
             | 
| 6 | 
            +
            # cosignatory1
         | 
| 7 | 
            +
            A_PRIVATE_KEY = '4ce5c8f9fce571db0d9ac1adf00b8d3ba0f078ed40835fd3d730a2f24b834214'
         | 
| 8 8 |  | 
| 9 | 
            -
            #  | 
| 10 | 
            -
             | 
| 9 | 
            +
            # cosignatory2
         | 
| 10 | 
            +
            B_PUBLIC_KEY  = '9e7ab2924cd1a3482df784db190614cfc8a33671f5d80a5b15a9c9e8b4d13933'
         | 
| 11 11 |  | 
| 12 | 
            -
            kp = Nis::Keypair.new( | 
| 12 | 
            +
            kp = Nis::Keypair.new(A_PRIVATE_KEY)
         | 
| 13 13 |  | 
| 14 14 | 
             
            mcm = Nis::Struct::MultisigCosignatoryModification.new(
         | 
| 15 15 | 
             
              modificationType: 1,
         | 
| 16 | 
            -
              cosignatoryAccount:  | 
| 16 | 
            +
              cosignatoryAccount: B_PUBLIC_KEY
         | 
| 17 17 | 
             
            )
         | 
| 18 | 
            -
            min_cosigs =  | 
| 19 | 
            -
            mtx = Nis::Transaction::MultisigAggregateModification.new([mcm], min_cosigs)
         | 
| 18 | 
            +
            min_cosigs = 1
         | 
| 20 19 |  | 
| 21 | 
            -
             | 
| 20 | 
            +
            mtx = Nis::Transaction::MultisigAggregateModification.new([mcm], min_cosigs)
         | 
| 21 | 
            +
            tx = Nis::Transaction::Multisig.new(mtx, M_PUBLIC_KEY)
         | 
| 22 22 |  | 
| 23 23 | 
             
            nis = Nis.new
         | 
| 24 24 | 
             
            req = Nis::Request::PrepareAnnounce.new(tx, kp)
         | 
| @@ -1,16 +1,17 @@ | |
| 1 1 | 
             
            require 'nis'
         | 
| 2 2 |  | 
| 3 3 | 
             
            # multisig
         | 
| 4 | 
            -
             | 
| 4 | 
            +
            M_PRIVATE_KEY = '00f077782658ae91b77f238ba5fcd7ef110564b5c189072e4d4590d9b17f9d76f3'
         | 
| 5 5 |  | 
| 6 6 | 
             
            # cosignatory
         | 
| 7 | 
            -
             | 
| 7 | 
            +
            A_PRIVATE_KEY = '4ce5c8f9fce571db0d9ac1adf00b8d3ba0f078ed40835fd3d730a2f24b834214'
         | 
| 8 | 
            +
            A_PUBLIC_KEY  = 'cc63b4dcdec745417043c3fa0992ec3a1695461a26d90264744648abbd5caa0d'
         | 
| 8 9 |  | 
| 9 | 
            -
            kp = Nis::Keypair.new( | 
| 10 | 
            +
            kp = Nis::Keypair.new(M_PRIVATE_KEY)
         | 
| 10 11 |  | 
| 11 12 | 
             
            mcm = Nis::Struct::MultisigCosignatoryModification.new(
         | 
| 12 13 | 
             
              modificationType: 1,
         | 
| 13 | 
            -
              cosignatoryAccount:  | 
| 14 | 
            +
              cosignatoryAccount: A_PUBLIC_KEY
         | 
| 14 15 | 
             
            )
         | 
| 15 16 | 
             
            min_cosigs = 1
         | 
| 16 17 |  | 
| @@ -1,22 +1,22 @@ | |
| 1 1 | 
             
            require 'nis'
         | 
| 2 2 |  | 
| 3 3 | 
             
            # multisig
         | 
| 4 | 
            -
             | 
| 5 | 
            -
             | 
| 4 | 
            +
            M_PUBLIC_KEY = '6d72b57d2bc199d328e7ea3e24775f7f614760bc18f3f8501cd3daa9870cc40c'
         | 
| 5 | 
            +
            M_ADDRESS = 'TDJNDAQ7F7AQRXKP2YVTH67QYCWWKE6QLSJFWN64'
         | 
| 6 6 |  | 
| 7 7 | 
             
            # cosignatory1
         | 
| 8 | 
            -
            #  | 
| 9 | 
            -
            #  | 
| 10 | 
            -
            #  | 
| 8 | 
            +
            # A_PRIVATE_KEY = '4ce5c8f9fce571db0d9ac1adf00b8d3ba0f078ed40835fd3d730a2f24b834214'
         | 
| 9 | 
            +
            # A_PUBLIC_KEY  = 'be2ba9cb15a547110d511a4d43c0482fbb584d78781abac01fb053d18f4a0033'
         | 
| 10 | 
            +
            # A_ADDRESS = 'TDPP2C4XQLMESBMCYGWN4NRAJAKZEYRV75KGYSOB'
         | 
| 11 11 |  | 
| 12 12 | 
             
            # cosignatory2
         | 
| 13 | 
            -
             | 
| 14 | 
            -
             | 
| 13 | 
            +
            B_PRIVATE_KEY = '1d13af2c31ee6fb0c3c7aaaea818d9b305dcadba130ba663fc42d9f25b24ded1'
         | 
| 14 | 
            +
            B_ADDRESS = 'TA4TX6U5HG2MROAESH2JE5524T4ZOY2EQKQ6ELHF'
         | 
| 15 15 |  | 
| 16 | 
            -
            kp = Nis::Keypair.new( | 
| 16 | 
            +
            kp = Nis::Keypair.new(B_PRIVATE_KEY)
         | 
| 17 17 |  | 
| 18 18 | 
             
            nis = Nis.new
         | 
| 19 | 
            -
            txes = nis.account_unconfirmed_transactions(address:  | 
| 19 | 
            +
            txes = nis.account_unconfirmed_transactions(address: B_ADDRESS)
         | 
| 20 20 |  | 
| 21 21 | 
             
            unless txes.size > 0
         | 
| 22 22 | 
             
              puts 'There are no transactions to sign.'
         | 
| @@ -26,7 +26,7 @@ end | |
| 26 26 | 
             
            hash = txes.first.meta.data
         | 
| 27 27 | 
             
            puts "Unconfirmed Transaction Hash: #{hash}"
         | 
| 28 28 |  | 
| 29 | 
            -
            tx = Nis::Transaction::MultisigSignature.new(hash,  | 
| 29 | 
            +
            tx = Nis::Transaction::MultisigSignature.new(hash, M_ADDRESS, B_PUBLIC_KEY)
         | 
| 30 30 |  | 
| 31 31 | 
             
            req = Nis::Request::PrepareAnnounce.new(tx, kp)
         | 
| 32 32 | 
             
            res = nis.transaction_prepare_announce(req)
         | 
| @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            require 'nis'
         | 
| 2 2 |  | 
| 3 3 | 
             
            # sender
         | 
| 4 | 
            -
            A_PRIVATE_KEY = ' | 
| 4 | 
            +
            A_PRIVATE_KEY = '4ce5c8f9fce571db0d9ac1adf00b8d3ba0f078ed40835fd3d730a2f24b834214'
         | 
| 5 5 |  | 
| 6 | 
            -
            #  | 
| 7 | 
            -
            B_ADDRESS = ' | 
| 6 | 
            +
            # recipient
         | 
| 7 | 
            +
            B_ADDRESS = 'TA4TX6U5HG2MROAESH2JE5524T4ZOY2EQKQ6ELHF'
         | 
| 8 8 |  | 
| 9 9 | 
             
            kp = Nis::Keypair.new(A_PRIVATE_KEY)
         | 
| 10 10 |  | 
| 11 | 
            -
            tx = Nis::Transaction::Transfer.new(B_ADDRESS,  | 
| 11 | 
            +
            tx = Nis::Transaction::Transfer.new(B_ADDRESS, 1, 'Good luck!')
         | 
| 12 12 | 
             
            puts "Fee: #{tx.fee.to_i}"
         | 
| 13 13 |  | 
| 14 14 | 
             
            nis = Nis.new
         | 
| @@ -1,48 +1,52 @@ | |
| 1 1 | 
             
            require 'nis'
         | 
| 2 | 
            -
            require 'pp'
         | 
| 3 2 |  | 
| 4 3 | 
             
            # sender
         | 
| 5 | 
            -
            A_PRIVATE_KEY = ' | 
| 4 | 
            +
            A_PRIVATE_KEY = '4ce5c8f9fce571db0d9ac1adf00b8d3ba0f078ed40835fd3d730a2f24b834214'
         | 
| 6 5 |  | 
| 7 | 
            -
            #  | 
| 8 | 
            -
            B_ADDRESS = ' | 
| 6 | 
            +
            # recipient
         | 
| 7 | 
            +
            B_ADDRESS = 'TA4TX6U5HG2MROAESH2JE5524T4ZOY2EQKQ6ELHF'
         | 
| 9 8 |  | 
| 10 9 | 
             
            kp = Nis::Keypair.new(A_PRIVATE_KEY)
         | 
| 11 10 |  | 
| 12 | 
            -
            # fetch mosaic  | 
| 13 | 
            -
            nis = Nis.new | 
| 14 | 
            -
            mo_dmdps = nis.namespace_mosaic_definition_page(namespace: ' | 
| 11 | 
            +
            # fetch mosaic definition
         | 
| 12 | 
            +
            nis = Nis.new
         | 
| 13 | 
            +
            mo_dmdps = nis.namespace_mosaic_definition_page(namespace: 'kon')
         | 
| 15 14 | 
             
            mo_def = mo_dmdps.first.mosaic
         | 
| 16 15 |  | 
| 17 | 
            -
            #  | 
| 18 | 
            -
             | 
| 16 | 
            +
            # Or you can use built object if you already know mosaic definition.
         | 
| 19 17 | 
             
            # mosaic_id = Nis::Struct::MosaicId.new(
         | 
| 20 | 
            -
            #   namespaceId: ' | 
| 21 | 
            -
            #   name: ' | 
| 18 | 
            +
            #   namespaceId: 'kon',
         | 
| 19 | 
            +
            #   name: 'heart'
         | 
| 22 20 | 
             
            # )
         | 
| 23 | 
            -
             | 
| 24 21 | 
             
            # properties = Nis::Struct::MosaicProperties.new(
         | 
| 25 | 
            -
            #   divisibility:  | 
| 26 | 
            -
            #   initialSupply:  | 
| 27 | 
            -
            #   supplyMutable: true,
         | 
| 28 | 
            -
            #   transferable: true
         | 
| 22 | 
            +
            #   divisibility: 3,
         | 
| 23 | 
            +
            #   initialSupply: 100_000_000
         | 
| 29 24 | 
             
            # )
         | 
| 30 | 
            -
             | 
| 31 25 | 
             
            # mo_def = Nis::Struct::MosaicDefinition.new(
         | 
| 32 26 | 
             
            #   id: mosaic_id,
         | 
| 33 27 | 
             
            #   properties: properties,
         | 
| 34 28 | 
             
            # )
         | 
| 35 29 |  | 
| 36 | 
            -
             | 
| 37 | 
            -
             | 
| 30 | 
            +
            # sending 1xem as mosaic sample
         | 
| 31 | 
            +
            # mosaic_id = Nis::Struct::MosaicId.new(
         | 
| 32 | 
            +
            #   namespaceId: 'nem',
         | 
| 33 | 
            +
            #   name: 'xem'
         | 
| 34 | 
            +
            # )
         | 
| 35 | 
            +
            # properties = Nis::Struct::MosaicProperties.new(
         | 
| 36 | 
            +
            #   divisibility: 6,
         | 
| 37 | 
            +
            #   initialSupply: 8_999_999_999
         | 
| 38 | 
            +
            # )
         | 
| 39 | 
            +
            # mo_def = Nis::Struct::MosaicDefinition.new(
         | 
| 40 | 
            +
            #   id: mosaic_id,
         | 
| 41 | 
            +
            #   properties: properties,
         | 
| 42 | 
            +
            # )
         | 
| 43 | 
            +
            # mosaic_attachment = Nis::Struct::MosaicAttachment.new(mo_def, 1_000_000)
         | 
| 38 44 |  | 
| 39 | 
            -
             | 
| 45 | 
            +
            tx = Nis::Transaction::Transfer.new(B_ADDRESS, 1, 'Good luck!')
         | 
| 46 | 
            +
            tx.mosaics << Nis::Struct::MosaicAttachment.new(mo_def, 1)
         | 
| 40 47 |  | 
| 41 | 
            -
            nis = Nis.new
         | 
| 42 48 | 
             
            req = Nis::Request::PrepareAnnounce.new(tx, kp)
         | 
| 43 | 
            -
             | 
| 44 | 
            -
            # res = nis.transaction_prepare_announce(req)
         | 
| 49 | 
            +
            res = nis.transaction_prepare_announce(req)
         | 
| 45 50 |  | 
| 46 | 
            -
            #
         | 
| 47 | 
            -
             | 
| 48 | 
            -
            # puts "TransactionHash: #{res.transaction_hash}"
         | 
| 51 | 
            +
            puts "Message: #{res.message}"
         | 
| 52 | 
            +
            puts "TransactionHash: #{res.transaction_hash}"
         | 
| @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            require 'nis'
         | 
| 2 2 |  | 
| 3 3 | 
             
            # sender
         | 
| 4 | 
            -
            A_PRIVATE_KEY = ' | 
| 4 | 
            +
            A_PRIVATE_KEY = '4ce5c8f9fce571db0d9ac1adf00b8d3ba0f078ed40835fd3d730a2f24b834214'
         | 
| 5 5 |  | 
| 6 | 
            -
            #  | 
| 7 | 
            -
            B_ADDRESS = ' | 
| 6 | 
            +
            # recipient
         | 
| 7 | 
            +
            B_ADDRESS = 'TA4TX6U5HG2MROAESH2JE5524T4ZOY2EQKQ6ELHF'
         | 
| 8 8 |  | 
| 9 9 | 
             
            kp = Nis::Keypair.new(A_PRIVATE_KEY)
         | 
| 10 10 |  | 
| 11 | 
            -
            tx = Nis::Transaction::Transfer.new(B_ADDRESS,  | 
| 11 | 
            +
            tx = Nis::Transaction::Transfer.new(B_ADDRESS, 1, 'Good luck!')
         | 
| 12 12 | 
             
            puts "Fee: #{tx.fee.to_i}"
         | 
| 13 13 |  | 
| 14 14 | 
             
            nis = Nis.new(host: '104.128.226.60')
         | 
| @@ -0,0 +1,14 @@ | |
| 1 | 
            +
            require 'nis'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            # sender
         | 
| 4 | 
            +
            A_PRIVATE_KEY = '260206d683962350532408e8774fd14870a173b7fba17f6b504da3dbc5f1cc9f'
         | 
| 5 | 
            +
             | 
| 6 | 
            +
            # receiver
         | 
| 7 | 
            +
            B_ADDRESS = 'TAWKJTUP4DWKLDKKS534TYP6G324CBNMXKBA4X7B'
         | 
| 8 | 
            +
             | 
| 9 | 
            +
            kp = Nis::Keypair.new(A_PRIVATE_KEY)
         | 
| 10 | 
            +
            tx = Nis::Transaction::Transfer.new(B_ADDRESS, 1, 'Good luck!')
         | 
| 11 | 
            +
            req = Nis::Request::Announce.new(tx, kp)
         | 
| 12 | 
            +
             | 
| 13 | 
            +
            puts req.to_hash[:data]
         | 
| 14 | 
            +
            puts Nis::Util::Deserializer.deserialize_transaction(req.to_hash[:data])
         | 
    
        data/lib/nis/request/announce.rb
    CHANGED
    
    | @@ -16,18 +16,31 @@ class Nis::Request | |
| 16 16 |  | 
| 17 17 | 
             
                # @return [Hash] Attribute and value pairs
         | 
| 18 18 | 
             
                def to_hash
         | 
| 19 | 
            -
                   | 
| 20 | 
            -
             | 
| 19 | 
            +
                  entity = @transaction.clone
         | 
| 20 | 
            +
             | 
| 21 | 
            +
                  entity.amount *= 1_000_000 if entity.respond_to?(:amount)
         | 
| 22 | 
            +
             | 
| 23 | 
            +
                  if entity.respond_to?(:other_trans)
         | 
| 24 | 
            +
                    other_trans(entity)
         | 
| 21 25 | 
             
                  end
         | 
| 22 26 |  | 
| 23 | 
            -
                   | 
| 27 | 
            +
                  entity.tap do |tx|
         | 
| 24 28 | 
             
                    tx.timeStamp = Nis::Util.timestamp
         | 
| 25 29 | 
             
                    tx.deadline = Nis::Util.deadline(DEADLINE)
         | 
| 26 30 | 
             
                    tx.version = Nis::Util.parse_version(tx.network, version(tx))
         | 
| 27 31 | 
             
                    tx.signer = @keypair.public
         | 
| 28 32 | 
             
                  end
         | 
| 29 33 |  | 
| 30 | 
            -
                   | 
| 34 | 
            +
                  entity_hash = entity.to_hash
         | 
| 35 | 
            +
                  if entity.respond_to?(:has_mosaics?) && !entity.has_mosaics?
         | 
| 36 | 
            +
                    entity_hash.delete(:mosaics)
         | 
| 37 | 
            +
                  end
         | 
| 38 | 
            +
             | 
| 39 | 
            +
                  if entity.respond_to?(:other_trans) && !entity.other_trans.has_mosaics?
         | 
| 40 | 
            +
                    entity_hash[:otherTrans].delete(:mosaics)
         | 
| 41 | 
            +
                  end
         | 
| 42 | 
            +
             | 
| 43 | 
            +
                  serialized = serialize(entity_hash)
         | 
| 31 44 | 
             
                  hex_serialized = Nis::Util::Convert.ua2hex(serialized)
         | 
| 32 45 |  | 
| 33 46 | 
             
                  { data: Nis::Util::Convert.ua2hex(serialized),
         | 
| @@ -36,8 +49,8 @@ class Nis::Request | |
| 36 49 |  | 
| 37 50 | 
             
                private
         | 
| 38 51 |  | 
| 39 | 
            -
                def serialize( | 
| 40 | 
            -
                  Nis::Util::Serializer.serialize_transaction( | 
| 52 | 
            +
                def serialize(transaction_hash)
         | 
| 53 | 
            +
                  Nis::Util::Serializer.serialize_transaction(transaction_hash)
         | 
| 41 54 | 
             
                end
         | 
| 42 55 |  | 
| 43 56 | 
             
                def signature(serialized)
         | 
| @@ -46,6 +59,8 @@ class Nis::Request | |
| 46 59 |  | 
| 47 60 | 
             
                def other_trans(transaction)
         | 
| 48 61 | 
             
                  transaction.other_trans.tap do |tx|
         | 
| 62 | 
            +
                    tx.amount *= 1_000_000 if tx.respond_to?(:amount)
         | 
| 63 | 
            +
             | 
| 49 64 | 
             
                    tx.timeStamp = Nis::Util.timestamp
         | 
| 50 65 | 
             
                    tx.deadline = Nis::Util.deadline(DEADLINE)
         | 
| 51 66 | 
             
                    tx.version = Nis::Util.parse_version(tx.network, version(tx))
         | 
| @@ -16,18 +16,31 @@ class Nis::Request | |
| 16 16 |  | 
| 17 17 | 
             
                # @return [Hash] Attribute and value pairs
         | 
| 18 18 | 
             
                def to_hash
         | 
| 19 | 
            -
                   | 
| 20 | 
            -
             | 
| 19 | 
            +
                  entity = @transaction.clone
         | 
| 20 | 
            +
             | 
| 21 | 
            +
                  entity.amount *= 1_000_000 if entity.respond_to?(:amount)
         | 
| 22 | 
            +
             | 
| 23 | 
            +
                  if entity.respond_to?(:other_trans)
         | 
| 24 | 
            +
                    other_trans(entity)
         | 
| 21 25 | 
             
                  end
         | 
| 22 26 |  | 
| 23 | 
            -
                   | 
| 27 | 
            +
                  entity.tap do |tx|
         | 
| 24 28 | 
             
                    tx.timeStamp = Nis::Util.timestamp
         | 
| 25 29 | 
             
                    tx.deadline = Nis::Util.deadline(DEADLINE)
         | 
| 26 30 | 
             
                    tx.version = Nis::Util.parse_version(tx.network, version(tx))
         | 
| 27 31 | 
             
                    tx.signer = @keypair.public
         | 
| 28 32 | 
             
                  end
         | 
| 29 33 |  | 
| 30 | 
            -
                   | 
| 34 | 
            +
                  entity_hash = entity.to_hash
         | 
| 35 | 
            +
                  if entity.respond_to?(:has_mosaics?) && !entity.has_mosaics?
         | 
| 36 | 
            +
                    entity_hash.delete(:mosaics)
         | 
| 37 | 
            +
                  end
         | 
| 38 | 
            +
             | 
| 39 | 
            +
                  if entity.respond_to?(:other_trans) && !entity.other_trans.has_mosaics?
         | 
| 40 | 
            +
                    entity_hash[:otherTrans].delete(:mosaics)
         | 
| 41 | 
            +
                  end
         | 
| 42 | 
            +
             | 
| 43 | 
            +
                  { transaction: entity_hash,
         | 
| 31 44 | 
             
                    privateKey: @keypair.private }
         | 
| 32 45 | 
             
                end
         | 
| 33 46 |  | 
| @@ -35,6 +48,8 @@ class Nis::Request | |
| 35 48 |  | 
| 36 49 | 
             
                def other_trans(transaction)
         | 
| 37 50 | 
             
                  transaction.other_trans.tap do |tx|
         | 
| 51 | 
            +
                    tx.amount *= 1_000_000 if tx.respond_to?(:amount)
         | 
| 52 | 
            +
             | 
| 38 53 | 
             
                    tx.timeStamp = Nis::Util.timestamp
         | 
| 39 54 | 
             
                    tx.deadline = Nis::Util.deadline(DEADLINE)
         | 
| 40 55 | 
             
                    tx.version = Nis::Util.parse_version(tx.network, version(tx))
         | 
| @@ -5,18 +5,31 @@ module Nis::Util | |
| 5 5 | 
             
                # @return [Hash]
         | 
| 6 6 | 
             
                def self.deserialize_transaction(serialized)
         | 
| 7 7 | 
             
                  s = Nis::Util::Convert.hex2ua(serialized)
         | 
| 8 | 
            +
                  type = deserialize_int(s[0, 4])
         | 
| 9 | 
            +
                  method = case type
         | 
| 10 | 
            +
                           when 0x0101 then method(:deserialize_transfer)
         | 
| 11 | 
            +
                           when 0x0801 then method(:deserialize_importance_transfer)
         | 
| 12 | 
            +
                           when 0x1001 then method(:deserialize_multisig_aggregate_modification)
         | 
| 13 | 
            +
                           when 0x1002 then method(:deserialize_multisig_signature)
         | 
| 14 | 
            +
                           when 0x1004 then method(:deserialize_multisig)
         | 
| 15 | 
            +
                           when 0x2001 then method(:deserialize_provision_namespace)
         | 
| 16 | 
            +
                           when 0x4001 then method(:deserialize_mosaic_definition_creation)
         | 
| 17 | 
            +
                           when 0x4002 then method(:deserialize_mosaic_supply_change)
         | 
| 18 | 
            +
                    else raise "Not implemented entity type: #{type}"
         | 
| 19 | 
            +
                  end
         | 
| 20 | 
            +
                  method.call(serialized)
         | 
| 21 | 
            +
                end
         | 
| 22 | 
            +
             | 
| 23 | 
            +
                # Deserialize a transfer transaction object
         | 
| 24 | 
            +
                # @param [String] serialized
         | 
| 25 | 
            +
                # @return [Hash]
         | 
| 26 | 
            +
                def self.deserialize_transfer(serialized)
         | 
| 27 | 
            +
                  s = Nis::Util::Convert.hex2ua(serialized)
         | 
| 28 | 
            +
                  common = deserialize_common(s)
         | 
| 8 29 | 
             
                  tx = {}
         | 
| 9 | 
            -
                  tx[:type] = deserialize_int(s[0, 4])
         | 
| 10 | 
            -
                  tx[:version] = deserialize_int(s[4, 4])
         | 
| 11 | 
            -
                  tx[:timeStamp] = deserialize_int(s[8, 4])
         | 
| 12 | 
            -
                  # s[12,4] # length of public key
         | 
| 13 | 
            -
                  tx[:signer] = deserialize_hex(s[16, 32])
         | 
| 14 | 
            -
                  tx[:fee] = deserialize_int(s[48, 8])
         | 
| 15 | 
            -
                  tx[:deadline] = deserialize_int(s[56, 4])
         | 
| 16 30 | 
             
                  # s[60,4] # length of  address
         | 
| 17 31 | 
             
                  tx[:recipient] = deserialize_a(s[64, 40])
         | 
| 18 32 | 
             
                  tx[:amount] = deserialize_int(s[104, 8])
         | 
| 19 | 
            -
             | 
| 20 33 | 
             
                  tx[:message] = {}
         | 
| 21 34 | 
             
                  message_len = deserialize_int(s[112, 4])
         | 
| 22 35 | 
             
                  if message_len > 0
         | 
| @@ -26,11 +39,123 @@ module Nis::Util | |
| 26 39 | 
             
                  else
         | 
| 27 40 | 
             
                    tx[:message] = { type: 1, payload: '' }
         | 
| 28 41 | 
             
                  end
         | 
| 29 | 
            -
                  tx
         | 
| 42 | 
            +
                  common.merge(tx)
         | 
| 43 | 
            +
                end
         | 
| 44 | 
            +
             | 
| 45 | 
            +
                # Deserialize a importance transaction object
         | 
| 46 | 
            +
                # @param [String] serialized
         | 
| 47 | 
            +
                # @return [Hash]
         | 
| 48 | 
            +
                def self.deserialize_importance_transfer(serialized)
         | 
| 49 | 
            +
                  s = Nis::Util::Convert.hex2ua(serialized)
         | 
| 50 | 
            +
                  common = deserialize_common(s)
         | 
| 51 | 
            +
                  tx = {}
         | 
| 52 | 
            +
                  tx[:mode] = deserialize_int(s[60, 4])
         | 
| 53 | 
            +
                  # s[64, 4] # Length of remote account public key byte array
         | 
| 54 | 
            +
                  tx[:remoteAccount] = deserialize_hex(s[68, 32])
         | 
| 55 | 
            +
                  common.merge(tx)
         | 
| 56 | 
            +
                end
         | 
| 57 | 
            +
             | 
| 58 | 
            +
                # Deserialize a multisig aggregate modification transaction object
         | 
| 59 | 
            +
                # @param [String] serialized
         | 
| 60 | 
            +
                # @return [Hash]
         | 
| 61 | 
            +
                def self.deserialize_multisig_aggregate_modification(serialized)
         | 
| 62 | 
            +
                  raise 'Not yet implimented.'
         | 
| 63 | 
            +
                  s = Nis::Util::Convert.hex2ua(serialized)
         | 
| 64 | 
            +
                  common = deserialize_common(s)
         | 
| 65 | 
            +
                  tx = {}
         | 
| 66 | 
            +
                  # TODO: deserializing
         | 
| 67 | 
            +
                  common.merge(tx)
         | 
| 68 | 
            +
                end
         | 
| 69 | 
            +
             | 
| 70 | 
            +
                # Deserialize a multisig signature transaction object
         | 
| 71 | 
            +
                # @param [String] serialized
         | 
| 72 | 
            +
                # @return [Hash]
         | 
| 73 | 
            +
                def self.deserialize_multisig_signature(serialized)
         | 
| 74 | 
            +
                  s = Nis::Util::Convert.hex2ua(serialized)
         | 
| 75 | 
            +
                  common = deserialize_common(s)
         | 
| 76 | 
            +
                  tx = {}
         | 
| 77 | 
            +
                  tx[:otherHash] = {data: deserialize_hex(s[68, 32])}
         | 
| 78 | 
            +
                  tx[:otherAccount] = deserialize_a(s[104, 40])
         | 
| 79 | 
            +
                  common.merge(tx)
         | 
| 80 | 
            +
                end
         | 
| 81 | 
            +
             | 
| 82 | 
            +
                # Deserialize a multisig transfer transaction object
         | 
| 83 | 
            +
                # @param [String] serialized
         | 
| 84 | 
            +
                # @return [Hash]
         | 
| 85 | 
            +
                def self.deserialize_multisig(serialized)
         | 
| 86 | 
            +
                  raise 'Not yet implimented.'
         | 
| 87 | 
            +
                  s = Nis::Util::Convert.hex2ua(serialized)
         | 
| 88 | 
            +
                  common = deserialize_common(s)
         | 
| 89 | 
            +
                  tx = {}
         | 
| 90 | 
            +
                  # TODO: deserializing
         | 
| 91 | 
            +
                  common.merge(tx)
         | 
| 92 | 
            +
                end
         | 
| 93 | 
            +
             | 
| 94 | 
            +
                # Deserialize a provision namespace transaction object
         | 
| 95 | 
            +
                # @param [String] serialized
         | 
| 96 | 
            +
                # @return [Hash]
         | 
| 97 | 
            +
                def self.deserialize_provision_namespace(serialized)
         | 
| 98 | 
            +
                  s = Nis::Util::Convert.hex2ua(serialized)
         | 
| 99 | 
            +
                  common = deserialize_common(s)
         | 
| 100 | 
            +
                  tx = {}
         | 
| 101 | 
            +
                  # s[60, 4] # Length of rental fee sink's public key byte array (always 32): 4 bytes
         | 
| 102 | 
            +
                  tx[:rentalFeeSink] = deserialize_a(s[64, 40]) # Public key bytes of rental fee sink
         | 
| 103 | 
            +
                  tx[:rentalFee] = deserialize_int(s[104, 8]) # Fental fee: 8 bytes
         | 
| 104 | 
            +
                  newpart_len = deserialize_int(s[112, 4]) # Length of new part string: 4 bytes
         | 
| 105 | 
            +
                  tx[:newPart] = deserialize_a(s[116, newpart_len]) # New part string: UTF8 encoded string.
         | 
| 106 | 
            +
                  parent_len = deserialize_int(s[116 + newpart_len, 4]) # Length of parent string: 4 bytes
         | 
| 107 | 
            +
                  parent = s[116 + newpart_len, parent_len]
         | 
| 108 | 
            +
                  unless parent.all? { |val| val == 0xff }
         | 
| 109 | 
            +
                    tx[:parent] = deserialize_a(parent) # Parent string: UTF8 encoded string
         | 
| 110 | 
            +
                  end
         | 
| 111 | 
            +
                  common.merge(tx)
         | 
| 112 | 
            +
                end
         | 
| 113 | 
            +
             | 
| 114 | 
            +
                # Deserialize a mosaic definition creation transaction object
         | 
| 115 | 
            +
                # @param [String] serialized
         | 
| 116 | 
            +
                # @return [Hash]
         | 
| 117 | 
            +
                def self.deserialize_mosaic_definition_creation(serialized)
         | 
| 118 | 
            +
                  raise 'Not yet implimented.'
         | 
| 119 | 
            +
                  s = Nis::Util::Convert.hex2ua(serialized)
         | 
| 120 | 
            +
                  common = deserialize_common(s)
         | 
| 121 | 
            +
                  tx = {}
         | 
| 122 | 
            +
                  # TODO: deserializing
         | 
| 123 | 
            +
                  common.merge(tx)
         | 
| 124 | 
            +
                end
         | 
| 125 | 
            +
             | 
| 126 | 
            +
                # Deserialize a mosaic supply change transaction object
         | 
| 127 | 
            +
                # @param [String] serialized
         | 
| 128 | 
            +
                # @return [Hash]
         | 
| 129 | 
            +
                def self.deserialize_mosaic_supply_change(serialized)
         | 
| 130 | 
            +
                  s = Nis::Util::Convert.hex2ua(serialized)
         | 
| 131 | 
            +
                  common = deserialize_common(s)
         | 
| 132 | 
            +
                  tx = {}
         | 
| 133 | 
            +
                  # s[60, 4] # Length of mosaic id structure
         | 
| 134 | 
            +
                  ns_len = deserialize_int(s[64, 4]) # Length of namespace id string
         | 
| 135 | 
            +
                  mo_len = deserialize_int(s[68 + ns_len, 4]) # Length of mosaic name string
         | 
| 136 | 
            +
                  tx[:mosaicId] = {
         | 
| 137 | 
            +
                    namespaceId: deserialize_a(s[68, ns_len]),
         | 
| 138 | 
            +
                    name: deserialize_a(s[68 + ns_len + mo_len, mo_len])
         | 
| 139 | 
            +
                  }
         | 
| 140 | 
            +
                  tx[:supplyType] = deserialize_int(s[68 + ns_len + 4 + mo_len, 4]) # Supply type
         | 
| 141 | 
            +
                  tx[:delta] = deserialize_int(s[68 + ns_len + 4 + mo_len + 4, 8]) # Delta (change in supply)
         | 
| 142 | 
            +
                  common.merge(tx)
         | 
| 30 143 | 
             
                end
         | 
| 31 144 |  | 
| 32 145 | 
             
                private
         | 
| 33 146 |  | 
| 147 | 
            +
                def self.deserialize_common(s)
         | 
| 148 | 
            +
                  tx = {}
         | 
| 149 | 
            +
                  tx[:type] = deserialize_int(s[0, 4])
         | 
| 150 | 
            +
                  tx[:version] = deserialize_int(s[4, 4])
         | 
| 151 | 
            +
                  tx[:timeStamp] = deserialize_int(s[8, 4])
         | 
| 152 | 
            +
                  # s[12,4] # length of public key
         | 
| 153 | 
            +
                  tx[:signer] = deserialize_hex(s[16, 32])
         | 
| 154 | 
            +
                  tx[:fee] = deserialize_int(s[48, 8])
         | 
| 155 | 
            +
                  tx[:deadline] = deserialize_int(s[56, 4])
         | 
| 156 | 
            +
                  tx
         | 
| 157 | 
            +
                end
         | 
| 158 | 
            +
             | 
| 34 159 | 
             
                def self.deserialize_int(ua)
         | 
| 35 160 | 
             
                  Nis::Util::Convert.ua2hex(ua.reverse).to_i(16)
         | 
| 36 161 | 
             
                end
         | 
    
        data/lib/nis/util/serializer.rb
    CHANGED
    
    | @@ -5,67 +5,163 @@ module Nis::Util | |
| 5 5 | 
             
                # @return [Array]
         | 
| 6 6 | 
             
                def self.serialize_transaction(entity)
         | 
| 7 7 | 
             
                  method = case entity[:type]
         | 
| 8 | 
            -
                           when | 
| 9 | 
            -
                           when  | 
| 8 | 
            +
                           when 0x0101 then method(:serialize_transfer)
         | 
| 9 | 
            +
                           when 0x0801 then method(:serialize_importance_transfer)
         | 
| 10 | 
            +
                           when 0x1001 then method(:serialize_multisig_aggregate_modification)
         | 
| 11 | 
            +
                           when 0x1002 then method(:serialize_multisig_signature)
         | 
| 12 | 
            +
                           when 0x1004 then method(:serialize_multisig)
         | 
| 13 | 
            +
                           when 0x2001 then method(:serialize_provision_namespace)
         | 
| 14 | 
            +
                           when 0x4001 then method(:serialize_mosaic_definition_creation)
         | 
| 15 | 
            +
                           when 0x4002 then method(:serialize_mosaic_supply_change)
         | 
| 10 16 | 
             
                    else raise "Not implemented entity type: #{entity[:type]}"
         | 
| 11 17 | 
             
                  end
         | 
| 12 18 | 
             
                  method.call(entity)
         | 
| 13 19 | 
             
                end
         | 
| 14 20 |  | 
| 15 | 
            -
                def self. | 
| 21 | 
            +
                def self.serialize_transfer(entity)
         | 
| 16 22 | 
             
                  a = []
         | 
| 17 | 
            -
                   | 
| 18 | 
            -
                  a +=  | 
| 19 | 
            -
                   | 
| 23 | 
            +
                  # Common transaction part
         | 
| 24 | 
            +
                  a += serialize_common(entity)
         | 
| 25 | 
            +
                  # Transfer transaction part
         | 
| 26 | 
            +
                  a += serialize_safe_string(entity[:recipient])
         | 
| 27 | 
            +
                  a += serialize_long(entity[:amount])
         | 
| 28 | 
            +
                  temp = hex2ua(entity[:message][:payload])
         | 
| 29 | 
            +
                  if temp.size == 0
         | 
| 30 | 
            +
                    a += [0, 0, 0, 0]
         | 
| 31 | 
            +
                  else
         | 
| 32 | 
            +
                    a += serialize_int(temp.size + 8)
         | 
| 33 | 
            +
                    a += serialize_int(entity[:message][:type])
         | 
| 34 | 
            +
                    a += serialize_int(temp.size)
         | 
| 35 | 
            +
                    a += temp
         | 
| 36 | 
            +
                  end
         | 
| 37 | 
            +
                  a
         | 
| 38 | 
            +
                end
         | 
| 20 39 |  | 
| 21 | 
            -
             | 
| 40 | 
            +
                def self.serialize_importance_transfer(entity)
         | 
| 41 | 
            +
                  a = []
         | 
| 42 | 
            +
                  a += serialize_common(entity)
         | 
| 43 | 
            +
                  a += serialize_int(entity[:mode])
         | 
| 44 | 
            +
                  temp = hex2ua(entity[:remoteAccount])
         | 
| 22 45 | 
             
                  a += serialize_int(temp.size)
         | 
| 23 46 | 
             
                  a += temp
         | 
| 24 | 
            -
             | 
| 25 | 
            -
                  a += serialize_long(entity[:fee].to_i)
         | 
| 26 | 
            -
                  a += serialize_int(entity[:deadline])
         | 
| 27 47 | 
             
                  a
         | 
| 28 48 | 
             
                end
         | 
| 29 49 |  | 
| 30 | 
            -
                def self. | 
| 50 | 
            +
                def self.serialize_multisig_aggregate_modification(entity)
         | 
| 31 51 | 
             
                  a = []
         | 
| 52 | 
            +
                  a += serialize_common(entity)
         | 
| 53 | 
            +
                  a += serialize_int(entity[:modifications].size)
         | 
| 54 | 
            +
                  a += entity[:modifications].map do |mod|
         | 
| 55 | 
            +
                    b = []
         | 
| 56 | 
            +
                    b += serialize_int(40)
         | 
| 57 | 
            +
                    b += serialize_int(mod[:modificationType])
         | 
| 58 | 
            +
                    b += serialize_int(32)
         | 
| 59 | 
            +
                    b += hex2ua(mod[:cosignatoryAccount])
         | 
| 60 | 
            +
                    b
         | 
| 61 | 
            +
                  end.flatten
         | 
| 32 62 |  | 
| 33 | 
            -
                  #  | 
| 63 | 
            +
                  # The following part describes the minimum cosignatories modification.
         | 
| 64 | 
            +
                  # The part is optional. Version 1 aggregate modification transactions should omit this part.
         | 
| 65 | 
            +
                  # Version 2 aggregate modification transactions with no minimum cosignatories modification
         | 
| 66 | 
            +
                  # should only write the length field with value 0x00, 0x00, 0x00, 0x00.
         | 
| 67 | 
            +
                  if true # only version2
         | 
| 68 | 
            +
                    if entity[:minCosignatories][:relativeChange] > 0
         | 
| 69 | 
            +
                      a += serialize_int(4)
         | 
| 70 | 
            +
                      a += serialize_int(entity[:minCosignatories][:relativeChange])
         | 
| 71 | 
            +
                    else
         | 
| 72 | 
            +
                      a += [0, 0, 0, 0]
         | 
| 73 | 
            +
                    end
         | 
| 74 | 
            +
                  end
         | 
| 75 | 
            +
                  a
         | 
| 76 | 
            +
                end
         | 
| 77 | 
            +
             | 
| 78 | 
            +
                def self.serialize_multisig_signature(entity)
         | 
| 79 | 
            +
                  a = []
         | 
| 34 80 | 
             
                  a += serialize_common(entity)
         | 
| 81 | 
            +
                  temp = hex2ua(entity[:otherHash][:data])
         | 
| 82 | 
            +
                  a += serialize_int(4 + temp.size)
         | 
| 83 | 
            +
                  a += serialize_int(temp.size)
         | 
| 84 | 
            +
                  a += temp
         | 
| 85 | 
            +
                  a += serialize_safe_string(entity[:otherAccount])
         | 
| 86 | 
            +
                end
         | 
| 35 87 |  | 
| 36 | 
            -
             | 
| 37 | 
            -
                   | 
| 88 | 
            +
                def self.serialize_multisig(entity)
         | 
| 89 | 
            +
                  a = []
         | 
| 90 | 
            +
                  a += serialize_common(entity)
         | 
| 91 | 
            +
                  other_tx = entity[:otherTrans]
         | 
| 92 | 
            +
                  tx = case other_tx[:type]
         | 
| 93 | 
            +
                    when 0x0101 then serialize_transfer(other_tx)
         | 
| 94 | 
            +
                    when 0x0801 then serialize_importance_transfer(other_tx)
         | 
| 95 | 
            +
                    when 0x1001 then serialize_multisig_aggregate_modification(other_tx)
         | 
| 96 | 
            +
                    else raise "Unexpected type #{other_tx[:type]}"
         | 
| 97 | 
            +
                  end
         | 
| 38 98 | 
             
                  a += serialize_int(tx.size)
         | 
| 39 99 | 
             
                  a += tx
         | 
| 40 100 | 
             
                  a
         | 
| 41 101 | 
             
                end
         | 
| 42 102 |  | 
| 43 | 
            -
                def self. | 
| 103 | 
            +
                def self.serialize_provision_namespace(entity)
         | 
| 44 104 | 
             
                  a = []
         | 
| 45 | 
            -
             | 
| 46 | 
            -
                  # Common transaction part
         | 
| 47 105 | 
             
                  a += serialize_common(entity)
         | 
| 48 | 
            -
             | 
| 49 | 
            -
                   | 
| 50 | 
            -
                  temp =  | 
| 106 | 
            +
                  a += serialize_safe_string(entity[:rentalFeeSink])
         | 
| 107 | 
            +
                  a += serialize_long(entity[:rentalFee])
         | 
| 108 | 
            +
                  temp = hex2ua(utf8_to_hex(entity[:newPart]))
         | 
| 109 | 
            +
                  a += serialize_int(temp.size)
         | 
| 51 110 | 
             
                  a += temp
         | 
| 52 | 
            -
             | 
| 53 | 
            -
             | 
| 54 | 
            -
             | 
| 55 | 
            -
                  temp = hex2ua(entity[:message][:payload])
         | 
| 56 | 
            -
                  if temp.size == 0
         | 
| 57 | 
            -
                    a += [0, 0, 0, 0]
         | 
| 58 | 
            -
                  else
         | 
| 59 | 
            -
                    a += serialize_int(temp.size + 8)
         | 
| 60 | 
            -
                    a += serialize_int(entity[:message][:type])
         | 
| 111 | 
            +
                  if entity[:parent]
         | 
| 112 | 
            +
                    temp = hex2ua(utf8_to_hex(entity[:parent]))
         | 
| 61 113 | 
             
                    a += serialize_int(temp.size)
         | 
| 62 114 | 
             
                    a += temp
         | 
| 115 | 
            +
                  else
         | 
| 116 | 
            +
                    a += [255, 255, 255, 255]
         | 
| 63 117 | 
             
                  end
         | 
| 64 118 | 
             
                  a
         | 
| 65 119 | 
             
                end
         | 
| 66 120 |  | 
| 121 | 
            +
                def self.serialize_mosaic_definition_creation(entity)
         | 
| 122 | 
            +
                  a = []
         | 
| 123 | 
            +
                  a += serialize_common(entity)
         | 
| 124 | 
            +
                  a += serialize_mosaic_definition(entity[:mosaicDefinition])
         | 
| 125 | 
            +
                  a += serialize_safe_string(entity[:creationFeeSink])
         | 
| 126 | 
            +
                  a += serialize_long(entity[:creationFee])
         | 
| 127 | 
            +
                  a
         | 
| 128 | 
            +
                end
         | 
| 129 | 
            +
             | 
| 130 | 
            +
                def self.serialize_mosaic_supply_change(entity)
         | 
| 131 | 
            +
                  a = []
         | 
| 132 | 
            +
                  a += serialize_common(entity)
         | 
| 133 | 
            +
                  mo_id = entity[:mosaicId]
         | 
| 134 | 
            +
                  a_ns = hex2ua(utf8_to_hex(mo_id[:namespaceId]))
         | 
| 135 | 
            +
                  a_ns_len = serialize_int(a_ns.size)
         | 
| 136 | 
            +
                  a_mo = hex2ua(utf8_to_hex(mo_id[:name]))
         | 
| 137 | 
            +
                  a_mo_len = serialize_int(a_mo.size)
         | 
| 138 | 
            +
                  a += serialize_int((a_ns_len + a_ns + a_mo_len + a_mo).size)
         | 
| 139 | 
            +
                  a += a_ns_len
         | 
| 140 | 
            +
                  a += a_ns
         | 
| 141 | 
            +
                  a += a_mo_len
         | 
| 142 | 
            +
                  a += a_mo
         | 
| 143 | 
            +
                  a += serialize_int(entity[:supplyType])
         | 
| 144 | 
            +
                  a += serialize_long(entity[:delta])
         | 
| 145 | 
            +
                  a
         | 
| 146 | 
            +
                end
         | 
| 147 | 
            +
             | 
| 67 148 | 
             
                private
         | 
| 68 149 |  | 
| 150 | 
            +
                def self.serialize_common(entity)
         | 
| 151 | 
            +
                  a = []
         | 
| 152 | 
            +
                  a += serialize_int(entity[:type])
         | 
| 153 | 
            +
                  a += serialize_int(entity[:version])
         | 
| 154 | 
            +
                  a += serialize_int(entity[:timeStamp])
         | 
| 155 | 
            +
             | 
| 156 | 
            +
                  temp = hex2ua(entity[:signer])
         | 
| 157 | 
            +
                  a += serialize_int(temp.size)
         | 
| 158 | 
            +
                  a += temp
         | 
| 159 | 
            +
             | 
| 160 | 
            +
                  a += serialize_long(entity[:fee].to_i)
         | 
| 161 | 
            +
                  a += serialize_int(entity[:deadline])
         | 
| 162 | 
            +
                  a
         | 
| 163 | 
            +
                end
         | 
| 164 | 
            +
             | 
| 69 165 | 
             
                # Safe String - Each char is 8 bit
         | 
| 70 166 | 
             
                # @param [String] str
         | 
| 71 167 | 
             
                # @return [Array]
         | 
| @@ -106,16 +202,6 @@ module Nis::Util | |
| 106 202 | 
             
                  a
         | 
| 107 203 | 
             
                end
         | 
| 108 204 |  | 
| 109 | 
            -
                # @param [Nis::Struct::MosaicId] mosaic_id
         | 
| 110 | 
            -
                # @return [Array]
         | 
| 111 | 
            -
                def self.serialize_mosaic_id(mosaic_id)
         | 
| 112 | 
            -
                  serialized_namespace_id = serialize_safe_string(mosaic_id.namespace_id)
         | 
| 113 | 
            -
                  serialized_name = serialize_safe_string(mosaic_id.name)
         | 
| 114 | 
            -
                  [serialized_namespace_id.size + serialized_name.size, 0, 0, 0] +
         | 
| 115 | 
            -
                    serialized_namespace_id +
         | 
| 116 | 
            -
                    serialized_name
         | 
| 117 | 
            -
                end
         | 
| 118 | 
            -
             | 
| 119 205 | 
             
                # @param [Nis::Struct::Mosaic] mosaic
         | 
| 120 206 | 
             
                # @return [Array]
         | 
| 121 207 | 
             
                def self.serialize_mosaic_and_quantity(mosaic)
         | 
| @@ -145,74 +231,63 @@ module Nis::Util | |
| 145 231 | 
             
                  end.flatten
         | 
| 146 232 | 
             
                end
         | 
| 147 233 |  | 
| 234 | 
            +
                # @param [Hash] entity
         | 
| 235 | 
            +
                # @return [Array]
         | 
| 236 | 
            +
                def self.serialize_mosaic_id(entity)
         | 
| 237 | 
            +
                  a = []
         | 
| 238 | 
            +
                  a += serialize_safe_string(entity[:namespaceId])
         | 
| 239 | 
            +
                  a += serialize_safe_string(entity[:name])
         | 
| 240 | 
            +
                  serialize_int(a.size) + a
         | 
| 241 | 
            +
                end
         | 
| 242 | 
            +
             | 
| 148 243 | 
             
                # @param [Hash] entity
         | 
| 149 244 | 
             
                # @return [Array]
         | 
| 150 245 | 
             
                def self.serialize_property(entity)
         | 
| 151 | 
            -
                  a = [] | 
| 152 | 
            -
                   | 
| 153 | 
            -
                   | 
| 154 | 
            -
                  a | 
| 155 | 
            -
                  a + serialized_name + serialized_value
         | 
| 246 | 
            +
                  a = []
         | 
| 247 | 
            +
                  a += serialize_safe_string(entity[:name])
         | 
| 248 | 
            +
                  a += serialize_safe_string(entity[:value])
         | 
| 249 | 
            +
                  serialize_int(a.size) + a
         | 
| 156 250 | 
             
                end
         | 
| 157 251 |  | 
| 158 252 | 
             
                # @param [Array] entities
         | 
| 159 253 | 
             
                # @return [Array]
         | 
| 160 254 | 
             
                def self.serialize_properties(entities)
         | 
| 161 | 
            -
                   | 
| 162 | 
            -
                  a[0] = entities.size
         | 
| 163 | 
            -
             | 
| 164 | 
            -
                  helper = {
         | 
| 255 | 
            +
                  order = {
         | 
| 165 256 | 
             
                    'divisibility'  => 1,
         | 
| 166 257 | 
             
                    'initialSupply' => 2,
         | 
| 167 258 | 
             
                    'supplyMutable' => 3,
         | 
| 168 259 | 
             
                    'transferable'  => 4
         | 
| 169 260 | 
             
                  }
         | 
| 170 | 
            -
                  a  | 
| 261 | 
            +
                  a = []
         | 
| 262 | 
            +
                  a = entities.sort_by { |ent| order[ent[:name]] }
         | 
| 171 263 | 
             
                    .map { |ent| serialize_property(ent) }.flatten
         | 
| 264 | 
            +
                  serialize_int(entities.size) + a
         | 
| 172 265 | 
             
                end
         | 
| 173 266 |  | 
| 174 267 | 
             
                # @param [Hash] entity
         | 
| 175 268 | 
             
                # @return [Array]
         | 
| 176 269 | 
             
                def self.serialize_levy(entity)
         | 
| 177 | 
            -
                  return [ | 
| 178 | 
            -
                  a = [] | 
| 179 | 
            -
                  a | 
| 180 | 
            -
                   | 
| 181 | 
            -
                   | 
| 182 | 
            -
                   | 
| 183 | 
            -
                  a  | 
| 184 | 
            -
                  a[0] = 4 + temp.size + serialized_mosaic_id.size + 8;
         | 
| 185 | 
            -
                  a
         | 
| 270 | 
            +
                  return [0, 0, 0, 0] if entity.nil?
         | 
| 271 | 
            +
                  a = []
         | 
| 272 | 
            +
                  a += serialize_int(entity[:type])
         | 
| 273 | 
            +
                  a += serialize_safe_string(entity[:recipient])
         | 
| 274 | 
            +
                  a += serialize_mosaic_id(entity[:mosaicId])
         | 
| 275 | 
            +
                  a += serialize_long(entity[:fee])
         | 
| 276 | 
            +
                  serialize_int(a.size) + a
         | 
| 186 277 | 
             
                end
         | 
| 187 278 |  | 
| 188 279 | 
             
                # @param [Hash] entity
         | 
| 189 280 | 
             
                # @return [Array]
         | 
| 190 281 | 
             
                def self.serialize_mosaic_definition(entity)
         | 
| 191 | 
            -
                  a = [] | 
| 282 | 
            +
                  a = []
         | 
| 192 283 | 
             
                  temp = hex2ua(entity[:creator])
         | 
| 193 | 
            -
                  a | 
| 284 | 
            +
                  a += serialize_int(temp.size)
         | 
| 194 285 | 
             
                  a += temp
         | 
| 195 286 | 
             
                  a += serialize_mosaic_id(entity[:id])
         | 
| 196 | 
            -
                   | 
| 197 | 
            -
                  a +=  | 
| 198 | 
            -
                  a +=  | 
| 199 | 
            -
                  a  | 
| 200 | 
            -
                  a
         | 
| 201 | 
            -
                end
         | 
| 202 | 
            -
             | 
| 203 | 
            -
                # @param [String] hex
         | 
| 204 | 
            -
                # @return [Array]
         | 
| 205 | 
            -
                # def self.hex2ua(hex)
         | 
| 206 | 
            -
                #   hex.scan(/../).map(&:hex)
         | 
| 207 | 
            -
                # end
         | 
| 208 | 
            -
                #
         | 
| 209 | 
            -
                def self.bin2words(bin, bin_size)
         | 
| 210 | 
            -
                    # temp = [];
         | 
| 211 | 
            -
                    # for (let i = 0; i < ua_size; i += 4) {
         | 
| 212 | 
            -
                    #     let x = ua[i] * 0x1000000 + (ua[i + 1] || 0) * 0x10000 + (ua[i + 2] || 0) * 0x100 + (ua[i + 3] || 0);
         | 
| 213 | 
            -
                    #     temp.push((x > 0x7fffffff) ? x - 0x100000000 : x);
         | 
| 214 | 
            -
                    # }
         | 
| 215 | 
            -
                    # CryptoJS.lib.WordArray.create(temp, ua_size);
         | 
| 287 | 
            +
                  a += serialize_bin_string(hex2ua(utf8_to_hex(entity[:description])))
         | 
| 288 | 
            +
                  a += serialize_properties(entity[:properties])
         | 
| 289 | 
            +
                  a += serialize_levy(entity[:levy])
         | 
| 290 | 
            +
                  serialize_int(a.size) + a
         | 
| 216 291 | 
             
                end
         | 
| 217 292 |  | 
| 218 293 | 
             
                # @param [String] hex
         | 
| @@ -253,21 +328,5 @@ module Nis::Util | |
| 253 328 | 
             
                    end
         | 
| 254 329 | 
             
                  end.flatten.map(&:chr).join
         | 
| 255 330 | 
             
                end
         | 
| 256 | 
            -
             | 
| 257 | 
            -
                def encode(sender_privkey, recipient_pubkey, message)
         | 
| 258 | 
            -
                  # sk = hex2ua(sender_privkey)
         | 
| 259 | 
            -
                  # pk = hex2ua(recipient_pubkey)
         | 
| 260 | 
            -
                  # let shared = new Uint8Array(32);
         | 
| 261 | 
            -
                  # let r = key_derive(shared, salt, sk, pk);
         | 
| 262 | 
            -
                  # let encKey = r;
         | 
| 263 | 
            -
                  # let encIv = {
         | 
| 264 | 
            -
                  #     iv: convert.bin2words(iv, 16)
         | 
| 265 | 
            -
                  # };
         | 
| 266 | 
            -
                  # let encrypted = CryptoJS.AES.encrypt(CryptoJS.enc.Hex.parse(convert.utf8ToHex(msg)), encKey, encIv);
         | 
| 267 | 
            -
                  #
         | 
| 268 | 
            -
                  salt = RbNaCl::Random.random_bytes(32)
         | 
| 269 | 
            -
                  iv   = RbNaCl::Random.random_bytes(16)
         | 
| 270 | 
            -
                  bin2hex(salt) + bin2hex(iv) # + CryptoJS.enc.Hex.stringify(encrypted.ciphertext)
         | 
| 271 | 
            -
                end
         | 
| 272 331 | 
             
              end
         | 
| 273 332 | 
             
            end
         | 
    
        data/lib/nis/version.rb
    CHANGED
    
    
    
        data/nis.gemspec
    CHANGED
    
    | @@ -25,6 +25,14 @@ Gem::Specification.new do |spec| | |
| 25 25 | 
             
              spec.executables   = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
         | 
| 26 26 | 
             
              spec.require_paths = ['lib']
         | 
| 27 27 |  | 
| 28 | 
            +
              spec.post_install_message = %q{
         | 
| 29 | 
            +
              <nis-ruby>
         | 
| 30 | 
            +
              Please see https://gitter.im/44uk/nis-ruby for the latest information.
         | 
| 31 | 
            +
              The gem is under development. Incompatible changes can be made.
         | 
| 32 | 
            +
              Feel free to ask and give feedback to https://twitter.com/44uk_i3
         | 
| 33 | 
            +
              Good luck! NEM application development!
         | 
| 34 | 
            +
              }
         | 
| 35 | 
            +
             | 
| 28 36 | 
             
              spec.add_development_dependency 'rake', '~> 10.0'
         | 
| 29 37 | 
             
              spec.add_development_dependency 'rspec', '~> 3.0'
         | 
| 30 38 | 
             
              spec.add_development_dependency 'yard', '~> 0.9'
         | 
    
        metadata
    CHANGED
    
    | @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: nis-ruby
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 0.0. | 
| 4 | 
            +
              version: 0.0.15
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Yoshiyuki Ieyama
         | 
| 8 8 | 
             
            autorequire: 
         | 
| 9 9 | 
             
            bindir: bin
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date: 2017- | 
| 11 | 
            +
            date: 2017-09-16 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 14 | 
             
              name: rake
         | 
| @@ -215,6 +215,7 @@ files: | |
| 215 215 | 
             
            - examples/transactions/transfer.rb
         | 
| 216 216 | 
             
            - examples/transactions/transfer_mosaic.rb
         | 
| 217 217 | 
             
            - examples/transactions/transfer_remote.rb
         | 
| 218 | 
            +
            - examples/util/deserialize.rb
         | 
| 218 219 | 
             
            - lib/nis.rb
         | 
| 219 220 | 
             
            - lib/nis/client.rb
         | 
| 220 221 | 
             
            - lib/nis/endpoint.rb
         | 
| @@ -352,7 +353,10 @@ licenses: | |
| 352 353 | 
             
            - MIT
         | 
| 353 354 | 
             
            metadata:
         | 
| 354 355 | 
             
              yard.run: yri
         | 
| 355 | 
            -
            post_install_message: 
         | 
| 356 | 
            +
            post_install_message: "\n  <nis-ruby>\n  Please see https://gitter.im/44uk/nis-ruby
         | 
| 357 | 
            +
              for the latest information.\n  The gem is under development. Incompatible changes
         | 
| 358 | 
            +
              can be made.\n  Feel free to ask and give feedback to https://twitter.com/44uk_i3\n
         | 
| 359 | 
            +
              \ Good luck! NEM application development!\n  "
         | 
| 356 360 | 
             
            rdoc_options: []
         | 
| 357 361 | 
             
            require_paths:
         | 
| 358 362 | 
             
            - lib
         |