Skip to content

Commit

Permalink
refactor: marketplace
Browse files Browse the repository at this point in the history
  • Loading branch information
nattb8 committed Oct 14, 2024
1 parent 068de0b commit 0bb6815
Show file tree
Hide file tree
Showing 14 changed files with 175 additions and 317 deletions.
104 changes: 90 additions & 14 deletions Assets/Shared/Scripts/Domain/OrderbookManager.cs
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using Cysharp.Threading.Tasks;
using Immutable.Api.Model;
using Immutable.Orderbook.Api;
using Immutable.Orderbook.Client;
using Immutable.Orderbook.Model;
Expand All @@ -18,7 +20,7 @@ namespace HyperCasual.Runner
public class OrderbookManager
{
private static readonly Lazy<OrderbookManager> s_Instance = new(() => new OrderbookManager());

private readonly OrderbookApi m_OrderbookApi = new(new Configuration { BasePath = Config.BASE_URL });

private OrderbookManager() { }
Expand Down Expand Up @@ -50,6 +52,11 @@ public async UniTask<string> CreateListing(
{
try
{
if (contractType == "ERC721" && amountToSell != "1")
{
throw new ArgumentException("Invalid arguments: 'amountToSell' must be '1' when listing an ERC721.");
}

var listingData = await PrepareListing(contractAddress, contractType, tokenId, price, amountToSell);

await SignAndSubmitApproval(listingData);
Expand All @@ -58,8 +65,7 @@ public async UniTask<string> CreateListing(

var listingId = await ListAsset(signature, listingData);

if (confirmListing)
await ConfirmListingStatus(listingId, "ACTIVE");
if (confirmListing) await ConfirmListingStatus(listingId, "ACTIVE");

return listingId;
}
Expand Down Expand Up @@ -186,8 +192,52 @@ public async UniTask CancelListing(string listingId, bool confirmListing = true)
if (txResponse.status != "1")
throw new Exception("Failed to cancel listing.");

if (confirmListing)
await ConfirmListingStatus(listingId, "CANCELLED");
if (confirmListing) await ConfirmListingStatus(listingId, "CANCELLED");
}
catch (ApiException e)
{
HandleApiException(e);
throw;
}
}

/// <summary>
/// Executes an order by fulfilling a listing and optionally confirming its status.
/// </summary>
/// <param name="listing">The listing to fulfill.</param>
/// <param name="confirmListing">
/// If true, the function will poll the listing endpoint to confirm that the listing status
/// has changed to "FILLED". If false, the function will not verify the listing status.
/// </param>
public async UniTask ExecuteOrder(Listing listing, bool confirmListing = true)
{
try
{
var fees = listing.PriceDetails.Fees
.Select(fee => new FulfillOrderRequestTakerFeesInner(fee.Amount, fee.RecipientAddress)).ToList();

var request = new FulfillOrderRequest(
takerAddress: SaveManager.Instance.WalletAddress,
listingId: listing.ListingId,
takerFees: fees);

var createListingResponse = await m_OrderbookApi.FulfillOrderAsync(request);

if (createListingResponse.Actions.Count > 0)
{
foreach (var transaction in createListingResponse.Actions)
{
var transactionHash = await Passport.Instance.ZkEvmSendTransaction(new TransactionRequest
{
to = transaction.PopulatedTransactions.To,
data = transaction.PopulatedTransactions.Data,
value = "0"
});
Debug.Log($"Transaction hash: {transactionHash}");
}

if (confirmListing) await ConfirmListingStatus(listing.ListingId, "FILLED");
}
}
catch (ApiException e)
{
Expand All @@ -201,17 +251,43 @@ public async UniTask CancelListing(string listingId, bool confirmListing = true)
/// </summary>
private async UniTask ConfirmListingStatus(string listingId, string desiredStatus)
{
var isConfirmed = await PollingHelper.PollAsync(
$"{Config.BASE_URL}/v1/chains/{Config.CHAIN_NAME}/orders/listings/{listingId}",
response =>
const int timeoutDuration = 60000; // Timeout duration in milliseconds
const int pollDelay = 2000; // Delay between polls in milliseconds

using var client = new HttpClient();
var startTimeMs = Time.time * 1000;
var url = $"{Config.BASE_URL}/v1/chains/{Config.CHAIN_NAME}/orders/listings/{listingId}";

while (true)
{
if (Time.time * 1000 - startTimeMs > timeoutDuration)
{
var listingResponse = JsonUtility.FromJson<ListingResponse>(response);
return listingResponse.result?.status.name == desiredStatus;
});
Debug.Log($"Failed to confirm listing status: {desiredStatus}.");
return;
}

try
{
var response = await client.GetAsync(url);
if (response.IsSuccessStatusCode)
{
var responseBody = await response.Content.ReadAsStringAsync();
var listingResponse = JsonUtility.FromJson<ListingResponse>(responseBody);

if (listingResponse.result?.status.name == desiredStatus)
{
Debug.Log($"Listing {listingId} is {desiredStatus}.");
return;
}
}
}
catch (Exception ex)
{
Debug.LogException(ex);
}

Debug.Log(isConfirmed
? $"Listing {listingId} is {desiredStatus.ToLower()}."
: $"Failed to confirm listing status: {desiredStatus.ToLower()}.");
await UniTask.Delay(pollDelay);
}
}

/// <summary>
Expand Down
8 changes: 0 additions & 8 deletions Assets/Shared/Scripts/Helpers.meta

This file was deleted.

38 changes: 0 additions & 38 deletions Assets/Shared/Scripts/Helpers/JsonHelper.cs

This file was deleted.

11 changes: 0 additions & 11 deletions Assets/Shared/Scripts/Helpers/JsonHelper.cs.meta

This file was deleted.

62 changes: 0 additions & 62 deletions Assets/Shared/Scripts/Helpers/PollingHelper.cs

This file was deleted.

11 changes: 0 additions & 11 deletions Assets/Shared/Scripts/Helpers/PollingHelper.cs.meta

This file was deleted.

6 changes: 3 additions & 3 deletions Assets/Shared/Scripts/InfiniteScrollGridView.cs
Original file line number Diff line number Diff line change
Expand Up @@ -26,17 +26,17 @@ public int TotalItemCount

private void Awake()
{
if (!m_IsInitialised) InitializeScrollView();
if (!m_IsInitialised) InitialiseScrollView();
}

private void Start()
{
if (!m_IsInitialised) InitializeScrollView();
if (!m_IsInitialised) InitialiseScrollView();
}

public event Action<int, GameObject> OnCreateItemView; // Event for item setup

private void InitializeScrollView()
private void InitialiseScrollView()
{
m_IsInitialised = true;
m_ScrollRect.onValueChanged.AddListener(OnScroll);
Expand Down
5 changes: 2 additions & 3 deletions Assets/Shared/Scripts/Model/ListingsResponse.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,12 @@ namespace HyperCasual.Runner
[Serializable]
public class ListingResponse
{
public OldListing result;
public ListingResult result;
}

[Serializable]
public class OldListing
public class ListingResult
{
public string id;
public ListingStatus status;
}

Expand Down
Loading

0 comments on commit 0bb6815

Please sign in to comment.