127 lines
6.0 KiB
Solidity
127 lines
6.0 KiB
Solidity
// SPDX-License-Identifier: GPL-3.0-or-later
|
|
// This program is free software: you can redistribute it and/or modify
|
|
// it under the terms of the GNU General Public License as published by
|
|
// the Free Software Foundation, either version 3 of the License, or
|
|
// (at your option) any later version.
|
|
|
|
// This program is distributed in the hope that it will be useful,
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
// GNU General Public License for more details.
|
|
|
|
// You should have received a copy of the GNU General Public License
|
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
pragma solidity >=0.7.0 <0.9.0;
|
|
pragma experimental ABIEncoderV2;
|
|
|
|
import "./IVault.sol";
|
|
import "./IPoolSwapStructs.sol";
|
|
|
|
/**
|
|
* @dev Interface for adding and removing liquidity that all Pool contracts should implement. Note that this is not
|
|
* the complete Pool contract interface, as it is missing the swap hooks. Pool contracts should also inherit from
|
|
* either IGeneralPool or IMinimalSwapInfoPool
|
|
*/
|
|
interface IBasePool is IPoolSwapStructs {
|
|
/**
|
|
* @dev Called by the Vault when a user calls `IVault.joinPool` to add liquidity to this Pool. Returns how many of
|
|
* each registered token the user should provide, as well as the amount of protocol fees the Pool owes to the Vault.
|
|
* The Vault will then take tokens from `sender` and add them to the Pool's balances, as well as collect
|
|
* the reported amount in protocol fees, which the pool should calculate based on `protocolSwapFeePercentage`.
|
|
*
|
|
* Protocol fees are reported and charged on join events so that the Pool is free of debt whenever new users join.
|
|
*
|
|
* `sender` is the account performing the join (from which tokens will be withdrawn), and `recipient` is the account
|
|
* designated to receive any benefits (typically pool shares). `balances` contains the total balances
|
|
* for each token the Pool registered in the Vault, in the same order that `IVault.getPoolTokens` would return.
|
|
*
|
|
* `lastChangeBlock` is the last block in which *any* of the Pool's registered tokens last changed its total
|
|
* balance.
|
|
*
|
|
* `userData` contains any pool-specific instructions needed to perform the calculations, such as the type of
|
|
* join (e.g., proportional given an amount of pool shares, single-asset, multi-asset, etc.)
|
|
*
|
|
* Contracts implementing this function should check that the caller is indeed the Vault before performing any
|
|
* state-changing operations, such as minting pool shares.
|
|
*/
|
|
function onJoinPool(
|
|
bytes32 poolId,
|
|
address sender,
|
|
address recipient,
|
|
uint256[] memory balances,
|
|
uint256 lastChangeBlock,
|
|
uint256 protocolSwapFeePercentage,
|
|
bytes memory userData
|
|
) external returns (uint256[] memory amountsIn, uint256[] memory dueProtocolFeeAmounts);
|
|
|
|
/**
|
|
* @dev Called by the Vault when a user calls `IVault.exitPool` to remove liquidity from this Pool. Returns how many
|
|
* tokens the Vault should deduct from the Pool's balances, as well as the amount of protocol fees the Pool owes
|
|
* to the Vault. The Vault will then take tokens from the Pool's balances and send them to `recipient`,
|
|
* as well as collect the reported amount in protocol fees, which the Pool should calculate based on
|
|
* `protocolSwapFeePercentage`.
|
|
*
|
|
* Protocol fees are charged on exit events to guarantee that users exiting the Pool have paid their share.
|
|
*
|
|
* `sender` is the account performing the exit (typically the pool shareholder), and `recipient` is the account
|
|
* to which the Vault will send the proceeds. `balances` contains the total token balances for each token
|
|
* the Pool registered in the Vault, in the same order that `IVault.getPoolTokens` would return.
|
|
*
|
|
* `lastChangeBlock` is the last block in which *any* of the Pool's registered tokens last changed its total
|
|
* balance.
|
|
*
|
|
* `userData` contains any pool-specific instructions needed to perform the calculations, such as the type of
|
|
* exit (e.g., proportional given an amount of pool shares, single-asset, multi-asset, etc.)
|
|
*
|
|
* Contracts implementing this function should check that the caller is indeed the Vault before performing any
|
|
* state-changing operations, such as burning pool shares.
|
|
*/
|
|
function onExitPool(
|
|
bytes32 poolId,
|
|
address sender,
|
|
address recipient,
|
|
uint256[] memory balances,
|
|
uint256 lastChangeBlock,
|
|
uint256 protocolSwapFeePercentage,
|
|
bytes memory userData
|
|
) external returns (uint256[] memory amountsOut, uint256[] memory dueProtocolFeeAmounts);
|
|
|
|
/**
|
|
* @dev Returns this Pool's ID, used when interacting with the Vault (to e.g. join the Pool or swap with it).
|
|
*/
|
|
function getPoolId() external view returns (bytes32);
|
|
|
|
/**
|
|
* @dev Returns the current swap fee percentage as a 18 decimal fixed point number, so e.g. 1e17 corresponds to a
|
|
* 10% swap fee.
|
|
*/
|
|
function getSwapFeePercentage() external view returns (uint256);
|
|
|
|
/**
|
|
* @dev Returns the scaling factors of each of the Pool's tokens. This is an implementation detail that is typically
|
|
* not relevant for outside parties, but which might be useful for some types of Pools.
|
|
*/
|
|
function getScalingFactors() external view returns (uint256[] memory);
|
|
|
|
function queryJoin(
|
|
bytes32 poolId,
|
|
address sender,
|
|
address recipient,
|
|
uint256[] memory balances,
|
|
uint256 lastChangeBlock,
|
|
uint256 protocolSwapFeePercentage,
|
|
bytes memory userData
|
|
) external returns (uint256 bptOut, uint256[] memory amountsIn);
|
|
|
|
function queryExit(
|
|
bytes32 poolId,
|
|
address sender,
|
|
address recipient,
|
|
uint256[] memory balances,
|
|
uint256 lastChangeBlock,
|
|
uint256 protocolSwapFeePercentage,
|
|
bytes memory userData
|
|
) external returns (uint256 bptIn, uint256[] memory amountsOut);
|
|
}
|