From fb8d7afafaac25fca761064a82e19a07bd20c129 Mon Sep 17 00:00:00 2001 From: Kohei Taniguchi Date: Wed, 30 Jul 2025 16:50:49 +0900 Subject: [PATCH 1/2] Add Token.import_reissuable_token_script_pubkey to import reissuable token from outside of Glueby --- lib/glueby/contract/token.rb | 13 +++++++++++++ spec/functional/token_spec.rb | 21 +++++++++++++++++++++ spec/glueby/contract/token_spec.rb | 19 +++++++++++++++++++ 3 files changed, 53 insertions(+) diff --git a/lib/glueby/contract/token.rb b/lib/glueby/contract/token.rb index 128e7fb3..7a248022 100644 --- a/lib/glueby/contract/token.rb +++ b/lib/glueby/contract/token.rb @@ -86,6 +86,19 @@ def only_finalized? Glueby::AR::SystemInformation.use_only_finalized_utxo? end + # Creates AR::ReissuableToken record if it is not created before. + # + # @param [Tapyrus::Script] script_pubkey - The script pubkey that is used to issue the reissuable token + # @return [nil] + # @raise [Glueby::ArgumentError] If the script_pubkey is not an instance of Tapyrus::Script + def import_reissuable_token_script_pubkey(script_pubkey) + raise Glueby::ArgumentError, 'script_pubkey should be a Tapyrus::Script' unless script_pubkey.is_a?(Tapyrus::Script) + + color_id = Tapyrus::Color::ColorIdentifier.reissuable(script_pubkey) + Glueby::Contract::AR::ReissuableToken.find_or_create_by!(color_id: color_id.to_hex, script_pubkey: script_pubkey.to_hex) + nil + end + private def issue_reissuable_token(issuer:, amount:, split: 1, fee_estimator:, metadata: nil) diff --git a/spec/functional/token_spec.rb b/spec/functional/token_spec.rb index 6450b7d5..e32a2e06 100644 --- a/spec/functional/token_spec.rb +++ b/spec/functional/token_spec.rb @@ -76,6 +76,27 @@ expect(Glueby::Contract::AR::ReissuableToken.count).to eq(1) end + it 'reissue imported reissuable token' do + imported_token_key = Tapyrus::Key.generate + script_pubkey = Tapyrus::Script.to_p2pkh(Tapyrus.hash160(imported_token_key.pubkey)) + color_id = Tapyrus::Color::ColorIdentifier.reissuable(script_pubkey) + token = Glueby::Contract::Token.new(color_id: color_id) + + # Import key to re-issuer wallet + sender.import_private_key(imported_token_key) + + # Fails reissue before importing script_pubkey + expect { token.reissue!(issuer: sender, amount: 5_000) }.to raise_error(Glueby::Contract::Errors::UnknownScriptPubkey) + + # Import script pubkey and reissue + Glueby::Contract::Token.import_reissuable_token_script_pubkey(script_pubkey) + token.reissue!(issuer: sender, amount: 5_000) + + process_block + + expect(sender.balances[color_id.to_hex]).to eq(5_000) + end + it 'non-reissunable token' do token, _txs = Glueby::Contract::Token.issue!( issuer: sender, diff --git a/spec/glueby/contract/token_spec.rb b/spec/glueby/contract/token_spec.rb index d9f060ef..f03abcd9 100644 --- a/spec/glueby/contract/token_spec.rb +++ b/spec/glueby/contract/token_spec.rb @@ -282,6 +282,25 @@ end end + describe '#import_reissuable_token_script_pubkey' do + let(:script_pubkey) { Tapyrus::Script.to_p2pkh(Tapyrus.hash160(Tapyrus::Key.generate.pubkey)) } + subject { Glueby::Contract::Token.import_reissuable_token_script_pubkey(script_pubkey) } + + it 'creates Glueby::Contract::AR::ReissuableToken record' do + expect { subject }.to change(Glueby::Contract::AR::ReissuableToken, :count).by(1) + ar_token = Glueby::Contract::AR::ReissuableToken.find_by(script_pubkey: script_pubkey.to_hex) + expect(ar_token.color_id).to eq(Tapyrus::Color::ColorIdentifier.reissuable(script_pubkey).to_hex) + end + + context 'script_pubkey is not an instance of Tapyrus::Script' do + let(:script_pubkey) { 'invalid script' } + + it 'creates Glueby::Contract::AR::ReissuableToken record' do + expect { subject }.to raise_error(Glueby::ArgumentError, 'script_pubkey should be a Tapyrus::Script') + end + end + end + describe '#reissue!' do subject { token[0].reissue!(issuer: issuer, amount: amount) } From 9ffda9f3a7731a903f6f53931b8695d51d8784f3 Mon Sep 17 00:00:00 2001 From: Kohei Taniguchi Date: Thu, 31 Jul 2025 16:29:00 +0900 Subject: [PATCH 2/2] Remove unnecessary comment --- lib/glueby/contract/token.rb | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/glueby/contract/token.rb b/lib/glueby/contract/token.rb index 7a248022..520f5413 100644 --- a/lib/glueby/contract/token.rb +++ b/lib/glueby/contract/token.rb @@ -89,7 +89,6 @@ def only_finalized? # Creates AR::ReissuableToken record if it is not created before. # # @param [Tapyrus::Script] script_pubkey - The script pubkey that is used to issue the reissuable token - # @return [nil] # @raise [Glueby::ArgumentError] If the script_pubkey is not an instance of Tapyrus::Script def import_reissuable_token_script_pubkey(script_pubkey) raise Glueby::ArgumentError, 'script_pubkey should be a Tapyrus::Script' unless script_pubkey.is_a?(Tapyrus::Script)