Config key: settings.bank
Overview
The bank configuration system controls which countries, currencies, and payment methods are supported for fiat deposits and withdrawals throughout the application. This critical configuration determines:
- Which countries users can add bank accounts from
- What bank account fields are required for each country
- Which fiat currencies are supported for deposits and withdrawals
- How app currencies map to banking zones and payment methods
Version
bank.version - Bank configuration version (integer)
- Set to
2to use the new banking zone system - Set to
1or omit for legacy configuration - Default:
1
Banking Zones (V2)
Banking zones define groups of countries that use the same payment network.
bank.bankingZones - Object mapping zone names to country codes (object)
- Common zones:
SEPA,ACH,UK_DOMESTIC,WIRE,SWIFT
Example:
{
"SEPA": ["FI", "AL", "AD", "AT", "PT", "BE", "BG", "ES", "HR", "CY", "CZ", "DK", "EE", "FR", "DE", "GI", "GR", "HU", "IS", "IE", "IT", "LV", "LI", "LT", "LU", "MT", "MD", "MC", "ME", "MK", "NL", "NO", "PL", "RO", "SM", "RS", "SK", "SI", "SE", "CH", "VA", "GB"],
"ACH": ["US"],
"UK_DOMESTIC": ["GB"]
}
Zone Templates
Zone templates define the required bank account fields for each payment method.
bank.zoneTemplates - Object mapping zone names to required field arrays (object)
Example:
{
"SEPA": ["name", "iban", "bic", "owner_full_name"],
"ACH": [
"name", "number", "type", "bank_name", "routing_number",
"owner_full_name", "owner_address_line_1", "owner_address_city",
"owner_address_state_province", "owner_address_country", "owner_address_postal_code"
],
"UK_DOMESTIC": ["name", "number", "sort_code", "owner_full_name"]
}
Available field names:
name- Account name/labeliban- International Bank Account Numberbic- Bank Identifier Code / SWIFT codenumber- Account numbertype- Account type (checking/savings)bank_name- Name of the bankrouting_number- Routing number (US)sort_code- Sort code (UK)owner_full_name- Account owner’s full nameowner_address_line_1- Address line 1owner_address_line_2- Address line 2owner_address_city- Cityowner_address_state_province- State or provinceowner_address_country- Countryowner_address_postal_code- Postal/ZIP code
Zone Default Currencies
Define which fiat currencies each payment zone supports.
bank.zoneDefaultCurrencies - Object mapping zone names to currency code arrays (object)
Example:
{
"SEPA": ["EUR"],
"ACH": ["USD"],
"UK_DOMESTIC": ["GBP"],
"WIRE": ["USD"]
}
Currency Support
Map your application currencies to supported payment zones. This is the core mapping that connects your app currencies (like stablecoins) to banking zones.
bank.currencySupport - Object mapping app currency codes to zone configurations (object)
- Each currency specifies which zones it supports
Example:
{
"USDC_SOL": {
"zones": ["ACH"]
},
"EURC_SOL_BRIDGE": {
"zones": ["SEPA"]
}
}
Action Overrides
Override configuration specifically for deposits or withdrawals. This allows different payment methods for deposits vs. withdrawals - a powerful feature for offering flexible payment options.
bank.actionOverrides.deposit - Deposit-specific overrides (object)
bank.actionOverrides.withdraw - Withdrawal-specific overrides (object)
Overridable properties:
currencySupport- Different zones for deposits vs withdrawalszoneDefaultCurrencies- Different currencies per action
Complete V2 Configuration Example
{
"settings": {
"bank": {
"version": 2,
"bankingZones": {
"SEPA": [
"FI", "AL", "AD", "AT", "PT", "BE", "BG", "ES", "HR", "CY", "CZ", "DK", "EE",
"FR", "GF", "DE", "GI", "GR", "GP", "GG", "GB", "HU", "IS", "IE", "IM", "IT",
"JE", "LV", "LI", "LT", "LU", "MT", "MQ", "YT", "MD", "MC", "ME", "MK", "NL",
"NO", "PL", "RE", "RO", "BL", "MF", "PM", "SM", "RS", "SK", "SI", "SE", "CH", "VA"
],
"ACH": ["US"],
"UK_DOMESTIC": ["GB"]
},
"zoneTemplates": {
"SEPA": ["name", "iban", "bic", "owner_full_name"],
"ACH": [
"name", "number", "type", "bank_name", "routing_number",
"owner_full_name", "owner_address_line_1", "owner_address_city",
"owner_address_state_province", "owner_address_country", "owner_address_postal_code"
],
"UK_DOMESTIC": ["name", "number", "sort_code", "owner_full_name"]
},
"zoneDefaultCurrencies": {
"SEPA": ["EUR"],
"ACH": ["USD"],
"UK_DOMESTIC": ["GBP"]
},
"currencySupport": {
"USDC_SOL": {
"zones": ["ACH"]
},
"EURC_SOL_BRIDGE": {
"zones": ["SEPA"]
}
},
"actionOverrides": {
"withdraw": {
"currencySupport": {
"USDC_SOL": {
"zones": ["ACH", "WIRE"]
}
},
"zoneDefaultCurrencies": {
"WIRE": ["USD"]
}
},
"deposit": {
"currencySupport": {
"EURC_SOL_BRIDGE": {
"zones": ["SEPA", "SWIFT"]
}
}
}
}
}
}
}
How Bank Configuration Works
1. Adding a Bank Account (Settings)
User flow through the bank account form:
- User navigates to Settings > Bank Accounts > Add Bank Account
- User selects app currency (e.g., USDC_SOL)
- App looks up
currencySupport.USDC_SOL.zones→["ACH"] - App looks up
bankingZones.ACH→["US"] - Country dropdown shows only: United States
- User selects United States
- App looks up
zoneDefaultCurrencies.ACH→["USD"] - Bank currency is automatically set to USD
- Form displays fields from
zoneTemplates.ACH - User fills in routing number, account number, address, etc.
2. Depositing Fiat to Crypto (Deposit Screen)
How deposits determine available currencies:
- User navigates to Accounts > USDC_SOL > Deposit
- App checks
currencySupport.USDC_SOL.zones→["ACH"] - App checks
actionOverrides.deposit(if configured for additional zones) - App determines available deposit currencies from
zoneDefaultCurrencies.ACH→["USD"] - User sees they can deposit USD to receive USDC_SOL
- If multiple zones are available, user can select payment method (e.g., ACH vs WIRE)
3. Withdrawing Crypto to Fiat (Withdraw Screen)
How withdrawals work with bank accounts:
- User navigates to Accounts > USDC_SOL > Withdraw
- User selects a previously added bank account (US bank with USD)
- App determines zone: US + USD → ACH
- App checks
actionOverrides.withdraw.currencySupport→ finds["ACH", "WIRE"]available - If multiple zones, user can select payment method:
- Standard ACH (lower fees, 1-3 days)
- Same-day WIRE (higher fees, same day)
- App calculates appropriate fees based on selected zone
- Transaction is created with appropriate subtype for backend processing
Common Use Cases
US-Only USDC Support
Simple configuration for US market only:
{
"settings": {
"bank": {
"version": 2,
"bankingZones": {
"ACH": ["US"]
},
"zoneTemplates": {
"ACH": [
"name", "number", "type", "bank_name", "routing_number",
"owner_full_name", "owner_address_line_1", "owner_address_city",
"owner_address_state_province", "owner_address_country", "owner_address_postal_code"
]
},
"zoneDefaultCurrencies": {
"ACH": ["USD"]
},
"currencySupport": {
"USDC_SOL": {
"zones": ["ACH"]
}
}
}
}
}
Result:
- Users can only add US bank accounts
- Form shows ACH-specific fields (routing number, account number, address)
- Deposits: USD → USDC_SOL (ACH zone fees)
- Withdrawals: USDC_SOL → USD (ACH zone fees)
European EURC Support
Configuration for SEPA region:
{
"settings": {
"bank": {
"version": 2,
"bankingZones": {
"SEPA": ["DE", "FR", "IT", "ES", "NL", "BE", "AT", "PT", "IE", "GR"]
},
"zoneTemplates": {
"SEPA": ["name", "iban", "bic", "owner_full_name"]
},
"zoneDefaultCurrencies": {
"SEPA": ["EUR"]
},
"currencySupport": {
"EURC_SOL_BRIDGE": {
"zones": ["SEPA"]
}
}
}
}
}
Result:
- Users can add bank accounts from listed European countries
- Form shows SEPA-specific fields (IBAN, BIC)
- Deposits: EUR → EURC_SOL_BRIDGE (SEPA zone fees)
- Withdrawals: EURC_SOL_BRIDGE → EUR (SEPA zone fees)
Multi-Zone with Action Overrides
Different payment methods for deposits vs withdrawals:
{
"settings": {
"bank": {
"version": 2,
"bankingZones": {
"ACH": ["US"],
"WIRE": ["US"]
},
"zoneTemplates": {
"ACH": ["name", "number", "type", "bank_name", "routing_number", "owner_full_name"],
"WIRE": ["name", "number", "type", "bank_name", "routing_number", "owner_full_name"]
},
"zoneDefaultCurrencies": {
"ACH": ["USD"],
"WIRE": ["USD"]
},
"currencySupport": {
"USDC_SOL": {
"zones": ["ACH"]
}
},
"actionOverrides": {
"withdraw": {
"currencySupport": {
"USDC_SOL": {
"zones": ["ACH", "WIRE"]
}
}
}
}
}
}
}
Result:
- Deposits: Only ACH available (standard processing)
- Withdrawals: User can choose ACH or WIRE
- ACH: Lower fees, 1-3 business days
- WIRE: Higher fees, same-day processing
- Bank account form shows US fields (supports both zones)
International Deposits, Local Withdrawals
Accept deposits from anywhere, restrict withdrawals:
{
"settings": {
"bank": {
"version": 2,
"bankingZones": {
"SEPA": ["DE", "FR", "IT", "ES", "NL", "BE", "AT"],
"SWIFT": ["US", "GB", "CA", "AU", "JP", "SG"]
},
"zoneTemplates": {
"SEPA": ["name", "iban", "bic", "owner_full_name"],
"SWIFT": ["name", "iban", "bic", "swift", "owner_full_name"]
},
"zoneDefaultCurrencies": {
"SEPA": ["EUR"],
"SWIFT": ["EUR", "USD", "GBP"]
},
"currencySupport": {
"EURC_SOL_BRIDGE": {
"zones": ["SEPA"]
}
},
"actionOverrides": {
"deposit": {
"currencySupport": {
"EURC_SOL_BRIDGE": {
"zones": ["SEPA", "SWIFT"]
}
}
}
}
}
}
}
Result:
- Deposits: Accept from SEPA countries OR international SWIFT transfers
- Withdrawals: Only to SEPA countries (more cost-effective)
- Allows receiving deposits from more countries while controlling withdrawal costs
Legacy Bank Configuration (V1)
For backward compatibility, version 1 configuration is still supported:
{
"settings": {
"bank": {
"version": 1,
"fields": ["name", "number", "routing_number"],
"hideFields": ["swift", "bic"]
}
}
}
V1 Properties:
- fields - Array of bank account fields to show
- hideFields - Array of bank account fields to hide
Note: V1 configuration is deprecated. Use V2 for new implementations.
Best Practices
- Use V2 bank configuration - The zone-based system is more flexible and maintainable
- Test all supported countries - Verify the correct form fields appear for each country
- Match zones to actual banking relationships - Only enable zones where you have actual banking infrastructure
- Consider regulatory requirements - Ensure you’re collecting all required information for AML/KYC compliance
- Use action overrides strategically - Offer premium withdrawal options (WIRE) while keeping deposits simple (ACH)
- Document your setup - Keep internal documentation of which zones support which currencies
- Test fee calculations - Verify that fee subtypes are correctly mapped to zones
- Plan for expansion - Design your zone structure to accommodate future markets
- Consider user experience - More zones = more choices = potentially more confusion
- Monitor costs - Different zones have different processing costs (SEPA vs SWIFT, ACH vs WIRE)