mirror of
https://github.com/pezkuwichain/pwap.git
synced 2026-04-23 01:17:56 +00:00
749cef4f17
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
251 lines
9.3 KiB
SQL
251 lines
9.3 KiB
SQL
-- =====================================================
|
||
-- 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());
|