사용 가능한 가드
Freeze Token Payment Guard
개요
Freeze Token Payment 가드는 지불자에게 특정 민트 계정의 토큰을 특정 금액만큼 청구하여 동결된 Asset의 민팅을 허용합니다. 동결된 Asset은 해제될 때까지 전송되거나 마켓플레이스에 상장될 수 없습니다.
동결된 Asset은 다음 조건 중 하나가 충족되는 한 누구나 해제할 수 있습니다:
- Candy Machine이 완전히 민팅되었을 때
- Candy Machine이 삭제되었을 때
- 구성된 동결 기간 — 최대 30일 — 이 지났을 때
토큰은 민팅이 시작되기 전에 Candy Guard 권한자에 의해 초기화되어야 하는 "Freeze Escrow" 계정으로 전송됩니다. 모든 동결된 Asset이 해제되면, Candy Guard 권한자에 의해 자금이 잠금 해제되어 구성된 목적지 계정으로 전송될 수 있습니다.
이 가드의 route instruction을 통해 Freeze Escrow 계정을 초기화하고, Asset을 해제하고, 자금을 잠금 해제할 수 있습니다.
가드 설정
Freeze Token Payment 가드에는 다음 설정이 포함됩니다:
- Amount: 지불자에게 청구할 토큰의 개수입니다.
- Mint: 지불하고자 하는 SPL 토큰을 정의하는 민트 계정의 주소입니다.
- Destination Associated Token Address (ATA): 토큰을 최종적으로 보낼 연관 토큰 계정의 주소입니다. Mint 속성과 이러한 토큰을 받아야 하는 지갑의 주소를 사용하여 Associated Token Address PDA를 찾아 이 주소를 얻을 수 있습니다.
Freeze Token Payment 가드를 사용한 Candy Machine 설정
다음은 Freeze Token Payment 가드를 사용하여 Candy Machine을 생성하는 방법입니다. 이 예제에서는 Umi의 identity를 목적지 지갑으로 사용합니다.
import { findAssociatedTokenPda } from "@metaplex-foundation/mpl-toolbox";
create(umi, {
// ...
guards: {
freezeTokenPayment: some({
amount: 300,
mint: tokenMint.publicKey,
destinationAta: findAssociatedTokenPda(umi, {
mint: tokenMint.publicKey,
owner: umi.identity.publicKey,
}),
}),
},
});
민팅 설정
Freeze Token Payment 가드에는 다음 민팅 설정이 포함됩니다:
- Mint: 지불하고자 하는 SPL 토큰을 정의하는 민트 계정의 주소입니다.
- Destination Associated Token Address (ATA): 토큰을 최종적으로 보낼 연관 토큰 계정의 주소입니다.
참고로, SDK의 도움 없이 직접 지시문을 구성할 계획이라면, 이러한 민팅 설정과 추가 항목들을 지시문 인수와 나머지 계정의 조합으로 제공해야 합니다. 자세한 내용은 Candy Guard의 프로그램 문서를 참조하세요.
Freeze Token Payment 가드를 사용한 Candy Machine 설정
다음과 같이 mintArgs 인수를 사용하여 Freeze Token Payment 가드의 민팅 설정을 전달할 수 있습니다.
mintV1(umi, {
// ...
mintArgs: {
freezeTokenPayment: some({
mint: tokenMint.publicKey,
destinationAta,
}),
},
});
Route Instruction
Freeze Token Payment route instruction은 다음 기능들을 지원합니다.
Freeze Escrow 초기화
Path: initialize
Freeze Token Payment 가드를 사용할 때는 민팅이 시작되기 전에 Freeze Escrow 계정을 초기화해야 합니다. 이는 가드 설정의 Destination ATA 속성에서 파생된 PDA 계정을 생성합니다.
Freeze Escrow PDA 계정은 다음과 같은 여러 매개변수를 추적합니다:
- 이 가드를 통해 얼마나 많은 동결된 Asset이 민팅되었는지
- 이 가드를 통해 첫 번째 동결된 Asset이 언제 민팅되었는지 (동결 기간이 그 이후부터 시작되므로)
이 Freeze Escrow 계정을 초기화할 때는 가드의 route instruction에 다음 인수를 제공해야 합니다:
- Path =
initialize: route instruction에서 실행할 경로를 선택합니다. - Mint: 지불하고자 하는 SPL 토큰을 정의하는 민트 계정의 주소입니다.
- Destination Associated Token Address (ATA): 토큰을 최종적으로 보낼 연관 토큰 계정의 주소입니다.
- Period: 동결 기간이 지속되어야 하는 초 단위의 시간입니다. 이는 최대 30일(2,592,000초)이 될 수 있으며, 이 가드를 통해 민팅된 첫 번째 동결된 Asset부터 시작됩니다. 동결 기간은 Candy Machine이 완전히 민팅되지 않더라도 동결된 Asset이 결국 해제될 수 있도록 하는 안전 메커니즘을 제공합니다.
- Candy Guard Authority: Candy Guard 계정의 권한자가 서명자로 포함되어야 합니다.
마지막으로, Freeze Escrow PDA 계정은 이 가드를 통해 민팅된 모든 동결된 Asset의 자금을 받게 됩니다.
Freeze Escrow 초기화
아래 예제에서는 최대 15일의 동결 기간으로 Freeze Escrow 계정을 초기화하고 현재 identity를 Core Candy Guard 권한자로 사용합니다.
route(umi, {
// ...
guard: "freezeTokenPayment",
routeArgs: {
path: "initialize",
mint: tokenMint.publicKey,
destinationAta,
period: 15 * 24 * 60 * 60, // 15일
candyGuardAuthority: umi.identity,
},
});
동결된 Asset 해제
Path: thaw
동결된 Asset은 다음 조건 중 하나가 충족되는 한 누구나 해제할 수 있습니다:
- Core Candy Machine이 완전히 민팅되었을 때
- Core Candy Machine이 삭제되었을 때
- 구성된 동결 기간 — 최대 30일 — 이 지났을 때
Freeze Escrow의 토큰은 모든 Asset이 해제될 때까지 양도할 수 없으므로, 가능한 한 빨리 모든 Asset을 해제하도록 하는 인센티브가 treasury에 생깁니다.
동결된 Asset을 해제하려면 가드의 route instruction에 다음 인수를 제공해야 합니다:
- Path =
thaw: route instruction에서 실행할 경로를 선택합니다. - Mint: 지불하고자 하는 SPL 토큰을 정의하는 민트 계정의 주소입니다.
- Destination Associated Token Address (ATA): 토큰을 최종적으로 보낼 연관 토큰 계정의 주소입니다.
- Asset Address: 해제할 동결된 Asset의 민트 주소입니다.
- Asset Owner: 해제할 동결된 Asset의 소유자 주소입니다.
Freeze Token Payment 가드를 사용한 Candy Machine 설정
아래 예제에서는 현재 identity에 속한 동결된 Asset을 해제합니다.
route(umi, {
// ...
guard: "freezeTokenPayment",
routeArgs: {
path: "thaw",
mint: tokenMint.publicKey,
destinationAta,
AssetMint: AssetMint.publicKey,
AssetOwner: umi.identity.publicKey,
AssetTokenStandard: candyMachine.tokenStandard,
},
});
자금 잠금 해제
Path: unlockFunds
모든 동결된 Asset이 해제되면, treasury는 Freeze Escrow 계정에서 자금을 잠금 해제할 수 있습니다. 이는 토큰을 구성된 Destination ATA 주소로 전송합니다.
자금을 잠금 해제하려면 가드의 route instruction에 다음 인수를 제공해야 합니다:
- Path =
unlockFunds: route instruction에서 실행할 경로를 선택합니다. - Mint: 지불하고자 하는 SPL 토큰을 정의하는 민트 계정의 주소입니다.
- Destination Associated Token Address (ATA): 토큰을 최종적으로 보낼 연관 토큰 계정의 주소입니다.
- Candy Guard Authority: Core Candy Guard 계정의 권한자가 서명자로 포함되어야 합니다.
Freeze Token Payment 가드를 사용한 Candy Machine 설정
아래 예제에서는 현재 identity를 Candy Guard 권한자로 사용하여 Freeze Escrow 계정에서 자금을 잠금 해제합니다.
route(umi, {
// ...
guard: 'freezeTokenPayment',
routeArgs: {
path: 'unlockFunds',
destination,
candyGuardAuthority: umi.identity,
},
})
API References: route, freezeTokenPaymentRouteArgsUnlockFunds
Asset 동결 중단
Freeze Token Payment 가드 내에서 Asset의 동결을 중단하는 것이 가능합니다. 즉, 새로 민팅된 Asset은 더 이상 동결되지 않지만 기존 동결된 Asset은 동결 상태를 유지합니다.
이를 달성하는 여러 가지 방법이 있으며, 두 가지 범주로 나눌 수 있습니다:
- ☀️ 해제 가능: 기존 동결된 Asset은 route instruction의
thaw경로를 사용하여 누구나 해제할 수 있습니다. - ❄️ 해제 불가: 기존 동결된 Asset은 아직 해제할 수 없으며 "해제 가능" 조건 중 하나가 충족될 때까지 기다려야 합니다.
이를 염두에 두고, Asset 동결을 중단하는 모든 방법의 목록과 각각이 기존 동결된 Asset의 해제를 허용하는지 여부는 다음과 같습니다:
- Candy Machine이 완전히 민팅됨 → ☀️ 해제 가능.
- 구성된 동결 기간 — 최대 30일 — 이 지남 → ☀️ 해제 가능.
- Candy Machine 계정이 삭제됨 → ☀️ 해제 가능.
- Candy Guard 계정이 삭제됨 → ❄️ 해제 불가.
- Freeze Token Payment 가드가 설정에서 제거됨 → ❄️ 해제 불가.
Freeze Escrow와 가드 그룹
다양한 가드 그룹 내에서 여러 Freeze Token Payment 가드를 사용할 때는 Freeze Token Payment 가드와 Freeze Escrow 계정 간의 관계를 이해하는 것이 중요합니다.
Freeze Escrow 계정은 Destination 주소에서 파생된 PDA입니다. 이는 여러 Freeze Token Payment 가드가 같은 Destination 주소를 사용하도록 구성된 경우, 모두 같은 Freeze Escrow 계정을 공유한다는 의미입니다.
따라서 같은 동결 기간을 공유하고 모든 자금이 같은 escrow 계정에 의해 수집됩니다. 이는 또한 구성된 Destination 주소당 한 번만 initialize route instruction을 호출하면 된다는 것을 의미합니다.이는 route instruction이 구성된 Destination 주소당 한 번만 필요하다는 것을 의미합니다. unlockFunds에 대해서도 마찬가지입니다. thaw의 경우 같은 escrow 계정을 공유한다면 원하는 라벨을 사용할 수 있습니다.
서로 다른 Destination 주소로 여러 Freeze Token Payment 가드를 사용하는 것도 가능합니다. 이 경우 각 Freeze Token Payment 가드는 자체 Freeze Escrow 계정과 자체 동결 기간을 갖습니다.
아래 예제는 세 그룹에 세 개의 Freeze Token Payment 가드가 있는 Candy Machine을 보여줍니다:
- 그룹 1과 2는 같은 Destination 주소를 공유하므로 같은 Freeze Escrow 계정을 공유합니다.
- 그룹 3은 자체 Destination 주소를 가지므로 자체 Freeze Escrow 계정을 갖습니다.
