SDK

API クライアント

Last updated October 12, 2026

Genesis API クライアントは、トークンローンチの作成と登録のための高レベルな関数を提供します。Umi 上に構築されたシンプルなインターフェースを通じて、トランザクションの構築、署名、オンチェーン登録を処理します。

Genesis プログラムの全機能セットは metaplex.com ではまだサポートされていないため、プログラムによるローンチの作成には SDK の使用を推奨します。API を通じて作成されたメインネットのローンチは、登録後に metaplex.com に表示されます。

インストール

npm install @metaplex-foundation/genesis @metaplex-foundation/umi \
@metaplex-foundation/umi-bundle-defaults

セットアップ

import { createUmi } from '@metaplex-foundation/umi-bundle-defaults';
import { genesis } from '@metaplex-foundation/genesis';
import { keypairIdentity } from '@metaplex-foundation/umi';
const umi = createUmi('https://api.mainnet-beta.solana.com')
.use(genesis());
// For server-side or scripts, load a keypair
umi.use(keypairIdentity(myKeypair));

関数の概要

関数目的
createAndRegisterLaunch1回の呼び出しでトークンをローンチ — 作成、署名、送信、登録
createLaunchカスタム署名フロー向けに未署名のローンチトランザクションを構築
registerLaunch作成トランザクションがオンチェーンで確認された後にローンチを登録
claimCreatorRewardsウォレットのすべてのバケットで発生したクリエイター報酬を請求

3つの統合モード

SDK はローンチ作成のために、完全自動から完全手動まで3つのモードを提供します。

イージーモード — createAndRegisterLaunch

最もシンプルなアプローチです。1回の関数呼び出しですべてを処理します:オンチェーンアカウントの作成、Umi を介したトランザクションの署名と送信、そしてローンチの登録を行います。

createAndRegisterLaunch.ts
1import {
2 createAndRegisterLaunch,
3 CreateLaunchInput,
4 genesis,
5} from '@metaplex-foundation/genesis'
6import { createUmi } from '@metaplex-foundation/umi-bundle-defaults'
7import { keypairIdentity } from '@metaplex-foundation/umi'
8
9const umi = createUmi('https://api.mainnet-beta.solana.com')
10 .use(genesis())
11
12// Use keypairIdentity to set a wallet when running server-side:
13// umi.use(keypairIdentity(myKeypair))
14
15const input: CreateLaunchInput = {
16 wallet: umi.identity.publicKey,
17 token: {
18 name: 'My Token',
19 symbol: 'MTK',
20 image: 'https://gateway.irys.xyz/...',
21 },
22 launchType: 'launchpool',
23 launch: {
24 launchpool: {
25 tokenAllocation: 500_000_000,
26 depositStartTime: new Date(Date.now() + 48 * 60 * 60 * 1000),
27 raiseGoal: 250,
28 raydiumLiquidityBps: 5000,
29 fundsRecipient: umi.identity.publicKey,
30 },
31 },
32}
33
34const result = await createAndRegisterLaunch(umi, {}, input)
35console.log(`Launch live at: ${result.launch.link}`)

戻り値 CreateAndRegisterLaunchResult:

フィールド型説明
signaturesUint8Array[]トランザクション署名
mintAddressstring作成されたトークンミントアドレス
genesisAccountstringGenesis アカウント PDA アドレス
launch.idstringローンチ ID
launch.linkstringローンチページ URL
token.idstringトークン ID
token.mintAddressstringトークンミントアドレス

ミディアムモード — カスタムトランザクション送信

マルチシグウォレットやカスタムリトライロジックなどのシナリオに対応するため、createAndRegisterLaunch にカスタム txSender コールバックを指定して使用します。

customTxSender.ts
1import {
2 createAndRegisterLaunch,
3 SignAndSendOptions,
4} from '@metaplex-foundation/genesis'
5
6// Assumes umi and input from the Easy Mode example.
7
8const options: SignAndSendOptions = {
9 txSender: async (transactions) => {
10 // Replace myCustomSign / myCustomSend with your own
11 // signing and sending implementation.
12 const signatures: Uint8Array[] = []
13 for (const tx of transactions) {
14 const signed = await myCustomSign(tx) // your signer
15 const sig = await myCustomSend(signed) // your sender
16 signatures.push(sig)
17 }
18 return signatures
19 },
20}
21
22const result = await createAndRegisterLaunch(umi, {}, input, options)
23console.log(`Launch live at: ${result.launch.link}`)

txSender コールバックは未署名トランザクションの配列を受け取り、署名の配列を返す必要があります。コールバック完了後、SDK が登録処理を行います。

フルコントロール — createLaunch + registerLaunch

トランザクションライフサイクルを完全に制御するモードです。createLaunch を呼び出して未署名トランザクションを取得し、署名と送信を自分で行った後、registerLaunch を呼び出します。

fullControl.ts
1import {
2 createLaunch,
3 registerLaunch,
4} from '@metaplex-foundation/genesis'
5
6// Assumes umi and input from the Easy Mode example.
7
8// Step 1: Get unsigned transactions from the API
9const createResult = await createLaunch(umi, {}, input)
10
11// Step 2: Sign and send each transaction
12for (const tx of createResult.transactions) {
13 const signedTx = await umi.identity.signTransaction(tx)
14 const signature = await umi.rpc.sendTransaction(signedTx, {
15 commitment: 'confirmed',
16 preflightCommitment: 'confirmed',
17 })
18 await umi.rpc.confirmTransaction(signature, {
19 commitment: 'confirmed',
20 strategy: {
21 type: 'blockhash',
22 ...createResult.blockhash,
23 },
24 })
25}
26
27// Step 3: Register the launch
28const registerResult = await registerLaunch(umi, {}, {
29 genesisAccount: createResult.genesisAccount,
30 createLaunchInput: input,
31})
32console.log(`Launch live at: ${registerResult.launch.link}`)

createLaunch の戻り値 CreateLaunchResponse:

フィールド型説明
transactionsTransaction[]署名して送信する未署名の Umi トランザクション
blockhashBlockhashWithExpiryBlockHeightトランザクション確認用のブロックハッシュ
mintAddressstring作成されたトークンミントアドレス
genesisAccountstringGenesis アカウント PDA アドレス

registerLaunch の戻り値 RegisterLaunchResponse:

フィールド型説明
existingboolean?ローンチが既に登録されている場合は true
launch.idstringローンチ ID
launch.linkstringローンチページ URL
token.idstringトークン ID
token.mintAddressstringトークンミントアドレス

registerLaunch を呼び出す前に、トランザクションがオンチェーンで確認されている必要があります。登録エンドポイントは、Genesis アカウントが存在し、期待される設定と一致することを検証します。


クリエイター報酬の請求

claimCreatorRewards は POST /v1/creator-rewards/claim を呼び出し、請求可能なすべてのボンディングカーブおよび Raydium バケット向けの Base64 エンコード済み請求トランザクションを、Umi の Transaction にデシリアライズして返します。各トランザクションに Umi の identity で署名して送信してください。クリエイター手数料の設定、蓄積の確認、バケットごとの低レベル命令を含む請求フロー全体については、Genesis ボンディングカーブのクリエイター手数料を参照してください。

claimCreatorRewards.ts
1import { claimCreatorRewards } from '@metaplex-foundation/genesis'
2import { base58 } from '@metaplex-foundation/umi/serializers'
3import { createUmi } from '@metaplex-foundation/umi-bundle-defaults'
4import { keypairIdentity } from '@metaplex-foundation/umi'
5
6const umi = createUmi('https://api.mainnet-beta.solana.com')
7const keypair = umi.eddsa.createKeypairFromSecretKey(mySecretKeyBytes)
8umi.use(keypairIdentity(keypair))
9
10const result = await claimCreatorRewards(umi, {}, {
11 wallet: umi.identity.publicKey,
12 network: 'solana-mainnet',
13 // payer is optional — defaults to `wallet` on the server.
14 // Set it to have a different wallet cover rent and transaction fees.
15 // payer: umi.identity.publicKey,
16})
17
18for (const tx of result.transactions) {
19 const signed = await umi.identity.signTransaction(tx)
20 const signature = await umi.rpc.sendTransaction(signed, {
21 preflightCommitment: 'confirmed',
22 })
23 await umi.rpc.confirmTransaction(signature, {
24 strategy: { type: 'blockhash', ...result.blockhash },
25 commitment: 'confirmed',
26 })
27 console.log('Claimed:', base58.deserialize(signature)[0])
28}
29
30// Claimed: 5uGGYEMmjP2HpyFCvLPNpVDSQEBtUE3LR6ZQFqhJxQSh5FbKacSyN8nQmAJowuFs6BTCdwzoFyyJz8Y2hQx8kPxo
31// Claimed: 3TAroVovEap1ZEAJYq3WiDZoMK3GU3soCdrhvZJNg6b9EANqvWrVcDGNffm7mD8wvtpR7ynWQBcbrmz8AK6nrhfy

ClaimCreatorRewardsInput

フィールド型必須説明
walletPublicKey | stringはい請求対象のクリエイター手数料ウォレット。
networkSvmNetworkいいえ'solana-mainnet'(デフォルト)または 'solana-devnet'。API のベース URL(https://api.metaplex.com)と一致している必要があります
payerPublicKey | stringいいえ返されるトランザクションの手数料とレントを負担するウォレット。デフォルトは wallet。クリエイター手数料ウォレットが SOL を保有していない場合(例:エージェント PDA)に使用します。payer は返されたトランザクションに署名する必要があり、請求された SOL は引き続きクリエイター手数料ウォレットが受け取ります。

ClaimCreatorRewardsResponse

フィールド型説明
transactionsTransaction[]デシリアライズ済みの Umi トランザクション。請求するバケットごとに1つ。payer の identity で各トランザクションに署名して送信してください。
blockhashBlockhashWithExpiryBlockHeightトランザクションの構築に使用されたブロックハッシュ。確認にはこれを使用してください。新たに取得したブロックハッシュで代用しないでください。

報酬なしは空配列ではなく型付きエラーです

ウォレットに請求できるものがない場合、API は HTTP 400 と {"error":{"message":"No rewards available to claim"}} を返し、SDK は GenesisApiError をスローします。呼び出し側はエラーをキャッチし、err.message(または err.statusCode === 400)で分岐する必要があります。result.transactions.length === 0 には依存できません。報酬なしのケースの処理を参照してください。

errorHandling.ts
1import {
2 claimCreatorRewards,
3 isGenesisApiError,
4 isGenesisApiNetworkError,
5} from '@metaplex-foundation/genesis'
6
7// Assumes umi is configured with a keypair identity.
8
9try {
10 const result = await claimCreatorRewards(umi, {}, {
11 wallet: umi.identity.publicKey,
12 network: 'solana-mainnet',
13 })
14 console.log(`Claimable transactions: ${result.transactions.length}`)
15} catch (err) {
16 if (isGenesisApiError(err)) {
17 // The API returns HTTP 400 with
18 // { "error": { "message": "No rewards available to claim" } }
19 // when the wallet has no unclaimed creator rewards. Match on the message
20 // (or statusCode === 400) to handle this as a success case rather than a
21 // failure.
22 if (err.message === 'No rewards available to claim') {
23 console.log('Nothing to claim right now.')
24 } else {
25 console.error('API error:', err.statusCode, err.message)
26 }
27 } else if (isGenesisApiNetworkError(err)) {
28 console.error('Network error:', err.cause.message)
29 } else {
30 throw err
31 }
32}
33
34// Nothing to claim right now.

設定

CreateLaunchInput

フィールド型必須説明
walletPublicKey | stringはい作成者のウォレット(トランザクションに署名)
tokenTokenMetadataはいトークンメタデータ
networkSvmNetworkいいえ'solana-mainnet'(デフォルト)または 'solana-devnet'
quoteMintQuoteMintInputいいえ'SOL'(デフォルト)または 'USDC'
launchTypeCreateLaunchTypeはい'launchpool' — 基盤ローンチメカニズム
launchLaunchpoolLaunchInputはいローンチ設定

TokenMetadata

フィールド型必須説明
namestringはいトークン名、1〜32文字
symbolstringはいトークンシンボル、1〜10文字
imagestringはい画像 URL(有効な HTTPS URL)
descriptionstringいいえ最大250文字
externalLinksExternalLinksいいえウェブサイト、Twitter、Telegram のリンク
フィールド型説明
websitestring?ウェブサイト URL
twitterstring?Twitter/X ハンドル(@mytoken)またはフル URL
telegramstring?Telegram ハンドルまたはフル URL

LaunchpoolConfig

フィールド型説明
tokenAllocationnumber販売するトークン数(総供給量10億の一部)
depositStartTimeDate | string入金期間の開始時刻(48時間継続)
raiseGoalnumber最低調達目標(整数単位、例:250 SOL)。最低 250 SOL または 5,000 USDC
raydiumLiquidityBpsnumberRaydium LP に使用する調達資金の割合(ベーシスポイント、2000〜10000)
fundsRecipientPublicKey | stringロック解除された調達資金の受取先
softCapnumber?調達するクォートトークンの任意の上限(整数単位)。これを超える入金は按分で返金されます。0 より大きい必要があります。上限なしの場合は省略

ClaimScheduleAllocation(ベスティングロック)

ClaimScheduleAllocation は、トークン供給量の一部に対する Genesis ネイティブのベスティングロックを定義し、launch.claimScheduleAllocations で渡します。各アロケーションはオンチェーンの ClaimScheduleBucketV2 になります。トークンはオプションのクリフを持つ線形カーブに沿って累積され、SDK は以下の人間が読みやすいスケジュールをオンチェーンの秒数とベーシスポイントの値に変換します。

フィールド型必須説明
namestringはいロック名、最大64文字(例:"Team"、"Advisors")
recipientPublicKey | stringはいベスティング済みトークンを請求できるウォレット
tokenAmountnumberはいベスティングスケジュールの総トークン数
vestingStartTimeDate | stringはい線形ベスティングカーブの累積開始時刻
vestingDuration{ value: number, unit: TimeUnit }はい線形ベスティング期間の長さ
unlockScheduleTimeUnitはいトークンがアンロックされる頻度
cliff{ duration, unlockAmount? }いいえオプションのクリフ。duration は vestingStartTime からの期間、unlockAmount はトークン数、または比例配分を表す 'linear'(デフォルト)
cancelablebooleanいいえローンチ作成者がロックをキャンセルできます。デフォルトは false
cancelableByRecipientbooleanいいえ受取人がロックをキャンセルできます。デフォルトは false
transferablebooleanいいえローンチ作成者がロックを移転できます。デフォルトは false
transferableByRecipientbooleanいいえ受取人がロックを移転できます。デフォルトは false
pausablebooleanいいえGenesis の権限者がベスティングを一時停止・再開できます。デフォルトは false

ローンチプールでは、vestingStartTime がそれより前でトークンがすでに累積していても、ローンチがグラデュエートするまでベスティング済みトークンを請求できません。解決後のクリフ分は 0 より大きくなければなりません。

lockedAllocations は非推奨です

launch.lockedAllocations(旧 Streamflow ロックアップ)は非推奨です。SDK は引き続きこれを受け付け、各エントリをクレームスケジュールにマッピングするため、既存の連携はそのままコンパイルできます。新規の連携では claimScheduleAllocations を使用してください。移行時には、cancelableBySender を cancelable に、transferableBySender を transferable に名前変更してください。

TimeUnit の値: 'SECOND'、'MINUTE'、'HOUR'、'DAY'、'WEEK'、'TWO_WEEKS'、'MONTH'、'QUARTER'、'YEAR'

ベスティングロックの例:

claimScheduleAllocations.ts
1import {
2 createAndRegisterLaunch,
3 CreateLaunchInput,
4 genesis,
5} from '@metaplex-foundation/genesis'
6import { createUmi } from '@metaplex-foundation/umi-bundle-defaults'
7import { keypairIdentity } from '@metaplex-foundation/umi'
8
9const umi = createUmi('https://api.mainnet-beta.solana.com')
10 .use(genesis())
11
12// Use keypairIdentity to set a wallet when running server-side:
13// umi.use(keypairIdentity(myKeypair))
14
15const input: CreateLaunchInput = {
16 wallet: umi.identity.publicKey,
17 token: {
18 name: 'My Token',
19 symbol: 'MTK',
20 image: 'https://gateway.irys.xyz/...',
21 description: 'A project token with vesting locks.',
22 externalLinks: {
23 website: 'https://example.com',
24 twitter: '@mytoken',
25 },
26 },
27 launchType: 'launchpool',
28 launch: {
29 launchpool: {
30 tokenAllocation: 500_000_000,
31 depositStartTime: new Date('2026-04-01T00:00:00Z'),
32 raiseGoal: 250,
33 raydiumLiquidityBps: 5000,
34 fundsRecipient: 'FundsRecipientWallet...',
35 },
36 claimScheduleAllocations: [
37 {
38 name: 'Team',
39 recipient: 'TeamWallet...',
40 tokenAmount: 100_000_000,
41 vestingStartTime: new Date('2026-04-05T00:00:00Z'),
42 vestingDuration: { value: 1, unit: 'YEAR' },
43 unlockSchedule: 'MONTH',
44 cliff: {
45 duration: { value: 3, unit: 'MONTH' },
46 unlockAmount: 10_000_000,
47 },
48 cancelable: false,
49 pausable: false,
50 },
51 ],
52 },
53}
54
55const result = await createAndRegisterLaunch(umi, {}, input)
56console.log(`Launch live at: ${result.launch.link}`)

SignAndSendOptions

createAndRegisterLaunch のオプション(RpcSendTransactionOptions を拡張):

フィールド型デフォルト説明
txSender(txs: Transaction[]) => Promise<Uint8Array[]>—カスタムトランザクション送信コールバック
commitmentstring'confirmed'確認のコミットメントレベル
preflightCommitmentstring'confirmed'プリフライトのコミットメントレベル
skipPreflightbooleanfalseプリフライトチェックをスキップ

エラーハンドリング

SDK は型ガード関数を備えた3種類のエラー型を提供します。

GenesisApiError

API が成功以外のレスポンスを返した場合にスローされます。

import { isGenesisApiError } from '@metaplex-foundation/genesis';
try {
await createLaunch(umi, {}, input);
} catch (err) {
if (isGenesisApiError(err)) {
console.error('API error:', err.statusCode, err.responseBody);
}
}
プロパティ型説明
statusCodenumberHTTP ステータスコード
responseBodyunknownAPI からの完全なレスポンスボディ

GenesisApiNetworkError

fetch 呼び出しが失敗した場合(ネットワーク障害、DNS エラーなど)にスローされます。

import { isGenesisApiNetworkError } from '@metaplex-foundation/genesis';
if (isGenesisApiNetworkError(err)) {
console.error('Network error:', err.cause.message);
}
プロパティ型説明
causeError基となる fetch エラー

GenesisValidationError

API 呼び出し前に入力バリデーションが失敗した場合にスローされます。

import { isGenesisValidationError } from '@metaplex-foundation/genesis';
if (isGenesisValidationError(err)) {
console.error(`Validation failed on field "${err.field}":`, err.message);
}
プロパティ型説明
fieldstringバリデーションに失敗した入力フィールド

包括的なエラーハンドリング

errorHandling.ts
1import {
2 createAndRegisterLaunch,
3 isGenesisApiError,
4 isGenesisApiNetworkError,
5 isGenesisValidationError,
6} from '@metaplex-foundation/genesis'
7
8// Assumes umi and input from the Easy Mode example.
9
10try {
11 const result = await createAndRegisterLaunch(umi, {}, input)
12 console.log(`Launch live at: ${result.launch.link}`)
13} catch (err) {
14 if (isGenesisValidationError(err)) {
15 console.error(`Invalid input "${err.field}":`, err.message)
16 } else if (isGenesisApiError(err)) {
17 console.error('API error:', err.statusCode, err.responseBody)
18 } else if (isGenesisApiNetworkError(err)) {
19 console.error('Network error:', err.cause.message)
20 } else {
21 throw err
22 }
23}

バリデーションルール

SDK は API に送信する前に入力を検証します:

ルール制約
トークン名1〜32文字
トークンシンボル1〜10文字
トークン画像有効な HTTPS URL
トークン説明最大250文字
トークンアロケーション0より大きい値
調達目標0より大きい値
Raydium 流動性 BPS2000〜10000(20%〜100%)
総供給量10億トークンで固定
ロック付きアロケーション名最大64文字

総供給量は常に10億トークンです。SDK はローンチプール、Raydium LP、およびロック付きアロケーションを差し引いた残りとして、作成者のアロケーションを自動的に計算します。


ヘルパー関数

signAndSendLaunchTransactions

デフォルトの署名・送信動作をスタンドアロン関数として使用する場合(リトライや部分フローに便利):

import {
createLaunch,
signAndSendLaunchTransactions,
} from '@metaplex-foundation/genesis';
const createResult = await createLaunch(umi, {}, input);
const signatures = await signAndSendLaunchTransactions(umi, createResult, {
commitment: 'confirmed',
});

トランザクションは順番に署名・送信されます — 各トランザクションは次のものが送信される前に確認されます。

buildCreateLaunchPayload

入力を検証し、生の API ペイロードを構築します。高度なユースケース向けにエクスポートされています:

import { buildCreateLaunchPayload } from '@metaplex-foundation/genesis';
const payload = buildCreateLaunchPayload(input);
// Use payload with your own HTTP client