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));
関数の概要
| 関数 | 目的 |
|---|---|
createAndRegisterLaunch | 1回の呼び出しでトークンをローンチ — 作成、署名、送信、登録 |
createLaunch | カスタム署名フロー向けに未署名のローンチトランザクションを構築 |
registerLaunch | 作成トランザクションがオンチェーンで確認された後にローンチを登録 |
claimCreatorRewards | ウォレットのすべてのバケットで発生したクリエイター報酬を請求 |
3つの統合モード
SDK はローンチ作成のために、完全自動から完全手動まで3つのモードを提供します。
イージーモード — createAndRegisterLaunch
最もシンプルなアプローチです。1回の関数呼び出しですべてを処理します:オンチェーンアカウントの作成、Umi を介したトランザクションの署名と送信、そしてローンチの登録を行います。
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:
| フィールド | 型 | 説明 |
|---|---|---|
signatures | Uint8Array[] | トランザクション署名 |
mintAddress | string | 作成されたトークンミントアドレス |
genesisAccount | string | Genesis アカウント PDA アドレス |
launch.id | string | ローンチ ID |
launch.link | string | ローンチページ URL |
token.id | string | トークン ID |
token.mintAddress | string | トークンミントアドレス |
ミディアムモード — カスタムトランザクション送信
マルチシグウォレットやカスタムリトライロジックなどのシナリオに対応するため、createAndRegisterLaunch にカスタム txSender コールバックを指定して使用します。
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 を呼び出します。
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:
| フィールド | 型 | 説明 |
|---|---|---|
transactions | Transaction[] | 署名して送信する未署名の Umi トランザクション |
blockhash | BlockhashWithExpiryBlockHeight | トランザクション確認用のブロックハッシュ |
mintAddress | string | 作成されたトークンミントアドレス |
genesisAccount | string | Genesis アカウント PDA アドレス |
registerLaunch の戻り値 RegisterLaunchResponse:
| フィールド | 型 | 説明 |
|---|---|---|
existing | boolean? | ローンチが既に登録されている場合は true |
launch.id | string | ローンチ ID |
launch.link | string | ローンチページ URL |
token.id | string | トークン ID |
token.mintAddress | string | トークンミントアドレス |
registerLaunch を呼び出す前に、トランザクションがオンチェーンで確認されている必要があります。登録エンドポイントは、Genesis アカウントが存在し、期待される設定と一致することを検証します。
クリエイター報酬の請求
claimCreatorRewards は POST /v1/creator-rewards/claim を呼び出し、請求可能なすべてのボンディングカーブおよび Raydium バケット向けの Base64 エンコード済み請求トランザクションを、Umi の Transaction にデシリアライズして返します。各トランザクションに Umi の identity で署名して送信してください。クリエイター手数料の設定、蓄積の確認、バケットごとの低レベル命令を含む請求フロー全体については、Genesis ボンディングカーブのクリエイター手数料を参照してください。
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
| フィールド | 型 | 必須 | 説明 |
|---|---|---|---|
wallet | PublicKey | string | はい | 請求対象のクリエイター手数料ウォレット。 |
network | SvmNetwork | いいえ | 'solana-mainnet'(デフォルト)または 'solana-devnet'。API のベース URL(https://api.metaplex.com)と一致している必要があります |
payer | PublicKey | string | いいえ | 返されるトランザクションの手数料とレントを負担するウォレット。デフォルトは wallet。クリエイター手数料ウォレットが SOL を保有していない場合(例:エージェント PDA)に使用します。payer は返されたトランザクションに署名する必要があり、請求された SOL は引き続きクリエイター手数料ウォレットが受け取ります。 |
ClaimCreatorRewardsResponse
| フィールド | 型 | 説明 |
|---|---|---|
transactions | Transaction[] | デシリアライズ済みの Umi トランザクション。請求するバケットごとに1つ。payer の identity で各トランザクションに署名して送信してください。 |
blockhash | BlockhashWithExpiryBlockHeight | トランザクションの構築に使用されたブロックハッシュ。確認にはこれを使用してください。新たに取得したブロックハッシュで代用しないでください。 |
報酬なしは空配列ではなく型付きエラーです
ウォレットに請求できるものがない場合、API は HTTP 400 と {"error":{"message":"No rewards available to claim"}} を返し、SDK は GenesisApiError をスローします。呼び出し側はエラーをキャッチし、err.message(または err.statusCode === 400)で分岐する必要があります。result.transactions.length === 0 には依存できません。報酬なしのケースの処理を参照してください。
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
| フィールド | 型 | 必須 | 説明 |
|---|---|---|---|
wallet | PublicKey | string | はい | 作成者のウォレット(トランザクションに署名) |
token | TokenMetadata | はい | トークンメタデータ |
network | SvmNetwork | いいえ | 'solana-mainnet'(デフォルト)または 'solana-devnet' |
quoteMint | QuoteMintInput | いいえ | 'SOL'(デフォルト)または 'USDC' |
launchType | CreateLaunchType | はい | 'launchpool' — 基盤ローンチメカニズム |
launch | LaunchpoolLaunchInput | はい | ローンチ設定 |
TokenMetadata
| フィールド | 型 | 必須 | 説明 |
|---|---|---|---|
name | string | はい | トークン名、1〜32文字 |
symbol | string | はい | トークンシンボル、1〜10文字 |
image | string | はい | 画像 URL(有効な HTTPS URL) |
description | string | いいえ | 最大250文字 |
externalLinks | ExternalLinks | いいえ | ウェブサイト、Twitter、Telegram のリンク |
ExternalLinks
| フィールド | 型 | 説明 |
|---|---|---|
website | string? | ウェブサイト URL |
twitter | string? | Twitter/X ハンドル(@mytoken)またはフル URL |
telegram | string? | Telegram ハンドルまたはフル URL |
LaunchpoolConfig
| フィールド | 型 | 説明 |
|---|---|---|
tokenAllocation | number | 販売するトークン数(総供給量10億の一部) |
depositStartTime | Date | string | 入金期間の開始時刻(48時間継続) |
raiseGoal | number | 最低調達目標(整数単位、例:250 SOL)。最低 250 SOL または 5,000 USDC |
raydiumLiquidityBps | number | Raydium LP に使用する調達資金の割合(ベーシスポイント、2000〜10000) |
fundsRecipient | PublicKey | string | ロック解除された調達資金の受取先 |
softCap | number? | 調達するクォートトークンの任意の上限(整数単位)。これを超える入金は按分で返金されます。0 より大きい必要があります。上限なしの場合は省略 |
ClaimScheduleAllocation(ベスティングロック)
ClaimScheduleAllocation は、トークン供給量の一部に対する Genesis ネイティブのベスティングロックを定義し、launch.claimScheduleAllocations で渡します。各アロケーションはオンチェーンの ClaimScheduleBucketV2 になります。トークンはオプションのクリフを持つ線形カーブに沿って累積され、SDK は以下の人間が読みやすいスケジュールをオンチェーンの秒数とベーシスポイントの値に変換します。
| フィールド | 型 | 必須 | 説明 |
|---|---|---|---|
name | string | はい | ロック名、最大64文字(例:"Team"、"Advisors") |
recipient | PublicKey | string | はい | ベスティング済みトークンを請求できるウォレット |
tokenAmount | number | はい | ベスティングスケジュールの総トークン数 |
vestingStartTime | Date | string | はい | 線形ベスティングカーブの累積開始時刻 |
vestingDuration | { value: number, unit: TimeUnit } | はい | 線形ベスティング期間の長さ |
unlockSchedule | TimeUnit | はい | トークンがアンロックされる頻度 |
cliff | { duration, unlockAmount? } | いいえ | オプションのクリフ。duration は vestingStartTime からの期間、unlockAmount はトークン数、または比例配分を表す 'linear'(デフォルト) |
cancelable | boolean | いいえ | ローンチ作成者がロックをキャンセルできます。デフォルトは false |
cancelableByRecipient | boolean | いいえ | 受取人がロックをキャンセルできます。デフォルトは false |
transferable | boolean | いいえ | ローンチ作成者がロックを移転できます。デフォルトは false |
transferableByRecipient | boolean | いいえ | 受取人がロックを移転できます。デフォルトは false |
pausable | boolean | いいえ | 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'
ベスティングロックの例:
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[]> | — | カスタムトランザクション送信コールバック |
commitment | string | 'confirmed' | 確認のコミットメントレベル |
preflightCommitment | string | 'confirmed' | プリフライトのコミットメントレベル |
skipPreflight | boolean | false | プリフライトチェックをスキップ |
エラーハンドリング
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);
}
}
| プロパティ | 型 | 説明 |
|---|---|---|
statusCode | number | HTTP ステータスコード |
responseBody | unknown | API からの完全なレスポンスボディ |
GenesisApiNetworkError
fetch 呼び出しが失敗した場合(ネットワーク障害、DNS エラーなど)にスローされます。
import { isGenesisApiNetworkError } from '@metaplex-foundation/genesis';
if (isGenesisApiNetworkError(err)) {
console.error('Network error:', err.cause.message);
}
| プロパティ | 型 | 説明 |
|---|---|---|
cause | Error | 基となる fetch エラー |
GenesisValidationError
API 呼び出し前に入力バリデーションが失敗した場合にスローされます。
import { isGenesisValidationError } from '@metaplex-foundation/genesis';
if (isGenesisValidationError(err)) {
console.error(`Validation failed on field "${err.field}":`, err.message);
}
| プロパティ | 型 | 説明 |
|---|---|---|
field | string | バリデーションに失敗した入力フィールド |
包括的なエラーハンドリング
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 流動性 BPS | 2000〜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
