From 5225e397dadc5cd06701028ba209c655f73bc26c Mon Sep 17 00:00:00 2001 From: fr1j0 Date: Mon, 4 May 2026 11:55:24 -0400 Subject: [PATCH 1/4] fix(flood): mow dewhitelisted wells when claiming flood proceeds The wallet flood claim panel displays plenty from `mayBeWhitelistedTokens` (whitelisted + dewhitelisted) so users see WSOL/WETH proceeds, but the submit path only mowed currently-whitelisted tokens. Without a mow on the dewhitelisted wells (PINTO_WETH, PINTO_WSOL), the user's per-well `wellsPlenty` is never credited, so `claimAllPlenty` returns 0 for them. Switch `tokensToMow` to `mayBeWhitelistedTokens`, matching the existing pattern in `useClaimRewards.tsx`. Co-Authored-By: Claude Opus 4.7 (1M context) --- src/components/WalletButtonClaim.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/WalletButtonClaim.tsx b/src/components/WalletButtonClaim.tsx index d37dc12ca..8894f9b1d 100644 --- a/src/components/WalletButtonClaim.tsx +++ b/src/components/WalletButtonClaim.tsx @@ -52,7 +52,7 @@ export default function WalletButtonClaim() { const farmerSilo = useFarmerSilo(); const siloQueryKeys = farmerSilo.queryKeys; const priceData = usePriceData(); - const { whitelistedTokens } = useTokenData(); + const { mayBeWhitelistedTokens } = useTokenData(); const [balanceTo, setBalanceTo] = useState(FarmToMode.INTERNAL); const queryClient = useQueryClient(); @@ -82,7 +82,7 @@ export default function WalletButtonClaim() { try { if (!chainId || !account.address || !balanceTo) return; - const tokensToMow = whitelistedTokens.map((token: Token) => token.address); + const tokensToMow = mayBeWhitelistedTokens.map((token: Token) => token.address); const mow = encodeFunctionData({ abi: beanstalkAbi, functionName: "mowMultiple", From dc274b33383f059f4bded5525a3c6eacfae68da9 Mon Sep 17 00:00:00 2001 From: fr1j0 Date: Mon, 4 May 2026 12:08:02 -0400 Subject: [PATCH 2/4] chore(codegen): point cache schema at graph.pinto.money The cache subgraph schema source was still pointing at graph.bean.money/cache (a Beanstalk-fork leftover) while the runtime correctly hits graph.pinto.money/cache. The legacy bean.money/cache endpoint started returning 500s, breaking codegen in CI. Both endpoints expose the same cache_* query fields, so this is a drop-in swap. Regenerated types pick up Pinto-specific schema diffs (fractional temperatures, dropped CachedTokenYield which was unused, plus several additional Cached* hourly snapshot entities). Co-Authored-By: Claude Opus 4.7 (1M context) --- codegen.ts | 2 +- src/generated/gql/pintostalk-cache/graphql.ts | 341 ++++++++++++++++-- 2 files changed, 312 insertions(+), 31 deletions(-) diff --git a/codegen.ts b/codegen.ts index c473e0430..0e2aa0e16 100644 --- a/codegen.ts +++ b/codegen.ts @@ -18,7 +18,7 @@ const config: CodegenConfig = { }, }, "src/generated/gql/pintostalk-cache/": { - schema: "https://graph.bean.money/cache", + schema: "https://graph.pinto.money/cache", documents: ["src/queries/beanstalk/**/*.cache.graphql"], preset: "client", presetConfig: { diff --git a/src/generated/gql/pintostalk-cache/graphql.ts b/src/generated/gql/pintostalk-cache/graphql.ts index d55776a33..7bfa101dd 100644 --- a/src/generated/gql/pintostalk-cache/graphql.ts +++ b/src/generated/gql/pintostalk-cache/graphql.ts @@ -21,46 +21,101 @@ export type Scalars = { export type CachedBeanHourlySnapshot = { __typename?: 'CachedBeanHourlySnapshot'; - blockNumber: Scalars['BigInt']['output']; + createdTimestamp: Scalars['BigInt']['output']; crosses: Scalars['Int']['output']; deltaCrosses: Scalars['Int']['output']; deltaLiquidityUSD: Scalars['BigDecimal']['output']; deltaVolume: Scalars['BigInt']['output']; deltaVolumeUSD: Scalars['BigDecimal']['output']; id: Scalars['ID']['output']; - instantaneousDeltaB: Scalars['BigInt']['output']; + instDeltaB: Scalars['BigDecimal']['output']; + instPrice: Scalars['BigDecimal']['output']; + l2sr: Scalars['BigDecimal']['output']; + lastUpdateBlockNumber: Scalars['BigInt']['output']; + lastUpdateTimestamp: Scalars['BigInt']['output']; liquidityUSD: Scalars['BigDecimal']['output']; lockedBeans: Scalars['BigInt']['output']; marketCap: Scalars['BigDecimal']['output']; - price: Scalars['BigDecimal']['output']; - season: Scalars['Int']['output']; + seasonNumber: Scalars['Int']['output']; supply: Scalars['BigInt']['output']; supplyInPegLP: Scalars['BigDecimal']['output']; - timestamp: Scalars['BigInt']['output']; - twaDeltaB: Scalars['BigInt']['output']; + twaBeanLiquidityUSD: Scalars['BigDecimal']['output']; + twaDeltaB: Scalars['BigDecimal']['output']; + twaLiquidityUSD: Scalars['BigDecimal']['output']; + twaNonBeanLiquidityUSD: Scalars['BigDecimal']['output']; twaPrice: Scalars['BigDecimal']['output']; volume: Scalars['BigInt']['output']; volumeUSD: Scalars['BigDecimal']['output']; }; +export type CachedBeanstalkHourlySnapshot = { + __typename?: 'CachedBeanstalkHourlySnapshot'; + createdTimestamp: Scalars['BigInt']['output']; + cumulativeBuyVolumeUSD: Scalars['BigDecimal']['output']; + cumulativeConvertDownVolumeUSD: Scalars['BigDecimal']['output']; + cumulativeConvertNeutralTradeVolumeUSD: Scalars['BigDecimal']['output']; + cumulativeConvertNeutralTransferVolumeUSD: Scalars['BigDecimal']['output']; + cumulativeConvertUpVolumeUSD: Scalars['BigDecimal']['output']; + cumulativeConvertVolumeUSD: Scalars['BigDecimal']['output']; + cumulativeSellVolumeUSD: Scalars['BigDecimal']['output']; + cumulativeTradeVolumeUSD: Scalars['BigDecimal']['output']; + cumulativeTransferVolumeUSD: Scalars['BigDecimal']['output']; + deltaBuyVolumeUSD: Scalars['BigDecimal']['output']; + deltaConvertDownVolumeUSD: Scalars['BigDecimal']['output']; + deltaConvertNeutralTradeVolumeUSD: Scalars['BigDecimal']['output']; + deltaConvertNeutralTransferVolumeUSD: Scalars['BigDecimal']['output']; + deltaConvertUpVolumeUSD: Scalars['BigDecimal']['output']; + deltaConvertVolumeUSD: Scalars['BigDecimal']['output']; + deltaLiquidityUSD: Scalars['BigDecimal']['output']; + deltaSellVolumeUSD: Scalars['BigDecimal']['output']; + deltaTradeVolumeUSD: Scalars['BigDecimal']['output']; + deltaTransferVolumeUSD: Scalars['BigDecimal']['output']; + id: Scalars['ID']['output']; + lastUpdateBlockNumber: Scalars['BigInt']['output']; + lastUpdateTimestamp: Scalars['BigInt']['output']; + season: Scalars['Int']['output']; + totalLiquidityUSD: Scalars['BigDecimal']['output']; +}; + +export type CachedFarmerBalanceHourlySnapshot = { + __typename?: 'CachedFarmerBalanceHourlySnapshot'; + createdTimestamp: Scalars['BigInt']['output']; + deltaFarmBalance: Scalars['BigInt']['output']; + deltaTotalBalance: Scalars['BigInt']['output']; + deltaWalletBalance: Scalars['BigInt']['output']; + farmBalance: Scalars['BigInt']['output']; + id: Scalars['ID']['output']; + lastUpdateBlockNumber: Scalars['BigInt']['output']; + lastUpdateTimestamp: Scalars['BigInt']['output']; + seasonNumber: Scalars['Int']['output']; + totalBalance: Scalars['BigInt']['output']; + walletBalance: Scalars['BigInt']['output']; +}; + export type CachedFieldHourlySnapshot = { __typename?: 'CachedFieldHourlySnapshot'; blocksToSoldOutSoil?: Maybe; caseId?: Maybe; createdAt: Scalars['BigInt']['output']; + cultivationFactor?: Maybe; + cultivationTemperature?: Maybe; + deltaCultivationFactor?: Maybe; + deltaCultivationTemperature?: Maybe; deltaHarvestableIndex: Scalars['BigInt']['output']; deltaHarvestablePods: Scalars['BigInt']['output']; deltaHarvestedPods: Scalars['BigInt']['output']; deltaIssuedSoil: Scalars['BigInt']['output']; deltaNumberOfSowers: Scalars['Int']['output']; deltaNumberOfSows: Scalars['Int']['output']; + deltaPodDemand: Scalars['BigInt']['output']; deltaPodIndex: Scalars['BigInt']['output']; deltaPodRate: Scalars['BigDecimal']['output']; deltaRealRateOfReturn: Scalars['BigDecimal']['output']; deltaSoil: Scalars['BigInt']['output']; deltaSownBeans: Scalars['BigInt']['output']; - deltaTemperature: Scalars['Int']['output']; + deltaTemperature: Scalars['BigDecimal']['output']; deltaUnharvestablePods: Scalars['BigInt']['output']; + fieldId: Scalars['BigInt']['output']; harvestableIndex: Scalars['BigInt']['output']; harvestablePods: Scalars['BigInt']['output']; harvestedPods: Scalars['BigInt']['output']; @@ -76,11 +131,62 @@ export type CachedFieldHourlySnapshot = { soil: Scalars['BigInt']['output']; soilSoldOut: Scalars['Boolean']['output']; sownBeans: Scalars['BigInt']['output']; - temperature: Scalars['Int']['output']; + temperature: Scalars['BigDecimal']['output']; unharvestablePods: Scalars['BigInt']['output']; updatedAt: Scalars['BigInt']['output']; }; +export type CachedGaugesInfoHourlySnapshot = { + __typename?: 'CachedGaugesInfoHourlySnapshot'; + createdAt: Scalars['BigInt']['output']; + deltaG0CultivationFactor?: Maybe; + deltaG0IsActive: Scalars['Boolean']['output']; + deltaG1BlightFactor?: Maybe; + deltaG1ConvertDownPenalty?: Maybe; + deltaG1IsActive: Scalars['Boolean']['output']; + deltaG2BdvConvertedThisSeason?: Maybe; + deltaG2BonusStalkPerBdv?: Maybe; + deltaG2IsActive: Scalars['Boolean']['output']; + deltaG2MaxConvertCapacity?: Maybe; + deltaG2MaxTwaDeltaB?: Maybe; + g0CultivationFactor?: Maybe; + g0IsActive: Scalars['Boolean']['output']; + g1BlightFactor?: Maybe; + g1ConvertDownPenalty?: Maybe; + g1IsActive: Scalars['Boolean']['output']; + g2BdvConvertedThisSeason?: Maybe; + g2BonusStalkPerBdv?: Maybe; + g2IsActive: Scalars['Boolean']['output']; + g2MaxConvertCapacity?: Maybe; + g2MaxTwaDeltaB?: Maybe; + id: Scalars['ID']['output']; + season: Scalars['Int']['output']; + updatedAt: Scalars['BigInt']['output']; +}; + +export type CachedMarketPerformanceSeasonal = { + __typename?: 'CachedMarketPerformanceSeasonal'; + cumulativePercentChange?: Maybe>; + cumulativeTotalPercentChange?: Maybe; + cumulativeTotalUsdChange?: Maybe; + cumulativeUsdChange?: Maybe>; + id: Scalars['ID']['output']; + percentChange?: Maybe>; + prevSeasonTokenBalances: Array; + prevSeasonTokenUsdPrices: Array; + prevSeasonTokenUsdValues: Array; + prevSeasonTotalUsd: Scalars['BigDecimal']['output']; + season: Scalars['Int']['output']; + thisSeasonTokenUsdPrices?: Maybe>; + thisSeasonTokenUsdValues?: Maybe>; + thisSeasonTotalUsd?: Maybe; + timestamp?: Maybe; + totalPercentChange?: Maybe; + totalUsdChange?: Maybe; + usdChange?: Maybe>; + valid: Scalars['Boolean']['output']; +}; + export type CachedPodMarketplaceHourlySnapshot = { __typename?: 'CachedPodMarketplaceHourlySnapshot'; availableListedPods: Scalars['BigInt']['output']; @@ -115,24 +221,28 @@ export type CachedPodMarketplaceHourlySnapshot = { export type CachedPoolHourlySnapshot = { __typename?: 'CachedPoolHourlySnapshot'; - createdAt: Scalars['BigInt']['output']; + createdTimestamp: Scalars['BigInt']['output']; crosses: Scalars['Int']['output']; - deltaBeans: Scalars['BigInt']['output']; deltaCrosses: Scalars['Int']['output']; deltaLiquidityUSD: Scalars['BigDecimal']['output']; deltaReserves: Array; deltaVolume: Scalars['BigInt']['output']; deltaVolumeUSD: Scalars['BigDecimal']['output']; id: Scalars['ID']['output']; - lastPrice: Scalars['BigDecimal']['output']; + instDeltaB: Scalars['BigDecimal']['output']; + instPrice: Scalars['BigDecimal']['output']; + lastUpdateBlockNumber: Scalars['BigInt']['output']; + lastUpdateTimestamp: Scalars['BigInt']['output']; liquidityUSD: Scalars['BigDecimal']['output']; reserves: Array; - season: Scalars['Int']['output']; - twaDeltaBeans: Scalars['BigInt']['output']; + seasonNumber: Scalars['Int']['output']; + twaBeanLiquidityUSD: Scalars['BigDecimal']['output']; + twaDeltaB: Scalars['BigDecimal']['output']; + twaLiquidityUSD: Scalars['BigDecimal']['output']; + twaNonBeanLiquidityUSD: Scalars['BigDecimal']['output']; twaPrice: Scalars['BigDecimal']['output']; - twaToken2Price?: Maybe; - updatedAt: Scalars['BigInt']['output']; - utilization: Scalars['BigDecimal']['output']; + twaReserves: Array; + twaToken2Price: Scalars['BigDecimal']['output']; volume: Scalars['BigInt']['output']; volumeUSD: Scalars['BigDecimal']['output']; }; @@ -143,10 +253,13 @@ export type CachedSeason = { createdAt: Scalars['BigInt']['output']; deltaB: Scalars['BigInt']['output']; deltaBeans: Scalars['BigInt']['output']; + floodFieldBeans: Scalars['BigInt']['output']; + floodSiloBeans: Scalars['BigInt']['output']; id: Scalars['ID']['output']; incentiveBeans: Scalars['BigInt']['output']; marketCap: Scalars['BigDecimal']['output']; price: Scalars['BigDecimal']['output']; + raining: Scalars['Boolean']['output']; rewardBeans: Scalars['BigInt']['output']; season: Scalars['Int']['output']; sunriseBlock: Scalars['BigInt']['output']; @@ -158,11 +271,9 @@ export type CachedSiloAssetHourlySnapshot = { createdAt: Scalars['BigInt']['output']; deltaDepositedAmount: Scalars['BigInt']['output']; deltaDepositedBDV: Scalars['BigInt']['output']; - deltaFarmAmount: Scalars['BigInt']['output']; deltaWithdrawnAmount: Scalars['BigInt']['output']; depositedAmount: Scalars['BigInt']['output']; depositedBDV: Scalars['BigInt']['output']; - farmAmount: Scalars['BigInt']['output']; id: Scalars['ID']['output']; season: Scalars['Int']['output']; updatedAt: Scalars['BigInt']['output']; @@ -172,37 +283,83 @@ export type CachedSiloAssetHourlySnapshot = { export type CachedSiloHourlySnapshot = { __typename?: 'CachedSiloHourlySnapshot'; activeFarmers: Scalars['Int']['output']; + avgConvertDownPenalty: Scalars['BigDecimal']['output']; + avgGrownStalkPerBdvPerSeason: Scalars['BigInt']['output']; beanMints: Scalars['BigInt']['output']; - beanToMaxLpGpPerBdvRatio?: Maybe; + beanToMaxLpGpPerBdvRatio: Scalars['BigInt']['output']; + bonusStalkConvertUp: Scalars['BigInt']['output']; caseId?: Maybe; + convertDownPenalty?: Maybe; createdAt: Scalars['BigInt']['output']; + cropRatio: Scalars['BigDecimal']['output']; deltaActiveFarmers: Scalars['Int']['output']; + deltaAvgConvertDownPenalty: Scalars['BigDecimal']['output']; + deltaAvgGrownStalkPerBdvPerSeason: Scalars['BigInt']['output']; deltaBeanMints: Scalars['BigInt']['output']; + deltaBeanToMaxLpGpPerBdvRatio: Scalars['BigInt']['output']; + deltaBonusStalkConvertUp: Scalars['BigInt']['output']; + deltaConvertDownPenalty?: Maybe; + deltaCropRatio: Scalars['BigDecimal']['output']; deltaDepositedBDV: Scalars['BigInt']['output']; deltaGerminatingStalk: Scalars['BigInt']['output']; deltaGrownStalkPerSeason: Scalars['BigInt']['output']; + deltaPenalizedStalkConvertDown: Scalars['BigInt']['output']; deltaPlantableStalk: Scalars['BigInt']['output']; + deltaPlantedBeans: Scalars['BigInt']['output']; deltaRoots: Scalars['BigInt']['output']; deltaStalk: Scalars['BigInt']['output']; + deltaTotalBdvConvertUp: Scalars['BigInt']['output']; + deltaTotalBdvConvertUpBonus: Scalars['BigInt']['output']; + deltaUnpenalizedStalkConvertDown: Scalars['BigInt']['output']; depositedBDV: Scalars['BigInt']['output']; germinatingStalk: Scalars['BigInt']['output']; grownStalkPerSeason: Scalars['BigInt']['output']; id: Scalars['ID']['output']; + penalizedStalkConvertDown: Scalars['BigInt']['output']; plantableStalk: Scalars['BigInt']['output']; + plantedBeans: Scalars['BigInt']['output']; roots: Scalars['BigInt']['output']; season: Scalars['Int']['output']; stalk: Scalars['BigInt']['output']; + totalBdvConvertUp: Scalars['BigInt']['output']; + totalBdvConvertUpBonus: Scalars['BigInt']['output']; + unpenalizedStalkConvertDown: Scalars['BigInt']['output']; updatedAt: Scalars['BigInt']['output']; }; -export type CachedTokenYield = { - __typename?: 'CachedTokenYield'; - beanAPY: Scalars['BigDecimal']['output']; +export type CachedTokenHourlySnapshot = { + __typename?: 'CachedTokenHourlySnapshot'; + createdTimestamp: Scalars['BigInt']['output']; + decimals: Scalars['BigInt']['output']; + deltaFarmBalance: Scalars['BigInt']['output']; + deltaLastPriceUSD: Scalars['BigDecimal']['output']; + deltaPooledBalance: Scalars['BigInt']['output']; + deltaSupply: Scalars['BigInt']['output']; + deltaWalletBalance: Scalars['BigInt']['output']; + farmBalance: Scalars['BigInt']['output']; + id: Scalars['ID']['output']; + lastPriceUSD: Scalars['BigDecimal']['output']; + lastUpdateBlockNumber: Scalars['BigInt']['output']; + lastUpdateTimestamp: Scalars['BigInt']['output']; + name: Scalars['String']['output']; + pooledBalance: Scalars['BigInt']['output']; + seasonNumber: Scalars['Int']['output']; + supply: Scalars['BigInt']['output']; + walletBalance: Scalars['BigInt']['output']; +}; + +export type CachedTractorHourlySnapshot = { + __typename?: 'CachedTractorHourlySnapshot'; createdAt: Scalars['BigInt']['output']; - id: Scalars['Bytes']['output']; + deltaTotalExecutions: Scalars['Int']['output']; + deltaTotalNegBeanTips: Scalars['BigInt']['output']; + deltaTotalPosBeanTips: Scalars['BigInt']['output']; + id: Scalars['ID']['output']; season: Scalars['Int']['output']; - stalkAPY: Scalars['BigDecimal']['output']; - token: Scalars['Bytes']['output']; + totalExecutions: Scalars['Int']['output']; + totalNegBeanTips: Scalars['BigInt']['output']; + totalPosBeanTips: Scalars['BigInt']['output']; + updatedAt: Scalars['BigInt']['output']; }; export type CachedUnripeTokenHourlySnapshot = { @@ -234,6 +391,42 @@ export type CachedUnripeTokenHourlySnapshot = { updatedAt: Scalars['BigInt']['output']; }; +export type CachedWellHourlySnapshot = { + __typename?: 'CachedWellHourlySnapshot'; + convertVolumeReserves: Array; + convertVolumeReservesUSD: Array; + convertVolumeUSD: Scalars['BigDecimal']['output']; + createdTimestamp: Scalars['BigInt']['output']; + cumulativeBiTradeVolumeReserves: Array; + cumulativeTradeVolumeReserves: Array; + cumulativeTradeVolumeReservesUSD: Array; + cumulativeTradeVolumeUSD: Scalars['BigDecimal']['output']; + cumulativeTransferVolumeReserves: Array; + cumulativeTransferVolumeReservesUSD: Array; + cumulativeTransferVolumeUSD: Scalars['BigDecimal']['output']; + deltaBiTradeVolumeReserves: Array; + deltaConvertVolumeReserves: Array; + deltaConvertVolumeReservesUSD: Array; + deltaConvertVolumeUSD: Scalars['BigDecimal']['output']; + deltaLiquidityUSD: Scalars['BigDecimal']['output']; + deltaLpTokenSupply: Scalars['BigInt']['output']; + deltaTokenRates: Array; + deltaTradeVolumeReserves: Array; + deltaTradeVolumeReservesUSD: Array; + deltaTradeVolumeUSD: Scalars['BigDecimal']['output']; + deltaTransferVolumeReserves: Array; + deltaTransferVolumeReservesUSD: Array; + deltaTransferVolumeUSD: Scalars['BigDecimal']['output']; + hour: Scalars['Int']['output']; + id: Scalars['ID']['output']; + lastUpdateBlockNumber: Scalars['BigInt']['output']; + lastUpdateTimestamp: Scalars['BigInt']['output']; + lpTokenSupply: Scalars['BigInt']['output']; + season: Scalars['Int']['output']; + tokenRates: Array; + totalLiquidityUSD: Scalars['BigDecimal']['output']; +}; + export type CachedWhitelistTokenHourlySnapshot = { __typename?: 'CachedWhitelistTokenHourlySnapshot'; bdv?: Maybe; @@ -245,6 +438,7 @@ export type CachedWhitelistTokenHourlySnapshot = { deltaOptimalPercentDepositedBdv?: Maybe; deltaStalkEarnedPerSeason: Scalars['BigInt']['output']; deltaStalkIssuedPerBdv: Scalars['BigInt']['output']; + deltaStemTip: Scalars['BigInt']['output']; gaugePoints?: Maybe; id: Scalars['ID']['output']; isGaugeEnabled: Scalars['Boolean']['output']; @@ -254,21 +448,45 @@ export type CachedWhitelistTokenHourlySnapshot = { selector: Scalars['Bytes']['output']; stalkEarnedPerSeason: Scalars['BigInt']['output']; stalkIssuedPerBdv: Scalars['BigInt']['output']; + stemTip: Scalars['BigInt']['output']; + updatedAt: Scalars['BigInt']['output']; +}; + +export type CachedWrappedDepositErc20HourlySnapshot = { + __typename?: 'CachedWrappedDepositERC20HourlySnapshot'; + apy7d?: Maybe; + apy24h?: Maybe; + apy30d?: Maybe; + apy90d?: Maybe; + createdAt: Scalars['BigInt']['output']; + deltaRedeemRate: Scalars['BigInt']['output']; + deltaSupply: Scalars['BigInt']['output']; + id: Scalars['ID']['output']; + redeemRate: Scalars['BigInt']['output']; + season: Scalars['Int']['output']; + supply: Scalars['BigInt']['output']; updatedAt: Scalars['BigInt']['output']; }; export type Query = { __typename?: 'Query'; cache_beanHourlySnapshots: Array; + cache_beanstalkHourlySnapshots: Array; + cache_farmerBalanceHourlySnapshots: Array; cache_fieldHourlySnapshots: Array; + cache_gaugesInfoHourlySnapshots: Array; + cache_marketPerformanceSeasonals: Array; cache_podMarketplaceHourlySnapshots: Array; cache_poolHourlySnapshots: Array; cache_seasons: Array; cache_siloAssetHourlySnapshots: Array; cache_siloHourlySnapshots: Array; - cache_tokenYields: Array; + cache_tokenHourlySnapshots: Array; + cache_tractorHourlySnapshots: Array; cache_unripeTokenHourlySnapshots: Array; + cache_wellHourlySnapshots: Array; cache_whitelistTokenHourlySnapshots: Array; + cache_wrappedDepositERC20HourlySnapshots: Array; }; @@ -281,6 +499,24 @@ export type QueryCacheBeanHourlySnapshotsArgs = { }; +export type QueryCacheBeanstalkHourlySnapshotsArgs = { + first?: InputMaybe; + orderBy?: InputMaybe; + orderDirection?: InputMaybe; + skip?: InputMaybe; + where?: InputMaybe; +}; + + +export type QueryCacheFarmerBalanceHourlySnapshotsArgs = { + first?: InputMaybe; + orderBy?: InputMaybe; + orderDirection?: InputMaybe; + skip?: InputMaybe; + where?: InputMaybe; +}; + + export type QueryCacheFieldHourlySnapshotsArgs = { first?: InputMaybe; orderBy?: InputMaybe; @@ -290,6 +526,24 @@ export type QueryCacheFieldHourlySnapshotsArgs = { }; +export type QueryCacheGaugesInfoHourlySnapshotsArgs = { + first?: InputMaybe; + orderBy?: InputMaybe; + orderDirection?: InputMaybe; + skip?: InputMaybe; + where?: InputMaybe; +}; + + +export type QueryCacheMarketPerformanceSeasonalsArgs = { + first?: InputMaybe; + orderBy?: InputMaybe; + orderDirection?: InputMaybe; + skip?: InputMaybe; + where?: InputMaybe; +}; + + export type QueryCachePodMarketplaceHourlySnapshotsArgs = { first?: InputMaybe; orderBy?: InputMaybe; @@ -335,7 +589,16 @@ export type QueryCacheSiloHourlySnapshotsArgs = { }; -export type QueryCacheTokenYieldsArgs = { +export type QueryCacheTokenHourlySnapshotsArgs = { + first?: InputMaybe; + orderBy?: InputMaybe; + orderDirection?: InputMaybe; + skip?: InputMaybe; + where?: InputMaybe; +}; + + +export type QueryCacheTractorHourlySnapshotsArgs = { first?: InputMaybe; orderBy?: InputMaybe; orderDirection?: InputMaybe; @@ -353,6 +616,15 @@ export type QueryCacheUnripeTokenHourlySnapshotsArgs = { }; +export type QueryCacheWellHourlySnapshotsArgs = { + first?: InputMaybe; + orderBy?: InputMaybe; + orderDirection?: InputMaybe; + skip?: InputMaybe; + where?: InputMaybe; +}; + + export type QueryCacheWhitelistTokenHourlySnapshotsArgs = { first?: InputMaybe; orderBy?: InputMaybe; @@ -361,6 +633,15 @@ export type QueryCacheWhitelistTokenHourlySnapshotsArgs = { where?: InputMaybe; }; + +export type QueryCacheWrappedDepositErc20HourlySnapshotsArgs = { + first?: InputMaybe; + orderBy?: InputMaybe; + orderDirection?: InputMaybe; + skip?: InputMaybe; + where?: InputMaybe; +}; + export type BeanstalkAdvancedChartQueryVariables = Exact<{ seasonsWhere?: InputMaybe; seasonsOrderBy?: InputMaybe; @@ -374,7 +655,7 @@ export type BeanstalkAdvancedChartQueryVariables = Exact<{ }>; -export type BeanstalkAdvancedChartQuery = { __typename?: 'Query', seasons: Array<{ __typename?: 'CachedSeason', id: string, sunriseBlock: any, rewardBeans: any, price: any, deltaBeans: any, season: number, createdAt: any }>, fieldHourlySnapshots: Array<{ __typename?: 'CachedFieldHourlySnapshot', id: string, caseId?: any | null, issuedSoil: any, deltaSownBeans: any, sownBeans: any, blocksToSoldOutSoil?: any | null, podRate: any, temperature: number, deltaTemperature: number, season: number, harvestableIndex: any, harvestablePods: any, harvestedPods: any, numberOfSowers: number, numberOfSows: number, podIndex: any, realRateOfReturn: any, seasonBlock: any, soil: any, soilSoldOut: boolean, unharvestablePods: any }>, siloHourlySnapshots: Array<{ __typename?: 'CachedSiloHourlySnapshot', id: string, beanToMaxLpGpPerBdvRatio?: any | null, season: number, stalk: any, caseId?: any | null }> }; +export type BeanstalkAdvancedChartQuery = { __typename?: 'Query', seasons: Array<{ __typename?: 'CachedSeason', id: string, sunriseBlock: any, rewardBeans: any, price: any, deltaBeans: any, season: number, createdAt: any }>, fieldHourlySnapshots: Array<{ __typename?: 'CachedFieldHourlySnapshot', id: string, caseId?: any | null, issuedSoil: any, deltaSownBeans: any, sownBeans: any, blocksToSoldOutSoil?: any | null, podRate: any, temperature: any, deltaTemperature: any, season: number, harvestableIndex: any, harvestablePods: any, harvestedPods: any, numberOfSowers: number, numberOfSows: number, podIndex: any, realRateOfReturn: any, seasonBlock: any, soil: any, soilSoldOut: boolean, unharvestablePods: any }>, siloHourlySnapshots: Array<{ __typename?: 'CachedSiloHourlySnapshot', id: string, beanToMaxLpGpPerBdvRatio: any, season: number, stalk: any, caseId?: any | null }> }; export type BeanstalkSeasonsTableQueryVariables = Exact<{ seasonsWhere?: InputMaybe; @@ -389,7 +670,7 @@ export type BeanstalkSeasonsTableQueryVariables = Exact<{ }>; -export type BeanstalkSeasonsTableQuery = { __typename?: 'Query', seasons: Array<{ __typename?: 'CachedSeason', id: string, sunriseBlock: any, rewardBeans: any, price: any, deltaBeans: any, season: number }>, fieldHourlySnapshots: Array<{ __typename?: 'CachedFieldHourlySnapshot', id: string, caseId?: any | null, issuedSoil: any, deltaSownBeans: any, sownBeans: any, blocksToSoldOutSoil?: any | null, podRate: any, temperature: number, deltaTemperature: number, season: number }>, siloHourlySnapshots: Array<{ __typename?: 'CachedSiloHourlySnapshot', id: string, beanToMaxLpGpPerBdvRatio?: any | null, season: number }> }; +export type BeanstalkSeasonsTableQuery = { __typename?: 'Query', seasons: Array<{ __typename?: 'CachedSeason', id: string, sunriseBlock: any, rewardBeans: any, price: any, deltaBeans: any, season: number }>, fieldHourlySnapshots: Array<{ __typename?: 'CachedFieldHourlySnapshot', id: string, caseId?: any | null, issuedSoil: any, deltaSownBeans: any, sownBeans: any, blocksToSoldOutSoil?: any | null, podRate: any, temperature: any, deltaTemperature: any, season: number }>, siloHourlySnapshots: Array<{ __typename?: 'CachedSiloHourlySnapshot', id: string, beanToMaxLpGpPerBdvRatio: any, season: number }> }; export type FarmerSeasonalSiloQueryVariables = Exact<{ where?: InputMaybe; @@ -425,7 +706,7 @@ export type BeanstalkSeasonalFieldQueryVariables = Exact<{ }>; -export type BeanstalkSeasonalFieldQuery = { __typename?: 'Query', fieldHourlySnapshots: Array<{ __typename?: 'CachedFieldHourlySnapshot', id: string, season: number, podRate: any, temperature: number, podIndex: any, harvestableIndex: any, sownBeans: any, harvestedPods: any, issuedSoil: any, deltaSownBeans: any, createdAt: any }> }; +export type BeanstalkSeasonalFieldQuery = { __typename?: 'Query', fieldHourlySnapshots: Array<{ __typename?: 'CachedFieldHourlySnapshot', id: string, season: number, podRate: any, temperature: any, podIndex: any, harvestableIndex: any, sownBeans: any, harvestedPods: any, issuedSoil: any, deltaSownBeans: any, createdAt: any }> }; export type BeanstalkSeasonalSiloQueryVariables = Exact<{ where?: InputMaybe; From 1b3463128823926598fc9fb305b4c5566f55f570 Mon Sep 17 00:00:00 2001 From: fr1j0 Date: Mon, 4 May 2026 12:16:34 -0400 Subject: [PATCH 3/4] fix(flood): claimPlenty per dewhitelisted well in flood claim claimAllPlenty iterates only currently-whitelisted SOP wells via getWhitelistedWellLpTokens, so plenty sitting in user storage for dewhitelisted wells (PINTO_WETH, PINTO_WSOL) is silently skipped. That's why the wallet panel showed WSOL/WETH proceeds but claiming transferred nothing for those wells. Bundle an explicit claimPlenty(well, toMode) into the farm call for every dewhitelisted well the user has nonzero plenty in, alongside the existing claimAllPlenty call. Co-Authored-By: Claude Opus 4.7 (1M context) --- src/components/WalletButtonClaim.tsx | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/src/components/WalletButtonClaim.tsx b/src/components/WalletButtonClaim.tsx index 8894f9b1d..39c4eb21e 100644 --- a/src/components/WalletButtonClaim.tsx +++ b/src/components/WalletButtonClaim.tsx @@ -52,7 +52,7 @@ export default function WalletButtonClaim() { const farmerSilo = useFarmerSilo(); const siloQueryKeys = farmerSilo.queryKeys; const priceData = usePriceData(); - const { mayBeWhitelistedTokens } = useTokenData(); + const { mayBeWhitelistedTokens, whitelistedTokens } = useTokenData(); const [balanceTo, setBalanceTo] = useState(FarmToMode.INTERNAL); const queryClient = useQueryClient(); @@ -89,17 +89,32 @@ export default function WalletButtonClaim() { args: [account.address, tokensToMow], }); - const claimFlood = encodeFunctionData({ + const claimAllPlenty = encodeFunctionData({ abi: beanstalkAbi, functionName: "claimAllPlenty", args: [Number(balanceTo)], }); + // claimAllPlenty only iterates currently-whitelisted SOP wells, so plenty + // sitting in storage for dewhitelisted wells (e.g. PINTO_WETH, PINTO_WSOL) + // is skipped. Issue an explicit claimPlenty(well) for each dewhitelisted + // well the user has nonzero plenty in. + const whitelistedAddresses = new Set(whitelistedTokens.map((t) => t.address.toLowerCase())); + const dewhitelistedClaims = farmerSilo.flood.farmerSops + .filter((sop) => sop.wellsPlenty.plenty.gt(0) && !whitelistedAddresses.has(sop.well.address.toLowerCase())) + .map((sop) => + encodeFunctionData({ + abi: beanstalkAbi, + functionName: "claimPlenty", + args: [sop.well.address as `0x${string}`, Number(balanceTo)], + }), + ); + return writeWithEstimateGas({ address: diamond, abi: beanstalkAbi, functionName: "farm", - args: [[mow, claimFlood]], + args: [[mow, claimAllPlenty, ...dewhitelistedClaims]], }); } catch (e) { console.error(e); From a61082f46682c170e06463cd2131c58d8a8b87be Mon Sep 17 00:00:00 2001 From: fr1j0 Date: Mon, 4 May 2026 12:17:19 -0400 Subject: [PATCH 4/4] revert(flood): keep mow scoped to whitelistedTokens Mowing dewhitelisted tokens doesn't help recover flood plenty (the contract's _handleRainAndSops only iterates whitelisted wells), and the actual fix lives in the explicit claimPlenty calls. Restore the original whitelistedTokens scope for the mow. Co-Authored-By: Claude Opus 4.7 (1M context) --- src/components/WalletButtonClaim.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/WalletButtonClaim.tsx b/src/components/WalletButtonClaim.tsx index 39c4eb21e..d49a23d4f 100644 --- a/src/components/WalletButtonClaim.tsx +++ b/src/components/WalletButtonClaim.tsx @@ -52,7 +52,7 @@ export default function WalletButtonClaim() { const farmerSilo = useFarmerSilo(); const siloQueryKeys = farmerSilo.queryKeys; const priceData = usePriceData(); - const { mayBeWhitelistedTokens, whitelistedTokens } = useTokenData(); + const { whitelistedTokens } = useTokenData(); const [balanceTo, setBalanceTo] = useState(FarmToMode.INTERNAL); const queryClient = useQueryClient(); @@ -82,7 +82,7 @@ export default function WalletButtonClaim() { try { if (!chainId || !account.address || !balanceTo) return; - const tokensToMow = mayBeWhitelistedTokens.map((token: Token) => token.address); + const tokensToMow = whitelistedTokens.map((token: Token) => token.address); const mow = encodeFunctionData({ abi: beanstalkAbi, functionName: "mowMultiple",