# AbstractRouter

Partial implementation and requirements for liquidity routers.

## boundMakerContracts

```solidity
mapping(address => bool) boundMakerContracts
```

the bound maker contracts which are allowed to call this router.

## onlyBound

```solidity
modifier onlyBound()
```

This modifier verifies that `msg.sender` an allowed caller of this router.

## boundOrAdmin

```solidity
modifier boundOrAdmin()
```

This modifier verifies that `msg.sender` is the admin or an allowed caller of this router.

## MakerBind

```solidity
event MakerBind(address maker)
```

logging bound maker contract\
by emitting this data, an indexer will be able to keep track of what maker contracts are allowed to call this router.

### Parameters

| Name  | Type    | Description                                                             |
| ----- | ------- | ----------------------------------------------------------------------- |
| maker | address | the maker address. This is indexed, so that RPC calls can filter on it. |

## MakerUnbind

```solidity
event MakerUnbind(address maker)
```

logging unbound maker contract\
by emitting this data, an indexer will be able to keep track of what maker contracts are allowed to call this router.

### Parameters

| Name  | Type    | Description                                                             |
| ----- | ------- | ----------------------------------------------------------------------- |
| maker | address | the maker address. This is indexed, so that RPC calls can filter on it. |

## isBound

```solidity
function isBound(address mkr) public view returns (bool)
```

getter for the `makers: addr => bool` mapping

### Parameters

| Name | Type    | Description                     |
| ---- | ------- | ------------------------------- |
| mkr  | address | the address of a maker contract |

### Return Values

| Name | Type | Description                                      |
| ---- | ---- | ------------------------------------------------ |
| \[0] | bool | true if `mkr` is authorized to call this router. |

## pull

```solidity
function pull(contract IERC20 token, address reserveId, uint256 amount, bool strict) external returns (uint256 pulled)
```

pulls liquidity from the reserve and sends it to the calling maker contract.

### Parameters

| Name      | Type            | Description                                                                                                                     |
| --------- | --------------- | ------------------------------------------------------------------------------------------------------------------------------- |
| token     | contract IERC20 | is the ERC20 managing the pulled asset                                                                                          |
| reserveId | address         | identifies the fund owner (router implementation dependent).                                                                    |
| amount    | uint256         | of `token` the maker contract wishes to pull from its reserve                                                                   |
| strict    | bool            | when the calling maker contract accepts to receive more funds from reserve than required (this may happen for gas optimization) |

### Return Values

| Name   | Type    | Description                              |
| ------ | ------- | ---------------------------------------- |
| pulled | uint256 | the amount that was successfully pulled. |

## **pull**

```solidity
function __pull__(contract IERC20 token, address reserveId, uint256 amount, bool strict) internal virtual returns (uint256)
```

router-dependent implementation of the `pull` function

### Parameters

| Name      | Type            | Description                                                                       |
| --------- | --------------- | --------------------------------------------------------------------------------- |
| token     | contract IERC20 | Token to be transferred                                                           |
| reserveId | address         | determines the location of the reserve (router implementation dependent).         |
| amount    | uint256         | The amount of tokens to be transferred                                            |
| strict    | bool            | wether the caller maker contract wishes to pull at most `amount` tokens of owner. |

### Return Values

| Name | Type    | Description                                           |
| ---- | ------- | ----------------------------------------------------- |
| \[0] | uint256 | pulled The amount pulled if successful; otherwise, 0. |

## push

```solidity
function push(contract IERC20 token, address reserveId, uint256 amount) external returns (uint256 pushed)
```

pushes assets from calling's maker contract to a reserve

### Parameters

| Name      | Type            | Description                                                                       |
| --------- | --------------- | --------------------------------------------------------------------------------- |
| token     | contract IERC20 | is the asset the maker is pushing                                                 |
| reserveId | address         | determines the location of the reserve (router implementation dependent).         |
| amount    | uint256         | is the amount of asset that should be transferred from the calling maker contract |

### Return Values

| Name   | Type    | Description                                                   |
| ------ | ------- | ------------------------------------------------------------- |
| pushed | uint256 | fraction of `amount` that was successfully pushed to reserve. |

## **push**

```solidity
function __push__(contract IERC20 token, address reserveId, uint256 amount) internal virtual returns (uint256 pushed)
```

router-dependent implementation of the `push` function

### Parameters

| Name      | Type            | Description                                                               |
| --------- | --------------- | ------------------------------------------------------------------------- |
| token     | contract IERC20 | Token to be transferred                                                   |
| reserveId | address         | determines the location of the reserve (router implementation dependent). |
| amount    | uint256         | The amount of tokens to be transferred                                    |

### Return Values

| Name   | Type    | Description                                    |
| ------ | ------- | ---------------------------------------------- |
| pushed | uint256 | The amount pushed if successful; otherwise, 0. |

## flush

```solidity
function flush(contract IERC20[] tokens, address reserveId) external
```

iterative `push` for the whole balance in a single call

### Parameters

| Name      | Type               | Description                                                               |
| --------- | ------------------ | ------------------------------------------------------------------------- |
| tokens    | contract IERC20\[] | to flush                                                                  |
| reserveId | address            | determines the location of the reserve (router implementation dependent). |

## bind

```solidity
function bind(address makerContract) public
```

adds a maker contract address to the allowed makers of this router

*this function is callable by router's admin to bootstrap, but later on an allowed maker contract can add another address*

### Parameters

| Name          | Type    | Description                |
| ------------- | ------- | -------------------------- |
| makerContract | address | the maker contract address |

## \_unbind

```solidity
function _unbind(address makerContract) internal
```

removes a maker contract address from the allowed makers of this router

### Parameters

| Name          | Type    | Description                |
| ------------- | ------- | -------------------------- |
| makerContract | address | the maker contract address |

## unbind

```solidity
function unbind() external
```

removes `msg.sender` from the allowed makers of this router

## unbind

```solidity
function unbind(address makerContract) external
```

removes a makerContract from the allowed makers of this router

### Parameters

| Name          | Type    | Description                |
| ------------- | ------- | -------------------------- |
| makerContract | address | the maker contract address |

## checkList

```solidity
function checkList(contract IERC20 token, address reserveId) external view
```

allows a makerContract to verify it is ready to use `this` router for a particular reserve

*`checkList` returns normally if all needed approval are strictly positive. It reverts otherwise with a reason.*

### Parameters

| Name      | Type            | Description                                                               |
| --------- | --------------- | ------------------------------------------------------------------------- |
| token     | contract IERC20 | is the asset (and possibly its overlyings) whose approval must be checked |
| reserveId | address         | of the tokens that are being pulled                                       |

## **checkList**

```solidity
function __checkList__(contract IERC20 token, address reserveId) internal view virtual
```

router-dependent additional checks

### Parameters

| Name      | Type            | Description                                                               |
| --------- | --------------- | ------------------------------------------------------------------------- |
| token     | contract IERC20 | is the asset (and possibly its overlyings) whose approval must be checked |
| reserveId | address         | of the tokens that are being pulled                                       |

## activate

```solidity
function activate(contract IERC20 token) external
```

performs necessary approval to activate router function on a particular asset

### Parameters

| Name  | Type            | Description                                |
| ----- | --------------- | ------------------------------------------ |
| token | contract IERC20 | the asset one wishes to use the router for |

## **activate**

```solidity
function __activate__(contract IERC20 token) internal virtual
```

router-dependent implementation of the `activate` function

### Parameters

| Name  | Type            | Description                                |
| ----- | --------------- | ------------------------------------------ |
| token | contract IERC20 | the asset one wishes to use the router for |

## balanceOfReserve

```solidity
function balanceOfReserve(contract IERC20 token, address reserveId) public view virtual returns (uint256)
```

Balance of a reserve

### Parameters

| Name      | Type            | Description                                 |
| --------- | --------------- | ------------------------------------------- |
| token     | contract IERC20 | the asset one wishes to know the balance of |
| reserveId | address         | the identifier of the reserve               |

### Return Values

| Name | Type    | Description                |
| ---- | ------- | -------------------------- |
| \[0] | uint256 | the balance of the reserve |


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.mangrove.exchange/dev/strat-lib/technical-references/api-preferences/strats/src/strategies/routeurs/abstract/abstractrouter.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
