런치 유형
Genesis 본딩 커브의 창작자 수수료
Last updated April 24, 2026
창작자 수수료는 Genesis 본딩 커브에서 매수와 매도마다 구성된 지갑에 누적되는 선택적 스왑당 수수료입니다.
배울 내용
- 런칭 시 창작자 수수료 지갑 구성
- 특정 지갑 또는 에이전트 PDA로 수수료 지정
- 버킷에 누적된 금액 확인
- 활성 커브 중 누적 수수료 청구
- Raydium CPMM 풀에서 졸업 후 수수료 청구
요약
창작자 수수료는 Genesis 본딩 커브에서 선택적 스왑당 수수료로, 모든 매수와 매도의 SOL 측면에 적용됩니다. 수수료는 버킷 계정(creatorFeeAccrued)에 누적되며 즉시 전송되지 않습니다 — Metaplex API(권장)를 통해 한 번의 호출로 청구하거나 온체인 명령으로 버킷별로 청구하세요.
- 구성 — 커브 생성 시
launch객체에서creatorFeeWallet을 설정합니다; 생략하면 런칭 지갑이 기본값 - 누적 —
creatorFeeAccrued가 매 스왑에서 증가합니다; 수수료는 스왑당 전송되지 않습니다 - 권장 청구 경로 —
POST /v1/creator-rewards/claim(또는 SDK의claimCreatorRewards)는 지갑의 모든 본딩 커브와 Raydium 버킷을 집계하고 서명할 준비가 된 트랜잭션을 반환합니다 - 활성 커브 청구 (수동) —
claimBondingCurveCreatorFeeV2가 커브가 라이브 중에 누적 수수료를 수집합니다 - 졸업 후 청구 (수동) — 2단계:
collectRaydiumCpmmFeesWithCreatorFeeV2가 Raydium 풀에서 LP 수수료를 Genesis 버킷으로 수집한 다음,claimRaydiumCreatorFeeV2가 버킷 잔액을 창작자 지갑으로 전송합니다
창작자 수수료가 스왑 가격 책정 및 프로토콜 스왑 수수료와 상호 작용하는 방법은 운영 이론 — 수수료 구조를 참조하세요.
빠른 시작
이 섹션에서는 Metaplex API(권장) 또는 활성 커브 및 졸업 후 Raydium 단계를 다루는 저수준 온체인 명령을 통해 창작자 수수료를 구성하고 청구하는 최소 단계를 설명합니다.
빠른 참조
이 표는 각 수수료 명령어를 호출하는 시기, 필요한 계정, 그리고 창작자 수수료 수명 주기에 미치는 영향을 요약합니다.
| 명령어 | 사용 시기 | 필요한 계정 | 출력 / 효과 |
|---|---|---|---|
createAndRegisterLaunch(creatorFeeWallet 설정) | 커브 생성 시 | 창작자 지갑, 런칭 서명자 | 버킷에 수수료 지갑 구성 |
claimCreatorRewards(API / SDK) | 아무 때나 — 권장 경로 | 창작자 수수료 지갑(선택적 payer) | 한 번의 호출로 모든 자격 있는 버킷을 청구하는 서명된 트랜잭션 반환 |
fetchBondingCurveBucketV2(creatorFeeAccrued 읽기) | 활성 커브 중 아무 때나 | 버킷 PDA | 현재 누적 수수료 잔액(lamports) |
claimBondingCurveCreatorFeeV2 | 활성 커브 — 누적 수수료 수집 | Genesis 계정, 버킷 PDA, 베이스 민트, 창작자 수수료 지갑 | 누적 SOL이 창작자 지갑으로 전송 |
collectRaydiumCpmmFeesWithCreatorFeeV2 | 졸업 후 — LP 수수료 수확 | Genesis 계정, Raydium 풀 PDA, Raydium 버킷 PDA | LP 수수료가 Raydium 풀에서 Genesis 버킷으로 이동 |
claimRaydiumCreatorFeeV2 | 졸업 후 — 버킷 잔액 청구 | Genesis 계정, Raydium 버킷 PDA, 베이스/쿼트 민트, 창작자 수수료 지갑 | 버킷 잔액이 창작자 지갑으로 전송 |
바로 가기: 런칭 시 구성 · 지갑으로 지정 · 에이전트 PDA · 첫 번째 구매와 결합 · 누적 확인(커브) · API로 청구 · 보상 없음 처리 · 커브 중 청구 · Raydium 수수료 확인 · Raydium에서 수집 · 졸업 후 청구
createAndRegisterLaunch를 호출할 때launch객체에서creatorFeeWallet을 설정합니다- 런칭 후
bucket.creatorFeeAccrued를 읽어 누적된 수수료를 모니터링합니다 - API 또는 SDK를 통해
claimCreatorRewards를 호출하여 모든 버킷에서 한 번의 호출로 청구합니다 - 활성 커브 기간 중 수동 제어에는
claimBondingCurveCreatorFeeV2를 호출하여 누적 수수료를 수집합니다 - 졸업 후 수동 청구에는
collectRaydiumCpmmFeesWithCreatorFeeV2를 호출하여 Raydium 풀에서 LP 수수료를 수집한 후,claimRaydiumCreatorFeeV2를 호출하여 버킷 잔액을 창작자 지갑으로 전송합니다
사전 요구 사항
Genesis SDK, 구성된 Umi 인스턴스 및 충전된 Solana 지갑이 필요합니다.
@metaplex-foundation/genesisSDK 설치- 키페어 ID로 구성된 Umi 인스턴스 — Metaplex API를 통한 본딩 커브 런칭을 참조하세요
- 트랜잭션 수수료를 위한 충전된 Solana 지갑
런칭 시 창작자 수수료 구성
창작자 수수료는 createAndRegisterLaunch(또는 createLaunch)에 전달되는 launch 객체에서 구성됩니다. creatorFeeWallet 필드는 선택 사항입니다 — 생략하면 런칭 지갑이 기본적으로 모든 수수료를 받습니다. 전체 런칭 흐름은 Metaplex API를 통한 본딩 커브 런칭을 참조하세요.
특정 지갑으로 창작자 수수료 지정
creatorFeeWallet을 설정하여 누적된 수수료를 런칭 지갑 이외의 지갑 주소로 지정합니다.
1import { createAndRegisterLaunch } from '@metaplex-foundation/genesis/api';
2
3const result = await createAndRegisterLaunch(umi, {}, {
4 wallet: umi.identity.publicKey,
5 launchType: 'bondingCurve',
6 token: {
7 name: 'My Token',
8 symbol: 'MTK',
9 image: 'https://gateway.irys.xyz/your-image-id',
10 },
11 launch: {
12 creatorFeeWallet: 'FeeRecipientWalletAddress...',
13 },
14});
창작자 수수료 지갑은 커브 생성 시 설정되며 커브가 라이브된 후에는 변경할 수 없습니다.
에이전트 런칭 — 자동 PDA 라우팅
Metaplex 에이전트를 대신하여 런칭할 때, creatorFeeWallet을 수동으로 설정하지 않아도 창작자 수수료가 에이전트의 PDA로 자동 라우팅됩니다. Core execute 래핑 및 setToken 연결을 포함한 전체 에이전트 런칭 흐름은 에이전트 토큰 생성을 참조하세요.
창작자 수수료와 첫 번째 구매 결합
창작자 수수료 지갑과 첫 번째 구매를 함께 구성할 수 있습니다. 첫 번째 구매는 항상 수수료가 없습니다 — 초기 구매에는 프로토콜 수수료나 창작자 수수료가 적용되지 않습니다. 이후 모든 스왑에는 일반 창작자 수수료가 적용됩니다.
launch: {
creatorFeeWallet: 'FeeRecipientWalletAddress...',
firstBuyAmount: 0.5, // 0.5 SOL, 첫 번째 구매자에게 수수료 없음
},
누적 창작자 수수료 확인
BondingCurveBucketV2 계정의 creatorFeeAccrued 필드는 마지막 청구 이후 누적된 SOL 합계를 추적합니다. fetchBondingCurveBucketV2를 사용하여 읽습니다:
1import {
2 findBondingCurveBucketV2Pda,
3 fetchBondingCurveBucketV2,
4} from '@metaplex-foundation/genesis';
5import { isSome, publicKey } from '@metaplex-foundation/umi';
6
7const genesisAccount = publicKey('YOUR_GENESIS_ACCOUNT_PUBKEY');
8const baseMint = publicKey('TOKEN_MINT_PUBKEY');
9
10const [bucketPda] = findBondingCurveBucketV2Pda(umi, {
11 genesisAccount,
12 bucketIndex: 0,
13});
14
15const bucket = await fetchBondingCurveBucketV2(umi, bucketPda);
16console.log('Creator fees accrued (lamports):', bucket.creatorFeeAccrued);
17console.log('Creator fees claimed to date (lamports):', bucket.creatorFeeClaimed);
18
19// 버킷 익스텐션에서 구성된 창작자 수수료 지갑 읽기
20const creatorFeeExt = bucket.extensions.creatorFee;
21const creatorFeeWallet = isSome(creatorFeeExt) ? creatorFeeExt.value.wallet : null;
22console.log('Creator fee wallet:', creatorFeeWallet?.toString() ?? 'none configured');
Metaplex API로 청구 (권장)
POST /v1/creator-rewards/claim은 지갑이 자격이 있는 모든 미청구 본딩 커브와 Raydium 보상을 한 번의 호출로 청구합니다. 엔드포인트는 지갑(또는 지정된 payer)이 서명하고 제출하는 base64 인코딩된 Solana 트랜잭션을 반환합니다. JavaScript SDK는 동일한 호출을 @metaplex-foundation/genesis의 claimCreatorRewards로 노출합니다.
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
1# Claim creator rewards. Response contains base64-encoded transactions
2# the wallet (or payer) must sign and send.
3curl -X POST https://api.metaplex.com/v1/creator-rewards/claim \
4 -H "Content-Type: application/json" \
5 -d '{
6 "wallet": "CREATOR_FEE_WALLET_ADDRESS_HERE",
7 "network": "solana-mainnet"
8 }'
9
10# Add "payer" when the creator fee wallet does not hold SOL (e.g. an agent PDA):
11# "payer": "PAYER_WALLET_ADDRESS_HERE"
| 필드 | 타입 | 필수 | 비고 |
|---|---|---|---|
wallet | PublicKey | string | 예 | 청구할 창작자 수수료 지갑. |
network | SvmNetwork | 아니요 | 'solana-mainnet' (기본값) 또는 'solana-devnet'. |
payer | PublicKey | string | 아니요 | 반환된 트랜잭션의 수수료와 임대료를 부담하는 지갑. 기본값은 wallet. 창작자 수수료 지갑이 SOL을 보유하고 있지 않을 때 사용 — 예: 에이전트 PDA 또는 콜드 지갑. |
SDK는 역직렬화된 Umi Transaction과 트랜잭션이 작성된 블록해시를 반환합니다. 항상 반환된 블록해시에 대해 각 트랜잭션을 확인하세요 — 새로 가져온 것으로 대체하지 마세요. 그렇지 않으면 확인이 경합합니다. 전체 HTTP 스키마는 Claim Creator Rewards (API)를 참조하세요.
보상 없음 사례 처리
지갑에 청구할 것이 없을 때 엔드포인트는 HTTP 400과 { "error": { "message": "No rewards available to claim" } }를 반환합니다 — 빈 transactions 배열로 성공 응답을 반환하지 않습니다. SDK는 이를 GenesisApiError로 표면화하므로 호출자는 오류를 잡고 err.message(또는 err.statusCode === 400)로 분기해야 합니다. 오류를 그대로 전파시키지 마세요.
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.
위의 API 경로는 모든 프로덕션 청구 흐름에 권장되는 통합입니다. 아래의 버킷별 온체인 명령은 특정 버킷을 대상으로 하기, 트랜잭션을 완전히 클라이언트 측에서 빌드하기, Metaplex API에 대한 네트워크 액세스 없이 실행하기 등 고급 사례에서 계속 사용할 수 있습니다.
활성 커브 중 창작자 수수료 청구
claimBondingCurveCreatorFeeV2는 버킷에서 구성된 창작자 수수료 지갑으로 누적된 모든 창작자 수수료를 전송합니다. 커브가 활성 중인 언제든지 호출할 수 있습니다.
1import { claimBondingCurveCreatorFeeV2 } from '@metaplex-foundation/genesis';
2import { isSome } from '@metaplex-foundation/umi';
3
4// 청구 전에 버킷 익스텐션에서 창작자 수수료 지갑을 읽습니다.
5const creatorFeeExt = bucket.extensions.creatorFee;
6if (!isSome(creatorFeeExt)) throw new Error('No creator fee configured on this bucket');
7const creatorFeeWallet = creatorFeeExt.value.wallet;
8
9const result = await claimBondingCurveCreatorFeeV2(umi, {
10 genesisAccount,
11 bucket: bucketPda,
12 baseMint,
13 creatorFeeWallet,
14}).sendAndConfirm(umi);
15
16console.log('Creator fees claimed:', result.signature);
claimBondingCurveCreatorFeeV2는 권한 없이 호출 가능합니다 — 어떤 지갑도 호출할 수 있지만 SOL은 항상 구성된 창작자 수수료 지갑으로 전송되며 호출자에게는 전송되지 않습니다.
졸업 후 창작자 수수료 청구
본딩 커브가 졸업한 후, 유동성이 Raydium CPMM 풀로 이전되고 LP 거래 활동에서 창작자 수수료가 계속 누적됩니다. 졸업 후 수수료 수집은 2단계 프로세스입니다: 먼저 Raydium 풀에서 누적된 LP 거래 수수료를 Genesis RaydiumCpmmBucketV2 버킷으로 수집한 다음, 버킷 잔액을 창작자 지갑으로 청구합니다.
누적 Raydium 창작자 수수료 확인
RaydiumCpmmBucketV2 계정은 BondingCurveBucketV2와 유사한 creatorFeeAccrued 및 creatorFeeClaimed 필드를 노출합니다. findRaydiumCpmmBucketV2Pda와 fetchRaydiumCpmmBucketV2를 사용하여 파생 및 조회합니다.
1import {
2 findRaydiumCpmmBucketV2Pda,
3 fetchRaydiumCpmmBucketV2,
4} from '@metaplex-foundation/genesis';
5import { isSome, publicKey } from '@metaplex-foundation/umi';
6
7const genesisAccount = publicKey('YOUR_GENESIS_ACCOUNT_PUBKEY');
8
9const [raydiumBucketPda] = findRaydiumCpmmBucketV2Pda(umi, {
10 genesisAccount,
11 bucketIndex: 0,
12});
13
14const raydiumBucket = await fetchRaydiumCpmmBucketV2(umi, raydiumBucketPda);
15const claimable = raydiumBucket.creatorFeeAccrued - raydiumBucket.creatorFeeClaimed;
16console.log('Claimable Raydium creator fees (lamports):', claimable);
17
18const creatorFeeExt = raydiumBucket.extensions.creatorFee;
19const creatorFeeWallet = isSome(creatorFeeExt) ? creatorFeeExt.value.wallet : null;
20console.log('Creator fee wallet:', creatorFeeWallet?.toString() ?? 'none configured');
raydiumBucket.creatorFeeAccrued는 Raydium 풀에서 버킷으로 이미 수집된 수수료만 반영합니다. Raydium 풀 자체에 수집되지 않은 LP 수수료가 있을 수 있습니다 — 최종 청구 가능 잔액을 읽기 전에 collectRaydiumCpmmFeesWithCreatorFeeV2를 실행하여 버킷으로 이동하세요.
단계 1 — Raydium CPMM 풀에서 수수료 수집
collectRaydiumCpmmFeesWithCreatorFeeV2는 Raydium CPMM 풀에서 누적된 LP 거래 수수료를 수집하여 RaydiumCpmmBucketV2 버킷 서명자의 토큰 계정에 크레딧하고 creatorFeeAccrued를 업데이트합니다. 청구 전에 이 단계를 실행해야 합니다 — Raydium에서 수수료가 수집될 때까지 청구할 것이 없습니다.
deriveRaydiumPDAsV2를 사용하여 베이스 민트와 버킷 주소에서 필요한 모든 Raydium 풀 계정을 계산합니다. creatorFee: true를 전달하여 창작자 수수료 AMM 구성을 선택합니다.
1import {
2 collectRaydiumCpmmFeesWithCreatorFeeV2,
3 deriveRaydiumPDAsV2,
4 findRaydiumCpmmBucketV2Pda,
5} from '@metaplex-foundation/genesis';
6import { publicKey } from '@metaplex-foundation/umi';
7
8const baseMint = publicKey('TOKEN_MINT_PUBKEY');
9const quoteMint = publicKey('So11111111111111111111111111111111111111112'); // wSOL
10
11const [raydiumBucketPda] = findRaydiumCpmmBucketV2Pda(umi, {
12 genesisAccount,
13 bucketIndex: 0,
14});
15
16const pdas = deriveRaydiumPDAsV2(umi, baseMint, raydiumBucketPda, {
17 quoteMint,
18 env: 'mainnet', // or 'devnet'
19 creatorFee: true,
20});
21
22await collectRaydiumCpmmFeesWithCreatorFeeV2(umi, {
23 baseMint,
24 quoteMint,
25 genesisAccount,
26 poolState: pdas.poolState,
27 raydiumCpmmBucket: raydiumBucketPda,
28 ammConfig: pdas.ammConfig,
29 poolAuthority: pdas.poolAuthority,
30 baseVault: pdas.baseVault,
31 quoteVault: pdas.quoteVault,
32 raydiumProgram: pdas.raydiumProgram,
33}).sendAndConfirm(umi);
34
35console.log('Raydium LP fees collected into Genesis bucket');
collectRaydiumCpmmFeesWithCreatorFeeV2는 권한 없이 호출 가능합니다 — 어떤 지갑도 호출할 수 있습니다. 수집된 수수료는 Genesis 버킷 서명자의 토큰 계정으로 흘러가며, 다음 버킷 조회 시 creatorFeeAccrued에 반영됩니다.
단계 2 — 창작자 지갑으로 수수료 청구
claimRaydiumCreatorFeeV2는 RaydiumCpmmBucketV2 버킷에 누적된 잔액을 구성된 창작자 수수료 지갑으로 전송합니다. 수집 후에 실행하거나, 이전 수집에서 버킷에 미청구 잔액이 있는 경우 언제든지 실행합니다.
1import {
2 claimRaydiumCreatorFeeV2,
3 fetchRaydiumCpmmBucketV2,
4 findRaydiumCpmmBucketV2Pda,
5} from '@metaplex-foundation/genesis';
6import { isSome, publicKey } from '@metaplex-foundation/umi';
7
8const [raydiumBucketPda] = findRaydiumCpmmBucketV2Pda(umi, {
9 genesisAccount,
10 bucketIndex: 0,
11});
12
13// 수집 후 다시 조회하여 업데이트된 creatorFeeAccrued를 가져옵니다.
14const raydiumBucket = await fetchRaydiumCpmmBucketV2(umi, raydiumBucketPda);
15
16const creatorFeeExt = raydiumBucket.extensions.creatorFee;
17if (!isSome(creatorFeeExt)) throw new Error('No creator fee configured on this Raydium bucket');
18const creatorFeeWallet = creatorFeeExt.value.wallet;
19
20await claimRaydiumCreatorFeeV2(umi, {
21 genesisAccount: raydiumBucket.bucket.genesis,
22 bucket: raydiumBucketPda,
23 baseMint: raydiumBucket.bucket.baseMint,
24 quoteMint: raydiumBucket.bucket.quoteMint,
25 creatorFeeWallet,
26}).sendAndConfirm(umi);
27
28console.log('Raydium creator fees claimed to:', creatorFeeWallet.toString());
claimRaydiumCreatorFeeV2는 권한 없이 호출 가능합니다 — 어떤 지갑도 청구를 트리거할 수 있지만, SOL(wSOL)은 항상 구성된 창작자 수수료 지갑으로 전송되며 호출자에게는 전송되지 않습니다.
수집 및 청구 통합 흐름
두 빌더를 체이닝하여 단일 트랜잭션에서 수집과 청구를 수행합니다. 풀에 미수집 수수료가 없고 버킷 잔액도 0인 경우, 무의미한 트랜잭션을 피하기 위해 두 명령어를 모두 건너뜁니다.
1import {
2 collectRaydiumCpmmFeesWithCreatorFeeV2,
3 claimRaydiumCreatorFeeV2,
4 deriveRaydiumPDAsV2,
5 fetchRaydiumCpmmBucketV2,
6 findRaydiumCpmmBucketV2Pda,
7} from '@metaplex-foundation/genesis';
8import { isSome, publicKey, transactionBuilder } from '@metaplex-foundation/umi';
9
10const baseMint = publicKey('TOKEN_MINT_PUBKEY');
11const quoteMint = publicKey('So11111111111111111111111111111111111111112');
12const genesisAccount = publicKey('YOUR_GENESIS_ACCOUNT_PUBKEY');
13
14const [raydiumBucketPda] = findRaydiumCpmmBucketV2Pda(umi, {
15 genesisAccount,
16 bucketIndex: 0,
17});
18
19const raydiumBucket = await fetchRaydiumCpmmBucketV2(umi, raydiumBucketPda);
20
21const creatorFeeExt = raydiumBucket.extensions.creatorFee;
22if (!isSome(creatorFeeExt)) throw new Error('No creator fee configured');
23const creatorFeeWallet = creatorFeeExt.value.wallet;
24
25const pdas = deriveRaydiumPDAsV2(umi, baseMint, raydiumBucketPda, {
26 quoteMint,
27 env: 'mainnet', // or 'devnet'
28 creatorFee: true,
29});
30
31await transactionBuilder()
32 .add(collectRaydiumCpmmFeesWithCreatorFeeV2(umi, {
33 baseMint,
34 quoteMint,
35 genesisAccount,
36 poolState: pdas.poolState,
37 raydiumCpmmBucket: raydiumBucketPda,
38 ammConfig: pdas.ammConfig,
39 poolAuthority: pdas.poolAuthority,
40 baseVault: pdas.baseVault,
41 quoteVault: pdas.quoteVault,
42 raydiumProgram: pdas.raydiumProgram,
43 }))
44 .add(claimRaydiumCreatorFeeV2(umi, {
45 genesisAccount,
46 bucket: raydiumBucketPda,
47 baseMint,
48 quoteMint,
49 creatorFeeWallet,
50 }))
51 .sendAndConfirm(umi);
52
53console.log('Raydium creator fees collected and claimed to:', creatorFeeWallet.toString());
참고 사항
다음 주의사항은 수수료 타이밍, 권장 API 청구 경로, 권한 없는 온체인 청구, 2단계 졸업 후 흐름 및 첫 번째 구매 수수료 면제에 대해 설명합니다.
- 창작자 수수료는 각 스왑에서 버킷(
creatorFeeAccrued)에 누적되며 즉시 전송되지 않습니다 — API/SDK 또는 온체인 명령어로 명시적으로 청구해야 합니다;creatorFeeClaimed는 현재까지 청구된 누적 합계를 추적합니다 claimCreatorRewards(API/SDK)는 지갑이 자격이 있는 모든 본딩 커브와 Raydium 버킷을 한 번의 호출에 집계합니다; 청구할 것이 없으면 빈 트랜잭션 배열이 아니라 HTTP400과"No rewards available to claim"을 반환합니다- 온체인 청구 명령어(
claimBondingCurveCreatorFeeV2,collectRaydiumCpmmFeesWithCreatorFeeV2,claimRaydiumCreatorFeeV2)는 권한 없이 호출 가능합니다: 어떤 지갑도 트리거할 수 있지만 SOL은 항상 구성된 창작자 수수료 지갑으로 전송됩니다 - 졸업 후 수수료는 순서대로 두 단계가 필요합니다:
collectRaydiumCpmmFeesWithCreatorFeeV2(Raydium 풀 → Genesis 버킷으로 수집), 그 다음claimRaydiumCreatorFeeV2(버킷 → 창작자 지갑); 두 단계를 단일 트랜잭션으로 결합할 수 있고, API 경로는 두 단계를 래핑합니다 creatorFeeAccrued와creatorFeeClaimed는BondingCurveBucketV2(활성 커브)와RaydiumCpmmBucketV2(졸업 후) 모두에 존재합니다; 각각fetchBondingCurveBucketV2와fetchRaydiumCpmmBucketV2를 사용하세요creatorFeeWallet은 설정하지 않으면 런칭 지갑으로 기본 설정됩니다; 커브가 생성된 후에는 변경할 수 없습니다- 첫 번째 구매 메커니즘은 지정된 초기 구매에 대해서만 모든 수수료(프로토콜 및 창작자)를 면제합니다; 이후 모든 스왑은 일반 창작자 수수료를 납부합니다
- 창작자 수수료는 방향(매수 또는 매도)에 관계없이 모든 스왑의 SOL 측면에 적용됩니다; 프로토콜 스왑 수수료와 복합적으로 계산되지 않습니다
- 현재 수수료율은 Genesis 프로토콜 수수료 페이지를 참조하세요
- 버킷 상태 읽기, 견적 계산, 거래 실행을 위한 스왑 측면 컨텍스트는 본딩 커브 스왑 통합을 참조하세요
FAQ
creatorFeeWallet를 설정하지 않으면 기본 창작자 수수료 지갑은 무엇인가요?
기본 창작자 수수료 지갑은 런칭 지갑입니다 — createLaunch 호출에 서명한 지갑입니다. 다른 주소로 수수료를 지정하려면 launch 객체에서 creatorFeeWallet을 명시적으로 설정하세요.
창작자 수수료는 매 스왑마다 전송되나요?
아니요. 창작자 수수료는 각 스왑에서 버킷(creatorFeeAccrued)에 누적되지만 즉시 전송되지는 않습니다. API 또는 SDK를 통해 claimCreatorRewards를 호출하여 모든 버킷에서 한 번에 수집하거나, 더 낮은 수준의 제어를 위해 온체인 명령(활성 커브 중에는 claimBondingCurveCreatorFeeV2, 졸업 후에는 collectRaydiumCpmmFeesWithCreatorFeeV2 다음에 claimRaydiumCreatorFeeV2)을 사용하세요.
API와 온체인 청구 명령 중 어떤 것을 사용해야 하나요?
일상적인 청구에는 API(claimCreatorRewards)를 사용하세요 — 지갑이 자격이 있는 모든 본딩 커브와 Raydium 버킷을 한 번의 호출에 집계하고 서명할 준비가 된 트랜잭션을 반환합니다. 특정 버킷을 대상으로 하거나, 트랜잭션을 직접 만들거나, Metaplex API에 대한 네트워크 액세스 없이 실행해야 할 때는 버킷별 온체인 명령(claimBondingCurveCreatorFeeV2, collectRaydiumCpmmFeesWithCreatorFeeV2, claimRaydiumCreatorFeeV2)을 사용하세요.
청구할 보상이 없는 경우 어떻게 되나요?
claimCreatorRewards 엔드포인트는 HTTP 400과 {"error":{"message":"No rewards available to claim"}}를 반환합니다. SDK는 이를 GenesisApiError로 표면화합니다. 이를 예외적인 결과가 아니라 — err.message(또는 err.statusCode === 400)를 확인하고 오류를 전파시키지 말고 분기하세요. 보상 없음 사례 처리를 참조하세요.
선택적인 payer 필드는 무엇을 위한 것인가요?
payer는 반환된 청구 트랜잭션의 트랜잭션 수수료와 임대료를 부담합니다. 청구 대상 지갑이 기본값입니다. 창작자 수수료 지갑이 SOL을 보유하고 있지 않을 때(예 — 에이전트 PDA 또는 콜드 지갑) 다른 주소로 설정하세요. payer는 반환된 트랜잭션에 서명해야 하지만, 창작자 수수료 수령자는 청구된 SOL을 계속 받습니다.
누구든지 claimBondingCurveCreatorFeeV2나 claimRaydiumCreatorFeeV2를 호출할 수 있나요?
네. 3개의 권한 없는 수수료 명령어는 활성 커브와 졸업 후 단계 모두에 걸쳐 있습니다 — collectRaydiumCpmmFeesWithCreatorFeeV2와 claimBondingCurveCreatorFeeV2(활성 커브), 그리고 claimRaydiumCreatorFeeV2(졸업 후). 어떤 지갑도 트리거할 수 있지만 SOL은 항상 구성된 창작자 수수료 지갑으로 전송되며 호출자에게는 전송되지 않습니다.
collectRaydiumCpmmFeesWithCreatorFeeV2와 claimRaydiumCreatorFeeV2의 차이점은 무엇인가요?
collectRaydiumCpmmFeesWithCreatorFeeV2는 Raydium CPMM 풀에서 누적된 LP 거래 수수료를 Genesis RaydiumCpmmBucketV2 버킷으로 수집합니다 — 이를 통해 버킷의 creatorFeeAccrued가 업데이트됩니다. claimRaydiumCreatorFeeV2는 해당 버킷 잔액을 창작자 수수료 지갑으로 전송합니다. 청구 전에 수집을 실행해야 합니다 — 수집 없이는 청구할 버킷 잔액이 없습니다.
Raydium 버킷의 creatorFeeAccrued가 풀이 활성인데도 0인 이유는 무엇인가요?
RaydiumCpmmBucketV2의 creatorFeeAccrued는 collectRaydiumCpmmFeesWithCreatorFeeV2를 통해 Raydium에서 Genesis 버킷으로 수집된 수수료만 반영합니다. LP 거래 수수료는 먼저 Raydium 풀 상태 내에 누적됩니다 — 수집 명령어를 실행할 때까지 Genesis 버킷에 나타나지 않습니다.
첫 번째 구매는 창작자 수수료를 납부하나요?
아니요. 첫 번째 구매가 구성되어 있으면 프로토콜 스왑 수수료와 창작자 수수료 모두 초기 구매에서 면제됩니다. 이후 모든 스왑에는 일반 창작자 수수료가 적용됩니다.
누적된 창작자 수수료를 확인하는 방법은 무엇인가요?
활성 커브 중에는 fetchBondingCurveBucketV2를 사용하여 BondingCurveBucketV2에서 creatorFeeAccrued 필드를 읽으세요. 졸업 후에는 fetchRaydiumCpmmBucketV2를 사용하여 RaydiumCpmmBucketV2에서 creatorFeeAccrued를 읽으세요. 누적 창작자 수수료 확인 및 누적 Raydium 창작자 수수료 확인을 참조하세요.
런칭 후 창작자 수수료 지갑을 변경할 수 있나요?
아니요. 창작자 수수료 지갑은 커브 생성 시 설정되며 커브가 라이브된 후에는 변경할 수 없습니다.
