# Introduction

About Mt Pelerin's crypto exchange service

## Welcome to the ultimate crypto-fiat gateway!

If you're looking for the best way to let your users easily buy, swap and cash out cryptocurrencies back in fiat, you've come to the right place!

<figure><img src="/files/EteE6goYy9iytNft8XV1" alt="Mt Pelerin on/off-ramp widget" width="465"><figcaption><p><a href="https://www.mtpelerin.com/buy-crypto">TRY IT HERE!</a></p></figcaption></figure>

We have been running our exchange service since 2020 through our non-custodial mobile app [Bridge Wallet](https://www.mtpelerin.com/bridge-wallet), and after having improved and fine-tuned its UI/UX through many iterations it is now available as a standalone interface. You can say it's been properly battle-tested!&#x20;

Long story short, you can easily add our exchange interface to your website or mobile app with a few lines of code:

💻 **Web integration:**

* [As a direct link](/integration-guides/web-integration#direct-link)
* [As an iFrame](/integration-guides/web-integration#iframe)
* [As a popup / modal window](/integration-guides/web-integration#popup-modal)

📱 **Mobile integration:**

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

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

### A few numbers first

* 🕺 150k+ 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 or inflated spread**: our interface is WYSIWYG at any given time.

### 🕵️‍♀️ No verification required

We are based in Switzerland and are an authorized 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 cash crypto in and out by bank transfer without having to verify their identity up to certain limits. Users can still pass their KYC with us to transfer without limits.

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

### 🛡 Data privacy

For users who pass KYC with us, we perform 100% of that process internally with our own staff in Switzerland, directly through our on/off ramp interface. We don't outsource any data to third parties and our users benefit that way from the data secrecy offered by Swiss law.

### 🔑 Self custodial

Our service is self custodial, that's the way crypto is meant to be! Users buy crypto directly onto a wallet that they own and control, and cash out crypto directly from those same wallets as well. Their keys, their coins!

### 🔗 Multi chain

Our service supports multiple networks, 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 on and off ramp 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.

### 💱 Swaps

Our swap feature is a great alternative for users who struggle to use DEX and bridges. Through it, all our supported cryptocurrencies can be swapped with each other, and across the 14 different chains that we support. End users can therefore easily swap, for instance, mainnet Bitcoin for Lightning sats, in a single transaction.

### 💰 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.

### ⚡️ 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.

### 🌎 Global

We're Swiss, but our service is international! Our interface is available in [multiple languages](/integration-guides/parameters-and-customization), and we support on and off ramp to/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 [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)!


# Getting started

Required 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 where you want to integrate our service.**

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 purchases by **card / Google Pay / Apple Pay** - which 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, contact us at <hello@mtpelerin.com>

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


# Web integration

How to add our exchange widget to your website

## Direct links

If you just want to redirect your users to our on/off-ramp widget, you can use one of following links on your website or in your mobile app :

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

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

**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 %}

## iFrame

To integrate our on & off ramp service as an iFrame on your website, add the following code in the HTML part of the target web page:

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

{% hint style="danger" %}
You must include the attributes **allow="usb; ethereum; clipboard-write; payment; microphone; camera" loading="lazy"** 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 on & off ramp 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({ lang: 'en' /* options */ });
```

{% 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 %}


# 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 integration

How to add our exchange interface to your mobile app

To integrate our on & off ramp service in your React Native mobile application, you can use our React Native package.

### 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 %}


# Parameters and customization

Customize your on / off ramp experience

The parameters presented in the following pages allow you to customize how our interface is displayed by default on your website or mobile app:

* [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)


# General parameters

| Parameter | Value                                                                                                                                                                                                                                                                                                      | Description                                                                                                                                                                             |
| --------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| \_ctkn    | string                                                                                                                                                                                                                                                                                                     | <p>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>                                                                                                                                                                                                                                                                                 | Allowed tabs.                                                                                                                                                                           |
| rfr       | string                                                                                                                                                                                                                                                                                                     | Your referral code (see [Revenue sharing](/service-information/revenue-sharing))                                                                                                        |
| 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>tezos\_mainnet<br>xdai\_mainnet</p><p>zksync\_mainnet</p> | Default network                                                                                                                                                                         |
| 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>tezos\_mainnet<br>xdai\_mainnet</p><p>zksync\_mainnet</p> | List of authorized networks (leave empty for all).                                                                                                                                      |

{% 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 | Value                                                                                                                                                                                                                                                                                                      | 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>tezos\_mainnet<br>xdai\_mainnet</p><p>zksync\_mainnet</p> | Destination network, for buy and swap tabs                              |
| 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 | Value                                                                                                                                                                                                                                                                                                      | 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</p><p>tezos\_mainnet<br>xdai\_mainnet</p><p>zksync\_mainnet</p> | Source network, for sell and swap tabs                    |

\*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.

{% hint style="warning" %}
**The swap tab is hidden by default, to activate it you must use the 'tabs' parameter with the 'swap' value.**

**Example:&#x20;*****tabs=buy,sell,swap***
{% endhint %}

| Parameter | Value                                                                                                                                                                                                                                                                                                      | 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</p><p>tezos\_mainnet<br>xdai\_mainnet</p><p>zksync\_mainnet</p> | Source network, for sell and swap tabs     |
| 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>tezos\_mainnet<br>xdai\_mainnet</p><p>zksync\_mainnet</p> | Destination network, for buy and swap tabs |

\*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 end user's wallet address, so they can skip the steps where they have to select and validate their sending/receiving address.

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

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

**must be passed as:**

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

| Parameter | Value                                                                                                                                                                                                                       | Description                                                                                                                                                                                                        |
| --------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| addr      | public address                                                                                                                                                                                                              | Allows you to automatically provide the user's receiving or sending public address (the address has to be unique for each user, common addresses are not permitted and will be rejected)                           |
| code      | 4-digits code                                                                                                                                                                                                               | Random 4 digits code between 1000 and 9999 that you need to generate for each address supplied with the addr parameter (don't use the same code for all addresses or the validation will be rejected)              |
| hash      | #                                                                                                                                                                                                                           | base64 encoded signature of the following message: MtPelerin-\<code>. The private key used to sign the message has to be the one matching the public address given in addr. To test it, see **Test vector** below. |
| 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<br>xdai\_mainnet<br>zksync\_mainnet</p> | Optional, only required to validate the address of a **smart contract wallet** (EIP1271)                                                                                                                           |

#### Test vector

You can verify that your signature for the 'hash' parameter is correct by testing it with the following info:

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

or with the following info:

* 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=

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

#### Vanilla JS code with Metamask as signer

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

const fromBase64 = (str) =>
    atob(str).split('').map(function (c) { return c.charCodeAt(0); });

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

const toHexString = (bytes) =>
  bytes.reduce((str, byte) => str + byte.toString(16).padStart(2, '0'), '');

/* 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 code with ethers.Wallet as signer

```
const ethers = require('ethers');

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

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);
```

{% hint style="info" %}
If your signature implementation fails, make sure you have properly URL encoded the parameters.
{% endhint %}


# Branding parameters

Customize the swap screen of our interface.

{% 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                        |


# APIs

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

* [Transaction reporting API](/integration-guides/apis/transaction-reporting-api)
* [Price quote API](/integration-guides/apis/price-quote-api)
* [Unsupported countries API](/integration-guides/apis/unsupported-countries-api)
* [Supported chains and assets API](/integration-guides/apis/supported-chains-and-assets-api)


# Transaction reporting API

Query the list of transactions made by your users.

On request, we can setup for you an API that you can query to obtain the following information about transactions made with us through your integration:

* Transaction ID
* Transaction status
* Amount received
* Amount sent
* Reference
* Creation date
* Modification date


# 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"
}
```


# Revenue sharing

Earn revenue from your Mt Pelerin integration

You can earn **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 referral code that you can obtain from our mobile app [Bridge Wallet](https://www.mtpelerin.com/bridge-wallet). To get a custom code, please [contact us](https://www.mtpelerin.com/contact).

Your earnings will be automatically paid in **USDC** (Polygon) at the end of each month on your main Bridge Wallet address. You will also receive each month an activity summary email.

## Boost up to 50%

Add liquidity to the MPS 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 by our on / off ramp service.

## Supported networks & cryptocurrencies

{% 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://www.mtpelerin.com/#socialicons) 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
* **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
* **Tezos**
  * tzBTC - tzBTC
  * USDT - Tether USD
  * XTZ - Tezos
* **zkSync Era**
  * ETH - Ether
  * USDC - USDC
  * USDC.e - Bridged USDC

## Supported fiat currencies

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://www.mtpelerin.com/#socialicons) to stay informed when we do!

### ⬆️ On ramp fiat currencies

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

### ⬇️ Off ramp fiat currencies

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


# Payment methods

## ⬆️ 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
* **SEPA Instant** - For EUR transfers from the [SEPA zone](https://en.wikipedia.org/wiki/Single_Euro_Payments_Area) --> Free
* **SWIFT** - For transfers in any other currency --> 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**

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 will be used to off ramp from 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
* **SEPA Instant** - For EUR transfers to the [SEPA zone](https://en.wikipedia.org/wiki/Single_Euro_Payments_Area) --> Free
* **SWIFT** - For transfers in any other currency --> SWIFT fees apply, [more info here](/service-information/pricing-and-limits)


# Pricing & limits

## ⬆️ On ramp pricing

### 🏦 By bank transfer

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

| Volume per year     | Commission |
| ------------------- | ---------- |
| 0-499               | free       |
| 500-4,999           | 1.3%       |
| 5,000-49,999        | 1.1%       |
| 50,000-999,999      | 0.9%       |
| 1,000,000-9,999,999 | 0.7%       |
| 10,000,000+         | 0.6%       |

💡 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                          | 0                                                                                                                                    |
| Max. buy (SIC/SEPA/SWIFT)         | <p>CHF 100,000<br>For transactions above 100k, users can <a href="https://www.mtpelerin.com/contact">contact our OTC service</a></p> |
| Max. buy per instant EUR transfer | EUR 1,000                                                                                                                            |

#### Bank transfer fees

|                                                                                                                                                                                                                            |                                                                             |
| -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------- |
| CHF bank transfers (SIC)                                                                                                                                                                                                   | free                                                                        |
| EUR bank transfers (SEPA, SEPA Instant)                                                                                                                                                                                    | 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)          | $0 (or equivalent in other currencies) |
| Ethereum (other tokens) | $1 (or equivalent in other currencies) |
| Gnosis Chain            | free                                   |
| Optimism                | free                                   |
| Polygon                 | free                                   |
| Rootstock               | free                                   |
| Sonic                   | free                                   |
| Tezos                   | free                                   |
| zkSync Era              | free                                   |

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

**Buying in CHF, EUR, GBP**

| 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%       |

💡 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 | 1                                |
| May. buy | 5,000 per transaction (with KYC) |

#### Network delivery costs

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

## ⬇️ Off ramp pricing

### 🏦 By bank transfer

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

| Volume per year     | Commission |
| ------------------- | ---------- |
| 0-499               | free       |
| 500-4,999           | 1.3%       |
| 5,000-49,999        | 1.1%       |
| 50,000-999,999      | 0.9%       |
| 1,000,000-9,999,999 | 0.7%       |
| 10,000,000+         | 0.6%       |

💡 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                          | CHF 50 (or equivalent in other currencies)                                                                                                                               |
| 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> |
| Max. sell per instant EUR transfer | EUR 1400                                                                                                                                                                 |

#### Bank transfer fees

|                                                                                                                                                                                                                               |                                                                             |
| ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------- |
| CHF bank transfers (SIC)                                                                                                                                                                                                      | free                                                                        |
| EUR bank transfers (SEPA, SEPA Instant)                                                                                                                                                                                       | 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.

## 💱 Swap pricing

| 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).

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

#### 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 | CHF 1 (or equivalent in other currencies)         |
| Max. swap | No given limit, according to available liquidity. |

#### Delivery fee

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

## ⚠️ Refund fee

If we receive transactions that are 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 his 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 |
| SEPA Instant (Europe)      | Instant\*         |
| SWIFT (rest of the world)  | 1-5 business days |

{% hint style="info" %}
\* When buying crypto through instant transfers, 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 compliance or liquidity reasons, for instance).
{% endhint %}

{% 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 %}

### 💳 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 |
| SEPA Instant (Europe)      | Instant \*        |
| SWIFT (rest of the world)  | 1-5 business days |

{% hint style="info" %}
\* Cash outs in euro are sent by SEPA Instant for amounts below €1400 (or equivalent), and by regular SEPA above. Cash out below €1400 might still be sent over regular SEPA in some cases, SEPA Instant is provided on a best effort basis.

\* Instant cash outs to a new bank account will take \~1h (Monday to Friday). Larger amounts may also trigger extra checks, which can slow down the processing of an operation.
{% endhint %}

{% 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

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

## Without ID verification

An end user can use our exchange service without having to verify his/her 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 main user ID in our system, and an email address for receiving transaction notifications.

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

## With ID verification

To make transactions without limits, the user must pass KYC to continue using our service. To do so, the interface will invite them to pass their identification with us. You will find more information about our identification process [here](https://www.mtpelerin.com/support#identification).

You can also see how it looks like here: <https://kyc.mtpelerin.com/>

Please note that we process 100% of users identification internally, therefore their data never leave our secured servers, they are not commercialized and no third party has access to them.

{% hint style="info" %}
We reserve the right to charge a CHF 20 fee (or equivalent) to refund non-compliant transfers.
{% endhint %}


# 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
* 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 transfer 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:

* [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)


# 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

More importantly, 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 [VQF](https://www.vqf.ch/en/), 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

**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.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/apis/price-quote-api)

**2025.07.14**

Added transaction reporting in [APIs](/integration-guides/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 [APIs](/integration-guides/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 [Web integration](/integration-guides/web-integration).

**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 [APIs](/integration-guides/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)


# 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](/files/DgTb6zrMfXCZyj47mkB0)


# 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](/files/-MQc310MCOJmhxy-Rz6V)

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

![](/files/-MQc43VjWnkVGCHJWS1w)


# 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](/files/-MQliRIKWzYaNGdr-RD2)

## 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


# Getting started

To integrate our payment widget, please contact us at <hello@mtpelerin.com>

You will need to register your company with us, which you can already do here: <https://kyb.mtpelerin.com/>

You will also need to sign an integration agreement, which we will send you by email.


# Instructions

### 1. Calling the payment widget

To trigger a payment, you need to call our checkout widget with the following URL and mandatory parameters:

```
https://widget.mtpelerin.com/?_ctkn=<integrationKey>&tabs=merchant&bdc=<SettlementCurrency>&bda=<amountInSettlementCurrency>&oid=<merchant_order_id>
```

* **integrationKey:** the unique integration key that you will have received from us by email.
* **SettlementCurrency:** the crypto or fiat currency in which you want to denominate the payment.
* **amountInSettlementCurrency:** the payment amount in the SettlementCurrency.
* **merchant\_order\_id:** your internal payment order ID.

Here are all the codes that you can use for the SettlementCurrency parameter:

**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, crvUSD, DAI, ETH, EURA, EURC, EURS, FRAX, GHO, LUSD, PAXG, POL, RBTC, RIF, S, sat, tzBTC, USDC, USDC.e, USDRIF, USDT, WBTC, WETH, XAUt, XDAI, XTZ, ZCHF

### 2. Payment confirmation

Once a payment has been made successfully, we call a webhook on your side to let you know that the transaction is completed. 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 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')
```


# Optional parameters

| Parameter  | Value                                                                                                                                                                                                                                                                                                              | Description                                                                                                                                                                             |
| ---------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| bsc        | *fiat codes*                                                                                                                                                                                                                                                                                                       | The payment fiat currency that you want to show the payer by default.                                                                                                                   |
| curs       | *fiat codes*                                                                                                                                                                                                                                                                                                       | List of authorized fiat currencies (leave empty for all)                                                                                                                                |
| crys       | *crypto codes*                                                                                                                                                                                                                                                                                                     | List of authorized cryptocurrencies (leave empty for all)                                                                                                                               |
| net        | <p>arbitrum\_mainnet avalanche\_mainnet</p><p>base\_mainnet</p><p>bitcoin\_mainnet</p><p>bsc\_mainnet</p><p>celo\_mainnet</p><p>lightning\_mainnet</p><p>mainnet</p><p>matic\_mainnet optimism\_mainnet</p><p>rsk\_mainnet</p><p>sonic\_mainnet</p><p>tezos\_mainnet</p><p>xdai\_mainnet</p><p>zksync\_mainnet</p> | Default network                                                                                                                                                                         |
| nets       | <p>arbitrum\_mainnet avalanche\_mainnet</p><p>base\_mainnet</p><p>bitcoin\_mainnet</p><p>bsc\_mainnet</p><p>celo\_mainnet</p><p>lightning\_mainnet</p><p>mainnet</p><p>matic\_mainnet optimism\_mainnet</p><p>rsk\_mainnet</p><p>sonic\_mainnet</p><p>tezos\_mainnet</p><p>xdai\_mainnet</p><p>zksync\_mainnet</p> | List of authorized networks (leave empty for all).                                                                                                                                      |
| 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.                                                                                                                                            |
| 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</p><p>FR</p><p>DE</p><p>...</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.                  |
| 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                                                                                                         |

**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, crvUSD, DAI, ETH, EURA, EURC, EURS, FRAX, GHO, LUSD, PAXG, POL, RBTC, RIF, S, sat, tzBTC, USDC, USDC.e, USDRIF, USDT, WBTC, WETH, XAUt, XDAI, XTZ, ZCHF

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

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

**Example:**

\#FFFFFF

**must be passed as**

%23FFFFFF
{% endhint %}


# Automating the end user address validation

Users paying in crypto will have to verify their sending address, which is a regulatory requirement on us.

If you have the relevant access, you can automate that step by pre-filling the address and automatically doing the signature in the background for the user.

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

/37KcpG6mEp+1oAan8/HLEvcfZFXUi6kTOxTHNjD3ZloxS8DL70v7lCmXiEyDOATm4hvewMzBO2d1n25QdJ8WBw=

**must be passed as:**

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

| Parameter                             | Value                                                                                    | Description                                                                                                                                                                                                        |
| ------------------------------------- | ---------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| addr                                  | public address                                                                           | Allows you to automatically provide the user's receiving or sending public address (the address has to be unique for each user, common addresses are not permitted and will be rejected)                           |
| code                                  | 4-digits code                                                                            | Random 4 digits code between 1000 and 9999 that you need to generate for each address supplied with the addr parameter (don't use the same code for all addresses or the validation will be rejected)              |
| hash                                  | #                                                                                        | base64 encoded signature of the following message: MtPelerin-\<code>. The private key used to sign the message has to be the one matching the public address given in addr. To test it, see **Test vector** below. |
| 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 |                                                                                          |                                                                                                                                                                                                                    |
| <br>xdai\_mainnet                     |                                                                                          |                                                                                                                                                                                                                    |
| <br>zksync\_mainnet</p>               | Optional, only required to validate the address of a **smart contract wallet** (EIP1271) |                                                                                                                                                                                                                    |

#### Test vector

You can verify that your signature for the 'hash' parameter is correct by testing it with the following info:

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

or with the following info:

* 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=

#### Vanilla JS code with Metamask as signer

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

const fromBase64 = (str) =>
    atob(str).split('').map(function (c) { return c.charCodeAt(0); });

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

const toHexString = (bytes) =>
  bytes.reduce((str, byte) => str + byte.toString(16).padStart(2, '0'), '');

/* 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 code with ethers.Wallet as signer

```
const ethers = require('ethers');

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

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);
```


