Skip to content

Commit

Permalink
Merge pull request #16 from curvefi/leverage
Browse files Browse the repository at this point in the history
Leverage
  • Loading branch information
Macket authored Apr 26, 2024
2 parents 2998781 + 9c96da8 commit 6aa9c78
Show file tree
Hide file tree
Showing 13 changed files with 2,185 additions and 118 deletions.
502 changes: 501 additions & 1 deletion README.md

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@curvefi/lending-api",
"version": "1.6.9",
"version": "2.0.0-alpha",
"description": "JavaScript library for Curve Lending",
"main": "lib/index.js",
"author": "Macket",
Expand Down
48 changes: 48 additions & 0 deletions src/constants/abis/Controller.json
Original file line number Diff line number Diff line change
Expand Up @@ -401,6 +401,10 @@
{
"name": "callback_args",
"type": "uint256[]"
},
{
"name": "callback_bytes",
"type": "bytes"
}
],
"name": "create_loan_extended",
Expand Down Expand Up @@ -452,6 +456,46 @@
"stateMutability": "payable",
"type": "function"
},
{
"stateMutability": "nonpayable",
"type": "function",
"name": "borrow_more_extended",
"inputs": [
{
"name": "collateral",
"type": "uint256"
},
{
"name": "debt",
"type": "uint256"
},
{
"name": "callbacker",
"type": "address"
},
{
"name": "callback_args",
"type": "uint256[]"
},
{
"name": "callback_bytes",
"type": "bytes"
}
],
"outputs": []
},
{
"stateMutability": "nonpayable",
"type": "function",
"name": "repay",
"inputs": [
{
"name": "_d_debt",
"type": "uint256"
}
],
"outputs": []
},
{
"inputs": [
{
Expand Down Expand Up @@ -481,6 +525,10 @@
{
"name": "callback_args",
"type": "uint256[]"
},
{
"name": "callback_bytes",
"type": "bytes"
}
],
"name": "repay_extended",
Expand Down
17 changes: 0 additions & 17 deletions src/constants/abis/LeverageZap.json
Original file line number Diff line number Diff line change
@@ -1,21 +1,4 @@
[
{
"stateMutability": "view",
"type": "function",
"name": "max_p_base",
"inputs": [
{
"name": "controller",
"type": "address"
}
],
"outputs": [
{
"name": "",
"type": "uint256"
}
]
},
{
"stateMutability": "view",
"type": "function",
Expand Down
5 changes: 3 additions & 2 deletions src/constants/aliases.ts
Original file line number Diff line number Diff line change
Expand Up @@ -36,10 +36,11 @@ export const ALIASES_AVALANCHE = lowerCaseValues({

export const ALIASES_ARBITRUM = lowerCaseValues({
"crv": "0x11cDb42B0EB46D95f990BeDD4695A6e3fA034978",
"one_way_factory": "0xcaEC110C784c9DF37240a8Ce096D352A75922DeA",
// "one_way_factory": "0xcaEC110C784c9DF37240a8Ce096D352A75922DeA", // REAL
"one_way_factory": "0xb3adda9b28f0f117FD5b6eFE7f0a0cd662Dba5D6", // TEST
"gauge_controller": "0x2F50D538606Fa9EDD2B11E2446BEb18C9D5846bB",
"gauge_factory": "0xabC000d88f23Bb45525E447528DBF656A9D55bf5",
"leverage_zap": "0x0000000000000000000000000000000000000000",
"leverage_zap": "0xA233e77AE47bf839Fd1c1d30f9EAa0584737376a", // TEST
});

export const ALIASES_OPTIMISM = lowerCaseValues({
Expand Down
39 changes: 35 additions & 4 deletions src/external-api.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import axios from "axios";
import memoize from "memoizee";
import { lending } from "./lending.js";
import { IExtendedPoolDataFromApi, INetworkName, IPoolFactory } from "./interfaces";
import { IExtendedPoolDataFromApi, INetworkName, IPoolFactory, I1inchRoute } from "./interfaces";


export const _getPoolsFromApi = memoize(
Expand Down Expand Up @@ -44,8 +44,7 @@ export const _getUserCollateral = memoize(
export const _getQuote1inch = memoize(
async (fromToken: string, toToken: string, _amount: bigint): Promise<string> => {
if (_amount === BigInt(0)) return "0.0";
const url = `https://api.1inch.dev/swap/v5.2/1/quote?src=${fromToken}&dst=${toToken}&amount=${_amount}&
protocols=${lending.constants.PROTOCOLS_1INCH}&includeTokensInfo=true&includeProtocols=true`;
const url = `https://api.1inch.dev/swap/v6.0/${lending.chainId}/quote?src=${fromToken}&dst=${toToken}&amount=${_amount}&protocols=${lending.constants.PROTOCOLS_1INCH}&includeTokensInfo=true&includeProtocols=true`;
const response = await axios.get(
url,
{
Expand All @@ -55,11 +54,43 @@ export const _getQuote1inch = memoize(
if (response.status !== 200) {
throw Error(`1inch error: ${response.status} ${response.statusText}`);
}
return response.data.toAmount;
return response.data.dstAmount;

},
{
promise: true,
maxAge: 5 * 1000, // 5s
}
)

const _getSwapData1inch = memoize(
async (fromToken: string, toToken: string, _amount: bigint, slippage: number): Promise<{ tx: { data: string }, protocols: I1inchRoute[] }> => {
if (_amount === BigInt(0)) throw Error("Amount must be > 0");
const url = `https://api.1inch.dev/swap/v6.0/${lending.chainId}/swap?src=${fromToken}&dst=${toToken}&amount=${_amount}&from=${lending.constants.ALIASES.leverage_zap}&slippage=${slippage}&protocols=${lending.constants.PROTOCOLS_1INCH}&includeTokensInfo=true&includeProtocols=true&disableEstimate=true`;
const response = await axios.get(
url,
{
headers: {"accept": "application/json", "Authorization": `Bearer ${lending.apiKey1inch}`},
validateStatus: () => true,
});
if (response.status !== 200) {
throw Error(`1inch error: ${response.status} ${response.statusText}`);
}
return response.data;

},
{
promise: true,
maxAge: 5 * 1000, // 5s
}
)

export const _getCalldata1inch = async (fromToken: string, toToken: string, _amount: bigint, slippage: number): Promise<string> => {
const data = await _getSwapData1inch(fromToken, toToken, _amount, slippage);
return data.tx.data;
}

export const _getRoute1inch = async (fromToken: string, toToken: string, _amount: bigint, slippage: number): Promise<I1inchRoute[]> => {
const data = await _getSwapData1inch(fromToken, toToken, _amount, slippage);
return data.protocols;
}
14 changes: 13 additions & 1 deletion src/interfaces.ts
Original file line number Diff line number Diff line change
Expand Up @@ -121,4 +121,16 @@ export interface IReward {
tokenAddress: string,
symbol: string,
apy: number
}
}

export type T1inchRouteStep = {
name: string,
part: number,
fromTokenAddress: string,
toTokenAddress: string,
}[]

export interface I1inchRoute {
part: number,
hops: T1inchRouteStep[],
}
31 changes: 5 additions & 26 deletions src/lending.ts
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@ export const NETWORK_CONSTANTS: { [index: number]: any } = {
NAME: 'ethereum',
ALIASES: ALIASES_ETHEREUM,
COINS: COINS_ETHEREUM,
PROTOCOLS_1INCH: "UNISWAP_V1,UNISWAP_V2,SUSHI,MOONISWAP,BALANCER,COMPOUND,CURVE,CURVE_V2_SPELL_2_ASSET,CURVE_V2_SGT_2_ASSET,CURVE_V2_THRESHOLDNETWORK_2_ASSET,CHAI,OASIS,KYBER,AAVE,IEARN,BANCOR,SWERVE,BLACKHOLESWAP,DODO,DODO_V2,VALUELIQUID,SHELL,DEFISWAP,SAKESWAP,LUASWAP,MINISWAP,MSTABLE,SYNTHETIX,AAVE_V2,ST_ETH,ONE_INCH_LP,ONE_INCH_LP_1_1,LINKSWAP,S_FINANCE,PSM,POWERINDEX,XSIGMA,SMOOTHY_FINANCE,SADDLE,KYBER_DMM,BALANCER_V2,UNISWAP_V3,SETH_WRAPPER,CURVE_V2,CURVE_V2_EURS_2_ASSET,CURVE_V2_ETH_CRV,CURVE_V2_ETH_CVX,CONVERGENCE_X,ONE_INCH_LIMIT_ORDER,ONE_INCH_LIMIT_ORDER_V2,ONE_INCH_LIMIT_ORDER_V3,ONE_INCH_LIMIT_ORDER_V4,DFX_FINANCE,FIXED_FEE_SWAP,DXSWAP,SHIBASWAP,UNIFI,PSM_PAX,WSTETH,DEFI_PLAZA,FIXED_FEE_SWAP_V3,SYNTHETIX_WRAPPER,SYNAPSE,CURVE_V2_YFI_2_ASSET,CURVE_V2_ETH_PAL,POOLTOGETHER,ETH_BANCOR_V3,ELASTICSWAP,BALANCER_V2_WRAPPER,FRAXSWAP,RADIOSHACK,KYBERSWAP_ELASTIC,CURVE_V2_TWO_CRYPTO,STABLE_PLAZA,ZEROX_LIMIT_ORDER,CURVE_3CRV,KYBER_DMM_STATIC,ANGLE,ROCKET_POOL,ETHEREUM_ELK,ETHEREUM_PANCAKESWAP_V2,SYNTHETIX_ATOMIC_SIP288,PSM_GUSD,INTEGRAL,MAINNET_SOLIDLY,NOMISWAP_STABLE,CURVE_V2_TWOCRYPTO_META,MAVERICK_V1,VERSE,DFX_FINANCE_V3,ZK_BOB,PANCAKESWAP_V3,NOMISWAPEPCS,XFAI,CURVE_V2_TRICRYPTO_NG,SUSHISWAP_V3,SFRX_ETH,SDAI,ETHEREUM_WOMBATSWAP,CARBON,COMPOUND_V3,DODO_V3,SMARDEX,TRADERJOE_V2_1,PMM15,SOLIDLY_V3,RAFT_PSM,CLAYSTACK,CURVE_STABLE_NG,LIF3,BLUEPRINT,AAVE_V3,ORIGIN,BGD_AAVE_STATIC",
},
10: {
NAME: 'optimism',
Expand Down Expand Up @@ -103,6 +104,7 @@ export const NETWORK_CONSTANTS: { [index: number]: any } = {
NAME: 'arbitrum',
ALIASES: ALIASES_ARBITRUM,
COINS: COINS_ARBITRUM,
PROTOCOLS_1INCH: "ARBITRUM_BALANCER_V2,ARBITRUM_ONE_INCH_LIMIT_ORDER,ARBITRUM_ONE_INCH_LIMIT_ORDER_V2,ARBITRUM_ONE_INCH_LIMIT_ORDER_V3,ARBITRUM_ONE_INCH_LIMIT_ORDER_V4,ARBITRUM_DODO,ARBITRUM_DODO_V2,ARBITRUM_SUSHISWAP,ARBITRUM_DXSWAP,ARBITRUM_UNISWAP_V3,ARBITRUM_CURVE,ARBITRUM_CURVE_V2,ARBITRUM_GMX,ARBITRUM_SYNAPSE,ARBITRUM_SADDLE,ARBITRUM_KYBERSWAP_ELASTIC,ARBITRUM_KYBER_DMM_STATIC,ARBITRUM_AAVE_V3,ARBITRUM_ELK,ARBITRUM_WOOFI_V2,ARBITRUM_CAMELOT,ARBITRUM_TRADERJOE,ARBITRUM_TRADERJOE_V2,ARBITRUM_SWAPFISH,ARBITRUM_ZYBER,ARBITRUM_ZYBER_STABLE,ARBITRUM_SOLIDLIZARD,ARBITRUM_ZYBER_V3,ARBITRUM_MYCELIUM,ARBITRUM_TRIDENT,ARBITRUM_SHELL_OCEAN,ARBITRUM_RAMSES,ARBITRUM_TRADERJOE_V2_1,ARBITRUM_NOMISWAPEPCS,ARBITRUM_CAMELOT_V3,ARBITRUM_WOMBATSWAP,ARBITRUM_CHRONOS,ARBITRUM_LIGHTER,ARBITRUM_ARBIDEX,ARBITRUM_ARBIDEX_V3,ARBSWAP,ARBSWAP_STABLE,ARBITRUM_SUSHISWAP_V3,ARBITRUM_RAMSES_V2,ARBITRUM_LEVEL_FINANCE,ARBITRUM_CHRONOS_V3,ARBITRUM_PANCAKESWAP_V3,ARBITRUM_PMM11,ARBITRUM_DODO_V3,ARBITRUM_SMARDEX,ARBITRUM_INTEGRAL,ARBITRUM_DFX_FINANCE_V3,ARBITRUM_CURVE_STABLE_NG",
},
42220: {
NAME: 'celo',
Expand Down Expand Up @@ -165,19 +167,7 @@ class Lending implements ILending {
NETWORK_NAME: 'ethereum',
ALIASES: {},
ZERO_ADDRESS: ethers.ZeroAddress,
PROTOCOLS_1INCH: "UNISWAP_V1,UNISWAP_V2,SUSHI,MOONISWAP,BALANCER,COMPOUND,CURVE,CURVE_V2_SPELL_2_ASSET," +
"CURVE_V2_SGT_2_ASSET,CURVE_V2_THRESHOLDNETWORK_2_ASSET,CHAI,OASIS,KYBER,AAVE,IEARN,BANCOR,SWERVE," +
"BLACKHOLESWAP,DODO,DODO_V2,VALUELIQUID,SHELL,DEFISWAP,SAKESWAP,LUASWAP,MINISWAP,MSTABLE,PMM2," +
"SYNTHETIX,AAVE_V2,ST_ETH,ONE_INCH_LP,ONE_INCH_LP_1_1,LINKSWAP,S_FINANCE,PSM,POWERINDEX,XSIGMA," +
"SMOOTHY_FINANCE,SADDLE,KYBER_DMM,BALANCER_V2,UNISWAP_V3,SETH_WRAPPER,CURVE_V2,CURVE_V2_EURS_2_ASSET," +
"CURVE_V2_ETH_CRV,CURVE_V2_ETH_CVX,CONVERGENCE_X,ONE_INCH_LIMIT_ORDER,ONE_INCH_LIMIT_ORDER_V2," +
"ONE_INCH_LIMIT_ORDER_V3,DFX_FINANCE,FIXED_FEE_SWAP,DXSWAP,SHIBASWAP,UNIFI,PSM_PAX,WSTETH,DEFI_PLAZA," +
"FIXED_FEE_SWAP_V3,SYNTHETIX_WRAPPER,SYNAPSE,CURVE_V2_YFI_2_ASSET,CURVE_V2_ETH_PAL,POOLTOGETHER," +
"ETH_BANCOR_V3,ELASTICSWAP,BALANCER_V2_WRAPPER,FRAXSWAP,RADIOSHACK,KYBERSWAP_ELASTIC,CURVE_V2_TWO_CRYPTO," +
"STABLE_PLAZA,ZEROX_LIMIT_ORDER,CURVE_3CRV,KYBER_DMM_STATIC,ANGLE,ROCKET_POOL,ETHEREUM_ELK,ETHEREUM_PANCAKESWAP_V2," +
"SYNTHETIX_ATOMIC_SIP288,PSM_GUSD,INTEGRAL,MAINNET_SOLIDLY,NOMISWAP_STABLE,CURVE_V2_TWOCRYPTO_META,MAVERICK_V1,VERSE," +
"DFX_FINANCE_V2,ZK_BOB,PANCAKESWAP_V3,NOMISWAPEPCS,XFAI,CURVE_V2_TRICRYPTO_NG,PMM8_2,SUSHISWAP_V3,SFRX_ETH,SDAI," +
"ETHEREUM_WOMBATSWAP,PMM12,CARBON,COMPOUND_V3,DODO_V3,SMARDEX,TRADERJOE_V2_1",
PROTOCOLS_1INCH: "",
};
}

Expand Down Expand Up @@ -207,19 +197,7 @@ class Lending implements ILending {
NETWORK_NAME: 'ethereum',
ALIASES: {},
ZERO_ADDRESS: ethers.ZeroAddress,
PROTOCOLS_1INCH: "UNISWAP_V1,UNISWAP_V2,SUSHI,MOONISWAP,BALANCER,COMPOUND,CURVE,CURVE_V2_SPELL_2_ASSET," +
"CURVE_V2_SGT_2_ASSET,CURVE_V2_THRESHOLDNETWORK_2_ASSET,CHAI,OASIS,KYBER,AAVE,IEARN,BANCOR,SWERVE," +
"BLACKHOLESWAP,DODO,DODO_V2,VALUELIQUID,SHELL,DEFISWAP,SAKESWAP,LUASWAP,MINISWAP,MSTABLE,PMM2," +
"SYNTHETIX,AAVE_V2,ST_ETH,ONE_INCH_LP,ONE_INCH_LP_1_1,LINKSWAP,S_FINANCE,PSM,POWERINDEX,XSIGMA," +
"SMOOTHY_FINANCE,SADDLE,KYBER_DMM,BALANCER_V2,UNISWAP_V3,SETH_WRAPPER,CURVE_V2,CURVE_V2_EURS_2_ASSET," +
"CURVE_V2_ETH_CRV,CURVE_V2_ETH_CVX,CONVERGENCE_X,ONE_INCH_LIMIT_ORDER,ONE_INCH_LIMIT_ORDER_V2," +
"ONE_INCH_LIMIT_ORDER_V3,DFX_FINANCE,FIXED_FEE_SWAP,DXSWAP,SHIBASWAP,UNIFI,PSM_PAX,WSTETH,DEFI_PLAZA," +
"FIXED_FEE_SWAP_V3,SYNTHETIX_WRAPPER,SYNAPSE,CURVE_V2_YFI_2_ASSET,CURVE_V2_ETH_PAL,POOLTOGETHER," +
"ETH_BANCOR_V3,ELASTICSWAP,BALANCER_V2_WRAPPER,FRAXSWAP,RADIOSHACK,KYBERSWAP_ELASTIC,CURVE_V2_TWO_CRYPTO," +
"STABLE_PLAZA,ZEROX_LIMIT_ORDER,CURVE_3CRV,KYBER_DMM_STATIC,ANGLE,ROCKET_POOL,ETHEREUM_ELK,ETHEREUM_PANCAKESWAP_V2," +
"SYNTHETIX_ATOMIC_SIP288,PSM_GUSD,INTEGRAL,MAINNET_SOLIDLY,NOMISWAP_STABLE,CURVE_V2_TWOCRYPTO_META,MAVERICK_V1,VERSE," +
"DFX_FINANCE_V2,ZK_BOB,PANCAKESWAP_V3,NOMISWAPEPCS,XFAI,CURVE_V2_TRICRYPTO_NG,PMM8_2,SUSHISWAP_V3,SFRX_ETH,SDAI," +
"ETHEREUM_WOMBATSWAP,PMM12,CARBON,COMPOUND_V3,DODO_V3,SMARDEX,TRADERJOE_V2_1",
PROTOCOLS_1INCH: "",
};

// JsonRpc provider
Expand Down Expand Up @@ -274,6 +252,7 @@ class Lending implements ILending {
this.constants.NETWORK_NAME = NETWORK_CONSTANTS[this.chainId].NAME;
this.constants.ALIASES = NETWORK_CONSTANTS[this.chainId].ALIASES;
this.constants.COINS = NETWORK_CONSTANTS[this.chainId].COINS;
this.constants.PROTOCOLS_1INCH = NETWORK_CONSTANTS[this.chainId].PROTOCOLS_1INCH;
this.setContract(this.constants.ALIASES.crv, ERC20ABI);

this.multicallProvider = new MulticallProvider(this.chainId, this.provider);
Expand Down
Loading

0 comments on commit 6aa9c78

Please sign in to comment.