glueby 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (43) hide show
  1. checksums.yaml +4 -4
  2. data/.ruby-gemset +1 -1
  3. data/.ruby-version +1 -1
  4. data/.travis.yml +3 -2
  5. data/README.md +27 -17
  6. data/glueby.gemspec +1 -1
  7. data/lib/generators/glueby/{initializer_generator.rb → contract/initializer_generator.rb} +0 -0
  8. data/lib/generators/glueby/contract/templates/initializer.rb.erb +3 -0
  9. data/lib/generators/glueby/contract/templates/key_table.rb.erb +15 -0
  10. data/lib/generators/glueby/{templates → contract/templates}/timestamp_table.rb.erb +2 -1
  11. data/lib/generators/glueby/contract/templates/utxo_table.rb.erb +15 -0
  12. data/lib/generators/glueby/contract/templates/wallet_table.rb.erb +10 -0
  13. data/lib/generators/glueby/contract/timestamp_generator.rb +26 -0
  14. data/lib/generators/glueby/contract/wallet_adapter_generator.rb +46 -0
  15. data/lib/glueby.rb +18 -1
  16. data/lib/glueby/contract.rb +3 -14
  17. data/lib/glueby/contract/active_record/timestamp.rb +8 -5
  18. data/lib/glueby/contract/errors.rb +6 -0
  19. data/lib/glueby/contract/payment.rb +54 -0
  20. data/lib/glueby/contract/timestamp.rb +39 -38
  21. data/lib/glueby/contract/token.rb +193 -0
  22. data/lib/glueby/contract/tx_builder.rb +197 -31
  23. data/lib/glueby/generator.rb +5 -0
  24. data/lib/glueby/generator/migrate_generator.rb +38 -0
  25. data/lib/glueby/internal.rb +6 -0
  26. data/lib/glueby/internal/rpc.rb +35 -0
  27. data/lib/glueby/internal/wallet.rb +122 -0
  28. data/lib/glueby/internal/wallet/abstract_wallet_adapter.rb +131 -0
  29. data/lib/glueby/internal/wallet/active_record.rb +15 -0
  30. data/lib/glueby/internal/wallet/active_record/key.rb +72 -0
  31. data/lib/glueby/internal/wallet/active_record/utxo.rb +50 -0
  32. data/lib/glueby/internal/wallet/active_record/wallet.rb +54 -0
  33. data/lib/glueby/internal/wallet/active_record_wallet_adapter.rb +133 -0
  34. data/lib/glueby/internal/wallet/errors.rb +11 -0
  35. data/lib/glueby/internal/wallet/tapyrus_core_wallet_adapter.rb +158 -0
  36. data/lib/glueby/version.rb +1 -1
  37. data/lib/glueby/wallet.rb +51 -0
  38. data/lib/tasks/glueby/contract/timestamp.rake +5 -5
  39. data/lib/tasks/glueby/contract/wallet_adapter.rake +42 -0
  40. metadata +30 -10
  41. data/lib/generators/glueby/templates/initializer.rb.erb +0 -4
  42. data/lib/generators/glueby/timestamp_generator.rb +0 -57
  43. data/lib/glueby/contract/rpc.rb +0 -15
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 593ee57bb01d23f91f508e851efa30d3fbbeda69232ebde715abc242fe609f02
4
- data.tar.gz: 6444c5e75e4fe70f3dca80c65546b340968577c0b7e7a82e21b5b8eb6836ab47
3
+ metadata.gz: d988a55f8acc63e5c2abb8f30ab88030a19c8e42212e372a8eeea6a2c5f3b27d
4
+ data.tar.gz: 9cee6ba595dd3ba576d1190350396a4c55923c58620a529ec0ff55cc4249b69b
5
5
  SHA512:
6
- metadata.gz: 899894c6b9e24800f562f6360ea00b568c8bd333dccfbde038e9cdff1c75f8fa10e27086737f2df5547710b401a455c5f9adb766a7a27a1b1dbbc9585df6e0d3
7
- data.tar.gz: bee37a6f3267f476a562f6c2d1c75424d549573d3fd4177b4a0811c1a866e87e7ac0f2f73fdca477814ee9d9fda797b0b6ba423ddd67efedca1ccdb987045022
6
+ metadata.gz: 610751093275239e15a70726033be9a3eb4ca65e65c1b86874f09471f4391fbc764463f76da36619b7429dac7c2b70b1f6596e2e3b2eacb397f11029018fb8e1
7
+ data.tar.gz: c48b89c3b4a61f652b051642420f1d8b3aa08ad3d90f8807ec8803f63d64e675a924a56990f42fc3d4201d6a90c99fa8101f423bbe66143ae735efdfae758cbf
data/.ruby-gemset CHANGED
@@ -1 +1 @@
1
- tapyrusrb
1
+ glueby
data/.ruby-version CHANGED
@@ -1 +1 @@
1
- 2.7.0
1
+ ruby-3.0.0
data/.travis.yml CHANGED
@@ -2,5 +2,6 @@
2
2
  language: ruby
3
3
  cache: bundler
4
4
  rvm:
5
- - 2.6.3
6
- before_install: gem install bundler -v 2.1.4
5
+ - 2.6.6
6
+ - 2.7.2
7
+ - 3.0.0
data/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # Glueby
1
+ # Glueby [![Build Status](https://travis-ci.org/chaintope/glueby.svg?branch=master)](https://travis-ci.org/chaintope/glueby) [![Gem Version](https://badge.fury.io/rb/glueby.svg)](https://badge.fury.io/rb/glueby) [![MIT License](http://img.shields.io/badge/license-MIT-blue.svg?style=flat)](LICENSE)
2
2
 
3
3
  Welcome to your new gem! In this directory, you'll find the files you need to be able to package up your Ruby library into a gem. Put your Ruby code in the file `lib/glueby`. To experiment with that code, run `bin/console` for an interactive prompt.
4
4
 
@@ -22,12 +22,19 @@ Or install it yourself as:
22
22
 
23
23
  ## Usage
24
24
 
25
+ Glueby has below features.
26
+
27
+ - [Timestamp](#Timestamp)
28
+
29
+ ### Timestamp
30
+
25
31
  ```ruby
26
32
 
27
- config = {schema: 'http', host: '127.0.0.1', port: 12381, user: 'user', password: 'pass'}
28
- Glueby::Contract::RPC.configure(config)
33
+ config = {adapter: 'core', schema: 'http', host: '127.0.0.1', port: 12381, user: 'user', password: 'pass'}
34
+ Glueby::Wallet.configure(config)
29
35
 
30
- timestamp = Glueby::Contract::Timestamp.new(content: "\x01\x02\x03")
36
+ wallet = Glueby::Wallet.create
37
+ timestamp = Glueby::Contract::Timestamp.new(wallet: wallet, content: "\x01\x02\x03")
31
38
  timestamp.save!
32
39
  # "a01eace94ce6cdc30f389609de8a7584a4e208ee82fec33a2f5875b7cee47097"
33
40
 
@@ -89,26 +96,28 @@ We can see the timestamp transaction using getrawblockchain command
89
96
  }
90
97
  ```
91
98
 
92
- ### Rails support
99
+ #### Rails support
93
100
 
94
- Gruby supports ruby on rails integration.
101
+ Glueby supports ruby on rails integration.
95
102
 
96
103
  To use in rails, Add dependency to Gemfile.
97
104
 
98
105
  Then invoke install task.
106
+
99
107
  ```
100
108
  bin/rails glueby:contract:install
101
109
  ```
102
110
 
103
111
  Install task creates a file `glueby.rb` in `config/initializers` directory like this.
112
+
104
113
  ```
105
- require 'tapyrus'
106
114
  # Edit configuration for connection to tapyrus core
107
- config = {schema: 'http', host: '127.0.0.1', port: 12381, user: 'user', password: 'pass'}
108
- Glueby::Contract::RPC.configure(config)
115
+ config = {adapter: 'core', schema: 'http', host: '127.0.0.1', port: 12381, user: 'user', password: 'pass'}
116
+ Glueby::Wallet.configure(config)
109
117
  ```
110
118
 
111
119
  If you use timestamp feature, use `glueby:contract:timestamp` generator.
120
+
112
121
  ```
113
122
  bin/rails g glueby:contract:timestamp
114
123
  create db/migrate/20200613065511_create_timestamp.rb
@@ -122,13 +131,15 @@ bin/rails db:migrate
122
131
  Now, Glueby::Contract::AR::Timestamp model is available
123
132
 
124
133
  ```ruby
125
- irb(main):001:0> t = Glueby::AR::Contract::Timestamp.new(content:"\x01010101", prefix: "app")
126
- (0.4ms) SELECT sqlite_version(*)
127
- => #<Glueby::AR::Contract::Timestamp id: nil, txid: nil, vout: nil, status: "init", content_hash: "9ccc644b03a88358a754962903a659a2d338767ee61674dde5...", prefix: "app">
128
- irb(main):002:0> t.save
134
+ irb(main):001:0> wallet = Glueby::Wallet.create
135
+ => #<Glueby::Wallet:0x00007fe8333f7d98 @internal_wallet=#<Glueby::Internal::Wallet:0x00007fe8333f7dc0 @id="70a58204a7f4cb10d973b762f17fdb4b">>
136
+ irb(main):003:0> t = Glueby::Contract::AR::Timestamp.new(wallet_id: wallet.id, content:"\x01010101", prefix: "app")
137
+ (0.5ms) SELECT sqlite_version(*)
138
+ => #<Glueby::Contract::AR::Timestamp id: nil, txid: nil, status: "init", content_hash: "9ccc644b03a88358a754962903a659a2d338767ee61674dde5...", prefix: "app", wallet_id: "70a58204a7f4cb10d973b762f17fdb4b">
139
+ irb(main):004:0> t.save
129
140
  (0.1ms) begin transaction
130
- Glueby::AR::Contract::Timestamp Create (0.7ms) INSERT INTO "timestamps" ("status", "content_hash", "prefix") VALUES (?, ?, ?) [["status", 0], ["content_hash", "9ccc644b03a88358a754962903a659a2d338767ee61674dde5434702a6256e6d"], ["prefix", "app"]]
131
- (2.3ms) commit transaction
141
+ Glueby::Contract::AR::Timestamp Create (0.4ms) INSERT INTO "timestamps" ("status", "content_hash", "prefix", "wallet_id") VALUES (?, ?, ?, ?) [["status", 0], ["content_hash", "9ccc644b03a88358a754962903a659a2d338767ee61674dde5434702a6256e6d"], ["prefix", "app"], ["wallet_id", "70a58204a7f4cb10d973b762f17fdb4b"]]
142
+ (2.1ms) commit transaction
132
143
  => true
133
144
  ```
134
145
 
@@ -140,12 +151,12 @@ broadcasted (id=1, txid=8d602ca8ebdd50fa70b5ee6bc6351965b614d0a4843adacf9f43fedd
140
151
  ```
141
152
 
142
153
  Run `glueby:contract:timestamp:confirm` task to confirm the transaction and update status(unconfirmed -> confirmded).
154
+
143
155
  ```
144
156
  bin/rails glueby:contract:timestamp:confirm
145
157
  confirmed (id=1, txid=8d602ca8ebdd50fa70b5ee6bc6351965b614d0a4843adacf9f43fedd7112fbf4)
146
158
  ```
147
159
 
148
-
149
160
  ## Development
150
161
 
151
162
  After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
@@ -156,7 +167,6 @@ To install this gem onto your local machine, run `bundle exec rake install`. To
156
167
 
157
168
  Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/glueby. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [code of conduct](https://github.com/[USERNAME]/tapyrus-contractrb/blob/master/CODE_OF_CONDUCT.md).
158
169
 
159
-
160
170
  ## License
161
171
 
162
172
  The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
data/glueby.gemspec CHANGED
@@ -26,7 +26,7 @@ Gem::Specification.new do |spec|
26
26
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
27
27
  spec.require_paths = ["lib"]
28
28
 
29
- spec.add_runtime_dependency 'tapyrus'
29
+ spec.add_runtime_dependency 'tapyrus', '>= 0.2.6'
30
30
  spec.add_development_dependency 'activerecord'
31
31
  spec.add_development_dependency 'sqlite3'
32
32
  end
@@ -0,0 +1,3 @@
1
+ # Edit configuration for connection to tapyrus core
2
+ config = {adapter: 'core', schema: 'http', host: '127.0.0.1', port: 12381, user: 'user', password: 'pass'}
3
+ Glueby::Wallet.configure(config)
@@ -0,0 +1,15 @@
1
+ class CreateKey < ActiveRecord::Migration<%= migration_version %>
2
+ def change
3
+ create_table :keys<%= table_options %> do |t|
4
+ t.string :private_key
5
+ t.string :public_key
6
+ t.string :script_pubkey
7
+ t.integer :purpose
8
+ t.belongs_to :wallet
9
+ t.timestamps
10
+ end
11
+
12
+ add_index :keys, [:script_pubkey], unique: true
13
+ add_index :keys, [:private_key], unique: true
14
+ end
15
+ end
@@ -5,6 +5,7 @@ class CreateTimestamp < ActiveRecord::Migration<%= migration_version %>
5
5
  t.integer :status
6
6
  t.string :content_hash
7
7
  t.string :prefix
8
+ t.string :wallet_id
8
9
  end
9
10
  end
10
- end
11
+ end
@@ -0,0 +1,15 @@
1
+ class CreateUtxo < ActiveRecord::Migration<%= migration_version %>
2
+ def change
3
+ create_table :utxos<%= table_options %> do |t|
4
+ t.string :txid
5
+ t.integer :index
6
+ t.bigint :value
7
+ t.string :script_pubkey
8
+ t.integer :status
9
+ t.belongs_to :key, null: true
10
+ t.timestamps
11
+ end
12
+
13
+ add_index :utxos, [:txid, :index], unique: true
14
+ end
15
+ end
@@ -0,0 +1,10 @@
1
+ class CreateWallet < ActiveRecord::Migration<%= migration_version %>
2
+ def change
3
+ create_table :wallets<%= table_options %> do |t|
4
+ t.string :wallet_id
5
+ t.timestamps
6
+ end
7
+
8
+ add_index :wallets, [:wallet_id], unique: true
9
+ end
10
+ end
@@ -0,0 +1,26 @@
1
+ module Glueby
2
+ module Contract
3
+ class TimestampGenerator < Rails::Generators::Base
4
+ include ::Rails::Generators::Migration
5
+ include Glueby::Generator::MigrateGenerator
6
+ extend Glueby::Generator::MigrateGenerator::ClassMethod
7
+
8
+ source_root File.expand_path('templates', __dir__)
9
+
10
+ def create_migration_file
11
+ migration_dir = File.expand_path("db/migrate")
12
+
13
+ if self.class.migration_exists?(migration_dir, "create_timestamp")
14
+ ::Kernel.warn "Migration already exists: create_timestamp"
15
+ else
16
+ migration_template(
17
+ "timestamp_table.rb.erb",
18
+ "db/migrate/create_timestamp.rb",
19
+ migration_version: migration_version,
20
+ table_options: table_options,
21
+ )
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,46 @@
1
+ module Glueby
2
+ module Contract
3
+ class WalletAdapterGenerator < Rails::Generators::Base
4
+ include ::Rails::Generators::Migration
5
+ include Glueby::Generator::MigrateGenerator
6
+ extend Glueby::Generator::MigrateGenerator::ClassMethod
7
+
8
+ source_root File.expand_path('templates', __dir__)
9
+
10
+ def create_migration_file
11
+ migration_dir = File.expand_path("db/migrate")
12
+
13
+ if self.class.migration_exists?(migration_dir, "create_wallet")
14
+ ::Kernel.warn "Migration already exists: create_wallet"
15
+ else
16
+ migration_template(
17
+ "wallet_table.rb.erb",
18
+ "db/migrate/create_wallet.rb",
19
+ migration_version: migration_version,
20
+ table_options: table_options,
21
+ )
22
+ end
23
+ if self.class.migration_exists?(migration_dir, "create_key")
24
+ ::Kernel.warn "Migration already exists: create_key"
25
+ else
26
+ migration_template(
27
+ "key_table.rb.erb",
28
+ "db/migrate/create_key.rb",
29
+ migration_version: migration_version,
30
+ table_options: table_options,
31
+ )
32
+ end
33
+ if self.class.migration_exists?(migration_dir, "create_utxo")
34
+ ::Kernel.warn "Migration already exists: create_utxo"
35
+ else
36
+ migration_template(
37
+ "utxo_table.rb.erb",
38
+ "db/migrate/create_utxo.rb",
39
+ migration_version: migration_version,
40
+ table_options: table_options,
41
+ )
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
data/lib/glueby.rb CHANGED
@@ -1,5 +1,22 @@
1
1
  require "glueby/version"
2
+ require 'tapyrus'
2
3
 
3
4
  module Glueby
4
5
  autoload :Contract, 'glueby/contract'
5
- end
6
+ autoload :Generator, 'glueby/generator'
7
+ autoload :Wallet, 'glueby/wallet'
8
+ autoload :Internal, 'glueby/internal'
9
+
10
+ begin
11
+ class Railtie < ::Rails::Railtie
12
+ rake_tasks do
13
+ load "tasks/glueby/contract.rake"
14
+ load "tasks/glueby/contract/timestamp.rake"
15
+ load "tasks/glueby/contract/wallet_adapter.rake"
16
+ end
17
+ end
18
+ rescue
19
+ # Rake task is unavailable
20
+ puts "Rake task is unavailable"
21
+ end
22
+ end
@@ -3,22 +3,11 @@ module Glueby
3
3
  autoload :Errors, 'glueby/contract/errors'
4
4
  autoload :FeeProvider, 'glueby/contract/fee_provider'
5
5
  autoload :FixedFeeProvider, 'glueby/contract/fee_provider'
6
- autoload :RPC, 'glueby/contract/rpc'
6
+ autoload :Payment, 'glueby/contract/payment'
7
7
  autoload :Timestamp, 'glueby/contract/timestamp'
8
+ autoload :Token, 'glueby/contract/token'
8
9
  autoload :TxBuilder, 'glueby/contract/tx_builder'
9
- autoload :WalletFeature, 'glueby/contract/wallet_feature'
10
10
  autoload :AR, 'glueby/contract/active_record'
11
-
12
- begin
13
- class Railtie < ::Rails::Railtie
14
- rake_tasks do
15
- load "tasks/glueby/contract.rake"
16
- load "tasks/glueby/contract/timestamp.rake"
17
- end
18
- end
19
- rescue
20
- # Rake task is unavailable
21
- puts "Rake task is unavailable"
22
- end
11
+ autoload :Wallet, 'glueby/contract/wallet'
23
12
  end
24
13
  end
@@ -5,11 +5,14 @@ module Glueby
5
5
  include Glueby::Contract::Timestamp::Util
6
6
  enum status: { init: 0, unconfirmed: 1, confirmed: 2 }
7
7
 
8
- # @param [String] content Data to be hashed and stored in blockchain.
9
- # @param [String] prefix prefix of op_return data
10
- def initialize(content:, prefix: '')
11
- @content_hash = Tapyrus.sha256(content).bth
12
- super(content_hash: @content_hash, prefix: prefix, status: :init)
8
+ # @param [Hash] attributes attributes which consist of:
9
+ # - wallet_id
10
+ # - content
11
+ # - prefix(optional)
12
+ def initialize(attributes = nil)
13
+ @content_hash = Tapyrus.sha256(attributes[:content]).bth
14
+ super(wallet_id: attributes[:wallet_id], content_hash: @content_hash,
15
+ prefix: attributes[:prefix] ? attributes[:prefix] : '', status: :init)
13
16
  end
14
17
  end
15
18
  end
@@ -2,7 +2,13 @@ module Glueby
2
2
  module Contract
3
3
  module Errors
4
4
  class InsufficientFunds < StandardError; end
5
+ class InsufficientTokens < StandardError; end
6
+ class InvalidAmount < StandardError; end
7
+ class InvalidTokenType < StandardError; end
5
8
  class TxAlreadyBroadcasted < StandardError; end
9
+ class UnsupportedTokenType < StandardError; end
10
+ class UnknownScriptPubkey < StandardError; end
11
+ class UnsupportedDigestType < StandardError; end
6
12
  end
7
13
  end
8
14
  end
@@ -0,0 +1,54 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Glueby
4
+ module Contract
5
+ # This class can send TPC between wallets.
6
+ #
7
+ # Examples:
8
+ #
9
+ # sender = Glueby::Wallet.load("wallet_id")
10
+ # receiver = Glueby::Wallet.load("wallet_id")
11
+ # or
12
+ # Glueby::Wallet.create
13
+ #
14
+ # Balance of sender and receiver before send
15
+ # sender.balances[""]
16
+ # => 100_000(tapyrus)
17
+ # receiver.balances[""]
18
+ # => 0(tapyrus)
19
+ #
20
+ # Send
21
+ # Payment.transfer(sender: sender, receiver: receiver, amount: 10_000)
22
+ # sender.balances[""]
23
+ # => 90_000
24
+ # receiver.balances[""]
25
+ # => 10_000
26
+ #
27
+ class Payment
28
+ extend Glueby::Contract::TxBuilder
29
+
30
+ class << self
31
+ def transfer(sender:, receiver:, amount:, fee_provider: FixedFeeProvider.new)
32
+ raise Glueby::Contract::Errors::InvalidAmount unless amount.positive?
33
+
34
+ tx = Tapyrus::Tx.new
35
+ dummy_fee = fee_provider.fee(dummy_tx(tx))
36
+
37
+ sum, outputs = sender.internal_wallet.collect_uncolored_outputs(dummy_fee + amount)
38
+ fill_input(tx, outputs)
39
+
40
+ receiver_script = Tapyrus::Script.parse_from_addr(receiver.internal_wallet.receive_address)
41
+ tx.outputs << Tapyrus::TxOut.new(value: amount, script_pubkey: receiver_script)
42
+
43
+ fee = fee_provider.fee(tx)
44
+
45
+ fill_change_tpc(tx, sender, sum - fee - amount)
46
+
47
+ tx = sender.internal_wallet.sign_tx(tx)
48
+
49
+ Glueby::Internal::RPC.client.sendrawtransaction(tx.to_hex)
50
+ end
51
+ end
52
+ end
53
+ end
54
+ end
@@ -11,59 +11,37 @@ module Glueby
11
11
  include Glueby::Contract::TxBuilder
12
12
 
13
13
  module Util
14
+ include Glueby::Internal::Wallet::TapyrusCoreWalletAdapter::Util
14
15
  module_function
15
16
 
16
- def create_tx(prefix, data_hash, fee_provider)
17
+ def create_tx(wallet, prefix, data, fee_provider)
17
18
  tx = Tapyrus::Tx.new
18
- tx.outputs << Tapyrus::TxOut.new(value: 0, script_pubkey: create_script(prefix, data_hash))
19
+ tx.outputs << Tapyrus::TxOut.new(value: 0, script_pubkey: create_script(prefix, data))
19
20
 
20
- results = list_unspent
21
- fee = fee_provider.fee(tx)
22
- sum, outputs = collect_outputs(results, fee)
21
+ fee = fee_provider.fee(dummy_tx(tx))
22
+ sum, outputs = wallet.internal_wallet.collect_uncolored_outputs(fee)
23
23
  fill_input(tx, outputs)
24
24
 
25
- change_script = create_change_script
26
- fill_change_output(tx, fee, change_script, sum)
27
- tx
25
+ fill_change_tpc(tx, wallet, sum - fee)
26
+ wallet.internal_wallet.sign_tx(tx)
28
27
  end
29
28
 
30
- def create_payload(prefix, data_hash)
29
+ def create_payload(prefix, data)
31
30
  payload = +''
32
31
  payload << prefix
33
- payload << data_hash
32
+ payload << data
34
33
  payload
35
34
  end
36
35
 
37
- def create_script(prefix, data_hash)
36
+ def create_script(prefix, data)
38
37
  script = Tapyrus::Script.new
39
38
  script << Tapyrus::Script::OP_RETURN
40
- script << create_payload(prefix, data_hash)
39
+ script << create_payload(prefix, data)
41
40
  script
42
41
  end
43
42
 
44
- def create_change_script
45
- address = Glueby::Contract::RPC.client.getnewaddress
46
- decoded = Tapyrus.decode_base58_address(address)
47
- Tapyrus::Script.to_p2pkh(decoded[0])
48
- end
49
-
50
- def sign_tx(tx)
51
- # TODO: Implement SignatureProvider
52
- response = Glueby::Contract::RPC.client.signrawtransactionwithwallet(tx.to_payload.bth)
53
- Tapyrus::Tx.parse_from_payload(response['hex'].htb)
54
- end
55
-
56
- def list_unspent
57
- # TODO: Implement UtxoProvider
58
- Glueby::Contract::RPC.client.listunspent(0, 999_999)
59
- end
60
-
61
- def broadcast_tx(tx)
62
- Glueby::Contract::RPC.client.sendrawtransaction(tx.to_payload.bth)
63
- end
64
-
65
43
  def get_transaction(tx)
66
- Glueby::Contract::RPC.client.getrawtransaction(tx.txid, 1)
44
+ Glueby::Internal::RPC.client.getrawtransaction(tx.txid, 1)
67
45
  end
68
46
  end
69
47
  include Glueby::Contract::Timestamp::Util
@@ -73,14 +51,23 @@ module Glueby
73
51
  # @param [String] content Data to be hashed and stored in blockchain.
74
52
  # @param [String] prefix prefix of op_return data
75
53
  # @param [Glueby::Contract::FeeProvider] fee_provider
54
+ # @param [Symbol] digest type which select of:
55
+ # - :sha256
56
+ # - :double_sha256
57
+ # - :none
58
+ # @raise [Glueby::Contract::Errors::UnsupportedDigestType] if digest unsupport
76
59
  def initialize(
60
+ wallet:,
77
61
  content:,
78
62
  prefix: '',
79
- fee_provider: Glueby::Contract::FixedFeeProvider.new
63
+ fee_provider: Glueby::Contract::FixedFeeProvider.new,
64
+ digest: :sha256
80
65
  )
66
+ @wallet = wallet
81
67
  @content = content
82
68
  @prefix = prefix
83
69
  @fee_provider = fee_provider
70
+ @digest = digest
84
71
  end
85
72
 
86
73
  # broadcast to Tapyrus Core
@@ -90,9 +77,23 @@ module Glueby
90
77
  def save!
91
78
  raise Glueby::Contract::Errors::TxAlreadyBroadcasted if @txid
92
79
 
93
- @tx = create_tx(@prefix, Tapyrus.sha256(@content), @fee_provider)
94
- @tx = sign_tx(@tx)
95
- @txid = broadcast_tx(@tx)
80
+ @tx = create_tx(@wallet, @prefix, digest_content, @fee_provider)
81
+ @txid = @wallet.internal_wallet.broadcast(@tx)
82
+ end
83
+
84
+ private
85
+
86
+ def digest_content
87
+ case @digest&.downcase
88
+ when :sha256
89
+ Tapyrus.sha256(@content)
90
+ when :double_sha256
91
+ Tapyrus.double_sha256(@content)
92
+ when :none
93
+ @content
94
+ else
95
+ raise Glueby::Contract::Errors::UnsupportedDigestType
96
+ end
96
97
  end
97
98
  end
98
99
  end