Fixed Price Sale

技术描述

创作者出售物品需要:

  1. 创建商店

    • 这是必要的,因为我们必须以某种方式过滤市场

    • 它将包含名称、管理员密钥、描述

  2. 初始化销售资源。它可以是创建的资源,或者我们的平台将创建它。

    • 一旦用户初始化销售资源,我们就有了一个包含我们可以出售的资源的对象
  3. 创建市场

    • 创建包含有关销售物品信息的对象,除了最大供应量之外的所有内容,因为我们在销售资源中定义了它

用户购买代币需要:

  1. 进入商店。

  2. 选择代币并点击"购买"

    • 在幕后将发生以下事情:

      • 将创建 TradeHistory 账户,我们在其中跟踪此用户已购买的代币数量

      • 借记和贷记操作

      • 创建新 NFT(创建铸造、铸造代币、创建元数据、创建 MasterEdition)

  3. 代币将显示在他们的钱包中

账户

Store

字段类型描述
adminPubkey可以在特定商店中创建销售资源和市场的管理员密钥
nameString
descriptionString

Selling resource

字段类型描述
storePubkey
ownerPubkey资源的所有者。此账户可以在销售结束后收回资源
resourcePubkey附加了元数据的铸造账户。我们不需要存储元数据密钥,因为它是 PDA,我们可以通过知道铸造密钥来计算它
vaultPubkey持有 MasterEdition 的代币账户
vault_ownerPubkeyPDA,种子为 ["mt_vault", resource.key(), store.key()]
supplyu64已售出的代币数量
max_supplyOption<u64>可以出售的代币最大数量
stateEnum{Uninitialised, Created, InUse, Exhausted, Stoped,}资源状态

Market

字段类型描述
storePubkey
selling_resourcePubkey
treasury_mintPubkey市场将接受作为付款的代币的铸造账户
treasury_holderPubkey买家将发送代币的代币账户。只有市场所有者可以提取资产
treasury_ownerPubkeyPDA["holder", treasury_mint.key(), selling_resource.key()]
ownerPubkey市场所有者
nameString
descriptionString
mutablebool
priceu64
pieces_in_one_walletOption<u64>我们可以向一个钱包出售多少代币
start_dateu64
end_dateOption<u64>
stateEnum {Uninitialised, Created, Active, Ended,}
funds_collectedu64

TradeHistory

PDA ["history", wallet.key(), market.key()]

字段类型描述
marketPubkey
walletPubkey
already_boughtu64用户已从特定市场购买的代币数量

PrimaryMetadataCreators

PDA ["primary_creators", metadata.key()]

字段类型描述
creatorsVec<mpl_token_metadata::state::Creator>接收主要销售版税的创作者列表

指令

CreateStore

创建新的 Store 账户。

参数类型描述
adminKey, Signer, Writable
storeKey, Signer, Writable未初始化的账户
nameString
descriptionString

InitSellingResource

初始化将由 Market 使用的 SellingResource 账户。

参数类型描述
storeKey
store_adminKey, Signer, Writable持有 resource_token 并支付创建 selling_resource 账户的费用
selling_resourceKey, Signer, Writable未初始化的账户
selling_resource_ownerKey可以在销售结束后提取 MasterEdition 的密钥
resource_mintKey附加了元数据的铸造账户
master_editionKeyPDA,种子为 ["metadata", tokenMetadataProgramID, resource_mint, "edition"]
metadataKey主版的元数据
vaultKey, Writable持有资源的代币账户
vault_ownerPDA ["mt_vault", resource_mint.key(), store.key()]保险库代币账户的所有者
resource_tokenKey, Writable持有来自 resource_mint 的代币的用户代币账户
max_supplyOption<u64>要出售的代币最大数量

CreateMarket

初始化 Market 账户。将状态设置为 Created,这意味着所有者可以在激活之前更改一些数据,当然如果 Market 标记为可变的话。

:::warning

如果用户想以原生 SOL 出售艺术品,应将 treasury_mint 设置为 11111111111111111111111111111111,并且 treasury_holder 和 treasury_owner 应该是相同的账户 PDA。出于安全原因,这是必要的,因此只有程序才能花费该 SOL。

:::

参数类型描述
marketKey, Signer, Writable未初始化的账户
storeKey
selling_resource_ownerKey, Signer, Writable
selling_resourceKey, Writable
treasury_mintKey我们将作为付款接受的资产的铸造
treasury_holderKey代币账户
treasury_ownerPDA ["holder", treasury_mint.key(), selling_resource.key()]
nameString
descriptionString
mutablebool
priceu64
pieces_in_one_walletOption<u64>
start_dateu64
end_dateOption<u64>
gating_configOption<GatingConfig{collection: Pubkey, expire_on_use: bool, gating_time: Option<u64>}>控制代币。如果设置此值,只有来自指定集合的 NFT 用户才能从市场购买新 NFT。

ChangeMarket

仅在 Market::mutable == true 时可用。可以更改: name、description、mutable、price、pieces_in_one_wallet。

参数类型描述
marketKey, Writable
market_ownerKey, Signer
new_nameOption<String>
new_descriptionOption<String>
mutableOption<bool>
new_priceOption<u64>
new_pieces_in_one_walletOption<u64>

Buy

用户只能在当前日期 > Market::start_date 时调用。

:::warning

如果用户以原生 SOL 购买艺术品,user_token_acc 和 user_wallet 账户应该相同。

:::

参数类型描述
marketKey, Writable
selling_resourceKey, Writable
user_token_accKey, Writable用于支付会员代币的代币账户。此代币账户的铸造应该 == treasury_mint
user_walletKey, Signer, Writable
trade_historyKey, Writable用于跟踪用户已购买多少 NFT 的账户
treasury_holderKey, Writable
new_metadata_accKey, Writable
new_edition_accKey, Writable
master_edition_accKey, Writable
new_mintKey, Writable
edition_markerKey, WritablePDA,种子可以在 token-metadata 程序中找到
vaultKey
vault_ownerPDA ["mt_vault", resource.key(), store.key()]
master_edition_metadataKey
以下账户是可选的,仅在启用控制功能时才应传递 ↓
user_collection_token_accountKey, Writable用户来自集合的代币账户
token_account_mintKey, Writable代币的铸造账户
metadata_accountKey上述铸造的元数据账户

SuspendMarket

暂停市场,使没有人可以购买物品,市场所有者可以更改数据。仅当 Market::mutable == true 时,指令才应可用,因为在其他情况下没有理由暂停它。

参数类型描述
marketKey, Writable
market_ownerKey, Signer
clockKey

ResumeMarket

在市场被暂停后恢复市场的指令。只能在市场处于暂停状态时调用。

参数类型描述
marketKey, Writable
market_ownerKey, Signer
clockKey

CloseMarket

仅当 Market 以无限持续时间创建时才能调用此指令。

参数类型描述
marketKey, Writable
market_ownerKey, Signer
clockKey

Withdraw

由 Market 所有者调用以提取收集的金库资金。仅在 Market::state == Ended 时可用。

参数类型描述
marketKey
selling_resourceKey
metadataKey
treasury_holderKey, WritableMarket::treasury_holder。持有销售期间从用户收到的所有代币的代币账户
treasury_mintKey
funderKey
payerKey, Signer
payout_ticketKey, WritablePDA["payout_ticket", market.key(), funder.key()]
treasury_ownerKeyPDA["holder", treasury_mint.key(), selling_resource.key()]
destinationKey, Writable转移代币到的代币账户
以下账户是可选的,仅在主要销售期间才应传递 ↓
primary_metadata_creators_dataKey应从主要销售中获得版税的创作者列表

ClaimResource

由 Resource 所有者调用。仅在 SellingResource::state == Exhausted 或 Market::state == Ended 时可用。

参数类型描述
marketKey
treasury_holderKey
selling_resourceKey
selling_resource_ownerKey, Signer
sourceKey, WritableSellingResource::vault。持有主版的代币账户
metadataKey已出售代币的元数据
vault_ownerKeyPDA,种子为 ["mt_vault", resource.key(), store.key()]
secondary_metadata_creatorsKey
destinationKey, Writable转移主版到的代币账户

SavePrimaryMetadataCreators

在创建市场之前调用。此创作者列表将在提取指令中用于分配版税。请注意,如果您要从 primary_sale_happen = true 的主版出售 NFT,则不需要调用此指令。

参数类型描述
adminKey, Signer, Writable元数据的更新权限
metadataKey, Writable
primary_metadata_creatorsKey, WritablePDA,种子为 ["primary_creators", metadata.key()]
system_programKey
primary_metadata_creatorsu8primary_metadata_creators 密钥 bump
creatorsVec<mpl_token_metadata::state::Creator>将获得主要版税的创作者列表
Previous
简介