Этот контракт используется когда покупатель хочет сделать предложение владельцу нфт о покупке. Покупатель инициирует процесс покупки создавая контракт офера и переводя на него желаемую сумму. Продавец нфт может согласиться, отказаться от предложения или вовсе его проигнорировать. Если продавец согласен на продажу он делает трансфер своей нфт на контракт офера, получив нфт контракт отправляет тоны владельцу нфт а нфт создателю офера. Контракт офера имеет срок действия после которого он считается не действительным. Это ограничений не жесткое и используется для того чтобы можно было отменить офер external сообщением.
Если продавец не согласен принять офер, то маркетплейс должен самостоятельно отменить офер. Для этого маркетплейс в своем UI должен показать конпку отмены и проверить что ее нажал именно владелец нфт. Чтобы отменить офер, нфт маркетплейс отправляет оферу сообщение с op-кодом 3. Маркетплейс может забрать до 0.5 TON с контракта для покрытия издержек на отмену офера. Маркетплейс должен отправлять достаточное кол-во тон для покрытия газа на обмен нфт, рекомендуемое значение для forward_amount 0.5 тон. Конкретное значение может быть разным для разных нфт. Маркетплейс должен убедиться что нфт способна отправить правильное сообщение ownership_assigned во время трансфера https://github.com/ton-blockchain/TEPs/blob/master/text/0062-nft-standard.md#1-transfer
- int 0x4f46464552 -- всегда такое значение
- int is_complete -- -1 означает что офер уже отменен или принят
- int created_at unix timestamp даты создания офера, используется чтобы у оферов для одной нфт были разные адреса
- int finish_at unix timestamp даты после которой офер считается не действительным и может быть отменен external сообщением
- int swap_at unix timestamp даты когда был совершен обмен
- slice(MsgAddress) marketplace_address адрес маркетплейса, этот адрес может отменить офер
- slice(MsgAddress) nft_address адрес нфт которую ожидает получить офер для обмена
- slice(MsgAddress) offer_owner_address адрес создатедя офера, этот адрес получит нфт в случае обмена и может отменить офер
- int full_price полная сумма офера, значение этого поля надо сравнивать с балансом аккаунта, допускаются небольшие расхождения из-за платы за хранение
- slice(MsgAddress) marketplace_fee_address адрес для комиссии маркетплейса
- int marketplace_factor
- int marketplace_base процент комиссии маркетплейса выражен двумя цифрами, пример: marketplace_factor = 10 marketplace_base = 100, означает что комиссия маркетплейса 10% 10/100=0.1=10%
- slice(MsgAddress) royalty_address адрес роялти коллекции
- int royalty_factor
- int royalty_base процент роялти коллекции выражен двумя цифрами аналогичко проценту комиссии маркетплейса
- int profit_price примерна сумма которую получит пользователь если пример офер, фактическая сумма будет меньше из-за оплаты хранения контракта и трат на газ
- хеш кода контракта должен совпадать с эталонным, нельзя полагаться только на гет методы
- full_price и баланс аккаунта не должны отличатся друг от друга больше чем на 0.05 тон
- метод get_offer_data_v2 вызывается нормально и значение profit_price больше 0.001 тон
- поля marketplace_address nft_address offer_owner_address royalty_address заполнены и содержат не пустые адреса, адрес должен быть валидным MsgAddress workchain 0