@@ -17,6 +17,7 @@ contract ResaleFacet is AccessControlAppStorageEnumerableMarket {
1717 bytes32 public constant RESALE_ADMIN = keccak256 ("RESALE_ADMIN " );
1818
1919 event TokenSold (address erc721Address , address buyer , address seller , uint token , uint tokenPrice );
20+ event TokenOfferCreated (address erc721Address , address seller , uint token , uint tokenPrice , uint offerId );
2021
2122 modifier onlyOwnerOfContract (address erc721 ) {
2223 ResaleStorage.Layout storage data = ResaleStorage.layout ();
@@ -110,22 +111,24 @@ contract ResaleFacet is AccessControlAppStorageEnumerableMarket {
110111 }
111112 }
112113
113- function purchaseTokenOffer (
114+ function _sendToken (
114115 address erc721 ,
115- address buyer ,
116- address seller ,
117116 uint token ,
117+ address seller ,
118+ address buyer ,
119+ uint tokenPrice
120+ ) internal {
121+ IERC721 (erc721).transferFrom (seller, buyer, token);
122+ emit TokenSold (erc721, buyer, seller, token, tokenPrice);
123+ }
124+
125+ function _distributeFees (
126+ address erc721 ,
118127 uint tokenPrice ,
119128 address nodeAddress ,
120- bytes memory signature
121- ) public payable {
129+ address seller
130+ ) internal {
122131 ResaleStorage.feeSplits[] storage royaltyData = ResaleStorage.layout ().royaltySplits[erc721];
123- bytes32 messageHash = generateResaleHash (erc721, buyer, seller, token, tokenPrice, nodeAddress);
124- bytes32 ethSignedMessageHash = getSignedMessageHash (messageHash);
125- require (
126- hasRole (RESALE_ADMIN, recoverSigner (ethSignedMessageHash, signature)),
127- "Resale: Invalid withdraw request "
128- );
129132 require (tokenPrice <= msg .value , "Resale: Insufficient funds! " );
130133 uint leftoverForSeller = tokenPrice;
131134 if (msg .value - tokenPrice > 0 ) {
@@ -151,7 +154,74 @@ contract ResaleFacet is AccessControlAppStorageEnumerableMarket {
151154 payable (address (seller)).transfer (leftoverForSeller);
152155 totalTransferred += leftoverForSeller;
153156 require (totalTransferred == tokenPrice, "Resale: Error transferring funds! " );
154- IERC721 (erc721).transferFrom (seller, buyer, token);
155- emit TokenSold (erc721, buyer, seller, token, tokenPrice);
157+ }
158+
159+ function createGasTokenOffer (
160+ address erc721 ,
161+ uint token ,
162+ uint tokenPrice ,
163+ address nodeAddress
164+ ) public {
165+ require (
166+ IERC721 (erc721).ownerOf (token) == msg .sender ,
167+ "Resale: Not the current owner of the token "
168+ );
169+ ResaleStorage.resaleOffer storage newOffer = ResaleStorage.layout ().resaleOffers.push ();
170+ newOffer.erc721 = erc721;
171+ newOffer.seller = msg .sender ;
172+ newOffer.token = token;
173+ newOffer.tokenPrice = tokenPrice;
174+ newOffer.nodeAddress = nodeAddress;
175+ emit TokenOfferCreated (
176+ erc721,
177+ msg .sender ,
178+ token,
179+ tokenPrice,
180+ ResaleStorage.layout ().resaleOffers.length - 1
181+ );
182+ }
183+
184+ function purchaseGasTokenOffer (
185+ uint offerIndex
186+ ) public payable {
187+ ResaleStorage.resaleOffer storage offerData = ResaleStorage.layout ().resaleOffers[offerIndex];
188+ require (
189+ offerData.buyer == address (0 ),
190+ "Resale: Offer already purchased "
191+ );
192+ _distributeFees (
193+ offerData.erc721,
194+ offerData.tokenPrice,
195+ offerData.nodeAddress,
196+ offerData.seller
197+ );
198+ _sendToken (
199+ offerData.erc721,
200+ offerData.token,
201+ offerData.seller,
202+ msg .sender ,
203+ offerData.tokenPrice
204+ );
205+ offerData.buyer = msg .sender ;
206+ }
207+
208+ function purchaseTokenOffer (
209+ address erc721 ,
210+ address buyer ,
211+ address seller ,
212+ uint token ,
213+ uint tokenPrice ,
214+ address nodeAddress ,
215+ bytes memory signature
216+ ) public payable {
217+ bytes32 messageHash = generateResaleHash (erc721, buyer, seller, token, tokenPrice, nodeAddress);
218+ bytes32 ethSignedMessageHash = getSignedMessageHash (messageHash);
219+ require (
220+ hasRole (RESALE_ADMIN, recoverSigner (ethSignedMessageHash, signature)),
221+ "Resale: Invalid withdraw request "
222+ );
223+
224+ _distributeFees (erc721, tokenPrice, nodeAddress, seller);
225+ _sendToken (erc721, token, seller, buyer, tokenPrice);
156226 }
157227}
0 commit comments