Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
41 changes: 41 additions & 0 deletions src/__tests__/tractor/soil-event-query.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
import { TIME_TO_BLOCKS } from "@/constants/blocks";
import { getSoilEventQueryOptions } from "@/lib/Tractor/sowOrder/soil-event-query";
import { describe, expect, it } from "vitest";

describe("getSoilEventQueryOptions", () => {
it("uses the current season and a one-day relative lookback when season is available", () => {
const latestBlock = 2_000_000n;

expect(getSoilEventQueryOptions(latestBlock, 12_345)).toEqual({
fromBlock: latestBlock - TIME_TO_BLOCKS.day,
toBlock: "latest",
args: {
season: 12_345,
},
});
});

it("uses latest-minus-one-month for fallback queries", () => {
const latestBlock = 2_000_000n;

expect(getSoilEventQueryOptions(latestBlock)).toEqual({
fromBlock: latestBlock - TIME_TO_BLOCKS.month,
toBlock: "latest",
});
});

it("clamps low block numbers to zero", () => {
expect(getSoilEventQueryOptions(100n)).toEqual({
fromBlock: 0n,
toBlock: "latest",
});

expect(getSoilEventQueryOptions(100n, 12_345)).toEqual({
fromBlock: 0n,
toBlock: "latest",
args: {
season: 12_345,
},
});
});
});
24 changes: 6 additions & 18 deletions src/components/nav/nav/Navbar.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ import HelperLink, { hoveredIdAtom } from "@/components/HelperLink";
import NoBaseValueAlert from "@/components/NoBaseValueAlert";
import { ScrollHideComponent } from "@/components/ScrollHideComponent";
import Panel from "@/components/ui/Panel";
import useFarmerActions from "@/hooks/useFarmerActions";
import useFarmerStatus from "@/hooks/useFarmerStatus";
import { NavbarPanelType, navbarPanelAtom } from "@/state/app/navBar.atoms";
import { useFarmerBalances } from "@/state/useFarmerBalances";
Expand Down Expand Up @@ -43,7 +42,6 @@ const Navbar = () => {
const queryClient = useQueryClient();

const account = useAccount();
const farmerActions = useFarmerActions();
const farmerBalances = useFarmerBalances();
const priceData = usePriceData();
const farmerSilo = useFarmerSilo();
Expand All @@ -54,9 +52,7 @@ const Navbar = () => {
const { refetch: refetchTwaDeltaBLP, queryKey: TwaDeltaBLPQuery } = useTwaDeltaBLPQuery();
const { refetch: refetchTwaDeltaB } = useTwaDeltaBQuery();

const hasInternal = farmerActions.totalValue.wallet.internal.gt(0);
const floodValue = farmerActions.floodAssets.totalValue;
const usdValue = farmerActions.totalValue.wallet.total;
const hasFloodAssets = farmerSilo.flood.farmerSops.some((sop) => sop.wellsPlenty.plenty.gt(0));

const isHome = useMatch("/");
const isOverview = useMatch("/overview");
Expand Down Expand Up @@ -116,7 +112,7 @@ const Navbar = () => {
return;
}

if (floodValue.gt(0)) {
if (hasFloodAssets) {
setPanelState({
...panelState,
openPanel: "wallet",
Expand All @@ -128,10 +124,13 @@ const Navbar = () => {
showTransfer: false,
},
});
return;
}

togglePanel("wallet");
}, [
account.address,
hasFloodAssets,

modal,
panelState,
Expand Down Expand Up @@ -272,18 +271,7 @@ const Navbar = () => {
<ScrollHideComponent>
<HelperLink
onClick={handleHelperLinkClick}
text={
!account.address
? "Connect your Wallet"
: /* : floodValue.gt(0)
? `Claim ${formatter.usd(floodValue)} from Flood`
: `Manage ${usdValue.gt(0.01) ? `${formatter.usd(usdValue)} in` : "your"} Wallet ${hasInternal ? "+ Farm Wallets" : "Balance"}`
*/
/*
`Manage ${usdValue.gt(0.01) ? `${formatter.usd(usdValue)} in` : "your"} Wallet`
*/
`Manage External Wallet`
}
text={!account.address ? "Connect your Wallet" : "Manage External Wallet"}
className={`absolute top-[9.375rem] right-[22.5rem] flex flex-row-reverse`}
sourceAnchor="right"
targetAnchor="left"
Expand Down
8 changes: 4 additions & 4 deletions src/constants/query.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ const TWENTY_MINS = 1000 * 60 * 20;

const FIVE_MINS = 1000 * 60 * 5;

const FIFTEEN_SECONDS = 1000 * 60;
const QUOTE_REFRESH_INTERVAL = 1000 * 60;

export const defaultQuerySettingsSlow = {
staleTime: TWENTY_MINS * 3, // 1 hour
Expand Down Expand Up @@ -44,12 +44,12 @@ export const defaultQuerySettingsNoRefetch = {
* Default query settings for quote queries.
* This is used for queries that are used to fetch quote data & need to fetch data very frequently.
*
* default query settings is to fetch data every 15 seconds
* Default quote queries refresh every 60 seconds. Keep the constant name aligned with the actual value.
*/
export const defaultQuerySettingsQuote = {
...defaultQuerySettingsFast,
staleTime: FIFTEEN_SECONDS,
refetchInterval: FIFTEEN_SECONDS,
staleTime: QUOTE_REFRESH_INTERVAL,
refetchInterval: QUOTE_REFRESH_INTERVAL,
};

export const QUERY_SETTINGS = {
Expand Down
1 change: 1 addition & 0 deletions src/lib/Tractor/sowOrder/index.ts
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
export * from "./tractor-sow";
export * from "./tractor-sow-types";
export * from "./soil-event-query";
34 changes: 34 additions & 0 deletions src/lib/Tractor/sowOrder/soil-event-query.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
import { TIME_TO_BLOCKS } from "@/constants/blocks";

export interface SoilEventQueryOptions {
fromBlock: bigint;
toBlock: "latest";
args?: {
season: number;
};
}

export function getSoilEventQueryOptions(
latestBlockNumber: bigint | null | undefined,
currentSeason?: number,
): SoilEventQueryOptions {
const hasCurrentSeason = typeof currentSeason === "number" && currentSeason > 0;
const lookbackBlocks = hasCurrentSeason ? TIME_TO_BLOCKS.day : TIME_TO_BLOCKS.month;
const safeLatestBlock = latestBlockNumber ?? 0n;
const fromBlock = safeLatestBlock > lookbackBlocks ? safeLatestBlock - lookbackBlocks : 0n;

if (hasCurrentSeason) {
return {
fromBlock,
toBlock: "latest",
args: {
season: currentSeason,
},
};
}

return {
fromBlock,
toBlock: "latest",
};
}
9 changes: 5 additions & 4 deletions src/lib/Tractor/sowOrder/tractor-sow.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@ import {
SOW_BLUEPRINT_V0_SELECTOR,
TRACTOR_HELPERS_ADDRESS,
} from "@/constants/address";
import { TIME_TO_BLOCKS } from "@/constants/blocks";
import { PODS } from "@/constants/internalTokens";
import { beanstalkAbi } from "@/generated/contractHooks";
import { TRACTOR_DEPLOYMENT_BLOCK } from "@/lib/Tractor/core/constants";
Expand All @@ -27,6 +26,7 @@ import { generateBatchSortDepositsCallData } from "../../claim/depositUtils";
import { CreateTractorDataReturnType, WithdrawalPlan, decodeEncodedTractorDataToAdvancedPipeCalls } from "../core";
import { loadPublishedRequisitions } from "../requisitions/tractor-requisition";
import { LowStalkDepositsMode, WithdrawalPlanFilterParams } from "./../core/shared-tractor-types";
import { getSoilEventQueryOptions } from "./soil-event-query";
import { OrderbookEntry, SowBlueprintData, SowBlueprintDisplayData, TractorSowOrderParams } from "./tractor-sow-types";

// ────────────────────────────────────────────────────────────────────────────────
Expand Down Expand Up @@ -440,6 +440,7 @@ export function decodeSowTractorData(

export interface LoadOrderbookDataOptions {
filterOutCompleted?: boolean;
currentSeason?: number;
}

export async function loadOrderbookData(
Expand All @@ -454,7 +455,7 @@ export async function loadOrderbookData(
): Promise<OrderbookEntry[]> {
if (!protocolAddress || !publicClient) return [];

const loadOptions: Required<LoadOrderbookDataOptions> = { filterOutCompleted: true, ...options };
const loadOptions = { filterOutCompleted: true, ...options };

const knownBlueprintHashes = new Set<string>(
activeApiEntries?.map((order) => order.requisition.blueprintHash.toLowerCase()) ?? [],
Expand Down Expand Up @@ -808,12 +809,12 @@ export async function loadOrderbookData(
// Get the total amount of soil available from the protocol
try {
// Query for the most recent Soil event
const soilQueryOptions = getSoilEventQueryOptions(latestBlock?.number, loadOptions.currentSeason);
const soilEvents = await publicClient.getContractEvents({
address: protocolAddress,
abi: diamondABI,
eventName: "Soil",
fromBlock: TIME_TO_BLOCKS.month,
toBlock: "latest",
...soilQueryOptions,
});

// Get the most recent event (should be the last one)
Expand Down
2 changes: 2 additions & 0 deletions src/state/queryKeys.ts
Original file line number Diff line number Diff line change
Expand Up @@ -60,13 +60,15 @@ const tractorQueryKeys = {
options?: {
cancelled?: boolean;
filterOutCompleted?: boolean;
currentSeason?: number;
},
) => [
BASE_QKS.tractor,
"sowOrdersV0",
"chain",
lastUpdatedBlock?.toString() ?? "0",
maxTemp?.blockchainString ?? "0",
`season-${options?.currentSeason ?? "none"}`,
`filter-completed-${Number(options?.filterOutCompleted ?? true)}`,
`cancelled-${Number(options?.cancelled ?? "any")}`,
],
Expand Down
9 changes: 7 additions & 2 deletions src/state/tractor/useTractorSowOrders.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import { OrderbookEntry, TractorAPI, TractorAPIOrdersResponse, loadOrderbookData
import { TEMPERATURE_DECIMALS } from "@/state/protocol/field";
import { queryKeys } from "@/state/queryKeys";
import { useTemperature } from "@/state/useFieldData";
import { useSeason } from "@/state/useSunData";
import { getChainConstant } from "@/utils/chain";
import { resolveChainId } from "@/utils/chain";
import { HashString } from "@/utils/types.generic";
Expand Down Expand Up @@ -150,6 +151,7 @@ export function useTractorSowOrderbook<T = OrderbookEntry[]>({
const client = usePublicClient({ chainId });
const diamond = useProtocolAddress();
const temperature = useTemperature();
const currentSeason = useSeason();

// Deconstructed args
const { address, chainOnly = false, enabled = true } = params;
Expand Down Expand Up @@ -182,7 +184,10 @@ export function useTractorSowOrderbook<T = OrderbookEntry[]>({
);

const ordersChainQuery = useQuery<OrderbookEntry[] | undefined, DefaultError, T>({
queryKey: queryKeys.tractor.sowOrdersV0Chain(orders?.lastUpdated ?? chainOnly ? 1 : 0, temperature.max, params),
queryKey: queryKeys.tractor.sowOrdersV0Chain(orders?.lastUpdated ?? chainOnly ? 1 : 0, temperature.max, {
...params,
currentSeason,
}),
queryFn: async () => {
if (temperature.max.lte(0) || !client) {
return [];
Expand All @@ -203,7 +208,7 @@ export function useTractorSowOrderbook<T = OrderbookEntry[]>({
temperature.max.toNumber(),
orders?.orders,
lookbackBlocks,
params,
{ ...params, currentSeason },
);

console.debug("[TRACTOR/useTractorSowOrderbook/ordersChainQuery] DATA", {
Expand Down
2 changes: 2 additions & 0 deletions src/state/use3PSiloWrappedTokenData.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { TokenValue } from "@/classes/TokenValue";
import { defaultQuerySettings } from "@/constants/query";
import { CREAM_S_MAIN_TOKEN } from "@/constants/tokens";
import { useChainConstant } from "@/utils/chain";
import { useReadContract } from "wagmi";
Expand Down Expand Up @@ -26,6 +27,7 @@ export const useCreamSiloWrappedTokenExchangeRate = () => {
abi: creamABISnippet,
functionName: "exchangeRateStored",
query: {
...defaultQuerySettings,
select: select,
},
});
Expand Down
2 changes: 2 additions & 0 deletions src/state/useFarmerSilo.ts
Original file line number Diff line number Diff line change
Expand Up @@ -273,6 +273,7 @@ export function useFarmerSilo(address?: `0x${string}`, shouldLog?: boolean) {
functionName: "balanceOfStalk",
args: [farmerAddress ?? ZERO_ADDRESS],
query: {
...QUERY_SETTINGS,
enabled: Boolean(farmerAddress),
select: (data) => TokenValue.fromBlockchain(data ?? 0n, STALK.decimals),
},
Expand All @@ -284,6 +285,7 @@ export function useFarmerSilo(address?: `0x${string}`, shouldLog?: boolean) {
functionName: "balanceOfEarnedBeans",
args: [farmerAddress ?? ZERO_ADDRESS],
query: {
...QUERY_SETTINGS,
enabled: Boolean(farmerAddress),
select: (data) => TokenValue.fromBlockchain(data ?? 0n, BEAN.decimals),
},
Expand Down
Loading