Community코딩 & 개발github.com

mohit-1710/transfer-hook-scaffold

보안 Token-2022 전송 훅(transfer hook) 생성 및 기존 훅 감사. Anchor 컴파일 참조, 스캐폴드 생성기, LiteSVM 공격 테스트 제공. Solana AI Kit을 위해 설계됨.

transfer-hook-scaffold란 무엇인가요?

이 스킬은 Solana Token-2022 확장에서 가장 까다로운 부분인 전송 훅(Transfer Hook)을 안전하게 구축하고 감사하는 데 특화된 도구입니다. 생성된 훅은 Anchor가 자동 생성하지 않는 인터페이스 식별자를 올바르게 노출하고, 바이트 단위 정확한 순서의 ExtraAccountMetaList를 배치하며, out-of-band 호출에 저항하도록 설계되었습니다. 이 스킬은 즉시 사용 가능한 스캐폴드 생성 명령어(`/transfer-hook:scaffold`)와 기존 훅 프로그램을 감사하는 명령어(`/transfer-hook:audit`)를 제공하며, 참조 프로그램과 LiteSVM 기반 공격 테스트를 포함합니다. 개발자는 화이트리스트/KYC 게이트, 로열티 징수, 수수료 라우팅, 전송별 회계/제한 등 다양한 사용 사례에 맞는 보안 훅을 신속하게 만들 수 있습니다. 핵심은 fallback 함수를 통한 in-process 디스패치, ExtraAccountMetaList의 올바른 초기화, is_transferring 가드, 그리고 모든 주입 계정을 PDA 시드에 바인딩하는 비협상 규칙을 준수하는 것입니다. 이 스킬은 solana-token-extensions나 token-2022-extensions 스킬의 한 기능으로서의 훅 지원을 보완하며, 훅을 실제로 구축하거나 강화할 때 함께 설치하여 사용할 수 있습니다.

지원 대상~Claude Code~Codex CLI~Cursor
npx skills add mohit-1710/transfer-hook-scaffold

Installed? Explore more 코딩 & 개발 skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

즐겨 사용하는 AI에게 물어보기

이 에이전트 스킬이 미리 로드된 새 채팅을 엽니다.

문서

Token-2022 전송 훅(Transfer-Hook) 스캐폴드

전송 훅은 Token-2022 확장 중 올바르게 구현하기 가장 까다로운 부분입니다. 프로그램은 Anchor가 생성하지 않는 인터페이스 식별자를 노출하고, 바이트 단위로 정확한 순서의 ExtraAccountMetaList를 배치하며, out-of-band 호출에 저항해야 합니다. 작은 실수도 불투명한 런타임 오류로 나타납니다. 이 스킬은 안전을 기본값으로 하는 경로로, 컴파일되는 프로그램과 LiteSVM 공격 테스트로 뒷받침됩니다.

토큰 확장 스킬과의 차이점: solana-token-extensions / token-2022-extensions는 훅을 하나의 기능으로 취급합니다(단일 정적 예제와 한 경우 체크리스트 감사). 이 스킬은 전용 훅 도구입니다. 주문에 따라 새로운 보안 훅을 생성하는(scaffold.sh) 유일한 도구이며, 통과하는 공격 테스트로 감사 기능을 뒷받침합니다. 상호 보완적입니다. 실제로 훅을 구축하거나 강화할 때 함께 설치하세요.

이 스킬을 사용하는 경우

  • 전송 훅 구축: 화이트리스트/KYC 게이팅, 로열티 징수, 수수료 라우팅, 전송별 회계/제한, 소울바운드 규칙.
  • 훅 디버깅: AccountNotFound, NotEnoughAccountKeys, IncorrectAccountAddress, 또는 "훅 없이 전송되나 훅 있으면 실패" 현상.
  • 기존 훅 프로그램 검토/감사: 일반적인 실수 확인.
  • 훅을 가리키는 Token-2022 민트 생성 및 클라이언트 전송 연결.

통합자 참고: 소비 측면(훅이 있는 타사 민트 수용)이라면 다른 문제입니다. 대부분의 통합자는 알 수 없는 훅 민트를 거부해야 합니다. 함께 제공되는 token2022-integration-guard 스킬을 참조하세요.

개념 모델 (먼저 읽으세요)

  1. 훅 프로그램은 Execute (SPL 전송-훅 인터페이스)를 구현하며, Token-2022는 모든 전송 시 이를 CPI 호출합니다. Anchor는 sha256("global:<ix>")로 디스패치하는데, 이는 인터페이스 식별자와 일치하지 않습니다. 따라서 fallback 을 추가하여 인터페이스 명령을 디코딩하고 인-프로세스로 디스패치합니다(절대 self-CPI 안 됨). → program.md
  2. 훅은 추가 계정을 요구할 수 있습니다. 이를 ExtraAccountMetaList PDA(["extra-account-metas", mint])에 한 번 선언하면 Token-2022가 읽어 Execute에 해당 계정을 전달하며, 전송 시 시드 기반 PDA를 해결합니다. 순서가 중요합니다. → extra-account-metas.md
  3. 클라이언트는 createTransferCheckedWithTransferHookInstruction으로 전송을 구성해야 합니다(일반 transferChecked는 추가 계정을 생략하여 되돌립니다). → client-wiring.md
  4. 훅은 공격자에게 노출됩니다. 보호하세요. → security.md
  5. 훅을 통해 전송하는 테스트로 증명하세요. → testing.md

라우팅 테이블

사용자가...읽을 문서
훅 프로그램 작성(Execute, fallback, 메타 리스트 초기화)program.md
ExtraAccountMetaList / 불투명한 계정 오류 해결extra-account-metas.md
민트 + 클라이언트 전송 연결client-wiring.md
보안 강화 / 감사security.md
훅 테스트 작성testing.md
새 훅 워크스페이스 스캐폴딩실행 /transfer-hook:scaffold
기존 훅 프로그램 감사실행 /transfer-hook:audit
출처 / 추가 자료resources.md

이 스킬에 포함된 내용

아티팩트경로설명
참조 훅 프로그램examples/hook/컴파일되는 Anchor 1.0 훅: 화이트리스트 게이트 + 민트별 카운터, fallback 라우터, is_transferring 가드.
공격 테스트examples/hook/tests/LiteSVM 테스트. 훅을 통해 전송: 화이트리스트 통과(카운터 증가), 비화이트리스트 차단, 직접 Execute 호출 거부.
스캐폴드 스크립트scripts/scaffold.sh참조에서 새 훅 워크스페이스 생성.

고정 스택 (2026)

Anchor 1.0, anchor-spl 1.0.2, spl-transfer-hook-interface =2.1.0, spl-tlv-account-resolution 0.11, @solana/spl-token 0.4.14, litesvm 1.2 (키트 네이티브, Token-2022 사전 로드). 참조 프로그램은 이 스택에서 빌드 및 테스트 통과.

비협상 규칙

  • fallback 추가: TransferHookInstruction::Execute를 디코딩하고 인-프로세스로 디스패치(__private::__global::transfer_hook) — 절대 invoke로 자신의 프로그램 호출 금지.
  • 첫 전송 전에 ExtraAccountMetaList 초기화, Vec<ExtraAccountMeta> 순서를 Execute 계정 구조체와 동일하게 유지.
  • is_transferring으로 Execute 보호 — 실제 전송 외 호출 거부.
  • 모든 주입 계정을 PDA 시드에 바인딩(Account<T> + seeds), 절대 UncheckedAccount 사용 금지 — 공격자가 화이트리스트를 위조할 수 있음.
  • 훅을 최소화하고 완전(total)하게 유지 — 모든 전송 시 실행되며, 패닉/과다 CU는 토큰을 망가뜨림.
  • 전송 경로 테스트, 단위 로직만 테스트하지 마세요 — 컴파일되는 훅도 실행 시 실패할 수 있음.

관련 스킬