# Bounty for Specialized Trident Pool Implementations
Trident is the Sushi next generation AMM. The Trident `MasterDeployer.sol` allows new pools of any design type to be added that conform to the `IPool.sol` interface standard.
In doing so the new pool type will be added to the Trident routing engine Tines. Below is an early preview of the `IPool.sol` interface:
```solidity
// SPDX-License-Identifier: GPL-3.0-or-later
pragma solidity >=0.5.0;
pragma experimental ABIEncoderV2;
/// @notice Interface for Trident exchange pool interactions.
interface IPool {
/// @notice Executes a swap from one token to another.
/// @dev The input tokens must've already been sent to the pool.
/// @param data ABI encoded params that the pool requires.
/// @return finalAmountOut The amount of output tokens that were sent to the user.
function swap(bytes calldata data) external returns (uint256 finalAmountOut);
/// @notice Executes a swap from one token to another with a callback.
/// @dev This function allows borrowing the output tokens and sending the input tokens in the callback.
/// @param data ABI encoded params that the pool requires.
/// @return finalAmountOut The amount of output tokens that were sent to the user.
function flashSwap(bytes calldata data) external returns (uint256 finalAmountOut);
/// @notice Mints liquidity tokens.
/// @dev The input tokens must've already been sent to the pool.
/// @param data ABI encoded params that the pool requires.
/// @return liquidity The amount of liquidity tokens that were minted for the user.
function mint(bytes calldata data) external returns (uint256 liquidity);
/// @notice Burns liquidity tokens.
/// @dev The input lp tokens must've already been sent to the pool.
/// @param data ABI encoded params that the pool requires.
/// @return withdrawnAmounts The amount of various tokens that were sent to the user.
function burn(bytes calldata data) external returns (TokenAmount[] memory withdrawnAmounts);
/// @notice Burns liquidity tokens for a single output token.
/// @dev The input lp tokens must've already been sent to the pool.
/// @param data ABI encoded params that the pool requires.
/// @return amount The amount of tokens that were sent to the user.
function burnSingle(bytes calldata data) external returns (uint256 amount);
/// @return A unique identifier for the pool type.
function poolIdentifier() external pure returns (bytes32);
/// @return An Array of tokens supported by the pool.
function getAssets() external view returns (address[] memory);
/// @notice Simulates a trade and returns the expected output
/// @dev The pool does not need to include a trade simulator directly in itself, it can use a library.
/// @param data ABI encoded params that the pool requires.
/// @return finalAmountOut The amount of tokens that will be sent to the user if the trade is executed.
function getAmountOut(bytes calldata data) external view returns (uint256 finalAmountOut);
/// @dev This event must be emitted on all swaps
event Swap(
address indexed recipient,
address indexed tokenIn,
address indexed tokenOut,
uint256 amountIn,
uint256 amountOut
);
struct TokenAmount {
address token;
uint256 amount;
}
}
```
The object of this bounty is to create a pool of your own design that has unique properties. The Sush Trident team has already implemented four pool types.
Specialized pools that go through formal analysis will have the opportunnity to deploy on Trident.
If you would like to complete this bounty, please reach out to grants@sushi.com to start. Thank you.