Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions lib/glueby/contract/token.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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
Comment thread
azuchi marked this conversation as resolved.
# @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)
Expand Down
21 changes: 21 additions & 0 deletions spec/functional/token_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
19 changes: 19 additions & 0 deletions spec/glueby/contract/token_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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) }

Expand Down