diff --git a/frontend/src/app/maker-dashboard/page.tsx b/frontend/src/app/maker-dashboard/page.tsx
index 7573f8c..f74ecb5 100644
--- a/frontend/src/app/maker-dashboard/page.tsx
+++ b/frontend/src/app/maker-dashboard/page.tsx
@@ -5,31 +5,17 @@ import { useAccount } from 'wagmi'
import { useSearchParams } from 'next/navigation'
import { useMakerDetails } from '@/lib/useContracts'
import CreateOrder from '@/components/CreateOrder'
-import OrdersList from '@/components/OrdersList'
export default function MakerDashboard() {
const { address, isConnected } = useAccount()
const searchParams = useSearchParams()
const { isRegistered, isForeigner, identityProof, isLoading, error } = useMakerDetails(address || '')
- const [activeTab, setActiveTab] = useState<'orders' | 'create'>('orders')
- const [refreshKey, setRefreshKey] = useState(0)
-
- // Set active tab from URL parameter (e.g., when coming from QR scanner)
- useEffect(() => {
- const tabParam = searchParams?.get('tab')
- if (tabParam === 'create' || tabParam === 'orders') {
- setActiveTab(tabParam)
- }
- }, [searchParams])
// Check if coming from QR scanner
const isFromQRScan = searchParams?.get('upiAddress') && searchParams?.get('tab') === 'create'
const handleOrderCreated = (orderId?: string) => {
- // Refresh the orders list when a new order is created
- setRefreshKey(prev => prev + 1)
-
- // Don't switch tabs - stay on create tab to show processing/completion status
+ // Order created successfully - could add notification here if needed
}
// Only check wallet connection for normal dashboard access (not from QR scan)
@@ -175,45 +161,9 @@ export default function MakerDashboard() {
)}
- {/* Tab Navigation */}
-
- {/* Start Price (INR per USDC) */}
+ {/* Start Price Percentage */}
-
- Start Price (INR per USDC)
+
+ Start Price Percentage (%)
- handleInputChange('defaultStartPrice', e.target.value)}
- className="block w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-blue-500 focus:border-blue-500 sm:text-sm placeholder-gray-700"
- />
+
+
handleInputChange('defaultStartPricePercentage', e.target.value)}
+ className="block w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-blue-500 focus:border-blue-500 sm:text-sm text-gray-900"
+ />
+
+ %
+
+
- Starting price in INR per token (Dutch auction starts high)
+ Percentage above market rate for starting price (Dutch auction starts high)
- {/* End Price (INR per USDC) */}
+ {/* End Price Percentage */}
-
- End Price (INR per USDC)
+
+ End Price Percentage (%)
- handleInputChange('defaultEndPrice', e.target.value)}
- className="block w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-blue-500 focus:border-blue-500 sm:text-sm placeholder-gray-700"
- />
+
+
handleInputChange('defaultEndPricePercentage', e.target.value)}
+ className="block w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-blue-500 focus:border-blue-500 sm:text-sm text-gray-900"
+ />
+
+ %
+
+
- Ending price in INR per token (Dutch auction ends low)
+ Percentage below market rate for ending price (Dutch auction ends lower)
- Note: Start price must be higher than end price for the Dutch auction mechanism
+ Note: Start premium must be higher than end premium for Dutch auction
{/* Price Validation */}
- {formData.defaultStartPrice && formData.defaultEndPrice &&
- parseFloat(formData.defaultStartPrice) <= parseFloat(formData.defaultEndPrice) && (
+ {formData.defaultStartPricePercentage && formData.defaultEndPricePercentage &&
+ parseFloat(formData.defaultStartPricePercentage) <= parseFloat(formData.defaultEndPricePercentage) && (
@@ -128,7 +140,7 @@ export default function SettingsPage() {
- Warning: End price should typically be lower than start price for Dutch auctions.
+ Warning: Start premium should be higher than end premium for Dutch auctions.
@@ -184,13 +196,14 @@ export default function SettingsPage() {
-
About Default Prices
+
About Premium Percentages
- These default values will be automatically filled when you create new orders
- You can always modify the prices when creating individual orders
+ These percentages will be added to the current market rate when creating orders
+ Example: If market rate is ₹85 and start premium is 5%, start price = ₹89.25
+ You can always modify the calculated prices when creating individual orders
Settings are stored locally in your browser and tied to your wallet address
- For Dutch auctions, the start price should typically be higher than the end price
+ For Dutch auctions, start premium should be higher than end premium
diff --git a/frontend/src/components/CreateOrder.tsx b/frontend/src/components/CreateOrder.tsx
index 24c6b6b..9e736e7 100644
--- a/frontend/src/components/CreateOrder.tsx
+++ b/frontend/src/components/CreateOrder.tsx
@@ -5,6 +5,7 @@ import { useAccount, useWaitForTransactionReceipt, useWatchContractEvent } from
import { useSearchParams } from 'next/navigation'
import { useCreateOrder, useERC20, useResolverFee, calculateApprovalAmount, COMMON_TOKENS, formatTokenAmount } from '@/lib/useContracts'
import { useMakerSettings } from '@/lib/useMakerSettings'
+import { useCoinPrice } from '@/lib/useCoinPrice'
import { CONTRACTS } from '@/lib/contracts'
@@ -17,6 +18,7 @@ export default function CreateOrder({ onOrderCreated }: CreateOrderProps) {
const searchParams = useSearchParams()
const { createOrder, saveOrderToDatabase, isLoading: isCreatingOrder, error: createOrderError, hash } = useCreateOrder()
const { settings: makerSettings } = useMakerSettings()
+ const { price: coinPrice, loading: priceLoading, error: priceError, lastUpdated, refresh: refreshPrice } = useCoinPrice()
// Get resolver fee from contract
const { resolverFee } = useResolverFee()
@@ -26,11 +28,29 @@ export default function CreateOrder({ onOrderCreated }: CreateOrderProps) {
hash,
})
+ // Calculate start and end prices based on coin price and settings percentages
+ const calculatedPrices = useMemo(() => {
+ if (!coinPrice || !makerSettings.defaultStartPricePercentage || !makerSettings.defaultEndPricePercentage) {
+ return { startPrice: '', endPrice: '' }
+ }
+
+ const startpercentage = parseFloat(makerSettings.defaultStartPricePercentage) / 100
+ const endpercentage = parseFloat(makerSettings.defaultEndPricePercentage) / 100
+
+ const startPremium = parseFloat(makerSettings.defaultStartPricePercentage) / 100
+ const endDiscount = parseFloat(makerSettings.defaultEndPricePercentage) / 100
+
+ const startPrice = (coinPrice * (1 + startPremium)).toFixed(2)
+ const endPrice = (coinPrice * (1 - endDiscount)).toFixed(2)
+
+ return { startPrice, endPrice }
+ }, [coinPrice, makerSettings.defaultStartPricePercentage, makerSettings.defaultEndPricePercentage])
+
// Form state - Initialize with URL parameters from scanned QR code
const [formData, setFormData] = useState({
amount: searchParams.get('amount') || '',
- startPrice: makerSettings.defaultStartPrice || '',
- endPrice: makerSettings.defaultEndPrice || '',
+ startPrice: '',
+ endPrice: '',
recipientUpiAddress: searchParams.get('upiAddress') || ''
})
@@ -176,14 +196,16 @@ export default function CreateOrder({ onOrderCreated }: CreateOrderProps) {
}
}, [searchParams])
- // Update form data with default settings when they change
+ // Update form data with calculated prices when they change
useEffect(() => {
- setFormData(prev => ({
- ...prev,
- startPrice: prev.startPrice || makerSettings.defaultStartPrice || '',
- endPrice: prev.endPrice || makerSettings.defaultEndPrice || ''
- }))
- }, [makerSettings.defaultStartPrice, makerSettings.defaultEndPrice])
+ if (calculatedPrices.startPrice && calculatedPrices.endPrice) {
+ setFormData(prev => ({
+ ...prev,
+ startPrice: calculatedPrices.startPrice,
+ endPrice: calculatedPrices.endPrice
+ }))
+ }
+ }, [calculatedPrices.startPrice, calculatedPrices.endPrice])
// Handle receipt when transaction is confirmed
useEffect(() => {
@@ -465,17 +487,44 @@ export default function CreateOrder({ onOrderCreated }: CreateOrderProps) {