-
Notifications
You must be signed in to change notification settings - Fork 14
fix(withdraw): UK GBP + GB-IBAN-EUR + intra-SEPA bank withdrawals (PR B — frontend) #2263
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
Merged
Changes from all commits
Commits
Show all changes
61 commits
Select commit
Hold shift + click to select a range
d1735ff
chore(content): bump src/content — remove Red ATM from marketing
0xkkonrad db86328
fix(p2p): correct two request-pot display bugs (slider 49.98%, $1k+ p…
Hugo0 9a45cff
feat(card): "Split this bill" CTA on card-spend receipts (TASK-19739)
Hugo0 a3280d1
fix(split-bill): URL-encode merchant name in the split CTA query (Cod…
Hugo0 2a64883
Merge pull request #2235 from peanutprotocol/fix/p2p-display-amounts
Hugo0 82563a7
fix(pix): canonicalize +55 phone keys that already carry a + prefix
Hugo0 75f6aa4
Merge pull request #2240 from peanutprotocol/fix/pix-phone-canonicali…
Hugo0 c4b28fa
test(split-bill): extract + unit-test the "Split this bill" CTA URL b…
Hugo0 55010cc
content: advance src/content to latest main (358b6a6)
Hugo0 568f626
test(split-bill): URL-encode the amount param too (CodeRabbit)
Hugo0 4b50a10
Merge pull request #2241 from peanutprotocol/test/split-bill-cta-e2e
Hugo0 2ed85a9
content: drop avalanche deposit/withdraw to match content removal
Hugo0 9fc9cb3
refactor(seo): single source of truth for deposit rails
Hugo0 9cf06f8
docs(seo): correct fallback description in exchanges header comment
Hugo0 cdab7e5
Merge pull request #2232 from peanutprotocol/chore/content-remove-red…
Hugo0 032683b
feat(seo): register Faster Payments + SPEI as deposit rails
Hugo0 4705743
Merge remote-tracking branch 'origin/main' into chore/backmerge-main-dev
Hugo0 676a41d
content(llms): expand + correct llms.txt and llms-full.txt
Hugo0 e4e1b26
content(llms): fix stale card eligibility — denylist, not 29-country …
Hugo0 1a9ed38
Merge pull request #2244 from peanutprotocol/fix/deposit-rails-fp-spei
Hugo0 731d9c5
fix(deposit): stop offering Scroll deposits (silently lost) + drop st…
Hugo0 08ca06d
Merge pull request #2248 from peanutprotocol/fix/deposit-flow-scroll-…
Hugo0 7a57b70
fix(claim): restore dynamic social-preview metadata for claim links
Hugo0 2d700a7
fix(claim): address review — non-barrel import, clear ENS timeout, sp…
Hugo0 9ddd515
Merge pull request #2249 from peanutprotocol/fix/claim-og-metadata
Hugo0 08ec5af
refactor(og): single buildOgImageUrl() helper for /api/og links
Hugo0 4292749
Merge pull request #2251 from peanutprotocol/fix/og-url-builder
Hugo0 4abd233
content: bump src/content to latest peanut-content main (f066775)
Hugo0 6bac289
ci(content): base auto-bump on dev + content-only auto-merge
Hugo0 bd2f6c7
Merge pull request #2252 from peanutprotocol/chore/content-bump-autom…
Hugo0 def5c62
fix(home): show "You're unlocked" modal once, off a milestone
Hugo0 6842d34
fix(add-money): back button no longer dies on the amount screen
Hugo0 706232a
feat(kyc): skippable advisory pre-empt at add/withdraw for future-dat…
Hugo0 fb4a20e
Merge pull request #2254 from peanutprotocol/fix/addmoney-back-nuqs-r…
Hugo0 bb764f3
Merge pull request #2256 from peanutprotocol/main
Hugo0 59c7ee3
test(add-money): cover the reported Manteca back-button path in e2e
Hugo0 063ece7
fix(kyc): advisory pre-empt — dispatch via start-action, safe dismiss…
Hugo0 d9ca6dd
Merge remote-tracking branch 'origin/dev' into feat/bridge-advisory-p…
Hugo0 7acbaea
Merge pull request #2257 from peanutprotocol/test/addmoney-manteca-ba…
Hugo0 1569160
Merge pull request #2253 from peanutprotocol/fix/unlock-modal-milestone
Hugo0 28a211d
Merge remote-tracking branch 'origin/dev' into feat/bridge-advisory-p…
Hugo0 f85760d
fix(split-bill): hide "Split this bill" only on charges that didn't s…
Hugo0 21098a2
Merge pull request #2258 from peanutprotocol/fix/split-bill-settled-gate
Hugo0 938e717
feat(card): show registered cardholder name on reveal
abalinda 23abae6
fix(kyc): correct DUPLICATE_EMAIL copy — sign in / contact support
jjramirezn 784912b
fix(sentry): don't report qr-payment/init 422 as a client error
Hugo0 802d1b5
Merge pull request #2264 from peanutprotocol/fix/sentry-skip-qr-init-422
Hugo0 c19f628
fix(kyc): route advisory Complete now through self-heal relay
jjramirezn 832ec52
fix(kyc): guard against double-submit in advisory completeNow (CodeRa…
jjramirezn b817da4
Merge pull request #2265 from peanutprotocol/fix/kyc-duplicate-email-…
jjramirezn 2b014c1
Merge pull request #2255 from peanutprotocol/feat/bridge-advisory-pre…
jjramirezn b25f3c8
fix(card): drop "Expiry"/"CVV" labels so PAN + name clear the artwork
abalinda 53aeeb6
test(card): assert registered name stays inside ph-no-capture wrapper
abalinda d3eb9a3
Merge pull request #2260 from peanutprotocol/card-registered-name
jjramirezn a94ea7e
Merge remote-tracking branch 'origin/main' into chore/backmerge-main-…
Hugo0 68c1412
Merge pull request #2273 from peanutprotocol/chore/backmerge-main-int…
Hugo0 bc3d2bb
fix(offramp): derive destination from account type, not country
Hugo0 7fdb792
fix(withdraw): stop false-rejecting IBANs whose country != the dropdown
Hugo0 116627a
fix(withdraw): source the Bridge countryCode from the IBAN, not the d…
Hugo0 c38e2b8
fix(offramp): preserve account type through bank details + normalize …
Hugo0 48e749d
fix(withdraw): derive offramp config from account + guard fresh account
Hugo0 File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1 +1 @@ | ||
| 745 | ||
| 740 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,77 +1,78 @@ | ||
| # Peanut — Full Product Description | ||
|
|
||
| > Instant global peer-to-peer payments in digital dollars. | ||
| > Spend, send, and cash out digital dollars anywhere — pay local QR codes in Argentina and Brazil with just your passport, spend on a card, and move money across borders without a local bank account or local tax ID. | ||
|
|
||
| ## Overview | ||
|
|
||
| Peanut is a peer-to-peer payments app that lets users send and receive money globally using digital dollars (USDC stablecoins). It provides a consumer-grade UX on top of blockchain infrastructure — users never need to understand crypto, manage wallets, or handle gas fees. | ||
| Peanut is a self-custody money app built on digital dollars (USDC). Users hold dollars in an account that only they control and spend them like a local — scanning the same QR codes locals use, paying with a card, sending a link, or cashing out to a bank. The experience is consumer-grade: users never manage wallets, seed phrases, or gas fees. Where identity verification is needed it takes a passport and under two minutes — no local ID, bank account, or residency required. Core crypto features require no verification at all. | ||
|
|
||
| ## Key Features | ||
| ## Headline differentiators | ||
|
|
||
| ### Instant P2P Transfers | ||
| Send digital dollars to any Peanut user instantly. No waiting for bank processing, no wire fees. | ||
| ### Pay PIX in Brazil without a CPF | ||
| PIX is Brazil's instant payment network — ~150 million people use it daily. Normally it requires a CPF (Brazilian tax ID) and a Brazilian bank account, which locks out tourists, nomads, and expats. Peanut lets anyone scan a merchant PIX QR and pay in BRL using a passport-verified account funded with digital dollars. The merchant receives BRL in seconds and sees an ordinary PIX payment. The conversion isn't subject to IOF (Brazil's financial-operations tax), saving up to ~3.5% versus cards and bank transfers. Free, 24/7/365, QR scan only. | ||
|
|
||
| ### Payment Links | ||
| Generate a shareable link containing funds. The recipient clicks the link to claim the money — no account needed. Links work across messaging apps, email, and social media. | ||
| ### Pay MercadoPago in Argentina without a DNI | ||
| MercadoPago QR is accepted at 1,000,000+ merchants in Argentina. Locals need a DNI to open an account; Peanut gives access to the payment network without one — pay in pesos with a passport-verified account. Conversion uses the cripto dólar rate (a direct dollar-to-peso market rate that beats the regulated MEP rate cards use), typically several percent to ~11% more pesos per dollar. Free, instant, rate locked at payment. | ||
|
|
||
| ### Bank Cash-Out | ||
| Connect a local bank account and convert digital dollars to local currency. Supported rails: | ||
| - **Argentina**: Bank transfer, MercadoPago | ||
| - **Brazil**: PIX, bank transfer | ||
| - **Mexico**: SPEI, bank transfer | ||
| - **Colombia**: Bank transfer | ||
| - **Peru**: Bank transfer | ||
| - **Bolivia**: Bank transfer (via Meru) | ||
| ### The Peanut Card | ||
| A virtual Visa card that spends the user's digital-dollar balance anywhere Visa is accepted. Free to issue and top up; the only cost is the exchange-rate spread on currency conversion. Available in most countries (the US, Europe, the UK, Latin America, Africa, and more) and requires identity verification. A short list of regions is excluded — the card issuer's restricted-issuance list (China, India, Russia, Turkey, Vietnam, Iran, Israel, and a handful of others). | ||
|
|
||
| ### Crypto Deposit | ||
| Fund your account by depositing crypto from any exchange (Coinbase, Binance, Kraken, Bybit, OKX, etc.) or external wallet. | ||
| ## Core features | ||
|
|
||
| ### Card Payments | ||
| Physical and virtual debit cards for spending digital dollars at any merchant that accepts card payments. | ||
| ### Peanut Links | ||
| Put money in a shareable link or QR; the recipient claims it with no account needed. Works across messengers, email, and social. Unclaimed links are reclaimable; claimed is final. | ||
|
|
||
| ### QR Payments | ||
| Generate and scan QR codes for in-person payments. | ||
| ### Peanut Requests | ||
| A collection link for splitting bills, tips, or donations. Multiple contributors, funds arrive instantly to the balance. | ||
|
|
||
| ## Security Model | ||
| ### Add money (deposit) | ||
| - Crypto: USDC or USDT (and ETH on major EVM networks, auto-converted) from any exchange or wallet on Solana, Arbitrum, Base, Tron, Polygon, or Ethereum. No verification. Gas covered. | ||
| - Bank: SEPA (EUR), ACH (USD), SPEI (MXN), Faster Payments (GBP), and incoming wires (USD/EUR). | ||
| - All deposits free. | ||
|
|
||
| - **Self-custodied smart accounts**: User funds sit in ERC-4337 smart accounts, not on Peanut servers | ||
| - **Biometric passkeys**: Account access is secured by the device's Secure Enclave (face/fingerprint). The private key never leaves the device | ||
| - **No server-side keys**: Peanut cannot access, freeze, or move user funds — even under regulatory pressure | ||
| - **Independent recovery**: If Peanut goes offline, users can recover access via any ERC-4337-compatible wallet | ||
| ### Cash out (withdraw) | ||
| - Bank: SEPA, ACH, SPEI, Faster Payments — to your own or any third party. | ||
| - Crypto: to any wallet on any supported network; gas covered. | ||
| - Argentina: MercadoPago or a local account. | ||
| - All withdrawals free from Peanut. | ||
|
|
||
| ## KYC / Compliance | ||
| ### Direct bank transfers | ||
| Send from balance straight to any third-party bank account, and receive into the balance, via SEPA/ACH/SPEI/Faster Payments — no link required. | ||
|
|
||
| - Core features (send, receive, payment links) work without KYC | ||
| - Bank connections trigger a one-time identity check via Persona (SOC2 Type 2, GDPR, ISO 27001) | ||
| - Peanut only receives a pass/fail result — no documents stored on Peanut servers | ||
| ## Security & custody | ||
|
|
||
| ## Fee Structure | ||
| - Non-custodial smart accounts (ERC-4337) on Arbitrum. User funds never sit on Peanut servers. | ||
| - Biometric passkey auth: the private key is generated from device biometrics and sealed in the device Secure Enclave — never exported, never sent to Peanut. | ||
| - Peanut cannot freeze, seize, or move user funds. If Peanut went offline, users keep full control via any ERC-4337-compatible wallet. | ||
| - Every transaction requires an on-device biometric signature. | ||
|
|
||
| - Peer-to-peer transfers: minimal fees | ||
| - Bank cash-out: small conversion spread | ||
| - No monthly subscription or account fees | ||
| - Merchant payments planned with fees lower than Visa/Mastercard | ||
| ## Verification & limits | ||
|
|
||
| ## Target Markets | ||
| - Required only for bank deposits/withdrawals and local QR payments. Passport or national ID from any country (US driver's license accepted for US users). No local ID anywhere. | ||
| - Crypto deposits, crypto withdrawals, and browsing require no verification. | ||
| - Limits: Latin America ~$2,000/month combined (raisable with documents); US/Europe/Mexico/UK no hard limit (very large transactions reviewed); crypto unlimited. | ||
|
|
||
| Primary focus on Latin America: | ||
| - Argentina, Brazil, Mexico (largest markets) | ||
| - Colombia, Peru, Bolivia, Chile, Ecuador | ||
| ## Fees | ||
|
|
||
| Use cases: remittances, freelancer payments, cross-border transfers, savings in stable currency, merchant payments. | ||
| - No per-transaction fee from Peanut. Same-currency moves (USD↔USDC) are free; cross-currency conversions carry a small spread embedded in the displayed, locked rate. Gas is always covered. No monthly or account fees. | ||
|
|
||
| ## Technical Stack | ||
| ## Where Peanut works | ||
|
|
||
| - Next.js web application (progressive web app) | ||
| - ERC-4337 smart accounts on Base (Ethereum L2) | ||
| - Biometric passkeys via WebAuthn / Secure Enclave | ||
| - Licensed banking partners for fiat on/off ramps | ||
| - Local QR spending live: Argentina (MercadoPago), Brazil (PIX). | ||
| - Bank rails live: 36 SEPA-zone countries (EUR), US (ACH/wire), Mexico (SPEI), UK (Faster Payments). | ||
| - Crypto deposit/withdraw: global, all non-restricted countries. | ||
| - Card: available in most countries; excludes a short restricted-issuance list (China, India, Russia, Turkey, Vietnam, and others). | ||
| - Roadmap (not live): local payment methods in many more countries (CoDi, Transfiya, Yape, Bizum, MB WAY, UPI, and others). Only Argentina and Brazil have live local spending today. | ||
|
|
||
| ## Who it's for | ||
|
|
||
| Tourists, digital nomads, expats, remote workers, freelancers, and families moving money across borders — especially anyone wanting to spend or save in dollars in Latin America without a local ID or bank account. | ||
|
|
||
| ## Company | ||
|
|
||
| - Founded by Konrad Kononenko and Hugo Montenegro | ||
| - Based in Europe, serving Latin America | ||
| - Website: https://peanut.me | ||
| - Twitter: https://twitter.com/PeanutProtocol | ||
| - Twitter/X: https://twitter.com/PeanutProtocol | ||
| - GitHub: https://github.com/peanutprotocol | ||
| - LinkedIn: https://www.linkedin.com/company/peanut-trade/ | ||
| - Careers: https://peanut.me/careers | ||
| - Support: https://peanut.me/support |
Oops, something went wrong.
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.