fb9a7f4e8b
- ops: readGlobal читает vaultBalance (getTokenAccountBalance), createBet/closeBet передают bettorToken/vaultToken/tokenProgram, ensureVaultFunded наливает токен (mintTo, allowOwnerOffCurve) - pda: vaultPda([global,vault]), config:.env.new SMART_TOKEN_MINT, суммы в токен-единицах - check.ts: 14 проверок сигнатур создания create/close под новым токеновым IDL - @solana/spl-token dependency; .gitignore + node_modules/dist
4.0 KiB
4.0 KiB
TASK — Фаза 2: перевести релейер с SOL на фантики (SPL-токен)
Репозиторий: smart-updown-token (тот, где контракт уже на токене). Работаем ТОЛЬКО в relayer/.
Контракт уже переведён (Фаза 1, коммит 45d64d4) — релейер теперь должен звать его токеновые инструкции.
Контекст
- Контракт переведён:
create_betescrow'ит фантики bettor→vault;close_betплатит vault→bettor. - Новые аккаунты в инструкциях:
bettor_token,vault_token,token_program. IDL уже содержит их (вrelayer/idl/smart_updown.json— регенерирован). - Сейчас
relayer/заточен под SOL:readGlobalберётgetBalance(global),ensureVaultFundedairdrop'ит SOL,createBet/closeBetне передают токен-аккаунты.
Что сделать (в relayer/src/ и relayer/)
1. pda.ts
- Добавить
vaultPda(programId): PublicKey— PDA по седам[b"global", b"vault"](совпадает с контрактом). - (Убедиться, что
globalPdaиbetPdaсоответствуют контракту.)
2. config.ts
- Добавить
tokenMint: PublicKey(mint наших фантиков) в конфиг/cfg, с default-плейсхолдером. - Проверить
.env.example— добавить переменную для mint (напр.TOKEN_MINT).
3. ops.ts
readGlobal: вместоgetBalance(global)(SOL) — читать балансvault_token(PDAvaultPda), через connection/getTokenAccountBalance (или через spl-token). Поле, что возвращаем, переименовать/пометить какvaultBalance(в токен-единицах).createBet: в.accountsдобавитьbettor_token(ATA bettor),vault_token(vaultPda),token_program.min/amount— уже в токен-единицах (не lamports), логировать в токене.closeBet: в.accountsдобавитьbettor_token(ATA bettor по адресу из bet),vault_token,token_program.ensureVaultFunded: теперь не airDrop SOL в global, а наливать токен в vault_token — на localnet можно mint'ить mint-авторити (токен создать/налить). Либо вызывать mint по необходимости. Не SOL.
4. index.ts (главный цикл)
- Привести в соответствие: вызовы
readGlobal/createBet/closeBet/ensureVaultFunded— с новыми сигнатурами. - Логирование: суммы в токене, а не в SOL.
5. Тесты
- Обновить интеграционный тест релейера на токеновом флоу (если есть в
relayer/): создать mint/ATA, налить токен, прогнать create→close.npm test/ts-nodeзелёный.
Гейты (после каждого шага)
npm run build(илиtsc) — компилируется без ошибок.- В конце: релейер собирается, сигнатуры соответствуют новому IDL.
ЧЕГО НЕ ДЕЛАТЬ
- Не трогать контракт (
program/). - Не коммитить — всё в рабочем дереве до приёмки человеком.
- Не менять
program/иdeploy/. - Логику игры (вверх/вниз, статусы) не менять.
Проверка (что релеер готов)
npm run build— 0 ошибок.- Сигнатуры
createBet/closeBetпередаютbettor_token/vault_token/token_program. ensureVaultFundedналивает токен, а не SOL.- Логи/цикл работают с токен-единицами.