Auction House

アセットの取引

はじめに

前のページでは、Auction Houseとその作成・管理方法について説明しました。Auction Houseが作成されると、その上でアセットを取引できます。マーケットプレイスでの簡単な取引は通常、3つのアクションで構成されます:

  1. 出品者がアセットをリストする
  2. 購入者がアセットにビッドを行う
  3. リスティングに一致するビッドが見つかると、販売が実行される

このページでは、これら3つのアクションについて説明し、これらのアクションを簡単に実行するコード例を見ていきます。また、上記の簡単な取引シナリオとは異なる取引シナリオを見て、各シナリオを実行するコード例を見ていきます。最後に、作成されたリスティングとビッドをキャンセルする方法についても調査します。

Auction Houseでのアセットのリスティングから始めましょう。

アセットのリスティング

概要ページでアセットをリストするプロセスを見ました。このアクションは売却注文の作成とも呼ばれます。Auction Houseを使用して売却注文が作成されると、リストされているアセットは出品者のウォレットに残ります。これはAuction Houseの非常に重要な機能であり、ユーザーがエスクローレスの方法でアセットをリストできるため、アセットがリストされている間もユーザーはアセットの管理を維持します。

アセット出品者は、アセットをリストする価格に応じて、2つのタイプのリスティングを作成できます:

  1. 0より大きい価格でのリスティング: ユーザーが0 SOL(または他のSPL-token)より大きい価格でアセットをリストする場合。この場合、出品者のウォレットが署名者である必要があります

  2. 0の価格でのリスティング: ユーザーが0 SOL(または他のSPL-token)でアセットをリストする場合。この場合、Auction House設定ページで説明したcanChangeSalePriceオプションがtrueに設定されている場合、権限は出品者に代わって署名できます。これが発生すると、Auction Houseは出品者に代わって0以外の一致するビッドを見つけます。アセットは、出品者が署名者として行動する場合にのみ、0の価格でリストおよび販売できます。署名者は1人だけである必要があります。権限または出品者が署名する必要があります。

リストされているトークンのタイプに応じて、売却注文を作成するときにリストするトークンの数も指定できます:

  1. 非代替性トークン(NFT)の場合: すべてのトークンの非代替性と一意性のため、1つのトークンのみをリストできます。

  2. 代替可能なアセットの場合: 出品者はリストごとに1つ以上のトークンをリストできます。例:Aliceが5つのDUSTトークンを所有している場合、同じ売却注文でこれらのDUSTトークンの1つ以上(ただし5以下)をリストできます。

JS SDK

Auction Houseでリスティングまたは売却注文を行う例を見てみましょう。

以下のコードスニペットでは、3つのDUSTトークン(代替可能なトークン)を合計5 SOLで売却注文を行っています。ここで注意すべき重要な点は、NFTの売却注文を作成している場合、リストするトークンの数を指定する必要がないことです。デフォルトで1トークンになります。他の金額を指定するとエラーになります。

await metaplex
.auctionHouse()
.createListing({
auctionHouse, // このリスティングに関連するAuction Houseのモデル
seller: Keypair.generate(), // リスティングの作成者
authority: Keypair.generate(), // Auction House権限
mintAccount: new PublicKey("DUST...23df"), // リスティングを作成するミントアカウント、メタデータの検索に使用
tokenAccount: new PublicKey("soC...87g4"), // リスティングが作成されるアセットに関連付けられたトークンアカウントアドレス
price: 5, // リスティング価格
tokens: 3 // リストするトークンの数、NFTリスティングの場合は1トークンである必要があります
});

アセットへの入札

アセットを購入したいユーザーは、そのアセットにビッド、または購入注文を行うことができます。

アセットがリストされているかどうかに応じて、2つのタイプの購入注文があります:

  1. プライベートビッド: これは最も一般的なタイプのビッドです。Auction Houseでリストされたアセットに興味を持ったユーザーが、特定のアセットにプライベートビッドを作成します。このビッドは、アセット自体ではなく、特定のオークションに結び付けられています。これは、オークションが終了すると(ビッドが拒否されてリスティングがキャンセルされるか、ビッドが受け入れられてアセットが販売される)、ビッドも終了することを意味します。

  2. パブリックビッド: ユーザーは、sellerとtokenAccountプロパティをスキップすることで、リストされていないNFTにパブリックビッドを投稿できます。パブリックビッドは、特定のオークションではなく、トークン自体に固有です。これは、ビッドがオークションの終了後もアクティブなままになり、そのトークンの後続のオークションが基準を満たす場合に解決できることを意味します。

売却注文の場合と同様に、購入注文も、リストされたアセットのタイプに応じて、入札するトークンの数を指定できます:

  1. 部分購入注文: 代替可能なアセットをリストするときに1つ以上のトークンをリストする場合について説明しました。このような売却注文が存在する場合、ユーザーはリストされたトークンの一部のみを購入するビッドを行うことができます。つまり、部分購入注文を行うことができます。例:Aliceが3 DUSTトークンを5 SOLでリストした場合、Aliceは2 DUSTトークンを2 SOLで購入するビッドを行うことができます。つまり、ユーザーは売却注文のtoken_sizeより少ない前述のアセットの購入注文を作成できます。

  2. 完全購入注文: これは、購入者が売却注文でリストされているすべてのトークンを購入するビッドを作成する場合です。売却注文ごとに1つのトークンのみをリストできる非代替性アセット(NFT)の場合、完全購入注文が作成されます。完全購入注文は、代替可能なトークンの場合にも作成できます。

JS SDK

Auction Houseでビッドまたは購入注文を行う例を見てみましょう。

以下のコードスニペットでは、3つのDUSTトークン(代替可能なトークン)を合計5 SOLで購入注文を行っています。ここで注意すべき重要な点は、NFTの売却注文を作成している場合、リストするトークンの数を指定する必要がないことです。デフォルトで1トークンになります。他の金額を指定するとエラーになります。

これは、出品者アカウントとトークンアカウントを指定しているため、プライベートビッドの例です。ビッドの作成時にどちらかが指定されていない場合、ビッドはパブリックになります。

await metaplex
.auctionHouse()
.createBid({
auctionHouse, // このリスティングに関連するAuction Houseのモデル
buyer: Keypair.generate(), // ビッドの作成者
seller: Keypair,generate(), // ビッドが作成されるアセットを保持するアカウントアドレス、これまたはtokenAccountが提供されていない場合、ビッドはパブリックになります
authority: Keypair.generate(), // Auction House権限
mintAccount: new PublicKey("DUST...23df"), // ビッドを作成するミントアカウント
tokenAccount: new PublicKey("soC...87g4"), // ビッドが作成されるアセットに関連付けられたトークンアカウントアドレス、これまたはsellerが提供されていない場合、ビッドはパブリックになります
price: 5, // 購入者の価格
tokens: 3 // 入札するトークンの数、NFTビッドの場合は1トークンである必要があります
});

アセットの販売の実行

リスティング(売却注文)とビッド(購入注文)の作成方法がわかったので、アセットの販売を実行する方法を学びましょう。アセットの販売が実行されると:

  1. Auction Houseは、購入者エスクローアカウントから出品者のウォレットにビッド額を転送します。購入者エスクローアカウントと、マーケットプレイス権限がそのアカウントの資金を管理する方法については、さらに詳しく説明します。

  2. Auction Houseは、出品者のウォレットから購入者のウォレットにアセットを転送します。

販売の実行が何を意味するかがわかったので、Auction Houseを使用してアセットを販売できるさまざまな取引シナリオを探ってみましょう。[概要ページ]ですでに詳しく説明しましたが、各シナリオのコードスニペットに加えて簡単な説明を以下に示します:

  1. 直接購入、または*「リスト価格での購入」*: これは、ユーザーがリストされたアセットにビッドを行ったときに販売の実行が行われる場合です。つまり、直接購入操作は、特定のアセットにビッドを作成し、作成されたビッドとリスティングで販売を実行します。

    ほとんどの場合、このシナリオは、購入者がアセットのリスト価格でビッドを行うときに発生します。ただし、マーケットプレイスがしきい値で機能するカスタムオーダーマッチングアルゴリズムを持っている場合もあります。例:マーケットプレイスには、リスト価格から+-20%の範囲内にあるビッドがあるとすぐに、特定のアセットの販売を実行するルールがある場合があります。

JS SDK

以下は、リストされたアセットに興味を持ったユーザーによるアセットの直接購入の例です。

const listing = await metaplex
.auctionHouse()
.findListingByReceipt({...}) // 今後のページでリスティングの取得方法を見ます
const directBuyResponse = await metaplex
.auctionHouse()
.buy({
auctionHouse, // ビッドを作成して販売を実行するAuction House
buyer: Keypair.generate(), // ビッドの作成者、リスティングを作成する出品者と同じであってはなりません
authority: Keypair.generate(), // Auction House権限、これが署名者の場合
// トランザクション手数料はAuction House手数料アカウントから支払われます
listing: listing, // 販売で使用されるリスティング、`Listing`モデルのサブセットのみが必要ですが、
// 販売の実行方法を知るために、その設定に関する十分な情報が必要です
price: 5, // 購入者の価格
});
  1. 直接販売、または*「ビッド価格での販売」*: 直接購入の場合の対応として、これは、リストされていないアセットに興味を持ったユーザーがビッドを配置する場合です。アセット所有者がビッド額でアセットをリストすると、販売の実行が行われ、アセットを直接販売できます。

JS SDK

以下は、アセットへのビッドに興味を持ったユーザーによるアセットの直接販売の例です。

const bid = await metaplex
.auctionHouse()
.findBidByReceipt({...}) // 今後のページでビッドの取得方法を見ます
const directSellResponse = await metaplex
.auctionHouse()
.sell({
auctionHouse, // リスティングを作成して販売を実行するAuction House
seller: Keypair.generate(), // リスティングの作成者、署名者は1人だけである必要があります。権限または出品者が署名する必要があります
authority: Keypair.generate(), // Auction House権限、これが署名者の場合
// トランザクション手数料はAuction House手数料アカウントから支払われます
bid: bid, // 販売で使用されるパブリックビッド、`Bid`モデルのサブセットのみが必要ですが、
// 販売の実行方法を知るために、その設定に関する十分な情報が必要です
sellerToken: new PublicKey("DUST...23df") // 販売するアセットのトークンアカウント、パブリックビッドには
// トークンが含まれていないため、このパラメータを介して外部で提供する必要があります
});
  1. 独立した販売実行、またはリスト者がビッドに同意: これは、特定のアセットに対して購入注文(ビッド)と売却注文(リスティング)が存在した後、販売の実行が独立して行われる場合です。

JS SDK

以下は、独立した販売実行の例です。

const listing = await metaplex
.auctionHouse()
.findListingByReceipt({...}) // 今後のページでリスティングの取得方法を見ます
const bid = await metaplex
.auctionHouse()
.findBidByReceipt({...}) // 今後のページでビッドの取得方法を見ます
const executeSaleResponse = await metaplex
.auctionHouse()
.executeSale({
auctionHouse, // ビッドを作成して販売を実行するAuction House
authority: Keypair.generate(), // Auction House権限、これが署名者の場合
// トランザクション手数料はAuction House手数料アカウントから支払われます
listing: listing, // 販売で使用されるリスティング、`Listing`モデルのサブセットのみが必要ですが、
// 販売の実行方法を知るために、その設定に関する十分な情報が必要です
bid: bid, // 販売で使用されるパブリックビッド、`Bid`モデルのサブセットのみが必要ですが、
// 販売の実行方法を知るために、その設定に関する十分な情報が必要です
});

リスティングとビッドのキャンセル

ここまでで、ビッドとリスティングの作成方法、およびAuction Houseでのアセットの販売の実行方法を見てきました。Auction Houseでリスティングとビッドが作成されると、権限を介してキャンセルできます。

JS SDK

以下は、JS SDKを使用してビッドとリスティングをキャンセルする例です。

const listing = await metaplex
.auctionHouse()
.findListingByReceipt({...}) // 今後のページでリスティングの取得方法を見ます
const bid = await metaplex
.auctionHouse()
.findBidByReceipt({...}) // 今後のページでビッドの取得方法を見ます
// ビッドをキャンセル
const cancelBidResponse = await metaplex
.auctionHouse()
.cancelBid({
auctionHouse, // ビッドをキャンセルするAuction House
bid: bid, // キャンセルするビッド
});
// リスティングをキャンセル
const cancelListingResponse = await metaplex
.auctionHouse()
.cancelListing({
auctionHouse, // リスティングをキャンセルするAuction House
listing: listing, // キャンセルするリスティング
});

まとめ

このページでは、マーケットプレイスでのアセットの取引を管理するすべてのコンポーネントをカバーしました。

まだ説明していない重要なポイントの1つは、購入者エスクローアカウントです。これは、購入者がアセットにビッドを行ったときに購入者の資金を一時的に保持するために必要です。このアカウントの資金はどのように管理され、誰がこれらの資金を追跡する責任がありますか?次のページで見つけましょう。