# 3. How to use an Orbit Bridge

**\*\* The chain parameter should have the following format:**&#x20;

`ETH`, `ORBIT`, `KLAYTN`, `BSC`, `MATIC`, `HECO`, `CELO`, `AVAX`, `FANTOM`, `HARMONY`, `MOONRIVER`, `OEC`, `XDAI`&#x20;

## EVM

### Vault Contract Interface

{% code lineNumbers="true" %}

```solidity
interface IVault {
    function deposit(string memory toChain, bytes memory toAddr) payable public;
    function depositToken(address token, string memory toChain, bytes memory toAddr, uint amount) public; 
}
```

{% endcode %}

* You can use the **vault** to bridge assets to other chains which deployed **minter**. (ex) Bsc vault has only Klaytn, Orbit, Heco and Matic minter. (See [BSC vault contracts](https://bridge-docs.orbitchain.io/faq/2.-contract-addresses#bsc-vault)) BNB can bridge to Heco. But cannot bridge to Fantom.
* If you want to bridge **native assets** like ETH or BNB, use `deposit`.
* Otherwise, if you want to bridge **ERC20**, use `depositToken`.&#x20;
* Orbit Bridge has `ETH`, `KLAYTN`, `BSC`, `MATIC`, `HECO`, `CELO` vaults.

#### Details

{% code lineNumbers="true" %}

```solidity
deposit(string memory toChain, bytes memory toAddr) payable
```

{% endcode %}

* `toChain`: Chain symbol to send assets.
* `toAddr`: Address to receive bridged assets. \
  \*\* You must send a transaction with **value** for the amount to be sent.

{% code lineNumbers="true" %}

```solidity
depositToken(address token, string memory toChain, bytes memory toAddr, uint amount)
```

{% endcode %}

* `toChain`: Chain symbol to send assets
* `toAddr`: Address to receive bridged assets
* `amount`: The amounts of tokens to send (wei)

#### Example

1. Bridge 0.1 **ETH** from ETH to **KLAYTN**

* **ETH** is a `native asset` of the Ethereum chain.
* In this case, call the `deposit` method to the ETH vault contract.
* contract address: [0x1bf68a9d1eaee7826b3593c20a0ca93293cb489a](https://bridge-docs.orbitchain.io/faq/2.-contract-addresses#eth-vault)

{% code lineNumbers="true" %}

```solidity
deposit("KLAYTN", <to address>){value: 100000000000000000}
```

{% endcode %}

2\. Bridge 10 **BUSD** from **BNB** to **MATIC**

* BUSD is an `ERC20` token based on the BNB chain.
* In this case, call the `depositToken` method to Bsc vault contract.
* contract address: [0x89c527764f03BCb7dC469707B23b79C1D7Beb780](https://bridge-docs.orbitchain.io/faq/2.-contract-addresses#bsc-vault)

{% code lineNumbers="true" %}

```solidity
depositToken("MATIC", <to address>, 10000000000000000000)
```

{% endcode %}

### Minter Contract Interface

{% code lineNumbers="true" %}

```solidity
interface IMinter {
    function getChainId(string chain) external view returns (bytes32);
    function chainFee(bytes32 chainId) external view returns (uint256);
    function getTokenAddress(bytes memory token) public view returns(address);
    function requestSwap(address tokenAddress, string memory toChain, bytes memory toAddr, uint amount) public payable;
}
```

{% endcode %}

* You can use the **minter** to send bridged assets to the origin chain or another chain.
* In this case, only use `requestSwap`
* Depending on the chain, there may be a **chain fee**.
* If there is a chain fee, you need to send a transaction by putting it in **value**.
* Minted Tokens have the **prefix ‘o’** which means bridged by an Orbit Bridge. (oUSDT, oBUSD, oXRP, oETH etc…)

#### Details

{% code lineNumbers="true" %}

```solidity
getChainId(string chain)  
```

{% endcode %}

Returns unique `bytes32` data for each chain.

* `chain`: Chain symbol to send assets.

{% code lineNumbers="true" %}

```solidity
chainFee(bytes32 chainId)
```

{% endcode %}

Returns chain fee for each chain.

* `chainId`: bytes32 data from `getChainId` method.

{% code lineNumbers="true" %}

```solidity
getTokenAddress(bytes memory token)
```

{% endcode %}

* `token`: Address of origin asset. For native assets, it is `0x0000000000000000000000000000000000000000`<br>

{% code lineNumbers="true" %}

```solidity
requestSwap(address tokenAddress, string memory toChain, bytes memory toAddr, uint amount)
```

{% endcode %}

* `tokenAddress`: Returned value using `getTokenAddress`
* `toChain`: Chain symbol to send assets.
* `toAddr`: Address to receive bridged assets.
* `amount`: The amounts of tokens to send (wei)

####

#### Example

1. Bridge 0.1 **oETH** from **KLAYTN** to **ETH**

* oETH on Klaytn is a bridged `ERC20` token from Eth.
* **ETH** is a native asset of the **Ethereum chain.**
* In this case, use the **Klaytn minter contract** of **Eth vault**
* contract address: [0x60070F5D2e1C1001400A04F152E7ABD43410F7B9](https://bridge-docs.orbitchain.io/faq/2.-contract-addresses#eth-vault)

{% code lineNumbers="true" %}

```solidity
requestSwap(
    "0x0000000000000000000000000000000000000000"
    , "KLAYTN"
    , <to address>
    , 100000000000000000 // 0.1 * 10 ** 18
){value: 100000000000000000} // chainFee
```

{% endcode %}

2\. Bridge 10 **oBUSD** from **MATIC** to **HECO**

* oBUSD on Matic is a bridged `ERC20` from BNB chain.
* BUSD is an `ERC20` based on the BNB chain.
* To bridge oBUSD from Matic to Heco, use Matic minter contract of Bsc vault
* contract address: [0x89c527764f03BCb7dC469707B23b79C1D7Beb780](https://bridge-docs.orbitchain.io/faq/2.-contract-addresses#bsc-vault)

{% code lineNumbers="true" %}

```solidity
requestSwap(
    "0xe9e7CEA3DedcA5984780Bafc599bD69ADd087D56" // origin BUSD address
    , "HECO"
    , <to address>
    , 10000000000000000000 // 10 * 10 ** 18
){value: 100000000000000000} // chainFee
```

{% endcode %}

## STACKS

### Minter Contract Interface

{% code lineNumbers="true" %}

```rust
(request-swap (to-chain (buff 256)) (to-addr (buff 20)) (amount uint))
```

{% endcode %}

In the case of Stacks, there is a minter corresponding to **each bridged token**.

* `to-chain`: Chain to send assets. This value can get using bufferCVFromString (see [@stacks/transactions](https://www.npmjs.com/package/@stacks/transactions?activeTab=readme))
* `to-addr`: Address to receive bridged assets.
