diff --git a/lib/glueby/contract/token.rb b/lib/glueby/contract/token.rb index 128e7fb..520f541 100644 --- a/lib/glueby/contract/token.rb +++ b/lib/glueby/contract/token.rb @@ -86,6 +86,18 @@ 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 + # @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 6450b7d..e32a2e0 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 d9f060e..f03abcd 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) }