YakSwap is a set of smart contracts for optimal path finding between two assets and execution of that path. For input&output token and input-amount optimal path should have a greatest net amount-out by considering execution gas-cost.
Search is performed by calling on-chain query-methods and can be called by anyone. However, user should avoid calling query-methods in a mutative call due to a very large gas-cost associated with a call.
YakRouter is the user-facing interface to check prices and make trades. See example off-chain usage here.
Chain | Address |
---|---|
Avalanche | 0xC4729E56b831d74bBc18797e0e17A295fA77488c |
Arbitrum | 0xb32C79a25291265eF240Eb32E9faBbc6DcEE3cE3 |
Optimism | 0xCd887F78c77b36B0b541E77AfD6F91C0253182A2 |
Finds the best path from tokenA to tokenB. Considers path's amount-out and its gas-cost.
function findBestPathWithGas(
uint256 _amountIn,
address _tokenIn,
address _tokenOut,
uint256 _maxSteps,
uint256 _gasPrice
) external view returns (FormattedOffer memory);
Input params | Details |
---|---|
amountIn | Amount of tokens being sold |
tokenIn | ERC20 token being sold |
tokenOut | ERC20 token being bought |
steps | Max number of steps for path finding (must be less than 4) |
gasPrice | Gas price in gwei that will be used to estimate gasCost of each step |
struct FormattedOffer {
uint256[] amounts;
address[] adapters;
address[] path;
uint256 gasEstimate;
}
Return arg | Details |
---|---|
amounts | Amount of token being swapped for each step. First amount is _amountIn and last amountOut . |
adapters | Addresses of adapters through which trade goes. |
path | Addresses of tokens through which trade goes. First token is _tokenIn and last _tokenOut . |
gasEstimate | Rough estimate for gas-cost of all swaps. Gas estimates only include gas-cost of swapping and querying on adapter and not intermediate logic, nor tx-gas-cost. |
Executes trades through provided path.
function swapNoSplit(
Trade calldata _trade,
address _to,
uint256 _fee
) external;
Input param | Details |
---|---|
_trade | Arguments used for swapping |
_to | Reciever address |
_fee | Optional fee in bps taken before the trades |
struct Trade {
uint256 amountIn;
uint256 amountOut;
address[] path;
address[] adapters;
}
Param | Details |
---|---|
amountIn | Amount of tokens being sold |
amountOut | Amount of tokens being bought |
path | Tokens being traded in respective order |
adapters | Adapters through which tokens will be traded in respective order |
Adapters act as a common interface for YakRouter to interact with external contracts.
Adapters offers methods: query
and swap
.
function query(
uint256 _amountIn,
address _tokenIn,
address _tokenOut
) external view returns (uint256);
function swap(
uint256 _amountIn,
uint256 _amountOut,
address _fromToken,
address _toToken,
address _to
) external;
After setting up this repo call npx hardhat list-adapters --network {network-id}
to get a list of live adapters and their addresses. Or see deployOptions
for a list of live adapters per chain.
yarn install
cp .env.sample > .env
Test for chain:
yarn test:{network-id}
Test individual:
npx hardhat test {path to the test/tests | empty to run all}
yarn deploy:{network-id}
npx hardhat verify-contract --deployment-file-path {path to deployment file} --network {your network tag}
npx hardhat find-best-path {fixed-amount-in} {token-in symbol/address} {token-in symbol/address} --network {network tag}
Example:
npx hardhat find-best-path 1000 USDC yyAVAX --network avalanche
- Static-Quoters used in KyberElastic, UniswapV3 and Quickswap adapters are published here.
Project is licensed under GPL-3, although some parts of it might be less restrictive. Copyright© 2021