Skip to main content
このガイドでは、Sequenceスタックのシンプルなツールを使ってカスタムマーケットプレイスを作成する手順を説明します。 これらのツールで以下のことが可能になります:
  1. ミント:Sequence Builderからウォレットへトークンをミント
  2. ウォレット認証:Web SDKを使ったユーザー認証
  3. ブロックチェーンクエリ:Indexerを使ったトークン残高の取得
  4. 複数ウォレットタイプ:ユーザーがSequence WalletまたはEOAを利用可能にする
  5. リクエスト作成:Sequence Market Protocolで売却リクエストを作成
  6. 注文の受諾:マーケットプレイスでトップオーダーを受け入れる
  7. (オプション) 埋め込みウォレットの有効化:確認不要の取引でよりシームレスなUXを実現
シンプルなマーケットプレイスdappの例をご覧ください。ユーザーがコレクティブルをミントし、Sequence Marketplace Protocolで販売し、base-sepolia上でUSDCを使い、マーケットプレイスで最良注文(トップオーダー)を取得して購入できます。コードはこちらで公開しています。

1. ミント

最初のステップは、Sequence Builderでコレクティブルを作成し、いくつかのトークンをミントすることです。詳しくはこちらのガイドを参照し、ミントしたtokenIdを使って今後のステップで注文のクエリや実行を行います。

2. ウォレット認証

プロジェクトには、ユーザーをウォレットで認証する仕組みが必要です。 Sequenceスタックからは、ヘッドレスかつWeb2ライクなUXを実現するEmbedded Walletか、より多様なウォレットに対応したEcosystem WalletWeb SDKのいずれかを選択できます。 このガイドでは、Web SDK コネクタ付きの Universal Sequence Wallet(オプションで Embedded Wallet も利用可能)を使用します。GoogleやApple認証に加え、CoinbaseやMetamaskなどユーザー自身のウォレットでも認証できます。

パッケージのインストール

このようなテンプレートからバニラjs/html/cssプロジェクトを作成するか、または、ここではReactを使ってゼロからセットアップする方法をご案内します。 まず、任意のフォルダ名でプロジェクトを作成します。
次に、<project_name>フォルダで必要なパッケージをインストールします。
その後、srcフォルダのindex.tsxの隣に、以下の内容でconfig.tsファイルを作成します。
クライアントシークレットを含めるため、プロジェクトのルートに必ず .env ファイルを作成してください。
続いて、configindex.tsxWagmiProviderで利用できるようにインポートします。
最後に、App.tsxにWeb SDKのモーダルを表示するボタンを追加します。
これで、ユーザー認証とウォレットアドレスの取得が可能なアプリケーションが完成します。 次のコマンドでテストできます:

3. ブロックチェーンクエリ

コレクティブルをミントしたら、デプロイしたコントラクトのアドレスからデータを取得できます。コントラクトアドレスはここで確認できます:
コントラクトアドレスをコピー
Indexerを使ってデータを取得できます。以下のコードでは、アカウントアドレスと(Sequence Builderでデプロイした)コントラクトアドレスをindexer apiに入力します。 これは、マーケットプレイスでリクエストを作成する際に tokenID を決定する際に重要になります。このデモでは、単一の tokenID を扱うものとします。
インデクサーの呼び出しのレスポンスとして、以下のデータが得られます:
  • contractType(文字列)- コントラクトの種類(例:ERC20、ERC721、ERC1155)
  • contractAddress(文字列)- トークンのコントラクトアドレス
  • accountAddress(文字列)- デプロイしたアカウントのアドレス
  • tokenID(文字列)- トークンの tokenID(ERC20の場合は常に0)
  • balance(文字列)- トークンの残高
  • blockHash(文字列)- トークンがデプロイされたブロックのトランザクション・マークルハッシュ
  • blockNumber(数値)- トークンがデプロイされたブロック番号
  • chainId(数値)- トークンのチェーンID
  • contractType
    • chainId(数値)- トークンのチェーンID
    • address(文字列)- トークンのアドレス
    • name(文字列)- トークンのコントラクトレベルの名称
    • type(文字列)- コントラクトの種類(例:ERC20、ERC721、ERC1155)
    • symbol(文字列)- トークンのシンボル
    • decimals(数値)- トークンの小数点以下の桁数
    • logoURI(文字列)- sequence.app で表示されるトークンのロゴ
    • deployed(ブール値)- トークンがデプロイ済みかどうか
    • bytecodeHash(文字列)- ブロックチェーン上にデプロイされたスマートコントラクトのバイトコードハッシュ
    • extensions
      • link(文字列)- プロジェクトにリンクする関連ウェブサイト
      • description(文字列)- トークンのメタデータ説明
      • ogImage(文字列)- sequence.app で表示されるトークンのバナー画像
      • originChainId(数値)- トークンが表す元のチェーンID
      • originAddress(文字列)- トークンが表す元のコントラクトアドレス
      • verified(ブール値)- トークンが認証・信頼されているかどうか
      • verifiedBy(文字列)- このトークンがスパムでないと認定した認証元
  • updatedAt(日付)- インデクサーが最後に更新された日時
  • tokenMetadata
    • tokenId(文字列)- トークンの tokenID(ERC20の場合は常に0)
    • contractAddress(文字列)- トークンのコントラクトアドレス
    • name(文字列)- トークンレベルの名称
    • description(文字列)- トークンの説明
    • image(文字列)- トークンの画像URL
    • decimals(文字列)- トークンの小数点以下の桁数
    • properties(オブジェクト)- トークンメタデータのプロパティを含むオブジェクト
    • external_url(文字列)- トークンや詳細情報が見つかる外部URL
    • updatedAt(日付)- トークンメタデータが最後に更新された日時

4. 複数ウォレットの種類

この例では Web SDK を使用しており、Sequenceウォレットに加えてEOAウォレットも利用できるため、ブロックチェーンへのトランザクション送信方法が異なります。Sequenceウォレットではガスコスト最適化のためにバッチトランザクションが可能ですが、wagmi でEOAを使う場合は1回に1トランザクションのみ送信できます。 これを実現するために、いくつかの手順を実行して、認証済みウォレットを確認するローカルステート変数を作成します。
Sequence Marketプロトコルでは、リスティングを作成することをrequest、リクエストを受け入れることをorderと呼びます。

5. リクエスト作成

この例では、コミュニティファウセット から Arbitrum Sepolia USDC を使用します。 まずはそちらでトークンを取得し、リクエストを作成してリスティングできるようにしてください。
次に、オーダーブック用のリクエストを作成するには、まずマーケットプレイスのオーダーブックコントラクトにトークンの移転許可を与える必要があります。 まず、マーケットプレイスがコントラクトの承認を受けているかどうかをロジックで確認します。
次に、承認されていない場合と承認済みの場合、またSequenceウォレットかどうかによって、正しいABIでトランザクションを作成し、期待されるcalldata(コールデータ)を生成します。
最後に、Sequenceウォレット以外からのトランザクションで未承認の場合は、useSendTransaction フックからトランザクションレシートを受け取った後、mutexでどのトランザクションのハッシュかを確認し、トランザクションを送信します。これはReactの useEffect 関数内で行います。
コンピュータプログラミングにおいて、ミューテックス(mutex)は、複数のスレッドが同じ共有リソースへ同時にアクセスするのを防ぐためのプログラム上のオブジェクトです。
これでSequence Marketプロトコルへのリクエスト作成は完了です。あとはボタンを実装して、フローを試してください。

6. オーダーの受け入れ

マーケットプレイスにオーダーができたので、次のことを行います:
  • マーケットプレイスのクエリ: 受け入れたい orderId をマーケットプレイスで検索します。
  • 通貨残高: インデクサーを使って通貨残高を確認します。
  • トークン承認: マーケットプレイスがトークンを移転できるようにトークン承認を確認します。

マーケットプレイスのクエリ

マーケットプレイスのオーダーブックをクエリして、pricePerTokenorderId を取得します。

通貨残高

インデクサーを使って残高を確認し、ユーザーがオーダーの支払いに十分なトークンを持っているか確認します。これは次のコードで実現できます:
トークンコントラクトアドレスで等価性チェックを行う際は、必ずすべて小文字で入力してください。

トークン承認

次に、マーケットプレイスが通貨トークンを移転できるように承認されているか確認します。
最後に、実際にブロックチェーンへトランザクションを送信するロジックを完成させます。 前と同じフローで、Sequenceウォレットで未承認の場合はバッチトランザクションを送信し、マーケットプレイスがトークンを使える場合は単一トランザクションのみ送信します。
Sequenceウォレットでなく承認が必要な場合は、先ほどと同様にmutexチェックを含む useEffect を追加します。
ボタンに関数のクリックハンドラーを追加すれば、これですべて完了です。

7.(オプション)Embedded WalletをWeb SDKに統合

Web SDKコネクタをEmbedded Wallet対応にするには、いくつかのパッケージバージョンをインストールし、ガイド冒頭で使った config.ts を更新する必要があります。 Embedded Wallet機能を使うと、ユーザーによる確認不要のトランザクションが可能になり、よりスムーズなUXを実現できます。
最後のステップとして、GoogleやAppleで認証されたURL(例:http://localhost:3000)をチームに共有し、そのURLからEmbedded Walletのログインフローを呼び出せるようにしてください。