Когда юзер хочет продать токен1 за токен2
(токен1 может быть любым из erc20, erc721 или erc1155, токен2 еще и ETH)
(токен1 и токен2 должны быть approved для смартконтракта marketplace)

он подписывает OrderData для обоих токенов и отдает подпись в бд. Подпись - keccak256(abi.encodePacked(все поля из OrderData обоих токенов, nonce))

Юзер, желающий принять оффер отправляет Offer.toCallData() c подписью создателя оффера на смартконтракт Marketplace: acceptOffer(offer)

uml

uml