Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
127 commits
Select commit Hold shift + click to select a range
a9bc946
feat: add referral link generation feature with analytics tracking
fr1jo Oct 3, 2025
619d377
feat: add referral rewards info to Swap rewards tooltip
fr1jo Oct 3, 2025
5e4bb9b
feat: enhance referral link UX with real-time copy feedback and impro…
fr1jo Oct 3, 2025
db9241e
feat: improve referral page styling and add progress bar
fr1jo Oct 3, 2025
a7f7a37
fix: improve referral link input width and layout
fr1jo Oct 4, 2025
6926830
refactor: remove redundant section and rebrand beans to pinto
fr1jo Oct 4, 2025
a2d7562
feat: separate leaderboard and improve referral stats display
fr1jo Oct 4, 2025
94551f1
fix: update referral bonus to 10% and clarify only referrer earns
fr1jo Oct 4, 2025
a049d72
refactor: capitalize Sow, remove CTA, and improve stats layout
fr1jo Oct 4, 2025
b32e59c
feat: improve referral link UX with disabled state
fr1jo Oct 4, 2025
6dde858
feat: reorder navigation - move Referral after Pod Market
fr1jo Oct 4, 2025
ea9872e
chore: apply Biome formatting to referral components
fr1jo Oct 4, 2025
5c06e1c
feat: reorder qualification progress to appear above link input
fr1jo Oct 4, 2025
36c851f
feat: add wsteth + pintowsteth
burr-nim Nov 12, 2025
47fc67a
feat: add wsteth to silo page
burr-nim Nov 12, 2025
e415176
feat: add wsteth
burr-nim Nov 13, 2025
d8c37de
Merge branch 'main' into burr/wsteth-migration
burr-nim Nov 18, 2025
2c02676
feat: fix dev page keys + update pintowsteth address
burr-nim Nov 18, 2025
880ec07
feat: update to use multicall instead of advpipe on silo convert cache
burr-nim Nov 18, 2025
9f01c00
feat: add invalid well swap strategizer
burr-nim Nov 18, 2025
aeabe09
feat: update silo convert
burr-nim Nov 18, 2025
b9d3d0a
bug: fix swaps div by zero bug
burr-nim Nov 19, 2025
d3d4606
feat: remove unnecessary comment
burr-nim Nov 19, 2025
a326ccf
Change referral layout
feyyazcigim Nov 22, 2025
0557718
feat: add new token icons
burr-nim Nov 24, 2025
df925cd
feat: update silo convert quoteing
burr-nim Nov 24, 2025
649332e
Wsteth market performance wip
PintoPirate Nov 26, 2025
893d8a2
Merge branch 'burr/wsteth-migration' into pp/market-chart-wsteth
PintoPirate Nov 26, 2025
b79231d
Arranges newly appearing datapoints
PintoPirate Nov 27, 2025
a03c221
Fix incorrect selected value display
PintoPirate Nov 28, 2025
97423bb
Proper undefined check
PintoPirate Nov 28, 2025
9156f56
Wsteth added to big chart
PintoPirate Nov 28, 2025
75e61ae
Correct sync offset
PintoPirate Nov 28, 2025
91c107d
minimal allowed starting cumulative season to wsteth deployment
PintoPirate Nov 29, 2025
d243a5c
Apply appropriate offset to cumulative market data
PintoPirate Nov 29, 2025
25eb501
Implement referral system to UI
feyyazcigim Dec 1, 2025
cc41350
Remove unnecessary offset
PintoPirate Dec 2, 2025
4dfb481
Add missing wsteth mapping
PintoPirate Dec 2, 2025
6977f62
remove test wsteth data
PintoPirate Dec 2, 2025
5aa7e08
Remove console log
PintoPirate Dec 3, 2025
6e9e542
Refactor nonnull assertion
PintoPirate Dec 3, 2025
bc4832e
Merge pull request #316 from pinto-org/pp/market-chart-wsteth
PintoPirate Dec 6, 2025
f4ae165
Implement new tractor order form
feyyazcigim Dec 7, 2025
6dfb3f1
Update ModifySowOrderDialog based on new implementation
feyyazcigim Dec 7, 2025
b6863aa
Fix slider bugs, change validation
feyyazcigim Dec 8, 2025
869dc67
Update tractor order form tooltips and labels
claude[bot] Dec 8, 2025
52a5818
refactor: Extract shared Tractor order form logic into reusable hooks
fr1jo Dec 8, 2025
1dc2b63
refactor: Consolidate shared Tractor order form logic and improve cod…
fr1jo Dec 8, 2025
a6c470a
refactor: Consolidate Sow order estimated tip paid calculation logic
fr1jo Dec 8, 2025
ec1261a
refactor: Move cultivation factor logic and math utilities to shared …
fr1jo Dec 8, 2025
a6fd379
refactor: Consolidate Sow order form logic with shared hooks and impr…
fr1jo Dec 8, 2025
e8b7656
refactor: Update SowOrderV0Fields to use shared estimation and calcul…
fr1jo Dec 8, 2025
b39023e
fix: extract select function to stable reference in useCultivationFactor
github-actions[bot] Dec 8, 2025
5a0ae3c
Merge pull request #339 from pinto-org/frijo/tractor-order-refactor
fr1jo Dec 8, 2025
44dfc8d
Revert error handling for advanced form
feyyazcigim Dec 8, 2025
5d99600
Merge branch 'tractor-order-refactor' of https://github.com/pinto-org…
feyyazcigim Dec 8, 2025
317f5cb
Add morning auction row to summary
feyyazcigim Dec 8, 2025
00d89a6
Merge branch 'main' into frijo/feat/sowreferral
feyyazcigim Dec 10, 2025
ed169c4
Change gql implementations
feyyazcigim Dec 10, 2025
0d1aa5c
Refactor delegate address modal
feyyazcigim Dec 10, 2025
aaaf507
Refactor referral table
feyyazcigim Dec 10, 2025
87dbbc2
Fix auto fill on temperature input
feyyazcigim Dec 10, 2025
5db2afe
Fix type and change tooltips
feyyazcigim Dec 10, 2025
28ed77d
Update Morning tooltip text with detailed explanation
github-actions[bot] Dec 11, 2025
421072b
chore: auto-format and lint code
github-actions[bot] Dec 11, 2025
7b00dfc
Update tractor order form tooltips
github-actions[bot] Dec 11, 2025
d32601e
chore: auto-format and lint code
github-actions[bot] Dec 11, 2025
15eab67
Improve error handling
feyyazcigim Dec 11, 2025
c9e4274
Fix visual bug on total amount slider
feyyazcigim Dec 11, 2025
9fbebc2
Add disabled state
feyyazcigim Dec 12, 2025
d9f56f5
Refactor graphql queries
feyyazcigim Dec 15, 2025
0680afc
Add eligibility check
feyyazcigim Dec 15, 2025
5306dda
Clear unnecessary comments
feyyazcigim Dec 15, 2025
aec3acb
Improve transaction handling
feyyazcigim Dec 18, 2025
99944d9
Use standardized UI components and make implementation modular
feyyazcigim Dec 18, 2025
69cb97e
Merge branch 'main' into frijo/feat/sowreferral
burr-nim Dec 22, 2025
e4f9456
Make visual updates to referral page components
feyyazcigim Dec 29, 2025
2ccbe4b
fix visual bugs for responsive view
feyyazcigim Jan 7, 2026
d20eeb1
Merge branch 'main' into tractor-order-refactor
feyyazcigim Jan 7, 2026
bc2adbd
Merge branch 'main' into tractor-order-refactor
feyyazcigim Jan 9, 2026
4cfc47d
fix visual bugs on input buttons
feyyazcigim Jan 9, 2026
2e71217
Add referral components to tractor order component
feyyazcigim Jan 9, 2026
841fd82
fix: migrate referral eligibility to on-chain contract calls
fr1jo Jan 9, 2026
44c9ba5
feat: implement pod referral link delegation modal and RPC integration
fr1jo Jan 9, 2026
116e34d
feat: implement referral link generation with on-chain delegation and…
fr1jo Jan 10, 2026
5b82d3b
Merge pull request #374 from pinto-org/feat/frijo/podReferralRPC
feyyazcigim Jan 11, 2026
c8648e4
feat: add referral code support and improve UI
feyyazcigim Jan 11, 2026
fcbece6
merge tractor-order-refactor and referral
feyyazcigim Jan 11, 2026
2632e03
refactor: improve referral code validation and consolidate component …
feyyazcigim Jan 13, 2026
cf17f4e
fix: clear localStorage for invalid referral codes to prevent showing…
feyyazcigim Jan 13, 2026
30dcde1
resolve merge conflicts
feyyazcigim Jan 13, 2026
458bf60
fix referral code URL encoding and add support to all sow order types
feyyazcigim Jan 13, 2026
56006dd
Merge pull request #377 from pinto-org/hotfix/frijo/convert
fr1jo Jan 12, 2026
1d5bed9
Add wstETH to DevPage token management and improve formatting
fr1jo Jan 13, 2026
f731069
Update wstETH token configuration in DevPage
fr1jo Jan 13, 2026
3753249
Merge pull request #382 from pinto-org/main
fr1jo Jan 14, 2026
5a26ac9
change wsteth pint lp address
feyyazcigim Jan 14, 2026
6cabedf
Revert token address
feyyazcigim Jan 14, 2026
782db93
Merge branch 'development' into referral-merge
feyyazcigim Jan 14, 2026
ce50204
Merge pull request #379 from pinto-org/fix/wsteth-migration-update
feyyazcigim Jan 14, 2026
83cecd1
Merge branch 'development' into burr/wsteth-migration
feyyazcigim Jan 14, 2026
8d8d55e
Merge pull request #378 from pinto-org/referral-merge
feyyazcigim Jan 14, 2026
f4e0364
Merge pull request #309 from pinto-org/burr/wsteth-migration
feyyazcigim Jan 14, 2026
05057e5
Convert referral link generator to standalone page with proper routing
fr1jo Jan 15, 2026
48c0cfd
Merge pull request #388 from pinto-org/frijo/referral-link-standalone…
feyyazcigim Jan 15, 2026
f94e2e8
refactor: enhance referral experience with updated text and links
feyyazcigim Jan 15, 2026
eac755b
Update sow blueprint referral contract address
fr1jo Jan 15, 2026
0b898b3
Merge pull request #390 from pinto-org/hotfix/update-sow-blueprint-re…
feyyazcigim Jan 15, 2026
3c34d91
Update SOW Blueprint referral address in constants
fr1jo Jan 15, 2026
60e1b27
Merge pull request #391 from pinto-org/hotfix/update-sow-blueprint-re…
fr1jo Jan 15, 2026
a36784d
refactor(referral): streamline leaderboard data and refine UX
feyyazcigim Jan 15, 2026
ec14adb
Optimize deposit sorting and combining for blueprint publishing
fr1jo Jan 15, 2026
173f282
Optimize deposit sorting with stable sort and early termination
fr1jo Jan 15, 2026
65d680d
Optimize deposit sorting with stable sort and early termination
fr1jo Jan 15, 2026
a32eb06
Merge pull request #392 from pinto-org/frijo/optimize-deposit-sorting
feyyazcigim Jan 15, 2026
13603d3
refactor(ui): standardize temperature slider bounds and update styling
feyyazcigim Jan 15, 2026
39e9595
Merge pull request #389 from pinto-org/refactor/referral-qc-updates
feyyazcigim Jan 15, 2026
114b623
feature: add address name generator for referral leaderboard
feyyazcigim Jan 15, 2026
600b030
Refactor deposit sorting optimization and add SOW referral blueprint …
fr1jo Jan 16, 2026
f16d571
omit 0 sow events (i.e from bonus referrals)
fr1jo Jan 16, 2026
8e52014
Merge pull request #395 from pinto-org/feat/fieldActivity
fr1jo Jan 16, 2026
cb1fbff
fix: reduce referral bonus pods from 10% to 5%
fr1jo Jan 16, 2026
f671fb0
Merge pull request #396 from pinto-org/feat/fieldActivity
fr1jo Jan 16, 2026
79fdb6d
chore(plow): clean up unused map in order filtering
feyyazcigim Jan 16, 2026
3e97d7c
Merge pull request #394 from pinto-org/frijo/optimize-deposit-sorting
feyyazcigim Jan 16, 2026
70bed83
Merge pull request #393 from pinto-org/feature/leaderboard-address-ob…
feyyazcigim Jan 16, 2026
b9a7463
Merge branch 'main' into development
feyyazcigim Jan 16, 2026
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
9 changes: 9 additions & 0 deletions src/ProtectedLayout.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import Explorer from "./pages/Explorer";
import Field from "./pages/Field";
import { Market as MarketPage } from "./pages/Market";
import Overview from "./pages/Overview";
import Referral from "./pages/Referral";
import Silo from "./pages/Silo";
import SiloToken from "./pages/SiloToken";
import Swap from "./pages/Swap";
Expand Down Expand Up @@ -60,6 +61,14 @@ export default function ProtectedLayout() {
</PageMetaWrapper>
}
/>
<Route
path="/referral"
element={
<PageMetaWrapper metaKey="referral">
<Referral />
</PageMetaWrapper>
}
/>
<Route
path="/market/pods"
element={
Expand Down
Binary file added src/assets/misc/telegram-logo.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added src/assets/misc/x-logo.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added src/assets/tokens/PINTO_wstETH.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added src/assets/tokens/wstETH.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
234 changes: 227 additions & 7 deletions src/components/DevPage.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import useTransaction from "@/hooks/useTransaction";
import { generateBatchSortDepositsCallData, simulateAndPrepareFarmCalls } from "@/lib/claim/depositUtils";
import { morningFieldDevModeAtom } from "@/state/protocol/field/field.atoms";
import { getIsMorning, getSecondsElapsedInMorning } from "@/state/protocol/sun";
import { morningAtom, seasonAtom, sunQueryKeysAtom } from "@/state/protocol/sun/sun.atoms";
import { morningAtom, seasonAtom } from "@/state/protocol/sun/sun.atoms";
import { useFarmerSilo } from "@/state/useFarmerSilo";
import { useFieldQueryKeys, useInvalidateField } from "@/state/useFieldData";
import { usePriceData } from "@/state/usePriceData";
Expand All @@ -34,7 +34,6 @@ import {
createPublicClient,
decodeEventLog,
decodeFunctionData,
decodeFunctionResult,
encodeFunctionData,
erc20Abi,
isAddress,
Expand Down Expand Up @@ -168,6 +167,7 @@ export default function DevPage() {
const [selectedPercent, setSelectedPercent] = useState<number>(10);

const [blockSkipAmount, setBlockSkipAmount] = useState("6"); // default to 6 blocks because the morning auction updates every 6 blocks (12 seconds on eth, 2 seconds on base, 12/2 = 6)
const [sunriseCount, setSunriseCount] = useState("1"); // number of times to call sunrise

const [mockAddress, setMockAddress] = useAtom(mockAddressAtom);

Expand Down Expand Up @@ -341,7 +341,7 @@ export default function DevPage() {

const calculatePercentAmounts = (percent: number) => {
console.log("priceData", priceData.pools);
const tokenOrder = ["WETH", "cbETH", "cbBTC", "USDC", "WSOL"];
const tokenOrder = ["WETH", "cbETH", "cbBTC", "USDC", "WSOL", "wstETH"];
const amounts = tokenOrder.map((symbol) => {
const pool = priceData.pools.find((p) => p.tokens.some((token) => token.symbol === symbol));

Expand Down Expand Up @@ -383,6 +383,25 @@ export default function DevPage() {
}
};

const callSunriseN = async () => {
try {
const count = parseInt(sunriseCount);
if (Number.isNaN(count) || count < 1) {
toast.error("Please enter a valid number of seasons");
return;
}

setLoading("callSunriseN");
await executeTask("callSunriseN", { n: count });
toast.success(`Called sunrise ${count} time${count > 1 ? "s" : ""}`);
setLoading(null);
} catch (error) {
console.error("Failed to call sunrise N times:", error);
toast.error("Failed to call sunrise multiple times");
setLoading(null);
}
};

const handleQuickMint = async () => {
if (!address) {
toast.error("No wallet connected");
Expand Down Expand Up @@ -585,6 +604,18 @@ export default function DevPage() {
Mint Me ETH/USDC/Pinto
</Button>
</div>
<div className="flex gap-2 items-center">
<Input
placeholder="# Seasons to advance"
outlined
value={sunriseCount}
onChange={(e) => setSunriseCount(e.target.value)}
className="h-10 w-48"
/>
<Button disabled={!sunriseCount || loading === "callSunriseN"} onClick={callSunriseN}>
Call Sunrise N Times
</Button>
</div>
<div className="flex gap-2 items-center">
<Input
placeholder="# Blocks to skip"
Expand Down Expand Up @@ -743,7 +774,7 @@ export default function DevPage() {
<div className="flex flex-col gap-4">
<div className="text-sm text-gray-500">
Deposits non-PINTO tokens into wells and then into beanstalk. Enter amounts in order:
WETH,cbETH,cbBTC,USDC,WSOL
WETH,cbETH,cbBTC,USDC,WSOL,wstETH
</div>
<div className="flex flex-col gap-2">
<Input
Expand Down Expand Up @@ -794,6 +825,7 @@ export default function DevPage() {
<h2 className="text-2xl mb-4">Token Balance Management</h2>
<div className="text-sm text-gray-500 mb-4">
Available tokens: PINTO, WETH, USDC, cbBTC, cbETH, wstETH. You can use either token symbols or addresses.
Decimal precision is dependent on the token. (i.e "1" is 1 token)
</div>
<div className="flex flex-col gap-2">
<Input
Expand Down Expand Up @@ -1064,6 +1096,9 @@ export default function DevPage() {

{/* Farmer Silo Deposits section - render component directly */}
<FarmerSiloDeposits />

{/* SiloToken Gauge Data section */}
<SiloTokenGaugeData />
</div>
</div>
);
Expand Down Expand Up @@ -1180,8 +1215,8 @@ const ViewFunctionCaller = () => {
className="h-10 px-3 py-2 text-sm border rounded-md bg-white"
>
<option value="">-- Select a function --</option>
{viewFunctions.map((fn) => (
<option key={fn.name} value={fn.name}>
{viewFunctions.map((fn, i) => (
<option key={`${fn.name}-view-funciton-caller-${i.toString()}`} value={fn.name}>
{fn.name}
{fn.inputs && fn.inputs.length > 0 && ` (${fn.inputs.length} params)`}
</option>
Expand All @@ -1204,7 +1239,10 @@ const ViewFunctionCaller = () => {
<div className="text-sm font-medium">Function Parameters:</div>
<div className="flex flex-col gap-3 p-4 border rounded-lg bg-gray-50">
{selectedFunctionObj.inputs.map((input, idx) => (
<div key={idx} className="flex items-center gap-2">
<div
key={`${idx.toString()}-view-function-caller-input-${input.name ?? ""}`}
className="flex items-center gap-2"
>
<Label className="text-xs text-gray-600 whitespace-nowrap min-w-[120px]">
{input.name || `param${idx}`} ({input.type}):
</Label>
Expand Down Expand Up @@ -2243,3 +2281,185 @@ function FarmerSiloDeposits() {
</Card>
);
}

// SiloToken Gauge Data Component
function SiloTokenGaugeData() {
const publicClient = usePublicClient();
const protocolAddress = useProtocolAddress();
const tokenData = useTokenData();
const [loading, setLoading] = useState(false);
const [tokenSettings, setTokenSettings] = useState<Map<string, any>>(new Map());

const siloTokens = useMemo(() => {
if (!tokenData) return [];
return tokenData.whitelistedTokens;
}, [tokenData]);

const fetchTokenSettings = async () => {
if (!publicClient || !protocolAddress || siloTokens.length === 0) return;

setLoading(true);
try {
const settingsMap = new Map();

for (const token of siloTokens) {
try {
const settings = await publicClient.readContract({
address: protocolAddress,
abi: diamondABI,
functionName: "tokenSettings",
args: [token.address],
});
settingsMap.set(token.address, settings);
} catch (error) {
console.error(`Failed to fetch settings for ${token.symbol}:`, error);
}
}

setTokenSettings(settingsMap);
} catch (error) {
console.error("Error fetching token settings:", error);
toast.error("Failed to fetch token settings");
} finally {
setLoading(false);
}
};

useEffect(() => {
fetchTokenSettings();
}, [publicClient, protocolAddress, siloTokens.length]);

const formatBigInt = (value: any, decimals = 0) => {
if (!value) return "0";
try {
const num = BigInt(value);
if (decimals > 0) {
const divisor = BigInt(10 ** decimals);
const wholePart = num / divisor;
const fractionalPart = num % divisor;
return `${wholePart}.${fractionalPart.toString().padStart(decimals, "0")}`;
}
return num.toString();
} catch {
return String(value);
}
};

const formatBytes = (value: any) => {
if (!value) return "0x0";
return String(value);
};

return (
<Card className="p-6">
<h2 className="text-2xl mb-4">SiloToken Gauge Data</h2>

<div className="flex justify-between items-center mb-6">
<div className="text-sm text-gray-500">
Displaying token settings for {siloTokens.length} silo token{siloTokens.length !== 1 ? "s" : ""}
</div>
<Button onClick={fetchTokenSettings} disabled={loading} className="px-4 py-2">
{loading ? "Loading..." : "Refresh Token Settings"}
</Button>
</div>

{loading && tokenSettings.size === 0 ? (
<div className="text-center py-8 text-gray-500">
<div className="flex items-center justify-center gap-2">
<div className="animate-spin h-5 w-5 border-2 border-pinto-green-3 border-t-transparent rounded-full" />
<span>Loading token settings...</span>
</div>
</div>
) : tokenSettings.size === 0 ? (
<div className="text-center py-8 text-gray-500">No token settings available</div>
) : (
<div className="space-y-6">
{siloTokens.map((token) => {
const settings = tokenSettings.get(token.address);
if (!settings) return null;

return (
<div key={token.address} className="border rounded-lg p-4">
<div className="flex items-center gap-2 mb-4">
<img src={token.logoURI} alt={token.symbol} className="w-8 h-8 rounded-full" />
<div>
<div className="font-medium text-lg">{token.symbol}</div>
<div className="text-xs text-gray-500 font-mono">{token.address}</div>
</div>
</div>

<div className="grid grid-cols-2 gap-4">
<div className="space-y-2">
<div className="flex justify-between text-sm">
<span className="text-gray-600">Selector:</span>
<span className="font-mono text-xs">{formatBytes(settings.selector)}</span>
</div>
<div className="flex justify-between text-sm">
<span className="text-gray-600">Stalk Earned Per Season:</span>
<span className="font-mono">{formatBigInt(settings.stalkEarnedPerSeason, 6)}</span>
</div>
<div className="flex justify-between text-sm">
<span className="text-gray-600">Stalk Issued Per BDV:</span>
<span className="font-mono">{formatBigInt(settings.stalkIssuedPerBdv, 16)}</span>
</div>
<div className="flex justify-between text-sm">
<span className="text-gray-600">Milestone Season:</span>
<span className="font-mono">{formatBigInt(settings.milestoneSeason)}</span>
</div>
<div className="flex justify-between text-sm">
<span className="text-gray-600">Milestone Stem:</span>
<span className="font-mono">{formatBigInt(settings.milestoneStem)}</span>
</div>
</div>

<div className="space-y-2">
<div className="flex justify-between text-sm">
<span className="text-gray-600">Encode Type:</span>
<span className="font-mono text-xs">{formatBytes(settings.encodeType)}</span>
</div>
<div className="flex justify-between text-sm">
<span className="text-gray-600">Delta Stalk Earned Per Season:</span>
<span className="font-mono">{formatBigInt(settings.deltaStalkEarnedPerSeason, 6)}</span>
</div>
<div className="flex justify-between text-sm">
<span className="text-gray-600">Gauge Points:</span>
<span className="font-mono">{formatBigInt(settings.gaugePoints, 18)}</span>
</div>
<div className="flex justify-between text-sm">
<span className="text-gray-600">Optimal % Deposited BDV:</span>
<span className="font-mono">{formatBigInt(settings.optimalPercentDepositedBdv, 6)}%</span>
</div>
</div>
</div>

<div className="mt-4 pt-4 border-t">
<div className="text-sm font-medium mb-2">Implementations:</div>
<div className="grid grid-cols-2 gap-4 text-xs">
<div className="bg-gray-50 p-2 rounded">
<div className="font-medium text-gray-700 mb-1">Gauge Point Implementation</div>
<div className="space-y-1 font-mono">
<div className="truncate">Target: {settings.gaugePointImplementation?.target || "N/A"}</div>
<div>Selector: {formatBytes(settings.gaugePointImplementation?.selector)}</div>
<div>Encode: {formatBytes(settings.gaugePointImplementation?.encodeType)}</div>
</div>
</div>
<div className="bg-gray-50 p-2 rounded">
<div className="font-medium text-gray-700 mb-1">Liquidity Weight Implementation</div>
<div className="space-y-1 font-mono">
<div className="truncate">
Target: {settings.liquidityWeightImplementation?.target || "N/A"}
</div>
<div>Selector: {formatBytes(settings.liquidityWeightImplementation?.selector)}</div>
<div>Encode: {formatBytes(settings.liquidityWeightImplementation?.encodeType)}</div>
</div>
</div>
</div>
</div>
</div>
);
})}
</div>
)}
</Card>
);
}
43 changes: 43 additions & 0 deletions src/components/HowToCard.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
import { Link } from "react-router-dom";
import { StepItem } from "./ui/StepItem";

const steps = [
{
title: "Qualify as a Referrer",
description: (
<>
Sow at least 1,000 Pinto in the Field to unlock your referral link.{" "}
<Link to="/field" className="text-pinto-green underline hover:text-pinto-green-3 transition-colors">
Sow now
</Link>
</>
),
},
{
title: "Share Your Link",
description: "Copy your unique referral link and share it with friends, on social media, or anywhere else.",
},
{
title: "Earn Rewards",
description:
"When someone uses your link and Sows Pinto, you earn 10% of the Pods they receive as a referral bonus.",
},
{
title: "Get Credited",
description:
"Referral rewards are automatically credited to your wallet address when your referral completes their Sow transaction.",
},
];

export function HowToCard() {
return (
<div className="space-y-4">
<div className="pinto-h3 sm:pinto-h2">How It Works</div>
<div className="space-y-3">
{steps.map((step, index) => (
<StepItem key={index} stepNumber={index + 1} title={step.title} description={step.description} />
))}
</div>
</div>
);
}
Loading