Files
pwap/web/supabase/migrations/008_insert_payment_methods.sql
T
pezkuwichain da1092a06f feat: Phase 3 - P2P Fiat Trading System (Production-Ready)
Backend Infrastructure:
- Add p2p-fiat.ts (20KB) - Enterprise-grade P2P trading library
- Implement blockchain escrow integration (lock/release)
- Add encrypted payment details storage
- Integrate reputation system (trust levels, badges)
- Create 65 payment methods across 5 currencies (TRY/IQD/IRR/EUR/USD)

Database Schema (Supabase):
- p2p_fiat_offers (sell offers with escrow tracking)
- p2p_fiat_trades (active trades with deadlines)
- p2p_fiat_disputes (moderator resolution)
- p2p_reputation (user trust scores, trade stats)
- payment_methods (65 methods: banks, mobile payments, cash)
- platform_escrow_balance (hot wallet tracking)
- p2p_audit_log (full audit trail)

RPC Functions:
- increment/decrement_escrow_balance (atomic operations)
- update_p2p_reputation (auto reputation updates)
- cancel_expired_trades (timeout automation)
- get_payment_method_details (secure access control)

Frontend Components:
- P2PPlatform page (/p2p route)
- P2PDashboard (Buy/Sell/My Ads tabs)
- CreateAd (dynamic payment method fields, validation)
- AdList (reputation badges, real-time data)
- TradeModal (amount validation, deadline display)

Features:
- Multi-currency support (TRY, IQD, IRR, EUR, USD)
- Payment method presets per country
- Blockchain escrow (trustless trades)
- Reputation system (verified merchants, fast traders)
- Auto-timeout (expired trades/offers)
- Field validation (IBAN patterns, regex)
- Min/max order limits
- Payment deadline enforcement

Security:
- RLS policies (row-level security)
- Encrypted payment details
- Multisig escrow (production)
- Audit logging
- Rate limiting ready

Status: Backend complete, UI functional, VPS deployment pending
Next: Trade execution flow, dispute resolution UI, moderator dashboard
2025-11-17 06:43:35 +03:00

251 lines
9.3 KiB
SQL
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
-- =====================================================
-- PAYMENT METHODS DATA - PRODUCTION
-- =====================================================
INSERT INTO public.payment_methods (currency, country, method_name, method_type, fields, validation_rules, min_trade_amount, max_trade_amount, processing_time_minutes, display_order) VALUES
-- ========== TURKEY (TRY) ==========
('TRY', 'TR', 'Ziraat Bankası', 'bank',
'{"iban": "", "account_holder": "", "branch_code": ""}',
'{"iban": {"pattern": "^TR[0-9]{24}$", "required": true}}',
100, 100000, 30, 1),
('TRY', 'TR', 'İş Bankası', 'bank',
'{"iban": "", "account_holder": ""}',
'{"iban": {"pattern": "^TR[0-9]{24}$", "required": true}}',
100, 100000, 30, 2),
('TRY', 'TR', 'Garanti BBVA', 'bank',
'{"iban": "", "account_holder": ""}',
'{"iban": {"pattern": "^TR[0-9]{24}$", "required": true}}',
100, 100000, 30, 3),
('TRY', 'TR', 'Yapı Kredi', 'bank',
'{"iban": "", "account_holder": ""}',
'{"iban": {"pattern": "^TR[0-9]{24}$", "required": true}}',
100, 100000, 30, 4),
('TRY', 'TR', 'Akbank', 'bank',
'{"iban": "", "account_holder": ""}',
'{"iban": {"pattern": "^TR[0-9]{24}$", "required": true}}',
100, 100000, 30, 5),
('TRY', 'TR', 'Halkbank', 'bank',
'{"iban": "", "account_holder": ""}',
'{"iban": {"pattern": "^TR[0-9]{24}$", "required": true}}',
100, 100000, 30, 6),
('TRY', 'TR', 'Vakıfbank', 'bank',
'{"iban": "", "account_holder": ""}',
'{"iban": {"pattern": "^TR[0-9]{24}$", "required": true}}',
100, 100000, 30, 7),
('TRY', 'TR', 'QNB Finansbank', 'bank',
'{"iban": "", "account_holder": ""}',
'{"iban": {"pattern": "^TR[0-9]{24}$", "required": true}}',
100, 100000, 30, 8),
('TRY', 'TR', 'TEB', 'bank',
'{"iban": "", "account_holder": ""}',
'{"iban": {"pattern": "^TR[0-9]{24}$", "required": true}}',
100, 100000, 30, 9),
('TRY', 'TR', 'Denizbank', 'bank',
'{"iban": "", "account_holder": ""}',
'{"iban": {"pattern": "^TR[0-9]{24}$", "required": true}}',
100, 100000, 30, 10),
('TRY', 'TR', 'Papara', 'mobile_payment',
'{"papara_number": "", "full_name": ""}',
'{"papara_number": {"pattern": "^[0-9]{10}$", "required": true}}',
50, 50000, 5, 11),
('TRY', 'TR', 'Paybol', 'mobile_payment',
'{"phone_number": "", "full_name": ""}',
'{"phone_number": {"pattern": "^\\+90[0-9]{10}$", "required": true}}',
50, 50000, 10, 12),
('TRY', 'TR', 'FAST (Hızlı Transfer)', 'bank',
'{"iban": "", "account_holder": ""}',
'{"iban": {"pattern": "^TR[0-9]{24}$", "required": true}}',
100, 100000, 15, 13),
-- ========== IRAQ (IQD) ==========
('IQD', 'IQ', 'Rasheed Bank', 'bank',
'{"account_number": "", "account_holder": "", "branch": ""}',
'{"account_number": {"minLength": 10, "required": true}}',
50000, 50000000, 60, 1),
('IQD', 'IQ', 'Rafidain Bank', 'bank',
'{"account_number": "", "account_holder": "", "branch": ""}',
'{"account_number": {"minLength": 10, "required": true}}',
50000, 50000000, 60, 2),
('IQD', 'IQ', 'Trade Bank of Iraq (TBI)', 'bank',
'{"account_number": "", "account_holder": "", "swift_code": ""}',
'{"account_number": {"minLength": 10, "required": true}}',
50000, 50000000, 60, 3),
('IQD', 'IQ', 'Kurdistan International Bank', 'bank',
'{"account_number": "", "account_holder": "", "branch": ""}',
'{"account_number": {"minLength": 10, "required": true}}',
50000, 50000000, 60, 4),
('IQD', 'IQ', 'Cihan Bank', 'bank',
'{"account_number": "", "account_holder": ""}',
'{"account_number": {"minLength": 10, "required": true}}',
50000, 50000000, 60, 5),
('IQD', 'IQ', 'Fast Pay', 'mobile_payment',
'{"fast_pay_id": "", "phone_number": "", "full_name": ""}',
'{"fast_pay_id": {"minLength": 6, "required": true}}',
10000, 20000000, 15, 6),
('IQD', 'IQ', 'Zain Cash', 'mobile_payment',
'{"zain_number": "", "full_name": ""}',
'{"zain_number": {"pattern": "^07[0-9]{9}$", "required": true}}',
10000, 20000000, 15, 7),
('IQD', 'IQ', 'Asia Hawala', 'mobile_payment',
'{"hawala_code": "", "phone_number": "", "full_name": ""}',
'{"hawala_code": {"minLength": 8, "required": true}}',
50000, 30000000, 30, 8),
('IQD', 'IQ', 'Korek Money Transfer', 'mobile_payment',
'{"korek_number": "", "full_name": ""}',
'{"korek_number": {"pattern": "^04[0-9]{8}$", "required": true}}',
10000, 20000000, 15, 9),
('IQD', 'IQ', 'Qi Card', 'mobile_payment',
'{"qi_card_number": "", "full_name": ""}',
'{"qi_card_number": {"minLength": 16, "maxLength": 19, "required": true}}',
10000, 20000000, 15, 10),
-- ========== IRAN (IRR) ==========
('IRR', 'IR', 'Bank Mellat', 'bank',
'{"card_number": "", "account_holder": "", "sheba": ""}',
'{"card_number": {"pattern": "^[0-9]{16}$", "required": true}}',
1000000, 500000000, 60, 1),
('IRR', 'IR', 'Bank Melli Iran', 'bank',
'{"card_number": "", "account_holder": "", "sheba": ""}',
'{"card_number": {"pattern": "^[0-9]{16}$", "required": true}}',
1000000, 500000000, 60, 2),
('IRR', 'IR', 'Bank Saderat', 'bank',
'{"card_number": "", "account_holder": "", "sheba": ""}',
'{"card_number": {"pattern": "^[0-9]{16}$", "required": true}}',
1000000, 500000000, 60, 3),
('IRR', 'IR', 'Bank Tejarat', 'bank',
'{"card_number": "", "account_holder": "", "sheba": ""}',
'{"card_number": {"pattern": "^[0-9]{16}$", "required": true}}',
1000000, 500000000, 60, 4),
('IRR', 'IR', 'Pasargad Bank', 'bank',
'{"card_number": "", "account_holder": "", "sheba": ""}',
'{"card_number": {"pattern": "^[0-9]{16}$", "required": true}}',
1000000, 500000000, 60, 5),
('IRR', 'IR', 'Bank Keshavarzi', 'bank',
'{"card_number": "", "account_holder": "", "sheba": ""}',
'{"card_number": {"pattern": "^[0-9]{16}$", "required": true}}',
1000000, 500000000, 60, 6),
('IRR', 'IR', 'Shetab Card Transfer', 'mobile_payment',
'{"card_number": "", "full_name": ""}',
'{"card_number": {"pattern": "^[0-9]{16}$", "required": true}}',
500000, 300000000, 10, 7),
-- ========== EUROPE (EUR) ==========
('EUR', 'EU', 'SEPA Bank Transfer', 'bank',
'{"iban": "", "bic_swift": "", "account_holder": "", "bank_name": ""}',
'{"iban": {"pattern": "^[A-Z]{2}[0-9]{2}[A-Z0-9]+$", "required": true}}',
50, 50000, 120, 1),
('EUR', 'EU', 'Wise (TransferWise)', 'mobile_payment',
'{"wise_email": "", "full_name": ""}',
'{"wise_email": {"pattern": "^[^@]+@[^@]+\\.[^@]+$", "required": true}}',
20, 20000, 30, 2),
('EUR', 'EU', 'Revolut', 'mobile_payment',
'{"revolut_tag": "", "full_name": ""}',
'{"revolut_tag": {"pattern": "^@[a-zA-Z0-9_]+$", "required": true}}',
20, 20000, 15, 3),
('EUR', 'EU', 'N26', 'bank',
'{"iban": "", "account_holder": ""}',
'{"iban": {"pattern": "^DE[0-9]{20}$", "required": true}}',
50, 50000, 60, 4),
('EUR', 'EU', 'PayPal', 'mobile_payment',
'{"paypal_email": ""}',
'{"paypal_email": {"pattern": "^[^@]+@[^@]+\\.[^@]+$", "required": true}}',
10, 10000, 30, 5),
('EUR', 'DE', 'Deutsche Bank', 'bank',
'{"iban": "", "account_holder": ""}',
'{"iban": {"pattern": "^DE[0-9]{20}$", "required": true}}',
50, 50000, 60, 6),
('EUR', 'FR', 'BNP Paribas', 'bank',
'{"iban": "", "account_holder": ""}',
'{"iban": {"pattern": "^FR[0-9]{25}$", "required": true}}',
50, 50000, 60, 7),
('EUR', 'NL', 'ING Bank', 'bank',
'{"iban": "", "account_holder": ""}',
'{"iban": {"pattern": "^NL[0-9]{16}$", "required": true}}',
50, 50000, 60, 8),
-- ========== UNITED STATES (USD) ==========
('USD', 'US', 'Bank of America', 'bank',
'{"account_number": "", "routing_number": "", "account_holder": "", "account_type": ""}',
'{"account_number": {"minLength": 8, "required": true}, "routing_number": {"pattern": "^[0-9]{9}$", "required": true}}',
100, 50000, 180, 1),
('USD', 'US', 'Chase Bank', 'bank',
'{"account_number": "", "routing_number": "", "account_holder": ""}',
'{"account_number": {"minLength": 8, "required": true}, "routing_number": {"pattern": "^[0-9]{9}$", "required": true}}',
100, 50000, 180, 2),
('USD', 'US', 'Wells Fargo', 'bank',
'{"account_number": "", "routing_number": "", "account_holder": ""}',
'{"account_number": {"minLength": 8, "required": true}, "routing_number": {"pattern": "^[0-9]{9}$", "required": true}}',
100, 50000, 180, 3),
('USD', 'US', 'Zelle', 'mobile_payment',
'{"zelle_email_or_phone": "", "full_name": ""}',
'{"zelle_email_or_phone": {"minLength": 5, "required": true}}',
50, 20000, 15, 4),
('USD', 'US', 'Venmo', 'mobile_payment',
'{"venmo_username": "", "full_name": ""}',
'{"venmo_username": {"pattern": "^@[a-zA-Z0-9_-]+$", "required": true}}',
10, 5000, 15, 5),
('USD', 'US', 'Cash App', 'mobile_payment',
'{"cashtag": "", "full_name": ""}',
'{"cashtag": {"pattern": "^\\$[a-zA-Z0-9]+$", "required": true}}',
10, 5000, 15, 6),
('USD', 'US', 'PayPal', 'mobile_payment',
'{"paypal_email": ""}',
'{"paypal_email": {"pattern": "^[^@]+@[^@]+\\.[^@]+$", "required": true}}',
10, 10000, 30, 7),
('USD', 'US', 'Wise (USD)', 'mobile_payment',
'{"wise_email": "", "full_name": ""}',
'{"wise_email": {"pattern": "^[^@]+@[^@]+\\.[^@]+$", "required": true}}',
20, 20000, 30, 8),
('USD', 'US', 'Western Union', 'cash',
'{"mtcn": "", "receiver_name": "", "receiver_country": ""}',
'{"mtcn": {"pattern": "^[0-9]{10}$", "required": true}}',
50, 10000, 60, 9);
-- Initialize escrow balance
INSERT INTO public.platform_escrow_balance (token, total_locked, hot_wallet_address, last_audit_at) VALUES
('HEZ', 0, '5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY', NOW()),
('PEZ', 0, '5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY', NOW());