chore: Component.finance, Smoothy.finance, Saddle.finance, Curve open pools, Gas schedule [TKR-1] (#182)
* chore: Component.finance, Smoothy.finance (mainnet + BSC), Saddle.finance, Curve open pools, adjusting gas schedule, fixing Shell buys * chore: adding a Sampler for Smoothy.finance to only use whats in the contracts reserve * fix: Smoothy sampler, only use approx. for buys, removing y and BUSD curve pools * add CHANGELOGs * fix: prettier * add: FRAX Curve open pool * fix: prettier * chore: adjusting gas schedule for BSC Smoothy
This commit is contained in:
parent
76dda9eeda
commit
c1f8df0eca
@ -16,6 +16,10 @@
|
||||
{
|
||||
"version": "6.4.0",
|
||||
"changes": [
|
||||
{
|
||||
"note": "Added Component, Smoothy, Saddle, Curve open pools, tweeks gas schedule, adding SushiSwap as a fee quote source",
|
||||
"pr": 182
|
||||
},
|
||||
{
|
||||
"note": "Use SOURCE_FLAGS.rfqOrder in comparisonPrice",
|
||||
"pr": 177
|
||||
|
@ -34,6 +34,7 @@ import "./MStableSampler.sol";
|
||||
import "./MooniswapSampler.sol";
|
||||
import "./NativeOrderSampler.sol";
|
||||
import "./ShellSampler.sol";
|
||||
import "./SmoothySampler.sol";
|
||||
import "./TwoHopSampler.sol";
|
||||
import "./UniswapSampler.sol";
|
||||
import "./UniswapV2Sampler.sol";
|
||||
@ -55,6 +56,7 @@ contract ERC20BridgeSampler is
|
||||
MultiBridgeSampler,
|
||||
NativeOrderSampler,
|
||||
ShellSampler,
|
||||
SmoothySampler,
|
||||
TwoHopSampler,
|
||||
UniswapSampler,
|
||||
UniswapV2Sampler,
|
||||
|
@ -20,10 +20,20 @@
|
||||
pragma solidity ^0.6;
|
||||
pragma experimental ABIEncoderV2;
|
||||
|
||||
import "./ApproximateBuys.sol";
|
||||
import "./interfaces/IShell.sol";
|
||||
import "./SamplerUtils.sol";
|
||||
|
||||
contract ShellSampler
|
||||
|
||||
contract ShellSampler is
|
||||
SamplerUtils,
|
||||
ApproximateBuys
|
||||
{
|
||||
|
||||
struct ShellInfo {
|
||||
address poolAddress;
|
||||
}
|
||||
|
||||
/// @dev Default gas limit for Shell calls.
|
||||
uint256 constant private DEFAULT_CALL_GAS = 300e3; // 300k
|
||||
|
||||
@ -56,10 +66,6 @@ contract ShellSampler
|
||||
returns (uint256 amount)
|
||||
{
|
||||
makerTokenAmounts[i] = amount;
|
||||
// Break early if there are 0 amounts
|
||||
if (makerTokenAmounts[i] == 0) {
|
||||
break;
|
||||
}
|
||||
} catch (bytes memory) {
|
||||
// Swallow failures, leaving all results as zero.
|
||||
break;
|
||||
@ -84,26 +90,37 @@ contract ShellSampler
|
||||
view
|
||||
returns (uint256[] memory takerTokenAmounts)
|
||||
{
|
||||
// Initialize array of maker token amounts.
|
||||
uint256 numSamples = makerTokenAmounts.length;
|
||||
takerTokenAmounts = new uint256[](numSamples);
|
||||
return _sampleApproximateBuys(
|
||||
ApproximateBuyQuoteOpts({
|
||||
makerTokenData: abi.encode(makerToken, pool),
|
||||
takerTokenData: abi.encode(takerToken, pool),
|
||||
getSellQuoteCallback: _sampleSellForApproximateBuyFromShell
|
||||
}),
|
||||
makerTokenAmounts
|
||||
);
|
||||
}
|
||||
|
||||
for (uint256 i = 0; i < numSamples; i++) {
|
||||
try
|
||||
IShell(pool).viewTargetSwap
|
||||
{gas: DEFAULT_CALL_GAS}
|
||||
(takerToken, makerToken, makerTokenAmounts[i])
|
||||
returns (uint256 amount)
|
||||
{
|
||||
takerTokenAmounts[i] = amount;
|
||||
// Break early if there are 0 amounts
|
||||
if (takerTokenAmounts[i] == 0) {
|
||||
break;
|
||||
}
|
||||
} catch (bytes memory) {
|
||||
// Swallow failures, leaving all results as zero.
|
||||
break;
|
||||
}
|
||||
function _sampleSellForApproximateBuyFromShell(
|
||||
bytes memory takerTokenData,
|
||||
bytes memory makerTokenData,
|
||||
uint256 sellAmount
|
||||
)
|
||||
private
|
||||
view
|
||||
returns (uint256 buyAmount)
|
||||
{
|
||||
(address takerToken, address pool) = abi.decode(takerTokenData, (address, address));
|
||||
(address makerToken) = abi.decode(makerTokenData, (address));
|
||||
|
||||
try
|
||||
this.sampleSellsFromShell
|
||||
(pool, takerToken, makerToken, _toSingleValueArray(sellAmount))
|
||||
returns (uint256[] memory amounts)
|
||||
{
|
||||
return amounts[0];
|
||||
} catch (bytes memory) {
|
||||
// Swallow failures, leaving all results as zero.
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
156
packages/asset-swapper/contracts/src/SmoothySampler.sol
Normal file
156
packages/asset-swapper/contracts/src/SmoothySampler.sol
Normal file
@ -0,0 +1,156 @@
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
/*
|
||||
|
||||
Copyright 2020 ZeroEx Intl.
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
|
||||
*/
|
||||
|
||||
pragma solidity ^0.6;
|
||||
pragma experimental ABIEncoderV2;
|
||||
|
||||
// import "./interfaces/ISmoothy.sol";
|
||||
import "./ApproximateBuys.sol";
|
||||
import "./SamplerUtils.sol";
|
||||
import "./interfaces/ISmoothy.sol";
|
||||
|
||||
contract SmoothySampler is
|
||||
SamplerUtils,
|
||||
ApproximateBuys
|
||||
{
|
||||
/// @dev Information for sampling from smoothy sources.
|
||||
struct SmoothyInfo {
|
||||
address poolAddress;
|
||||
bytes4 sellQuoteFunctionSelector;
|
||||
bytes4 buyQuoteFunctionSelector;
|
||||
}
|
||||
|
||||
/// @dev Base gas limit for Smoothy calls.
|
||||
uint256 constant private SMOOTHY_CALL_GAS = 600e3;
|
||||
|
||||
/// @dev Sample sell quotes from Smoothy.
|
||||
/// @param smoothyInfo Smoothy information specific to this token pair.
|
||||
/// @param fromTokenIdx Index of the taker token (what to sell).
|
||||
/// @param toTokenIdx Index of the maker token (what to buy).
|
||||
/// @param takerTokenAmounts Taker token sell amount for each sample.
|
||||
/// @return makerTokenAmounts Maker amounts bought at each taker token
|
||||
/// amount.
|
||||
function sampleSellsFromSmoothy(
|
||||
SmoothyInfo memory smoothyInfo,
|
||||
int128 fromTokenIdx,
|
||||
int128 toTokenIdx,
|
||||
uint256[] memory takerTokenAmounts
|
||||
)
|
||||
public
|
||||
view
|
||||
returns (uint256[] memory makerTokenAmounts)
|
||||
{
|
||||
// Basically a Curve fork
|
||||
|
||||
// Smoothy only keep a percentage of its tokens available in reserve
|
||||
uint256 poolReserveMakerAmount = ISmoothy(smoothyInfo.poolAddress).getBalance(uint256(toTokenIdx)) -
|
||||
ISmoothy(smoothyInfo.poolAddress)._yBalances(uint256(toTokenIdx));
|
||||
(, , , uint256 decimals) = ISmoothy(smoothyInfo.poolAddress).getTokenStats(uint256(toTokenIdx));
|
||||
poolReserveMakerAmount = poolReserveMakerAmount/(10**(18-decimals));
|
||||
|
||||
uint256 numSamples = takerTokenAmounts.length;
|
||||
makerTokenAmounts = new uint256[](numSamples);
|
||||
for (uint256 i = 0; i < numSamples; i++) {
|
||||
(bool didSucceed, bytes memory resultData) =
|
||||
smoothyInfo.poolAddress.staticcall.gas(SMOOTHY_CALL_GAS)(
|
||||
abi.encodeWithSelector(
|
||||
smoothyInfo.sellQuoteFunctionSelector,
|
||||
fromTokenIdx,
|
||||
toTokenIdx,
|
||||
takerTokenAmounts[i]
|
||||
));
|
||||
uint256 buyAmount = 0;
|
||||
if (didSucceed) {
|
||||
buyAmount = abi.decode(resultData, (uint256));
|
||||
}
|
||||
|
||||
// Make sure the quoted buyAmount is available in the pool reserve
|
||||
if (buyAmount >= poolReserveMakerAmount) {
|
||||
// Assign pool reserve amount for all higher samples to break early
|
||||
for (uint256 j = i; j < numSamples; j++) {
|
||||
makerTokenAmounts[j] = poolReserveMakerAmount;
|
||||
}
|
||||
break;
|
||||
} else {
|
||||
makerTokenAmounts[i] = buyAmount;
|
||||
}
|
||||
|
||||
// Break early if there are 0 amounts
|
||||
if (makerTokenAmounts[i] == 0) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// @dev Sample buy quotes from Smoothy.
|
||||
/// @param smoothyInfo Smoothy information specific to this token pair.
|
||||
/// @param fromTokenIdx Index of the taker token (what to sell).
|
||||
/// @param toTokenIdx Index of the maker token (what to buy).
|
||||
/// @param makerTokenAmounts Maker token buy amount for each sample.
|
||||
/// @return takerTokenAmounts Taker amounts sold at each maker token
|
||||
/// amount.
|
||||
function sampleBuysFromSmoothy(
|
||||
SmoothyInfo memory smoothyInfo,
|
||||
int128 fromTokenIdx,
|
||||
int128 toTokenIdx,
|
||||
uint256[] memory makerTokenAmounts
|
||||
)
|
||||
public
|
||||
view
|
||||
returns (uint256[] memory takerTokenAmounts)
|
||||
{
|
||||
// Buys not supported so approximate it.
|
||||
return _sampleApproximateBuys(
|
||||
ApproximateBuyQuoteOpts({
|
||||
makerTokenData: abi.encode(toTokenIdx, smoothyInfo),
|
||||
takerTokenData: abi.encode(fromTokenIdx, smoothyInfo),
|
||||
getSellQuoteCallback: _sampleSellForApproximateBuyFromSmoothy
|
||||
}),
|
||||
makerTokenAmounts
|
||||
);
|
||||
}
|
||||
|
||||
function _sampleSellForApproximateBuyFromSmoothy(
|
||||
bytes memory takerTokenData,
|
||||
bytes memory makerTokenData,
|
||||
uint256 sellAmount
|
||||
)
|
||||
private
|
||||
view
|
||||
returns (uint256 buyAmount)
|
||||
{
|
||||
(int128 takerTokenIdx, SmoothyInfo memory smoothyInfo) =
|
||||
abi.decode(takerTokenData, (int128, SmoothyInfo));
|
||||
(int128 makerTokenIdx) =
|
||||
abi.decode(makerTokenData, (int128));
|
||||
(bool success, bytes memory resultData) =
|
||||
address(this).staticcall(abi.encodeWithSelector(
|
||||
this.sampleSellsFromSmoothy.selector,
|
||||
smoothyInfo,
|
||||
takerTokenIdx,
|
||||
makerTokenIdx,
|
||||
_toSingleValueArray(sellAmount)
|
||||
));
|
||||
if (!success) {
|
||||
return 0;
|
||||
}
|
||||
// solhint-disable-next-line indent
|
||||
return abi.decode(resultData, (uint256[]))[0];
|
||||
}
|
||||
}
|
45
packages/asset-swapper/contracts/src/interfaces/ISmoothy.sol
Normal file
45
packages/asset-swapper/contracts/src/interfaces/ISmoothy.sol
Normal file
@ -0,0 +1,45 @@
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
/*
|
||||
|
||||
Copyright 2021 ZeroEx Intl.
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
|
||||
*/
|
||||
|
||||
pragma solidity ^0.6;
|
||||
|
||||
|
||||
interface ISmoothy {
|
||||
|
||||
function getBalance (
|
||||
uint256 tid
|
||||
)
|
||||
external
|
||||
view
|
||||
returns (uint256 balance);
|
||||
|
||||
function _yBalances (
|
||||
uint256 tid
|
||||
)
|
||||
external
|
||||
view
|
||||
returns (uint256 balance);
|
||||
|
||||
function getTokenStats (
|
||||
uint256 tid
|
||||
)
|
||||
external
|
||||
view
|
||||
returns (uint256 softWeight, uint256 hardWeight, uint256 balance, uint256 decimals);
|
||||
}
|
@ -38,7 +38,7 @@
|
||||
"config": {
|
||||
"publicInterfaceContracts": "ERC20BridgeSampler,BalanceChecker,FakeTaker",
|
||||
"abis:comment": "This list is auto-generated by contracts-gen. Don't edit manually.",
|
||||
"abis": "./test/generated-artifacts/@(ApproximateBuys|BalanceChecker|BalancerSampler|BancorSampler|CurveSampler|DODOSampler|DODOV2Sampler|DummyLiquidityProvider|ERC20BridgeSampler|Eth2DaiSampler|FakeTaker|IBalancer|IBancor|ICurve|IEth2Dai|IKyberNetwork|IMStable|IMooniswap|IMultiBridge|IShell|IUniswapExchangeQuotes|IUniswapV2Router01|KyberSampler|LiquidityProviderSampler|MStableSampler|MakerPSMSampler|MooniswapSampler|MultiBridgeSampler|NativeOrderSampler|SamplerUtils|ShellSampler|TestERC20BridgeSampler|TestNativeOrderSampler|TwoHopSampler|UniswapSampler|UniswapV2Sampler|UtilitySampler).json",
|
||||
"abis": "./test/generated-artifacts/@(ApproximateBuys|BalanceChecker|BalancerSampler|BancorSampler|CurveSampler|DODOSampler|DODOV2Sampler|DummyLiquidityProvider|ERC20BridgeSampler|Eth2DaiSampler|FakeTaker|IBalancer|IBancor|ICurve|IEth2Dai|IKyberNetwork|IMStable|IMooniswap|IMultiBridge|IShell|ISmoothy|IUniswapExchangeQuotes|IUniswapV2Router01|KyberSampler|LiquidityProviderSampler|MStableSampler|MakerPSMSampler|MooniswapSampler|MultiBridgeSampler|NativeOrderSampler|SamplerUtils|ShellSampler|SmoothySampler|TestERC20BridgeSampler|TestNativeOrderSampler|TwoHopSampler|UniswapSampler|UniswapV2Sampler|UtilitySampler).json",
|
||||
"postpublish": {
|
||||
"assets": []
|
||||
}
|
||||
|
@ -3,11 +3,11 @@ import { SDK } from '@bancor/sdk';
|
||||
import { Ethereum } from '@bancor/sdk/dist/blockchains/ethereum';
|
||||
import { BlockchainType } from '@bancor/sdk/dist/types';
|
||||
|
||||
import { TOKENS } from './constants';
|
||||
import { MAINNET_TOKENS } from './constants';
|
||||
|
||||
const findToken = (tokenAddress: string, graph: object): string =>
|
||||
// If we're looking for WETH it is stored by Bancor as the 0xeee address
|
||||
tokenAddress.toLowerCase() === TOKENS.WETH.toLowerCase()
|
||||
tokenAddress.toLowerCase() === MAINNET_TOKENS.WETH.toLowerCase()
|
||||
? '0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE'
|
||||
: Object.keys(graph).filter(k => k.toLowerCase() === tokenAddress.toLowerCase())[0];
|
||||
|
||||
|
@ -4,20 +4,24 @@ import { BigNumber, NULL_BYTES } from '@0x/utils';
|
||||
import {
|
||||
BAKERYSWAP_ROUTER_BY_CHAIN_ID,
|
||||
BELT_BSC_INFOS,
|
||||
COMPONENT_POOLS_BY_CHAIN_ID,
|
||||
CRYPTO_COM_ROUTER_BY_CHAIN_ID,
|
||||
CURVE_MAINNET_INFOS,
|
||||
ELLIPSIS_BSC_INFOS,
|
||||
KYBER_BRIDGED_LIQUIDITY_PREFIX,
|
||||
KYBER_DMM_ROUTER_BY_CHAIN_ID,
|
||||
MAINNET_CURVE_INFOS,
|
||||
MAINNET_SNOWSWAP_INFOS,
|
||||
MAINNET_SWERVE_INFOS,
|
||||
MAX_DODOV2_POOLS_QUERIED,
|
||||
MAX_KYBER_RESERVES_QUERIED,
|
||||
NERVE_BSC_INFOS,
|
||||
NULL_ADDRESS,
|
||||
PANCAKESWAP_ROUTER_BY_CHAIN_ID,
|
||||
SADDLE_MAINNET_INFOS,
|
||||
SHELL_POOLS_BY_CHAIN_ID,
|
||||
SMOOTHY_BSC_INFOS,
|
||||
SMOOTHY_MAINNET_INFOS,
|
||||
SNOWSWAP_MAINNET_INFOS,
|
||||
SUSHISWAP_ROUTER_BY_CHAIN_ID,
|
||||
SWERVE_MAINNET_INFOS,
|
||||
UNISWAPV2_ROUTER_BY_CHAIN_ID,
|
||||
} from './constants';
|
||||
import { CurveInfo, ERC20BridgeSource } from './types';
|
||||
@ -61,12 +65,22 @@ export function getShellsForPair(chainId: ChainId, takerToken: string, makerToke
|
||||
.map(i => i.poolAddress);
|
||||
}
|
||||
|
||||
// tslint:disable completed-docs
|
||||
export function getComponentForPair(chainId: ChainId, takerToken: string, makerToken: string): string[] {
|
||||
if (chainId !== ChainId.Mainnet) {
|
||||
return [];
|
||||
}
|
||||
return Object.values(COMPONENT_POOLS_BY_CHAIN_ID[chainId])
|
||||
.filter(c => [makerToken, takerToken].every(t => c.tokens.includes(t)))
|
||||
.map(i => i.poolAddress);
|
||||
}
|
||||
|
||||
// tslint:disable completed-docs
|
||||
export function getCurveInfosForPair(chainId: ChainId, takerToken: string, makerToken: string): CurveInfo[] {
|
||||
if (chainId !== ChainId.Mainnet) {
|
||||
return [];
|
||||
}
|
||||
return Object.values(MAINNET_CURVE_INFOS).filter(c =>
|
||||
return Object.values(CURVE_MAINNET_INFOS).filter(c =>
|
||||
[makerToken, takerToken].every(
|
||||
t =>
|
||||
(c.tokens.includes(t) && c.metaToken === undefined) ||
|
||||
@ -79,7 +93,7 @@ export function getSwerveInfosForPair(chainId: ChainId, takerToken: string, make
|
||||
if (chainId !== ChainId.Mainnet) {
|
||||
return [];
|
||||
}
|
||||
return Object.values(MAINNET_SWERVE_INFOS).filter(c =>
|
||||
return Object.values(SWERVE_MAINNET_INFOS).filter(c =>
|
||||
[makerToken, takerToken].every(
|
||||
t =>
|
||||
(c.tokens.includes(t) && c.metaToken === undefined) ||
|
||||
@ -92,7 +106,7 @@ export function getSnowSwapInfosForPair(chainId: ChainId, takerToken: string, ma
|
||||
if (chainId !== ChainId.Mainnet) {
|
||||
return [];
|
||||
}
|
||||
return Object.values(MAINNET_SNOWSWAP_INFOS).filter(c =>
|
||||
return Object.values(SNOWSWAP_MAINNET_INFOS).filter(c =>
|
||||
[makerToken, takerToken].every(
|
||||
t =>
|
||||
(c.tokens.includes(t) && c.metaToken === undefined) ||
|
||||
@ -140,6 +154,61 @@ export function getEllipsisInfosForPair(chainId: ChainId, takerToken: string, ma
|
||||
);
|
||||
}
|
||||
|
||||
export function getSmoothyInfosForPair(chainId: ChainId, takerToken: string, makerToken: string): CurveInfo[] {
|
||||
if (chainId === ChainId.BSC) {
|
||||
return Object.values(SMOOTHY_BSC_INFOS).filter(c =>
|
||||
[makerToken, takerToken].every(
|
||||
t =>
|
||||
(c.tokens.includes(t) && c.metaToken === undefined) ||
|
||||
(c.tokens.includes(t) &&
|
||||
c.metaToken !== undefined &&
|
||||
[makerToken, takerToken].includes(c.metaToken)),
|
||||
),
|
||||
);
|
||||
} else if (chainId === ChainId.Mainnet) {
|
||||
return Object.values(SMOOTHY_MAINNET_INFOS).filter(c =>
|
||||
[makerToken, takerToken].every(
|
||||
t =>
|
||||
(c.tokens.includes(t) && c.metaToken === undefined) ||
|
||||
(c.tokens.includes(t) &&
|
||||
c.metaToken !== undefined &&
|
||||
[makerToken, takerToken].includes(c.metaToken)),
|
||||
),
|
||||
);
|
||||
} else {
|
||||
return [];
|
||||
}
|
||||
}
|
||||
|
||||
export function getSaddleInfosForPair(chainId: ChainId, takerToken: string, makerToken: string): CurveInfo[] {
|
||||
if (chainId !== ChainId.Mainnet) {
|
||||
return [];
|
||||
}
|
||||
return Object.values(SADDLE_MAINNET_INFOS).filter(c =>
|
||||
[makerToken, takerToken].every(
|
||||
t =>
|
||||
(c.tokens.includes(t) && c.metaToken === undefined) ||
|
||||
(c.tokens.includes(t) && c.metaToken !== undefined && [makerToken, takerToken].includes(c.metaToken)),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
export function getShellLikeInfosForPair(
|
||||
chainId: ChainId,
|
||||
takerToken: string,
|
||||
makerToken: string,
|
||||
source: ERC20BridgeSource.Shell | ERC20BridgeSource.Component,
|
||||
): string[] {
|
||||
switch (source) {
|
||||
case ERC20BridgeSource.Shell:
|
||||
return getShellsForPair(chainId, takerToken, makerToken);
|
||||
case ERC20BridgeSource.Component:
|
||||
return getComponentForPair(chainId, takerToken, makerToken);
|
||||
default:
|
||||
throw new Error(`Unknown Shell like source ${source}`);
|
||||
}
|
||||
}
|
||||
|
||||
export function getCurveLikeInfosForPair(
|
||||
chainId: ChainId,
|
||||
takerToken: string,
|
||||
@ -150,7 +219,9 @@ export function getCurveLikeInfosForPair(
|
||||
| ERC20BridgeSource.SnowSwap
|
||||
| ERC20BridgeSource.Nerve
|
||||
| ERC20BridgeSource.Belt
|
||||
| ERC20BridgeSource.Ellipsis,
|
||||
| ERC20BridgeSource.Ellipsis
|
||||
| ERC20BridgeSource.Smoothy
|
||||
| ERC20BridgeSource.Saddle,
|
||||
): CurveInfo[] {
|
||||
switch (source) {
|
||||
case ERC20BridgeSource.Curve:
|
||||
@ -165,6 +236,10 @@ export function getCurveLikeInfosForPair(
|
||||
return getBeltInfosForPair(chainId, takerToken, makerToken);
|
||||
case ERC20BridgeSource.Ellipsis:
|
||||
return getEllipsisInfosForPair(chainId, takerToken, makerToken);
|
||||
case ERC20BridgeSource.Smoothy:
|
||||
return getSmoothyInfosForPair(chainId, takerToken, makerToken);
|
||||
case ERC20BridgeSource.Saddle:
|
||||
return getSaddleInfosForPair(chainId, takerToken, makerToken);
|
||||
default:
|
||||
throw new Error(`Unknown Curve like source ${source}`);
|
||||
}
|
||||
|
@ -83,6 +83,9 @@ export const SELL_SOURCE_FILTER_BY_CHAIN_ID = valueByChainId<SourceFilters>(
|
||||
ERC20BridgeSource.Linkswap,
|
||||
ERC20BridgeSource.MakerPsm,
|
||||
ERC20BridgeSource.KyberDmm,
|
||||
ERC20BridgeSource.Smoothy,
|
||||
ERC20BridgeSource.Component,
|
||||
ERC20BridgeSource.Saddle,
|
||||
]),
|
||||
[ChainId.Ropsten]: new SourceFilters([ERC20BridgeSource.Native]),
|
||||
[ChainId.Rinkeby]: new SourceFilters([ERC20BridgeSource.Native]),
|
||||
@ -99,6 +102,7 @@ export const SELL_SOURCE_FILTER_BY_CHAIN_ID = valueByChainId<SourceFilters>(
|
||||
ERC20BridgeSource.Nerve,
|
||||
ERC20BridgeSource.PancakeSwap,
|
||||
ERC20BridgeSource.SushiSwap,
|
||||
ERC20BridgeSource.Smoothy,
|
||||
]),
|
||||
},
|
||||
|
||||
@ -134,6 +138,9 @@ export const BUY_SOURCE_FILTER_BY_CHAIN_ID = valueByChainId<SourceFilters>(
|
||||
ERC20BridgeSource.Linkswap,
|
||||
ERC20BridgeSource.MakerPsm,
|
||||
ERC20BridgeSource.KyberDmm,
|
||||
ERC20BridgeSource.Smoothy,
|
||||
ERC20BridgeSource.Component,
|
||||
ERC20BridgeSource.Saddle,
|
||||
]),
|
||||
[ChainId.Ropsten]: new SourceFilters([ERC20BridgeSource.Native]),
|
||||
[ChainId.Rinkeby]: new SourceFilters([ERC20BridgeSource.Native]),
|
||||
@ -150,6 +157,7 @@ export const BUY_SOURCE_FILTER_BY_CHAIN_ID = valueByChainId<SourceFilters>(
|
||||
ERC20BridgeSource.Nerve,
|
||||
ERC20BridgeSource.PancakeSwap,
|
||||
ERC20BridgeSource.SushiSwap,
|
||||
ERC20BridgeSource.Smoothy,
|
||||
]),
|
||||
},
|
||||
new SourceFilters([]),
|
||||
@ -202,7 +210,7 @@ const MIRROR_WRAPPED_TOKENS = {
|
||||
|
||||
// Mainnet tokens
|
||||
// Not an exhaustive list, just enough so we don't repeat ourselves
|
||||
export const TOKENS = {
|
||||
export const MAINNET_TOKENS = {
|
||||
WETH: '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2',
|
||||
// Stable Coins
|
||||
DAI: '0x6b175474e89094c44da98b954eedeac495271d0f',
|
||||
@ -217,66 +225,142 @@ export const TOKENS = {
|
||||
mUSD: '0xe2f2a5c287993345a840db3b0845fbc70f5935a5',
|
||||
USDN: '0x674c6ad92fd080e4004b2312b45f796a192d27a0',
|
||||
dUSD: '0x5bc25f649fc4e26069ddf4cf4010f9f706c23831',
|
||||
USDP: '0x1456688345527be1f37e9e627da0837d6f08c925',
|
||||
// Bitcoins
|
||||
WBTC: '0x2260fac5e5542a773aa44fbcfedf7c193bc2c599',
|
||||
RenBTC: '0xeb4c2781e4eba804ce9a9803c67d0893436bb27d',
|
||||
sBTC: '0xfe18be6b3bd88a2d2a7f928d00292e7a9963cfc6',
|
||||
tBTC: '0x8daebade922df735c38c80c7ebd708af50815faa',
|
||||
hBTC: '0x0316eb71485b0ab14103307bf65a021042c6d380',
|
||||
pBTC: '0xde5331ac4b3630f94853ff322b66407e0d6331e8',
|
||||
pBTC: '0x5228a22e72ccc52d415ecfd199f99d0665e7733b',
|
||||
bBTC: '0x9be89d2a4cd102d8fecc6bf9da793be995c22541',
|
||||
oBTC: '0x8064d9ae6cdf087b1bcd5bdf3531bd5d8c537a68',
|
||||
// aTokens (Aave)
|
||||
aDAI: '0x028171bca77440897b824ca71d1c56cac55b68a3',
|
||||
aUSDC: '0xbcca60bb61934080951369a648fb03df4f96263c',
|
||||
aUSDT: '0x3ed3b47dd13ec9a98b44e6204a523e766b225811',
|
||||
aSUSD: '0x6c5024cd4f8a59110119c56f8933403a539555eb',
|
||||
// Other
|
||||
MKR: '0x9f8f72aa9304c8b593d555f12ef6589cc3a579a2',
|
||||
EURS: '0xdb25f211ab05b1c97d595516f45794528a807ad8',
|
||||
sEUR: '0xd71ecff9342a5ced620049e616c5035f1db98620',
|
||||
sETH: '0x5e74c9036fb86bd7ecdcb084a0673efc32ea31cb',
|
||||
stETH: '0xae7ab96520de3a18e5e111b5eaab095312d7fe84',
|
||||
LINK: '0x514910771af9ca656af840dff83e8264ecf986ca',
|
||||
MANA: '0x0f5d2fb29fb7d3cfee444a200298f468908cc942',
|
||||
KNC: '0xdd974d5c2e2928dea5f71b9825b8b646686bd200',
|
||||
AAVE: '0x7fc66500c84a76ad7e9c93437bfc5ac33e2ddae9',
|
||||
sLINK: '0xbbc455cb4f1b9e4bfc4b73970d360c8f032efee6',
|
||||
yUSD: '0x5dbcf33d8c2e976c6b560249878e6f1491bca25c',
|
||||
ybCRV: '0x2994529c0652d127b7842094103715ec5299bbed',
|
||||
yCRV: '0xdf5e0e81dff6faf3a7e52ba697820c5e32d806a8',
|
||||
bCRV: '0x3b3ac5386837dc563660fb6a0937dfaa5924333b',
|
||||
yDAI: '0xacd43e627e64355f1861cec6d3a6688b31a6f952',
|
||||
yUSDC: '0x597ad1e0c13bfe8025993d9e79c69e1c0233522e',
|
||||
yUSDT: '0x2f08119c6f07c006695e079aafc638b8789faf18',
|
||||
yTUSD: '0x37d19d1c4e1fa9dc47bd1ea12f742a0887eda74a',
|
||||
crETH: '0xcbc1065255cbc3ab41a6868c22d1f1c573ab89fd',
|
||||
ankrETH: '0xe95a203b1a91a908f9b9ce46459d101078c2c3cb',
|
||||
vETH: '0x898bad2774eb97cf6b94605677f43b41871410b1',
|
||||
// Mirror Protocol
|
||||
UST: '0xa47c8bf37f92abed4a126bda807a7b7498661acd',
|
||||
MIR: '0x09a3ecafa817268f77be1283176b946c4ff2e608',
|
||||
...MIRROR_WRAPPED_TOKENS,
|
||||
// StableSwap "open pools" (crv.finance)
|
||||
STABLEx: '0xcd91538b91b4ba7797d39a2f66e63810b50a33d0',
|
||||
alUSD: '0xbc6da0fe9ad5f3b0d58160288917aa56653660e9',
|
||||
FRAX: '0x853d955acef822db058eb8505911ed77f175b99e',
|
||||
};
|
||||
|
||||
export const BSC_TOKENS = {
|
||||
BUSD: '0xe9e7cea3dedca5984780bafc599bd69add087d56',
|
||||
USDT: '0x55d398326f99059ff775485246999027b3197955',
|
||||
USDC: '0x8ac76a51cc950d9822d68b83fe1ad97b32cd580d',
|
||||
DAI: '0x1af3f329e8be154074d8769d1ffa4ee058b1dbc3',
|
||||
PAX: '0xb7f8cd00c5a06c0537e2abff0b58033d02e5e094',
|
||||
UST: '0x23396cf899ca06c4472205fc903bdb4de249d6fc',
|
||||
};
|
||||
|
||||
export const CURVE_POOLS = {
|
||||
curve_compound: '0xa2b47e3d5c44877cca798226b7b8118f9bfb7a56', // 0.Compound
|
||||
compound: '0xa2b47e3d5c44877cca798226b7b8118f9bfb7a56', // 0.Compound
|
||||
// 1.USDT is dead
|
||||
curve_PAX: '0x06364f10b501e868329afbc005b3492902d6c763', // 2.PAX
|
||||
// 3. 0x45f783cce6b7ff23b2ab2d70e416cdb7d6055f51 y-pool is dead
|
||||
// 4. 0x79a8c46dea5ada233abaffd40f3a0a2b1e5a4f27 BUSD is dead
|
||||
curve_sUSD: '0xa5407eae9ba41422680e2e00537571bcc53efbfd', // 5.sUSD
|
||||
curve_renBTC: '0x93054188d876f558f4a66b2ef1d97d16edf0895b', // 6.ren
|
||||
curve_sBTC: '0x7fc77b5c7614e1533320ea6ddc2eb61fa00a9714', // 7.sbtc
|
||||
curve_HBTC: '0x4ca9b3063ec5866a4b82e437059d2c43d1be596f', // 8.hbtc
|
||||
curve_TRI: '0xbebc44782c7db0a1a60cb6fe97d0b483032ff1c7', // 9.3pool
|
||||
curve_GUSD: '0x4f062658eaaf2c1ccf8c8e36d6824cdf41167956', // 10.gusd
|
||||
curve_HUSD: '0x3ef6a01a0f81d6046290f3e2a8c5b843e738e604', // 11.husd
|
||||
PAX: '0x06364f10b501e868329afbc005b3492902d6c763', // 2.PAX
|
||||
// 3.y is dead
|
||||
// 3.bUSD is dead
|
||||
sUSD: '0xa5407eae9ba41422680e2e00537571bcc53efbfd', // 5.sUSD
|
||||
renBTC: '0x93054188d876f558f4a66b2ef1d97d16edf0895b', // 6.ren
|
||||
sBTC: '0x7fc77b5c7614e1533320ea6ddc2eb61fa00a9714', // 7.sbtc
|
||||
HBTC: '0x4ca9b3063ec5866a4b82e437059d2c43d1be596f', // 8.hbtc
|
||||
TRI: '0xbebc44782c7db0a1a60cb6fe97d0b483032ff1c7', // 9.3pool
|
||||
GUSD: '0x4f062658eaaf2c1ccf8c8e36d6824cdf41167956', // 10.gusd
|
||||
HUSD: '0x3ef6a01a0f81d6046290f3e2a8c5b843e738e604', // 11.husd
|
||||
// 12.usdk is dead
|
||||
curve_USDN: '0x0f9cb53ebe405d49a0bbdbd291a65ff571bc83e1', // 13.usdn
|
||||
USDN: '0x0f9cb53ebe405d49a0bbdbd291a65ff571bc83e1', // 13.usdn
|
||||
// 14.linkusd is dead
|
||||
curve_mUSD: '0x8474ddbe98f5aa3179b3b3f5942d724afcdec9f6', // 15.musd
|
||||
mUSD: '0x8474ddbe98f5aa3179b3b3f5942d724afcdec9f6', // 15.musd
|
||||
// 16.rsv is dead
|
||||
curve_tBTC: '0xc25099792e9349c7dd09759744ea681c7de2cb66', // 17.tbtc
|
||||
curve_dUSD: '0x8038c01a0390a8c547446a0b2c18fc9aefecc10c', // 18.dusd
|
||||
curve_pBTC: '0x5228a22e72ccc52d415ecfd199f99d0665e7733b', // 19.pbtc
|
||||
curve_bBTC: '0x071c661b4deefb59e2a3ddb20db036821eee8f4b', // 20.bbtc
|
||||
curve_oBTC: '0xd81da8d904b52208541bade1bd6595d8a251f8dd', // 21.obtc
|
||||
curve_UST: '0x890f4e345b1daed0367a877a1612f86a1f86985f', // 22.ust
|
||||
curve_eurs: '0x0ce6a5ff5217e38315f87032cf90686c96627caa', // 23.eurs
|
||||
// curve_seth: '0xc5424b857f758e906013f3555dad202e4bdb4567', // 24.seth
|
||||
curve_aave: '0xdebf20617708857ebe4f679508e7b7863a8a8eee', // 25.aave
|
||||
dUSD: '0x8038c01a0390a8c547446a0b2c18fc9aefecc10c', // 17.dusd
|
||||
tBTC: '0xc25099792e9349c7dd09759744ea681c7de2cb66', // 18.tbtc
|
||||
pBTC: '0x7f55dde206dbad629c080068923b36fe9d6bdbef', // 19.pbtc
|
||||
bBTC: '0x071c661b4deefb59e2a3ddb20db036821eee8f4b', // 20.bbtc
|
||||
oBTC: '0xd81da8d904b52208541bade1bd6595d8a251f8dd', // 21.obtc
|
||||
UST: '0x890f4e345b1daed0367a877a1612f86a1f86985f', // 22.ust
|
||||
eurs: '0x0ce6a5ff5217e38315f87032cf90686c96627caa', // 23.eurs
|
||||
// seth: '0xc5424b857f758e906013f3555dad202e4bdb4567', // 24.seth
|
||||
aave: '0xdebf20617708857ebe4f679508e7b7863a8a8eee', // 25.aave
|
||||
// curve steth: '0xdc24316b9ae028f1497c275eb9192a3ea0f67022' // 26.stETH
|
||||
saave: '0xeb16ae0052ed37f479f7fe63849198df1765a733', // saave
|
||||
// ankreth: '0xa96a65c051bf88b4095ee1f2451c2a9d43f53ae2', // ankreth
|
||||
USDP: '0x42d7025938bec20b69cbae5a77421082407f053a', // usdp
|
||||
ib: '0x2dded6da1bf5dbdf597c45fcfaa3194e53ecfeaf', // iron bank
|
||||
link: '0xf178c0b5bb7e7abf4e12a4838c7b7c5ba2c623c0', // link
|
||||
// StableSwap "open pools" (crv.finance)
|
||||
TUSD: '0xecd5e75afb02efa118af914515d6521aabd189f1',
|
||||
STABLEx: '0x3252efd4ea2d6c78091a1f43982ee2c3659cc3d1',
|
||||
alUSD: '0x43b4fdfd4ff969587185cdb6f0bd875c5fc83f8c',
|
||||
FRAX: '0xd632f22692fac7611d2aa1c0d552930d43caed3b',
|
||||
};
|
||||
|
||||
export const SWERVE_POOLS = {
|
||||
y: '0x329239599afb305da0a2ec69c58f8a6697f9f88d',
|
||||
};
|
||||
|
||||
export const SNOWSWAP_POOLS = {
|
||||
yUSD: '0xbf7ccd6c446acfcc5df023043f2167b62e81899b',
|
||||
yVault: '0x4571753311e37ddb44faa8fb78a6df9a6e3c6c0b',
|
||||
eth: '0x16bea2e63adade5984298d53a4d4d9c09e278192',
|
||||
};
|
||||
|
||||
export const SMOOTHY_POOLS = {
|
||||
syUSD: '0xe5859f4efc09027a9b718781dcb2c6910cac6e91',
|
||||
};
|
||||
|
||||
export const SADDLE_POOLS = {
|
||||
stables: '0x3911f80530595fbd01ab1516ab61255d75aeb066',
|
||||
bitcoins: '0x4f6a43ad7cba042606decaca730d4ce0a57ac62e',
|
||||
};
|
||||
|
||||
export const NERVE_POOLS = {
|
||||
threePool: '0x1b3771a66ee31180906972580ade9b81afc5fcdc',
|
||||
};
|
||||
|
||||
export const BELT_POOLS = {
|
||||
vPool: '0xf16d312d119c13dd27fd0dc814b0bcdcaaa62dfd',
|
||||
};
|
||||
|
||||
export const ELLIPSIS_POOLS = {
|
||||
threePool: '0x160caed03795365f3a589f10c379ffa7d75d4e76',
|
||||
};
|
||||
|
||||
export const DEFAULT_INTERMEDIATE_TOKENS_BY_CHAIN_ID = valueByChainId<string[]>(
|
||||
{
|
||||
[ChainId.Mainnet]: [TOKENS.WETH, TOKENS.USDT, TOKENS.DAI, TOKENS.USDC, TOKENS.WBTC],
|
||||
[ChainId.Mainnet]: [
|
||||
MAINNET_TOKENS.WETH,
|
||||
MAINNET_TOKENS.USDT,
|
||||
MAINNET_TOKENS.DAI,
|
||||
MAINNET_TOKENS.USDC,
|
||||
MAINNET_TOKENS.WBTC,
|
||||
],
|
||||
[ChainId.BSC]: [
|
||||
'0xbb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c', // WBNB
|
||||
'0xe9e7cea3dedca5984780bafc599bd69add087d56', // BUSD
|
||||
@ -297,10 +381,10 @@ export const DEFAULT_TOKEN_ADJACENCY_GRAPH_BY_CHAIN_ID = valueByChainId<TokenAdj
|
||||
// Mirror Protocol
|
||||
.tap(builder => {
|
||||
builder
|
||||
.add(TOKENS.MIR, TOKENS.UST)
|
||||
.add(TOKENS.UST, [TOKENS.MIR, ...Object.values(MIRROR_WRAPPED_TOKENS)])
|
||||
.add(TOKENS.USDT, TOKENS.UST);
|
||||
Object.values(MIRROR_WRAPPED_TOKENS).forEach(t => builder.add(t, TOKENS.UST));
|
||||
.add(MAINNET_TOKENS.MIR, MAINNET_TOKENS.UST)
|
||||
.add(MAINNET_TOKENS.UST, [MAINNET_TOKENS.MIR, ...Object.values(MIRROR_WRAPPED_TOKENS)])
|
||||
.add(MAINNET_TOKENS.USDT, MAINNET_TOKENS.UST);
|
||||
Object.values(MIRROR_WRAPPED_TOKENS).forEach(t => builder.add(t, MAINNET_TOKENS.UST));
|
||||
})
|
||||
// Build
|
||||
.build(),
|
||||
@ -313,7 +397,7 @@ export const DEFAULT_TOKEN_ADJACENCY_GRAPH_BY_CHAIN_ID = valueByChainId<TokenAdj
|
||||
|
||||
export const NATIVE_FEE_TOKEN_BY_CHAIN_ID = valueByChainId<string>(
|
||||
{
|
||||
[ChainId.Mainnet]: TOKENS.WETH,
|
||||
[ChainId.Mainnet]: MAINNET_TOKENS.WETH,
|
||||
[ChainId.BSC]: '0xbb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c', // WBNB
|
||||
},
|
||||
NULL_ADDRESS,
|
||||
@ -321,274 +405,315 @@ export const NATIVE_FEE_TOKEN_BY_CHAIN_ID = valueByChainId<string>(
|
||||
|
||||
export const NATIVE_FEE_TOKEN_AMOUNT_BY_CHAIN_ID = valueByChainId({}, ONE_ETHER);
|
||||
|
||||
// Order dependent
|
||||
const CURVE_TRI_POOL_MAINNET_TOKENS = [MAINNET_TOKENS.DAI, MAINNET_TOKENS.USDC, MAINNET_TOKENS.USDT];
|
||||
const CURVE_TRI_BTC_POOL_TOKEN = [MAINNET_TOKENS.RenBTC, MAINNET_TOKENS.WBTC, MAINNET_TOKENS.sBTC];
|
||||
|
||||
const createCurveExchangePool = (info: { tokens: string[]; pool: string; gasSchedule: number }) => ({
|
||||
exchangeFunctionSelector: CurveFunctionSelectors.exchange,
|
||||
sellQuoteFunctionSelector: CurveFunctionSelectors.get_dy,
|
||||
buyQuoteFunctionSelector: CurveFunctionSelectors.None,
|
||||
tokens: info.tokens,
|
||||
metaToken: undefined,
|
||||
poolAddress: info.pool,
|
||||
gasSchedule: info.gasSchedule,
|
||||
});
|
||||
|
||||
const createCurveExchangeUnderlyingPool = (info: { tokens: string[]; pool: string; gasSchedule: number }) => ({
|
||||
exchangeFunctionSelector: CurveFunctionSelectors.exchange_underlying,
|
||||
sellQuoteFunctionSelector: CurveFunctionSelectors.get_dy_underlying,
|
||||
buyQuoteFunctionSelector: CurveFunctionSelectors.None,
|
||||
tokens: info.tokens,
|
||||
metaToken: undefined,
|
||||
poolAddress: info.pool,
|
||||
gasSchedule: info.gasSchedule,
|
||||
});
|
||||
|
||||
const createCurveMetaTriPool = (info: { token: string; pool: string; gasSchedule: number }) => ({
|
||||
exchangeFunctionSelector: CurveFunctionSelectors.exchange_underlying,
|
||||
sellQuoteFunctionSelector: CurveFunctionSelectors.get_dy_underlying,
|
||||
buyQuoteFunctionSelector: CurveFunctionSelectors.None,
|
||||
tokens: [info.token, ...CURVE_TRI_POOL_MAINNET_TOKENS],
|
||||
metaToken: info.token,
|
||||
poolAddress: info.pool,
|
||||
gasSchedule: info.gasSchedule,
|
||||
});
|
||||
|
||||
const createCurveMetaTriBtcPool = (info: { token: string; pool: string; gasSchedule: number }) => ({
|
||||
exchangeFunctionSelector: CurveFunctionSelectors.exchange_underlying,
|
||||
sellQuoteFunctionSelector: CurveFunctionSelectors.get_dy_underlying,
|
||||
buyQuoteFunctionSelector: CurveFunctionSelectors.None,
|
||||
tokens: [info.token, ...CURVE_TRI_BTC_POOL_TOKEN],
|
||||
metaToken: info.token,
|
||||
poolAddress: info.pool,
|
||||
gasSchedule: info.gasSchedule,
|
||||
});
|
||||
|
||||
/**
|
||||
* Mainnet Curve configuration
|
||||
* The tokens are in order of their index, which each curve defines
|
||||
* I.e DaiUsdc curve has DAI as index 0 and USDC as index 1
|
||||
*/
|
||||
export const MAINNET_CURVE_INFOS: { [name: string]: CurveInfo } = {
|
||||
[CURVE_POOLS.curve_compound]: {
|
||||
exchangeFunctionSelector: CurveFunctionSelectors.exchange_underlying,
|
||||
sellQuoteFunctionSelector: CurveFunctionSelectors.get_dy_underlying,
|
||||
buyQuoteFunctionSelector: CurveFunctionSelectors.get_dx_underlying,
|
||||
poolAddress: CURVE_POOLS.curve_compound,
|
||||
tokens: [TOKENS.DAI, TOKENS.USDC],
|
||||
export const CURVE_MAINNET_INFOS: { [name: string]: CurveInfo } = {
|
||||
[CURVE_POOLS.compound]: createCurveExchangeUnderlyingPool({
|
||||
tokens: [MAINNET_TOKENS.DAI, MAINNET_TOKENS.USDC],
|
||||
pool: CURVE_POOLS.compound,
|
||||
gasSchedule: 597e3,
|
||||
}),
|
||||
[CURVE_POOLS.PAX]: createCurveExchangeUnderlyingPool({
|
||||
tokens: [MAINNET_TOKENS.DAI, MAINNET_TOKENS.USDC, MAINNET_TOKENS.USDT, MAINNET_TOKENS.PAX],
|
||||
pool: CURVE_POOLS.PAX,
|
||||
gasSchedule: 752e3,
|
||||
}),
|
||||
[CURVE_POOLS.sUSD]: createCurveExchangeUnderlyingPool({
|
||||
tokens: [MAINNET_TOKENS.DAI, MAINNET_TOKENS.USDC, MAINNET_TOKENS.USDT, MAINNET_TOKENS.sUSD],
|
||||
pool: CURVE_POOLS.sUSD,
|
||||
gasSchedule: 312e3,
|
||||
}),
|
||||
[CURVE_POOLS.renBTC]: createCurveExchangePool({
|
||||
tokens: [MAINNET_TOKENS.RenBTC, MAINNET_TOKENS.WBTC],
|
||||
pool: CURVE_POOLS.renBTC,
|
||||
gasSchedule: 181e3,
|
||||
}),
|
||||
[CURVE_POOLS.sBTC]: createCurveExchangePool({
|
||||
tokens: [MAINNET_TOKENS.RenBTC, MAINNET_TOKENS.WBTC, MAINNET_TOKENS.sBTC],
|
||||
pool: CURVE_POOLS.sBTC,
|
||||
gasSchedule: 337e3,
|
||||
}),
|
||||
[CURVE_POOLS.HBTC]: createCurveExchangePool({
|
||||
tokens: [MAINNET_TOKENS.hBTC, MAINNET_TOKENS.WBTC],
|
||||
pool: CURVE_POOLS.HBTC,
|
||||
gasSchedule: 220e3,
|
||||
}),
|
||||
[CURVE_POOLS.TRI]: createCurveExchangePool({
|
||||
tokens: [MAINNET_TOKENS.DAI, MAINNET_TOKENS.USDC, MAINNET_TOKENS.USDT],
|
||||
pool: CURVE_POOLS.TRI,
|
||||
gasSchedule: 186e3,
|
||||
}),
|
||||
[CURVE_POOLS.GUSD]: createCurveMetaTriPool({
|
||||
token: MAINNET_TOKENS.GUSD,
|
||||
pool: CURVE_POOLS.GUSD,
|
||||
gasSchedule: 421e3,
|
||||
}),
|
||||
[CURVE_POOLS.HUSD]: createCurveMetaTriPool({
|
||||
token: MAINNET_TOKENS.HUSD,
|
||||
pool: CURVE_POOLS.HUSD,
|
||||
gasSchedule: 406e3,
|
||||
}),
|
||||
[CURVE_POOLS.USDN]: createCurveMetaTriPool({
|
||||
token: MAINNET_TOKENS.USDN,
|
||||
pool: CURVE_POOLS.USDN,
|
||||
gasSchedule: 408e3,
|
||||
}),
|
||||
[CURVE_POOLS.mUSD]: createCurveMetaTriPool({
|
||||
token: MAINNET_TOKENS.mUSD,
|
||||
pool: CURVE_POOLS.mUSD,
|
||||
gasSchedule: 395e3,
|
||||
}),
|
||||
[CURVE_POOLS.dUSD]: createCurveMetaTriPool({
|
||||
token: MAINNET_TOKENS.dUSD,
|
||||
pool: CURVE_POOLS.dUSD,
|
||||
gasSchedule: 381e3,
|
||||
}),
|
||||
[CURVE_POOLS.tBTC]: createCurveMetaTriBtcPool({
|
||||
token: MAINNET_TOKENS.tBTC,
|
||||
pool: CURVE_POOLS.tBTC,
|
||||
gasSchedule: 492e3,
|
||||
}),
|
||||
[CURVE_POOLS.pBTC]: createCurveMetaTriBtcPool({
|
||||
token: MAINNET_TOKENS.pBTC,
|
||||
pool: CURVE_POOLS.pBTC,
|
||||
gasSchedule: 513e3,
|
||||
}),
|
||||
[CURVE_POOLS.bBTC]: createCurveMetaTriBtcPool({
|
||||
token: MAINNET_TOKENS.bBTC,
|
||||
pool: CURVE_POOLS.bBTC,
|
||||
gasSchedule: 507e3,
|
||||
}),
|
||||
[CURVE_POOLS.oBTC]: createCurveMetaTriBtcPool({
|
||||
token: MAINNET_TOKENS.oBTC,
|
||||
pool: CURVE_POOLS.oBTC,
|
||||
gasSchedule: 498e3,
|
||||
}),
|
||||
[CURVE_POOLS.UST]: createCurveMetaTriPool({
|
||||
token: MAINNET_TOKENS.UST,
|
||||
pool: CURVE_POOLS.UST,
|
||||
gasSchedule: 350e3,
|
||||
}),
|
||||
[CURVE_POOLS.eurs]: createCurveExchangePool({
|
||||
tokens: [MAINNET_TOKENS.EURS, MAINNET_TOKENS.sEUR],
|
||||
pool: CURVE_POOLS.eurs,
|
||||
gasSchedule: 330e3,
|
||||
}),
|
||||
[CURVE_POOLS.aave]: createCurveExchangeUnderlyingPool({
|
||||
tokens: [MAINNET_TOKENS.DAI, MAINNET_TOKENS.USDC, MAINNET_TOKENS.USDT],
|
||||
pool: CURVE_POOLS.aave,
|
||||
gasSchedule: 590e3,
|
||||
}),
|
||||
[CURVE_POOLS.aave]: createCurveExchangePool({
|
||||
tokens: [MAINNET_TOKENS.aDAI, MAINNET_TOKENS.aUSDC, MAINNET_TOKENS.aUSDT],
|
||||
pool: CURVE_POOLS.aave,
|
||||
gasSchedule: 590e3,
|
||||
}),
|
||||
[CURVE_POOLS.saave]: createCurveExchangeUnderlyingPool({
|
||||
tokens: [MAINNET_TOKENS.DAI, MAINNET_TOKENS.sUSD],
|
||||
pool: CURVE_POOLS.saave,
|
||||
gasSchedule: 590e3,
|
||||
}),
|
||||
[CURVE_POOLS.saave]: createCurveExchangePool({
|
||||
tokens: [MAINNET_TOKENS.aDAI, MAINNET_TOKENS.aSUSD],
|
||||
pool: CURVE_POOLS.saave,
|
||||
gasSchedule: 590e3,
|
||||
}),
|
||||
[CURVE_POOLS.USDP]: createCurveMetaTriPool({
|
||||
token: MAINNET_TOKENS.USDP,
|
||||
pool: CURVE_POOLS.USDP,
|
||||
gasSchedule: 384e3,
|
||||
}),
|
||||
[CURVE_POOLS.ib]: createCurveExchangeUnderlyingPool({
|
||||
tokens: [MAINNET_TOKENS.DAI, MAINNET_TOKENS.USDC, MAINNET_TOKENS.USDT],
|
||||
pool: CURVE_POOLS.ib,
|
||||
gasSchedule: 656e3,
|
||||
}),
|
||||
[CURVE_POOLS.link]: createCurveExchangePool({
|
||||
tokens: [MAINNET_TOKENS.LINK, MAINNET_TOKENS.sLINK],
|
||||
pool: CURVE_POOLS.link,
|
||||
gasSchedule: 329e3,
|
||||
}),
|
||||
[CURVE_POOLS.TUSD]: createCurveMetaTriPool({
|
||||
token: MAINNET_TOKENS.TUSD,
|
||||
pool: CURVE_POOLS.TUSD,
|
||||
gasSchedule: 414e3,
|
||||
}),
|
||||
[CURVE_POOLS.STABLEx]: createCurveMetaTriPool({
|
||||
token: MAINNET_TOKENS.STABLEx,
|
||||
pool: CURVE_POOLS.STABLEx,
|
||||
gasSchedule: 407e3,
|
||||
}),
|
||||
[CURVE_POOLS.alUSD]: createCurveMetaTriPool({
|
||||
token: MAINNET_TOKENS.alUSD,
|
||||
pool: CURVE_POOLS.alUSD,
|
||||
gasSchedule: 397e3,
|
||||
}),
|
||||
[CURVE_POOLS.FRAX]: createCurveMetaTriPool({
|
||||
token: MAINNET_TOKENS.FRAX,
|
||||
pool: CURVE_POOLS.FRAX,
|
||||
gasSchedule: 397e3,
|
||||
}),
|
||||
};
|
||||
|
||||
export const SWERVE_MAINNET_INFOS: { [name: string]: CurveInfo } = {
|
||||
[SWERVE_POOLS.y]: createCurveExchangePool({
|
||||
tokens: [MAINNET_TOKENS.DAI, MAINNET_TOKENS.USDC, MAINNET_TOKENS.USDT, MAINNET_TOKENS.TUSD],
|
||||
pool: SWERVE_POOLS.y,
|
||||
gasSchedule: 150e3,
|
||||
}),
|
||||
};
|
||||
|
||||
export const SNOWSWAP_MAINNET_INFOS: { [name: string]: CurveInfo } = {
|
||||
[SNOWSWAP_POOLS.yUSD]: createCurveExchangePool({
|
||||
tokens: [MAINNET_TOKENS.yUSD, MAINNET_TOKENS.ybCRV],
|
||||
pool: SNOWSWAP_POOLS.yUSD,
|
||||
gasSchedule: 1000e3,
|
||||
}),
|
||||
[SNOWSWAP_POOLS.yUSD]: createCurveExchangeUnderlyingPool({
|
||||
tokens: [MAINNET_TOKENS.yCRV, MAINNET_TOKENS.bCRV],
|
||||
pool: SNOWSWAP_POOLS.yUSD,
|
||||
gasSchedule: 1000e3,
|
||||
}),
|
||||
[SNOWSWAP_POOLS.yVault]: createCurveExchangePool({
|
||||
tokens: [MAINNET_TOKENS.yDAI, MAINNET_TOKENS.yUSDC, MAINNET_TOKENS.yUSDT, MAINNET_TOKENS.yTUSD],
|
||||
pool: SNOWSWAP_POOLS.yVault,
|
||||
gasSchedule: 1500e3,
|
||||
}),
|
||||
[SNOWSWAP_POOLS.eth]: createCurveExchangePool({
|
||||
tokens: [MAINNET_TOKENS.WETH, MAINNET_TOKENS.vETH, MAINNET_TOKENS.ankrETH, MAINNET_TOKENS.crETH],
|
||||
pool: SNOWSWAP_POOLS.eth,
|
||||
gasSchedule: 1000e3,
|
||||
}),
|
||||
};
|
||||
|
||||
export const BELT_BSC_INFOS: { [name: string]: CurveInfo } = {
|
||||
[BELT_POOLS.vPool]: createCurveExchangeUnderlyingPool({
|
||||
tokens: [BSC_TOKENS.DAI, BSC_TOKENS.USDC, BSC_TOKENS.USDT, BSC_TOKENS.BUSD],
|
||||
pool: BELT_POOLS.vPool,
|
||||
gasSchedule: 4500e3,
|
||||
}),
|
||||
};
|
||||
|
||||
export const ELLIPSIS_BSC_INFOS: { [name: string]: CurveInfo } = {
|
||||
[ELLIPSIS_POOLS.threePool]: createCurveExchangePool({
|
||||
tokens: [BSC_TOKENS.BUSD, BSC_TOKENS.USDC, BSC_TOKENS.USDT],
|
||||
pool: ELLIPSIS_POOLS.threePool,
|
||||
gasSchedule: 150e3,
|
||||
}),
|
||||
};
|
||||
|
||||
// Curve pools like using custom selectors
|
||||
export const SADDLE_MAINNET_INFOS: { [name: string]: CurveInfo } = {
|
||||
[SADDLE_POOLS.stables]: {
|
||||
exchangeFunctionSelector: CurveFunctionSelectors.swap,
|
||||
sellQuoteFunctionSelector: CurveFunctionSelectors.calculateSwap,
|
||||
buyQuoteFunctionSelector: CurveFunctionSelectors.None,
|
||||
poolAddress: SADDLE_POOLS.stables,
|
||||
tokens: [MAINNET_TOKENS.DAI, MAINNET_TOKENS.USDC, MAINNET_TOKENS.USDT],
|
||||
metaToken: undefined,
|
||||
gasSchedule: 220e3,
|
||||
},
|
||||
[CURVE_POOLS.curve_PAX]: {
|
||||
exchangeFunctionSelector: CurveFunctionSelectors.exchange_underlying,
|
||||
sellQuoteFunctionSelector: CurveFunctionSelectors.get_dy_underlying,
|
||||
buyQuoteFunctionSelector: CurveFunctionSelectors.None,
|
||||
poolAddress: CURVE_POOLS.curve_PAX,
|
||||
tokens: [TOKENS.DAI, TOKENS.USDC, TOKENS.USDT, TOKENS.PAX],
|
||||
metaToken: undefined,
|
||||
},
|
||||
[CURVE_POOLS.curve_sUSD]: {
|
||||
exchangeFunctionSelector: CurveFunctionSelectors.exchange_underlying,
|
||||
sellQuoteFunctionSelector: CurveFunctionSelectors.get_dy_underlying,
|
||||
buyQuoteFunctionSelector: CurveFunctionSelectors.None,
|
||||
poolAddress: CURVE_POOLS.curve_sUSD,
|
||||
tokens: [TOKENS.DAI, TOKENS.USDC, TOKENS.USDT, TOKENS.sUSD],
|
||||
metaToken: undefined,
|
||||
},
|
||||
[CURVE_POOLS.curve_renBTC]: {
|
||||
exchangeFunctionSelector: CurveFunctionSelectors.exchange,
|
||||
sellQuoteFunctionSelector: CurveFunctionSelectors.get_dy,
|
||||
buyQuoteFunctionSelector: CurveFunctionSelectors.None,
|
||||
poolAddress: CURVE_POOLS.curve_renBTC,
|
||||
tokens: [TOKENS.RenBTC, TOKENS.WBTC],
|
||||
metaToken: undefined,
|
||||
},
|
||||
[CURVE_POOLS.curve_sBTC]: {
|
||||
exchangeFunctionSelector: CurveFunctionSelectors.exchange,
|
||||
sellQuoteFunctionSelector: CurveFunctionSelectors.get_dy,
|
||||
buyQuoteFunctionSelector: CurveFunctionSelectors.None,
|
||||
poolAddress: CURVE_POOLS.curve_sBTC,
|
||||
tokens: [TOKENS.RenBTC, TOKENS.WBTC, TOKENS.sBTC],
|
||||
metaToken: undefined,
|
||||
},
|
||||
[CURVE_POOLS.curve_HBTC]: {
|
||||
exchangeFunctionSelector: CurveFunctionSelectors.exchange,
|
||||
sellQuoteFunctionSelector: CurveFunctionSelectors.get_dy,
|
||||
buyQuoteFunctionSelector: CurveFunctionSelectors.None,
|
||||
poolAddress: CURVE_POOLS.curve_HBTC,
|
||||
tokens: [TOKENS.hBTC, TOKENS.WBTC],
|
||||
metaToken: undefined,
|
||||
},
|
||||
[CURVE_POOLS.curve_TRI]: {
|
||||
exchangeFunctionSelector: CurveFunctionSelectors.exchange,
|
||||
sellQuoteFunctionSelector: CurveFunctionSelectors.get_dy,
|
||||
buyQuoteFunctionSelector: CurveFunctionSelectors.None,
|
||||
poolAddress: CURVE_POOLS.curve_TRI,
|
||||
tokens: [TOKENS.DAI, TOKENS.USDC, TOKENS.USDT],
|
||||
metaToken: undefined,
|
||||
},
|
||||
[CURVE_POOLS.curve_GUSD]: {
|
||||
exchangeFunctionSelector: CurveFunctionSelectors.exchange_underlying,
|
||||
sellQuoteFunctionSelector: CurveFunctionSelectors.get_dy_underlying,
|
||||
buyQuoteFunctionSelector: CurveFunctionSelectors.None,
|
||||
poolAddress: CURVE_POOLS.curve_GUSD,
|
||||
tokens: [TOKENS.GUSD, TOKENS.DAI, TOKENS.USDC, TOKENS.USDT],
|
||||
metaToken: TOKENS.GUSD,
|
||||
},
|
||||
[CURVE_POOLS.curve_HUSD]: {
|
||||
exchangeFunctionSelector: CurveFunctionSelectors.exchange_underlying,
|
||||
sellQuoteFunctionSelector: CurveFunctionSelectors.get_dy_underlying,
|
||||
buyQuoteFunctionSelector: CurveFunctionSelectors.None,
|
||||
poolAddress: CURVE_POOLS.curve_HUSD,
|
||||
tokens: [TOKENS.HUSD, TOKENS.DAI, TOKENS.USDC, TOKENS.USDT],
|
||||
metaToken: TOKENS.HUSD,
|
||||
},
|
||||
[CURVE_POOLS.curve_USDN]: {
|
||||
exchangeFunctionSelector: CurveFunctionSelectors.exchange_underlying,
|
||||
sellQuoteFunctionSelector: CurveFunctionSelectors.get_dy_underlying,
|
||||
buyQuoteFunctionSelector: CurveFunctionSelectors.None,
|
||||
poolAddress: CURVE_POOLS.curve_USDN,
|
||||
tokens: [TOKENS.USDN, TOKENS.DAI, TOKENS.USDC, TOKENS.USDT],
|
||||
metaToken: TOKENS.USDN,
|
||||
},
|
||||
[CURVE_POOLS.curve_mUSD]: {
|
||||
exchangeFunctionSelector: CurveFunctionSelectors.exchange_underlying,
|
||||
sellQuoteFunctionSelector: CurveFunctionSelectors.get_dy_underlying,
|
||||
buyQuoteFunctionSelector: CurveFunctionSelectors.None,
|
||||
poolAddress: CURVE_POOLS.curve_mUSD,
|
||||
tokens: [TOKENS.mUSD, TOKENS.DAI, TOKENS.USDC, TOKENS.USDT],
|
||||
metaToken: TOKENS.mUSD,
|
||||
},
|
||||
[CURVE_POOLS.curve_tBTC]: {
|
||||
exchangeFunctionSelector: CurveFunctionSelectors.exchange_underlying,
|
||||
sellQuoteFunctionSelector: CurveFunctionSelectors.get_dy_underlying,
|
||||
buyQuoteFunctionSelector: CurveFunctionSelectors.None,
|
||||
poolAddress: CURVE_POOLS.curve_tBTC,
|
||||
tokens: [TOKENS.tBTC, TOKENS.RenBTC, TOKENS.WBTC, TOKENS.sBTC],
|
||||
metaToken: TOKENS.tBTC,
|
||||
},
|
||||
[CURVE_POOLS.curve_dUSD]: {
|
||||
exchangeFunctionSelector: CurveFunctionSelectors.exchange_underlying,
|
||||
sellQuoteFunctionSelector: CurveFunctionSelectors.get_dy_underlying,
|
||||
buyQuoteFunctionSelector: CurveFunctionSelectors.None,
|
||||
poolAddress: CURVE_POOLS.curve_dUSD,
|
||||
tokens: [TOKENS.dUSD, TOKENS.DAI, TOKENS.USDC, TOKENS.USDT],
|
||||
metaToken: TOKENS.dUSD,
|
||||
},
|
||||
[CURVE_POOLS.curve_pBTC]: {
|
||||
exchangeFunctionSelector: CurveFunctionSelectors.exchange_underlying,
|
||||
sellQuoteFunctionSelector: CurveFunctionSelectors.get_dy_underlying,
|
||||
buyQuoteFunctionSelector: CurveFunctionSelectors.None,
|
||||
poolAddress: CURVE_POOLS.curve_pBTC,
|
||||
tokens: [TOKENS.pBTC, TOKENS.RenBTC, TOKENS.WBTC, TOKENS.sBTC],
|
||||
metaToken: TOKENS.pBTC,
|
||||
},
|
||||
[CURVE_POOLS.curve_bBTC]: {
|
||||
exchangeFunctionSelector: CurveFunctionSelectors.exchange_underlying,
|
||||
sellQuoteFunctionSelector: CurveFunctionSelectors.get_dy_underlying,
|
||||
buyQuoteFunctionSelector: CurveFunctionSelectors.None,
|
||||
poolAddress: CURVE_POOLS.curve_bBTC,
|
||||
tokens: [TOKENS.bBTC, TOKENS.RenBTC, TOKENS.WBTC, TOKENS.sBTC],
|
||||
metaToken: TOKENS.bBTC,
|
||||
},
|
||||
[CURVE_POOLS.curve_oBTC]: {
|
||||
exchangeFunctionSelector: CurveFunctionSelectors.exchange_underlying,
|
||||
sellQuoteFunctionSelector: CurveFunctionSelectors.get_dy_underlying,
|
||||
buyQuoteFunctionSelector: CurveFunctionSelectors.None,
|
||||
poolAddress: CURVE_POOLS.curve_oBTC,
|
||||
tokens: [TOKENS.oBTC, TOKENS.RenBTC, TOKENS.WBTC, TOKENS.sBTC],
|
||||
metaToken: TOKENS.oBTC,
|
||||
},
|
||||
[CURVE_POOLS.curve_UST]: {
|
||||
exchangeFunctionSelector: CurveFunctionSelectors.exchange_underlying,
|
||||
sellQuoteFunctionSelector: CurveFunctionSelectors.get_dy_underlying,
|
||||
buyQuoteFunctionSelector: CurveFunctionSelectors.None,
|
||||
poolAddress: CURVE_POOLS.curve_UST,
|
||||
tokens: [TOKENS.UST, TOKENS.DAI, TOKENS.USDC, TOKENS.USDT],
|
||||
metaToken: TOKENS.UST,
|
||||
},
|
||||
[CURVE_POOLS.curve_eurs]: {
|
||||
exchangeFunctionSelector: CurveFunctionSelectors.exchange,
|
||||
sellQuoteFunctionSelector: CurveFunctionSelectors.get_dy,
|
||||
buyQuoteFunctionSelector: CurveFunctionSelectors.None,
|
||||
poolAddress: CURVE_POOLS.curve_eurs,
|
||||
tokens: [TOKENS.EURS, TOKENS.sEUR],
|
||||
metaToken: undefined,
|
||||
},
|
||||
// [POOLS.curve_seth]: {
|
||||
// exchangeFunctionSelector: CurveFunctionSelectors.exchange,
|
||||
// sellQuoteFunctionSelector: CurveFunctionSelectors.get_dy,
|
||||
// TODO:Romain having "Cannot swap more than you own" error when running simbot
|
||||
// [SADDLE_POOLS.bitcoins]: {
|
||||
// exchangeFunctionSelector: CurveFunctionSelectors.swap,
|
||||
// sellQuoteFunctionSelector: CurveFunctionSelectors.calculateSwap,
|
||||
// buyQuoteFunctionSelector: CurveFunctionSelectors.None,
|
||||
// poolAddress: POOLS.curve_seth,
|
||||
// tokens: [TOKENS.ETH, TOKENS.sETH],
|
||||
// poolAddress: SADDLE_POOLS.stables,
|
||||
// tokens: [MAINNET_TOKENS.tBTC, MAINNET_TOKENS.WBTC, MAINNET_TOKENS.RenBTC, MAINNET_TOKENS.sBTC],
|
||||
// metaToken: undefined,
|
||||
// gasSchedule: 220e3,
|
||||
// },
|
||||
[CURVE_POOLS.curve_aave]: {
|
||||
exchangeFunctionSelector: CurveFunctionSelectors.exchange_underlying,
|
||||
sellQuoteFunctionSelector: CurveFunctionSelectors.get_dy_underlying,
|
||||
};
|
||||
|
||||
export const SMOOTHY_MAINNET_INFOS: { [name: string]: CurveInfo } = {
|
||||
[SMOOTHY_POOLS.syUSD]: {
|
||||
exchangeFunctionSelector: CurveFunctionSelectors.swap_uint256,
|
||||
sellQuoteFunctionSelector: CurveFunctionSelectors.get_swap_amount,
|
||||
buyQuoteFunctionSelector: CurveFunctionSelectors.None,
|
||||
poolAddress: CURVE_POOLS.curve_aave,
|
||||
tokens: [TOKENS.DAI, TOKENS.USDC, TOKENS.USDT],
|
||||
metaToken: undefined,
|
||||
},
|
||||
[CURVE_POOLS.curve_aave]: {
|
||||
exchangeFunctionSelector: CurveFunctionSelectors.exchange,
|
||||
sellQuoteFunctionSelector: CurveFunctionSelectors.get_dy,
|
||||
buyQuoteFunctionSelector: CurveFunctionSelectors.None,
|
||||
poolAddress: CURVE_POOLS.curve_aave,
|
||||
tokens: [TOKENS.aDAI, TOKENS.aUSDC, TOKENS.aUSDT],
|
||||
poolAddress: SMOOTHY_POOLS.syUSD,
|
||||
tokens: [
|
||||
MAINNET_TOKENS.USDT,
|
||||
MAINNET_TOKENS.USDC,
|
||||
MAINNET_TOKENS.DAI,
|
||||
MAINNET_TOKENS.TUSD,
|
||||
MAINNET_TOKENS.sUSD,
|
||||
MAINNET_TOKENS.BUSD,
|
||||
MAINNET_TOKENS.PAX,
|
||||
MAINNET_TOKENS.GUSD,
|
||||
],
|
||||
metaToken: undefined,
|
||||
gasSchedule: 200e3,
|
||||
},
|
||||
};
|
||||
|
||||
export const MAINNET_SWERVE_INFOS: { [name: string]: CurveInfo } = {
|
||||
swUSD: {
|
||||
exchangeFunctionSelector: CurveFunctionSelectors.exchange,
|
||||
sellQuoteFunctionSelector: CurveFunctionSelectors.get_dy,
|
||||
export const SMOOTHY_BSC_INFOS: { [name: string]: CurveInfo } = {
|
||||
[SMOOTHY_POOLS.syUSD]: {
|
||||
exchangeFunctionSelector: CurveFunctionSelectors.swap_uint256,
|
||||
sellQuoteFunctionSelector: CurveFunctionSelectors.get_swap_amount,
|
||||
buyQuoteFunctionSelector: CurveFunctionSelectors.None,
|
||||
poolAddress: '0x329239599afb305da0a2ec69c58f8a6697f9f88d', // _target: 0xa5407eae9ba41422680e2e00537571bcc53efbfd
|
||||
tokens: [TOKENS.DAI, TOKENS.USDC, TOKENS.USDT, TOKENS.TUSD],
|
||||
metaToken: undefined,
|
||||
},
|
||||
};
|
||||
|
||||
export const MAINNET_SNOWSWAP_INFOS: { [name: string]: CurveInfo } = {
|
||||
yVaultCurve: {
|
||||
exchangeFunctionSelector: CurveFunctionSelectors.exchange,
|
||||
sellQuoteFunctionSelector: CurveFunctionSelectors.get_dy,
|
||||
buyQuoteFunctionSelector: CurveFunctionSelectors.get_dx,
|
||||
poolAddress: '0xbf7ccd6c446acfcc5df023043f2167b62e81899b',
|
||||
tokens: [
|
||||
'0x5dbcf33d8c2e976c6b560249878e6f1491bca25c', // yUSD
|
||||
'0x2994529c0652d127b7842094103715ec5299bbed', // ybCRV
|
||||
],
|
||||
metaToken: undefined,
|
||||
},
|
||||
yVaultCurveUnderlying: {
|
||||
exchangeFunctionSelector: CurveFunctionSelectors.exchange_underlying,
|
||||
sellQuoteFunctionSelector: CurveFunctionSelectors.get_dy_underlying,
|
||||
buyQuoteFunctionSelector: CurveFunctionSelectors.get_dx_underlying,
|
||||
poolAddress: '0xbf7ccd6c446acfcc5df023043f2167b62e81899b',
|
||||
tokens: [
|
||||
'0xdf5e0e81dff6faf3a7e52ba697820c5e32d806a8', // yCRV
|
||||
'0x3b3ac5386837dc563660fb6a0937dfaa5924333b', // bCRV
|
||||
],
|
||||
metaToken: undefined,
|
||||
},
|
||||
yVaultUSD: {
|
||||
exchangeFunctionSelector: CurveFunctionSelectors.exchange,
|
||||
sellQuoteFunctionSelector: CurveFunctionSelectors.get_dy,
|
||||
buyQuoteFunctionSelector: CurveFunctionSelectors.get_dx,
|
||||
poolAddress: '0x4571753311e37ddb44faa8fb78a6df9a6e3c6c0b',
|
||||
tokens: [
|
||||
'0xacd43e627e64355f1861cec6d3a6688b31a6f952', // yDAI
|
||||
'0x597ad1e0c13bfe8025993d9e79c69e1c0233522e', // yUSDC
|
||||
'0x2f08119c6f07c006695e079aafc638b8789faf18', // yUSDT
|
||||
'0x37d19d1c4e1fa9dc47bd1ea12f742a0887eda74a', // yTUSD
|
||||
],
|
||||
poolAddress: SMOOTHY_POOLS.syUSD,
|
||||
tokens: [BSC_TOKENS.BUSD, BSC_TOKENS.USDT, BSC_TOKENS.USDC, BSC_TOKENS.DAI, BSC_TOKENS.PAX, BSC_TOKENS.UST],
|
||||
metaToken: undefined,
|
||||
gasSchedule: 100e3,
|
||||
},
|
||||
};
|
||||
|
||||
export const NERVE_BSC_INFOS: { [name: string]: CurveInfo } = {
|
||||
['0x1b3771a66ee31180906972580ade9b81afc5fcdc']: {
|
||||
[NERVE_POOLS.threePool]: {
|
||||
exchangeFunctionSelector: CurveFunctionSelectors.swap,
|
||||
sellQuoteFunctionSelector: CurveFunctionSelectors.calculateSwap,
|
||||
buyQuoteFunctionSelector: CurveFunctionSelectors.None,
|
||||
poolAddress: '0x1b3771a66ee31180906972580ade9b81afc5fcdc',
|
||||
tokens: [
|
||||
'0xe9e7cea3dedca5984780bafc599bd69add087d56', // BUSD
|
||||
'0x55d398326f99059ff775485246999027b3197955', // BUSD-T
|
||||
'0x8ac76a51cc950d9822d68b83fe1ad97b32cd580d', // USDC
|
||||
],
|
||||
metaToken: undefined,
|
||||
},
|
||||
};
|
||||
|
||||
export const BELT_BSC_INFOS: { [name: string]: CurveInfo } = {
|
||||
['0xf16d312d119c13dd27fd0dc814b0bcdcaaa62dfd']: {
|
||||
exchangeFunctionSelector: CurveFunctionSelectors.exchange_underlying,
|
||||
sellQuoteFunctionSelector: CurveFunctionSelectors.get_dy_underlying,
|
||||
buyQuoteFunctionSelector: CurveFunctionSelectors.None,
|
||||
poolAddress: '0xf16d312d119c13dd27fd0dc814b0bcdcaaa62dfd',
|
||||
tokens: [
|
||||
'0x1af3f329e8be154074d8769d1ffa4ee058b1dbc3', // bDAI
|
||||
'0x8ac76a51cc950d9822d68b83fe1ad97b32cd580d', // USDC
|
||||
'0x55d398326f99059ff775485246999027b3197955', // BUSD-T
|
||||
'0xe9e7cea3dedca5984780bafc599bd69add087d56', // BUSD
|
||||
],
|
||||
metaToken: undefined,
|
||||
},
|
||||
};
|
||||
|
||||
export const ELLIPSIS_BSC_INFOS: { [name: string]: CurveInfo } = {
|
||||
['0x160caed03795365f3a589f10c379ffa7d75d4e76']: {
|
||||
exchangeFunctionSelector: CurveFunctionSelectors.exchange,
|
||||
sellQuoteFunctionSelector: CurveFunctionSelectors.get_dy,
|
||||
buyQuoteFunctionSelector: CurveFunctionSelectors.None,
|
||||
poolAddress: '0x160caed03795365f3a589f10c379ffa7d75d4e76',
|
||||
tokens: [
|
||||
'0xe9e7cea3dedca5984780bafc599bd69add087d56', // BUSD
|
||||
'0x8ac76a51cc950d9822d68b83fe1ad97b32cd580d', // USDC
|
||||
'0x55d398326f99059ff775485246999027b3197955', // BUSD-T
|
||||
],
|
||||
poolAddress: NERVE_POOLS.threePool,
|
||||
tokens: [BSC_TOKENS.BUSD, BSC_TOKENS.USDT, BSC_TOKENS.USDC],
|
||||
metaToken: undefined,
|
||||
gasSchedule: 150e3,
|
||||
},
|
||||
};
|
||||
|
||||
@ -605,7 +730,7 @@ export const KYBER_CONFIG_BY_CHAIN_ID = valueByChainId<KyberSamplerOpts>(
|
||||
[ChainId.Mainnet]: {
|
||||
networkProxy: '0x9aab3f75489902f3a48495025729a0af77d4b11e',
|
||||
hintHandler: '0xa1C0Fa73c39CFBcC11ec9Eb1Afc665aba9996E2C',
|
||||
weth: TOKENS.WETH,
|
||||
weth: MAINNET_TOKENS.WETH,
|
||||
},
|
||||
},
|
||||
{
|
||||
@ -620,20 +745,20 @@ export const LIQUIDITY_PROVIDER_REGISTRY_BY_CHAIN_ID = valueByChainId<LiquidityP
|
||||
[ChainId.Mainnet]: {
|
||||
['0x1d0d407c5af8c86f0a6494de86e56ae21e46a951']: {
|
||||
tokens: [
|
||||
TOKENS.WETH,
|
||||
TOKENS.USDC,
|
||||
TOKENS.USDT,
|
||||
TOKENS.WBTC,
|
||||
TOKENS.PAX,
|
||||
TOKENS.LINK,
|
||||
TOKENS.KNC,
|
||||
TOKENS.MANA,
|
||||
TOKENS.DAI,
|
||||
TOKENS.BUSD,
|
||||
TOKENS.AAVE,
|
||||
MAINNET_TOKENS.WETH,
|
||||
MAINNET_TOKENS.USDC,
|
||||
MAINNET_TOKENS.USDT,
|
||||
MAINNET_TOKENS.WBTC,
|
||||
MAINNET_TOKENS.PAX,
|
||||
MAINNET_TOKENS.LINK,
|
||||
MAINNET_TOKENS.KNC,
|
||||
MAINNET_TOKENS.MANA,
|
||||
MAINNET_TOKENS.DAI,
|
||||
MAINNET_TOKENS.BUSD,
|
||||
MAINNET_TOKENS.AAVE,
|
||||
],
|
||||
gasCost: (takerToken: string, makerToken: string) =>
|
||||
[takerToken, makerToken].includes(TOKENS.WETH) ? 160e3 : 280e3,
|
||||
[takerToken, makerToken].includes(MAINNET_TOKENS.WETH) ? 160e3 : 280e3,
|
||||
},
|
||||
},
|
||||
},
|
||||
@ -780,11 +905,11 @@ export const SHELL_POOLS_BY_CHAIN_ID = valueByChainId(
|
||||
[ChainId.Mainnet]: {
|
||||
StableCoins: {
|
||||
poolAddress: '0x8f26d7bab7a73309141a291525c965ecdea7bf42',
|
||||
tokens: [TOKENS.USDC, TOKENS.USDT, TOKENS.sUSD, TOKENS.DAI],
|
||||
tokens: [MAINNET_TOKENS.USDC, MAINNET_TOKENS.USDT, MAINNET_TOKENS.sUSD, MAINNET_TOKENS.DAI],
|
||||
},
|
||||
Bitcoin: {
|
||||
poolAddress: '0xc2d019b901f8d4fdb2b9a65b5d226ad88c66ee8d',
|
||||
tokens: [TOKENS.RenBTC, TOKENS.WBTC, TOKENS.sBTC],
|
||||
tokens: [MAINNET_TOKENS.RenBTC, MAINNET_TOKENS.WBTC, MAINNET_TOKENS.sBTC],
|
||||
},
|
||||
},
|
||||
},
|
||||
@ -800,6 +925,31 @@ export const SHELL_POOLS_BY_CHAIN_ID = valueByChainId(
|
||||
},
|
||||
);
|
||||
|
||||
export const COMPONENT_POOLS_BY_CHAIN_ID = valueByChainId(
|
||||
{
|
||||
[ChainId.Mainnet]: {
|
||||
USDP_USDC_USDT: {
|
||||
poolAddress: '0x49519631b404e06ca79c9c7b0dc91648d86f08db',
|
||||
tokens: [MAINNET_TOKENS.USDP, MAINNET_TOKENS.USDC, MAINNET_TOKENS.USDT],
|
||||
},
|
||||
USDP_DAI_SUSD: {
|
||||
poolAddress: '0x6477960dd932d29518d7e8087d5ea3d11e606068',
|
||||
tokens: [MAINNET_TOKENS.USDP, MAINNET_TOKENS.DAI, MAINNET_TOKENS.sUSD],
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
USDP_USDC_USDT: {
|
||||
poolAddress: NULL_ADDRESS,
|
||||
tokens: [] as string[],
|
||||
},
|
||||
USDP_DAI_SUSD: {
|
||||
poolAddress: NULL_ADDRESS,
|
||||
tokens: [] as string[],
|
||||
},
|
||||
},
|
||||
);
|
||||
|
||||
export const BALANCER_SUBGRAPH_URL = 'https://api.thegraph.com/subgraphs/name/balancer-labs/balancer';
|
||||
export const BALANCER_TOP_POOLS_FETCHED = 250;
|
||||
export const BALANCER_MAX_POOLS_FETCHED = 3;
|
||||
@ -844,41 +994,14 @@ export const DEFAULT_GAS_SCHEDULE: Required<FeeSchedule> = {
|
||||
},
|
||||
[ERC20BridgeSource.Eth2Dai]: () => 400e3,
|
||||
[ERC20BridgeSource.Kyber]: () => 450e3,
|
||||
[ERC20BridgeSource.Curve]: fillData => {
|
||||
const poolAddress = (fillData as CurveFillData).pool.poolAddress.toLowerCase();
|
||||
switch (poolAddress) {
|
||||
case CURVE_POOLS.curve_renBTC:
|
||||
case CURVE_POOLS.curve_sBTC:
|
||||
case CURVE_POOLS.curve_sUSD:
|
||||
case CURVE_POOLS.curve_HBTC:
|
||||
case CURVE_POOLS.curve_TRI:
|
||||
return 150e3;
|
||||
case CURVE_POOLS.curve_USDN:
|
||||
case CURVE_POOLS.curve_mUSD:
|
||||
return 300e3;
|
||||
case CURVE_POOLS.curve_GUSD:
|
||||
case CURVE_POOLS.curve_HUSD:
|
||||
return 310e3;
|
||||
case CURVE_POOLS.curve_tBTC:
|
||||
return 370e3;
|
||||
case CURVE_POOLS.curve_UST:
|
||||
return 500e3;
|
||||
case CURVE_POOLS.curve_dUSD:
|
||||
case CURVE_POOLS.curve_bBTC:
|
||||
case CURVE_POOLS.curve_oBTC:
|
||||
case CURVE_POOLS.curve_eurs:
|
||||
return 600e3;
|
||||
case CURVE_POOLS.curve_compound:
|
||||
return 750e3;
|
||||
case CURVE_POOLS.curve_aave:
|
||||
return 800e3;
|
||||
case CURVE_POOLS.curve_PAX:
|
||||
return 850e3;
|
||||
// case POOLS.curve_seth:
|
||||
default:
|
||||
throw new Error(`Unrecognized Curve address: ${poolAddress}`);
|
||||
}
|
||||
},
|
||||
[ERC20BridgeSource.Curve]: fillData => (fillData as CurveFillData).pool.gasSchedule,
|
||||
[ERC20BridgeSource.Swerve]: fillData => (fillData as CurveFillData).pool.gasSchedule,
|
||||
[ERC20BridgeSource.SnowSwap]: fillData => (fillData as CurveFillData).pool.gasSchedule,
|
||||
[ERC20BridgeSource.Nerve]: fillData => (fillData as CurveFillData).pool.gasSchedule,
|
||||
[ERC20BridgeSource.Belt]: fillData => (fillData as CurveFillData).pool.gasSchedule,
|
||||
[ERC20BridgeSource.Ellipsis]: fillData => (fillData as CurveFillData).pool.gasSchedule,
|
||||
[ERC20BridgeSource.Smoothy]: fillData => (fillData as CurveFillData).pool.gasSchedule,
|
||||
[ERC20BridgeSource.Saddle]: fillData => (fillData as CurveFillData).pool.gasSchedule,
|
||||
[ERC20BridgeSource.MultiBridge]: () => 350e3,
|
||||
[ERC20BridgeSource.UniswapV2]: (fillData?: FillData) => {
|
||||
// TODO: Different base cost if to/from ETH.
|
||||
@ -930,9 +1053,8 @@ export const DEFAULT_GAS_SCHEDULE: Required<FeeSchedule> = {
|
||||
}
|
||||
},
|
||||
[ERC20BridgeSource.Mooniswap]: () => 130e3,
|
||||
[ERC20BridgeSource.Swerve]: () => 150e3,
|
||||
[ERC20BridgeSource.Nerve]: () => 150e3,
|
||||
[ERC20BridgeSource.Shell]: () => 170e3,
|
||||
[ERC20BridgeSource.Component]: () => 188e3,
|
||||
[ERC20BridgeSource.MultiHop]: (fillData?: FillData) => {
|
||||
const firstHop = (fillData as MultiHopFillData).firstHopSource;
|
||||
const secondHop = (fillData as MultiHopFillData).secondHopSource;
|
||||
@ -950,16 +1072,6 @@ export const DEFAULT_GAS_SCHEDULE: Required<FeeSchedule> = {
|
||||
return isSellBase ? 180e3 : 300e3;
|
||||
},
|
||||
[ERC20BridgeSource.DodoV2]: (_fillData?: FillData) => 100e3,
|
||||
[ERC20BridgeSource.SnowSwap]: fillData => {
|
||||
switch ((fillData as CurveFillData).pool.poolAddress.toLowerCase()) {
|
||||
case '0xbf7ccd6c446acfcc5df023043f2167b62e81899b':
|
||||
return 1000e3;
|
||||
case '0x4571753311e37ddb44faa8fb78a6df9a6e3c6c0b':
|
||||
return 1500e3;
|
||||
default:
|
||||
throw new Error('Unrecognized SnowSwap address');
|
||||
}
|
||||
},
|
||||
[ERC20BridgeSource.Bancor]: (fillData?: FillData) => {
|
||||
let gas = 200e3;
|
||||
const path = (fillData as BancorFillData).path;
|
||||
@ -998,8 +1110,6 @@ export const DEFAULT_GAS_SCHEDULE: Required<FeeSchedule> = {
|
||||
}
|
||||
return gas;
|
||||
},
|
||||
[ERC20BridgeSource.Belt]: () => 4500e3,
|
||||
[ERC20BridgeSource.Ellipsis]: () => 150e3,
|
||||
};
|
||||
|
||||
export const DEFAULT_FEE_SCHEDULE: Required<FeeSchedule> = { ...DEFAULT_GAS_SCHEDULE };
|
||||
|
@ -128,6 +128,12 @@ export function getErc20BridgeSourceToBridgeSource(source: ERC20BridgeSource): s
|
||||
return encodeBridgeSourceId(BridgeProtocol.Curve, 'Belt');
|
||||
case ERC20BridgeSource.Ellipsis:
|
||||
return encodeBridgeSourceId(BridgeProtocol.Curve, 'Ellipsis');
|
||||
case ERC20BridgeSource.Component:
|
||||
return encodeBridgeSourceId(BridgeProtocol.Shell, 'Component');
|
||||
case ERC20BridgeSource.Smoothy:
|
||||
return encodeBridgeSourceId(BridgeProtocol.Curve, 'Smoothy');
|
||||
case ERC20BridgeSource.Saddle:
|
||||
return encodeBridgeSourceId(BridgeProtocol.Nerve, 'Saddle');
|
||||
default:
|
||||
throw new Error(AggregationError.NoBridgeForSource);
|
||||
}
|
||||
@ -155,6 +161,8 @@ export function createBridgeDataForBridgeOrder(order: OptimizedMarketBridgeOrder
|
||||
case ERC20BridgeSource.Nerve:
|
||||
case ERC20BridgeSource.Belt:
|
||||
case ERC20BridgeSource.Ellipsis:
|
||||
case ERC20BridgeSource.Smoothy:
|
||||
case ERC20BridgeSource.Saddle:
|
||||
const curveFillData = (order as OptimizedMarketBridgeOrder<CurveFillData>).fillData;
|
||||
bridgeData = encoder.encode([
|
||||
curveFillData.pool.poolAddress,
|
||||
@ -203,6 +211,7 @@ export function createBridgeDataForBridgeOrder(order: OptimizedMarketBridgeOrder
|
||||
bridgeData = encoder.encode([dodoV2FillData.poolAddress, dodoV2FillData.isSellBase]);
|
||||
break;
|
||||
case ERC20BridgeSource.Shell:
|
||||
case ERC20BridgeSource.Component:
|
||||
const shellFillData = (order as OptimizedMarketBridgeOrder<ShellFillData>).fillData;
|
||||
bridgeData = encoder.encode([shellFillData.poolAddress]);
|
||||
break;
|
||||
@ -302,6 +311,8 @@ export const BRIDGE_ENCODERS: {
|
||||
[ERC20BridgeSource.Nerve]: curveEncoder,
|
||||
[ERC20BridgeSource.Belt]: curveEncoder,
|
||||
[ERC20BridgeSource.Ellipsis]: curveEncoder,
|
||||
[ERC20BridgeSource.Smoothy]: curveEncoder,
|
||||
[ERC20BridgeSource.Saddle]: curveEncoder,
|
||||
// UniswapV2 like, (router, address[])
|
||||
[ERC20BridgeSource.Bancor]: routerAddressPathEncoder,
|
||||
[ERC20BridgeSource.UniswapV2]: routerAddressPathEncoder,
|
||||
@ -311,6 +322,7 @@ export const BRIDGE_ENCODERS: {
|
||||
[ERC20BridgeSource.KyberDmm]: routerAddressPathEncoder,
|
||||
// Generic pools
|
||||
[ERC20BridgeSource.Shell]: poolEncoder,
|
||||
[ERC20BridgeSource.Component]: poolEncoder,
|
||||
[ERC20BridgeSource.Mooniswap]: poolEncoder,
|
||||
[ERC20BridgeSource.Eth2Dai]: poolEncoder,
|
||||
[ERC20BridgeSource.MStable]: poolEncoder,
|
||||
|
@ -12,7 +12,7 @@ import {
|
||||
getCurveLikeInfosForPair,
|
||||
getDodoV2Offsets,
|
||||
getKyberOffsets,
|
||||
getShellsForPair,
|
||||
getShellLikeInfosForPair,
|
||||
isAllowedKyberReserveId,
|
||||
isBadTokenForSource,
|
||||
isValidAddress,
|
||||
@ -25,6 +25,7 @@ import {
|
||||
KYBER_CONFIG_BY_CHAIN_ID,
|
||||
LINKSWAP_ROUTER_BY_CHAIN_ID,
|
||||
LIQUIDITY_PROVIDER_REGISTRY_BY_CHAIN_ID,
|
||||
MAINNET_TOKENS,
|
||||
MAKER_PSM_INFO_BY_CHAIN_ID,
|
||||
MAX_UINT256,
|
||||
MOONISWAP_REGISTRIES_BY_CHAIN_ID,
|
||||
@ -34,7 +35,6 @@ import {
|
||||
NULL_BYTES,
|
||||
OASIS_ROUTER_BY_CHAIN_ID,
|
||||
SELL_SOURCE_FILTER_BY_CHAIN_ID,
|
||||
TOKENS,
|
||||
UNISWAPV1_ROUTER_BY_CHAIN_ID,
|
||||
ZERO_AMOUNT,
|
||||
} from './constants';
|
||||
@ -403,6 +403,62 @@ export class SamplerOperations {
|
||||
});
|
||||
}
|
||||
|
||||
public getSmoothySellQuotes(
|
||||
pool: CurveInfo,
|
||||
fromTokenIdx: number,
|
||||
toTokenIdx: number,
|
||||
takerFillAmounts: BigNumber[],
|
||||
): SourceQuoteOperation<CurveFillData> {
|
||||
return new SamplerContractOperation({
|
||||
source: ERC20BridgeSource.Smoothy,
|
||||
fillData: {
|
||||
pool,
|
||||
fromTokenIdx,
|
||||
toTokenIdx,
|
||||
},
|
||||
contract: this._samplerContract,
|
||||
function: this._samplerContract.sampleSellsFromSmoothy,
|
||||
params: [
|
||||
{
|
||||
poolAddress: pool.poolAddress,
|
||||
sellQuoteFunctionSelector: pool.sellQuoteFunctionSelector,
|
||||
buyQuoteFunctionSelector: pool.buyQuoteFunctionSelector,
|
||||
},
|
||||
new BigNumber(fromTokenIdx),
|
||||
new BigNumber(toTokenIdx),
|
||||
takerFillAmounts,
|
||||
],
|
||||
});
|
||||
}
|
||||
|
||||
public getSmoothyBuyQuotes(
|
||||
pool: CurveInfo,
|
||||
fromTokenIdx: number,
|
||||
toTokenIdx: number,
|
||||
makerFillAmounts: BigNumber[],
|
||||
): SourceQuoteOperation<CurveFillData> {
|
||||
return new SamplerContractOperation({
|
||||
source: ERC20BridgeSource.Smoothy,
|
||||
fillData: {
|
||||
pool,
|
||||
fromTokenIdx,
|
||||
toTokenIdx,
|
||||
},
|
||||
contract: this._samplerContract,
|
||||
function: this._samplerContract.sampleBuysFromSmoothy,
|
||||
params: [
|
||||
{
|
||||
poolAddress: pool.poolAddress,
|
||||
sellQuoteFunctionSelector: pool.sellQuoteFunctionSelector,
|
||||
buyQuoteFunctionSelector: pool.buyQuoteFunctionSelector,
|
||||
},
|
||||
new BigNumber(fromTokenIdx),
|
||||
new BigNumber(toTokenIdx),
|
||||
makerFillAmounts,
|
||||
],
|
||||
});
|
||||
}
|
||||
|
||||
public getBalancerSellQuotes(
|
||||
poolAddress: string,
|
||||
makerToken: string,
|
||||
@ -750,9 +806,10 @@ export class SamplerOperations {
|
||||
makerToken: string,
|
||||
takerToken: string,
|
||||
takerFillAmounts: BigNumber[],
|
||||
source: ERC20BridgeSource = ERC20BridgeSource.Shell,
|
||||
): SourceQuoteOperation<ShellFillData> {
|
||||
return new SamplerContractOperation({
|
||||
source: ERC20BridgeSource.Shell,
|
||||
source,
|
||||
fillData: { poolAddress },
|
||||
contract: this._samplerContract,
|
||||
function: this._samplerContract.sampleSellsFromShell,
|
||||
@ -765,9 +822,10 @@ export class SamplerOperations {
|
||||
makerToken: string,
|
||||
takerToken: string,
|
||||
makerFillAmounts: BigNumber[],
|
||||
source: ERC20BridgeSource = ERC20BridgeSource.Shell,
|
||||
): SourceQuoteOperation {
|
||||
return new SamplerContractOperation({
|
||||
source: ERC20BridgeSource.Shell,
|
||||
source,
|
||||
fillData: { poolAddress },
|
||||
contract: this._samplerContract,
|
||||
function: this._samplerContract.sampleBuysFromShell,
|
||||
@ -1054,6 +1112,7 @@ export class SamplerOperations {
|
||||
case ERC20BridgeSource.Nerve:
|
||||
case ERC20BridgeSource.Belt:
|
||||
case ERC20BridgeSource.Ellipsis:
|
||||
case ERC20BridgeSource.Saddle:
|
||||
return getCurveLikeInfosForPair(this.chainId, takerToken, makerToken, source).map(pool =>
|
||||
this.getCurveSellQuotes(
|
||||
pool,
|
||||
@ -1063,6 +1122,20 @@ export class SamplerOperations {
|
||||
source,
|
||||
),
|
||||
);
|
||||
case ERC20BridgeSource.Smoothy:
|
||||
return getCurveLikeInfosForPair(this.chainId, takerToken, makerToken, source).map(pool =>
|
||||
this.getSmoothySellQuotes(
|
||||
pool,
|
||||
pool.tokens.indexOf(takerToken),
|
||||
pool.tokens.indexOf(makerToken),
|
||||
takerFillAmounts,
|
||||
),
|
||||
);
|
||||
case ERC20BridgeSource.Shell:
|
||||
case ERC20BridgeSource.Component:
|
||||
return getShellLikeInfosForPair(this.chainId, takerToken, makerToken, source).map(pool =>
|
||||
this.getShellSellQuotes(pool, makerToken, takerToken, takerFillAmounts, source),
|
||||
);
|
||||
case ERC20BridgeSource.LiquidityProvider:
|
||||
return getLiquidityProvidersForPair(
|
||||
this.liquidityProviderRegistry,
|
||||
@ -1118,10 +1191,6 @@ export class SamplerOperations {
|
||||
ERC20BridgeSource.Cream,
|
||||
),
|
||||
);
|
||||
case ERC20BridgeSource.Shell:
|
||||
return getShellsForPair(this.chainId, takerToken, makerToken).map(pool =>
|
||||
this.getShellSellQuotes(pool, makerToken, takerToken, takerFillAmounts),
|
||||
);
|
||||
case ERC20BridgeSource.Dodo:
|
||||
if (!isValidAddress(DODO_CONFIG_BY_CHAIN_ID[this.chainId].registry)) {
|
||||
return [];
|
||||
@ -1165,7 +1234,7 @@ export class SamplerOperations {
|
||||
return [
|
||||
[takerToken, makerToken],
|
||||
...getIntermediateTokens(makerToken, takerToken, {
|
||||
default: [TOKENS.LINK, TOKENS.WETH],
|
||||
default: [MAINNET_TOKENS.LINK, MAINNET_TOKENS.WETH],
|
||||
}).map(t => [takerToken, t, makerToken]),
|
||||
].map(path =>
|
||||
this.getUniswapV2SellQuotes(
|
||||
@ -1252,6 +1321,7 @@ export class SamplerOperations {
|
||||
case ERC20BridgeSource.Nerve:
|
||||
case ERC20BridgeSource.Belt:
|
||||
case ERC20BridgeSource.Ellipsis:
|
||||
case ERC20BridgeSource.Saddle:
|
||||
return getCurveLikeInfosForPair(this.chainId, takerToken, makerToken, source).map(pool =>
|
||||
this.getCurveBuyQuotes(
|
||||
pool,
|
||||
@ -1261,6 +1331,20 @@ export class SamplerOperations {
|
||||
source,
|
||||
),
|
||||
);
|
||||
case ERC20BridgeSource.Smoothy:
|
||||
return getCurveLikeInfosForPair(this.chainId, takerToken, makerToken, source).map(pool =>
|
||||
this.getSmoothyBuyQuotes(
|
||||
pool,
|
||||
pool.tokens.indexOf(takerToken),
|
||||
pool.tokens.indexOf(makerToken),
|
||||
makerFillAmounts,
|
||||
),
|
||||
);
|
||||
case ERC20BridgeSource.Shell:
|
||||
case ERC20BridgeSource.Component:
|
||||
return getShellLikeInfosForPair(this.chainId, takerToken, makerToken, source).map(pool =>
|
||||
this.getShellBuyQuotes(pool, makerToken, takerToken, makerFillAmounts, source),
|
||||
);
|
||||
case ERC20BridgeSource.LiquidityProvider:
|
||||
return getLiquidityProvidersForPair(
|
||||
this.liquidityProviderRegistry,
|
||||
@ -1316,10 +1400,6 @@ export class SamplerOperations {
|
||||
ERC20BridgeSource.Cream,
|
||||
),
|
||||
);
|
||||
case ERC20BridgeSource.Shell:
|
||||
return getShellsForPair(this.chainId, takerToken, makerToken).map(pool =>
|
||||
this.getShellBuyQuotes(pool, makerToken, takerToken, makerFillAmounts),
|
||||
);
|
||||
case ERC20BridgeSource.Dodo:
|
||||
if (!isValidAddress(DODO_CONFIG_BY_CHAIN_ID[this.chainId].registry)) {
|
||||
return [];
|
||||
@ -1358,7 +1438,7 @@ export class SamplerOperations {
|
||||
[takerToken, makerToken],
|
||||
// LINK is the base asset in many of the pools on Linkswap
|
||||
...getIntermediateTokens(makerToken, takerToken, {
|
||||
default: [TOKENS.LINK, TOKENS.WETH],
|
||||
default: [MAINNET_TOKENS.LINK, MAINNET_TOKENS.WETH],
|
||||
}).map(t => [takerToken, t, makerToken]),
|
||||
].map(path =>
|
||||
this.getUniswapV2BuyQuotes(
|
||||
|
@ -60,7 +60,10 @@ export enum ERC20BridgeSource {
|
||||
CryptoCom = 'CryptoCom',
|
||||
Linkswap = 'Linkswap',
|
||||
KyberDmm = 'KyberDMM',
|
||||
// Other
|
||||
Smoothy = 'Smoothy',
|
||||
Component = 'Component',
|
||||
Saddle = 'Saddle',
|
||||
// BSC only
|
||||
PancakeSwap = 'PancakeSwap',
|
||||
BakerySwap = 'BakerySwap',
|
||||
Nerve = 'Nerve',
|
||||
@ -80,9 +83,12 @@ export enum CurveFunctionSelectors {
|
||||
get_dx_underlying = '0x0e71d1b9',
|
||||
get_dy = '0x5e0d443f',
|
||||
get_dx = '0x67df02ca',
|
||||
// Nerve BSC
|
||||
swap = '0x91695586',
|
||||
calculateSwap = '0xa95b089f',
|
||||
// Smoothy
|
||||
swap_uint256 = '0x5673b02d', // swap(uint256,uint256,uint256,uint256)
|
||||
get_swap_amount = '0x45cf2ef6', // getSwapAmount(uint256,uint256,uint256)
|
||||
// Nerve BSC, Saddle Mainnet
|
||||
swap = '0x91695586', // swap(uint8,uint8,uint256,uint256,uint256)
|
||||
calculateSwap = '0xa95b089f', // calculateSwap(uint8,uint8,uint256)
|
||||
}
|
||||
// tslint:enable: enum-naming
|
||||
|
||||
@ -96,6 +102,7 @@ export interface CurveInfo {
|
||||
poolAddress: string;
|
||||
tokens: string[];
|
||||
metaToken: string | undefined;
|
||||
gasSchedule: number;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -25,6 +25,7 @@ import * as IMooniswap from '../test/generated-artifacts/IMooniswap.json';
|
||||
import * as IMStable from '../test/generated-artifacts/IMStable.json';
|
||||
import * as IMultiBridge from '../test/generated-artifacts/IMultiBridge.json';
|
||||
import * as IShell from '../test/generated-artifacts/IShell.json';
|
||||
import * as ISmoothy from '../test/generated-artifacts/ISmoothy.json';
|
||||
import * as IUniswapExchangeQuotes from '../test/generated-artifacts/IUniswapExchangeQuotes.json';
|
||||
import * as IUniswapV2Router01 from '../test/generated-artifacts/IUniswapV2Router01.json';
|
||||
import * as KyberSampler from '../test/generated-artifacts/KyberSampler.json';
|
||||
@ -36,6 +37,7 @@ import * as MultiBridgeSampler from '../test/generated-artifacts/MultiBridgeSamp
|
||||
import * as NativeOrderSampler from '../test/generated-artifacts/NativeOrderSampler.json';
|
||||
import * as SamplerUtils from '../test/generated-artifacts/SamplerUtils.json';
|
||||
import * as ShellSampler from '../test/generated-artifacts/ShellSampler.json';
|
||||
import * as SmoothySampler from '../test/generated-artifacts/SmoothySampler.json';
|
||||
import * as TestERC20BridgeSampler from '../test/generated-artifacts/TestERC20BridgeSampler.json';
|
||||
import * as TestNativeOrderSampler from '../test/generated-artifacts/TestNativeOrderSampler.json';
|
||||
import * as TwoHopSampler from '../test/generated-artifacts/TwoHopSampler.json';
|
||||
@ -62,6 +64,7 @@ export const artifacts = {
|
||||
NativeOrderSampler: NativeOrderSampler as ContractArtifact,
|
||||
SamplerUtils: SamplerUtils as ContractArtifact,
|
||||
ShellSampler: ShellSampler as ContractArtifact,
|
||||
SmoothySampler: SmoothySampler as ContractArtifact,
|
||||
TwoHopSampler: TwoHopSampler as ContractArtifact,
|
||||
UniswapSampler: UniswapSampler as ContractArtifact,
|
||||
UniswapV2Sampler: UniswapV2Sampler as ContractArtifact,
|
||||
@ -75,6 +78,7 @@ export const artifacts = {
|
||||
IMooniswap: IMooniswap as ContractArtifact,
|
||||
IMultiBridge: IMultiBridge as ContractArtifact,
|
||||
IShell: IShell as ContractArtifact,
|
||||
ISmoothy: ISmoothy as ContractArtifact,
|
||||
IUniswapExchangeQuotes: IUniswapExchangeQuotes as ContractArtifact,
|
||||
IUniswapV2Router01: IUniswapV2Router01 as ContractArtifact,
|
||||
DummyLiquidityProvider: DummyLiquidityProvider as ContractArtifact,
|
||||
|
@ -3,7 +3,7 @@ import { blockchainTests, describe, expect, toBaseUnitAmount, Web3ProviderEngine
|
||||
import { RPCSubprovider } from '@0x/subproviders';
|
||||
import { BigNumber, NULL_BYTES, providerUtils } from '@0x/utils';
|
||||
|
||||
import { KYBER_CONFIG_BY_CHAIN_ID, TOKENS } from '../../src/utils/market_operation_utils/constants';
|
||||
import { KYBER_CONFIG_BY_CHAIN_ID, MAINNET_TOKENS } from '../../src/utils/market_operation_utils/constants';
|
||||
import { artifacts } from '../artifacts';
|
||||
import { ERC20BridgeSamplerContract } from '../wrappers';
|
||||
|
||||
@ -80,9 +80,9 @@ blockchainTests.skip('Mainnet Sampler Tests', env => {
|
||||
});
|
||||
});
|
||||
describe('Kyber', () => {
|
||||
const WETH = TOKENS.WETH;
|
||||
const DAI = TOKENS.DAI;
|
||||
const USDC = TOKENS.USDC;
|
||||
const WETH = MAINNET_TOKENS.WETH;
|
||||
const DAI = MAINNET_TOKENS.DAI;
|
||||
const USDC = MAINNET_TOKENS.USDC;
|
||||
const RESERVE_OFFSET = new BigNumber(0);
|
||||
const KYBER_OPTS = {
|
||||
...KYBER_CONFIG_BY_CHAIN_ID[ChainId.Mainnet],
|
||||
|
@ -69,6 +69,9 @@ const DEFAULT_EXCLUDED = [
|
||||
ERC20BridgeSource.BakerySwap,
|
||||
ERC20BridgeSource.MakerPsm,
|
||||
ERC20BridgeSource.KyberDmm,
|
||||
ERC20BridgeSource.Smoothy,
|
||||
ERC20BridgeSource.Component,
|
||||
ERC20BridgeSource.Saddle,
|
||||
];
|
||||
const BUY_SOURCES = BUY_SOURCE_FILTER_BY_CHAIN_ID[ChainId.Mainnet].sources;
|
||||
const SELL_SOURCES = SELL_SOURCE_FILTER_BY_CHAIN_ID[ChainId.Mainnet].sources;
|
||||
@ -339,12 +342,35 @@ describe('MarketOperationUtils tests', () => {
|
||||
fromTokenIdx: 0,
|
||||
toTokenIdx: 1,
|
||||
},
|
||||
[ERC20BridgeSource.Smoothy]: {
|
||||
pool: {
|
||||
poolAddress: randomAddress(),
|
||||
tokens: [TAKER_TOKEN, MAKER_TOKEN],
|
||||
exchangeFunctionSelector: hexUtils.random(4),
|
||||
sellQuoteFunctionSelector: hexUtils.random(4),
|
||||
buyQuoteFunctionSelector: hexUtils.random(4),
|
||||
},
|
||||
fromTokenIdx: 0,
|
||||
toTokenIdx: 1,
|
||||
},
|
||||
[ERC20BridgeSource.Saddle]: {
|
||||
pool: {
|
||||
poolAddress: randomAddress(),
|
||||
tokens: [TAKER_TOKEN, MAKER_TOKEN],
|
||||
exchangeFunctionSelector: hexUtils.random(4),
|
||||
sellQuoteFunctionSelector: hexUtils.random(4),
|
||||
buyQuoteFunctionSelector: hexUtils.random(4),
|
||||
},
|
||||
fromTokenIdx: 0,
|
||||
toTokenIdx: 1,
|
||||
},
|
||||
[ERC20BridgeSource.LiquidityProvider]: { poolAddress: randomAddress() },
|
||||
[ERC20BridgeSource.SushiSwap]: { tokenAddressPath: [] },
|
||||
[ERC20BridgeSource.Mooniswap]: { poolAddress: randomAddress() },
|
||||
[ERC20BridgeSource.Native]: { order: new LimitOrder() },
|
||||
[ERC20BridgeSource.MultiHop]: {},
|
||||
[ERC20BridgeSource.Shell]: { poolAddress: randomAddress() },
|
||||
[ERC20BridgeSource.Component]: { poolAddress: randomAddress() },
|
||||
[ERC20BridgeSource.Cream]: { poolAddress: randomAddress() },
|
||||
[ERC20BridgeSource.Dodo]: {},
|
||||
[ERC20BridgeSource.DodoV2]: {},
|
||||
|
@ -23,6 +23,7 @@ export * from '../test/generated-wrappers/i_m_stable';
|
||||
export * from '../test/generated-wrappers/i_mooniswap';
|
||||
export * from '../test/generated-wrappers/i_multi_bridge';
|
||||
export * from '../test/generated-wrappers/i_shell';
|
||||
export * from '../test/generated-wrappers/i_smoothy';
|
||||
export * from '../test/generated-wrappers/i_uniswap_exchange_quotes';
|
||||
export * from '../test/generated-wrappers/i_uniswap_v2_router01';
|
||||
export * from '../test/generated-wrappers/kyber_sampler';
|
||||
@ -34,6 +35,7 @@ export * from '../test/generated-wrappers/multi_bridge_sampler';
|
||||
export * from '../test/generated-wrappers/native_order_sampler';
|
||||
export * from '../test/generated-wrappers/sampler_utils';
|
||||
export * from '../test/generated-wrappers/shell_sampler';
|
||||
export * from '../test/generated-wrappers/smoothy_sampler';
|
||||
export * from '../test/generated-wrappers/test_erc20_bridge_sampler';
|
||||
export * from '../test/generated-wrappers/test_native_order_sampler';
|
||||
export * from '../test/generated-wrappers/two_hop_sampler';
|
||||
|
@ -26,6 +26,7 @@
|
||||
"test/generated-artifacts/IMooniswap.json",
|
||||
"test/generated-artifacts/IMultiBridge.json",
|
||||
"test/generated-artifacts/IShell.json",
|
||||
"test/generated-artifacts/ISmoothy.json",
|
||||
"test/generated-artifacts/IUniswapExchangeQuotes.json",
|
||||
"test/generated-artifacts/IUniswapV2Router01.json",
|
||||
"test/generated-artifacts/KyberSampler.json",
|
||||
@ -37,6 +38,7 @@
|
||||
"test/generated-artifacts/NativeOrderSampler.json",
|
||||
"test/generated-artifacts/SamplerUtils.json",
|
||||
"test/generated-artifacts/ShellSampler.json",
|
||||
"test/generated-artifacts/SmoothySampler.json",
|
||||
"test/generated-artifacts/TestERC20BridgeSampler.json",
|
||||
"test/generated-artifacts/TestNativeOrderSampler.json",
|
||||
"test/generated-artifacts/TwoHopSampler.json",
|
||||
|
@ -2,6 +2,10 @@
|
||||
{
|
||||
"version": "1.4.0",
|
||||
"changes": [
|
||||
{
|
||||
"note": "Added Smoothy, Component, Saddle",
|
||||
"pr": 182
|
||||
},
|
||||
{
|
||||
"note": "Added Nerve",
|
||||
"pr": 181
|
||||
|
@ -126,6 +126,9 @@ export enum BridgeProtocol {
|
||||
CoFiX,
|
||||
Nerve,
|
||||
MakerPsm,
|
||||
Smoothy,
|
||||
Component,
|
||||
Saddle,
|
||||
}
|
||||
// tslint:enable: enum-naming
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user