diff --git a/frontend/components/CreateProposalForm.tsx b/frontend/components/CreateProposalForm.tsx index d08444e8..948816fb 100644 --- a/frontend/components/CreateProposalForm.tsx +++ b/frontend/components/CreateProposalForm.tsx @@ -14,9 +14,11 @@ import toast from 'react-hot-toast'; import { motion, AnimatePresence } from 'framer-motion'; import CategoryTags from './common/CategoryTags'; import { predictProposalSuccess } from '@/utils/successPredictor'; -import { Target, AlertCircle, Sparkles, Brain, CheckCircle2 } from 'lucide-react'; +import { Target, AlertCircle, Sparkles, Brain, CheckCircle2, Wallet } from 'lucide-react'; import { useTransaction } from '@/hooks/useTransaction'; import { ContractVersionGuard } from './common/ContractVersionGuard'; +import { useTreasuryBalance } from '@/hooks/useTreasuryBalance'; +import { validateAmountAgainstTreasury } from '@/lib/validation'; const NETWORK = STACKS_MAINNET; @@ -32,6 +34,7 @@ export default function CreateProposalForm({ userAddress }: CreateProposalFormPr const [amountError, setAmountError] = useState(''); const [error, setError] = useState(''); const [success, setSuccess] = useState(''); + const { balanceInStx, loading: treasuryLoading, error: treasuryError } = useTreasuryBalance(); const { isLoading, execute } = useTransaction({ type: 'create-proposal', @@ -151,6 +154,37 @@ export default function CreateProposalForm({ userAddress }: CreateProposalFormPr + {/* Treasury Balance Display */} +
+
+ +
+
+

Treasury Available

+ {treasuryLoading ? ( +

Loading balance...

+ ) : treasuryError ? ( +

Failed to load treasury balance

+ ) : ( +

+ {balanceInStx !== null ? `${balanceInStx.toFixed(2)} STX` : '0.00 STX'} available for funding +

+ )} +
+
+
@@ -207,14 +241,8 @@ export default function CreateProposalForm({ userAddress }: CreateProposalFormPr onChange={(e) => { const val = e.target.value; setAmount(val); - const numVal = parseFloat(val); - if (val && numVal < 1) { - setAmountError('Amount must be at least 1 STX'); - } else if (val && numVal > 200) { - setAmountError('Amount cannot exceed 200 STX'); - } else { - setAmountError(''); - } + const error = validateAmountAgainstTreasury(val, balanceInStx); + setAmountError(error || ''); }} step="0.000001" min="1" @@ -280,6 +308,31 @@ export default function CreateProposalForm({ userAddress }: CreateProposalFormPr )} + {/* Treasury Warning */} + + {amount && balanceInStx !== null && parseFloat(amount) > balanceInStx && ( + +
+ +
+

+ Insufficient Treasury Funds +

+

+ Your request of {parseFloat(amount).toFixed(2)} STX exceeds the available treasury balance of {balanceInStx.toFixed(2)} STX. + This proposal cannot be executed until the treasury is replenished. +

+
+
+
+ )} +
+ {/* Submit Button */}