이 페이지는 AI 자동 번역입니다. 모든 내용은 영문판을 기준으로 합니다.영문판 보기 →
LaunchLab은 간결한 명령어 집합을 제공합니다: 사용자 대면 호출 6개와 소수의 관리자 기본 요소. SDK가 모두를 래핑하며, 이 페이지는 애그리게이터, 모니터링 도구, CPI가 필요한 프로그램을 위한 원본 인터페이스를 문서화합니다.2026-09 프로그램 업그레이드는 LaunchLab을 Anchor 1.0.2 / Solana 3.1.10으로 재구축했으며 세 가지 전환 메커니즘을 제거했습니다: 더 이상 사용되지 않는
Initialize는 이제 항상 실패하고, MigrateToAmm은 세 개의 인자와 모든 OpenBook 계정을 잃었으며, 여러 검사를 클록에 조건부로 만드는 get_upgrade_timestamp 게이트가 사라졌습니다. 또한 관리자 명령어 CollectExcessLamports 하나를 추가합니다. 2026-09-09 변경 로그 항목을 참조하세요.명령어 목록
“ExactIn/ExactOut” 분할은 CPMM의
SwapBaseInput / SwapBaseOutput을 반영합니다 — 온체인에서는 약간 다른 반올림을 가진 별도의 명령어 판별자입니다.
졸업 경로 선택. 모든 새로운 InitializeV2 및 InitializeWithToken2022 호출은 migrate_type = 1 (CPSWAP)을 설정해야 합니다. 새로운 AMM v4 바운드 풀을 초기화하려는 시도는 MigrateTypeNotMatch를 반환합니다. amm_creator_fee_on은 결과 CPMM 생성자 수수료가 견적 토큰에 적용되는지 또는 두 토큰 모두에 적용되는지만 선택합니다; 대상 프로그램을 선택하지 않습니다. 레거시 Initialize는 더 이상 런칭을 생성할 수 없습니다 (아래 참조).
MigrateToAmm은 이 제한 전에 migrate_type = 0으로 초기화된 기존 PoolState에 대해 호출 가능하게 유지됩니다. 릴리스는 기존 풀 상태를 재작성하거나 레거시 명령어를 제거하지 않습니다.
견적 측 토큰 프로그램. 견적 민트는 SPL Token 프로그램 또는 Token-2022 중 하나가 소유할 수 있습니다. 이를 건드리는 모든 명령어 — CreateConfig, InitializeV2, InitializeWithToken2022, 네 가지 거래 명령어, CollectFee, CollectMigrateFee, ClaimCreatorFee, ClaimPlatformFee, ClaimPlatformFeeFromVault — 는 견적 프로그램 계정 슬롯에서 소유 프로그램을 가져갑니다. 계정 위치는 변경되지 않았습니다; 수용되는 값만 변경되었습니다. 실제로 GlobalConfig.quote_mint를 소유하는 프로그램을 전달하세요. 기존 런칭의 경우 PoolState.token_program_flag bit1에서 읽거나 민트 계정의 소유자에서 읽을 수 있습니다 (accounts 참조).
더 이상 사용되지 않는 Initialize는 여기서 무관합니다: 견적 프로그램 계정은 여전히 SPL Token으로 입력되며, 2026-09 업그레이드 이후 명령어는 계정을 읽기 전에 실패합니다. InitializeV2 또는 InitializeWithToken2022를 통해 런칭하세요.
MigrateToCpswap은 반대 방향의 다른 예외입니다 — 민트당 하나가 아니라 두 프로그램을 무조건 가져갑니다. 아래 마이그레이션 계정을 참조하세요.
Initialize
새로운 런칭을 생성합니다. InitializeV2는 아래 형태를 공유하고 amm_creator_fee_on과 별도의 견적 토큰 프로그램 계정을 추가합니다.
인자
사전 조건
quote_mint ∈ launch_config.allowed_quote_mints.base_supply_graduation ≤ base_supply_max.- 수수료 매개변수가
launch_config.max_*_fee_rate검사를 통과합니다. open_time ≥ now − slop(SDK는≥ now강제; 프로그램은 약간의 역날짜 허용).curve_type이 인식됩니다.
base_mint는supply = base_supply_max, 모두base_vault에 있습니다.base_mint.mint_authority = launch_authority,freeze_authority = None.LaunchState는status = Active,base_sold = 0,quote_reserve_real = 0으로 초기화됩니다.quote_reserve_target은 곡선 매개변수 +base_supply_graduation+buy_numerator에서 계산됩니다 (대략).TransferFeeConfig가 첨부된InitializeWithToken2022의 경우:transfer_fee_config_authority = launch_authority,withdraw_withheld_authority = PlatformConfig.transfer_fee_extension_auth(해당 필드가 설정된 경우), 그렇지 않으면launch_authority. 인출 측은 민트 생성 시 정확히 작성되므로 플랫폼이 졸업 전에 보류된 수수료를 수거할 수 있습니다.platform-config를 참조하세요.
InvalidQuoteMint, FeeRateTooHigh, InvalidCurveParams, MathOverflow.
Buy (정규 변형: BuyExactIn)
사용자가 고정 quote_in을 제공합니다; 곡선이 base_out을 계산합니다.
인자
사전 조건
launch_state.status == Active.now ≥ open_time.user_quote_ata.balance ≥ quote_in.quote_in > 0.
quote_in을quote_in_after_fee와 수수료 부분으로 분할합니다.- 사후 수수료 견적이 주어진 곡선에 대해 Newton 풀이로
base_out을 계산합니다. require(base_out ≥ minimum_base_out)그렇지 않으면ExceededSlippage되돌립니다.quote_in사용자 → 금고 이동.base_out금고 → 사용자 이동.base_sold += base_out,quote_reserve_real += quote_in_after_fee × (lp_share / total_share)업데이트합니다.- 수수료 카운터 (
protocol_fees_quote,creator_fees_quote) 업데이트합니다. state_data.num_buys += 1.- 업데이트 후
quote_reserve_real ≥ quote_reserve_target이면, SDK는 일반적으로 같은 트랜잭션에서Graduateix를 연결합니다. 프로그램은Buy내에서 자동 졸업하지 않습니다 — 후속Graduate가 필요합니다.
BuyExactOut
사용자가 정확한 base_out을 지정합니다; 프로그램이 quote_in을 계산합니다.
인자
BuyExactIn과 동일한 계정. Newton 반복 대신 폐쇄형 이차 적분 (또는 curve_type 1의 경우 CPMM 역함수)을 사용합니다.
Sell / SellExactIn / SellExactOut
Buy의 미러. 사용자가 base_in을 곡선에 반환하고 quote_out을 받습니다. 수수료는 quote_out에서 공제되므로 사용자는 원본 통합 수익보다 적게 받습니다.
사전 조건 —
user_base_ata.balance ≥ base_in.- 매도는
base_sold를 0 아래로 밀 수 없습니다 (위의 것과 중복, 회계가 일관성 있음). - 런칭이
Active입니다.
Buy와 대칭. base_sold 감소, quote_reserve_real 감소. 수수료는 여전히 누적됩니다.
견적 측 이전 수수료
견적 민트가TransferFeeConfig를 가질 때, 금고가 이동하는 금액과 지불자가 청구되거나 신용되는 금액이 다르며, 슬리피지 한계는 지불자 측에 대해 검사됩니다. 확장 없는 견적 민트에서 아래의 모든 경우는 일반 레거시 민트와 동일합니다.
견적에 대한 두 가지 결과:
- 민트가 수수료 없는 것처럼 계산된 한계는 거부됩니다. 수수료 없는 비용을
maximum_amount_in으로 또는 수수료 없는 수익을minimum_amount_out으로 전달하면ExceededSlippage로 되돌려집니다. real_quote는 금고에 도달한 것만큼만 진행됩니다. 5% 견적 민트에서amount_in의BuyExactIn은real_quote를amount_in × 0.95만큼 이동합니다.
10000 기본 포인트)는 반전될 수 없으며 정확한 출력 경로에서 CalculateOverflow로 되돌려집니다.
거래 측 민트도 일치하는 슬롯에 전달된 프로그램으로 제한되므로 이제 불일치하는 base_token_program이 무시되는 대신 실패합니다. algorithms/token-2022-transfer-fees에서 기본 수수료 수학을 참조하세요.
거래 남은 계정
네 가지 거래 명령어 모두remaining_accounts를 통해 수수료 배관을 가져가며, 이 순서대로:
2026-09에서 변경됨: 마지막 세 개는 이제 무조건이며,
system_program이 검증됩니다. 이 릴리스 전에 프로그램은 unix_timestamp >= get_upgrade_timestamp()일 때만 읽었으며, 그 순간 전에 플랫폼/생성자 수수료 분할을 완전히 건너뛰었습니다. 타임스탬프는 오래되었으므로 메인넷의 동작은 실제로 변경되지 않습니다 — 하지만 분기가 코드에서 사라졌으며, 여전히 세 계정을 생략하는 빌더는 이제 컷오버 후에만이 아니라 항상 NotEnoughRemainingAccounts (6018)로 실패합니다. system_program 슬롯은 추가로 System::id()에 대해 검사되며 다른 것을 보유하면 InvalidInput (6002)을 반환합니다. 이전에는 해당 위치에서 모든 계정이 수용되었습니다.MigrateToAmm / MigrateToCpswap
곡선이 total_quote_fund_raising에 도달하면 런칭을 거래 가능한 풀로 졸업합니다. 새로운 런칭은 CPMM 전용입니다. MigrateToAmm은 저장된 migrate_type이 0인 기존 풀을 위해 보존됩니다.
서명자
MigrateToAmm— 바인딩GlobalConfig에 기록된migrate_to_amm_wallet.MigrateToCpswap— 바인딩GlobalConfig에 기록된migrate_to_cpswap_wallet.
pool_state.status == Migrate확인 (즉,quote_reserve_target에 도달했습니다). 그렇지 않으면PoolMigrated(상태가 이미Migrated) 또는PoolFunding(여전히 자금 조성 중)으로 되돌립니다.pool_state.migrate_type이 명령어와 일치하는지 확인 (0AMM,1CPMM). 그렇지 않으면MigrateTypeNotMatch로 되돌립니다.- 졸업 후 준비금 계산:
base_amount_out = base_vault.amount − vesting_schedule.total_locked_amountquote_amount_out = quote_vault.amount − quote_protocol_fee − migrate_fee − platform_fee
- 대상 프로그램 (
AMM v4 Initialize2또는CPMM InitializeWithPermission)으로 CPI하여 졸업 후 풀을 생성합니다. - 2026-08-17 업그레이드 후 실행된 CPMM 마이그레이션의 경우,
platform_scale + creator_scale을 하나의 플랫폼 소유 잠긴 LP 공유로 결합하고 최대 하나의 Fee Key NFT를platform_nft_wallet에 민트합니다.burn_scale나머지를 소각합니다. 업그레이드 전에는creator_scale이 별도로 잠겼고 Fee Key가 토큰 생성자에게 갔습니다. 완료된 과거 마이그레이션은 수정되지 않습니다. 레거시 AMM v4 졸업의 경우, LP 처분은 해당 명령어의 기존 흐름을 따릅니다. - (민트 권한 단계 없음.
base_mint.mint_authority는 이미 런칭 생성 시None으로 설정되었습니다 — 아래 참고 참조.) pool_state.status = Migrated뒤집기,vesting_schedule.start_time = block_time + cliff_period설정.
TransferFeeConfig를 가진 Token-2022 민트 이고 PlatformConfig.transfer_fee_extension_auth가 기본값이 아닐 때, 마이그레이션도 해당 확장의 권한을 플랫폼 키로 재할당합니다:
transfer_fee_config_authority는 항상 재할당됩니다. 런칭authorityPDA는 전체 졸업 전 단계 동안 이를 보유하므로 항상 이동할 것이 있습니다.WithheldWithdraw는authorityPDA가 여전히 이를 보유할 때만 재할당됩니다. 2026-08-27 이후에 생성된 런칭은 이미 민트 생성 시 해당 권한에transfer_fee_extension_auth를 가지고 있으므로 단계가 건너뛰어집니다. 가드는 마이그레이션이 해당 민트에서 되돌려지는 것을 방지하는 것입니다 — PDA는 더 이상 보유하지 않는 권한을 포기할 수 없습니다.
transfer_fee_extension_auth가 Pubkey::default()이면, 어느 권한도 이동하지 않으며 둘 다 authority PDA에 영구적으로 유지됩니다. platform-config를 참조하세요.
기본 민트의 공급은 졸업이 아니라 생성에서 고정됩니다.
InitializeV2 및 InitializeWithToken2022는 전체 공급을 기본 금고에 민트한 다음 같은 명령어에서 즉시 MintTokens를 취소하므로, base_mint.mint_authority는 런칭의 전체 수명 동안 None입니다. 마이그레이션은 이를 건드리지 않습니다. (이 페이지의 이전 개정판은 졸업 시 취소를 배치했습니다; 그것은 잘못되었습니다.) 마이그레이션이 이동할 수 있는 유일한 권한은 아래에 설명된 Token-2022 이전 수수료 권한입니다.BuyExactIn, BuyExactOut, SellExactIn, SellExactOut은 이 시점부터 PoolMigrated로 거부합니다. 결과 AMM 풀은 정규이며 다른 AMM v4 / CPMM 풀처럼 거래합니다.
일반적인 오류 — PoolFunding, PoolMigrated, MigrateTypeNotMatch, InvalidCpSwapConfig, MathOverflow.
CPMM 마이그레이션 남은 계정
MigrateToCpswap을 구축하는 클라이언트는 이 고정 remaining_accounts 인덱스를 사용해야 합니다:
명령어는 최소 10개의 남은 계정이 필요합니다. 지원 민트 계정은 읽기 전용 CPI 입력입니다. 민트가 초기화된 지원 기록이 없을 때도 두 주소를 모두 파생합니다. 여전히 생성자 잠금 계정을 추가하거나 인덱스 8–9를 생략하는 이전 빌더는 업데이트해야 합니다.
2026-09에서 변경됨. 두 가지 정리, 둘 다 올바른 빌더를 변경하지 않습니다:
- 권한이 있는 CPMM 경로가 이제 유일한 경로입니다.
MigrateToCpswap은unix_timestamp >= get_upgrade_timestamp()를 기반으로InitializeCpSwap과InitializeCpSwapWithPermission사이에서 선택하곤 했습니다. 타임스탐프 헬퍼와 레거시 CPI가 모두 사라졌으므로 권한이 있는 경로 — 따라서 10개 계정 최소 — 가 무조건 적용됩니다. - 세 개의 주소 제약이 계정 구조에서 명령어 본문으로 이동했습니다.
platform_config,base_vault,quote_vault는 여전히PoolState에 저장된 값과 일치해야 하지만, 불일치는 이제 Anchor의address =제약 대신require_keys_eq!로 발생합니다. 검사는 동등합니다; 오류 표면만 다릅니다 — 계정 이름 없이 Anchor의 일반RequireKeysEqViolated(2502) 대신ConstraintAddress(2012)를 얻습니다. 이 세 계정에 대해2012와 일치하는 오류 처리를 업데이트합니다.
CPMM 마이그레이션 토큰 프로그램
MigrateToCpswap은 두 토큰 프로그램을 무조건 가져가고 각 민트를 소유하는 프로그램을 스스로 파악합니다. 두 토큰 프로그램 계정의 이름이 변경되었습니다:
이들은 이전
base_token_program (기본 민트를 소유한 프로그램) 및 quote_token_program (항상 레거시)을 대체합니다. 위치는 변경되지 않으므로 이는 레이아웃 변경이 아니라 값 변경입니다 — 하지만 두 값은 거의 반전되며, 이전 쌍을 계속 전달하는 빌더는 어느 민트가 Token-2022 민트가 되는 즉시 레거시 프로그램이 필요한 곳에 Token-2022를 공급합니다.
레거시 프로그램은 어느 민트도 사용하지 않을 때도 필요합니다. CPMM LP 민트와 잠긴 유동성 Fee Key NFT는 항상 이를 사용하기 때문입니다.
플랫폼 GlobalConfig 허용 목록
PlatformConfig.restrict_global_config는 검사를 제어합니다:
0: 플랫폼은 다른 방식으로 유효한 모든GlobalConfig를 수용합니다; 허용 계정이 필요하지 않습니다.1:Initialize,InitializeV2,InitializeWithToken2022는 일치하는PlatformAllowConfig를remaining_accounts의 어디든 포함해야 합니다.
CreatePlatformAllowConfig 및 ClosePlatformAllowConfig로 PDA를 생성하거나 닫습니다. 시드는 [b"platform_allow_config", platform_config, global_config]입니다. 이전 관리자 관리 PlatformGlobalAccess 명령어 및 PDA는 폐기됩니다.
플랫폼 런칭 매개변수 규칙
네 가지 명령어가 하나의PlatformCurveRule 계정을 관리합니다. 네 가지 모두 PlatformConfig.curve_rule_manager 또는 플랫폼 관리자에 의해 서명됩니다 — 프로그램은 서명자에서 PlatformConfig PDA를 재파생하여 관리자를 수용하므로 별도의 계정이 이를 증명하지 않습니다. 둘 다 아닌 서명자는 InvalidCurveRuleAuthority를 반환합니다.
platform_curve_rule은 [b"platform_curve_rule", platform_config, global_config]의 PDA입니다.
Create는 그룹을 보유하지 않는 계정을 할당합니다. 해당 상태는 아무것도 제한하지 않습니다.Update는 해당group_id를 가진 그룹을 upsert하여 존재하면 전체적으로 교체합니다. 계정 크기를 조정하여 증가하는 렌트를 채우고 감소하는 렌트를 받습니다. 10번째를 넘는 새 그룹은CurveRuleGroupsExceeded를 반환합니다; 25개 이상의 제약, 알 수 없는 필드 또는 연산자, 또는 한 그룹에서 동일한(field, op)쌍이 두 번 나타나면InvalidCurveRuleConstraint를 반환합니다; 비상수 곱 설정에서 4개의TotalSellA파생 필드는CurveRuleFieldNotSupportedByCurve를 반환합니다.Remove는 id로 하나의 그룹을 삭제하여 계정을 축소하고 차이를 환불합니다. 알 수 없는 id는CurveRuleGroupNotExist를 반환합니다.Close는 전체 렌트를 서명자에게 반환합니다. 설정은restrict_curve_param이1로 유지되어도 제한되지 않습니다.
UpdatePlatformConfig::RestrictCurveParam(0 | 1)이며, 플랫폼 관리자만 호출할 수 있습니다.
런칭 경로에서. restrict_curve_param이 1인 동안, InitializeV2 및 InitializeWithToken2022는 remaining_accounts에서 규칙 PDA를 요구합니다 — 존재하지 않을 때도 포함하여, 생략하면 검사를 건너뛸 수 없습니다. 누락된 계정은 NotEnoughRemainingAccounts입니다; 그룹을 만족하지 않는 런칭은 CurveParamNotMatchPlatformRule입니다. 검사는 GlobalConfig의 자체 한계 전에 실행되며 이를 좁힐 수만 있습니다. 모델 및 플레이북: products/launchlab/curve-rules. 두 오류 모두 클라이언트 측에서 피할 수 있습니다 — SDK는 이 검사를 순수 함수로 미러링합니다. 전송 전 확인을 참조하세요.
CollectFee
단일 런칭에서 프로토콜의 누적된 거래 수수료의 관리자 수거.
인자 — 없음.
계정
효과 —
quote_vault에서 recipient_token_account로 pool_state.quote_protocol_fee를 이전한 다음 카운터를 0으로 설정합니다. 첫 번째 매수 후 언제든지 호출 가능합니다.
CollectMigrateFee
졸업 시 누적된 마이그레이션 수수료의 관리자 수거. CollectFee와 동일한 계정 형태이지만 protocol_fee_owner 대신 migrate_fee_owner를 서명자로 사용하고 pool_state.migrate_fee를 배수된 카운터로 사용합니다.
ClaimCreatorFee
생성자가 소유한 모든 런칭에서 동일한 견적 민트를 사용하는 누적된 생성자 수수료의 생성자별 수거. 풀별 수수료 금고가 아니라 생성자별 수수료 금고를 배수합니다.
인자 — 없음.
계정
효과 —
creator_fee_vault의 전체 잔액을 recipient_token_account로 이전합니다. 금고가 비어 있으면 0보다 큼 검사로 되돌려집니다.
ClaimPlatformFee
런칭의 견적 금고를 직접 배수하는 플랫폼별 수거. 집계된 플랫폼 금고를 거치지 않고 플랫폼이 특정 런칭에 대한 슬라이스를 청구하려고 할 때 사용합니다.
인자 — 없음.
계정
효과 —
quote_vault에서 recipient_token_account로 pool_state.platform_fee를 이전하고 카운터를 0으로 설정합니다.
ClaimPlatformFeeFromVault
플랫폼별 집계 수거. 플랫폼을 통해 라우팅된 모든 런칭에서 수수료를 누적하는 플랫폼의 견적 민트별 수수료 금고를 배수합니다.
인자 — 없음.
계정
효과 —
platform_fee_vault의 전체 잔액을 recipient_token_account로 이전합니다. 금고가 비어 있으면 되돌려집니다.
CollectExcessLamports
LaunchLab이 제어하는 계정에서 렌트 면제 최소값 이상의 lamport 앉아 있는 관리자 수거. 2026-09 업그레이드에서 추가되어 프로토콜이 SIMD-0437 렌트 감소가 각 단계 전에 생성된 계정에 남기는 과다 자금을 회수할 수 있습니다.
초과분만 이동합니다. 토큰 잔액, 계정 데이터, 소유자, 곡선 상태 및 베스팅은 건드리지 않으며, 명령어는 이미 최소값에 있는 계정에 대해 작동하지 않습니다 — 따라서 각 롤아웃 단계 후 다시 실행하는 것이 안전합니다.
인자 — 없음.
계정
authority 선택
계정은 검사 없이 전달되며 프로그램에 의해 해결되며, 이는 LaunchLab의 3개 권한 PDA를 모두 재파생하고 일치시킵니다:
3개 중

