Solana Anchor IDO Poolのサンプルプログラムの読み方と開発(リンク集)

Solana対応のSerum AnchorがIDO Poolのサンプルプログラムを公開している。ソースを読んで開発するときに、いくつかリソースを参照する必要があるため、そのリンク集を整理した。

サンプルプログラム

オリジナル

GitHub - project-serum/anchor/ido-pool

参考用

自分用にデバッグなどを付け加えたバージョンもあるため参考までに。
GitHub - 256hax/solana-anchor-react-minimal-example/ido-pool

テスト実行(ido-poolディレクトリにて)

必要なモジュールをインストールする。

% yarn add mocha
% yarn add @project-serum/anchor
% yarn add @solana/spl-token
% yarn add @project-serum/common
% yarn add @project-serum/serum
% yarn install

テスト実行。

% anchor test
〜〜〜省略(warningがいくつか出るが一旦省略)〜〜〜

  ido-pool
    ✔ Initializes the state-of-the-world (2478ms)
    ✔ Initializes the IDO pool (462ms)
Sleeping for 5.854 seconds
    ✔ Exchanges user USDC for redeemable tokens (7046ms)
    ✔ Exchanges a second users USDC for redeemable tokens (1399ms)
    ✔ Exchanges user Redeemable tokens for USDC (478ms)
Sleeping for 7.931 seconds
    ✔ Exchanges user Redeemable tokens for watermelon (8628ms)
    ✔ Exchanges second user's Redeemable tokens for watermelon (914ms)
    ✔ Withdraws total USDC from pool account (466ms)
    ✔ Withdraws USDC from the escrow account after waiting period is over (450ms)


  9 passing (22s)

✨  Done in 28.20s.

プログラムを読む時のレファレンス先

programs(RUST)のlib.rsを読む場合

tests(JS)のido-pool.jsを読む場合

ドキュメントが存在しないものもあり、その場合はソースを直接読む必要あり。
(ソースの場所がたまに変わったりするため、以下はバージョン固定でリンク)

解説記事

2022年1月3日時点で解説記事が見つからなかったため、anchor testの実行結果とソースを読んでいくのが主な進め方になる。

やや古いソースになるが、Mango MarketsがAnchorのIDO Poolの解説を少しだけしている。

blockworks-foundation / ido-pool

その他

Q&A

その他の不明点はDiscordで検索。
Anchor Discord

エラー

anchor testすると、たまに以下のようなエラーが表示された。何度か実行すると直ったりして原因不明。

% anchor test
〜〜〜省略〜〜〜

  ido-pool
    ✔ Initializes the state-of-the-world (3422ms)
    ✔ Initializes the IDO pool (715ms)
Sleeping for 6.08 seconds
    ✔ Exchanges user USDC for redeemable tokens (8030ms)
    ✔ Exchanges a second users USDC for redeemable tokens (2309ms)
    ✔ Exchanges user Redeemable tokens for USDC (737ms)
Sleeping for 6.003 seconds
Transaction simulation failed: Error processing Instruction 0: custom program error: 0x1775
    Program Fg6PaFpoGXkYsidMpWTK6W2BeZ7FEfcYkg476zPFsLnS invoke [1]
    Program log: Instruction: ExchangeRedeemableForWatermelon
    Program log: Custom program error: 0x1775
    Program Fg6PaFpoGXkYsidMpWTK6W2BeZ7FEfcYkg476zPFsLnS consumed 28821 of 200000 compute units
    Program Fg6PaFpoGXkYsidMpWTK6W2BeZ7FEfcYkg476zPFsLnS failed: custom program error: 0x1775
    1) Exchanges user Redeemable tokens for watermelon
    2) Exchanges second user's Redeemable tokens for watermelon
    ✔ Withdraws total USDC from pool account (608ms)
    ✔ Withdraws USDC from the escrow account after waiting period is over (642ms)


  7 passing (24s)
  2 failing

  1) ido-pool
       Exchanges user Redeemable tokens for watermelon:
     Error: 6005: IDO has not finished yet
      at Function.parse (node_modules/@project-serum/anchor/dist/cjs/error.js:35:20)
      at Object.rpc [as exchangeRedeemableForWatermelon] (node_modules/@project-serum/anchor/dist/cjs/program/namespace/rpc.js:38:61)
      at processTicksAndRejections (node:internal/process/task_queues:96:5)
      at async Context.<anonymous> (tests/ido-pool.js:453:5)

  2) ido-pool
       Exchanges second user's Redeemable tokens for watermelon:

      AssertionError [ERR_ASSERTION]: The expression evaluated to a falsy value:

  assert.ok(poolWatermelonAccount.amount.eq(new anchor.BN(0)))

      + expected - actual

      -false
      +true

      at Context.<anonymous> (tests/ido-pool.js:524:12)
      at processTicksAndRejections (node:internal/process/task_queues:96:5)



error Command failed with exit code 2.
info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.