Взаимодействие контракт-контракт
Свяжешь два Tact-контракта сообщениями: запрос, ответ, проверка sender и value.
Контракт → контракт
On-chain один контракт не вызывает функцию другого синхронно. Он отправляет internal message; ответ — отдельная транзакция. Согласованность строится на проверке sender() и явных opcode/типах сообщений.
PriceOracle ←→ Consumer
Как это работает
QuoteRequest.replyTo— куда оракул шлёт ответ (частоmyAddress()).SendRemainingValueна стороне oracle возвращает остаток value consumer’у вместе с ответом.require(sender() == self.oracle)— без этого любой сможет подделатьQuoteResponse.queryIdсвязывает запрос и ответ и отсекает устаревшие реплаи.- Ошибки у oracle при
bounce: trueвернут bounce в consumer — заложили обработчик или миритесь с no-op.
Частые ошибки
Доверяешь полям сообщения, но не sender() → классическая подделка ответа.
Шлёшь value: 0 без mode, который берёт value из входа → сообщение может не оплатить forward fee.
Ждёшь ответ в той же транзакции → его ещё нет; UI/тесты смотрят цепочку транзакций.
Что дальше
- Обработка bounce-сообщений — откат, если oracle упал
- Тестирование контракта в sandbox: unit-тесты — прогнать цепочку из двух контрактов
- Get-методы: чтение состояния контракта —
lastPriceпосле ответа
Материалы gramdocs.tech носят образовательный характер и не являются финансовой, юридической или инвестиционной рекомендацией. Работа с блокчейном TON и токеном Gram связана с рисками потери средств. Правовая информация