From d5ca692f058c0a1b4672ab6486c45dc9d4249123 Mon Sep 17 00:00:00 2001 From: Sebastian Borrazas Date: Wed, 24 Jul 2024 07:31:46 -0300 Subject: [PATCH] fix: calculate auction expiration correctly when extension present --- .../db/mutations/name_claim_mutation.ex | 202 +++++++++--------- test/ae_mdw/db/name_claim_mutation_test.exs | 17 +- 2 files changed, 108 insertions(+), 111 deletions(-) diff --git a/lib/ae_mdw/db/mutations/name_claim_mutation.ex b/lib/ae_mdw/db/mutations/name_claim_mutation.ex index 1127c72d8..bfa1c2f5c 100644 --- a/lib/ae_mdw/db/mutations/name_claim_mutation.ex +++ b/lib/ae_mdw/db/mutations/name_claim_mutation.ex @@ -90,113 +90,107 @@ defmodule AeMdw.Db.NameClaimMutation do state2 = State.put(state, Model.PlainName, m_plain_name) - timeout = - if State.exists?(state2, Model.AuctionBid, plain_name) do - :aec_governance.name_claim_bid_extension(plain_name, protocol_version) - else - :aec_governance.name_claim_bid_timeout(plain_name, protocol_version) - end - - case timeout do - 0 -> - expire = Names.expire_after(height) - - m_name = - Model.name( - index: plain_name, - active: height, - expire: expire, - owner: owner_pk, - auction_timeout: 0 - ) - - lock_amount = (lima_or_higher? && name_fee) || :aec_governance.name_claim_locked_fee() - - name_claim = Model.name_claim(index: {plain_name, height, txi_idx}) - - ObjectKeys.put_active_name(state, plain_name) - - state2 - |> Name.put_active(m_name) - |> State.put(Model.NameClaim, name_claim) - |> Name.delete_inactive(plain_name) - |> IntTransfer.fee({height, txi_idx}, :lock_name, owner_pk, txi_idx, lock_amount) - |> State.inc_stat(:burned_in_auctions, lock_amount) - |> Names.increment_names_count(owner_pk) - - timeout -> - auction_end = height + timeout - - state3 = - IntTransfer.fee(state2, {height, txi_idx}, :spend_name, owner_pk, txi_idx, name_fee) - - state4 = - case State.get(state3, Model.AuctionBid, plain_name) do - :not_found -> - auction_claim = Model.auction_bid_claim(index: {plain_name, height, txi_idx}) - - m_auction_bid = - Model.auction_bid( - index: plain_name, - start_height: height, - block_index_txi_idx: {block_index, txi_idx}, - expire_height: auction_end, - owner: owner_pk - ) - - m_auction_exp = Model.expiration(index: {auction_end, plain_name}) - - state3 - |> State.inc_stat(:auctions_started) - |> State.put(Model.AuctionBidClaim, auction_claim) - |> State.put(Model.AuctionBid, m_auction_bid) - |> State.put(Model.AuctionExpiration, m_auction_exp) - - {:ok, - Model.auction_bid( - start_height: start_height, - block_index_txi_idx: {_bi, prev_txi_idx}, - expire_height: prev_auction_end, - owner: prev_owner - ) = auction_bid} -> - prev_name_claim_tx = DbUtil.read_node_tx(state, prev_txi_idx) - prev_name_fee = :aens_claim_tx.name_fee(prev_name_claim_tx) - - auction_claim = Model.auction_bid_claim(index: {plain_name, start_height, txi_idx}) - actual_auction_end = max(auction_end, prev_auction_end) - - m_auction_bid = - Model.auction_bid(auction_bid, - block_index_txi_idx: {block_index, txi_idx}, - expire_height: actual_auction_end, - owner: owner_pk - ) - - state3 - |> State.delete(Model.AuctionBid, plain_name) - |> State.delete(Model.AuctionOwner, {prev_owner, plain_name}) - |> State.delete( - Model.AuctionExpiration, - {prev_auction_end, plain_name} + timeout = :aec_governance.name_claim_bid_timeout(plain_name, protocol_version) + + if timeout == 0 do + expire = Names.expire_after(height) + + m_name = + Model.name( + index: plain_name, + active: height, + expire: expire, + owner: owner_pk, + auction_timeout: 0 + ) + + lock_amount = (lima_or_higher? && name_fee) || :aec_governance.name_claim_locked_fee() + + name_claim = Model.name_claim(index: {plain_name, height, txi_idx}) + + ObjectKeys.put_active_name(state, plain_name) + + state2 + |> Name.put_active(m_name) + |> State.put(Model.NameClaim, name_claim) + |> Name.delete_inactive(plain_name) + |> IntTransfer.fee({height, txi_idx}, :lock_name, owner_pk, txi_idx, lock_amount) + |> State.inc_stat(:burned_in_auctions, lock_amount) + |> Names.increment_names_count(owner_pk) + else + state3 = + IntTransfer.fee(state2, {height, txi_idx}, :spend_name, owner_pk, txi_idx, name_fee) + + state4 = + case State.get(state3, Model.AuctionBid, plain_name) do + :not_found -> + auction_claim = Model.auction_bid_claim(index: {plain_name, height, txi_idx}) + auction_end = height + timeout + + m_auction_bid = + Model.auction_bid( + index: plain_name, + start_height: height, + block_index_txi_idx: {block_index, txi_idx}, + expire_height: auction_end, + owner: owner_pk ) - |> IntTransfer.fee( - {height, txi_idx}, - :refund_name, - prev_owner, - prev_txi_idx, - prev_name_fee - ) - |> State.inc_stat(:locked_in_auctions, name_fee - prev_name_fee) - |> State.put(Model.AuctionBidClaim, auction_claim) - |> State.put(Model.AuctionBid, m_auction_bid) - |> State.put( - Model.AuctionExpiration, - Model.expiration(index: {actual_auction_end, plain_name}) + + m_auction_exp = Model.expiration(index: {auction_end, plain_name}) + + state3 + |> State.inc_stat(:auctions_started) + |> State.put(Model.AuctionBidClaim, auction_claim) + |> State.put(Model.AuctionBid, m_auction_bid) + |> State.put(Model.AuctionExpiration, m_auction_exp) + + {:ok, + Model.auction_bid( + start_height: start_height, + block_index_txi_idx: {_bi, prev_txi_idx}, + expire_height: prev_auction_end, + owner: prev_owner + ) = auction_bid} -> + auction_end = + prev_auction_end + + :aec_governance.name_claim_bid_extension(plain_name, protocol_version) + + prev_name_claim_tx = DbUtil.read_node_tx(state, prev_txi_idx) + prev_name_fee = :aens_claim_tx.name_fee(prev_name_claim_tx) + auction_claim = Model.auction_bid_claim(index: {plain_name, start_height, txi_idx}) + + m_auction_bid = + Model.auction_bid(auction_bid, + block_index_txi_idx: {block_index, txi_idx}, + expire_height: auction_end, + owner: owner_pk ) - end - state4 - |> State.put(Model.AuctionOwner, Model.owner(index: {owner_pk, plain_name})) + state3 + |> State.delete(Model.AuctionBid, plain_name) + |> State.delete(Model.AuctionOwner, {prev_owner, plain_name}) + |> State.delete( + Model.AuctionExpiration, + {prev_auction_end, plain_name} + ) + |> IntTransfer.fee( + {height, txi_idx}, + :refund_name, + prev_owner, + prev_txi_idx, + prev_name_fee + ) + |> State.inc_stat(:locked_in_auctions, name_fee - prev_name_fee) + |> State.put(Model.AuctionBidClaim, auction_claim) + |> State.put(Model.AuctionBid, m_auction_bid) + |> State.put( + Model.AuctionExpiration, + Model.expiration(index: {auction_end, plain_name}) + ) + end + + state4 + |> State.put(Model.AuctionOwner, Model.owner(index: {owner_pk, plain_name})) end end end diff --git a/test/ae_mdw/db/name_claim_mutation_test.exs b/test/ae_mdw/db/name_claim_mutation_test.exs index 2e4fcb175..a23ffa5b3 100644 --- a/test/ae_mdw/db/name_claim_mutation_test.exs +++ b/test/ae_mdw/db/name_claim_mutation_test.exs @@ -145,7 +145,7 @@ defmodule AeMdw.Db.NameClaimMutationTest do block_index = {claim_height, 0} state = State.new(store) timeout = :aec_governance.name_claim_bid_timeout(plain_name, protocol_version) - extended = :aec_governance.name_claim_bid_extension(plain_name, protocol_version) + extension = :aec_governance.name_claim_bid_extension(plain_name, protocol_version) tx_hash = <<1::256>> expire_height = claim_height + timeout @@ -187,7 +187,7 @@ defmodule AeMdw.Db.NameClaimMutationTest do name_fee, false, next_txi_idx, - {claim_height + 1, 0}, + {claim_height, 0}, protocol_version ) @@ -202,6 +202,7 @@ defmodule AeMdw.Db.NameClaimMutationTest do }) {:name_claim_tx, claim_tx} = :aetx.specialize_type(claim_aetx) + expire_height = expire_height + extension with_mocks [ {AeMdw.Node.Db, [:passthrough], @@ -243,20 +244,20 @@ defmodule AeMdw.Db.NameClaimMutationTest do name_fee, false, {almost_expired_txi, -1}, - {expire_height - 1, 0}, + {claim_height + 100, 0}, protocol_version ) state = Mutation.execute(bid_mutation_2, state) - new_expire_height = expire_height - 1 + extended + expire_height = expire_height + extension assert {:ok, Model.auction_bid( index: ^plain_name, start_height: ^claim_height, owner: ^owner_pk, - expire_height: ^new_expire_height + expire_height: ^expire_height )} = State.get(state, Model.AuctionBid, plain_name) bid_mutation_3 = @@ -267,18 +268,20 @@ defmodule AeMdw.Db.NameClaimMutationTest do name_fee, false, {almost_expired_txi + 1, -1}, - {new_expire_height - extended - 1, 0}, + {claim_height + 200, 0}, protocol_version ) state = Mutation.execute(bid_mutation_3, state) + expire_height = expire_height + extension + assert {:ok, Model.auction_bid( index: ^plain_name, start_height: ^claim_height, owner: ^owner_pk, - expire_height: ^new_expire_height + expire_height: ^expire_height )} = State.get(state, Model.AuctionBid, plain_name) end end