Skip to content

Commit 3debb6b

Browse files
authored
Merge pull request #403 from pinto-org/hotfix/filter-marketplace-listings
fix(market): validate listing viability and update default min fill
2 parents 8eb6c10 + 9e717e0 commit 3debb6b

File tree

3 files changed

+42
-3
lines changed

3 files changed

+42
-3
lines changed

src/pages/market/actions/CreateListing.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ export default function CreateListing({ onSelectionChange }: CreateListingProps
110110
const maxExpiration = Number.parseInt(podIndex.toHuman()) - Number.parseInt(harvestableIndex.toHuman()) || 0;
111111
const [expiresIn, setExpiresIn] = useState<number | null>(null);
112112
const selectedExpiresIn = expiresIn ?? maxExpiration;
113-
const minFill = TokenValue.fromHuman(1, PODS.decimals);
113+
const minFill = TokenValue.fromHuman(0.1, PODS.decimals);
114114
const [showAdvancedSettings, setShowAdvancedSettings] = useState(false);
115115

116116
const plotPosition = plot.length > 0 ? plot[0].index.sub(harvestableIndex) : TV.ZERO;

src/state/market/useMarketEntities.ts

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,17 @@ export function useMarketEntities(data: AllMarketActivityQuery | undefined, isFe
1313

1414
if (isLoaded) {
1515
data.podListings.forEach((listing) => {
16+
// Filter out listings that cannot be purchased (pricePerPod * remainingAmount < minFillAmount)
17+
const pricePerPod = TokenValue.fromBlockchain(listing.pricePerPod, PINTO.decimals);
18+
const remainingAmount = TokenValue.fromBlockchain(listing.remainingAmount, PODS.decimals);
19+
const minFillAmount = TokenValue.fromBlockchain(listing.minFillAmount, PINTO.decimals);
20+
const totalValue = pricePerPod.mul(remainingAmount);
21+
22+
// Skip listings where totalValue < minFillAmount
23+
if (totalValue.lt(minFillAmount)) {
24+
return;
25+
}
26+
1627
const parsed: Listing = {
1728
type: "LISTING",
1829
amount: TokenValue.fromBlockchain(listing.amount, PODS.decimals),
@@ -24,7 +35,7 @@ export function useMarketEntities(data: AllMarketActivityQuery | undefined, isFe
2435
id: listing.id,
2536
index: TokenValue.fromBlockchain(listing.index, PODS.decimals),
2637
maxHarvestableIndex: TokenValue.fromBlockchain(listing.maxHarvestableIndex, PODS.decimals),
27-
minFillAmount: TokenValue.fromBlockchain(listing.minFillAmount, PODS.decimals),
38+
minFillAmount: TokenValue.fromBlockchain(listing.minFillAmount, PINTO.decimals),
2839
mode: listing.mode,
2940
originalAmount: TokenValue.fromBlockchain(listing.originalAmount, PODS.decimals),
3041
originalIndex: TokenValue.fromBlockchain(listing.originalIndex, PODS.decimals),

src/state/market/usePodListings.ts

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,11 @@
1+
import { TokenValue } from "@/classes/TokenValue";
2+
import { PODS } from "@/constants/internalTokens";
13
import { subgraphs } from "@/constants/subgraph";
4+
import { PINTO } from "@/constants/tokens";
25
import { AllPodListingsDocument } from "@/generated/gql/pintostalk/graphql";
36
import { useQuery } from "@tanstack/react-query";
47
import request from "graphql-request";
8+
import { useMemo } from "react";
59
import { useChainId } from "wagmi";
610
import { useHarvestableIndex } from "../useFieldData";
711
import { useQueryKeys } from "../useQueryKeys";
@@ -22,8 +26,32 @@ export default function usePodListings() {
2226
enabled: harvestableIndex.gt(0),
2327
});
2428

29+
// Filter out listings that cannot be purchased (pricePerPod * remainingAmount < minFillAmount)
30+
const filteredData = useMemo(() => {
31+
if (!podListings.data?.podListings) {
32+
return podListings.data;
33+
}
34+
35+
const filtered = podListings.data.podListings.filter((listing) => {
36+
const pricePerPod = TokenValue.fromBlockchain(listing.pricePerPod, PINTO.decimals);
37+
const remainingAmount = TokenValue.fromBlockchain(listing.remainingAmount, PODS.decimals);
38+
const minFillAmount = TokenValue.fromBlockchain(listing.minFillAmount, PINTO.decimals);
39+
40+
// Calculate total value: pricePerPod * remainingAmount
41+
const totalValue = pricePerPod.mul(remainingAmount);
42+
43+
// Keep only listings where totalValue >= minFillAmount
44+
return totalValue.gte(minFillAmount);
45+
});
46+
47+
return {
48+
...podListings.data,
49+
podListings: filtered,
50+
};
51+
}, [podListings.data]);
52+
2553
return {
26-
data: podListings.data,
54+
data: filteredData,
2755
isLoaded: !!podListings.data,
2856
isFetching: podListings.isFetching,
2957
queryKey: queryKey,

0 commit comments

Comments
 (0)