한 주에 3건의 Token-2022 주조: 수수료·수익·소울바운드
Source: Dev.to
If you know SPL tokens but not Token Extensions, here is the short version: Token-2022 is the upgraded Solana token program. At mint creation, you can opt into extensions: fees, interest, transfer rules, and other behaviors that live directly on the mint account. Think of it like middleware baked into the asset. Every wallet and program that touches the token sees the same rules, not a wrapper I wrote on the side.
I shipped three mints on devnet over this arc. Same CLI, three different behaviors. Days: 50 and 51
마인트: 8gSexQr1JF4NeCKRR72nckSUdexmN5ZCuBTVuTfsJdPp
탐색기: Solana Explorer에서 보기
연장: 전송 수수료, 100 베이스 포인트로 설정되고 최대 수수료는 1,000,000 토큰입니다.
이것은 토큰 자체가 동작을 시작하게 된 첫 번째 마인트였습니다. 1% 전송 수수료를 설정하고 신규 수신자 지갑에 1000 토큰을 보냈습니다. 수신자는 990개의 사용 가능한 토큰을 받았으며, 10개는 계정의 인출된 수수료 필드에 남아 있었으며, 인출될 때까지 기다려야 했습니다.
생성 명령:
spl-token --program-id TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb \
create-token \
--transfer-fee-basis-points 100 \
--transfer-fee-maximum-fee 1000000 \
--decimals 6
그 후 토큰 계정을 만들고 공급을 주조했습니다:
spl-token create-account 8gSexQr1JF4NeCKRR72nckSUdexmN5ZCuBTVuTfsJdPp
spl-token mint 8gSexQr1JF4NeCKRR72nckSUdexmN5ZCuBTVuTfsJdPp 1000
수수료 라이프사이클은 다음과 같았습니다:
spl-token transfer \
--expected-fee 10 \
$MINT 1000 $RECIPIENT \
--allow-unfunded-recipient
spl-token display $RECIPIENT_TA
spl-token withdraw-withheld-tokens $MY_TA $RECIPIENT_TA
이용처: 부가 이동에 대한 로열티를 가진 크리에이터 토큰, 프로토콜 treasury 스킴, 또는 모든 전송이 프로젝트에 작은 금액을 되돌려 주는 커뮤니티 통화 등입니다. 중요한 점은 수수료가 웹 서버에 의해 강제되지 않으며, Token-2022 프로그램이 전송 시 직접 적용된다는 것입니다.
Day: 52
마인트: 6KHkyuc1v8BqZySkEp6wGdAiG26TJnH6h5JGSU91FD7s
탐색기: Solana Explorer에서 보기
연장: 전송 수수료 및 이자 발생.
이 마인트는 동일한 1% 전송 수수료와 5000 베이스 포인트의 이자 설정이라는 두 가지 동작을 같은 자산에 겹치게 했습니다. CLI 용어로는 이는 50% 이자율입니다.
생성 명령:
spl-token create-token \
--program-id TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb \
--decimals 6 \
--transfer-fee-basis-points 100 \
--transfer-fee-maximum-fee 1000000 \
--interest-rate 5000
생성 후 spl-token display는 다음 연장을 모두 표시했습니다:
연장
이자 발생:
현재 금리: 5000bps
평균 금리: 5000bps
전송 수수료:
현재 수수료: 100bps
여기서 중요한 점은 이자 발생 연장이 시간이 지나면서 UI 금액을 변화시킨다는 것입니다. 실제 토큰 공급을 새로이 주조하지 않습니다. 1,000,000 토큰을 주조한 뒤 약 30초 동안 계정의 표시 잔고가 상승하는 것을 확인했습니다:
1000004.991023
1000005.482204
이 차이는 쉽게 놓칠 수 있습니다. 이는 스테이킹 프로그램의 보상 주조가 아니라, 설정된 금리에 따라 토큰-2022가 표시하는 동작입니다.
이용처: 저축식 잔액, 시각적으로 성장하는 충성도 포인트, 또는 커스텀 프로그램이 필요 없이 지갑에서 시간이 지나면서 잔고가 누적되어야 하는 모든 토큰에 적용할 수 있습니다.
Day: 54
마인트: DRVQaZxsixMWiUrJxUmwXq6eY6vj1ZjEUz5epgoc25fk
탐색기: Solana Explorer에서 보기
연장: 비전송 가능.
이것은 정신 모델을 뒤집었습니다. 전송을 복잡하게 만들기보다 완전히 전송을 비활성화했습니다.
생성 명령:
spl-token create-token --program-2022 --enable-non-transferable
spl-token create-account $MINT
spl-token mint $MINT 1
그 후 수신자 계정을 만들고 토큰을 전송하려 했습니다:
spl-token create-account $MINT --owner $RECIPIENT --fee-payer ~/.config/solana/id.json
spl-token transfer $MINT 1 $RECIPIENT --allow-unfunded-recipient
프로그램이 이를 거부했습니다:
Program log: Instruction: TransferChecked
Program log: Transfer is disabled for this mint
Program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb failed: custom program error: 0x25
spl-token display는 마인트 수준 규칙을 확인했습니다:
연장
비전송 가능
이용처: 인증서, 출석 증명 배지, 명성 증빙권, 또는 원본 보유자에게 붙여져 전radable 자산이 되지 않도록 하는 토큰 등.
이전에는 각 마인트에 spl-token display를 실행하고 Extensions 블록을 확인했습니다. 마치 데이터베이스 마이그레이션 후에 DESCRIBE 테이블을 수행하는 것과 같았습니다. 제가 직접 입력한 명령을 신뢰하지 않고, 지갑, 탐색기, 다른 프로그램들이 읽는 공개 계정 상태를 읽었습니다.
실용적인 참고 사항: 이러한 마인트는 Token-2022 프로그램 아래에 존재합니다. spl-token display가 계정이 존재하지 않는다고 표시하면 다음을 시도해 보세요:
spl-token display --program-2022
테스트 중 정확히 그 혼동에 부딪혔습니다.
놀라운 점은 마인트 자체에 얼마나 많은 제품 동작이 존재할 수 있는지입니다. 전송 수수료는 제가normally 백엔드 코드를 작성하는 것과 같았으며, 이자 felt like 스테이킹 프로그램에서 기대되는 동작이었습니다. 비전송 가능성은 앱 수준 규칙처럼 느껴졌습니다. Token-2022에서는 이 세 가지 모두 마인트 구성에 포함됩니다.
실제 제품에서는 자산이 재무 또는 로열티 메커니즘을 필요로 할 때 전송 수수료를 찾고, 표시 잔고가 시간이 지나면서 성장해야 할 경우 이자 발생 토큰을 사용하며, 유동성이 아닌 명성이나 신원 자체를 목표로 할 때 비전송 가능 토큰을 사용합니다.
이번 주에 이해하고자 했던 것은 단순히 토큰을 만드는 방법이 아니라, 커스텀 프로그램을 작성하기 전에 토큰에 얼마나 많은 동작을 붙일 수 있는지라는 점입니다.
위所有 마인트와 트랜잭션은 모두 Solana Devnet에서 진행되었습니다.