---
head:
- - meta
- property: og:title
content: Multiswap Guide
- - meta
- name: description
content: Example showing use of the MultiSwap router for multihop swaps
- - meta
- property: og:description
content: Example showing use of the MultiSwap router for multihop swaps
---
# MultiSwap Router
The `BeraCrocMultiSwap` contract is a periphery contract which serves as a router for conveniently performing a series of swaps between one or more pools. This contract abstracts many of the more advanced parameters from the `swap()` and `userCmd()` DEX functions.
It is anticipated that the MultiSwap router be used in conjunction with some form of off-chain router as the input arguments assume the user already knows the exact sequence of swaps to perform.
The contract is deployed at
bArtio: `0x21e2C0AFd058A89FCf7caf3aEA3cB84Ae977B73D`
### multiSwap
```solidity
function multiSwap (
SwapStep[] memory _steps,
uint128 _amount,
uint128 _minOut
) public payable returns (uint128 out)
struct SwapStep {
uint256 poolIdx;
address base;
address quote;
bool isBuy;
}
```
**Parameters**
| Name | Type | Description |
| -------- | ------- | ----------------------------------------------------------------------------------------------------------------------------------- |
| poolIdx | uin256 | The index of the pool to use for the swap |
| base | address | The token to swap from |
| quote | address | The token to swap to |
| isBuy | bool | True if the user wants to pay base token and receive quote token. False if the user wants to receive base token and pay quote token |
| \_amount | uint128 | The quantity of input tokens to swap |
| \_minOut | uint128 | The minimum amount of output tokens the user is willing to receive |
**Returns**
| Name | Type | Description |
| ---- | ------- | ------------------------------------------- |
| out | uint128 | The quantity of tokens received by the user |
### Solidity Example
Multihop swap of `HONEY -> WBERA -> WETH` using testnet addresses
```solidity
address ROUTER = 0x21e2C0AFd058A89FCf7caf3aEA3cB84Ae977B73D;
address HONEY = 0x0E4aaF1351de4c0264C5c7056Ef3777b41BD8e03;
address WBERA = 0x7507c1dc16935B82698e4C63f2746A2fCf994dF8;
address WETH = 0x6E1E9896e93F7A71ECB33d4386b49DeeD67a231A;
MultiSwap.SwapStep[] memory swap = new MultiSwap.SwapStep[](2);
swap[0] = MultiSwap.SwapStep(36000, HONEY, WBERA, true);
swap[1] = MultiSwap.SwapStep(36001, WETH, WBERA, false);
MultiSwap(ROUTER).multiSwap(swap, 1 ether, 0);
```
### JavaScript Example
```js
const { ethers } = require("ethers");
async function main() {
const provider = new ethers.providers.JsonRpcProvider(...);
const multiSwapABI = ... // see below
const routerAddress = "0x21e2C0AFd058A89FCf7caf3aEA3cB84Ae977B73D";
const multiSwap = new ethers.Contract(routerAddress, multiSwapABI, provider);
const HONEY = "0x0E4aaF1351de4c0264C5c7056Ef3777b41BD8e03";
const WBERA = "0x7507c1dc16935B82698e4C63f2746A2fCf994dF8";
const WETH = "0x6E1E9896e93F7A71ECB33d4386b49DeeD67a231A";
const swapSteps = [
{
poolIdx: 36000,
base: HONEY,
quote: WBERA,
isBuy: true,
},
{
poolIdx: 36001,
base: WETH,
quote: WBERA,
isBuy: false,
},
];
const amount = ethers.utils.parseEther("1"); // 1 ether
const minOut = 0;
const tx = await multiSwap.multiSwap(swapSteps, amount, minOut);
await tx.wait();
}
main();
```
#### MultiSwap ABI
```json
[
{
"inputs": [
{
"components": [
{
"internalType": "uint256",
"name": "poolIdx",
"type": "uint256"
},
{
"internalType": "address",
"name": "base",
"type": "address"
},
{
"internalType": "address",
"name": "quote",
"type": "address"
},
{
"internalType": "bool",
"name": "isBuy",
"type": "bool"
}
],
"internalType": "struct MultiSwap.SwapStep[]",
"name": "_steps",
"type": "tuple[]"
},
{
"internalType": "uint128",
"name": "_amount",
"type": "uint128"
},
{
"internalType": "uint128",
"name": "_minOut",
"type": "uint128"
}
],
"name": "multiSwap",
"outputs": [
{
"internalType": "uint128",
"name": "out",
"type": "uint128"
}
],
"stateMutability": "payable",
"type": "function"
}
]
```