Skip to content

Commit a6b600d

Browse files
committed
merged master
2 parents b876569 + b553e90 commit a6b600d

26 files changed

+1041
-1016
lines changed

.prettierignore

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
# Dependencies
2+
node_modules
3+
.yarn
4+
5+
# Build outputs
6+
.next
7+
out
8+
dist
9+
build
10+
11+
# Cache
12+
.cache
13+
.turbo
14+
15+
# Logs
16+
*.log
17+
18+
# Environment files
19+
.env
20+
.env*.local
21+
22+
# OS files
23+
.DS_Store
24+
25+
# Lock files
26+
yarn.lock
27+
package-lock.json
28+
pnpm-lock.yaml
29+
30+
# Coverage
31+
coverage
32+
.nyc_output
33+

.prettierrc

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
{
2+
"semi": true,
3+
"trailingComma": "es5",
4+
"singleQuote": true,
5+
"tabWidth": 2,
6+
"printWidth": 120,
7+
"useTabs": false,
8+
"arrowParens": "always",
9+
"endOfLine": "lf"
10+
}

components/Button.tsx

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,10 @@ const Button: React.FC<ButtonProps> = ({
3434
'w-full': width === 'full',
3535
'w-fit': width === 'fit',
3636
'bg-purple-600 text-white hover:bg-purple-700 disabled:bg-purple-300': kind === 'primary',
37-
'bg-gray-100 text-gray-800 hover:bg-gray-200 disabled:bg-gray-50 disabled:text-gray-400': kind === 'secondary',
38-
'border border-purple-600 bg-transparent text-purple-600 hover:bg-purple-50 disabled:border-purple-300 disabled:text-purple-300': kind === 'outline',
37+
'bg-gray-100 text-gray-800 hover:bg-gray-200 disabled:bg-gray-50 disabled:text-gray-400':
38+
kind === 'secondary',
39+
'border border-purple-600 bg-transparent text-purple-600 hover:bg-purple-50 disabled:border-purple-300 disabled:text-purple-300':
40+
kind === 'outline',
3941
'bg-transparent text-purple-600 hover:text-purple-700 disabled:text-gray-400 p-0': kind === 'bare',
4042
'opacity-70 cursor-not-allowed': disabled,
4143
},
@@ -52,4 +54,4 @@ const Button: React.FC<ButtonProps> = ({
5254
);
5355
};
5456

55-
export default Button;
57+
export default Button;

components/Navbar.tsx

Lines changed: 40 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -4,55 +4,52 @@ import Link from 'next/link';
44
import dynamic from 'next/dynamic';
55

66
const WalletMultiButton = dynamic(
7-
() =>
8-
import('@solana/wallet-adapter-react-ui').then(
9-
(mod) => mod.WalletMultiButton,
10-
),
11-
{ ssr: false },
12-
)
7+
() => import('@solana/wallet-adapter-react-ui').then((mod) => mod.WalletMultiButton),
8+
{ ssr: false }
9+
);
1310

1411
interface NavbarProps {
15-
onNetworkChange: (network: WalletAdapterNetwork) => void;
16-
currentNetwork: WalletAdapterNetwork;
12+
onNetworkChange: (network: WalletAdapterNetwork) => void;
13+
currentNetwork: WalletAdapterNetwork;
1714
}
1815

1916
const Navbar: React.FC<NavbarProps> = ({ onNetworkChange, currentNetwork }) => {
20-
return (
21-
<nav className="bg-white shadow-lg sticky top-0 z-10">
22-
<div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
23-
<div className="flex justify-between h-16">
24-
<div className="flex items-center">
25-
<Link href="/">
26-
<span className="text-sm xs:text-lg sm:text-xl font-bold text-gray-900 cursor-pointer">
27-
JitoSOL Reference Site
28-
</span>
29-
</Link>
30-
</div>
17+
return (
18+
<nav className="bg-white shadow-lg sticky top-0 z-10">
19+
<div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
20+
<div className="flex justify-between h-16">
21+
<div className="flex items-center">
22+
<Link href="/">
23+
<span className="text-sm xs:text-lg sm:text-xl font-bold text-gray-900 cursor-pointer">
24+
JitoSOL Reference Site
25+
</span>
26+
</Link>
27+
</div>
3128

32-
<div className="flex items-center space-x-4">
33-
<div className="relative">
34-
<select
35-
value={currentNetwork}
36-
onChange={(e) => onNetworkChange(e.target.value as WalletAdapterNetwork)}
37-
className="appearance-none bg-gray-100 border border-gray-300 rounded-md py-[13px] px-3 pr-8 text-gray-700 leading-tight focus:outline-none focus:bg-white focus:border-purple-500"
38-
>
39-
<option value={WalletAdapterNetwork.Mainnet}>Mainnet</option>
40-
{/* <option value={WalletAdapterNetwork.Devnet}>Devnet</option> */}
41-
<option value={WalletAdapterNetwork.Testnet}>Testnet</option>
42-
</select>
43-
<div className="pointer-events-none absolute inset-y-0 right-0 flex items-center px-2 text-gray-700">
44-
<svg className="fill-current h-4 w-4" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20">
45-
<path d="M9.293 12.95l.707.707L15.657 8l-1.414-1.414L10 10.828 5.757 6.586 4.343 8z" />
46-
</svg>
47-
</div>
48-
</div>
49-
50-
<WalletMultiButton className="bg-purple-600 hover:bg-purple-700 text-white font-bold py-2 px-4 rounded transition duration-150 focus:outline-none" />
51-
</div>
52-
</div>
29+
<div className="flex items-center space-x-4">
30+
<div className="relative">
31+
<select
32+
value={currentNetwork}
33+
onChange={(e) => onNetworkChange(e.target.value as WalletAdapterNetwork)}
34+
className="appearance-none bg-gray-100 border border-gray-300 rounded-md py-[13px] px-3 pr-8 text-gray-700 leading-tight focus:outline-none focus:bg-white focus:border-purple-500"
35+
>
36+
<option value={WalletAdapterNetwork.Mainnet}>Mainnet</option>
37+
{/* <option value={WalletAdapterNetwork.Devnet}>Devnet</option> */}
38+
<option value={WalletAdapterNetwork.Testnet}>Testnet</option>
39+
</select>
40+
<div className="pointer-events-none absolute inset-y-0 right-0 flex items-center px-2 text-gray-700">
41+
<svg className="fill-current h-4 w-4" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20">
42+
<path d="M9.293 12.95l.707.707L15.657 8l-1.414-1.414L10 10.828 5.757 6.586 4.343 8z" />
43+
</svg>
44+
</div>
5345
</div>
54-
</nav>
55-
);
46+
47+
<WalletMultiButton className="bg-purple-600 hover:bg-purple-700 text-white font-bold py-2 px-4 rounded transition duration-150 focus:outline-none" />
48+
</div>
49+
</div>
50+
</div>
51+
</nav>
52+
);
5653
};
5754

58-
export default Navbar;
55+
export default Navbar;

components/NetworkProvider.tsx

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,7 @@ interface NetworkProviderProps {
2323
export const NetworkProvider: React.FC<NetworkProviderProps> = ({ children }) => {
2424
const [network, setNetwork] = useState<WalletAdapterNetwork>(WalletAdapterNetwork.Mainnet);
2525

26-
return (
27-
<NetworkContext.Provider value={{ network, setNetwork }}>
28-
{children}
29-
</NetworkContext.Provider>
30-
);
26+
return <NetworkContext.Provider value={{ network, setNetwork }}>{children}</NetworkContext.Provider>;
3127
};
3228

33-
export default NetworkProvider;
29+
export default NetworkProvider;

components/StakePoolDetails.tsx

Lines changed: 67 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,19 @@ import BN from 'bn.js';
66

77
// Simple Copy Icon
88
const CopyIcon = () => (
9-
<svg xmlns="http://www.w3.org/2000/svg" className="h-4 w-4 inline ml-1 text-gray-500 hover:text-gray-700 cursor-pointer" fill="none" viewBox="0 0 24 24" stroke="currentColor" strokeWidth={2}>
10-
<path strokeLinecap="round" strokeLinejoin="round" d="M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z" />
9+
<svg
10+
xmlns="http://www.w3.org/2000/svg"
11+
className="h-4 w-4 inline ml-1 text-gray-500 hover:text-gray-700 cursor-pointer"
12+
fill="none"
13+
viewBox="0 0 24 24"
14+
stroke="currentColor"
15+
strokeWidth={2}
16+
>
17+
<path
18+
strokeLinecap="round"
19+
strokeLinejoin="round"
20+
d="M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z"
21+
/>
1122
</svg>
1223
);
1324

@@ -32,9 +43,9 @@ const formatLamports = (lamports: BN | undefined): string => {
3243

3344
// Helper to format BN tokens (assuming JitoSOL has 9 decimals like SOL)
3445
const formatPoolTokens = (tokens: BN | undefined): string => {
35-
if (tokens === undefined) return 'N/A';
36-
// JitoSOL (pool token) also has 9 decimal places
37-
return (Number(tokens.toString()) / 1_000_000_000).toLocaleString(undefined, { maximumFractionDigits: 4 });
46+
if (tokens === undefined) return 'N/A';
47+
// JitoSOL (pool token) also has 9 decimal places
48+
return (Number(tokens.toString()) / 1_000_000_000).toLocaleString(undefined, { maximumFractionDigits: 4 });
3849
};
3950

4051
// Helper to format fee percentage
@@ -45,9 +56,9 @@ const formatFee = (fee: number | null | undefined): string => {
4556

4657
// Helper to format SOL/JitoSOL conversion rate
4758
const formatConversion = (rate: number | undefined): string => {
48-
if (rate === undefined) return 'N/A';
49-
// Display how many SOL you get for 1 JitoSOL
50-
return `${rate.toFixed(6)} SOL / JitoSOL`;
59+
if (rate === undefined) return 'N/A';
60+
// Display how many SOL you get for 1 JitoSOL
61+
return `${rate.toFixed(6)} SOL / JitoSOL`;
5162
};
5263

5364
// Define type for details array items
@@ -64,12 +75,15 @@ const StakePoolDetails: React.FC<StakePoolDetailsProps> = ({ poolInfo, isLoading
6475

6576
const handleCopy = (text: string | undefined, label: string) => {
6677
if (!text) return;
67-
navigator.clipboard.writeText(text).then(() => {
68-
setCopiedAddress(label); // Set the label of the copied item
69-
setTimeout(() => setCopiedAddress(null), 1500); // Reset after 1.5 seconds
70-
}).catch(err => {
71-
console.error('Failed to copy text: ', err);
72-
});
78+
navigator.clipboard
79+
.writeText(text)
80+
.then(() => {
81+
setCopiedAddress(label); // Set the label of the copied item
82+
setTimeout(() => setCopiedAddress(null), 1500); // Reset after 1.5 seconds
83+
})
84+
.catch((err) => {
85+
console.error('Failed to copy text: ', err);
86+
});
7387
};
7488

7589
if (isLoading) {
@@ -85,15 +99,45 @@ const StakePoolDetails: React.FC<StakePoolDetailsProps> = ({ poolInfo, isLoading
8599
}
86100

87101
const allDetails: DetailItem[] = [
88-
{ label: 'Pool Address', value: formatPublicKey(poolInfo.pubkey), rawValue: poolInfo.pubkey.toBase58(), type: 'address' },
89-
{ label: 'Pool Mint', value: formatPublicKey(poolInfo.poolMint), rawValue: poolInfo.poolMint.toBase58(), type: 'address' },
102+
{
103+
label: 'Pool Address',
104+
value: formatPublicKey(poolInfo.pubkey),
105+
rawValue: poolInfo.pubkey.toBase58(),
106+
type: 'address',
107+
},
108+
{
109+
label: 'Pool Mint',
110+
value: formatPublicKey(poolInfo.poolMint),
111+
rawValue: poolInfo.poolMint.toBase58(),
112+
type: 'address',
113+
},
90114
{ label: 'Total SOL Staked', value: formatLamports(poolInfo.totalLamports), type: 'number' },
91115
{ label: 'Total JitoSOL Supply', value: formatPoolTokens(poolInfo.totalPoolTokens), type: 'number' },
92116
{ label: 'SOL per JitoSOL', value: formatConversion(poolInfo.solJitoConversion), type: 'rate' },
93-
{ label: 'Reserve Stake Account', value: formatPublicKey(poolInfo.reserveStake), rawValue: poolInfo.reserveStake.toBase58(), type: 'address' },
94-
{ label: 'Manager', value: formatPublicKey(poolInfo.manager), rawValue: poolInfo.manager.toBase58(), type: 'address' },
95-
{ label: 'Manager Fee Account', value: formatPublicKey(poolInfo.managerFeeAccount), rawValue: poolInfo.managerFeeAccount.toBase58(), type: 'address' },
96-
{ label: 'Validator List', value: formatPublicKey(poolInfo.validatorList), rawValue: poolInfo.validatorList.toBase58(), type: 'address' },
117+
{
118+
label: 'Reserve Stake Account',
119+
value: formatPublicKey(poolInfo.reserveStake),
120+
rawValue: poolInfo.reserveStake.toBase58(),
121+
type: 'address',
122+
},
123+
{
124+
label: 'Manager',
125+
value: formatPublicKey(poolInfo.manager),
126+
rawValue: poolInfo.manager.toBase58(),
127+
type: 'address',
128+
},
129+
{
130+
label: 'Manager Fee Account',
131+
value: formatPublicKey(poolInfo.managerFeeAccount),
132+
rawValue: poolInfo.managerFeeAccount.toBase58(),
133+
type: 'address',
134+
},
135+
{
136+
label: 'Validator List',
137+
value: formatPublicKey(poolInfo.validatorList),
138+
rawValue: poolInfo.validatorList.toBase58(),
139+
type: 'address',
140+
},
97141
{ label: 'SOL Deposit Fee', value: formatFee(poolInfo.solDepositFee), type: 'percentage' },
98142
{ label: 'Stake Deposit Fee', value: formatFee(poolInfo.stakeDepositFee), type: 'percentage' },
99143
{ label: 'SOL Withdrawal Fee', value: formatFee(poolInfo.solWithdrawalFee), type: 'percentage' },
@@ -133,8 +177,8 @@ const StakePoolDetails: React.FC<StakePoolDetailsProps> = ({ poolInfo, isLoading
133177
{isExpanded ? 'Show Less' : 'Show More'}
134178
</button>
135179
</div>
136-
{/* Display raw data for debugging if needed */}
137-
{/* <pre className="mt-4 text-xs overflow-auto bg-gray-50 p-2 rounded">
180+
{/* Display raw data for debugging if needed */}
181+
{/* <pre className="mt-4 text-xs overflow-auto bg-gray-50 p-2 rounded">
138182
{JSON.stringify(poolInfo, (key, value) =>
139183
typeof value === 'bigint' ? value.toString() : // Convert BigInt to string for JSON.stringify
140184
value instanceof PublicKey ? value.toBase58() : // Convert PublicKey to string
@@ -146,4 +190,4 @@ const StakePoolDetails: React.FC<StakePoolDetailsProps> = ({ poolInfo, isLoading
146190
);
147191
};
148192

149-
export default StakePoolDetails;
193+
export default StakePoolDetails;

0 commit comments

Comments
 (0)