# Introduction

About Mt Pelerin's crypto exchange service

## Welcome to the ultimate crypto-fiat gateway!

Looking for the best way to let your users buy, swap or cash-out cryptocurrencies, and earn from it? You've come to the right place!

<figure><img src="https://3932006131-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FO5FQbDCcBc4vxtuvhxFF%2Fuploads%2FCqHXpp1mARqmb54NwL79%2Fwidget.png?alt=media&amp;token=34b0eb5e-74c1-4b7e-8c25-9d2d0b1b25c8" alt="Mt Pelerin on/off-ramp widget" width="465"><figcaption><p>The main scree of our widget, you can <a href="https://www.mtpelerin.com/buy-crypto">try it here</a>!</p></figcaption></figure>

Our crypto-fiat exchange service has been running continuously since 2020, with countless upgrades and improvements. You can say it's been properly battle-tested!

You can easily integrate this service into your own web or mobile app, with different approaches and plenty of customization possibilities to match your needs and branding as much as possible:

💻 **Web integration**

* [Direct link](/integration-guides/integration-methods/widget#direct-link)
* [iFrame](/integration-guides/integration-methods/widget#iframe)
* [Popup / modal window](/integration-guides/integration-methods/widget#popup-modal)

📱 **Mobile integration**

* [React Native](/integration-guides/integration-methods/mobile-sdk)

🧑‍💻 **API integration**

* [API integration](/integration-guides/integration-methods/api)

Before we dive in, we invite you to discover why our service is the best. Let's get started! 👇

### A few numbers first

* 🕺 180k+ users
* 💰 More than $1 billion transferred
* 🌍 Successfully cashed out funds to 70+ different countries
* 🏦 Successfully cashed out funds to 500+ different banks


# Why Mt Pelerin?

All the sweet features of our exchange service

Okay, we've told you that we were the ultimate crypto-fiat gateway. Now's the time to tell you why!

### 🏆 Best pricing on the market

Our pricing starts at 0%, hard to beat that!

Overall, we try to keep our pricing structure as attractive, simple and transparent as possible.

In a nutshell, we give the user the best exchange rate that we can find as pro traders on the market. We charge a small percentage on top of that rate above $500 per year, below that we don't charge anything (full detail in [Pricing & limits](/service-information/pricing-and-limits)).

**No hidden fees**

**No spread**

That's our commitment to pricing transparency.

### 🕵️‍♀️ No verification required

We are based in Switzerland and we are an authorized Swiss financial intermediary.

As such, we apply the Swiss AML regulations, which allow for money exchange transactions without KYC under certain conditions.

Thanks to that framework, our users can buy, swap and cash out crypto without having to verify their identity up to certain volume limits. Users can still pass their KYC with us to make transactions without limits.

More info in [Identity verification](/service-information/identity-verification).

### ⚡️ Personal IBANs

Verified private and business users can request a personal IBAN for their wallet address. It allows them to receive EUR or CHF bank transfers on an IBAN in their name with the funds directly converted in crypto on their own wallet, and to send EUR or CHF bank transfers from an IBAN in their name using cryptocurrencies from their own wallet.

### 🛡 Better privacy

Our onboarding and KYC process is directly embedded into our service flow, and we process 100% of it internally with our specialized staff. We don't outsource KYC or compliance to any third party, and our users benefit from the business secrecy offered by Swiss law.

### 🔑 Self custodial

Our service is non custodial, that's the way crypto is meant to be!

Users buy crypto, make swaps, and cash out funds directly to/from any self-custodial wallet that they own and control.

Their keys, their coins!

### 🔗 Multi chain

Our service supports make transactions to/from multiple chains, and we regularly add support for new ones. See the full list in [Chains and currencies](/service-information/chains-and-currencies#supported-networks-and-cryptocurrencies).

### ⛓ Sidechains & L2

Users of our interface can buy, swap and sell directly to / from Ethereum layer 2 rollups as well as multiple sidechain networks. We also support Bitcoin Lightning ⚡️

### 🔄 On + Off-ramp

We may be stating the obvious here, but our interface supports both on AND off ramping. Other non custodial services typically offer on-ramping only, but we're one of the few with a live self custodial off-ramp.

### 🐋 Large transactions

Through our standard service, users can make up to CHF 100,000 (or equivalent) worth of buy, swap or sell transactions.

Users can still make larger transactions of any amount by contacting our OTC service, which will still be attributed to your [revenue sharing](/service-information/revenue-sharing).

### 💱 Swap & Bridge

With our swap feature, users can exchange all our supported cryptocurrencies with each other, and across the 16 different chains that we support.

Users can therefore easily swap, for instance, mainnet Bitcoin for USDT, in a single transaction.

The key difference with a DEX is that our swaps are what-you-see-is-what-you-get, **no spread**, **no slippage**, **no price impact**.

### 💰 DCA supported

The payment information that we provide to buy cryptocurrencies by bank transfer remain the same for a given combination of crypto + network + receiving address. Users can therefore use our service for crypto savings plans and DCA by setting up permanent orders at their bank to invest the same amount in crypto at the time interval of their choice.

### 👔 Companies accepted

Organizations can also use our service as end users, by registering with us a corporate entity (KYB). That process is embedded in our default flow.

### 🌎 Global

We're Swiss, but our service is international! Our interface is available in [multiple languages](/integration-guides/parameters-and-customization), and we can accept users from [164 countries](/service-information/unsupported-countries).

### ⚖️ 100% compliant

We are a regulated financial intermediary in Switzerland with live operations since 2018 that are audited several times a year. Swiss KYC/AML regulations are among the strictest in the world, and we have a first-rate track record in complying with them. We are here to stay on the long run, therefore we take compliance very seriously and we work hard to make our processes bulletproof.

### 🥇 First class support

Our customers love us because we're easy to reach! Unlike other services who make contacting them as hard as possible, we embrace talking to our users. We reply to all the messages that we receive - wherever that is - and we always do our best to reply them as fast as we can. See for yourself and read our reviews on [Trustpilot](https://www.trustpilot.com/review/mtpelerin.com), [Google](https://www.google.com/search?q=Mt+Pelerin+Avis\&rflfq=1\&num=20\&stick=H4sIAAAAAAAAAONgkxI2NzOytDQ1NbI0sjQ1MDU2NTMx2sDI-IqR37dEISA1J7UoM0_BsSyzeBEruggALiR54z4AAAA\&rldimm=7629955292950535642\&tbm=lcl\&hl=fr-FR#lkt=LocalPoiReviews), [Google Play](https://play.google.com/store/apps/details?id=com.mtpelerin.bridge) and on the [App Store](https://apps.apple.com/app/bridge-wallet/id1481859680)!


# What you can build

All the use cases you can add to your project with our service.

### 💳 Buy crypto with fiat

Let your user buy 30+ cryptocurrencies, by card or bank transfer.

### 🏦 Sell crypto for fiat

Help your user sell their crypto and cash out funds into 18 different fiat currencies.

### 🔄 Swap crypto

Let your users swap the 30+ different cryptos we support.

### 🌉 Bridge crypto

Let your users transfer funds across 16 different chains.

### 🛒 Checkout

Accept card, bank transfer or crypto payments for online goods or services.

### ❤️ Donation

Accept cryptocurrencies as donations for your charity organization.

### :receipt: Invoice payments

Let your users pay CHF or EUR bills, using cryptocurrencies.

### 👛 Virtual accounts

Create personal crypto IBANs in CHF or EUR for your users.


# Getting started

The steps to integrate our service.

## Get your integration key

In order to activate our service in your integration, you will need a unique key that you will have to include in your integration parameters.

**👉 To request an integration key, please contact us at <hello@mtpelerin.com> and send us the URL of the web or mobile app where you want to integrate our service.**

**⚠️ We don't issue production keys to projects that are not live yet. If your project is still in development, use our** [Testing in local](/integration-guides/integration-methods/widget/testing-in-local) **instructions to try it first.**

By default, an integration key will activate the following features of our service:

* Bank transfer on-ramps
* Bank transfer off-ramps
* Swaps

If you wish to activate on-ramps by **card / Google Pay / Apple Pay** (it is optional) you will also need to verify your business identity (KYB) and sign an integration agreement.

* You can pass your KYB here: <https://kyb.mtpelerin.com/>
* To get the integration agreement, please contact us at <hello@mtpelerin.com>

{% hint style="info" %}
**Build & test**\
To test an integration in local (localhost:3000 or 3001 or 8080 or 5173), use the following key: \
bec6626e-8913-497d-9835-6e6ae9edb144
{% endhint %}


# Integration methods

Our service can be integrated in 3 main different ways:

### :desktop: [Web integration](/integration-guides/integration-methods/widget)

:clock4: *Minutes to hours*

Integrate our widget or use direct links.

### :mobile\_phone: [Mobile SDK integration](/integration-guides/integration-methods/mobile-sdk)

:clock4: *Hours to days*

Integrate us into your mobile app, using our React Native SDK package.

### :keyboard: [API integration](/integration-guides/integration-methods/api)

:clock4: *1 week*

Integrate us through your own UI.


# Widget

How to use our exchange widget with your project

Using our widget is the easiest way to integrate our service. It can be integrated with just a few lines of codes, and remains highly customizable with our available [Parameters and customization](/integration-guides/parameters-and-customization).

Here are the three differents ways to integrate our widget:

## iFrame

To integrate our exchange service as an iFrame, add the following code in the HTML part of the target web page:

```
<iframe allow="usb; ethereum; clipboard-write; payment; microphone; camera" src="https://widget.mtpelerin.com/?_ctkn=YOURINTEGRATIONKEY" title="Mt Pelerin crypto exchange widget"></iframe>
```

{% hint style="danger" %}
You must include the attributes **allow="usb; ethereum; clipboard-write; payment; microphone; camera"** in your iFrame code as shown above, or some features of the widget will not function properly.
{% endhint %}

{% hint style="info" %}
To customize the content of the interface, please refer to the list of available parameters in [Parameters and customization](/integration-guides/parameters-and-customization).
{% endhint %}

## Popup / modal

To integrate our exchange service as a popup / modal window on your website, first add the following code in the HTML part of the target web page:

```
<script src="https://widget.mtpelerin.com/mtp-widget.js"></script>
```

Then call the following JavaScript function to open the modal:

```
showMtpModal(
    { 
        _ctkn: 'YOURINTEGRATIONKEY',
        type: 'popup',
        ... and other parameters
    }
);
```

{% hint style="info" %}
To customize the content of the interface, please refer to the list of available parameters in [Parameters and customization](/integration-guides/parameters-and-customization).
{% endhint %}

## Direct links

The easiest and fastest way to let your users buy our service is to redirect them to our widget, which doesn't require an integration key (it's self-serve).

Direct links can still be used with all the parameters documented in [Parameters and customization](/integration-guides/parameters-and-customization) and with our [Revenue sharing](/service-information/revenue-sharing) program.

**Direct link to "Buy" tab:** <https://widget.mtpelerin.com/?_ctkn=954139b2-ef3e-4914-82ea-33192d3f43d3&type=direct-link&tabs=buy,sell,swap&tab=buy>

**Direct link to "Sell" tab:** <https://widget.mtpelerin.com/?_ctkn=954139b2-ef3e-4914-82ea-33192d3f43d3&type=direct-link&tabs=buy,sell,swap&tab=sell>

**Direct link to "Swap" tab:** <https://widget.mtpelerin.com/?_ctkn=954139b2-ef3e-4914-82ea-33192d3f43d3&type=direct-link&tabs=buy,sell,swap&tab=swap>

{% hint style="info" %}
You can add parameters to the URLs above to customize what is displayed of the widget, please refer to the list of available parameters in [Parameters and customization](/integration-guides/parameters-and-customization).
{% endhint %}


# Testing in local

To run and test our widget in local, use the following activation key:&#x20;

```
bec6626e-8913-497d-9835-6e6ae9edb144
```

It works with the following:

* localhost:3000
* localhost:3001
* localhost:8080
* localhost:5173


# Mobile SDK

How to add our exchange interface to your mobile app

To integrate our service in your React Native mobile application, you can use our React Native package below:

### Document & installation instructions

👉 <https://www.npmjs.com/package/react-native-mtp-onofframp>

{% hint style="info" %}
To customize the content of the interface, please refer to the list of available parameters in [Parameters and customization](/integration-guides/parameters-and-customization).
{% endhint %}


# API

Our buy/sell/swap service can be integrated directly via API, instead of using our widget.

Here are the functionalities that are currently available via API:

* **User authentication**
* **User profile creation**, with the following fields:
  * User type (user or company)
  * Email
  * Language
  * Referral code (for revshare)
* **Add user accounts**
  * Bank accounts
  * Wallet addresses (with an ownership verification protocol)
* **List user accounts**
* **Create personal IBANs**
* **Retrieve personal IBANs**
* **Create buy/sell/swap orders** (excluding card purchases at the moment)
* **Check the status of an order**
* **List the orders of a user**
* **Display transaction history and status**
* **Submit a user KYC yourself**
* **Submit an existing user KYC made with Sumsub**
* **Query a user KYC status**

To request the technical docs to integrate our API, please [contact us](https://www.mtpelerin.com/contact).


# Parameters and customization

Customize your Mt Pelerin experience

The parameters documented in the following pages allow you to control and customize what our service displays in your integration:

* [General parameters](/integration-guides/parameters-and-customization/general-parameters)
* [On-ramp parameters](/integration-guides/parameters-and-customization/on-ramp-parameters)
* [Off-ramp parameters](/integration-guides/parameters-and-customization/off-ramp-parameters)
* [Swap parameters](/integration-guides/parameters-and-customization/swap-parameters)
* [Automating the end user address validation](/integration-guides/parameters-and-customization/automating-the-end-user-address-validation)
* [Branding parameters](/integration-guides/parameters-and-customization/branding-parameters)

{% hint style="info" %}
Those parameters are available with all the different [integration methods](/integration-guides/integration-methods).
{% endhint %}


# General parameters

| Parameter | Accepted values                                                                                                                                                                                                                                                                                                                 | Description                                                                                                                                                                                            |
| --------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| \_ctkn    | string                                                                                                                                                                                                                                                                                                                          | <p>Your activation key<br><strong>⚠️ Mandatory</strong><br>(To test in local, use bec6626e-8913-497d-9835-6e6ae9edb144)</p>                                                                            |
| type      | <p>web<br>popup<br>webview<br>direct-link</p>                                                                                                                                                                                                                                                                                   | Integration type                                                                                                                                                                                       |
| lang      | <p>en<br>fr<br>de<br>it<br>es<br>pt</p>                                                                                                                                                                                                                                                                                         | Display language                                                                                                                                                                                       |
| mode      | dark                                                                                                                                                                                                                                                                                                                            | If used, switches the UI theme to dark mode.                                                                                                                                                           |
| tab       | <p>buy<br>sell<br>swap</p>                                                                                                                                                                                                                                                                                                      | Active tab by default                                                                                                                                                                                  |
| tabs      | <p>buy<br>sell<br>swap</p>                                                                                                                                                                                                                                                                                                      | Allow certain tabs only                                                                                                                                                                                |
| rfr       | string                                                                                                                                                                                                                                                                                                                          | Your [revenue sharing](/service-information/revenue-sharing) code                                                                                                                                      |
| phone     | integer                                                                                                                                                                                                                                                                                                                         | Pre-fills the user's mobile phone number during the login step. Enter it as numbers that begin with the country code. Example : phone=41791234567 for the phone number +41 79 123 45 67                |
| ctry      | <p>ISO alpha-2 country code:<br>CH<br>FR<br>DE<br>...</p>                                                                                                                                                                                                                                                                       | Sets the default country code displayed at the phone number input step. If not used, the country code is automatically selected based on the user's detected timezone.                                 |
| net       | <p>arbitrum\_mainnet </p><p>avalanche\_mainnet<br>base\_mainnet<br>bitcoin\_mainnet<br>bsc\_mainnet<br>celo\_mainnet</p><p>lightning\_mainnet<br>mainnet<br>matic\_mainnet</p><p>optimism\_mainnet</p><p>rsk\_mainnet</p><p>sonic\_mainnet</p><p>tempo\_mainnet</p><p>tezos\_mainnet<br>xdai\_mainnet</p><p>zksync\_mainnet</p> | <p>Default network<br><br>bsc\_mainnet = BNB Chain<br>mainnet = Ethereum<br>matic\_mainnet = Polygon<br>rsk\_mainnet = Rootstock<br>xdai\_mainnet = Gnosis Chain</p>                                   |
| nets      | <p>arbitrum\_mainnet </p><p>avalanche\_mainnet<br>base\_mainnet<br>bitcoin\_mainnet<br>bsc\_mainnet<br>celo\_mainnet</p><p>lightning\_mainnet<br>mainnet<br>matic\_mainnet</p><p>optimism\_mainnet</p><p>rsk\_mainnet</p><p>sonic\_mainnet</p><p>tempo\_mainnet</p><p>tezos\_mainnet<br>xdai\_mainnet</p><p>zksync\_mainnet</p> | <p>List of authorized networks (leave empty for all)<br><br>bsc\_mainnet = BNB Chain<br>mainnet = Ethereum<br>matic\_mainnet = Polygon<br>rsk\_mainnet = Rootstock<br>xdai\_mainnet = Gnosis Chain</p> |

{% hint style="info" %}
&#x20;To add multiple values for a given parameter, simply separate them with a comma.
{% endhint %}


# On-ramp parameters

Customize the on ramp screen of the interface.

| Parameter | Accepted values                                                                                                                                                                                                                                                                                                                 | Description                                                                                                                                                                                     |
| --------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| bsc       | *fiat codes*                                                                                                                                                                                                                                                                                                                    | Buy tab source currency                                                                                                                                                                         |
| bdc       | *crypto codes*                                                                                                                                                                                                                                                                                                                  | Buy tab destination currency                                                                                                                                                                    |
| bsa       | number                                                                                                                                                                                                                                                                                                                          | Buy tab source amount\*                                                                                                                                                                         |
| bda       | number                                                                                                                                                                                                                                                                                                                          | Buy tab destination amount\*                                                                                                                                                                    |
| curs      | *fiat codes*                                                                                                                                                                                                                                                                                                                    | List of authorized fiat currencies (leave empty for all)                                                                                                                                        |
| crys      | *crypto codes*                                                                                                                                                                                                                                                                                                                  | List of authorized cryptocurrencies (leave empty for all)                                                                                                                                       |
| dnet      | <p>arbitrum\_mainnet </p><p>avalanche\_mainnet<br>base\_mainnet<br>bitcoin\_mainnet<br>bsc\_mainnet<br>celo\_mainnet</p><p>lightning\_mainnet<br>mainnet<br>matic\_mainnet</p><p>optimism\_mainnet</p><p>rsk\_mainnet</p><p>sonic\_mainnet</p><p>tempo\_mainnet</p><p>tezos\_mainnet<br>xdai\_mainnet</p><p>zksync\_mainnet</p> | <p>Destination network, for buy and swap tabs<br><br>bsc\_mainnet = BNB Chain<br>mainnet = Ethereum<br>matic\_mainnet = Polygon<br>rsk\_mainnet = Rootstock<br>xdai\_mainnet = Gnosis Chain</p> |
| pm        | card                                                                                                                                                                                                                                                                                                                            | On the buy tab, pre-selects purchases by card / Google Pay / Apple Pay.                                                                                                                         |

\*If both source amount and destination amount parameters are used, the source amount parameter prevails.

**Fiat codes:** AUD, CAD, CHF, CZK, DKK, EUR, GBP, HKD, HUF, JPY, MXN, NOK, NZD, PLN, SEK, SGD, USD, ZAR

**Crypto codes:** AVAX, BNB, BTC, BTC.b, BTCB, cbBTC, CELO, DAI, ETH, EURC, frxUSD, fxUSD, GHO, PAXG, POL, RBTC, RIF, S, sat, tzBTC, USDC, USDC.e, USDRIF, USDT, WBTC, WETH, XAUt, XDAI, XTZ, ZCHF

{% hint style="info" %}
&#x20;To add multiple values for a given parameter, simply separate them with a comma.
{% endhint %}


# Off-ramp parameters

Customize the off ramp screen of the interface.

| Parameter | Accepted values                                                                                                                                                                                                                                                                                                              | Description                                                                                                                                                                                 |
| --------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| ssc       | *crypto codes*                                                                                                                                                                                                                                                                                                               | Sell tab source currency                                                                                                                                                                    |
| sdc       | *fiat codes*                                                                                                                                                                                                                                                                                                                 | Sell tab destination currency                                                                                                                                                               |
| ssa       | number                                                                                                                                                                                                                                                                                                                       | Sell tab source amount\*                                                                                                                                                                    |
| sda       | number                                                                                                                                                                                                                                                                                                                       | Sell tab destination amount\*                                                                                                                                                               |
| curs      | *fiat codes*                                                                                                                                                                                                                                                                                                                 | List of authorized fiat currencies (leave empty for all)                                                                                                                                    |
| crys      | *crypto codes*                                                                                                                                                                                                                                                                                                               | List of authorized cryptocurrencies (leave empty for all)                                                                                                                                   |
| snet      | <p>arbitrum\_mainnet </p><p>avalanche\_mainnet<br>base\_mainnet<br>bitcoin\_mainnet<br>bsc\_mainnet<br>celo\_mainnet</p><p>lightning\_mainnet<br>mainnet<br>matic\_mainnet</p><p>optimism\_mainnet</p><p>rsk\_mainnet</p><p>sonic\_mainnet<br>tempo\_mainnet</p><p>tezos\_mainnet<br>xdai\_mainnet</p><p>zksync\_mainnet</p> | <p>Source network, for sell and swap tabs<br><br>bsc\_mainnet = BNB Chain<br>mainnet = Ethereum<br>matic\_mainnet = Polygon<br>rsk\_mainnet = Rootstock<br>xdai\_mainnet = Gnosis Chain</p> |

\*If both source amount and destination amount parameters are used, the source amount parameter prevails.

**Fiat codes:** AUD, CAD, CHF, CZK, DKK, EUR, GBP, HKD, HUF, JPY, MXN, NOK, NZD, PLN, SEK, SGD, USD, ZAR

**Crypto codes:** AVAX, BNB, BTC, BTC.b, BTCB, cbBTC, CELO, DAI, ETH, EURC, frxUSD, fxUSD, GHO, PAXG, POL, RBTC, RIF, S, sat, tzBTC, USDC, USDC.e, USDRIF, USDT, WBTC, WETH, XAUt, XDAI, XTZ, ZCHF

{% hint style="info" %}
&#x20;To add multiple values for a given parameter, simply separate them with a comma.
{% endhint %}


# Swap parameters

Customize the swap screen of the interface.

| Parameter | Accepted values                                                                                                                                                                                                                                                                                                              | Description                                                                                                                                                                                     |
| --------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| wsc[^1]   | *crypto codes*                                                                                                                                                                                                                                                                                                               | Swap tab source currency                                                                                                                                                                        |
| wdc       | *crypto codes*                                                                                                                                                                                                                                                                                                               | Swap tab destination currency                                                                                                                                                                   |
| wsa       | number                                                                                                                                                                                                                                                                                                                       | Swap tab source amount\*                                                                                                                                                                        |
| wda       | number                                                                                                                                                                                                                                                                                                                       | Swap tab destination amount\*                                                                                                                                                                   |
| snet      | <p>arbitrum\_mainnet </p><p>avalanche\_mainnet<br>base\_mainnet<br>bitcoin\_mainnet<br>bsc\_mainnet<br>celo\_mainnet</p><p>lightning\_mainnet<br>mainnet<br>matic\_mainnet</p><p>optimism\_mainnet</p><p>rsk\_mainnet</p><p>sonic\_mainnet<br>tempo\_mainnet</p><p>tezos\_mainnet<br>xdai\_mainnet</p><p>zksync\_mainnet</p> | <p>Source network, for sell and swap tabs<br><br>bsc\_mainnet = BNB Chain<br>mainnet = Ethereum<br>matic\_mainnet = Polygon<br>rsk\_mainnet = Rootstock<br>xdai\_mainnet = Gnosis Chain</p>     |
| dnet      | <p>arbitrum\_mainnet </p><p>avalanche\_mainnet<br>base\_mainnet<br>bitcoin\_mainnet<br>bsc\_mainnet<br>celo\_mainnet</p><p>lightning\_mainnet<br>mainnet<br>matic\_mainnet</p><p>optimism\_mainnet</p><p>rsk\_mainnet</p><p>sonic\_mainnet<br>tempo\_mainnet</p><p>tezos\_mainnet<br>xdai\_mainnet</p><p>zksync\_mainnet</p> | <p>Destination network, for buy and swap tabs<br><br>bsc\_mainnet = BNB Chain<br>mainnet = Ethereum<br>matic\_mainnet = Polygon<br>rsk\_mainnet = Rootstock<br>xdai\_mainnet = Gnosis Chain</p> |

\*If both source amount and destination amount parameters are used, the source amount parameter prevails.

**Crypto codes:** AVAX, BNB, BTC, BTC.b, BTCB, cbBTC, CELO, DAI, ETH, EURC, frxUSD, fxUSD, GHO, PAXG, POL, RBTC, RIF, S, sat, tzBTC, USDC, USDC.e, USDRIF, USDT, WBTC, WETH, XAUt, XDAI, XTZ, ZCHF

{% hint style="info" %}
&#x20;To add multiple values for a given parameter, simply separate them with a comma.
{% endhint %}

[^1]:


# Automating the end user address validation

Pass and validate the wallet address of your end users, so they don't have to.

Before an end user can buy, swap or sell crypto, Mt Pelerin has to make sure they actually control the address involved, and to do the user is normally asked to sign a message inside the widget.

If your application already holds the user's self-custodial wallet, you can skip that step: sign the message on your side and pass the proof in the widget URL. The user then only confirms, with nothing to sign.

The mechanism is the same on [every chain we support](/service-information/chains-and-currencies/supported-chains-and-cryptocurrencies). What changes from one chain family to another is only how the signature is encoded.

### [Parameters](/integration-guides/parameters-and-customization/automating-the-end-user-address-validation/parameters)

### [Message to sign](/integration-guides/parameters-and-customization/automating-the-end-user-address-validation/message-to-sign)

### [How to test](/integration-guides/parameters-and-customization/automating-the-end-user-address-validation/how-to-test)

### [Troubleshooting](/integration-guides/parameters-and-customization/automating-the-end-user-address-validation/troubleshooting)


# Parameters

{% hint style="warning" %}
**All parameters must be URL encoded. Example:**

/37KcpG6mEp+1oAan8/HLEvcfZFXUi6kTOxTHNjD3ZloxS8DL70v7lCmXiEyDOATm4hvewMzBO2d1n25QdJ8WBw=&#x20;

**must be passed as:**

%2F37KcpG6mEp%2B1oAan8%2FHLEvcfZFXUi6kTOxTHNjD3ZloxS8DL70v7lCmXiEyDOATm4hvewMzBO2d1n25QdJ8WBw%3D
{% endhint %}

| Parameter | Accepted values                                                                                                                                                                                                                                  | Description                                                                                                                                                                                                                                                                                                    |
| --------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| addr      | public address                                                                                                                                                                                                                                   | The user's receiving or sending public address. It must be unique for each user, common addresses are not permitted and will be rejected.                                                                                                                                                                      |
| code      | 4-digit code                                                                                                                                                                                                                                     | A random 4-digit code between 1000 and 9999 that you generate for each address supplied with the `addr` parameter. Do not use the same code for all your addresses or the validation will be rejected.                                                                                                         |
| hash      | signature                                                                                                                                                                                                                                        | The signature of the message `MtPelerin-{code}`, encoded as described in the section for your chain below. The key used to sign has to be the one matching `addr`.                                                                                                                                             |
| net       | <p>bitcoin\_mainnet<br>tezos\_mainnet<br>mainnet (or any other EVM network)</p>                                                                                                                                                                  | You must specify the network the address belongs to with the parameters below, otherwise the address will not be recognized.                                                                                                                                                                                   |
| chain     | <p>arbitrum\_mainnet<br>avalanche\_mainnet<br>base\_mainnet<br>bsc\_mainnet<br>celo\_mainnet<br>mainnet<br>matic\_mainnet<br>optimism\_mainnet<br>rsk\_mainnet</p><p>sonic\_mainnet</p><p>tempo\_mainnet<br>xdai\_mainnet<br>zksync\_mainnet</p> | <p>Optional, only required to validate the address of an EVM <strong>smart contract wallet</strong> (EIP-1271).</p><p></p><p>Not used for Bitcoin and Tezos.<br><br>bsc\_mainnet = BNB Chain<br>mainnet = Ethereum<br>matic\_mainnet = Polygon<br>rsk\_mainnet = Rootstock<br>xdai\_mainnet = Gnosis Chain</p> |


# Message to sign

The message is always the same, on every chain:

```
MtPelerin-{code}
```

Example: with the code `1234` used throughout this page, that is `MtPelerin-1234`.

Only the encoding of the resulting signature changes:

| Chain type | What goes in \`hash\`                                                          |
| ---------- | ------------------------------------------------------------------------------ |
| EVM        | base64 of the raw `personal_sign` bytes                                        |
| Bitcoin    | base64 signature, BIP-322 (SegWit, nested SegWit, Taproot) or BIP-137 (legacy) |
| Tezos      | the armored signature block, in plain text                                     |


# How to test

Check that your address validation automation works

### Test seed

Every vector on this page is derived from a single seed phrase, so you can check your implementation on all three chain families with one wallet.

```
seed: bamboo feed assist glove soda merry medal vanish almost solid bean loop
code: 1234
message: MtPelerin-1234
```

| Chain                  | Derivation path     | Address                                                          |
| ---------------------- | ------------------- | ---------------------------------------------------------------- |
| Ethereum               | `m/44'/60'/0'/0/0`  | `0xEa22e16EA50A43092853329F3cEEa0825Cb9B03e`                     |
| Bitcoin, native SegWit | `m/84'/0'/0'/0/0`   | `bc1qjq907v02ra3pde52zza345c7cj52guwuucz527`                     |
| Bitcoin, Taproot       | `m/86'/0'/0'/0/0`   | `bc1p2uj2zul3vl87grth4ju9fqmam5gxsncr4w9sdzvdv44sr90v657s4ey7a0` |
| Bitcoin, nested SegWit | `m/49'/0'/0'/0/0`   | `39MJF9h9YUcHtmgB9yfpqhPcuVFA848unL`                             |
| Bitcoin, legacy        | `m/44'/0'/0'/0/0`   | `17RudQJ5mepFTCoqErbuwRkey6hPWULcnb`                             |
| Tezos                  | `m/44'/1729'/0'/0'` | `tz1dnCbNYHDoxmHss9kEQVjWQj6GvYX4gYp5`                           |

{% hint style="danger" %}
The seed phrase and private keys on this page are for test purposes only, **do not** use them with real funds.
{% endhint %}

{% hint style="info" %}
The same code is reused across all the vectors below to keep them comparable. In production you must generate a different code for each address.
{% endhint %}

## EVM

### What goes in `hash`

The raw bytes returned by `personal_sign`, encoded in base64. The widget accepts any EVM network, and smart contract wallets are supported through the `chain` parameter, see below.

### Test vector

```
seed: bamboo feed assist glove soda merry medal vanish almost solid bean loop
derivation path: m/44'/60'/0'/0/0
private key: 78ba65f1cc9427fab632340ae4d705b1485fba9f73ab5a24816907d36d5729e9
address: 0xEa22e16EA50A43092853329F3cEEa0825Cb9B03e
code: 1234
hash: yrXNJSmMc4wvVyKEzN4cEmLTvEaridjqTULZAfMwYAMM5PgBz4fCoIWNLr5NwKhxOYiPpI2vhMlKCihWadUw5xs=
```

A second vector, from a standalone private key with no seed phrase:

```
private key: 4142e80a872531fd1055f52ccab713d4c7f1eee28c33415558e74faeb516de2b
address: 0x270402aeB8f4dAc8203915fC26F0768feA61b532
code: 1234
hash: /37KcpG6mEp+1oAan8/HLEvcfZFXUi6kTOxTHNjD3ZloxS8DL70v7lCmXiEyDOATm4hvewMzBO2d1n25QdJ8WBw=
```

### Browser, Metamask

```js
const toBase64 = (u8) => btoa(String.fromCharCode.apply(null, u8));

const fromHexString = (hexString) =>
  Uint8Array.from(hexString.match(/.{1,2}/g).map((byte) => parseInt(byte, 16)));

/* Example for private key 78ba65f1cc9427fab632340ae4d705b1485fba9f73ab5a24816907d36d5729e9 */
const code = "1234";
const message = "MtPelerin-" + code;
const address = "0xEa22e16EA50A43092853329F3cEEa0825Cb9B03e"; // ethereum address

window.ethereum
  .request({
    method: "personal_sign",
    params: [message, address],
  })
  .then((hash) => {
    // hash should be 0xcab5cd25298c738c2f572284ccde1c1262d3bc46ab89d8ea4d42d901f33060030ce4f801cf87c2a0858d2ebe4dc0a87139888fa48daf84c94a0a285669d530e71b
    const base64Hash = toBase64(fromHexString(hash.replace("0x", "")));
    // base64Hash should be yrXNJSmMc4wvVyKEzN4cEmLTvEaridjqTULZAfMwYAMM5PgBz4fCoIWNLr5NwKhxOYiPpI2vhMlKCihWadUw5xs=
    return base64Hash;
  })
  .catch(console.log);
```

### NodeJS, ethers

```js
const ethers = require("ethers");

/* Example for private key 78ba65f1cc9427fab632340ae4d705b1485fba9f73ab5a24816907d36d5729e9 */
const code = "1234";
const message = "MtPelerin-" + code;

const wallet = new ethers.Wallet(
  "0x78ba65f1cc9427fab632340ae4d705b1485fba9f73ab5a24816907d36d5729e9",
);

wallet
  .signMessage(message)
  .then((hash) => {
    // hash should be 0xcab5cd25298c738c2f572284ccde1c1262d3bc46ab89d8ea4d42d901f33060030ce4f801cf87c2a0858d2ebe4dc0a87139888fa48daf84c94a0a285669d530e71b
    const base64Hash = Buffer.from(hash.replace("0x", ""), "hex").toString(
      "base64",
    );
    // base64Hash should be yrXNJSmMc4wvVyKEzN4cEmLTvEaridjqTULZAfMwYAMM5PgBz4fCoIWNLr5NwKhxOYiPpI2vhMlKCihWadUw5xs=
    return base64Hash;
  })
  .catch(console.log);
```

### Smart contract wallets

To validate the address of a smart contract wallet (EIP-1271), add the `chain` parameter so the on-chain `isValidSignature` call targets the right network. Counterfactual wallets that are not deployed yet are also accepted, through EIP-6492.

Accepted values: `arbitrum_mainnet`, `avalanche_mainnet`, `base_mainnet`, `bsc_mainnet` (BNB Chain), `celo_mainnet`, `mainnet` (Ethereum), `matic_mainnet` (Polygon), `optimism_mainnet`, `rsk_mainnet` (Rootstock), `sonic_mainnet`, `tempo_mainnet`, `xdai_mainnet` (Gnosis Chain), `zksync_mainnet`.

### Ready to use URL

```
https://widget.mtpelerin.com/?_ctkn=954139b2-ef3e-4914-82ea-33192d3f43d3&net=mainnet&bdc=ETH&addr=0xEa22e16EA50A43092853329F3cEEa0825Cb9B03e&code=1234&hash=yrXNJSmMc4wvVyKEzN4cEmLTvEaridjqTULZAfMwYAMM5PgBz4fCoIWNLr5NwKhxOYiPpI2vhMlKCihWadUw5xs%3D
```

## Bitcoin

### What goes in `hash`

The base64 signature of the message, sent as is. Two schemes are accepted:

* **BIP-322 simple**, for native SegWit (`bc1q...`), nested SegWit (`3...`) and single-key-spend Taproot (`bc1p...`). This is what modern wallets return.
* **BIP-137**, the legacy `signmessage` scheme, for legacy addresses (`1...`).

Unlike the EVM flow, there is no hex to base64 conversion to do: Bitcoin wallets already return base64.

### Test vector, native SegWit

```
seed: bamboo feed assist glove soda merry medal vanish almost solid bean loop
derivation path: m/84'/0'/0'/0/0
private key: 5c2f8e97befd8fd4daa3631a0dc773570c0cba4d5350d33d38d8815cc28a15d0
private key (WIF): KzJucfgj6tWqP1qVupcUTm2T4Db46KYsLLoF2QSJ2MCT9RhfNMyX
address: bc1qjq907v02ra3pde52zza345c7cj52guwuucz527
code: 1234
hash: AkgwRQIhAJsDTCOB8OeNDhByqVVCSKRVWkZO3LdRE3+huDhI4XujAiAHi7aXErGzX5kiwHi0xXEHnqGNi1cpF1DggvqDXuSURwEhA/X/AAai8u+YLgUkxuYmfMwRDHHE+s7m6lTODQpcQGEv
```

### Test vector, Taproot

```
derivation path: m/86'/0'/0'/0/0
private key (WIF): L5BQYeEqmSdV5UDpiV5Db8jR5J28Du7HHnfuDFgnAqoJXYhvvDHA
address: bc1p2uj2zul3vl87grth4ju9fqmam5gxsncr4w9sdzvdv44sr90v657s4ey7a0
code: 1234
hash: AUElkPZD8BL68hMi7o1eM2+WX8XoF8WwA18uLXc1KgpXBrLrpcWQ0fvdTVGIePTGOFiC/fNyA5Ns87piWXHdU4OyAQ==
```

> **Note** Taproot is the one exception on this page: BIP-340 signatures embed auxiliary random data, so signing the same message twice with the same key gives two different signatures. Yours will not match the value above, and both are valid. Every other vector on this page is deterministic and must match byte for byte.

### Test vector, nested SegWit

```
derivation path: m/49'/0'/0'/0/0
private key (WIF): KycaxNd2MjHDCe1P26i1PiyhVoiKzyapKqu7VWYYEpQ6AjLWhWwy
address: 39MJF9h9YUcHtmgB9yfpqhPcuVFA848unL
code: 1234
hash: AkgwRQIhAO84IDt+0YyoZggQkG7nm2tugNw0+UYfpZFb0kkFGbboAiAFlZlU9yXPfinHsByTYzxzYtoP1dDiyfDiTjXe4aq+2wEhAlNCvmA1hQ719xkhycNraBbBvLgF1aNDgkUcXctdxE0s
```

### Test vector, legacy

```
derivation path: m/44'/0'/0'/0/0
private key: f9500d2cd143a028a05295118a38d3bc0dc2c678ac7051427e19be41be6818ce
private key (WIF): L5aLoPgSkahVakK2ZBKiUcEexZz5YWF771HgWvC7X9ftYzNHoJ7p
address: 17RudQJ5mepFTCoqErbuwRkey6hPWULcnb
code: 1234
hash: IOne2AEOarx21gYSFXZf+FA3AribTL0rfYDZOGcdrTDgRwjkt3c8ODEVKNzhkArUOOYWbd4LeB3LTveO1QaesXg=
```

### Browser, wallet extensions

Wallets that implement message signing return the base64 signature directly, so the value goes straight into `hash` once URL encoded. Ask for the BIP-322 scheme when the wallet lets you choose:

```js
/* Example for address bc1qjq907v02ra3pde52zza345c7cj52guwuucz527 */
const code = "1234";
const message = "MtPelerin-" + code;
const address = "bc1qjq907v02ra3pde52zza345c7cj52guwuucz527";

const hash = await window.unisat.signMessage(message, "bip322-simple");
// hash should be AkgwRQIhAJsDTCOB8OeNDhByqVVCSKRVWkZO3LdRE3+huDhI4XujAiAHi7aXErGzX5kiwHi0xXEHnqGNi1cpF1DggvqDXuSURwEhA/X/AAai8u+YLgUkxuYmfMwRDHHE+s7m6lTODQpcQGEv

const url =
  "https://widget.mtpelerin.com/?_ctkn=954139b2-ef3e-4914-82ea-33192d3f43d3&net=bitcoin_mainnet&bdc=BTC&addr=" +
  address +
  "&code=" +
  code +
  "&hash=" +
  encodeURIComponent(hash);
```

### NodeJS, bip322-js

```js
const { Signer } = require("bip322-js");

/* Example for private key KzJucfgj6tWqP1qVupcUTm2T4Db46KYsLLoF2QSJ2MCT9RhfNMyX */
const code = "1234";
const message = "MtPelerin-" + code;
const address = "bc1qjq907v02ra3pde52zza345c7cj52guwuucz527";

const hash = Signer.sign(
  "KzJucfgj6tWqP1qVupcUTm2T4Db46KYsLLoF2QSJ2MCT9RhfNMyX",
  address,
  message,
);
// hash should be AkgwRQIhAJsDTCOB8OeNDhByqVVCSKRVWkZO3LdRE3+huDhI4XujAiAHi7aXErGzX5kiwHi0xXEHnqGNi1cpF1DggvqDXuSURwEhA/X/AAai8u+YLgUkxuYmfMwRDHHE+s7m6lTODQpcQGEv

console.log(encodeURIComponent(hash));
```

For a legacy address, `bitcoinjs-message` produces the accepted BIP-137 form:

```js
const bitcoinMessage = require("bitcoinjs-message");

const privateKey = Buffer.from(
  "f9500d2cd143a028a05295118a38d3bc0dc2c678ac7051427e19be41be6818ce",
  "hex",
);
const hash = bitcoinMessage
  .sign("MtPelerin-1234", privateKey, true)
  .toString("base64");
// hash should be IOne2AEOarx21gYSFXZf+FA3AribTL0rfYDZOGcdrTDgRwjkt3c8ODEVKNzhkArUOOYWbd4LeB3LTveO1QaesXg=
```

### Ready to use URLs

Native SegWit:

```
https://widget.mtpelerin.com/?_ctkn=954139b2-ef3e-4914-82ea-33192d3f43d3&net=bitcoin_mainnet&bdc=BTC&addr=bc1qjq907v02ra3pde52zza345c7cj52guwuucz527&code=1234&hash=AkgwRQIhAJsDTCOB8OeNDhByqVVCSKRVWkZO3LdRE3%2BhuDhI4XujAiAHi7aXErGzX5kiwHi0xXEHnqGNi1cpF1DggvqDXuSURwEhA%2FX%2FAAai8u%2BYLgUkxuYmfMwRDHHE%2Bs7m6lTODQpcQGEv
```

Taproot:

```
https://widget.mtpelerin.com/?_ctkn=954139b2-ef3e-4914-82ea-33192d3f43d3&net=bitcoin_mainnet&bdc=BTC&addr=bc1p2uj2zul3vl87grth4ju9fqmam5gxsncr4w9sdzvdv44sr90v657s4ey7a0&code=1234&hash=AUElkPZD8BL68hMi7o1eM2%2BWX8XoF8WwA18uLXc1KgpXBrLrpcWQ0fvdTVGIePTGOFiC%2FfNyA5Ns87piWXHdU4OyAQ%3D%3D
```

Nested SegWit:

```
https://widget.mtpelerin.com/?_ctkn=954139b2-ef3e-4914-82ea-33192d3f43d3&net=bitcoin_mainnet&bdc=BTC&addr=39MJF9h9YUcHtmgB9yfpqhPcuVFA848unL&code=1234&hash=AkgwRQIhAO84IDt%2B0YyoZggQkG7nm2tugNw0%2BUYfpZFb0kkFGbboAiAFlZlU9yXPfinHsByTYzxzYtoP1dDiyfDiTjXe4aq%2B2wEhAlNCvmA1hQ719xkhycNraBbBvLgF1aNDgkUcXctdxE0s
```

Legacy:

```
https://widget.mtpelerin.com/?_ctkn=954139b2-ef3e-4914-82ea-33192d3f43d3&net=bitcoin_mainnet&bdc=BTC&addr=17RudQJ5mepFTCoqErbuwRkey6hPWULcnb&code=1234&hash=IOne2AEOarx21gYSFXZf%2BFA3AribTL0rfYDZOGcdrTDgRwjkt3c8ODEVKNzhkArUOOYWbd4LeB3LTveO1QaesXg%3D
```

> **Info** Base64 signatures contain `+`, `/` and `=`, which all have a meaning in a query string. If your signature is refused, check that they were encoded as `%2B`, `%2F` and `%3D`.

## Tezos

### What the wallet signs

Tezos does not sign the message directly. It signs the **Michelson PACK form** of the message prefixed with `Tezos Signed Message:` , that is the two bytes `05 01`, the byte length on 4 bytes big-endian, then the UTF-8 bytes.

For the code `1234`, the bytes handed to the wallet are:

```
05010000002454657a6f73205369676e6564204d6573736167653a204d7450656c6572696e2d31323334
```

### The armored block

The `hash` parameter is not a bare signature: it is the standard Tezos armored block, **exactly 6 lines** joined by `\n`. A missing line, an extra line, a trailing newline or `\r\n` line endings are all rejected.

```
-----BEGIN TEZOS SIGNED MESSAGE-----
Tezos Signed Message: MtPelerin-1234
-----BEGIN SIGNATURE-----
edpkus9ckWtwxNi7NqZqGT2bo1VGxyRkCvaV5zkms7rkeWUV532PhU
edsigtzYwqm72h1cBbWLSMUVEu3t7bUT2RqBMppLdtVGH3VqKhppz96YE6yQSS4GKKkB6nHCRXmdiukHkw3Puy5Zd5b2rvaosRG
-----END TEZOS SIGNED MESSAGE-----
```

* Line 2: `Tezos Signed Message:` followed by `MtPelerin-{code}`, byte for byte.
* Line 4: the signer's public key.
* Line 5: the signature.

The public key on line 4 **must correspond to the address passed in `addr`**. A block signed by a different key is rejected, even when the signature itself is valid.

### Test vector

```
seed: bamboo feed assist glove soda merry medal vanish almost solid bean loop
derivation path: m/44'/1729'/0'/0'
secret key: edskRvYoDB1pSFUcKR9L1mjevnWtSNupR8C3pUQ5uaEygTbPee95tx9kHregYmdY1Mn12J7ii6QQfAeKVT6bkgYmyRkKCiTi19
public key: edpkus9ckWtwxNi7NqZqGT2bo1VGxyRkCvaV5zkms7rkeWUV532PhU
address: tz1dnCbNYHDoxmHss9kEQVjWQj6GvYX4gYp5
code: 1234
signed message: Tezos Signed Message: MtPelerin-1234
packed payload: 05010000002454657a6f73205369676e6564204d6573736167653a204d7450656c6572696e2d31323334
signature: edsigtzYwqm72h1cBbWLSMUVEu3t7bUT2RqBMppLdtVGH3VqKhppz96YE6yQSS4GKKkB6nHCRXmdiukHkw3Puy5Zd5b2rvaosRG
```

### Browser, Beacon SDK

```js
import { SigningType } from "@airgap/beacon-sdk";

/* Example for address tz1dnCbNYHDoxmHss9kEQVjWQj6GvYX4gYp5 */
const code = "1234";
const signedMessage = "Tezos Signed Message: MtPelerin-" + code;

// Michelson PACK: 05 01 + byte length on 4 bytes big-endian + UTF-8 bytes
const bytes = new TextEncoder().encode(signedMessage);
const payload =
  "0501" +
  bytes.length.toString(16).padStart(8, "0") +
  [...bytes].map((b) => b.toString(16).padStart(2, "0")).join("");
// payload should be 05010000002454657a6f73205369676e6564204d6573736167653a204d7450656c6572696e2d31323334

const { address, publicKey } = await wallet.client.getActiveAccount();
const { signature } = await wallet.client.requestSignPayload({
  signingType: SigningType.MICHELINE,
  payload,
});
// signature should be edsigtzYwqm72h1cBbWLSMUVEu3t7bUT2RqBMppLdtVGH3VqKhppz96YE6yQSS4GKKkB6nHCRXmdiukHkw3Puy5Zd5b2rvaosRG

const hash = [
  "-----BEGIN TEZOS SIGNED MESSAGE-----",
  signedMessage,
  "-----BEGIN SIGNATURE-----",
  publicKey,
  signature,
  "-----END TEZOS SIGNED MESSAGE-----",
].join("\n");

const url =
  "https://widget.mtpelerin.com/?_ctkn=954139b2-ef3e-4914-82ea-33192d3f43d3&net=tezos_mainnet&bdc=XTZ&addr=" +
  address +
  "&code=" +
  code +
  "&hash=" +
  encodeURIComponent(hash);
```

### NodeJS, Taquito

```js
const { InMemorySigner } = require("@taquito/signer");

/* Example for seed bamboo feed assist glove soda merry medal vanish almost solid bean loop */
const code = "1234";
const signedMessage = "Tezos Signed Message: MtPelerin-" + code;

const bytes = Buffer.from(signedMessage, "utf8");
const payload =
  "0501" + bytes.length.toString(16).padStart(8, "0") + bytes.toString("hex");
// payload should be 05010000002454657a6f73205369676e6564204d6573736167653a204d7450656c6572696e2d31323334

InMemorySigner.fromMnemonic({
  mnemonic:
    "bamboo feed assist glove soda merry medal vanish almost solid bean loop",
  derivationPath: "m/44'/1729'/0'/0'",
  curve: "ed25519",
})
  .then(async (signer) => {
    const address = await signer.publicKeyHash();
    // address should be tz1dnCbNYHDoxmHss9kEQVjWQj6GvYX4gYp5
    const publicKey = await signer.publicKey();
    // publicKey should be edpkus9ckWtwxNi7NqZqGT2bo1VGxyRkCvaV5zkms7rkeWUV532PhU

    const { prefixSig } = await signer.sign(payload); // no watermark
    // prefixSig should be edsigtzYwqm72h1cBbWLSMUVEu3t7bUT2RqBMppLdtVGH3VqKhppz96YE6yQSS4GKKkB6nHCRXmdiukHkw3Puy5Zd5b2rvaosRG

    const hash = [
      "-----BEGIN TEZOS SIGNED MESSAGE-----",
      signedMessage,
      "-----BEGIN SIGNATURE-----",
      publicKey,
      prefixSig,
      "-----END TEZOS SIGNED MESSAGE-----",
    ].join("\n");

    console.log(encodeURIComponent(hash));
  })
  .catch(console.log);
```

### Ready to use URL

```
https://widget.mtpelerin.com/?_ctkn=954139b2-ef3e-4914-82ea-33192d3f43d3&net=tezos_mainnet&bdc=XTZ&addr=tz1dnCbNYHDoxmHss9kEQVjWQj6GvYX4gYp5&code=1234&hash=-----BEGIN%20TEZOS%20SIGNED%20MESSAGE-----%0ATezos%20Signed%20Message%3A%20MtPelerin-1234%0A-----BEGIN%20SIGNATURE-----%0Aedpkus9ckWtwxNi7NqZqGT2bo1VGxyRkCvaV5zkms7rkeWUV532PhU%0AedsigtzYwqm72h1cBbWLSMUVEu3t7bUT2RqBMppLdtVGH3VqKhppz96YE6yQSS4GKKkB6nHCRXmdiukHkw3Puy5Zd5b2rvaosRG%0A-----END%20TEZOS%20SIGNED%20MESSAGE-----
```

### Supported Tezos addresses

* `tz1` (Ed25519), `tz2` (secp256k1) and `tz3` (P-256) are supported.
* `KT1` originated accounts (smart contracts) and `tz4` (BLS) cannot be validated by signature.
* The address is case sensitive. Pass it exactly as the wallet returns it, never lowercased.

## Lightning

Lightning accounts cannot be validated through this URL mechanism, because the proof is produced by the node key while the account holds a Lightning address. They are validated inside the widget, or by paying a 1 sat invoice.


# Troubleshooting

Most common causes of an invalid address validation

{% hint style="warning" %}
Make sure to have properly URL encoded the parameters.
{% endhint %}

| Symptom                                         | Cause to check                                                                                      |
| ----------------------------------------------- | --------------------------------------------------------------------------------------------------- |
| The signature is refused on every chain         | The signed message must be `MtPelerin-{code}` with the code you passed in the URL.                  |
| The signature is refused, EVM or Bitcoin        | `+`, `/` and `=` were not URL encoded as `%2B`, `%2F` and `%3D`.                                    |
| The signature is refused, Tezos                 | The block does not have exactly 6 lines, or the newlines were not encoded as `%0A`.                 |
| The signature is refused, Tezos                 | The public key on line 4 does not correspond to `addr`.                                             |
| The signature is refused, smart contract wallet | The `chain` parameter is missing or points to the wrong network.                                    |
| The address is never offered to the user        | Wrong `net`, or the address family does not match the network.                                      |
| The validation is rejected                      | `code` is not exactly 4 digits, or the address is already registered on another Mt Pelerin account. |


# Branding parameters

Add your look & feel into our UI

{% hint style="danger" %}
**All parameters must be URL encoded.**&#x20;

**Example:**

\#FFFFFF

**must be passed as**

%23FFFFFF
{% endhint %}

| Parameter | Value    | Description                                                                                           |
| --------- | -------- | ----------------------------------------------------------------------------------------------------- |
| mylogo    | logo URL | Add your own logo, which will be displayed in the widget's footer left of the "powered by Mt Pelerin" |
| primary   | XXXXXX   | Primary color, where XXXXXX is the color's hexadecimal code, for example: %23F7931A                   |
| success   | XXXXXX   | CTA color, where XXXXXX is the color's hexadecimal code, for example: %23F7931A                       |


# Merchant parameters

Accept payments for goods & services

{% hint style="info" %}
To enable merchant payments, please contact us at <hello@mtpelerin.com>
{% endhint %}

Our merchant widget allows you to accept payments for selling a good or service online. The end user has the choice to pay with crypto, by card or by bank transfer. You receive the funds converted into the pre-defined fiat or crypto currency of your choice.

Here are the mandatory parameters to use our merchant payment service:

| Parameter | Value                  | Description                                                                     |
| --------- | ---------------------- | ------------------------------------------------------------------------------- |
| \_ctkn    | string                 | Your activation key                                                             |
| tabs      | merchant               | Must be passed to display the dedicated merchant UI                             |
| bdc       | *fiat or crypto codes* | Settlement currency                                                             |
| bda       | number                 | The amount of the payment denominated in the settlement currency defined by bdc |
| oid       | string                 | Your internal order ID for the payment                                          |

{% hint style="info" %}
bda and oid must be dynamically passed for each payment, bdc can be dynamically passed but not mandatory.
{% endhint %}

{% hint style="info" %}
The customization parameters from [General parameters](/integration-guides/parameters-and-customization/general-parameters) and [Branding parameters](/integration-guides/parameters-and-customization/branding-parameters) can be used with the merchant parameters.
{% endhint %}

**Fiat codes:** AUD, CAD, CHF, CZK, DKK, EUR, GBP, HKD, HUF, JPY, MXN, NOK, NZD, PLN, SEK, SGD, USD, ZAR

**Crypto codes:** AVAX, BNB, BTC, BTC.b, BTCB, cbBTC, CELO, DAI, ETH, EURC, frxUSD, fxUSD, GHO, PAXG, POL, RBTC, RIF, S, sat, tzBTC, USDC, USDC.e, USDRIF, USDT, WBTC, WETH, XAUt, XDAI, XTZ, ZCHF

#### Payment confirmation <a href="#id-2.-payment-confirmation" id="id-2.-payment-confirmation"></a>

Once a payment has been successfully processed, we call a webhook on your side to let you know that the transaction is complete.

The webhook contains the following info:

```
{
    "id": "664369c938b3ca001a3cd44f" // our own transaction id,
    "amount": 123.45,
    "currency": "USDC",
    "external_id": "123456789", // The order id that you passed in the widget parameters (oid)
}
```

**Webhook setup**

For us to setup the webhook, we need your webhook URL that we must call, as well as 2 keys (authentication and signature) that we will exchange.

The authentication key will be used in the "Authentication" header.

The signature key will allow to compute a HMAC on your side. This HMAC will have to be the same as the "Mtp-Signature" header parameters. The HMAC has to be computed on the full request body. JS example:

```
const computedSignature = crypto.createHmac('sha256', SIGNATURE_KEY).update(JSON.stringify(body)).digest('hex')
```


# Informational APIs

We provide the following APIs for integrators of our crypto-fiat exchange service:

* [Conversion webhook](/integration-guides/conversion-webhook)
* [Price quote API](/integration-guides/informational-apis/price-quote-api)
* [Unsupported countries API](/integration-guides/informational-apis/unsupported-countries-api)
* [Supported chains and assets API](/integration-guides/informational-apis/supported-chains-and-assets-api)


# Price quote API

Query our crypto-fiat conversion result for a given output, including our fees. This typically used to integrate us in an on/off-ramp comparator or aggregator.

<https://api.mtpelerin.com/currency_rates/convert> (POST)

| Parameter      | Example value    | Description                                                                                                    |
| -------------- | ---------------- | -------------------------------------------------------------------------------------------------------------- |
| sourceCurrency | CHF              | One of our supported fiat or crypto [Chains and currencies](/service-information/chains-and-currencies).       |
| destCurrency   | BTC              | One of our supported fiat or crypto [Chains and currencies](/service-information/chains-and-currencies).       |
| sourceAmount   | 100              | Input amount. ⚠️ Do not use it at the same time as destAmount, or you will get a 400 error.                    |
| destAmount     | 100              | Output amount. ⚠️ Do not use at the same time as sourceAmount, or you will get a 400 error.                    |
| sourceNetwork  | fiat             | One of our supported chains (see Tokens endpoint above), or 'fiat'.                                            |
| destNetwork    | bitcoin\_mainnet | One of our supported chains (see Tokens endpoint above), or 'fiat'.                                            |
| isCardPayment  | false            | 'true' or 'false' if the payment will be made by card (only valid if sourceNetwork is fiat, ignored otherwise) |

### Response example:

```
{
  "fees": {
    "networkFee": "2.2605",
    "fixFee": 0
  },
  "sourceCurrency": "CHF",
  "destCurrency": "BTC",
  "sourceNetwork": "fiat",
  "destNetwork": "bitcoin_mainnet",
  "sourceAmount": 100,
  "destAmount": "0.00398660113390708486776"
}
```

"destAmount" is the **net final amount**, which includes all applicable fees.

{% hint style="info" %}
The endpoint returns an error in case of an off-ramp if the amount is inferior the minimum amount of CHF 50 (or equivalent in other fiat currencies).
{% endhint %}

To know via API the **minimum off-ramp amount**, you can use:

<https://api.mtpelerin.com/currency_rates/sellLimits/:currency> (GET)

Replace :currency by one of our supported currencies.

Example: <https://api.mtpelerin.com/currency_rates/sellLimits/USD>

### Response example:

```
{
  "destCurrency": "USD",
  "limit": "62.341265"
}
```


# Unsupported countries API

Query the list of country codes that we don't accept in our service.

<https://api.mtpelerin.com/countries/forbidden> (GET)


# Supported chains and assets API

Query the blockchains that we support, and which crypto-assets we support on each network.

<https://api.mtpelerin.com/currencies/tokens> (GET)


# Events

## Transaction success event

When a user has reached the end of a buy/swap/sell process, you can listen for the following postMessage event:

```
{ type: 'paymentSubmitted', data: { paymentType, paymentId } }

paymentType: bankTransfer|card|crypto
```

This can be used to trigger a navigation to the desired post-transaction screen or page.

Documentation: <https://developer.mozilla.org/en-US/docs/Web/API/Window/message_event>

## Order creation event

This event is emitted when a new order is created in our system. It includes all the relevant information needed to display or process the order on your side.

```
{ "type": "orderCreated", "data": Order }
```

Depending on the order type (“buy”, “sell”, or “swap”), the `Order` payload may include different fields. Below are examples for each case.

### Buy order example

```
{
  "id": "123456789",
  "expirationDate": "2025-06-30T12:38:32.887Z",
  "cryptoAddress": "bc1ql…..",
  "currencyIn": "CHF",
  "currencyOut": "BTC",
  "marketRate": "85854.9",
  "network": "bitcoin_mainnet",
  "paymentMode": "bank",
  "type": "buy",
  "valueIn": "100",
  "valueOut": "0.001165"
}
```

### Sell order (Lightning) example

```
{
  "id": "123456789",
  "expirationDate": "2025-06-30T12:38:32.887Z",
  "offRampAddress": "mtpelerin@ln.mtpelerin.com",
  "lnInvoice": "lnbc4…",
  "cryptoAddress": "",
  "currencyIn": "sat",
  "currencyOut": "CHF",
  "marketRate": "0.00085931",
  "network": "lightning_mainnet",
  "paymentMode": "bank",
  "type": "sell",
  "valueIn": "44444",
  "valueOut": "38.19"
}
```

### Swap order example

```
{
  "id": "123456789",
  "expirationDate": "2025-06-30T12:38:32.887Z",
  "offRampAddress": "3LgdKdB9x42m4ujae78NcwUXjYW3z45KrX",
  "cryptoAddress": "",
  "cryptoAddressIn": "bc1qlu…..",
  "cryptoAddressOut": "0xee21c7…….",
  "currencyIn": "BTC",
  "currencyOut": "USDT",
  "marketRate": "107891.95",
  "network": "mainnet",
  "paymentMode": "bank",
  "type": "swap",
  "valueIn": "0.001",
  "valueOut": "106.892119",
  "networkIn": "bitcoin_mainnet",
  "networkOut": "mainnet"
}
```


# Conversion webhook

Follow your conversions

On request, we can setup for you a webhook that tells you when a transaction has been completed.

To use it, you simply pass an 'oid' parameter that contains your own internal order id.

Once a transaction has been completed, we call your webhook with the following payload:

```
{
    "id": "664369c938b3ca001a3cd44f", // our internal transaction id
    "amount": 123.45,
    "currency": "USDC",
    "external_id": "123456789", // Your own order id that you passed in the 'oid' parameter
}
```

### Setup

For us to setup the webhook, we need from you the webhook URL that we must call, as well as 2 keys (authentication and signature) that we will exchange.

The authentication key will be used in the "Authentication" header.

The signature key will allow to compute a HMAC on your side. This HMAC will have to be the same as the "Mtp-Signature" header parameters. The HMAC has to be computed on the full request body. JS example:

```
const computedSignature = crypto.createHmac('sha256', SIGNATURE_KEY).update(JSON.stringify(body)).digest('hex')
```


# Revenue sharing

Earn revenue from your Mt Pelerin integration

We can share back to you **25%** of the fees that we charge to users coming from your integration.

To do so, you must use the '**rfr**' parameter (see [Parameters and customization](/integration-guides/parameters-and-customization)) with the invitation code that you can obtain by going on app.mtpelerin.com in the "Invite" tab.

Your earnings will be automatically paid in **USDC** (on Polygon) at the end of each month on your main wallet address.

To add a wallet address, go in the "Addresses" tab, click on "Add a wallet" and follow instructions to verify it.

You will also receive an activity summary email each month when your payout has been sent.

## Boost your earnings up to 50%

Add liquidity to the [MPS](https://www.mtpelerin.com/shareholders) pools and earn +1% in referral fees for each $100 of value added to the pool, up to a maximum of 50%:

* [Add liquidity on Uniswap](https://app.uniswap.org/explore/pools/ethereum/0xa74ac034f5D255d19C0Fae3E30a51f8482E20a91) (Ethereum)
* [Add liquidity on SushiSwap](https://www.sushi.com/gnosis/pool/v2/0x53027796a4713eace91988a1c696db764737cb48/add) (Gnosis Chain)

## Notes

* The revenue sharing percentage applies to effective commissions that we charge to a successfully referred user.
* To benefit from earnings boost, you must add liquidity from an address that is registered with us.
* We reserve the right to modify these terms and conditions at any time.


# Chains and currencies

All the fiat and crypto currencies supported in our exchange service.

Browse the different chains, cryptocurrencies and fiat currencies that we support:

### [Supported chains & cryptos](/service-information/chains-and-currencies/supported-chains-and-cryptocurrencies)

### [Supported fiat currencies](/service-information/chains-and-currencies/supported-fiat-currencies)


# Supported chains & cryptocurrencies

The blockchains and crypto-assets supported in our service

{% hint style="info" %}
Supported networks and cryptocurrencies can also be found in JSON format here: <https://api.mtpelerin.com/currencies/tokens>
{% endhint %}

We always work to add support for more networks and cryptocurrencies, make sure to [subscribe to our newsletter](http://eepurl.com/dhQ1dT) and to [follow us on social media](https://linktr.ee/mtpelerin) to stay informed when we do!

* **Arbitrum**
  * ETH - Ether
  * USDC - USDC
  * USDC.e - Bridged USDC
  * USDT - Tether USD
  * WBTC - Wrapped Bitcoin
* **Avalanche**
  * AVAX - Avalanche
  * BTC.b - BTC.b
  * EURC - EURC
  * USDC - USDC
  * USDC.e - Bridged USDC
* **Base**
  * cbBTC - Coinbase Wrapped BTC
  * ETH - Ether
  * EURC - EURC
  * USDC - USDC
  * ZCHF - Frankencoin
* **Bitcoin**
  * BTC - Bitcoin
* **Bitcoin Lightning**
  * Sat - Bitcoin
* **BNB Chain (BEP20)**
  * BNB - Binance Coin
  * BTCB - Binance Bitcoin pegged token
  * USDC - USDC
  * USDT - Tether USD
  * WETH - Wrapped Ether
* **Celo**
  * CELO - Celo
  * USDC - USDC
  * USDT - Tether USD
* **Ethereum (ERC20)**
  * cbBTC - Coinbase Wrapped BTC
  * DAI - Dai
  * ETH - Ether
  * EURC - EURC
  * FRAX USD - frxUSD
  * f(x) USD - fxUSD
  * GHO - GHO
  * PAXG - Pax Gold
  * USDC - USDC
  * USDT - Tether USD
  * WBTC - Wrapped Bitcoin
  * XAUt - Tether Gold
  * ZCHF - Frankencoin
* **Gnosis Chain**
  * USDC - USDC
  * USDT - Tether USD
  * WBTC - Wrapped Bitcoin
  * WETH - Wrapped Ether
  * XDAI - XDAI
  * ZCHF - Frankencoin
* **Optimism**
  * ETH - Ether
  * USDC - USDC
  * USDC.e - Bridged USDC
  * USDT - Tether USD
  * WBTC - Wrapped Bitcoin
  * ZCHF - Frankencoin
* **Polygon**
  * POL - Polygon
  * USDC - USDC
  * USDC.e - Bridged USDC
  * USDT - Tether USD
  * WBTC - Wrapped Bitcoin
  * WETH - Wrapped Ether
* **Rootstock**
  * RBTC - Smart Bitcoin
  * RIF - RSK Infrastructure Framework
  * USDRIF - RIF US Dollar
  * USDT - Tether USD
* **Sonic**
  * S - Sonic
  * USDC - USDC
  * USDT - Tether USD
* **Tempo**
  * USDC.e - Bridged USDC
* **Tezos**
  * tzBTC - tzBTC
  * USDT - Tether USD
  * XTZ - Tezos
* **zkSync Era**
  * ETH - Ether
  * USDC - USDC
  * USDC.e - Bridged USDC


# Supported fiat currencies

The fiat currencies supported in our service

We always work to add support for more fiat currencies, make sure to [subscribe to our newsletter](http://eepurl.com/dhQ1dT) and to [follow us on social media](https://linktr.ee/mtpelerin) to stay informed when we do!

The following fiat currencies are supported for **bank transfer** on-ramps and off-ramps:

* AUD - Australian dollar
* CAD - Canadian dollar
* CHF - Swiss franc
* CZK - Czech koruna
* DKK - Danish krone
* EUR - Euro
* GBP - British pound
* HKD - Hong Kong dollar
* HUF - Hungarian forint
* JPY - Japanese yen
* MXN - Mexican peso
* NOK - Norwegian krone
* NZD - New Zealand dollar
* PLN - Polish złoty
* SEK - Swedish krona
* SGD - Singapore dollar
* USD - US dollar
* ZAR - South African rand

The following fiat currencies are supported for **card/Google Pay/Apple Pay** on-ramps:

* CHF - Swiss franc
* EUR - Euro
* GBP - British pound
* USD - US dollar


# Payment methods

The various payments channels that we support

## ⬆️ On-ramp payments

### 🏦 Bank transfers

Here are the different bank transfer networks that can be used to on-ramp with us:

* **SIC** - For CHF transfers from Switzerland --> Free
* **SEPA** - For EUR transfers from the [SEPA zone](https://en.wikipedia.org/wiki/Single_Euro_Payments_Area) --> Free
* **SWIFT** - For transfers in any other currency from any other country --> SWIFT fees apply, [more info here](/service-information/pricing-and-limits)

### 💳 Cards

Here are the different types of card payments that we can accept:

* **Visa**
* **Mastercard**
* **Google Pay**
* **Apple Pay**

For purchases by card/Apple Pay/Google Pay, we only support payments in USD, EUR, GBP and CHF.

Please note that we don't accept payments from cards issued to companies.

## ⬇️ Off-ramp payments

### 🏦 Bank transfers

Here are the different bank transfer networks that can be used to off-ramp with us:

* **SIC** - For CHF transfers to Switzerland --> Free
* **SEPA** - For EUR transfers to the [SEPA zone](https://en.wikipedia.org/wiki/Single_Euro_Payments_Area) --> Free
* **SWIFT** - For transfers in any other currency to any other country --> SWIFT fees apply, [more info here](/service-information/pricing-and-limits)


# Pricing & limits

Find our detailed service fees

Browse the detail of our exchange commissions:

⬆️ [On-ramp pricing](/service-information/pricing-and-limits/on-ramp-pricing)

⬇️ [Off-ramp pricing](/service-information/pricing-and-limits/off-ramp-pricing)

💱 [Swap pricing](/service-information/pricing-and-limits/swap-pricing)

The volume used to determine the commission bracket is based on the end user's cumulated buy/sell/swap transactions during a calendar year. This volume resets each year on January 1st.

Fees are calculated per end user, and not per integrator.

{% hint style="info" %}
Our pricing is the same for both retail and business users.
{% endhint %}


# On-ramp pricing

Fees for fiat-to-crypto transactions

### 🏦 On-ramp by bank transfer

The table below shows the exchange commission that we charge when buying crypto by bank transfer in AUD, CAD, CHF, CZK, DKK, EUR, GBP, HKD, HUF, JPY, MXN, NOK, NZD, PLN, SEK, SGD, USD, ZAR:

| Volume per year        | Commission |
| ---------------------- | ---------- |
| 0-500                  | free       |
| 501 - 5,000            | 1.3%       |
| 5,001 - 50,000         | 1.1%       |
| 50,001 - 1,000,000     | 0.9%       |
| 1,000,001 - 10,000,000 | 0.7%       |
| 10,000,000+            | 0.6%       |

💡 We don't take any other fees.

💡 We don't take any spread, we use the spot market rates.

💡 Our service fee is applied to the full amount of a transaction and not in pro rata.

ℹ️ Buying the **fxUSD** and **ZCHF** stablecoins by bank transfer is currently free of exchange fee.

#### MPS benefit

Users holding MPS tokens, our tokenized shares, can increase the free volume above and decrease their fees to buy crypto by bank transfer. Each 1 MPS provides:

<table><thead><tr><th width="375"></th><th></th></tr></thead><tbody><tr><td>+100 of free volume</td><td>up to 50,000</td></tr><tr><td>-0.004% on fees</td><td>up to -0.4%</td></tr></tbody></table>

{% hint style="info" %}
[**About MPS tokens >**](https://www.mtpelerin.com/shareholders)
{% endhint %}

#### Limits

|                           |                                                                                                                                                      |
| ------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------- |
| Min. buy                  | none                                                                                                                                                 |
| Max. buy (SIC/SEPA/SWIFT) | <p>CHF 100,000 (or equivalent)<br>For transactions above 100k, users can <a href="https://www.mtpelerin.com/contact">contact our OTC service</a></p> |

#### Bank transfer fees

|                                                                                                                                                                                                                            |                                                                             |
| -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------- |
| CHF bank transfers (SIC)                                                                                                                                                                                                   | free                                                                        |
| EUR bank transfers (SEPA)                                                                                                                                                                                                  | free                                                                        |
| <ul><li>AED, AUD, CAD, CZK, DKK, GBP, HKD, HUF, JPY, MXN, NOK, NZD, PLN, SEK, SGD, USD, ZAR bank transfers</li><li>CHF transfers to/from outside Switzerland</li><li>EUR transfers to/from outside SEPA zone<br></li></ul> | <p>SWIFT fees apply<br><em>Charged by your bank/intermediary banks</em></p> |

{% hint style="info" %}

#### About SWIFT fees

SWIFT is an international bank transfer network constituted of many banks. When funds are transferred from a bank A to a bank B over the SWIFT network, they follow a route that can include multiple intermediary banks. The receiving bank and each intermediary banks (if any) charge a fee for that service. It can vary from a few $ to several dozen $, which is unfortunately impossible to know in advance.
{% endhint %}

#### Network delivery costs

| Network                 | Cost                                   |
| ----------------------- | -------------------------------------- |
| Arbitrum                | free                                   |
| Avalanche               | free                                   |
| Base                    | free                                   |
| BNB Chain               | free                                   |
| Bitcoin                 | free                                   |
| Bitcoin Lightning       | free                                   |
| Celo                    | free                                   |
| Ethereum (ETH)          | free                                   |
| Ethereum (other tokens) | $1 (or equivalent in other currencies) |
| Gnosis Chain            | free                                   |
| Optimism                | free                                   |
| Polygon                 | free                                   |
| Rootstock               | free                                   |
| Sonic                   | free                                   |
| Tempo                   | free                                   |
| Tezos                   | free                                   |
| zkSync Era              | free                                   |

### 💳 On-ramp by card, Google Pay, Apple Pay

The table below shows the exchange commission that we charge when buying crypto by card in EUR, GBP, USD or CHF:

| Volume per year | Commission |
| --------------- | ---------- |
| 0-499           | 2.5%       |
| 500-4,999       | 3.8%       |
| 5,000-49,999    | 3.6%       |
| 50,000-100,000  | 3.4%       |

💡 We don't take any other fees.

💡 We don't take any spread, we use the spot market rates.

💡 Our service fee is applied to the full amount of a transaction and not in pro rata.

💡 A minimum fee of CHF 1.20 or equivalent in other currencies is applied.

#### MPS benefit

Users holding MPS tokens, our tokenized shares, can increase the discounted 2.5% volume threshold above and decrease their fees to buy crypto by card. Each 1 MPS provides:

<table><thead><tr><th width="375"></th><th></th></tr></thead><tbody><tr><td>+100 of discounted volume</td><td>up to 50,000</td></tr><tr><td>-0.004% on fees</td><td>up to -0.4%</td></tr></tbody></table>

{% hint style="info" %}
[**About MPS tokens >**](https://www.mtpelerin.com/shareholders)
{% endhint %}

**Limits**

|          |                                           |
| -------- | ----------------------------------------- |
| Min. buy | none                                      |
| May. buy | CHF 5,000 per transaction (or equivalent) |

#### Network delivery costs

| Network                 | Cost                                   |
| ----------------------- | -------------------------------------- |
| Arbitrum                | free                                   |
| Avalanche               | free                                   |
| Base                    | free                                   |
| BNB Chain               | free                                   |
| Bitcoin                 | free                                   |
| Bitcoin Lightning       | free                                   |
| Celo                    | free                                   |
| Ethereum (ETH)          | free                                   |
| Ethereum (other tokens) | $1 (or equivalent in other currencies) |
| Gnosis Chain            | free                                   |
| Optimism                | free                                   |
| Polygon                 | free                                   |
| Rootstock               | free                                   |
| Sonic                   | free                                   |
| Tempo                   | free                                   |
| Tezos                   | free                                   |
| zkSync Era              | free                                   |

## ⚠️ Refund fee

If we receive a transaction that is not compliant with our [service terms and conditions](https://www.mtpelerin.com/terms-conditions) and if the user refuses to do the steps that we will request by email to clear the transaction, we reserve the right to charge a CHF 20 processing fee (or equivalent) to return the funds to their origin.


# Off-ramp pricing

Fees for crypto-to-fiat transactions

### 🏦 Off-ramp by bank transfer

The table below shows the exchange commission that we charge when cashing out crypto by bank transfer in AUD, CAD, CHF, CZK, DKK, EUR, GBP, HKD, HUF, JPY, MXN, NOK, NZD, PLN, SEK, SGD, USD, ZAR:

| Volume per year        | Commission |
| ---------------------- | ---------- |
| 0-500                  | free       |
| 501 - 5,000            | 1.3%       |
| 5,001 - 50,000         | 1.1%       |
| 50,001 - 1,000,000     | 0.9%       |
| 1,000,001 - 10,000,000 | 0.7%       |
| 10,000,000+            | 0.6%       |

💡 We don't take any other fees.

💡 We don't take any spread, we use the spot market rates.

💡 Our service fee is applied to the full amount of a transaction and not in pro rata.

ℹ️ Selling the **fxUSD** and **ZCHF** stablecoins by bank transfer is currently free of exchange fee.

#### MPS benefit

Users holding MPS tokens, our tokenized shares, can increase the free volume above and decrease their fees to sell crypto by bank transfer. Each 1 MPS provides:

|                     |              |
| ------------------- | ------------ |
| +100 of free volume | up to 50,000 |
| -0.004% on fees     | up to -0.4%  |

{% hint style="info" %}
[**About MPS tokens >**](https://www.mtpelerin.com/shareholders)
{% endhint %}

#### Limits

|           |                                                                                                                                                                          |
| --------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| Min. sell | <ul><li>CHF 50 (or equivalent)</li><li>None with a personal IBAN</li></ul>                                                                                               |
| Max. sell | <p>CHF 100,000 (or equivalent in other currencies)<br>For transactions above 100k, users can <a href="https://www.mtpelerin.com/contact">contact our OTC service</a></p> |

#### Bank transfer fees

|                                                                                                                                                                                                                               |                                                                             |
| ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------- |
| CHF bank transfers (SIC)                                                                                                                                                                                                      | free                                                                        |
| EUR bank transfers (SEPA)                                                                                                                                                                                                     | free                                                                        |
| <ul><li>AED, AUD, CAD, CZK, DKK, GBP, HKD, HUF, JPY, MXN, NOK, NZD, PLN, SEK, SGD, USD, ZAR bank transfers</li><li>CHF transfers to/from outside Switzerland</li><li>EUR transfers to/from outside SEPA zone</li></ul><p></p> | <p>SWIFT fees apply<br><em>Charged by your bank/intermediary banks</em></p> |

{% hint style="info" %}

#### About SWIFT fees

SWIFT is an international bank transfer network constituted of many banks. When funds are transferred from a bank A to a bank B over the SWIFT network, they follow a route that can include multiple intermediary banks. The receiving bank and each intermediary banks (if any) charge a fee for that service. It can vary from a few $ to several dozen $, which is unfortunately impossible to know in advance.
{% endhint %}

#### Network costs

Off-ramp network costs are paid by the user.

## ⚠️ Refund fee

If we receive a transaction that is not compliant with our [service terms and conditions](https://www.mtpelerin.com/terms-conditions) and if the user refuses to do the steps that we will request by email to clear the transaction, we reserve the right to charge a CHF 20 processing fee (or equivalent) to return the funds to their origin.


# Swap pricing

Fees for crypto-to-crypto transactions

The table below shows the exchange commission that we charge when swapping or bridging crypto with our service:

| Volume per year | Commission |
| --------------- | ---------- |
| 0-499           | free       |
| 500+            | 0.5%       |

**💡 Exception:** USDC to USDC swaps are charged 0.1% instead of 0.5% (USDC.e excluded).

💡 We don't take any other fees.

💡 We don't take any spread, we use the spot market rates.

💡 Our service fee is applied to the full amount of a transaction and not in pro rata.

💡 No price impact, no slippage.

#### MPS benefit

Users holding MPS tokens, our tokenized shares, can increase the free volume above and decrease their fees to sell crypto by bank transfer. Each 1 MPS provides:

|                     |              |
| ------------------- | ------------ |
| +100 of free volume | up to 50,000 |
| -0.004% on fees     | up to -0.4%  |

{% hint style="info" %}
[**About MPS tokens >**](https://www.mtpelerin.com/shareholders)
{% endhint %}

#### Limits

|           |                                  |
| --------- | -------------------------------- |
| Min. swap | None                             |
| Max. swap | Depending on available liquidity |

#### Delivery fee

| Network                 | Cost                                   |
| ----------------------- | -------------------------------------- |
| Arbitrum                | free                                   |
| Avalanche               | free                                   |
| Base                    | free                                   |
| BNB Chain               | free                                   |
| Bitcoin                 | free                                   |
| Bitcoin Lightning       | free                                   |
| Celo                    | free                                   |
| Ethereum (ETH)          | free                                   |
| Ethereum (other tokens) | $1 (or equivalent in other currencies) |
| Gnosis Chain            | free                                   |
| Optimism                | free                                   |
| Polygon                 | free                                   |
| Rootstock               | free                                   |
| Sonic                   | free                                   |
| Tempo                   | free                                   |
| Tezos                   | free                                   |
| zkSync Era              | free                                   |

## ⚠️ Refund fee

If we receive a transaction that is not compliant with our [service terms and conditions](https://www.mtpelerin.com/terms-conditions) and if the user refuses to do the steps that we will request by email to clear the transaction, we reserve the right to charge a CHF 20 processing fee (or equivalent) to return the funds to their origin.


# Delivery times

How long funds take to arrive at destination

## ⬆️ On-ramp

### 🏦 By bank transfer

The table below shows the time it usually takes for us to receive an incoming bank transfer, depending on its type:

| Transfer type              | Time              |
| -------------------------- | ----------------- |
| CHF transfer (Switzerland) | 0-1 business day  |
| SEPA (Europe)              | 1-2 business days |
| SWIFT (rest of the world)  | 1-5 business days |

{% hint style="info" %}
Business days: Monday to Friday
{% endhint %}

{% hint style="info" %}
Please note that bank transfer times are not an exact science and that not all banks process transfers at the same speed.
{% endhint %}

{% hint style="warning" %}
Bank transfer on-ramps from unverified users are withheld during 7 days before being automatically delivered. The exchange rate is fixed when we receive the bank transfer, so the user is not impacted by price variations during that period. This is a fraud prevention measure that cannot be removed.
{% endhint %}

### 💳 By card, Google Pay, Apple Pay

When buying crypto by card, we will instantly receive the user's payment but it won't guarantee that we will instantly deliver the crypto. We will do so on a best effort basis, but it won't always be possible for various compliance or liquidity reasons, notably:

1. Crypto bought by card usually take a few minutes to appear in the end user's wallet. In some cases, it can take up to several hours in case of network congestion.
2. If a user makes several card purchases in a row, he may be flagged by our system for manual processing and his transaction will therefore take longer to be delivered.

## ⬇️ Off-ramp

### 🏦 By bank transfer

The table below shows the time it usually takes for a bank transfer to arrive on the user's destination bank account depending on its location:

| Transfer sent to           | Time              |
| -------------------------- | ----------------- |
| CHF transfer (Switzerland) | 0-1 business day  |
| SEPA (Europe)              | 1-2 business days |
| SWIFT (rest of the world)  | 1-5 business days |

{% hint style="info" %}
Business days: Monday to Friday
{% endhint %}

{% hint style="info" %}
Please note that bank transfer times are not an exact science and that not all banks process transfers at the same speed.
{% endhint %}

## 💱 Swap

When swapping crypto, we will receive the user's crypto transfer as soon as the transaction will have been mined, but it won't guarantee that we will instantly deliver the crypto. We will do so on a **best effort basis**, but it won't always be possible (for compliance or liquidity reasons, for instance).


# Identity verification

Discover our KYC framework

As described in [Why Mt Pelerin?](/why-mt-pelerin), end users don't have to verify their identity to use our service, within certain limits. Find our more below:

### Flow

```mermaid
graph TD
    start([User begins]) --> q1{Card purchase?}

    q1 -- Yes --> k1
    q1 -- No --> amt[User enters a buy / sell / swap amount]
    amt --> q2{"Volume below CHF 999<br/>over a rolling 30 day period?"}

    q2 -- Yes --> n1
    q2 -- No --> k1

    subgraph NOKYC ["Non KYC flow"]
        n1["1. SMS + OTP"]
        n2["2. Email address"]
        n3["3. Sign up confirmation<br/>shows volume limits and offers<br/>KYC upgrade for higher limits"]
        n1 --> n2 --> n3
    end

    subgraph KYC ["KYC flow"]
        k1["1. SMS + OTP"]
        k2["2. Email address"]
        k3["3. Personal info"]
        k4["4. ID document"]
        k5["5. Selfie"]
        k6["6. Additional info"]
        k7["7. Residence address"]
        k8["8. Proof of address"]
        k1 --> k2 --> k3 --> k4 --> k5 --> k6 --> k7 --> k8
    end

    n3 --> npay[Payment]
    npay --> nq{Bank transfer on-ramp?}
    nq -- Yes --> nwait[Wait 7 days]
    nwait --> ndone([Funds delivered])
    nq -- No --> ndone

    k8 --> route{Entry path?}

    route -- "Card purchase" --> cwait[Wait for KYC approval]
    cwait --> cpay[Payment]
    cpay --> cdone([Funds delivered])

    route -- "Other" --> bpay[Payment]
    bpay --> bwait[Wait for KYC approval]
    bwait --> bdone([Funds delivered])

    classDef terminal fill:#d8f3dc,stroke:#2d6a4f,color:#1b4332
    classDef wait fill:#ffe8cc,stroke:#d97706,color:#7c2d12
    classDef pay fill:#dbeafe,stroke:#2563eb,color:#1e3a8a
    class ndone,cdone,bdone terminal
    class cwait,bwait,nwait wait
    class npay,cpay,bpay pay
```

### Unverified users

An end user can use our exchange service without having to verify identity up to CHF 999 per month.

This limit is calculated on a rolling period of 30 days for a user's total exchange volume (whether swaps, on-ramps or off-ramps).

Limits are calculated in CHF and applied in equivalent in other currencies.

Below this limit, we only ask users to provide a mobile phone number that serves as the unique user ID in our system, and an email address for receiving transaction notifications.

If a transaction from an unverified user goes over that limit, we will send an email to the user with two options:

* Pass KYC and process the transaction
* Refund the transaction to origin (we reserve the right to charge a CHF 20 processing fee in cases of abuse)

We always reserve the right to ask users additional information on a given transfer or to pass KYC below those limits depending on their transaction activity.

{% hint style="warning" %}
Bank transfer on-ramps from unverified users are withheld during 7 days before being automatically delivered. The exchange rate is fixed when we receive the bank transfer, so the user is not impacted by price variations during that period. This is a fraud prevention measure that cannot be removed.
{% endhint %}

### Verified users

Once a user verifies identity, the CHF 999 limit is lifted and transactions can be made up to CHF 100k per transaction.

Depending on the user's risk profile and volume activity, we can ask by email extra information about the origin of the funds involved, according to our AML compliance obligations.

Users also have the possibility to contact us in advance to document a given volume beforehand.

Organizations can also verify their identity (KYB) with us to use our service.

### Features & KYC

The table below shows which parts of our service are available to verified and unverified users:

| Available features      | with ID verification | without ID verification |
| ----------------------- | -------------------- | ----------------------- |
| Standard bank transfers | ✅                    | ✅                       |
| Swaps                   | ✅                    | ✅                       |
| Card purchases          | ✅                    | ❌                       |

Card / Google Pay / Apple Pay purchases are only available to users who have verified their identity with us.


# KYC requirements

Please find below all the information an end user must provide to pass KYC with us:

### Personal information

* First name
* Last name
* Birthdate
* Gender
* Citizenship
* Phone number
* Email

### ID document

We can accept national ID cards or passports. We reserve the right to require a passport when an ID national ID card cannot be verified.

Driving licences, residence permits and other types of ID cards are not accepted.

### Selfie

### Additional information

* Job status
* Job title (if applicable)
* Employer (if applicable)
* Monthly income level (dropdown menu)
* Wealth level (dropdown menu)
* Origin of funds (dropdown menu)
* US person yes/no
* PEP person yes/no
* High risk trade yes/no

### Residence address

* Street, number
* Postal code
* City
* Country
* Tax identification number (optional)

### Proof of address

The end user must provide one of those documents, which must clearly show the name, the residence address, and have a date less than 3 months old:

* Electricity bill
* Water bill
* Gas bill
* Waste bill
* Internet bill
* Landline phone bill
* Bank statement
* Rent bill or receipt
* Household insurance bill or receipt
* Tax bill or assessment
* Real estate ownership certificate

Mobile phone bills, health insurance bills and any other document not on this list will be refused.

### Review

Once submitted, a KYC will be reviewed by our compliance team as soon as possible. Our compliance team works during office hours, Monday to Friday.

If everything is good, the KYC is approved and the user receives a confirmation email.

If something is missing or incorrect, the user receives an email with the instructions to correct.


# KYB requirements

To register an organization with us, a legal director must first pass his/her personal KYC, then provide the following elements:

* Legal name
* Activity description
* Date of incorporation
* Country of incorporation
* UID
* Monthly turnover level
* Headquarter address
* Is a person of control politically exposed yes/no
* Is the organization engaged in a high risk trade yes/no
* Excerpt from the commercial register (less than 1 year old)
* Bank statement of the organization (less than 3 months old)
* [Form K](https://app.mtpelerin.com/mtpelerin-form-k.pdf), filled and signed by each person of significant control of the organization (i.e. who owns 25% of shares or more)
* [Form A](https://app.mtpelerin.com/mtpelerin-form-a.pdf), filled and signed by each person who answered 'yes' on the 2nd page of form K
* A valid passport for each other legal director of the organization
* A valid proof of address (less than 3 months old) for each other legal director of the organization
* A valid passport for each person owning 25% or more of the shares of the organization
* Schedule a short video call with our compliance team to validate the profile and answer a few regulatory questions about the origin of the funds

### Review

Once submitted, a KYB will be reviewed by our compliance team as soon as possible. Our compliance team works during office hours, Monday to Friday.

If everything is good, the KYB is approved and the user receives a confirmation email.

If something is missing or incorrect, the user receives an email with the instructions to correct.


# Sumsub

Reuse existing KYCs

If you already run Sumsub KYC on your users, a lighter server-to-server model is possible where the integration partner acts as a **reusable Sumsub KYC provider** for Mt Pelerin:

* Mt Pelerin can reuse the existing Sumsub applicant id instead of running its own verification from scratch, which removes most of the KYC integration work on the wallet side.
* On our side, this requires a dedicated KYC-fulfillment endpoint that accepts a Sumsub applicant reference, validates it server-to-server, and raises the user's `kycLevel` accordingly.

If you are interested in being a Sumsub-reuse partner, please [contact us](https://www.mtpelerin.com/contact).


# Privacy

Mt Pelerin processes all user identification data internally, nothing is outsourced to third party providers. We are allowed to do so under our Swiss financial intermediary status. This status means that we apply the Swiss KYC/AML directives, and that the way we apply them is audited several times a year by an independant organization affiliated to FINMA, the Swiss financial market supervisory authority.

When your users use our service by bank transfer to our Swiss bank accounts, their data is protected by Swiss privacy. It means that we don't share their info with any third party, and that nobody can force us to do so with the exception of a court order in the context of a criminal investigation.

When using card payments, user data must be shared with our EU service providers and isn't protected by Swiss privacy anymore.

| Transaction type        | Swiss data privacy   |
| ----------------------- | -------------------- |
| Standard bank transfers | :white\_check\_mark: |
| Swaps                   | :white\_check\_mark: |
| Card purchases          | ❌                    |


# Unsupported countries

**We cannot accept as clients&#x20;**<mark style="color:red;">**US persons, Russian citizens**</mark>**, as well as residents of:**

* Afghanistan
* Angola
* Bangladesh
* Belarus
* Burkina Faso
* Burundi
* Central African Republic
* Cuba
* Democratic Republic of the Congo
* Guinea
* Guinea-Bissau
* Haiti
* Indonesia
* Iran
* Iraq
* Lebanon
* Libya
* Mainland China (Hong Kong and Taiwan accepted)
* Mali
* Myanmar
* Nicaragua
* Niger
* North Korea
* Russia
* Somalia
* Sudan
* South Sudan
* Syria
* Trinidad and Tobago
* United States
* Venezuela
* Yemen
* Zimbabwe

{% hint style="danger" %}

### What are US persons?

You qualify as a US person if you correspond to any of the following:

* Resident in the United States
* Citizen of the United States (including green card holders)
* A person having spent a sufficient amount of time in the United States within the last 3 years
* Involved in any partnership or corporation organized or incorporated under the laws of the United States
* Involved in any estate of which any executor or administrator is a US person
* Involved in any trust of which any trustee is a US person
* Any agency or branch of a foreign entity located in the United States
* Any non-discretionary account or similar account (other than an estate or trust) held by a dealer or other fiduciary for the benefit or account of a US person
* Any discretionary account or similar account (other than an estate or trust) held by a dealer or other fiduciary organized, incorporated, or (if an individual) resident in the United States
* Any partnership or corporation if:
* Organized or incorporated under the laws of any foreign jurisdiction
* Formed by a US person principally for the purpose of investing in securities not registered under the Act, unless it is organized or incorporated, and owned, by accredited investors (as defined in Rule 501(a)) who are not natural persons, estates or trusts.
  {% endhint %}


# User notifications

We send the following automated notification emails to the user:

* A notification email when an incoming payment has been received from the user (bank transfer, card payment or crypto transfer).
* A confirmation email when the converted funds have been sent to destination, with the detail of the transaction (date, transaction ref., amount received, amount sent, exchange rate, beneficiary, origin, destination).
* A notification email if a bank transfer was received without a purchase reference.
* A confirmation email once a new wallet address has been validated.
* If the user passes KYC:
  * An email confirming that we have receiving his/her personal info and that we will review them within 48h.
  * An email informing the user once his/her KYC has been validated.
  * Emails if any submitted documents have been rejected for non-compliance.


# Support

How to get help

### Integration support

If you have any questions about the integration of our exchange service, if you would like to report bugs or if would like to request features, please use our dedicated Discord here:

<https://discord.gg/5sxWUjXjV8>

### User support

If end users of the service send you support requests:

1. Redirect them **first** to our dedicated support page here: [mtpelerin.com/support](https://www.mtpelerin.com/support)
2. If they can't find what they're looking for there, ask them to write at **<hello@mtpelerin.com>**

#### Tutorials you can share:

* [How to buy crypto with Mt Pelerin](https://www.mtpelerin.com/faq/how-to-buy-cryptocurrency)
* [How to sell crypto with Mt Pelerin](https://www.mtpelerin.com/faq/how-to-sell-cryptocurrency)
* [How to swap crypto with Mt Pelerin](https://www.mtpelerin.com/blog/how-to-swap-cryptocurrency)
* [How to bridge crypto with Mt Pelerin](https://www.mtpelerin.com/blog/how-to-bridge-cryptocurrencies)
* [How to verify a wallet address](https://www.mtpelerin.com/blog/how-to-link-an-address)


# About Mt Pelerin

A few words on who we are

Mt Pelerin is a project born in 2017 in Geneva, Switzerland, with the ambition to offer products and services bridging the crypto world, full of opportunities, with traditional finance, full of complex compliance regulations.

The company, [Mt Pelerin Group SA](https://www.zefix.admin.ch/en/search/entity/list/firm/1364873), was bootstrapped by our community the next year through an equity crowdfunding that raised more than $2 million, the first one to offer a [tokenized share](https://www.mtpelerin.com/shareholders) with full voting and dividend rights to the public. We now have offices in Geneva and Neuchâtel.

Since then, we have become one of the leading actors in asset tokenization with Bridge Protocol, our tokenization platform, and we provide unique cryptocurrency services through our mobile app Bridge Wallet. Our long term goal is to develop a comprehensive banking offering that will completely blur the lines between traditional finance, cryptocurrencies and the world of DeFi.

## Regulated in Switzerland

We are an authorized Swiss financial intermediary, a status that allows us to perform financial services and KYC/AML. We process 100% of your identification ourselves, no outsourcing. Our processes are also regularly audited by an external and independent entity. In our case, that entity is SO-FIT, a [self-regulatory organization (SRO)](https://www.finma.ch/en/authorisation/self-regulatory-organisations-sros/) that is officially recognized by [FINMA](https://www.finma.ch/en/authorisation/self-regulatory-organisations-sros/sro-member-search/), the Swiss financial market supervisory authority.

### [More info about us >](https://www.mtpelerin.com/about-us)


# Changelog

See what's new at a glance

**2026.08.18**

Improved the level of documentation of the [Automating the end user address validation](/integration-guides/parameters-and-customization/automating-the-end-user-address-validation) process, including better instructions to validate Bitcoin and Tezos addresses.

**2026.08.06**

Added [Merchant parameters](/integration-guides/parameters-and-customization/merchant-parameters)

**2026.08.03**

Added [API](/integration-guides/integration-methods/api) integration information

Added [Sumsub](/service-information/identity-verification/sumsub) KYC sharing possibility

Added support of ZCHF on the Optimism network in [Chains and currencies](/service-information/chains-and-currencies)

**2026.07.29**

Added the support of the **Tempo** network with USDC.e in [Chains and currencies](/service-information/chains-and-currencies)

**2026.07.09**

Added support of fxUSD in [Chains and currencies](/service-information/chains-and-currencies)

Added zero fees on/off-ramp for fxUSD in [Pricing & limits](/service-information/pricing-and-limits)

**2026.07.06**

Removed support of crvUSD and LUSD in [Chains and currencies](/service-information/chains-and-currencies)

**2026.06.19**

Added ENS address resolution support

**2026.05.28**

Replaced FRAX support by frxUSD support in [Chains and currencies](/service-information/chains-and-currencies)

**2026.05.19**

Purchases by card / Apple Pay / Google Pay can now be made in USD and GBP, in addition to EUR and CHF.

**2026.05.18**

Replaced fixed fee of CHF 1.20 for card purchases by a minimum fee of CHF 1.20 in [Pricing & limits](/service-information/pricing-and-limits)

**2026.04.06**

Removed support of EURA cash outs in [Chains and currencies](/service-information/chains-and-currencies)

**2026.02.26**

Updated the volume limit in [Identity verification](/service-information/identity-verification)

**2026.02.23**

Removed support of EURA purchases in [Chains and currencies](/service-information/chains-and-currencies).

**2026.02.06**

Removed support for Stasis Euro (EURS) in [Chains and currencies](/service-information/chains-and-currencies).

**2025.12.09**

Added ZCHF support on Base in [Chains and currencies](/service-information/chains-and-currencies).

**2025.11.28**

Removed Latvia from the list of unsupported countries in [Unsupported countries](/service-information/unsupported-countries).

**2025.11.12**

Removed AED support in [Chains and currencies](/service-information/chains-and-currencies).

**2025.09.23**

Launched ZCHF campaign: buying and selling ZCHF is currently free of exchange fees.

**2025.09.22**

Added support of the Sonic chain in [Chains and currencies](/service-information/chains-and-currencies) with on/off-ramp and swap support on that chain for S, USDC and USDT.

**2025.08.28**

Added support for Frankencoin (ZCHF) on Gnosis Chain in [Chains and currencies](/service-information/chains-and-currencies)

**2025.08.05**

Removed Romania from the list of non-accepted countries.

Added Angola, Bangladesh, Indonesia, Latvia, Niger, Trinidad and Tobago to the list of non-accepted countries.

**2025.07.18**

Added information to get via API our minimum off-ramp amounts in [Price quote API](/integration-guides/informational-apis/price-quote-api)

**2025.07.14**

Added transaction reporting in [Informational APIs](/integration-guides/informational-apis)

Added order creation in [Events](/integration-guides/events)

**2025.07.08**

Added support of Frankencoin (ZCHF) on Ethereum in [Chains and currencies](/service-information/chains-and-currencies)

**2025.05.30**

Removed EUROe off-ramp & swap support.

**2025.05.21**

Removed support of MAI in [Chains and currencies](/service-information/chains-and-currencies)

**2025.05.16**

Added support for the following new assets in [Chains and currencies](/service-information/chains-and-currencies):

* BTC.b on Avalanche
* cbBTC on Base and Ethereum
* PAXG on Ethereum
* XAUt on Ethereum

**2025.04.28**

Removed EUROe on-ramp support.

**2025.03.10**

Removed delivery fee for mainnet ETH, reduced delivery fee from $3 to $1 for other supported tokens on Ethereum in [Pricing & limits](/service-information/pricing-and-limits).

**2025.02.18**

Added [Events](/integration-guides/events) section.

**2025.02.04**

Removed support for EURT in [Chains and currencies](/service-information/chains-and-currencies).

**2024.11.14**

Reintroduced cash outs via SEPA Instant for transactions below €1400 in [Pricing & limits](/service-information/pricing-and-limits) and [Delivery times](/service-information/delivery-times).

**2024.11.06**

Removed delivery fee for mainnet Bitcoin in [Pricing & limits](/service-information/pricing-and-limits)

**2024.10.28**

Renamed MATIC into POL.

Card purchases are now also available in GBP, in addition to EUR and CHF.

**2024.10.11**

Added EURC support on Base in [Chains and currencies](/service-information/chains-and-currencies)

**2024.09.09**

Renamed agEUR into EURA in [Chains and currencies](/service-information/chains-and-currencies)

**2024.09.04**

Removed FPS transfers support for GBP.

**2024.08.21**

Added support for WebLN as an extra method to verify a Lightning address.

**2024.08.15**

Removed RDOC and XCHF support in [Chains and currencies](/service-information/chains-and-currencies).

**2024.08.13**

We now support the following fiat currencies to buy and cash out cryptocurrencies:

* AED - United Arab Emirates dirham
* AUD - Australian dollar
* CAD - Canadian dollar
* CZK - Czech koruna
* HUF - Hungarian forint
* MXN - Mexican peso
* PLN - Polish złoty

**2024.07.12**

Added new limits for cash purchases in [Identity verification](/service-information/identity-verification).

**2024.07.04**

* Reduced minimum swap value from CHF 25 to CHF 1 (or equivalent in other currencies) in [Pricing & limits](/service-information/pricing-and-limits).
* Removed support of EURL on Tezos.

**2024.06.24**

Decreased delivery fees in [Pricing & limits](/service-information/pricing-and-limits):

* Bitcoin (mainnet): from $5 to $2
* Ether (mainnet): from $2 to $1
* Stablecoins (mainnet): from $5 to $3

**2024.06.12**

We now support the **Celo** blockchain and the following crypto-assets on that network: CELO, USDC, USDT

**2024.06.06**

Removed support for EURL on-ramps in [Chains and currencies](/service-information/chains-and-currencies).

**2024.06.05**

Added the new 'phone' parameter in [General parameters](/integration-guides/parameters-and-customization/general-parameters), which allows to pre-fill the user's mobile phone number during the login step.

**2024.05.21**

Added the possibility to do reverse quotes in the [Informational APIs](/integration-guides/informational-apis) with the new 'destAmount' parameter.

**2024.04.22**

Added support for native USDC on zkSync Era in [Chains and currencies](/service-information/chains-and-currencies).

**2024.04.08**

Added localhost test activation key in [General parameters](/integration-guides/parameters-and-customization/general-parameters) and [Getting started](/integration-guides/getting-started).

**2024.04.05**

Added link to new Uniswap v3 pool in [Revenue sharing](/service-information/revenue-sharing).

**2024.03.22**

Removed support for jFiat stablecoins in [Chains and currencies](/service-information/chains-and-currencies).

**2024.03.15**

Added new required access authorizations (payment, microphone, camera) in the iFrame code in [Widget](/integration-guides/integration-methods/widget).

**2024.03.05**

Added Romania to the list of unaccepted countries in [Unsupported countries](/service-information/unsupported-countries).

**2024.01.25**

Added support for **Base** and **zkSync Era** in [Chains and currencies](/service-information/chains-and-currencies)

Added support new crypto-assets:

* **Arbitrum:** USDT, WBTC
* **Base:** ETH, USDC
* **Optimism:** USDT, WBTC
* **Polygon:** XCHF
* **Tezos:** tzBTC, USDT
* **zkSync:** ETH, USDC

**2024.01.09**

Removed support for BUSD on BNB Chain.

**2023.12.18**

[Pricing & limits](/service-information/pricing-and-limits#swap-pricing)update: USDC to USDC swaps are now 0.1% instead of 0.5%.

Added delivery fees in [Pricing & limits](/service-information/pricing-and-limits):

* $5 for Bitcoin (mainnet)
* $2 for ETH (mainnet)

Increased delivery fee in [Pricing & limits](/service-information/pricing-and-limits):

* $5 (from $3) for tokens on Ethereum mainnet

**2023.12.13**

Using an **integration key** to activate our services is now mandatory. More information in the new [Getting started](/integration-guides/getting-started) section.

Added back support for payments by card, Google Pay and Apple Pay in [Payment methods](/service-information/payment-methods), [Pricing & limits](/service-information/pricing-and-limits), [Identity verification](/service-information/identity-verification) and [Delivery times](/service-information/delivery-times).

Added new 'pm' parameter in [On-ramp parameters](/integration-guides/parameters-and-customization/on-ramp-parameters) to pre-select card purchases on the buy tab.

**2023.11.20**

Decreased delivery fee for ERC20 tokens from $8 to $3 in [Pricing & limits](/service-information/pricing-and-limits).

**2023.10.12**

New stablecoins supported:

* GHO on Ethereum
* USDRIF on Rootstock
* Native USDC on Avalanche, Optimism and Polygon

The EUROC stablecoin has been renamed EURC, according to Circle's rebrand.

**2023.10.03**

BUSD not supported anymore as on-ramp and swap cryptocurrency.

BUSD off-ramp will remain available until 2023.12.31.

We invite all users to use USDT on BNB Chain instead of BUSD.

**2023.08.18**

Improved iframe loading speed performance. Please add **loading="lazy"** in your iframe code to apply changes.

**2023.07.27**

Instant EUR/GBP bank transfers are now also available for off-ramps.

GBP transactions are now only available through instant transfers, and therefore only available to users who have verified their identity with us.

**2023.07.26**

The base referral earning rate in [Revenue sharing](/service-information/revenue-sharing) has been increased from 15% to 25%.

**2023.07.25**

**CAD discontinued:** Our banking partner is discontinuing the support of the Canadian Dollar (CAD), therefore it isn't possible to buy or cash out crypto in that currency anymore. Our service remains available to Canadian users through other currencies (USD, EUR, etc.).

**2023.07.07**

* **Card purchases offline:** The possibility to buy crypto by card is temporarily unavailable, while we migrate to a new card payment service provider with better coverage.
* **AUD discontinued:** Our banking partner is discontinuing the support of the Australian Dollar (AUD), therefore it isn't possible to buy or cash out crypto in that currency anymore. Our service remains available to Australian users through other currencies (USD, EUR, etc.).
* The support of the Fantom network is suspended.

**2023.06.15**

Removed the delivery fee to buy BTC and ETH (mainnet).

Added support for new stablecoins in [Chains and currencies](/service-information/chains-and-currencies):

* EUROC on Avalanche
* EUROe on Arbitrum, Avalanche, Ethereum and Polygon
* USDC (native) on Arbitrum
* crvUSD on Ethereum

**2023.06.13**

Launching the new **swap** feature, enabling crypto-to-crypto and cross-chain exchanges.

**The swap tab is hidden by default in the widget, to show it you must use the 'tabs' parameter with the 'swap' value.**

Swap pricing added in [Pricing & limits](/service-information/pricing-and-limits).

New customization parameters in [Parameters and customization](/integration-guides/parameters-and-customization):

| Parameter | Value          | Description                                |
| --------- | -------------- | ------------------------------------------ |
| wsc       | *crypto codes* | Swap tab source currency                   |
| wdc       | *crypto codes* | Swap tab destination currency              |
| wsa       | number         | Swap tab source amount                     |
| wda       | number         | Swap tab destination amount                |
| bsa       | number         | Buy tab source amount                      |
| bda       | number         | Buy tab destination amount                 |
| ssa       | number         | Sell tab source amount                     |
| sda       | number         | Sell tab destination amount                |
| snet      | *network*      | Source network, for sell and swap tabs     |
| dnet      | *network*      | Destination network, for buy and swap tabs |

If both \*sa and \*da parameters are used, \*sa prevails.

**2023.05.19**

Added new [Informational APIs](/integration-guides/informational-apis) section with the followings APIs:

* API for unsupported countries
* API for supported chains and assets
* API for fees and exchange conversion result

**2023.05.15**

Lowered network delivery fees in [Pricing & limits](/service-information/pricing-and-limits).

**2023.05.08**

Updated network delivery fees in [Pricing & limits](/service-information/pricing-and-limits).

**2023.03.15**

We now support **instant EUR and GBP transfers** through the SEPA Instant and Faster Payments networks, more info here: <https://www.mtpelerin.com/blog/introducing-instant-transfers>

**2023.02.17**

Removed on-ramp support for:

* jCHF on Gnosis Chain
* jEUR on BNB Chain, Gnosis Chain

Added on-ramp support for jGBP on Polygon.

**2023.01.26**

Added the support of Bitcoin Lightning ⚡️ in [Chains and currencies](/service-information/chains-and-currencies)and [Parameters and customization](/integration-guides/parameters-and-customization).

**2023.01.25**

Added the 'chain' parameter in [Parameters and customization](/integration-guides/parameters-and-customization), which is required to validate the address of a smart contract wallet (EIP1271).

**2023.01.11**

[Chains and currencies](/service-information/chains-and-currencies) update:

* The purchase of jEUR and jCHF on Polygon is available again.
* The purchase of jEUR and jCHF is not available on Avalanche anymore.
* The jEUR is now also available on Optimism.
* The agEUR is now available on Optimism.

**2022.12.22**

Removed the on-ramp support of jAUD, jJPY, jSEK and jZAR in [Chains and currencies](/service-information/chains-and-currencies) (off ramp still available).

**2022.12.13**

Buying crypto by card now requires KYC. KYC-less limits still apply to bank transfer transactions.

**2022.12.09**

Added Cuba to the list of non supported countries in [Unsupported countries](/service-information/unsupported-countries).

**2022.12.08**

We are temporarily pausing the ability to buy the jCHF, jEUR and jGBP stablecoins on Ethereum and Polygon due to liquidity issues at Jarvis Network. Cash outs remain available for them.

We have reactived on-ramp for the jAUD, jCAD, jSEK, jSGD and jZAR stablecoins.

**2022.12.05**

Updated [Pricing & limits](/service-information/pricing-and-limits)with the new MPS fee reduction program, removed free Jarvis jFiat pricing.

**2022.11.30**

New revenue sharing program! More info in [Revenue sharing](/service-information/revenue-sharing)

**2022.11.28**

* We are temporarily pausing the ability to buy the jAUD, jCAD, jGBP, jJPY, jSEK, jSGD and jZAR stablecoins due to liquidity issues at Jarvis Network. Cash outs remain available for them, as well as purchases of jCHF and jEUR.
* [Unsupported countries](/service-information/unsupported-countries) update: According to updates in Swiss sanctions, we do not accept Russian citizens and residents of Russia as clients of our crypto-fiat exchange service anymore.
* Users can now validate a Bitcoin address by signing a message with a Ledger or with a Trezor, instead of having to do a Satoshi test (verification transaction).

{% hint style="warning" %}
If you have integrated the widget as an iframe, make sure to add allow="usb" in the iframe tag to enable hardware wallet signing.
{% endhint %}

**2022.10.18**

* Portuguese UI display parameter now available in [Parameters and customization](/integration-guides/parameters-and-customization)
* Dark mode now available in [Parameters and customization](/integration-guides/parameters-and-customization)
* New 'ctry' parameter to set default phone country code in [Parameters and customization](/integration-guides/parameters-and-customization)
* Frame wallet support
* If the 'tabs' parameter is used, the buy/sell nav menu is now hidden
* The "Transfer crypto" screen now switches to a confirmation screen when the user's crypto transaction is detected

**2022.10.11**

Updated card pricing in [Pricing & limits](/service-information/pricing-and-limits)

**2022.09.30**

Added support for new cryptocurrencies in [Chains and currencies](/service-information/chains-and-currencies)

* EUROC on Ethereum
* LUSD on Ethereum, Optimism
* XCHF on Ethereum, Optimism

**2022.06.23**

Reduced in [Pricing & limits](/service-information/pricing-and-limits) the delivery fee for purchases on Ethereum L1 from $10 to $1 for ETH, $25 to $5 for other tokens.

Added new integration support channel in [Support](/additional-information/support)

**2022.06.17**

Increased minimum cash out amount from CHF 25 to CHF 50 (or equivalent in other currencies) in [Pricing & limits](/service-information/pricing-and-limits)

**2022.06.09**

Increased max. limit to buy crypto by card from CHF/EUR 200 to 5,000 per transaction for users who have completed their identification.

Other users can still buy crypto by card without KYC up to CHF/EUR 200 per transaction.

**2022.06.02**

Users wishing to buy/sell amounts that are above our KYC-less thresholds can now pass their KYC directly in the widget without leaving the interface. Users don't need to download Bridge Wallet to pass their KYC anymore.

**2022.05.17**

Removed UST from supported [Chains and currencies](/service-information/chains-and-currencies)

**2022.05.06**

Added support for USDT on RSK in [Chains and currencies](/service-information/chains-and-currencies)

**2022.04.25**

Added support for new cryptocurrencies in [Chains and currencies](/service-information/chains-and-currencies):

* agEUR on Ethereum, Polygon
* EURL on Tezos
* EURS on Ethereum, Polygon
* EURT on Ethereum, Polygon
* FRAX on Avalanche, Ethereum, Fantom, Polygon
* jCHF, jEUR on Avalanche, Gnosis Chain
* MAI on Avalanche, Fantom, Polygon
* UST on Avalanche, Ethereum, Fantom, Polygon

**2022.03.30**

* Added Swiss QR bill support : when receiving their on-ramp bank transfer information, Swiss users can now use QR code to automatically enter our coordinates in their e-banking system. The QR codes can also be used to pay in cash at any Swiss post office.
* Removed support for AED, CZK, HUF, ILS, MXN, PLN, RON, THB, TRY as off-ramp fiat currencies

**2022.03.25**

* New 'mylogo' parameter in [Parameters and customization](/integration-guides/parameters-and-customization) to add your own logo in the widget's footer left of "powered by Mt Pelerin"

**2022.03.21**

* Removed GBP and USD for card purchase settlements.

**2022.03.18**

* Corrected DOC into RDOC

**2022.03.17**

* You can now automatically supply the user's receiving and sending public address with new 'addr', 'code' and 'hash' parameters, see [Parameters and customization](/integration-guides/parameters-and-customization) for more information.
* Added support for the RSK network with DOC, RBTC and RIF in [Chains and currencies](/service-information/chains-and-currencies)
* Added jAUD, jJPY and jSEK on Polygon in [Chains and currencies](/service-information/chains-and-currencies)
* Added jZAR on BNB Chain in [Chains and currencies](/service-information/chains-and-currencies)

**2022.03.16**

* UI/UX improvements:
  * Users can now easily copy-paste our bank account coordinates on mobile
  * A warning message informing the user that he/she will need to pass KYC is now displayed in the calculator input field if an amount of CHF 1,000 or above (or equivalent) is entered
* Transaction notification emails are now sent in the same language as the interface
* Removed Ukraine from the list of unsupported countries in [Unsupported countries](/service-information/unsupported-countries)

**2022.03.14**

* Clarified how to use *primary* and *success* parameters in [Parameters and customization](/integration-guides/parameters-and-customization)

**2022.03.11**

* Improved UI/UX of phone, email, wallet selection and registration status screens.

**2022.03.10**

* Added the "tabs" parameter in [Parameters and customization](/integration-guides/parameters-and-customization), which can be used to only display the "Buy" or the "Sell" tab of the interface
* Removed RUB from supported fiat currencies

**2022.03.09**

* Renamed Binance Smart Chain into BNB Chain
* Updated BNB Chain network icon
* Updated BNB token icon

**2022.03.08**

* Removed Bridge Wallet mentions in notification emails

**2022.03.03**

* Corrected rates for cash outs in other currencies on [Pricing & limits](/service-information/pricing-and-limits#by-bank-transfer-1)

**2022.03.01**

* Official launch!
* <https://twitter.com/mtpelerin/status/1498626956698750976>

**2022.02.25**

Added new parameters in [Parameters and customization](/integration-guides/parameters-and-customization):

* nets: allows you to control the list of available networks
* curs: allows you to control the list of available fiat currencies
* crys: allows you to control the list of available cryptocurrencies
* success: allows you to control the CTA color

**2022.02.23**

* Removed the 50 minimum purchase by card in [Pricing & limits](/service-information/pricing-and-limits#by-card)
* Updated commission structure for card payments in [Pricing & limits](/service-information/pricing-and-limits#by-card)
* Added a CHF1.20 (or equivalent) fixed fee for card payments in [Pricing & limits](/service-information/pricing-and-limits#by-card)

**2022.02.21**

* **Official launch date: March 1st 2022**
* Added jCHF, jEUR and jGBP support on the Binance Smart Chain network in [Chains and currencies](/service-information/chains-and-currencies)
* Added a mention in [Payment methods](/service-information/payment-methods#debit-and-credit-cards) that we do not accept payments from cards issued to a company.&#x20;

**2022.02.17**

* Created the changelog page
* Removed the 50 minimum purchase by bank transfer in [Pricing & limits](/service-information/pricing-and-limits)
* Added a 50 minimum purchase by card in [Pricing & limits](/service-information/pricing-and-limits)
* Added AUD, DKK, HKD, JPY, NOK, NZD, SEK, ZAR as new on ramp currencies in [Chains and currencies](/service-information/chains-and-currencies) (SWIFT transfers)


# FAQ

The most frequent questions we get about integrating our service

### **What is the cost of integrating Mt Pelerin?**

There is no setup cost nor any recurring cost to integrate us. The only thing we charge is the conversion commission to end users, described in [Pricing & limits](/service-information/pricing-and-limits).

### **What is the timeline to integrate Mt Pelerin?**

The timeline depends on the [Integration methods](/integration-guides/integration-methods)you choose.

### How to go live with a Mt Pelerin integration?

Simply request an integration key at <hello@mtpelerin.com>, we will give it to you right away once we have reviewed your web or mobile app. Once you have your key, you can immediately go live.


# Introduction

Bridge Protocol is a multi-chain, non-custodial framework to issue asset tokens and manage their compliance on public blockchains.

Bridge Protocol is a multi-chain, non-custodial framework to issue asset tokens and manage their compliance on public blockchains.

It is an advanced and comprehensive tool to create tokenized securities that must comply with off-chain regulation. Its scope covers the entire lifecycle management of a security, including issuance, distribution, transfer management and corporate actions.

The purpose of this documentation is to present the overall architecture of Bridge Protocol, as well as to provide some guidance on how to use it.

![Bridge Protocol overview](https://4178755310-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MQS1SlWkq9LF5wAe13q%2Fuploads%2Fh8a1jTZCIwm9HAEZp0FC%2Fbridge-protocol-overview.svg?alt=media\&token=1855e1fc-7f60-4ea5-8c0c-c486d19119c9)


# Overview

Bridge Protocol is an open source technology designed to issue and manage digital assets on public blockchains.

Bridge Protocol is an open source technology designed to issue and manage digital assets on public blockchain, i.e. security tokens (tokens that represent ownership of an underlying asset).

Unlike utility tokens, for which transfer is most of the time unrestricted, security tokens are subject to transferability restrictions based on many factors (identity, asset class, local rules, transfer history, etc.) dictated by financial regulations.

Most of security token middlewares use a token-based approach to enforce such transfer restriction rules. This concept is a good step towards regulation, but lack cross-token capabilities to apply rules that are computed across multiple tokens (global transfer thresholds, for example).

The purpose of Bridge Protocol is to provide a solution to this problem by offering a cross-token compliance layer that can restrict the transferability of ERC-20 compliant tokens based on a set of rules. Those rules are managed by the issuer, who can set new rules whenever needed.

Moreover, for regulatory compliance reasons, Bridge Protocol provides features that would allow authorities to transfer tokens from one address to another in case of exceptional events (loss of keys, legal constraints, locked assets, etc.).

![Bridge Protocol v2 overview](https://4178755310-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MQS1SlWkq9LF5wAe13q%2F-MQc2txxNwlUPKZ4dXJw%2F-MQc310MCOJmhxy-Rz6V%2Foverview.png?alt=media\&token=853e3037-a124-4431-869d-05eccb4111b6)

The Github repository for Bridge Protocol v2 [can be found here](https://github.com/MtPelerin/bridge-v2).

## Supported networks

Bridge Protocol acts as a layer deployed as a set of smart contracts on top of a blockchain that is compatible with Ethereum Virtual Machine (EVM).

Today, Bridge Protocol is available on the following networks:

* Ethereum:
  * Mainnet
  * Ropsten
  * Goerli
  * Kovan
  * Ganache (local)
* Binance Smart Chain:
  * Mainnet
  * Testnet
* Gnosis:
  * Mainnet
  * Testnet (Sokol)
* Polygon:
  * Mainnet
  * Testnet
* Tezos:
  * Mainnet (coming soon)
  * Testnet
  * Flextesa (local)

## Contract architecture diagram

![](https://4178755310-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MQS1SlWkq9LF5wAe13q%2F-MQc2txxNwlUPKZ4dXJw%2F-MQc43VjWnkVGCHJWS1w%2Farchitecture.png?alt=media\&token=e5d2a51c-4d54-4c20-b947-2bd92bc8f6b5)


# Bridge token

The token part of Bridge Protocol is the interface used by third parties to interact with the token through the different stages of its lifecycle.

The token part of Bridge Protocol is the interface used by third parties to interact with the token through the different stages of its lifecycle (issue/redeem, approvals, transfers, etc.).

The token has a single owner, one or multiple administrators, one or multiple issuers, and one or multiple seizers.

As we want Bridge Protocol to be as open as possible, the token issuer will have the opportunity to define trusted intermediaries that will act as the compliance authorities for given tokens. The role of the compliance authority is to maintain the compliance registry and make sure that the information stored in the compliance registry are accurate.

The token is registered with a Processor that will process all operations centrally. Having a single Processor for all tokens facilitates maintenance over a token's lifecycle, as it is not necessary to upgrade tokens to be able to add new features or new restrictions to them.

Every token issued with Bridge Token is compliant with the following standard proposals:

* [ERC-20](https://eips.ethereum.org/EIPS/eip-20)
* [ERC-2612](https://eips.ethereum.org/EIPS/eip-2612)
* [ERC-3009](https://eips.ethereum.org/EIPS/eip-3009)

## Proxy and logic

All the token contracts that are deployed with Bridge Protocol are in the form of proxy + logic. The proxy is what contains the data storage, while the logic contains how one interacts with the data storage. The purpose of this approach is to:&#x20;

* Be able to update the logic of a token without having to redeploy its data storage and needing your users to migrate to a new token.
* Re-use a previously deployed logic for a new token, which saves you the cost of re-deploying a logic each time you create a new token.


# Rule engine

Bridge Protocol's rule engine is a library of rules that can be used by the token issuer to control how a token can be transferred or not.

## Overview

The Rule Engine is a library of rules that can be used by the token issuer to control how a token can be transferred or not. As regulations evolve, new rules can be added to the Rule Engine and the token issuer will be able to enforce them to adapt its compliance.

Trivial rules like maximum transfers or minimum transfers will not need to have interactions with other contracts. For more complex rules that need information about the identity linked to an address or the history of transfers linked to an address, two contracts are currently provided: Compliance Registry and Price Oracle.

## Rule specifications

Each rule in the Rule Engine has to implement the IRule interface:

```
  function isTransferValid(
    address _token, address _from, address _to, uint256 _amount, uint256 _ruleParam)
    external view returns (uint256 isValid, uint256 reason);
  function beforeTransferHook(
    address _token, address _from, address _to, uint256 _amount, uint256 _ruleParam)
    external returns (uint256 isValid, address updatedTo, uint256 updatedAmount);
  function afterTransferHook(
    address _token, address _from, address _to, uint256 _amount, uint256 _ruleParam)
    external returns (bool updateDone);
```

**isValid allowed values**

* **TRANSFER\_INVALID** = 0 - *Returned when the transfer is invalid*
* **TRANSFER\_VALID\_WITH\_NO\_HOOK** = 1 - *Returned when the transfer is valid and no further action is needed*
* **TRANSFER\_VALID\_WITH\_BEFORE\_HOOK** = 2 - *Returned when the transfer is valid and the `beforeTransferHook` function of the same rule has to be called*
* **TRANSFER\_VALID\_WITH\_AFTER\_HOOK** = 3 - *Returned when the transfer is valid and the `afterTransferHook` function of the same rule has to be called*

## Rules library

### 0 - Global freeze

This rule is the big red button. It allows you to freeze all tokens in case of emergency.

### 1 - User freeze

This rule allows you to freeze all the tokens of specific addresses.

### 2 - Sender KYC

This rule allows you to submit a transaction to the condition that the transaction sender must have a minimum KYC level. Useful if your compliance framework works with multiple user KYC/AML levels or limits.

### 3 - Recipient KYC

This rule allows you to submit a transaction to the condition that the transaction recipient must have a minimum KYC level. Useful if your compliance framework works with multiple user KYC/AML levels or limits.

### 4 - User valid

This rule allows you to check whether a user address has been recorded on any whitelist.

### 5 - Hard transfer limit

This rule allows you to define a maximum value of tokens (in terms of its reference currency) that can be transferred by a user. It applies to all your tokens. If a user tries to make a transaction that will make him/her exceed that limit, the user will get an error message and will be prevented to initiate the transaction.

### 6 - Soft transfer limit

This rule allows you to define a maximum value of tokens (in terms of its reference currency) that can be transferred by a user. It applies to all your tokens. If a user makes a transaction that will make him/her exceed that limit, the transaction will go through but will be rerouted to one of your KYC providers. The KYC provider address will be able to perform any required KYC/AML check, and then approve or reject the transaction.

### 7 - Maximum transfer amount

This rule allows you to define a maximum amount of tokens that can be transferred by a user.

### 8 - Minimum transfer amount

This rule allows you to define a minimum amount of tokens that must be transferred by a user.

### 9 - Recipient and sender KYC

This rule allows you to submit a transaction to the condition that the both the transaction sender and recipient must have a minimum KYC level. Useful if your compliance framework works with multiple user KYC/AML levels or limits.

### 10 - Address threshold lock

This rule allows you to lock tokens on an address, but only above a given threshold. Typically useful for shareholder agreements, vesting periods, etc.

### 11 - Recipient attribute valid

This rule allows you to whitelist a given user for one or several specific tokens only.

## Adding new rules

You can add any rule you want to Bridge Protocol and its Rule registry, and then add it to your token by using the rule number. Please note that any rule that you add yourself will not automatically appear in the [app interface](https://bridge.mtpelerin.com/). To have it listed in the interface dropdown menu, please [contact us](https://www.mtpelerin.com/contact).


# Compliance registry

Bridge Protocol's compliance registry is responsible of the storage of all identity information linked to an address or the storage of the history of transfers linked to an address.

## KYC/AML providers

Bridge Protocol is a tool to enforce and manage on-chain compliance rules that come from off-chain regulation. Therefore, someone needs to be the link between both worlds, updating on-chain what has been validated off-chain. We call that entity a KYC/AML provider.

Bridge Protocol supports compliance delegation, i.e. enabling multiple KYC/AML providers to work on the same token. For example, if your token is distributed to both US investors and European investors, you can have a US provider managing the compliance of US investors, and a European provider managing the compliance of European investors.

* A KYC/AML provider can be yourself and/or third-party entities.
* A token can have as many providers as you want.
* You can add and remove providers to a token at any time.

{% content-ref url="/pages/-MQgIUSQkm0TEF0Pmm1j" %}
[KYC/AML provider workflow](/bridge-protocol/guides/kyc-aml-provider-workflow)
{% endcontent-ref %}

## Compliance registry

The Compliance Registry is responsible of the storage of all identity information linked to an address or the storage of the history of transfers linked to an address. The compliance registry is managed by trusted intermediaries, the KYC/AML providers. Each trusted intermediary has its own space within the registry to update its own address related information. Based on the token trusted intermediaries, the Compliance Registry will return the compliance information that have been updated by one of the token trusted intermediary.

{% hint style="info" %}
The Compliance Registry is designed to store only pseudo-anonymized data (no Customer Identification Data).
{% endhint %}

To be able to maintain a single reference currency for transfers history, the Compliance Registry will use the Price Oracle.

## Attributes nomenclature

Attributes is an array of uint256.

| Attribute ID | Attribute name                      | Attribute description                                          |
| ------------ | ----------------------------------- | -------------------------------------------------------------- |
| 0            | **ATTRIBUTE\_VALID\_UNTIL**         | User validity end date (*UNIX timestamp*)                      |
| 100          | **ATTRIBUTE\_USER\_KYC**            | User KYC level                                                 |
| 110          | **ATTRIBUTE\_AML\_TRANSFER\_LIMIT** | User single transfer limit in referrence currency              |
| 111          | **ATTRIBUTE\_AML\_MONTHLY\_LIMIT**  | User monthly transfer limit in referrence currency             |
| 112          | **ATTRIBUTE\_AML\_YEARLY\_LIMIT**   | User yearly transfer limit in referrence currency              |
| 120          | **ATTRIBUTE\_FREEZE\_DIRECTION**    | User freeze direction                                          |
|              | *FREEZE\_DIRECTION\_NONE (0)*       | Not frozen                                                     |
|              | *FREEZE\_DIRECTION\_RECEIVE (1)*    | Frozen as token receiver                                       |
|              | *FREEZE\_DIRECTION\_SEND (2)*       | Frozen as token sender                                         |
|              | *FREEZE\_DIRECTION\_SEND (3)*       | Frozen as token sender                                         |
|              | *FREEZE\_DIRECTION\_BOTH (4)*       | Frozen as token sender and receiver                            |
| 121          | **ATTRIBUTE\_FREEZE\_START**        | User freeze start date (*UNIX timestamp*)                      |
| 122          | **ATTRIBUTE\_FREEZE\_END**          | User freeze end date (*UNIX timestamp*)                        |
| 123          | **ATTRIBUTE\_FREEZE\_INVERTED**     | Specifies if start date and end date period has to be inverted |
|              | *FREEZE\_INVERTED\_NO (0)*          | Freeze period not inverted                                     |
|              | *FREEZE\_INVERTED\_YES (1)*         | Freeze period inverted                                         |
| 130          | **ATTRIBUTE\_WHITELISTED**          | Global whitelist flag                                          |
|              | *WHITELISTED\_NO (0)*               | User not whitelisted                                           |
|              | *WHITELISTED\_YES (1)*              | User whitelisted                                               |


# Security and audits

Useful information about Bridge Protocol's audits and bug reporting practices.

## Audits

| Object               | Auditor                                                                                           | Audit type     | Date              |
| -------------------- | ------------------------------------------------------------------------------------------------- | -------------- | ----------------- |
| Bridge Protocol v2.0 | [ChainSecurity](https://www.mtpelerin.com/docs/bridge-protocol-v2-chainsecurity-audit-report.pdf) | Smart contract | 30 September 2019 |

## Bug bounty

We have a bug bounty program hosted on bug bounty platform Immunefi, which rewards security vulnerabilities found in Bridge Protocol v2.&#x20;

[More information on the bug bounty on Immunefi's website](https://immunefi.com/bounty/mtpelerin/).


# Changes from v1 to v2

Key differences between Bridge Protocol v1 and v2.

Bridge Protocol v2 is a major overhaul of the v1, whose purpose was to bring Bridge Protocol from a then experimental tool to a truly institutional-grade solution to manage digital securities on the blockchain.

The table below shows an overview of the key differences between the two versions:

|                        | Bridge Protocol v1 | Bridge Protocol v2 |
| ---------------------- | ------------------ | ------------------ |
| Token upgradability    | ❌                  | ✅                  |
| Multi-asset compliance | ❌                  | ✅                  |
| Governance features    | ❌                  | ✅                  |
| Gas optimization       | ❌                  | ✅                  |
| Compliance delegation  | ❌                  | ✅                  |
| User interface         | ❌                  | ✅                  |
| Multi-chain            | ❌                  | ✅                  |


# Creating a new token

Tutorial on how to use Bridge Protocol to configure and deploy a new tokenized asset.

In this tutorial, we guide you through the creation of a new token using Bridge Protocol.

As it was designed for creating security tokens, Bridge Protocol is ideal to setup and deploy the following types of assets:

* Share tokens
* Bond tokens
* Fiat-pegged tokens
* Real-world asset backed tokens

We strongly recommend to start by creating a Testnet token in order to familiarize yourself with the Bridge Protocol platform.


# 1. Choosing a network

Tutorial on how to use Bridge Protocol to configure and deploy a new tokenized asset - Part 1: Choosing a network

Start by choosing on which network you want to create your new token, through the "Network" dropdown menu on the bottom left of the app.

Currently available networks are:

### Ethereum

* Mainnet
* Ropsten (Testnet)
* Goerli (Testnet)
* Kovan (Testnet)
* Ganache (local)

### Binance Smart Chain

* BSC Mainnet
* BSC Testnet

### Gnosis

* Gnosis Mainnet
* Gnosis Testnet (Sokol)

### Polygon

* Polygon Mainnet
* Polygon Testnet

### Tezos

* Tezos Mainnet (soon)
* Tezos Testnet
* Flextesa (local)


# 2. Connecting an address

Tutorial on how to use Bridge Protocol to configure and deploy a new tokenized asset - Part 2: Connecting an address

To deploy a new token you will need to sign transactions on the selected blockchain, which is why the first step is to connect an address.

Bridge Protocol currently supports the following methods to connect an address:

**WalletConnect (EVM only)**

* [How to use WalletConnect](https://www.mtpelerin.com/faq/how-to-use-walletconnect)

**Hardware wallets (EVM only):**

* Trezor
* Ledger
* Ledger (legacy)

**Others:**

* Seed phrase
* Private key

{% hint style="info" %}
The seed phrase and private key methods are only here to facilitate your Testnet experiments, **you should never use them to deploy a token in production** (Mainnet).
{% endhint %}


# 3. Managing aliases

Tutorial on how to use Bridge Protocol to configure and deploy a new tokenized asset - Part 3: Managing aliases

With aliases, Bridge Protocol lets you give human-readable names to the multiple addresses contained in your seed phrase.

With this system, you can organize names for different addresses according to the needs of your workflow and facilitate your overall interaction with Bridge Protocol.

## Creating a new alias

To create a new alias, click on the alias icon at the bottom left of the screen, then on the "Add new alias" button.

**ID (first address):** This will display the first address of the default derivation path of your hardware wallet / seed phrase. That address will serve as the identifiant for the whole hardware wallet / seed phrase.

**Alias:** Here you can give any name that you want to the address.

**Derivation path:** Choose a new derivation path to get a new address.

**Address:** The address that is derived from the derivation path chosen above.

{% hint style="info" %}
You can add, edit and delete aliases at any time.
{% endhint %}

![Example of aliases](https://4178755310-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MQS1SlWkq9LF5wAe13q%2F-MQlgx9DQQbCMjE51baq%2F-MQliRIKWzYaNGdr-RD2%2Faliases.jpg?alt=media\&token=833aa5d7-6839-4999-a73c-3731464f9b56)

## Importing aliases

You can import aliases with a JSON file structured like this example:

```
[{"derivePath":"m/44'/1'/0'/0/0","id":"0x11f248151c4843c9fd02eb372f6eb7d319197d9e","address":"0x11f248151c4843c9fd02eb372f6eb7d319197d9e","name":"Signer address"},{"derivePath":"m/44'/1'/0'/0/01","id":"0x11f248151c4843c9fd02eb372f6eb7d319197d9e","address":"0xc03460a8e0b97099edba59078574154548eb6142","name":"Owner address 1"},{"derivePath":"m/44'/1'/0'/0/02","id":"0x11f248151c4843c9fd02eb372f6eb7d319197d9e","address":"0x9a5c42fedef3bcee281d8df2e54a0442ff04a63f","name":"Compliance manager 1"}]
```


# 4. Generating the token contract

Tutorial on how to use Bridge Protocol to configure and deploy a new tokenized asset - Part 4: Generating the token contract

## Setting up your token

Once you have chosen your network and connected your address, the next step is now to configure your token by clicking on Tokens > Issue new token.

Fill all the relevant fields according to the instructions below:

**Signer address (mandatory):** The address that will deploy the token contract and that will be the token proxy administrator. See [Bridge token](/bridge-protocol/bridge-protocol/bridge-token#proxy-and-logic) for more information.

**Default owner address (mandatory):** The address that will be the owner of the token.

**Token name (mandatory):** The name you want to give your token, for example *Mt Pelerin Shares*.

**Token symbol (mandatory):** The symbol (ticker) you want to give your token, for example *MPS*.

**Decimals** **(mandatory):** The number of decimals you want your token to have. For example *0* if you are creating a token representing an asset that is not divisible (e.g. 1 token = 1 company share).

* Possible range: 0 to 18 decimals.

**Previously deployed logic (optional):** Choose a logic contract that you have previously deployed to spare the cost of re-deploying an identical one. Leave blank if you have no previously deployed logic. See [Bridge token](/bridge-protocol/bridge-protocol/bridge-token#proxy-and-logic) for more information.

**Total supply (mandatory for pre-mint):** The total amount of tokens that you want to create, for example *10000000*.

* Total supply is not finite, you can increase or decrease the total supply of your token later on.
* Entering a total supply is optional if you won't pre-mint tokens (see "Pre-mint?" below).

**Percentage of shares tokenized (mandatory):** This value is informative only, in the case you are issuing tokens representing shares of a company. Leave the default 100 value if it doesn't apply to you.

**Reference currency (mandatory):** The reference currency that will be used by the [rules engine](/bridge-protocol/bridge-protocol/rule-engine) to enforce the compliance limits for a given user across multiple currencies.

**KYC providers addresses (optional):** Input one or more addresses (separated by a comma) of the entities that will manage the compliance of your token. See [Compliance registry](/bridge-protocol/bridge-protocol/compliance-registry#kyc-aml-providers) for more information. You can add KYC providers later on.

**Rules (optional):** Choose the rules to define how your token can be transferred or not. See [Rules engine](/bridge-protocol/bridge-protocol/rule-engine) for more information.

* You can add and remove rules to your token at any time
* You need to add at least one rule before deploying your token

**Lots (optional):** You can divide your total supply into different lots with different purposes (locked vs. unlocked tokens, private sale tokens, public sale tokens, etc.). You can create lots later on. Please note that if you don't create a first lot now, no tokens will be minted when generating contracts.

* **Percentage:** Percentage of the total supply attributed to the lot.
* **Vault:** Address where the newly created tokens will be stored.
* **Minter:** Address that will issue (mint) the new tokens.

**Sales (EVM only):** You can schedule one or several automated token sales with these smart contracts. A user sending ETH to a token sale will automatically receive his/her tokens in return. You can create sales later on.

* **Start:** the date and time of the opening of the token sale.
* **End:** the date and time of the end of the token sale.
* **Price:** the price for one token, in the referrence currency chosen above.
* **Lot:** the sale will sell tokens from that specific lot only.
* **ETH vault:** the address where the ETH proceeds of the sale will be sent.

**Pre-mint? (optional):** If ticked, the tokens will be minted at the same time as the deployment of the token contract.

## Generating the token contracts

Once all the relevant parameters above have been chosen, you can proceed an deploy the token by clicking on the "Generate contracts" button at the bottom of the screen.

{% hint style="info" %}
Before clicking on the "Generate contracts" button, make sure to first set a proper gas price and gas limit at the bottom left of the screen for EVM networks (> 8 000 000) or the proper fee for Tezos network (> 1 000 000)
{% endhint %}

{% hint style="info" %}
Deploying a token can be slow, especially if you don't re-use a previously deployed logic. Please allow up to several dozen minutes.
{% endhint %}

## Previously unfinished deployments

After having clicked on "Generate contracts", if the contract deployment is interrupted for any reason (sudden spike of gas price, for instance) you will be able to resume it later.

In such case, a "Previously unfinished deployements" menu will appear right below "Signer address". You will be able to select the interrupted deployment and resume it.

In this way, you won't lose the gas already spent before the interruption of the deployment.

## EVM Token deployment cost

In order to generate the token contracts, you will need to have prepared beforehand enough ETH to pay for the deployment gas costs. Here's how to calculate the amounts you will need for your first token:

### Signer address

$$
(10,000,000\*x)/1,000,000,000 = y
$$

### Default owner address

$$
(800,000\*x)/1,000,000,000 = y
$$

x = Current gas price (see <https://etherscan.io/gastracker> or <https://ethgasstation.info/>

y = Amount of ETH to prepare

Ulterior token deployments will consume less gas if you re-use a previously deployed logic.

{% hint style="success" %}
Congratulations, you have successfully created a new token! The next guide will show you how to interract with it.
{% endhint %}


# Managing a token

Tutorial on how to interact with a tokenized asset deployed with Bridge Protocol.

Now that you have created your first token [with the previous guide](/bridge-protocol/guides/creating-a-new-token), we will now show you everything you can do with it through [Bridge Protocol's web interface](https://bridge.mtpelerin.com/).


# Sending tokens

Tutorial on how to interact with a tokenized asset deployed with Bridge Protocol - Part 1: Sending tokens

## Normal send

On the "Tokens" screen, click on the "Send token" icon. You will be able to manually send tokens to a single recipient by choosing:

**Signer address:** The address authorized to send the tokens.

**Transfer from another address:** Option to send tokens from a specific sender address, which must have been given allowance to do so beforehand.

**Recipient address:** the wallet address of the recipient to who you want to send tokens.

**Amount:** the amount of tokens you want to send.

## Bulk send

On the "Tokens" screen, click on the "Bulk token" icon. You will be able to send tokens to multiple recipients at once by choosing:

**Signer address:** The address authorized to send the tokens.

**File:** The CSV file containing the list of recipients for your bulk send. The file must contain the following mandatory columns:

| Column    | Type   | Description                                   |
| --------- | ------ | --------------------------------------------- |
| from      | text   | Sender address                                |
| to        | text   | Recipient address                             |
| contract  | text   |                                               |
| quantity  | number | The amount of tokens to send to the recipient |
| token\_id | number |                                               |
| hash      | text   | The transaction hash, can be left empty       |

Extra columns can be added with any data needed, for instance customer ID or order ID from your own management system.

**Bulk send method:**&#x20;

* **Bridge:** use for Bridge tokens
* **Disperse.app:** use for other ERC-20 tokens

**Max group length:** The maximum amount of recipients from your list that you want to send tokens to in a single transaction. For example, a max group length of 50 and a list file of 150 recipients will result in 3 transactions to 50 recipients each.

**Execution type:** How you want multiple transactions to be executed:

* **Serie:** a transaction is only broadcasted when the previous one has been successfully mined by the network.
* **Parallel:** all transactions are broadcasted simultaneously.

**Sum amounts with same from and to:** If your file contains multiple transfers from the same sender to the same recipient, choose to make a single, consolidated transaction to that recipient.


# KYC/AML provider workflow

Tutorial on how to compliance operations work for a tokenized asset deployed with Bridge Protocol.

Coming soon


