glueby 0.6.1 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2b053cde5755947020d018939a4efa0a042e830232aff3e4d2a4a4a9b53caa54
4
- data.tar.gz: 5fcfb3f983b687f6942901d7f56c9f70a5123b97e0f5eb313d3a011632824f76
3
+ metadata.gz: 165b5d6b9fc1cfae9bb7ba852632a0f099ef356bcb52fe0a9937b2c2d1289b51
4
+ data.tar.gz: 6d1a3b9cc1c3668a40ce11920af51cb8af8fc9d94163e43eca295a40d48889f0
5
5
  SHA512:
6
- metadata.gz: 440cd7203e5d411dc0aca3571e2eaa14b2c2ef85ca97d9ed60c7b9099d206dc9d4fbaa4dfb65190ddcc9fc71bbb57555abc42cde5cf2d3319fa4c8c18f3b70cf
7
- data.tar.gz: 4dac9b8cb1a8a6670e8ee0458f467c66c91994b103e8d9513bbbfb926c27f9b0541de4bdfe12085edb58b1ac9f761775abf88f3dcb93ab43f9ba17ad0c96f840
6
+ metadata.gz: d7d6f4cf39f9b2c4580d1360817baa960bf72fe77075a038a7784b2f9191bb0cb9925c27d8b697c5d0a75e0d0bc31d35cfda14e3a88e18da88dba09e38aa5246
7
+ data.tar.gz: 691dd9cec6eb183f537c70efab553bd9224bea93fe21da6cb8ce2afea14549e74bd02fa8e73dd3518703b6b390f217d0b02ad3d85649b8eea4e6b6583c1fd196
@@ -0,0 +1,4 @@
1
+ module Glueby
2
+ # The minimum limit of transaction output value to avoid to be recognized as a dust output.
3
+ DUST_LIMIT = 600
4
+ end
@@ -2,7 +2,10 @@ module Glueby
2
2
  module Contract
3
3
  module AR
4
4
  class Timestamp < ::ActiveRecord::Base
5
+ include Glueby::GluebyLogger
5
6
  include Glueby::Contract::Timestamp::Util
7
+ include Glueby::Contract::TxBuilder
8
+
6
9
  enum status: { init: 0, unconfirmed: 1, confirmed: 2 }
7
10
  enum timestamp_type: { simple: 0, trackable: 1 }
8
11
 
@@ -21,6 +24,33 @@ module Glueby
21
24
  def latest
22
25
  trackable?
23
26
  end
27
+
28
+ # Broadcast and save timestamp
29
+ # @param [Glueby::Contract::FixedFeeEstimator] fee_estimator
30
+ # @return true if tapyrus transactions were broadcasted and the timestamp was updated successfully, otherwise false.
31
+ def save_with_broadcast(fee_estimator: Glueby::Contract::FixedFeeEstimator.new)
32
+ utxo_provider = Glueby::UtxoProvider.new if Glueby.configuration.use_utxo_provider?
33
+ wallet = Glueby::Wallet.load(wallet_id)
34
+ funding_tx, tx, p2c_address, payment_base = create_txs(wallet, prefix, content_hash, fee_estimator, utxo_provider, type: timestamp_type.to_sym)
35
+ if funding_tx
36
+ ::ActiveRecord::Base.transaction(joinable: false, requires_new: true) do
37
+ wallet.internal_wallet.broadcast(funding_tx)
38
+ logger.info("funding tx was broadcasted(id=#{id}, funding_tx.txid=#{funding_tx.txid})")
39
+ end
40
+ end
41
+ ::ActiveRecord::Base.transaction(joinable: false, requires_new: true) do
42
+ wallet.internal_wallet.broadcast(tx) do |tx|
43
+ assign_attributes(txid: tx.txid, status: :unconfirmed, p2c_address: p2c_address, payment_base: payment_base)
44
+ save!
45
+ end
46
+ logger.info("timestamp tx was broadcasted (id=#{id}, txid=#{tx.txid})")
47
+ end
48
+ true
49
+ rescue => e
50
+ logger.error("failed to broadcast (id=#{id}, reason=#{e.message})")
51
+ errors.add(:base, "failed to broadcast (id=#{id}, reason=#{e.message})")
52
+ false
53
+ end
24
54
  end
25
55
  end
26
56
  end
@@ -22,6 +22,8 @@ module Glueby
22
22
  class FixedFeeEstimator
23
23
  include FeeEstimator
24
24
 
25
+ attr_reader :fixed_fee
26
+
25
27
  class << self
26
28
  attr_accessor :default_fixed_fee
27
29
  end
@@ -19,9 +19,8 @@ module Glueby
19
19
  module_function
20
20
 
21
21
  # @param [Glueby::Wallet] wallet
22
- # @param [Array] data The data to be used for generating pay-to-contract address
23
- # @return [Array(String, String)]
24
- # Return (pay-to-contract address, public key used for generating address)
22
+ # @param [Array] contents The data to be used for generating pay-to-contract address
23
+ # @return [pay-to-contract address, public key used for generating address]
25
24
  def create_pay_to_contract_address(wallet, contents: nil)
26
25
  pubkey = wallet.internal_wallet.create_pubkey.pubkey
27
26
  # Calculate P + H(P || contents)G
@@ -80,8 +80,7 @@ module Glueby
80
80
  private
81
81
 
82
82
  def issue_reissuable_token(issuer:, amount:)
83
- utxo_provider = Glueby::UtxoProvider.new if Glueby.configuration.use_utxo_provider?
84
- funding_tx = create_funding_tx(wallet: issuer, utxo_provider: utxo_provider)
83
+ funding_tx = create_funding_tx(wallet: issuer)
85
84
  script_pubkey = funding_tx.outputs.first.script_pubkey
86
85
  color_id = Tapyrus::Color::ColorIdentifier.reissuable(script_pubkey)
87
86
 
@@ -97,8 +96,7 @@ module Glueby
97
96
  end
98
97
 
99
98
  def issue_non_reissuable_token(issuer:, amount:)
100
- utxo_provider = Glueby::UtxoProvider.new if Glueby.configuration.use_utxo_provider?
101
- funding_tx = create_funding_tx(wallet: issuer, utxo_provider: utxo_provider) if utxo_provider
99
+ funding_tx = create_funding_tx(wallet: issuer) if Glueby.configuration.use_utxo_provider?
102
100
  funding_tx = issuer.internal_wallet.broadcast(funding_tx) if funding_tx
103
101
 
104
102
  tx = create_issue_tx_for_non_reissuable_token(funding_tx: funding_tx, issuer: issuer, amount: amount)
@@ -114,8 +112,7 @@ module Glueby
114
112
  end
115
113
 
116
114
  def issue_nft_token(issuer:)
117
- utxo_provider = Glueby::UtxoProvider.new if Glueby.configuration.use_utxo_provider?
118
- funding_tx = create_funding_tx(wallet: issuer, utxo_provider: utxo_provider) if utxo_provider
115
+ funding_tx = create_funding_tx(wallet: issuer) if Glueby.configuration.use_utxo_provider?
119
116
  funding_tx = issuer.internal_wallet.broadcast(funding_tx) if funding_tx
120
117
 
121
118
  tx = create_issue_tx_for_nft_token(funding_tx: funding_tx, issuer: issuer)
@@ -145,10 +142,9 @@ module Glueby
145
142
  def reissue!(issuer:, amount:)
146
143
  raise Glueby::Contract::Errors::InvalidAmount unless amount.positive?
147
144
  raise Glueby::Contract::Errors::InvalidTokenType unless token_type == Tapyrus::Color::TokenTypes::REISSUABLE
148
- utxo_provider = Glueby::UtxoProvider.new if Glueby.configuration.use_utxo_provider?
149
145
 
150
146
  if validate_reissuer(wallet: issuer)
151
- funding_tx = create_funding_tx(wallet: issuer, script: @script_pubkey, utxo_provider: utxo_provider)
147
+ funding_tx = create_funding_tx(wallet: issuer, script: @script_pubkey)
152
148
  funding_tx = issuer.internal_wallet.broadcast(funding_tx)
153
149
  tx = create_reissue_tx(funding_tx: funding_tx, issuer: issuer, amount: amount, color_id: color_id)
154
150
  tx = issuer.internal_wallet.broadcast(tx)
@@ -171,8 +167,7 @@ module Glueby
171
167
  def transfer!(sender:, receiver_address:, amount: 1)
172
168
  raise Glueby::Contract::Errors::InvalidAmount unless amount.positive?
173
169
 
174
- utxo_provider = Glueby::UtxoProvider.new if Glueby.configuration.use_utxo_provider?
175
- funding_tx = create_funding_tx(wallet: sender, utxo_provider: utxo_provider) if utxo_provider
170
+ funding_tx = create_funding_tx(wallet: sender) if Glueby.configuration.use_utxo_provider?
176
171
  funding_tx = sender.internal_wallet.broadcast(funding_tx) if funding_tx
177
172
 
178
173
  tx = create_transfer_tx(funding_tx: funding_tx, color_id: color_id, sender: sender, receiver_address: receiver_address, amount: amount)
@@ -180,6 +175,26 @@ module Glueby
180
175
  [color_id, tx]
181
176
  end
182
177
 
178
+ # Send the tokens to multiple wallets
179
+ #
180
+ # @param sender [Glueby::Wallet] wallet to send this token
181
+ # @param receivers [Array<Hash>] array of hash, which keys are :address and :amount
182
+ # @return [Array<String, tx>] Tuple of color_id and tx object
183
+ # @raise [InsufficientFunds] if wallet does not have enough TPC to send transaction.
184
+ # @raise [InsufficientTokens] if wallet does not have enough token to send.
185
+ # @raise [InvalidAmount] if amount is not positive integer.
186
+ def multi_transfer!(sender:, receivers:)
187
+ receivers.each do |r|
188
+ raise Glueby::Contract::Errors::InvalidAmount unless r[:amount].positive?
189
+ end
190
+ funding_tx = create_funding_tx(wallet: sender) if Glueby.configuration.use_utxo_provider?
191
+ funding_tx = sender.internal_wallet.broadcast(funding_tx) if funding_tx
192
+
193
+ tx = create_multi_transfer_tx(funding_tx: funding_tx, color_id: color_id, sender: sender, receivers: receivers)
194
+ sender.internal_wallet.broadcast(tx)
195
+ [color_id, tx]
196
+ end
197
+
183
198
  # Burn token
184
199
  # If amount is not specified or 0, burn all token associated with the wallet.
185
200
  #
@@ -190,9 +205,24 @@ module Glueby
190
205
  # @raise [InvalidAmount] if amount is not positive integer.
191
206
  def burn!(sender:, amount: 0)
192
207
  raise Glueby::Contract::Errors::InvalidAmount unless amount.positive?
208
+ balance = sender.balances[color_id.to_hex]
209
+ raise Glueby::Contract::Errors::InsufficientTokens unless balance
210
+ raise Glueby::Contract::Errors::InsufficientTokens if balance < amount
211
+
212
+ burn_all_amount_flag = true if balance - amount == 0
193
213
 
194
214
  utxo_provider = Glueby::UtxoProvider.new if Glueby.configuration.use_utxo_provider?
195
- funding_tx = create_funding_tx(wallet: sender, utxo_provider: utxo_provider) if utxo_provider
215
+ if utxo_provider
216
+ funding_tx = create_funding_tx(
217
+ wallet: sender,
218
+ # When it burns all the amount of the color id, burn tx is not going to be have any output
219
+ # because change outputs is not necessary. Transactions needs one output at least.
220
+ # At that time, set true to this option to get more value to be created change output to
221
+ # the tx.
222
+ need_value_for_change_output: burn_all_amount_flag
223
+ )
224
+ end
225
+
196
226
  funding_tx = sender.internal_wallet.broadcast(funding_tx) if funding_tx
197
227
 
198
228
  tx = create_burn_tx(funding_tx: funding_tx, color_id: color_id, sender: sender, amount: amount)
@@ -3,24 +3,22 @@
3
3
  module Glueby
4
4
  module Contract
5
5
  module TxBuilder
6
- # The amount of output in funding tx for Reissuable token.
7
- FUNDING_TX_AMOUNT = 10_000
8
-
9
6
  def receive_address(wallet:)
10
7
  wallet.receive_address
11
8
  end
12
9
 
13
10
  # Create new public key, and new transaction that sends TPC to it
14
- def create_funding_tx(wallet:, script: nil, fee_estimator: FixedFeeEstimator.new, utxo_provider: nil)
15
- if utxo_provider
11
+ def create_funding_tx(wallet:, script: nil, fee_estimator: FixedFeeEstimator.new, need_value_for_change_output: false)
12
+ if Glueby.configuration.use_utxo_provider?
13
+ utxo_provider = UtxoProvider.new
16
14
  script_pubkey = script ? script : Tapyrus::Script.parse_from_addr(wallet.internal_wallet.receive_address)
17
- funding_tx, _index = utxo_provider.get_utxo(script_pubkey, FUNDING_TX_AMOUNT)
15
+ funding_tx, _index = utxo_provider.get_utxo(script_pubkey, funding_tx_amount(need_value_for_change_output: need_value_for_change_output))
18
16
  utxo_provider.wallet.sign_tx(funding_tx)
19
17
  else
20
18
  txb = Tapyrus::TxBuilder.new
21
19
  fee = fee_estimator.fee(dummy_tx(txb.build))
22
20
 
23
- sum, outputs = wallet.internal_wallet.collect_uncolored_outputs(fee + FUNDING_TX_AMOUNT)
21
+ sum, outputs = wallet.internal_wallet.collect_uncolored_outputs(fee + funding_tx_amount(need_value_for_change_output: need_value_for_change_output))
24
22
  outputs.each do |utxo|
25
23
  txb.add_utxo({
26
24
  script_pubkey: Tapyrus::Script.parse_from_payload(utxo[:script_pubkey].htb),
@@ -31,7 +29,7 @@ module Glueby
31
29
  end
32
30
 
33
31
  receiver_address = script ? script.addresses.first : wallet.internal_wallet.receive_address
34
- tx = txb.pay(receiver_address, FUNDING_TX_AMOUNT)
32
+ tx = txb.pay(receiver_address, funding_tx_amount)
35
33
  .change_address(wallet.internal_wallet.change_address)
36
34
  .fee(fee)
37
35
  .build
@@ -135,15 +133,23 @@ module Glueby
135
133
  end
136
134
 
137
135
  def create_transfer_tx(funding_tx:nil, color_id:, sender:, receiver_address:, amount:, fee_estimator: FixedFeeEstimator.new)
136
+ receivers = [{ address: receiver_address, amount: amount }]
137
+ create_multi_transfer_tx(funding_tx: funding_tx, color_id: color_id, sender: sender, receivers: receivers, fee_estimator: fee_estimator)
138
+ end
139
+
140
+ def create_multi_transfer_tx(funding_tx:nil, color_id:, sender:, receivers:, fee_estimator: FixedFeeEstimator.new)
138
141
  tx = Tapyrus::Tx.new
139
142
 
143
+ amount = receivers.reduce(0) { |sum, r| sum + r[:amount].to_i }
140
144
  utxos = sender.internal_wallet.list_unspent
141
145
  sum_token, outputs = collect_colored_outputs(utxos, color_id, amount)
142
146
  fill_input(tx, outputs)
143
147
 
144
- receiver_script = Tapyrus::Script.parse_from_addr(receiver_address)
145
- receiver_colored_script = receiver_script.add_color(color_id)
146
- tx.outputs << Tapyrus::TxOut.new(value: amount, script_pubkey: receiver_colored_script)
148
+ receivers.each do |r|
149
+ receiver_script = Tapyrus::Script.parse_from_addr(r[:address])
150
+ receiver_colored_script = receiver_script.add_color(color_id)
151
+ tx.outputs << Tapyrus::TxOut.new(value: r[:amount].to_i, script_pubkey: receiver_colored_script)
152
+ end
147
153
 
148
154
  fill_change_token(tx, sender, sum_token - amount, color_id)
149
155
 
@@ -189,8 +195,7 @@ module Glueby
189
195
  tx.inputs << Tapyrus::TxIn.new(out_point: out_point)
190
196
  funding_tx.outputs.first.value
191
197
  else
192
- dust = 600 # in case that the wallet has output which has just fee amount.
193
- sum_tpc, outputs = sender.internal_wallet.collect_uncolored_outputs(fee + dust)
198
+ sum_tpc, outputs = sender.internal_wallet.collect_uncolored_outputs(fee + DUST_LIMIT)
194
199
  fill_input(tx, outputs)
195
200
  sum_tpc
196
201
  end
@@ -220,7 +225,12 @@ module Glueby
220
225
  def fill_change_tpc(tx, wallet, change)
221
226
  return unless change.positive?
222
227
 
223
- change_script = Tapyrus::Script.parse_from_addr(wallet.internal_wallet.change_address)
228
+ if Glueby.configuration.use_utxo_provider?
229
+ change_script = Tapyrus::Script.parse_from_addr(UtxoProvider.new.wallet.change_address)
230
+ else
231
+ change_script = Tapyrus::Script.parse_from_addr(wallet.internal_wallet.change_address)
232
+ end
233
+
224
234
  tx.outputs << Tapyrus::TxOut.new(value: change, script_pubkey: change_script)
225
235
  end
226
236
 
@@ -278,6 +288,21 @@ module Glueby
278
288
  tx.outputs << Tapyrus::TxOut.new(value: 0, script_pubkey: receiver_colored_script)
279
289
  dummy_tx(tx)
280
290
  end
291
+
292
+ private
293
+
294
+ # The amount of output in funding tx
295
+ # It returns same amount with FixedFeeEstimator's fixed fee. Because it is enough for paying fee for consumer
296
+ # transactions of the funding transactions.
297
+ #
298
+ # @option [Boolean] need_value_for_change_output If it is true, adds more value than the fee for producing change output.
299
+ def funding_tx_amount(need_value_for_change_output: false)
300
+ if need_value_for_change_output
301
+ FixedFeeEstimator.new.fixed_fee + DUST_LIMIT
302
+ else
303
+ FixedFeeEstimator.new.fixed_fee
304
+ end
305
+ end
281
306
  end
282
307
  end
283
308
  end
@@ -29,7 +29,6 @@ module Glueby
29
29
  return if utxos.empty?
30
30
 
31
31
  utxos.each { |utxo| txb.add_utxo(utxo) }
32
- address = wallet.receive_address
33
32
 
34
33
  shortage = [utxo_provider.utxo_pool_size - current_utxo_pool_size, 0].max
35
34
  return if shortage == 0
@@ -65,7 +64,7 @@ module Glueby
65
64
  message = <<~MESSAGE
66
65
  1. Please replenishment TPC which is for paying tpc to UtxoProvider.
67
66
  UtxoProvider needs #{value_to_fill_utxo_pool} tapyrus in UTXO pool.
68
- UtxoProvider wallet's address is '#{wallet.receive_address}'
67
+ UtxoProvider wallet's address is '#{address}'
69
68
  2. Then create UTXOs for paying in UTXO pool with 'rake glueby:utxo_provider:manage_utxo_pool'
70
69
  MESSAGE
71
70
  else
@@ -88,7 +87,7 @@ module Glueby
88
87
 
89
88
  # Show the address of Utxo Provider
90
89
  def print_address
91
- puts wallet.receive_address
90
+ puts address
92
91
  end
93
92
 
94
93
  private
@@ -130,6 +129,10 @@ module Glueby
130
129
  def delimit(num)
131
130
  num.to_s.reverse.scan(/.{1,3}/).join('_').reverse
132
131
  end
132
+
133
+ def address
134
+ @address ||= wallet.get_addresses.first || wallet.receive_address
135
+ end
133
136
  end
134
137
  end
135
138
  end
@@ -44,7 +44,7 @@ module Glueby
44
44
 
45
45
  fee = fee_estimator.fee(dummy_tx(txb.build))
46
46
  # The outputs need to be shuffled so that no utxos are spent twice as possible.
47
- sum, outputs = wallet.collect_uncolored_outputs(fee + value, nil, true, true)
47
+ sum, outputs = collect_uncolored_outputs(wallet, fee + value)
48
48
 
49
49
  outputs.each do |utxo|
50
50
  txb.add_utxo({
@@ -73,6 +73,20 @@ module Glueby
73
73
  end
74
74
  end
75
75
 
76
+ def collect_uncolored_outputs(wallet, amount)
77
+ utxos = wallet.list_unspent.select { |o| !o[:color_id] && o[:amount] == @default_value }
78
+ utxos.shuffle!
79
+
80
+ utxos.inject([0, []]) do |sum, output|
81
+ new_sum = sum[0] + output[:amount]
82
+ new_outputs = sum[1] << output
83
+ return [new_sum, new_outputs] if new_sum >= amount
84
+
85
+ [new_sum, new_outputs]
86
+ end
87
+ raise Glueby::Contract::Errors::InsufficientFunds
88
+ end
89
+
76
90
  def validate_config!
77
91
  if UtxoProvider.config
78
92
  utxo_pool_size = UtxoProvider.config[:utxo_pool_size]
@@ -1,3 +1,3 @@
1
1
  module Glueby
2
- VERSION = "0.6.1"
2
+ VERSION = "0.7.0"
3
3
  end
data/lib/glueby.rb CHANGED
@@ -1,4 +1,5 @@
1
1
  require "glueby/version"
2
+ require "glueby/constants"
2
3
  require 'tapyrus'
3
4
 
4
5
  module Glueby
@@ -16,6 +17,16 @@ module Glueby
16
17
  require 'glueby/railtie'
17
18
  end
18
19
 
20
+ module GluebyLogger
21
+ def logger
22
+ if defined?(Rails)
23
+ Rails.logger
24
+ else
25
+ Logger.new(STDOUT)
26
+ end
27
+ end
28
+ end
29
+
19
30
  # Add prefix to activerecord table names
20
31
  def self.table_name_prefix
21
32
  'glueby_'
@@ -8,27 +8,8 @@ module Glueby
8
8
 
9
9
  def create
10
10
  timestamps = Glueby::Contract::AR::Timestamp.where(status: :init)
11
- utxo_provider = Glueby::UtxoProvider.new if Glueby.configuration.use_utxo_provider?
12
- timestamps.each do |t|
13
- begin
14
- wallet = Glueby::Wallet.load(t.wallet_id)
15
- funding_tx, tx, p2c_address, payment_base = create_txs(wallet, t.prefix, t.content_hash, Glueby::Contract::FixedFeeEstimator.new, utxo_provider, type: t.timestamp_type.to_sym)
16
- if funding_tx
17
- ::ActiveRecord::Base.transaction do
18
- wallet.internal_wallet.broadcast(funding_tx)
19
- puts "funding tx was broadcasted(id=#{t.id}, funding_tx.txid=#{funding_tx.txid})"
20
- end
21
- end
22
- ::ActiveRecord::Base.transaction do
23
- wallet.internal_wallet.broadcast(tx) do |tx|
24
- t.update(txid: tx.txid, status: :unconfirmed, p2c_address: p2c_address, payment_base: payment_base)
25
- end
26
- puts "timestamp tx was broadcasted (id=#{t.id}, txid=#{tx.txid})"
27
- end
28
- rescue => e
29
- puts "failed to broadcast (id=#{t.id}, reason=#{e.message})"
30
- end
31
- end
11
+ fee_estimator = Glueby::Contract::FixedFeeEstimator.new
12
+ timestamps.each { |t| t.save_with_broadcast(fee_estimator: fee_estimator) }
32
13
  end
33
14
  end
34
15
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: glueby
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.1
4
+ version: 0.7.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - azuchi
8
- autorequire:
8
+ autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-12-09 00:00:00.000000000 Z
11
+ date: 2022-01-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: tapyrus
@@ -103,6 +103,7 @@ files:
103
103
  - lib/glueby/active_record/system_information.rb
104
104
  - lib/glueby/block_syncer.rb
105
105
  - lib/glueby/configuration.rb
106
+ - lib/glueby/constants.rb
106
107
  - lib/glueby/contract.rb
107
108
  - lib/glueby/contract/active_record.rb
108
109
  - lib/glueby/contract/active_record/reissuable_token.rb
@@ -147,7 +148,7 @@ metadata:
147
148
  homepage_uri: https://github.com/chaintope/glueby
148
149
  source_code_uri: https://github.com/chaintope/glueby
149
150
  changelog_uri: https://github.com/chaintope/glueby
150
- post_install_message:
151
+ post_install_message:
151
152
  rdoc_options: []
152
153
  require_paths:
153
154
  - lib
@@ -163,7 +164,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
163
164
  version: '0'
164
165
  requirements: []
165
166
  rubygems_version: 3.2.3
166
- signing_key:
167
+ signing_key:
167
168
  specification_version: 4
168
169
  summary: A Ruby library of smart contracts that can be used on Tapyrus.
169
170
  test_files: []