Compare commits
20 Commits
@0x/contra
...
protocol@7
Author | SHA1 | Date | |
---|---|---|---|
|
719664c145 | ||
|
f800d6c24c | ||
|
a9a81bcafb | ||
|
4280307a15 | ||
|
7b57d3ae51 | ||
|
8a8a5bbda0 | ||
|
76987c8db1 | ||
|
6f8971cc42 | ||
|
71ab882143 | ||
|
5a4961c8d9 | ||
|
4c4fb99d87 | ||
|
872abf09e9 | ||
|
f10bfe7d04 | ||
|
a74d8deff3 | ||
|
835ee4e8de | ||
|
63ec42303f | ||
|
f789aebddc | ||
|
efd83be779 | ||
|
603bc1d51c | ||
|
32a930a7fc |
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@0x/contracts-integrations",
|
"name": "@0x/contracts-integrations",
|
||||||
"version": "2.7.51",
|
"version": "2.7.57",
|
||||||
"private": true,
|
"private": true,
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=6.12"
|
"node": ">=6.12"
|
||||||
@@ -93,7 +93,7 @@
|
|||||||
"typescript": "4.2.2"
|
"typescript": "4.2.2"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@0x/asset-swapper": "^6.18.0",
|
"@0x/asset-swapper": "^16.20.0",
|
||||||
"@0x/base-contract": "^6.4.0",
|
"@0x/base-contract": "^6.4.0",
|
||||||
"@0x/contracts-asset-proxy": "^3.7.16",
|
"@0x/contracts-asset-proxy": "^3.7.16",
|
||||||
"@0x/contracts-erc1155": "^2.1.34",
|
"@0x/contracts-erc1155": "^2.1.34",
|
||||||
|
@@ -1,4 +1,62 @@
|
|||||||
[
|
[
|
||||||
|
{
|
||||||
|
"version": "16.20.0",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "ShibaSwap",
|
||||||
|
"pr": 276
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"timestamp": 1625607277
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"version": "16.19.1",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Fix LiquidityProvider fallback",
|
||||||
|
"pr": 272
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"timestamp": 1625544188
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"version": "16.19.0",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Add LiquidityProvider to Polygon sources",
|
||||||
|
"pr": 270
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"timestamp": 1625190486
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"version": "6.18.3",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Polygon Balance V2"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"timestamp": 1624987208
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"timestamp": 1624562704,
|
||||||
|
"version": "6.18.2",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "Dependencies updated"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"version": "6.18.1",
|
||||||
|
"changes": [
|
||||||
|
{
|
||||||
|
"note": "FirebirdOneSwap, ApeSwap. New hop tokens: DFYN, BANANA, WEXPOLY",
|
||||||
|
"pr": 265
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"timestamp": 1624405040
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"version": "6.18.0",
|
"version": "6.18.0",
|
||||||
"changes": [
|
"changes": [
|
||||||
|
@@ -5,6 +5,30 @@ Edit the package's CHANGELOG.json file only.
|
|||||||
|
|
||||||
CHANGELOG
|
CHANGELOG
|
||||||
|
|
||||||
|
## v16.20.0 - _July 6, 2021_
|
||||||
|
|
||||||
|
* ShibaSwap (#276)
|
||||||
|
|
||||||
|
## v16.19.1 - _July 6, 2021_
|
||||||
|
|
||||||
|
* Fix LiquidityProvider fallback (#272)
|
||||||
|
|
||||||
|
## v16.19.0 - _July 2, 2021_
|
||||||
|
|
||||||
|
* Add LiquidityProvider to Polygon sources (#270)
|
||||||
|
|
||||||
|
## v6.18.3 - _June 29, 2021_
|
||||||
|
|
||||||
|
* Polygon Balance V2
|
||||||
|
|
||||||
|
## v6.18.2 - _June 24, 2021_
|
||||||
|
|
||||||
|
* Dependencies updated
|
||||||
|
|
||||||
|
## v6.18.1 - _June 22, 2021_
|
||||||
|
|
||||||
|
* FirebirdOneSwap, ApeSwap. New hop tokens: DFYN, BANANA, WEXPOLY (#265)
|
||||||
|
|
||||||
## v6.18.0 - _June 22, 2021_
|
## v6.18.0 - _June 22, 2021_
|
||||||
|
|
||||||
* Add Lido stETH deposit integration (#260)
|
* Add Lido stETH deposit integration (#260)
|
||||||
|
@@ -20,12 +20,20 @@
|
|||||||
pragma solidity ^0.6;
|
pragma solidity ^0.6;
|
||||||
pragma experimental ABIEncoderV2;
|
pragma experimental ABIEncoderV2;
|
||||||
|
|
||||||
interface IKyberDmmFactory {
|
interface IKyberDmmPool {
|
||||||
|
|
||||||
function getPoolAtIndex(address token0, address token1, uint256 index)
|
function totalSupply()
|
||||||
external
|
external
|
||||||
view
|
view
|
||||||
returns (address);
|
returns (uint256);
|
||||||
|
}
|
||||||
|
|
||||||
|
interface IKyberDmmFactory {
|
||||||
|
|
||||||
|
function getPools(address token0, address token1)
|
||||||
|
external
|
||||||
|
view
|
||||||
|
returns (address[] memory _tokenPools);
|
||||||
}
|
}
|
||||||
|
|
||||||
interface IKyberDmmRouter {
|
interface IKyberDmmRouter {
|
||||||
@@ -140,17 +148,26 @@ contract KyberDmmSampler
|
|||||||
view
|
view
|
||||||
returns (address[] memory pools)
|
returns (address[] memory pools)
|
||||||
{
|
{
|
||||||
pools = new address[](path.length - 1);
|
|
||||||
IKyberDmmFactory factory = IKyberDmmFactory(IKyberDmmRouter(router).factory());
|
IKyberDmmFactory factory = IKyberDmmFactory(IKyberDmmRouter(router).factory());
|
||||||
|
pools = new address[](path.length - 1);
|
||||||
for (uint256 i = 0; i < pools.length; i++) {
|
for (uint256 i = 0; i < pools.length; i++) {
|
||||||
// Currently only supporting the first pool found at the index
|
// find the best pool
|
||||||
|
address[] memory allPools;
|
||||||
try
|
try
|
||||||
factory.getPoolAtIndex
|
factory.getPools
|
||||||
{gas: KYBER_DMM_CALL_GAS}
|
{gas: KYBER_DMM_CALL_GAS}
|
||||||
(path[i], path[i + 1], 0)
|
(path[i], path[i + 1])
|
||||||
returns (address pool)
|
returns (address[] memory allPools)
|
||||||
{
|
{
|
||||||
pools[i] = pool;
|
uint256 maxSupply = 0;
|
||||||
|
require(allPools.length >= 1, "KyberDMMSampler/NO_POOLS_FOUND");
|
||||||
|
for (uint256 j = 0; j < allPools.length; j++) {
|
||||||
|
uint256 totalSupply = IKyberDmmPool(allPools[j]).totalSupply();
|
||||||
|
if (totalSupply > maxSupply) {
|
||||||
|
maxSupply = totalSupply;
|
||||||
|
pools[i] = allPools[j];
|
||||||
|
}
|
||||||
|
}
|
||||||
} catch (bytes memory) {
|
} catch (bytes memory) {
|
||||||
return new address[](0);
|
return new address[](0);
|
||||||
}
|
}
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@0x/asset-swapper",
|
"name": "@0x/asset-swapper",
|
||||||
"version": "6.18.0",
|
"version": "16.20.0",
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=6.12"
|
"node": ">=6.12"
|
||||||
},
|
},
|
||||||
|
@@ -16,6 +16,8 @@ import {
|
|||||||
CURVE_V2_POLYGON_INFOS,
|
CURVE_V2_POLYGON_INFOS,
|
||||||
DFYN_ROUTER_BY_CHAIN_ID,
|
DFYN_ROUTER_BY_CHAIN_ID,
|
||||||
ELLIPSIS_BSC_INFOS,
|
ELLIPSIS_BSC_INFOS,
|
||||||
|
FIREBIRDONESWAP_BSC_INFOS,
|
||||||
|
FIREBIRDONESWAP_POLYGON_INFOS,
|
||||||
JULSWAP_ROUTER_BY_CHAIN_ID,
|
JULSWAP_ROUTER_BY_CHAIN_ID,
|
||||||
KYBER_BANNED_RESERVES,
|
KYBER_BANNED_RESERVES,
|
||||||
KYBER_BRIDGED_LIQUIDITY_PREFIX,
|
KYBER_BRIDGED_LIQUIDITY_PREFIX,
|
||||||
@@ -30,13 +32,14 @@ import {
|
|||||||
QUICKSWAP_ROUTER_BY_CHAIN_ID,
|
QUICKSWAP_ROUTER_BY_CHAIN_ID,
|
||||||
SADDLE_MAINNET_INFOS,
|
SADDLE_MAINNET_INFOS,
|
||||||
SHELL_POOLS_BY_CHAIN_ID,
|
SHELL_POOLS_BY_CHAIN_ID,
|
||||||
|
SHIBASWAP_ROUTER_BY_CHAIN_ID,
|
||||||
SMOOTHY_BSC_INFOS,
|
SMOOTHY_BSC_INFOS,
|
||||||
SMOOTHY_MAINNET_INFOS,
|
SMOOTHY_MAINNET_INFOS,
|
||||||
SNOWSWAP_MAINNET_INFOS,
|
SNOWSWAP_MAINNET_INFOS,
|
||||||
SUSHISWAP_ROUTER_BY_CHAIN_ID,
|
SUSHISWAP_ROUTER_BY_CHAIN_ID,
|
||||||
SWERVE_MAINNET_INFOS,
|
SWERVE_MAINNET_INFOS,
|
||||||
UNISWAPV2_ROUTER_BY_CHAIN_ID,
|
UNISWAPV2_ROUTER_BY_CHAIN_ID,
|
||||||
WAULT_ROUTER_BY_CHAIN_ID,
|
WAULTSWAP_ROUTER_BY_CHAIN_ID,
|
||||||
XSIGMA_MAINNET_INFOS,
|
XSIGMA_MAINNET_INFOS,
|
||||||
} from './constants';
|
} from './constants';
|
||||||
import { CurveInfo, ERC20BridgeSource } from './types';
|
import { CurveInfo, ERC20BridgeSource } from './types';
|
||||||
@@ -195,6 +198,30 @@ export function getNerveInfosForPair(chainId: ChainId, takerToken: string, maker
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function getFirebirdOneSwapInfosForPair(chainId: ChainId, takerToken: string, makerToken: string): CurveInfo[] {
|
||||||
|
if (chainId === ChainId.BSC) {
|
||||||
|
return Object.values(FIREBIRDONESWAP_BSC_INFOS).filter(c =>
|
||||||
|
[makerToken, takerToken].every(
|
||||||
|
t =>
|
||||||
|
(c.tokens.includes(t) && c.metaTokens === undefined) ||
|
||||||
|
(c.tokens.includes(t) &&
|
||||||
|
[makerToken, takerToken].filter(v => c.metaTokens?.includes(v)).length > 0),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
} else if (chainId === ChainId.Polygon) {
|
||||||
|
return Object.values(FIREBIRDONESWAP_POLYGON_INFOS).filter(c =>
|
||||||
|
[makerToken, takerToken].every(
|
||||||
|
t =>
|
||||||
|
(c.tokens.includes(t) && c.metaTokens === undefined) ||
|
||||||
|
(c.tokens.includes(t) &&
|
||||||
|
[makerToken, takerToken].filter(v => c.metaTokens?.includes(v)).length > 0),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
export function getBeltInfosForPair(chainId: ChainId, takerToken: string, makerToken: string): CurveInfo[] {
|
export function getBeltInfosForPair(chainId: ChainId, takerToken: string, makerToken: string): CurveInfo[] {
|
||||||
if (chainId !== ChainId.BSC) {
|
if (chainId !== ChainId.BSC) {
|
||||||
return [];
|
return [];
|
||||||
@@ -308,7 +335,8 @@ export function getCurveLikeInfosForPair(
|
|||||||
| ERC20BridgeSource.Ellipsis
|
| ERC20BridgeSource.Ellipsis
|
||||||
| ERC20BridgeSource.Smoothy
|
| ERC20BridgeSource.Smoothy
|
||||||
| ERC20BridgeSource.Saddle
|
| ERC20BridgeSource.Saddle
|
||||||
| ERC20BridgeSource.XSigma,
|
| ERC20BridgeSource.XSigma
|
||||||
|
| ERC20BridgeSource.FirebirdOneSwap,
|
||||||
): CurveDetailedInfo[] {
|
): CurveDetailedInfo[] {
|
||||||
let pools: CurveInfo[] = [];
|
let pools: CurveInfo[] = [];
|
||||||
switch (source) {
|
switch (source) {
|
||||||
@@ -342,6 +370,9 @@ export function getCurveLikeInfosForPair(
|
|||||||
case ERC20BridgeSource.XSigma:
|
case ERC20BridgeSource.XSigma:
|
||||||
pools = getXSigmaInfosForPair(chainId, takerToken, makerToken);
|
pools = getXSigmaInfosForPair(chainId, takerToken, makerToken);
|
||||||
break;
|
break;
|
||||||
|
case ERC20BridgeSource.FirebirdOneSwap:
|
||||||
|
pools = getFirebirdOneSwapInfosForPair(chainId, takerToken, makerToken);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
throw new Error(`Unknown Curve like source ${source}`);
|
throw new Error(`Unknown Curve like source ${source}`);
|
||||||
}
|
}
|
||||||
@@ -369,7 +400,8 @@ export function uniswapV2LikeRouterAddress(
|
|||||||
| ERC20BridgeSource.ComethSwap
|
| ERC20BridgeSource.ComethSwap
|
||||||
| ERC20BridgeSource.Dfyn
|
| ERC20BridgeSource.Dfyn
|
||||||
| ERC20BridgeSource.WaultSwap
|
| ERC20BridgeSource.WaultSwap
|
||||||
| ERC20BridgeSource.Polydex,
|
| ERC20BridgeSource.Polydex
|
||||||
|
| ERC20BridgeSource.ShibaSwap,
|
||||||
): string {
|
): string {
|
||||||
switch (source) {
|
switch (source) {
|
||||||
case ERC20BridgeSource.UniswapV2:
|
case ERC20BridgeSource.UniswapV2:
|
||||||
@@ -399,9 +431,11 @@ export function uniswapV2LikeRouterAddress(
|
|||||||
case ERC20BridgeSource.Dfyn:
|
case ERC20BridgeSource.Dfyn:
|
||||||
return DFYN_ROUTER_BY_CHAIN_ID[chainId];
|
return DFYN_ROUTER_BY_CHAIN_ID[chainId];
|
||||||
case ERC20BridgeSource.WaultSwap:
|
case ERC20BridgeSource.WaultSwap:
|
||||||
return WAULT_ROUTER_BY_CHAIN_ID[chainId];
|
return WAULTSWAP_ROUTER_BY_CHAIN_ID[chainId];
|
||||||
case ERC20BridgeSource.Polydex:
|
case ERC20BridgeSource.Polydex:
|
||||||
return POLYDEX_ROUTER_BY_CHAIN_ID[chainId];
|
return POLYDEX_ROUTER_BY_CHAIN_ID[chainId];
|
||||||
|
case ERC20BridgeSource.ShibaSwap:
|
||||||
|
return SHIBASWAP_ROUTER_BY_CHAIN_ID[chainId];
|
||||||
default:
|
default:
|
||||||
throw new Error(`Unknown UniswapV2 like source ${source}`);
|
throw new Error(`Unknown UniswapV2 like source ${source}`);
|
||||||
}
|
}
|
||||||
|
@@ -97,6 +97,7 @@ export const SELL_SOURCE_FILTER_BY_CHAIN_ID = valueByChainId<SourceFilters>(
|
|||||||
ERC20BridgeSource.XSigma,
|
ERC20BridgeSource.XSigma,
|
||||||
ERC20BridgeSource.UniswapV3,
|
ERC20BridgeSource.UniswapV3,
|
||||||
ERC20BridgeSource.CurveV2,
|
ERC20BridgeSource.CurveV2,
|
||||||
|
ERC20BridgeSource.ShibaSwap,
|
||||||
]),
|
]),
|
||||||
[ChainId.Ropsten]: new SourceFilters([
|
[ChainId.Ropsten]: new SourceFilters([
|
||||||
ERC20BridgeSource.Kyber,
|
ERC20BridgeSource.Kyber,
|
||||||
@@ -130,6 +131,7 @@ export const SELL_SOURCE_FILTER_BY_CHAIN_ID = valueByChainId<SourceFilters>(
|
|||||||
ERC20BridgeSource.JulSwap,
|
ERC20BridgeSource.JulSwap,
|
||||||
ERC20BridgeSource.LiquidityProvider,
|
ERC20BridgeSource.LiquidityProvider,
|
||||||
ERC20BridgeSource.WaultSwap,
|
ERC20BridgeSource.WaultSwap,
|
||||||
|
ERC20BridgeSource.FirebirdOneSwap,
|
||||||
]),
|
]),
|
||||||
[ChainId.Polygon]: new SourceFilters([
|
[ChainId.Polygon]: new SourceFilters([
|
||||||
ERC20BridgeSource.SushiSwap,
|
ERC20BridgeSource.SushiSwap,
|
||||||
@@ -143,6 +145,12 @@ export const SELL_SOURCE_FILTER_BY_CHAIN_ID = valueByChainId<SourceFilters>(
|
|||||||
ERC20BridgeSource.CurveV2,
|
ERC20BridgeSource.CurveV2,
|
||||||
ERC20BridgeSource.WaultSwap,
|
ERC20BridgeSource.WaultSwap,
|
||||||
ERC20BridgeSource.Polydex,
|
ERC20BridgeSource.Polydex,
|
||||||
|
ERC20BridgeSource.ApeSwap,
|
||||||
|
ERC20BridgeSource.FirebirdOneSwap,
|
||||||
|
ERC20BridgeSource.BalancerV2,
|
||||||
|
ERC20BridgeSource.KyberDmm,
|
||||||
|
ERC20BridgeSource.LiquidityProvider,
|
||||||
|
ERC20BridgeSource.MultiHop,
|
||||||
]),
|
]),
|
||||||
},
|
},
|
||||||
new SourceFilters([]),
|
new SourceFilters([]),
|
||||||
@@ -185,6 +193,7 @@ export const BUY_SOURCE_FILTER_BY_CHAIN_ID = valueByChainId<SourceFilters>(
|
|||||||
ERC20BridgeSource.XSigma,
|
ERC20BridgeSource.XSigma,
|
||||||
ERC20BridgeSource.UniswapV3,
|
ERC20BridgeSource.UniswapV3,
|
||||||
ERC20BridgeSource.CurveV2,
|
ERC20BridgeSource.CurveV2,
|
||||||
|
ERC20BridgeSource.ShibaSwap,
|
||||||
]),
|
]),
|
||||||
[ChainId.Ropsten]: new SourceFilters([
|
[ChainId.Ropsten]: new SourceFilters([
|
||||||
ERC20BridgeSource.Kyber,
|
ERC20BridgeSource.Kyber,
|
||||||
@@ -218,6 +227,7 @@ export const BUY_SOURCE_FILTER_BY_CHAIN_ID = valueByChainId<SourceFilters>(
|
|||||||
ERC20BridgeSource.JulSwap,
|
ERC20BridgeSource.JulSwap,
|
||||||
ERC20BridgeSource.LiquidityProvider,
|
ERC20BridgeSource.LiquidityProvider,
|
||||||
ERC20BridgeSource.WaultSwap,
|
ERC20BridgeSource.WaultSwap,
|
||||||
|
ERC20BridgeSource.FirebirdOneSwap,
|
||||||
]),
|
]),
|
||||||
[ChainId.Polygon]: new SourceFilters([
|
[ChainId.Polygon]: new SourceFilters([
|
||||||
ERC20BridgeSource.SushiSwap,
|
ERC20BridgeSource.SushiSwap,
|
||||||
@@ -231,6 +241,12 @@ export const BUY_SOURCE_FILTER_BY_CHAIN_ID = valueByChainId<SourceFilters>(
|
|||||||
ERC20BridgeSource.CurveV2,
|
ERC20BridgeSource.CurveV2,
|
||||||
ERC20BridgeSource.WaultSwap,
|
ERC20BridgeSource.WaultSwap,
|
||||||
ERC20BridgeSource.Polydex,
|
ERC20BridgeSource.Polydex,
|
||||||
|
ERC20BridgeSource.ApeSwap,
|
||||||
|
ERC20BridgeSource.FirebirdOneSwap,
|
||||||
|
ERC20BridgeSource.BalancerV2,
|
||||||
|
ERC20BridgeSource.KyberDmm,
|
||||||
|
ERC20BridgeSource.LiquidityProvider,
|
||||||
|
ERC20BridgeSource.MultiHop,
|
||||||
]),
|
]),
|
||||||
},
|
},
|
||||||
new SourceFilters([]),
|
new SourceFilters([]),
|
||||||
@@ -256,13 +272,13 @@ export const FEE_QUOTE_SOURCES_BY_CHAIN_ID = valueByChainId<ERC20BridgeSource[]>
|
|||||||
|
|
||||||
// HACK(mzhu25): Limit and RFQ orders need to be treated as different sources
|
// HACK(mzhu25): Limit and RFQ orders need to be treated as different sources
|
||||||
// when computing the exchange proxy gas overhead.
|
// when computing the exchange proxy gas overhead.
|
||||||
export const SOURCE_FLAGS: { [key in ERC20BridgeSource]: number } & {
|
export const SOURCE_FLAGS: { [key in ERC20BridgeSource]: bigint } & {
|
||||||
RfqOrder: number;
|
RfqOrder: bigint;
|
||||||
LimitOrder: number;
|
LimitOrder: bigint;
|
||||||
} = Object.assign(
|
} = Object.assign(
|
||||||
{},
|
{},
|
||||||
...['RfqOrder', 'LimitOrder', ...Object.values(ERC20BridgeSource)].map((source, index) => ({
|
...['RfqOrder', 'LimitOrder', ...Object.values(ERC20BridgeSource)].map((source, index) => ({
|
||||||
[source]: source === ERC20BridgeSource.Native ? 0 : 1 << index,
|
[source]: source === ERC20BridgeSource.Native ? BigInt(0) : BigInt(1) << BigInt(index),
|
||||||
})),
|
})),
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -350,12 +366,15 @@ export const MAINNET_TOKENS = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
export const BSC_TOKENS = {
|
export const BSC_TOKENS = {
|
||||||
|
WBNB: '0xbb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c',
|
||||||
BUSD: '0xe9e7cea3dedca5984780bafc599bd69add087d56',
|
BUSD: '0xe9e7cea3dedca5984780bafc599bd69add087d56',
|
||||||
USDT: '0x55d398326f99059ff775485246999027b3197955',
|
USDT: '0x55d398326f99059ff775485246999027b3197955',
|
||||||
USDC: '0x8ac76a51cc950d9822d68b83fe1ad97b32cd580d',
|
USDC: '0x8ac76a51cc950d9822d68b83fe1ad97b32cd580d',
|
||||||
DAI: '0x1af3f329e8be154074d8769d1ffa4ee058b1dbc3',
|
DAI: '0x1af3f329e8be154074d8769d1ffa4ee058b1dbc3',
|
||||||
PAX: '0xb7f8cd00c5a06c0537e2abff0b58033d02e5e094',
|
PAX: '0xb7f8cd00c5a06c0537e2abff0b58033d02e5e094',
|
||||||
UST: '0x23396cf899ca06c4472205fc903bdb4de249d6fc',
|
UST: '0x23396cf899ca06c4472205fc903bdb4de249d6fc',
|
||||||
|
WEX: '0xa9c41a46a6b3531d28d5c32f6633dd2ff05dfb90',
|
||||||
|
WETH: '0x2170ed0880ac9a755fd29b2688956bd959f933f8',
|
||||||
};
|
};
|
||||||
|
|
||||||
export const POLYGON_TOKENS = {
|
export const POLYGON_TOKENS = {
|
||||||
@@ -370,8 +389,9 @@ export const POLYGON_TOKENS = {
|
|||||||
WETH: '0x7ceb23fd6bc0add59e62ac25578270cff1b9f619',
|
WETH: '0x7ceb23fd6bc0add59e62ac25578270cff1b9f619',
|
||||||
renBTC: '0xdbf31df14b66535af65aac99c32e9ea844e14501',
|
renBTC: '0xdbf31df14b66535af65aac99c32e9ea844e14501',
|
||||||
QUICK: '0x831753dd7087cac61ab5644b308642cc1c33dc13',
|
QUICK: '0x831753dd7087cac61ab5644b308642cc1c33dc13',
|
||||||
TITAN: '0xaaa5b9e6c589642f98a1cda99b9d024b8407285a',
|
DFYN: '0xc168e40227e4ebd8c1cae80f7a55a4f0e6d66c97',
|
||||||
IRON: '0xd86b5923f3ad7b585ed81b448170ae026c65ae9a',
|
BANANA: '0x5d47baba0d66083c52009271faf3f50dcc01023c',
|
||||||
|
WEXPOLY: '0x4c4bf319237d98a30a929a96112effa8da3510eb',
|
||||||
};
|
};
|
||||||
|
|
||||||
export const CURVE_POOLS = {
|
export const CURVE_POOLS = {
|
||||||
@@ -469,6 +489,14 @@ export const XSIGMA_POOLS = {
|
|||||||
stable: '0x3333333ACdEdBbC9Ad7bda0876e60714195681c5',
|
stable: '0x3333333ACdEdBbC9Ad7bda0876e60714195681c5',
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export const FIREBIRDONESWAP_BSC_POOLS = {
|
||||||
|
oneswap: '0x01c9475dbd36e46d1961572c8de24b74616bae9e',
|
||||||
|
};
|
||||||
|
|
||||||
|
export const FIREBIRDONESWAP_POLYGON_POOLS = {
|
||||||
|
oneswap: '0x01c9475dbd36e46d1961572c8de24b74616bae9e',
|
||||||
|
};
|
||||||
|
|
||||||
export const DEFAULT_INTERMEDIATE_TOKENS_BY_CHAIN_ID = valueByChainId<string[]>(
|
export const DEFAULT_INTERMEDIATE_TOKENS_BY_CHAIN_ID = valueByChainId<string[]>(
|
||||||
{
|
{
|
||||||
[ChainId.Mainnet]: [
|
[ChainId.Mainnet]: [
|
||||||
@@ -479,12 +507,13 @@ export const DEFAULT_INTERMEDIATE_TOKENS_BY_CHAIN_ID = valueByChainId<string[]>(
|
|||||||
MAINNET_TOKENS.WBTC,
|
MAINNET_TOKENS.WBTC,
|
||||||
],
|
],
|
||||||
[ChainId.BSC]: [
|
[ChainId.BSC]: [
|
||||||
'0xbb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c', // WBNB
|
BSC_TOKENS.WBNB,
|
||||||
'0xe9e7cea3dedca5984780bafc599bd69add087d56', // BUSD
|
BSC_TOKENS.BUSD,
|
||||||
'0x1af3f329e8be154074d8769d1ffa4ee058b1dbc3', // DAI
|
BSC_TOKENS.DAI,
|
||||||
'0x8ac76a51cc950d9822d68b83fe1ad97b32cd580d', // USDC
|
BSC_TOKENS.USDC,
|
||||||
'0x2170ed0880ac9a755fd29b2688956bd959f933f8', // ETH
|
BSC_TOKENS.WETH,
|
||||||
'0x55d398326f99059ff775485246999027b3197955', // BUSD-T
|
BSC_TOKENS.USDT,
|
||||||
|
BSC_TOKENS.WEX,
|
||||||
],
|
],
|
||||||
[ChainId.Ropsten]: [
|
[ChainId.Ropsten]: [
|
||||||
getContractAddressesForChainOrThrow(ChainId.Ropsten).etherToken,
|
getContractAddressesForChainOrThrow(ChainId.Ropsten).etherToken,
|
||||||
@@ -498,9 +527,6 @@ export const DEFAULT_INTERMEDIATE_TOKENS_BY_CHAIN_ID = valueByChainId<string[]>(
|
|||||||
POLYGON_TOKENS.DAI,
|
POLYGON_TOKENS.DAI,
|
||||||
POLYGON_TOKENS.USDT,
|
POLYGON_TOKENS.USDT,
|
||||||
POLYGON_TOKENS.WBTC,
|
POLYGON_TOKENS.WBTC,
|
||||||
POLYGON_TOKENS.QUICK,
|
|
||||||
POLYGON_TOKENS.TITAN,
|
|
||||||
POLYGON_TOKENS.IRON,
|
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
[],
|
[],
|
||||||
@@ -886,7 +912,7 @@ export const XSIGMA_MAINNET_INFOS: { [name: string]: CurveInfo } = {
|
|||||||
}),
|
}),
|
||||||
};
|
};
|
||||||
|
|
||||||
// Curve pools like using custom selectors
|
// Curve-like sources using custom selectors
|
||||||
export const SADDLE_MAINNET_INFOS: { [name: string]: CurveInfo } = {
|
export const SADDLE_MAINNET_INFOS: { [name: string]: CurveInfo } = {
|
||||||
[SADDLE_POOLS.stables]: {
|
[SADDLE_POOLS.stables]: {
|
||||||
exchangeFunctionSelector: CurveFunctionSelectors.swap,
|
exchangeFunctionSelector: CurveFunctionSelectors.swap,
|
||||||
@@ -953,6 +979,30 @@ export const NERVE_BSC_INFOS: { [name: string]: CurveInfo } = {
|
|||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export const FIREBIRDONESWAP_BSC_INFOS: { [name: string]: CurveInfo } = {
|
||||||
|
[FIREBIRDONESWAP_BSC_POOLS.oneswap]: {
|
||||||
|
exchangeFunctionSelector: CurveFunctionSelectors.swap,
|
||||||
|
sellQuoteFunctionSelector: CurveFunctionSelectors.calculateSwap,
|
||||||
|
buyQuoteFunctionSelector: CurveFunctionSelectors.None,
|
||||||
|
poolAddress: FIREBIRDONESWAP_BSC_POOLS.oneswap,
|
||||||
|
tokens: [BSC_TOKENS.BUSD, BSC_TOKENS.USDT, BSC_TOKENS.DAI, BSC_TOKENS.USDC],
|
||||||
|
metaTokens: undefined,
|
||||||
|
gasSchedule: 100e3,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
export const FIREBIRDONESWAP_POLYGON_INFOS: { [name: string]: CurveInfo } = {
|
||||||
|
[FIREBIRDONESWAP_POLYGON_POOLS.oneswap]: {
|
||||||
|
exchangeFunctionSelector: CurveFunctionSelectors.swap,
|
||||||
|
sellQuoteFunctionSelector: CurveFunctionSelectors.calculateSwap,
|
||||||
|
buyQuoteFunctionSelector: CurveFunctionSelectors.None,
|
||||||
|
poolAddress: FIREBIRDONESWAP_POLYGON_POOLS.oneswap,
|
||||||
|
tokens: [POLYGON_TOKENS.DAI, POLYGON_TOKENS.USDC, POLYGON_TOKENS.USDT],
|
||||||
|
metaTokens: undefined,
|
||||||
|
gasSchedule: 100e3,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Kyber reserve prefixes
|
* Kyber reserve prefixes
|
||||||
* 0xff Fed price reserve
|
* 0xff Fed price reserve
|
||||||
@@ -1046,6 +1096,13 @@ export const LINKSWAP_ROUTER_BY_CHAIN_ID = valueByChainId<string>(
|
|||||||
NULL_ADDRESS,
|
NULL_ADDRESS,
|
||||||
);
|
);
|
||||||
|
|
||||||
|
export const SHIBASWAP_ROUTER_BY_CHAIN_ID = valueByChainId<string>(
|
||||||
|
{
|
||||||
|
[ChainId.Mainnet]: '0x03f7724180aa6b939894b5ca4314783b0b36b329',
|
||||||
|
},
|
||||||
|
NULL_ADDRESS,
|
||||||
|
);
|
||||||
|
|
||||||
export const MSTABLE_POOLS_BY_CHAIN_ID = valueByChainId(
|
export const MSTABLE_POOLS_BY_CHAIN_ID = valueByChainId(
|
||||||
{
|
{
|
||||||
[ChainId.Mainnet]: {
|
[ChainId.Mainnet]: {
|
||||||
@@ -1091,6 +1148,7 @@ export const OASIS_ROUTER_BY_CHAIN_ID = valueByChainId<string>(
|
|||||||
export const KYBER_DMM_ROUTER_BY_CHAIN_ID = valueByChainId<string>(
|
export const KYBER_DMM_ROUTER_BY_CHAIN_ID = valueByChainId<string>(
|
||||||
{
|
{
|
||||||
[ChainId.Mainnet]: '0x1c87257f5e8609940bc751a07bb085bb7f8cdbe6',
|
[ChainId.Mainnet]: '0x1c87257f5e8609940bc751a07bb085bb7f8cdbe6',
|
||||||
|
[ChainId.Polygon]: '0x546c79662e028b661dfb4767664d0273184e4dd1',
|
||||||
},
|
},
|
||||||
NULL_ADDRESS,
|
NULL_ADDRESS,
|
||||||
);
|
);
|
||||||
@@ -1239,6 +1297,7 @@ export const COMPONENT_POOLS_BY_CHAIN_ID = valueByChainId(
|
|||||||
export const BALANCER_V2_VAULT_ADDRESS_BY_CHAIN = valueByChainId<string>(
|
export const BALANCER_V2_VAULT_ADDRESS_BY_CHAIN = valueByChainId<string>(
|
||||||
{
|
{
|
||||||
[ChainId.Mainnet]: '0xba12222222228d8ba445958a75a0704d566bf2c8',
|
[ChainId.Mainnet]: '0xba12222222228d8ba445958a75a0704d566bf2c8',
|
||||||
|
[ChainId.Polygon]: '0xba12222222228d8ba445958a75a0704d566bf2c8',
|
||||||
},
|
},
|
||||||
NULL_ADDRESS,
|
NULL_ADDRESS,
|
||||||
);
|
);
|
||||||
@@ -1259,7 +1318,13 @@ export const LIDO_INFO_BY_CHAIN = valueByChainId<LidoInfo>(
|
|||||||
export const BALANCER_SUBGRAPH_URL = 'https://api.thegraph.com/subgraphs/name/balancer-labs/balancer';
|
export const BALANCER_SUBGRAPH_URL = 'https://api.thegraph.com/subgraphs/name/balancer-labs/balancer';
|
||||||
export const BALANCER_TOP_POOLS_FETCHED = 250;
|
export const BALANCER_TOP_POOLS_FETCHED = 250;
|
||||||
export const BALANCER_MAX_POOLS_FETCHED = 3;
|
export const BALANCER_MAX_POOLS_FETCHED = 3;
|
||||||
export const BALANCER_V2_SUBGRAPH_URL = 'https://api.thegraph.com/subgraphs/name/balancer-labs/balancer-v2';
|
|
||||||
|
export const BALANCER_V2_SUBGRAPH_URL_BY_CHAIN = valueByChainId<string>(
|
||||||
|
{
|
||||||
|
[ChainId.Polygon]: 'https://api.thegraph.com/subgraphs/name/balancer-labs/balancer-polygon-v2',
|
||||||
|
},
|
||||||
|
'https://api.thegraph.com/subgraphs/name/balancer-labs/balancer-v2',
|
||||||
|
);
|
||||||
|
|
||||||
export const UNISWAPV3_CONFIG_BY_CHAIN_ID = valueByChainId(
|
export const UNISWAPV3_CONFIG_BY_CHAIN_ID = valueByChainId(
|
||||||
{
|
{
|
||||||
@@ -1302,6 +1367,7 @@ export const BAKERYSWAP_ROUTER_BY_CHAIN_ID = valueByChainId<string>(
|
|||||||
export const APESWAP_ROUTER_BY_CHAIN_ID = valueByChainId<string>(
|
export const APESWAP_ROUTER_BY_CHAIN_ID = valueByChainId<string>(
|
||||||
{
|
{
|
||||||
[ChainId.BSC]: '0xc0788a3ad43d79aa53b09c2eacc313a787d1d607',
|
[ChainId.BSC]: '0xc0788a3ad43d79aa53b09c2eacc313a787d1d607',
|
||||||
|
[ChainId.Polygon]: '0xc0788a3ad43d79aa53b09c2eacc313a787d1d607',
|
||||||
},
|
},
|
||||||
NULL_ADDRESS,
|
NULL_ADDRESS,
|
||||||
);
|
);
|
||||||
@@ -1351,7 +1417,7 @@ export const DFYN_ROUTER_BY_CHAIN_ID = valueByChainId<string>(
|
|||||||
NULL_ADDRESS,
|
NULL_ADDRESS,
|
||||||
);
|
);
|
||||||
|
|
||||||
export const WAULT_ROUTER_BY_CHAIN_ID = valueByChainId<string>(
|
export const WAULTSWAP_ROUTER_BY_CHAIN_ID = valueByChainId<string>(
|
||||||
{
|
{
|
||||||
[ChainId.BSC]: '0xd48745e39bbed146eec15b79cbf964884f9877c2',
|
[ChainId.BSC]: '0xd48745e39bbed146eec15b79cbf964884f9877c2',
|
||||||
[ChainId.Polygon]: '0x3a1d87f206d12415f5b0a33e786967680aab4f6d',
|
[ChainId.Polygon]: '0x3a1d87f206d12415f5b0a33e786967680aab4f6d',
|
||||||
@@ -1409,11 +1475,13 @@ export const DEFAULT_GAS_SCHEDULE: Required<FeeSchedule> = {
|
|||||||
[ERC20BridgeSource.Smoothy]: fillData => (fillData as CurveFillData).pool.gasSchedule,
|
[ERC20BridgeSource.Smoothy]: fillData => (fillData as CurveFillData).pool.gasSchedule,
|
||||||
[ERC20BridgeSource.Saddle]: fillData => (fillData as CurveFillData).pool.gasSchedule,
|
[ERC20BridgeSource.Saddle]: fillData => (fillData as CurveFillData).pool.gasSchedule,
|
||||||
[ERC20BridgeSource.XSigma]: fillData => (fillData as CurveFillData).pool.gasSchedule,
|
[ERC20BridgeSource.XSigma]: fillData => (fillData as CurveFillData).pool.gasSchedule,
|
||||||
|
[ERC20BridgeSource.FirebirdOneSwap]: fillData => (fillData as CurveFillData).pool.gasSchedule,
|
||||||
[ERC20BridgeSource.MultiBridge]: () => 350e3,
|
[ERC20BridgeSource.MultiBridge]: () => 350e3,
|
||||||
[ERC20BridgeSource.UniswapV2]: uniswapV2CloneGasSchedule,
|
[ERC20BridgeSource.UniswapV2]: uniswapV2CloneGasSchedule,
|
||||||
[ERC20BridgeSource.SushiSwap]: uniswapV2CloneGasSchedule,
|
[ERC20BridgeSource.SushiSwap]: uniswapV2CloneGasSchedule,
|
||||||
[ERC20BridgeSource.CryptoCom]: uniswapV2CloneGasSchedule,
|
[ERC20BridgeSource.CryptoCom]: uniswapV2CloneGasSchedule,
|
||||||
[ERC20BridgeSource.Linkswap]: uniswapV2CloneGasSchedule,
|
[ERC20BridgeSource.Linkswap]: uniswapV2CloneGasSchedule,
|
||||||
|
[ERC20BridgeSource.ShibaSwap]: uniswapV2CloneGasSchedule,
|
||||||
[ERC20BridgeSource.Balancer]: () => 120e3,
|
[ERC20BridgeSource.Balancer]: () => 120e3,
|
||||||
[ERC20BridgeSource.BalancerV2]: () => 100e3,
|
[ERC20BridgeSource.BalancerV2]: () => 100e3,
|
||||||
[ERC20BridgeSource.Cream]: () => 120e3,
|
[ERC20BridgeSource.Cream]: () => 120e3,
|
||||||
|
@@ -523,7 +523,7 @@ export class MarketOperationUtils {
|
|||||||
const sturdyFills = fills.filter(p => p.length > 0 && !fragileSources.includes(p[0].source));
|
const sturdyFills = fills.filter(p => p.length > 0 && !fragileSources.includes(p[0].source));
|
||||||
const sturdyOptimalPath = await findOptimalPathAsync(side, sturdyFills, inputAmount, opts.runLimit, {
|
const sturdyOptimalPath = await findOptimalPathAsync(side, sturdyFills, inputAmount, opts.runLimit, {
|
||||||
...penaltyOpts,
|
...penaltyOpts,
|
||||||
exchangeProxyOverhead: (sourceFlags: number) =>
|
exchangeProxyOverhead: (sourceFlags: bigint) =>
|
||||||
// tslint:disable-next-line: no-bitwise
|
// tslint:disable-next-line: no-bitwise
|
||||||
penaltyOpts.exchangeProxyOverhead(sourceFlags | optimalPath.sourceFlags),
|
penaltyOpts.exchangeProxyOverhead(sourceFlags | optimalPath.sourceFlags),
|
||||||
});
|
});
|
||||||
|
@@ -168,8 +168,12 @@ export function getErc20BridgeSourceToBridgeSource(source: ERC20BridgeSource): s
|
|||||||
return encodeBridgeSourceId(BridgeProtocol.UniswapV2, 'WaultSwap');
|
return encodeBridgeSourceId(BridgeProtocol.UniswapV2, 'WaultSwap');
|
||||||
case ERC20BridgeSource.Polydex:
|
case ERC20BridgeSource.Polydex:
|
||||||
return encodeBridgeSourceId(BridgeProtocol.UniswapV2, 'Polydex');
|
return encodeBridgeSourceId(BridgeProtocol.UniswapV2, 'Polydex');
|
||||||
|
case ERC20BridgeSource.FirebirdOneSwap:
|
||||||
|
return encodeBridgeSourceId(BridgeProtocol.Nerve, 'FirebirdOneSwap');
|
||||||
case ERC20BridgeSource.Lido:
|
case ERC20BridgeSource.Lido:
|
||||||
return encodeBridgeSourceId(BridgeProtocol.Lido, 'Lido');
|
return encodeBridgeSourceId(BridgeProtocol.Lido, 'Lido');
|
||||||
|
case ERC20BridgeSource.ShibaSwap:
|
||||||
|
return encodeBridgeSourceId(BridgeProtocol.UniswapV2, 'ShibaSwap');
|
||||||
default:
|
default:
|
||||||
throw new Error(AggregationError.NoBridgeForSource);
|
throw new Error(AggregationError.NoBridgeForSource);
|
||||||
}
|
}
|
||||||
@@ -201,6 +205,7 @@ export function createBridgeDataForBridgeOrder(order: OptimizedMarketBridgeOrder
|
|||||||
case ERC20BridgeSource.Smoothy:
|
case ERC20BridgeSource.Smoothy:
|
||||||
case ERC20BridgeSource.Saddle:
|
case ERC20BridgeSource.Saddle:
|
||||||
case ERC20BridgeSource.XSigma:
|
case ERC20BridgeSource.XSigma:
|
||||||
|
case ERC20BridgeSource.FirebirdOneSwap:
|
||||||
const curveFillData = (order as OptimizedMarketBridgeOrder<CurveFillData>).fillData;
|
const curveFillData = (order as OptimizedMarketBridgeOrder<CurveFillData>).fillData;
|
||||||
bridgeData = encoder.encode([
|
bridgeData = encoder.encode([
|
||||||
curveFillData.pool.poolAddress,
|
curveFillData.pool.poolAddress,
|
||||||
@@ -239,6 +244,7 @@ export function createBridgeDataForBridgeOrder(order: OptimizedMarketBridgeOrder
|
|||||||
case ERC20BridgeSource.Dfyn:
|
case ERC20BridgeSource.Dfyn:
|
||||||
case ERC20BridgeSource.WaultSwap:
|
case ERC20BridgeSource.WaultSwap:
|
||||||
case ERC20BridgeSource.Polydex:
|
case ERC20BridgeSource.Polydex:
|
||||||
|
case ERC20BridgeSource.ShibaSwap:
|
||||||
const uniswapV2FillData = (order as OptimizedMarketBridgeOrder<UniswapV2FillData>).fillData;
|
const uniswapV2FillData = (order as OptimizedMarketBridgeOrder<UniswapV2FillData>).fillData;
|
||||||
bridgeData = encoder.encode([uniswapV2FillData.router, uniswapV2FillData.tokenAddressPath]);
|
bridgeData = encoder.encode([uniswapV2FillData.router, uniswapV2FillData.tokenAddressPath]);
|
||||||
break;
|
break;
|
||||||
@@ -417,12 +423,14 @@ export const BRIDGE_ENCODERS: {
|
|||||||
[ERC20BridgeSource.Smoothy]: curveEncoder,
|
[ERC20BridgeSource.Smoothy]: curveEncoder,
|
||||||
[ERC20BridgeSource.Saddle]: curveEncoder,
|
[ERC20BridgeSource.Saddle]: curveEncoder,
|
||||||
[ERC20BridgeSource.XSigma]: curveEncoder,
|
[ERC20BridgeSource.XSigma]: curveEncoder,
|
||||||
|
[ERC20BridgeSource.FirebirdOneSwap]: curveEncoder,
|
||||||
// UniswapV2 like, (router, address[])
|
// UniswapV2 like, (router, address[])
|
||||||
[ERC20BridgeSource.Bancor]: routerAddressPathEncoder,
|
[ERC20BridgeSource.Bancor]: routerAddressPathEncoder,
|
||||||
[ERC20BridgeSource.UniswapV2]: routerAddressPathEncoder,
|
[ERC20BridgeSource.UniswapV2]: routerAddressPathEncoder,
|
||||||
[ERC20BridgeSource.SushiSwap]: routerAddressPathEncoder,
|
[ERC20BridgeSource.SushiSwap]: routerAddressPathEncoder,
|
||||||
[ERC20BridgeSource.CryptoCom]: routerAddressPathEncoder,
|
[ERC20BridgeSource.CryptoCom]: routerAddressPathEncoder,
|
||||||
[ERC20BridgeSource.Linkswap]: routerAddressPathEncoder,
|
[ERC20BridgeSource.Linkswap]: routerAddressPathEncoder,
|
||||||
|
[ERC20BridgeSource.ShibaSwap]: routerAddressPathEncoder,
|
||||||
// BSC
|
// BSC
|
||||||
[ERC20BridgeSource.PancakeSwap]: routerAddressPathEncoder,
|
[ERC20BridgeSource.PancakeSwap]: routerAddressPathEncoder,
|
||||||
[ERC20BridgeSource.PancakeSwapV2]: routerAddressPathEncoder,
|
[ERC20BridgeSource.PancakeSwapV2]: routerAddressPathEncoder,
|
||||||
|
@@ -36,7 +36,7 @@ export const DEFAULT_PATH_PENALTY_OPTS: PathPenaltyOpts = {
|
|||||||
export class Path {
|
export class Path {
|
||||||
public collapsedFills?: ReadonlyArray<CollapsedFill>;
|
public collapsedFills?: ReadonlyArray<CollapsedFill>;
|
||||||
public orders?: OptimizedMarketOrder[];
|
public orders?: OptimizedMarketOrder[];
|
||||||
public sourceFlags: number = 0;
|
public sourceFlags: bigint = BigInt(0);
|
||||||
protected _size: PathSize = { input: ZERO_AMOUNT, output: ZERO_AMOUNT };
|
protected _size: PathSize = { input: ZERO_AMOUNT, output: ZERO_AMOUNT };
|
||||||
protected _adjustedSize: PathSize = { input: ZERO_AMOUNT, output: ZERO_AMOUNT };
|
protected _adjustedSize: PathSize = { input: ZERO_AMOUNT, output: ZERO_AMOUNT };
|
||||||
|
|
||||||
@@ -78,6 +78,11 @@ export class Path {
|
|||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add a fallback path to the current path
|
||||||
|
* Fallback must contain exclusive fills that are
|
||||||
|
* not present in this path
|
||||||
|
*/
|
||||||
public addFallback(fallback: Path): this {
|
public addFallback(fallback: Path): this {
|
||||||
// If the last fill is Native and penultimate is not, then the intention was to partial fill
|
// If the last fill is Native and penultimate is not, then the intention was to partial fill
|
||||||
// In this case we drop it entirely as we can't handle a failure at the end and we don't
|
// In this case we drop it entirely as we can't handle a failure at the end and we don't
|
||||||
@@ -93,9 +98,18 @@ export class Path {
|
|||||||
// an additional protocol fee. I.e [Uniswap,Native,Kyber] becomes [Native,Uniswap,Kyber]
|
// an additional protocol fee. I.e [Uniswap,Native,Kyber] becomes [Native,Uniswap,Kyber]
|
||||||
// In the previous step we dropped any hanging Native partial fills, as to not fully fill
|
// In the previous step we dropped any hanging Native partial fills, as to not fully fill
|
||||||
const nativeFills = this.fills.filter(f => f.source === ERC20BridgeSource.Native);
|
const nativeFills = this.fills.filter(f => f.source === ERC20BridgeSource.Native);
|
||||||
this.fills = [...nativeFills.filter(f => f !== lastNativeFillIfExists), ...fallback.fills];
|
const otherFills = this.fills.filter(f => f.source !== ERC20BridgeSource.Native);
|
||||||
|
const otherSourcePathIds = otherFills.map(f => f.sourcePathId);
|
||||||
|
this.fills = [
|
||||||
|
// Append all of the native fills first
|
||||||
|
...nativeFills.filter(f => f !== lastNativeFillIfExists),
|
||||||
|
// Add the other fills that are not native in the optimal path
|
||||||
|
...otherFills,
|
||||||
|
// Add the fallbacks to the end that aren't already included
|
||||||
|
...fallback.fills.filter(f => !otherSourcePathIds.includes(f.sourcePathId)),
|
||||||
|
];
|
||||||
// Recompute the source flags
|
// Recompute the source flags
|
||||||
this.sourceFlags = this.fills.reduce((flags, fill) => flags | fill.flags, 0);
|
this.sourceFlags = this.fills.reduce((flags, fill) => flags | fill.flags, BigInt(0));
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -1,3 +1,4 @@
|
|||||||
|
import { ChainId } from '@0x/contract-addresses';
|
||||||
import { BigNumber } from '@0x/utils';
|
import { BigNumber } from '@0x/utils';
|
||||||
// import { parsePoolData } from '@balancer-labs'; // TODO - upgrade to v2
|
// import { parsePoolData } from '@balancer-labs'; // TODO - upgrade to v2
|
||||||
import { Pool } from '@balancer-labs/sor/dist/types';
|
import { Pool } from '@balancer-labs/sor/dist/types';
|
||||||
@@ -5,7 +6,11 @@ import { gql, request } from 'graphql-request';
|
|||||||
|
|
||||||
import { DEFAULT_WARNING_LOGGER } from '../../../constants';
|
import { DEFAULT_WARNING_LOGGER } from '../../../constants';
|
||||||
import { LogFunction } from '../../../types';
|
import { LogFunction } from '../../../types';
|
||||||
import { BALANCER_MAX_POOLS_FETCHED, BALANCER_TOP_POOLS_FETCHED, BALANCER_V2_SUBGRAPH_URL } from '../constants';
|
import {
|
||||||
|
BALANCER_MAX_POOLS_FETCHED,
|
||||||
|
BALANCER_TOP_POOLS_FETCHED,
|
||||||
|
BALANCER_V2_SUBGRAPH_URL_BY_CHAIN,
|
||||||
|
} from '../constants';
|
||||||
|
|
||||||
import { parsePoolData } from './balancer_sor_v2';
|
import { parsePoolData } from './balancer_sor_v2';
|
||||||
import { CacheValue, PoolsCache } from './pools_cache';
|
import { CacheValue, PoolsCache } from './pools_cache';
|
||||||
@@ -45,7 +50,8 @@ export class BalancerV2PoolsCache extends PoolsCache {
|
|||||||
}
|
}
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
private readonly subgraphUrl: string = BALANCER_V2_SUBGRAPH_URL,
|
chainId: ChainId,
|
||||||
|
private readonly subgraphUrl: string = BALANCER_V2_SUBGRAPH_URL_BY_CHAIN[chainId],
|
||||||
private readonly maxPoolsFetched: number = BALANCER_MAX_POOLS_FETCHED,
|
private readonly maxPoolsFetched: number = BALANCER_MAX_POOLS_FETCHED,
|
||||||
private readonly _topPoolsFetched: number = BALANCER_TOP_POOLS_FETCHED,
|
private readonly _topPoolsFetched: number = BALANCER_TOP_POOLS_FETCHED,
|
||||||
private readonly _warningLogger: LogFunction = DEFAULT_WARNING_LOGGER,
|
private readonly _warningLogger: LogFunction = DEFAULT_WARNING_LOGGER,
|
||||||
|
@@ -122,7 +122,7 @@ export class SamplerOperations {
|
|||||||
this.poolsCaches = poolsCaches
|
this.poolsCaches = poolsCaches
|
||||||
? poolsCaches
|
? poolsCaches
|
||||||
: {
|
: {
|
||||||
[ERC20BridgeSource.BalancerV2]: new BalancerV2PoolsCache(),
|
[ERC20BridgeSource.BalancerV2]: new BalancerV2PoolsCache(chainId),
|
||||||
[ERC20BridgeSource.Balancer]: new BalancerPoolsCache(),
|
[ERC20BridgeSource.Balancer]: new BalancerPoolsCache(),
|
||||||
[ERC20BridgeSource.Cream]: new CreamPoolsCache(),
|
[ERC20BridgeSource.Cream]: new CreamPoolsCache(),
|
||||||
};
|
};
|
||||||
@@ -1229,6 +1229,7 @@ export class SamplerOperations {
|
|||||||
case ERC20BridgeSource.Dfyn:
|
case ERC20BridgeSource.Dfyn:
|
||||||
case ERC20BridgeSource.WaultSwap:
|
case ERC20BridgeSource.WaultSwap:
|
||||||
case ERC20BridgeSource.Polydex:
|
case ERC20BridgeSource.Polydex:
|
||||||
|
case ERC20BridgeSource.ShibaSwap:
|
||||||
const uniLikeRouter = uniswapV2LikeRouterAddress(this.chainId, source);
|
const uniLikeRouter = uniswapV2LikeRouterAddress(this.chainId, source);
|
||||||
if (!isValidAddress(uniLikeRouter)) {
|
if (!isValidAddress(uniLikeRouter)) {
|
||||||
return [];
|
return [];
|
||||||
@@ -1262,6 +1263,7 @@ export class SamplerOperations {
|
|||||||
case ERC20BridgeSource.Ellipsis:
|
case ERC20BridgeSource.Ellipsis:
|
||||||
case ERC20BridgeSource.Saddle:
|
case ERC20BridgeSource.Saddle:
|
||||||
case ERC20BridgeSource.XSigma:
|
case ERC20BridgeSource.XSigma:
|
||||||
|
case ERC20BridgeSource.FirebirdOneSwap:
|
||||||
return getCurveLikeInfosForPair(this.chainId, takerToken, makerToken, source).map(pool =>
|
return getCurveLikeInfosForPair(this.chainId, takerToken, makerToken, source).map(pool =>
|
||||||
this.getCurveSellQuotes(
|
this.getCurveSellQuotes(
|
||||||
pool,
|
pool,
|
||||||
@@ -1498,6 +1500,7 @@ export class SamplerOperations {
|
|||||||
case ERC20BridgeSource.Dfyn:
|
case ERC20BridgeSource.Dfyn:
|
||||||
case ERC20BridgeSource.WaultSwap:
|
case ERC20BridgeSource.WaultSwap:
|
||||||
case ERC20BridgeSource.Polydex:
|
case ERC20BridgeSource.Polydex:
|
||||||
|
case ERC20BridgeSource.ShibaSwap:
|
||||||
const uniLikeRouter = uniswapV2LikeRouterAddress(this.chainId, source);
|
const uniLikeRouter = uniswapV2LikeRouterAddress(this.chainId, source);
|
||||||
if (!isValidAddress(uniLikeRouter)) {
|
if (!isValidAddress(uniLikeRouter)) {
|
||||||
return [];
|
return [];
|
||||||
@@ -1531,6 +1534,7 @@ export class SamplerOperations {
|
|||||||
case ERC20BridgeSource.Ellipsis:
|
case ERC20BridgeSource.Ellipsis:
|
||||||
case ERC20BridgeSource.Saddle:
|
case ERC20BridgeSource.Saddle:
|
||||||
case ERC20BridgeSource.XSigma:
|
case ERC20BridgeSource.XSigma:
|
||||||
|
case ERC20BridgeSource.FirebirdOneSwap:
|
||||||
return getCurveLikeInfosForPair(this.chainId, takerToken, makerToken, source).map(pool =>
|
return getCurveLikeInfosForPair(this.chainId, takerToken, makerToken, source).map(pool =>
|
||||||
this.getCurveBuyQuotes(
|
this.getCurveBuyQuotes(
|
||||||
pool,
|
pool,
|
||||||
|
@@ -68,6 +68,7 @@ export enum ERC20BridgeSource {
|
|||||||
UniswapV3 = 'Uniswap_V3',
|
UniswapV3 = 'Uniswap_V3',
|
||||||
CurveV2 = 'Curve_V2',
|
CurveV2 = 'Curve_V2',
|
||||||
Lido = 'Lido',
|
Lido = 'Lido',
|
||||||
|
ShibaSwap = 'ShibaSwap',
|
||||||
// BSC only
|
// BSC only
|
||||||
PancakeSwap = 'PancakeSwap',
|
PancakeSwap = 'PancakeSwap',
|
||||||
PancakeSwapV2 = 'PancakeSwap_V2',
|
PancakeSwapV2 = 'PancakeSwap_V2',
|
||||||
@@ -85,6 +86,7 @@ export enum ERC20BridgeSource {
|
|||||||
Dfyn = 'Dfyn',
|
Dfyn = 'Dfyn',
|
||||||
WaultSwap = 'WaultSwap',
|
WaultSwap = 'WaultSwap',
|
||||||
Polydex = 'Polydex',
|
Polydex = 'Polydex',
|
||||||
|
FirebirdOneSwap = 'FirebirdOneSwap',
|
||||||
}
|
}
|
||||||
export type SourcesWithPoolsCache = ERC20BridgeSource.Balancer | ERC20BridgeSource.BalancerV2 | ERC20BridgeSource.Cream;
|
export type SourcesWithPoolsCache = ERC20BridgeSource.Balancer | ERC20BridgeSource.BalancerV2 | ERC20BridgeSource.Cream;
|
||||||
|
|
||||||
@@ -273,7 +275,7 @@ export interface Fill<TFillData extends FillData = FillData> {
|
|||||||
// paths that have the same `source` IDs but are distinct (e.g., Curves).
|
// paths that have the same `source` IDs but are distinct (e.g., Curves).
|
||||||
sourcePathId: string;
|
sourcePathId: string;
|
||||||
// See `SOURCE_FLAGS`.
|
// See `SOURCE_FLAGS`.
|
||||||
flags: number;
|
flags: bigint;
|
||||||
// Input fill amount (taker asset amount in a sell, maker asset amount in a buy).
|
// Input fill amount (taker asset amount in a sell, maker asset amount in a buy).
|
||||||
input: BigNumber;
|
input: BigNumber;
|
||||||
// Output fill amount (maker asset amount in a sell, taker asset amount in a buy).
|
// Output fill amount (maker asset amount in a sell, taker asset amount in a buy).
|
||||||
@@ -362,7 +364,7 @@ export interface GetMarketOrdersRfqOpts extends RfqRequestOpts {
|
|||||||
|
|
||||||
export type FeeEstimate = (fillData: FillData) => number | BigNumber;
|
export type FeeEstimate = (fillData: FillData) => number | BigNumber;
|
||||||
export type FeeSchedule = Partial<{ [key in ERC20BridgeSource]: FeeEstimate }>;
|
export type FeeSchedule = Partial<{ [key in ERC20BridgeSource]: FeeEstimate }>;
|
||||||
export type ExchangeProxyOverhead = (sourceFlags: number) => BigNumber;
|
export type ExchangeProxyOverhead = (sourceFlags: bigint) => BigNumber;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Options for `getMarketSellOrdersAsync()` and `getMarketBuyOrdersAsync()`.
|
* Options for `getMarketSellOrdersAsync()` and `getMarketBuyOrdersAsync()`.
|
||||||
@@ -464,7 +466,7 @@ export interface SourceQuoteOperation<TFillData extends FillData = FillData> ext
|
|||||||
|
|
||||||
export interface OptimizerResult {
|
export interface OptimizerResult {
|
||||||
optimizedOrders: OptimizedMarketOrder[];
|
optimizedOrders: OptimizedMarketOrder[];
|
||||||
sourceFlags: number;
|
sourceFlags: bigint;
|
||||||
liquidityDelivered: CollapsedFill[] | DexSample<MultiHopFillData>;
|
liquidityDelivered: CollapsedFill[] | DexSample<MultiHopFillData>;
|
||||||
marketSideLiquidity: MarketSideLiquidity;
|
marketSideLiquidity: MarketSideLiquidity;
|
||||||
adjustedRate: BigNumber;
|
adjustedRate: BigNumber;
|
||||||
|
@@ -39,7 +39,7 @@ const feeSchedule = {
|
|||||||
[ERC20BridgeSource.Native]: _.constant(GAS_PRICE.times(NATIVE_ORDER_FEE)),
|
[ERC20BridgeSource.Native]: _.constant(GAS_PRICE.times(NATIVE_ORDER_FEE)),
|
||||||
};
|
};
|
||||||
|
|
||||||
const exchangeProxyOverhead = (sourceFlags: number) => {
|
const exchangeProxyOverhead = (sourceFlags: bigint) => {
|
||||||
if ([SOURCE_FLAGS.RfqOrder].includes(sourceFlags)) {
|
if ([SOURCE_FLAGS.RfqOrder].includes(sourceFlags)) {
|
||||||
return new BigNumber(20e3).times(GAS_PRICE);
|
return new BigNumber(20e3).times(GAS_PRICE);
|
||||||
} else {
|
} else {
|
||||||
|
@@ -1280,7 +1280,7 @@ describe('MarketOperationUtils tests', () => {
|
|||||||
});
|
});
|
||||||
const optimizer = new MarketOperationUtils(MOCK_SAMPLER, contractAddresses, ORDER_DOMAIN);
|
const optimizer = new MarketOperationUtils(MOCK_SAMPLER, contractAddresses, ORDER_DOMAIN);
|
||||||
const gasPrice = 100e9; // 100 gwei
|
const gasPrice = 100e9; // 100 gwei
|
||||||
const exchangeProxyOverhead = (sourceFlags: number) =>
|
const exchangeProxyOverhead = (sourceFlags: bigint) =>
|
||||||
sourceFlags === SOURCE_FLAGS.LiquidityProvider
|
sourceFlags === SOURCE_FLAGS.LiquidityProvider
|
||||||
? constants.ZERO_AMOUNT
|
? constants.ZERO_AMOUNT
|
||||||
: new BigNumber(1.3e5).times(gasPrice);
|
: new BigNumber(1.3e5).times(gasPrice);
|
||||||
@@ -1663,7 +1663,7 @@ describe('MarketOperationUtils tests', () => {
|
|||||||
});
|
});
|
||||||
const optimizer = new MarketOperationUtils(MOCK_SAMPLER, contractAddresses, ORDER_DOMAIN);
|
const optimizer = new MarketOperationUtils(MOCK_SAMPLER, contractAddresses, ORDER_DOMAIN);
|
||||||
const gasPrice = 100e9; // 100 gwei
|
const gasPrice = 100e9; // 100 gwei
|
||||||
const exchangeProxyOverhead = (sourceFlags: number) =>
|
const exchangeProxyOverhead = (sourceFlags: bigint) =>
|
||||||
sourceFlags === SOURCE_FLAGS.LiquidityProvider
|
sourceFlags === SOURCE_FLAGS.LiquidityProvider
|
||||||
? constants.ZERO_AMOUNT
|
? constants.ZERO_AMOUNT
|
||||||
: new BigNumber(1.3e5).times(gasPrice);
|
: new BigNumber(1.3e5).times(gasPrice);
|
||||||
|
86
packages/asset-swapper/test/path_test.ts
Normal file
86
packages/asset-swapper/test/path_test.ts
Normal file
@@ -0,0 +1,86 @@
|
|||||||
|
import { expect } from '@0x/contracts-test-utils';
|
||||||
|
import { BigNumber } from '@0x/utils';
|
||||||
|
|
||||||
|
import { MarketOperation } from '../src/types';
|
||||||
|
import { Path } from '../src/utils/market_operation_utils/path';
|
||||||
|
import { ERC20BridgeSource, Fill } from '../src/utils/market_operation_utils/types';
|
||||||
|
|
||||||
|
const createFill = (
|
||||||
|
source: ERC20BridgeSource,
|
||||||
|
input: BigNumber = new BigNumber(100),
|
||||||
|
output: BigNumber = new BigNumber(100),
|
||||||
|
): Fill =>
|
||||||
|
// tslint:disable-next-line: no-object-literal-type-assertion
|
||||||
|
({
|
||||||
|
source,
|
||||||
|
input,
|
||||||
|
output,
|
||||||
|
adjustedOutput: output,
|
||||||
|
flags: BigInt(0),
|
||||||
|
sourcePathId: source,
|
||||||
|
} as Fill);
|
||||||
|
|
||||||
|
describe('Path', () => {
|
||||||
|
it('Adds a fallback', () => {
|
||||||
|
const targetInput = new BigNumber(100);
|
||||||
|
const path = Path.create(
|
||||||
|
MarketOperation.Sell,
|
||||||
|
[createFill(ERC20BridgeSource.Native), createFill(ERC20BridgeSource.Native)],
|
||||||
|
targetInput,
|
||||||
|
);
|
||||||
|
const fallback = Path.create(MarketOperation.Sell, [createFill(ERC20BridgeSource.Uniswap)], targetInput);
|
||||||
|
path.addFallback(fallback);
|
||||||
|
const sources = path.fills.map(f => f.source);
|
||||||
|
expect(sources).to.deep.eq([ERC20BridgeSource.Native, ERC20BridgeSource.Native, ERC20BridgeSource.Uniswap]);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('Adds a fallback with LiquidityProvider', () => {
|
||||||
|
const targetInput = new BigNumber(100);
|
||||||
|
const path = Path.create(
|
||||||
|
MarketOperation.Sell,
|
||||||
|
[createFill(ERC20BridgeSource.Native), createFill(ERC20BridgeSource.LiquidityProvider)],
|
||||||
|
targetInput,
|
||||||
|
);
|
||||||
|
const fallback = Path.create(MarketOperation.Sell, [createFill(ERC20BridgeSource.Uniswap)], targetInput);
|
||||||
|
path.addFallback(fallback);
|
||||||
|
const sources = path.fills.map(f => f.source);
|
||||||
|
expect(sources).to.deep.eq([
|
||||||
|
ERC20BridgeSource.Native,
|
||||||
|
ERC20BridgeSource.LiquidityProvider,
|
||||||
|
ERC20BridgeSource.Uniswap,
|
||||||
|
]);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('Removes partial Native orders', () => {
|
||||||
|
const targetInput = new BigNumber(100);
|
||||||
|
const path = Path.create(
|
||||||
|
MarketOperation.Sell,
|
||||||
|
[
|
||||||
|
createFill(ERC20BridgeSource.Uniswap),
|
||||||
|
createFill(ERC20BridgeSource.LiquidityProvider),
|
||||||
|
createFill(ERC20BridgeSource.Native),
|
||||||
|
],
|
||||||
|
targetInput,
|
||||||
|
);
|
||||||
|
const fallback = Path.create(MarketOperation.Sell, [createFill(ERC20BridgeSource.Kyber)], targetInput);
|
||||||
|
path.addFallback(fallback);
|
||||||
|
const sources = path.fills.map(f => f.source);
|
||||||
|
expect(sources).to.deep.eq([
|
||||||
|
ERC20BridgeSource.Uniswap,
|
||||||
|
ERC20BridgeSource.LiquidityProvider,
|
||||||
|
ERC20BridgeSource.Kyber,
|
||||||
|
]);
|
||||||
|
});
|
||||||
|
it('Handles duplicates', () => {
|
||||||
|
const targetInput = new BigNumber(100);
|
||||||
|
const path = Path.create(
|
||||||
|
MarketOperation.Sell,
|
||||||
|
[createFill(ERC20BridgeSource.Uniswap), createFill(ERC20BridgeSource.LiquidityProvider)],
|
||||||
|
targetInput,
|
||||||
|
);
|
||||||
|
const fallback = Path.create(MarketOperation.Sell, [createFill(ERC20BridgeSource.Uniswap)], targetInput);
|
||||||
|
path.addFallback(fallback);
|
||||||
|
const sources = path.fills.map(f => f.source);
|
||||||
|
expect(sources).to.deep.eq([ERC20BridgeSource.Uniswap, ERC20BridgeSource.LiquidityProvider]);
|
||||||
|
});
|
||||||
|
});
|
@@ -1,3 +1,4 @@
|
|||||||
|
import { ChainId } from '@0x/contract-addresses';
|
||||||
import * as chai from 'chai';
|
import * as chai from 'chai';
|
||||||
import 'mocha';
|
import 'mocha';
|
||||||
|
|
||||||
@@ -49,7 +50,7 @@ describe('Pools Caches for Balancer-based sampling', () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
describe('BalancerV2PoolsCache', () => {
|
describe('BalancerV2PoolsCache', () => {
|
||||||
const cache = new BalancerV2PoolsCache();
|
const cache = new BalancerV2PoolsCache(ChainId.Mainnet);
|
||||||
it('fetches pools', async () => {
|
it('fetches pools', async () => {
|
||||||
const pairs = [
|
const pairs = [
|
||||||
[wethAddress, wbtcAddress],
|
[wethAddress, wbtcAddress],
|
||||||
|
Reference in New Issue
Block a user