From 9630decc1da4a2af33a34b3b0c0f32b1f5e009d6 Mon Sep 17 00:00:00 2001 From: macket Date: Wed, 20 Nov 2024 17:51:49 +0400 Subject: [PATCH 1/2] fix: deposit&stake ng only --- .../abis/deposit_and_stake_ng_only.json | 50 +++++++++++ src/curve.ts | 12 ++- src/pools/PoolTemplate.ts | 86 +++++++++++++------ src/router.ts | 4 +- 4 files changed, 120 insertions(+), 32 deletions(-) create mode 100644 src/constants/abis/deposit_and_stake_ng_only.json diff --git a/src/constants/abis/deposit_and_stake_ng_only.json b/src/constants/abis/deposit_and_stake_ng_only.json new file mode 100644 index 00000000..25801155 --- /dev/null +++ b/src/constants/abis/deposit_and_stake_ng_only.json @@ -0,0 +1,50 @@ +[ + { + "stateMutability": "payable", + "type": "function", + "name": "deposit_and_stake", + "inputs": [ + { + "name": "deposit", + "type": "address" + }, + { + "name": "lp_token", + "type": "address" + }, + { + "name": "gauge", + "type": "address" + }, + { + "name": "n_coins", + "type": "uint256" + }, + { + "name": "coins", + "type": "address[]" + }, + { + "name": "amounts", + "type": "uint256[]" + }, + { + "name": "min_mint_amount", + "type": "uint256" + }, + { + "name": "use_dynarray", + "type": "bool" + }, + { + "name": "pool", + "type": "address" + } + ], + "outputs": [] + }, + { + "stateMutability": "payable", + "type": "fallback" + } +] \ No newline at end of file diff --git a/src/curve.ts b/src/curve.ts index bd26fd28..1748af77 100644 --- a/src/curve.ts +++ b/src/curve.ts @@ -16,7 +16,7 @@ import { getFactoryPoolData } from "./factory/factory.js"; import { getFactoryPoolsDataFromApi } from "./factory/factory-api.js"; import { getCryptoFactoryPoolData } from "./factory/factory-crypto.js"; import { getTricryptoFactoryPoolData } from "./factory/factory-tricrypto.js"; -import {IPoolData, IDict, ICurve, INetworkName, IChainId, IFactoryPoolType, Abi, INetworkConstants} from "./interfaces"; +import {IPoolData, IDict, ICurve, IChainId, IFactoryPoolType, Abi, INetworkConstants} from "./interfaces"; import ERC20Abi from './constants/abis/ERC20.json' assert { type: 'json' }; import cERC20Abi from './constants/abis/cERC20.json' assert { type: 'json' }; import yERC20Abi from './constants/abis/yERC20.json' assert { type: 'json' }; @@ -30,6 +30,7 @@ import feeDistributorABI from './constants/abis/fee_distributor.json' assert { t import feeDistributorCrvUSDABI from './constants/abis/fee_distributor_crvusd.json' assert { type: 'json' }; import gaugeControllerABI from './constants/abis/gaugecontroller.json' assert { type: 'json' }; import depositAndStakeABI from './constants/abis/deposit_and_stake.json' assert { type: 'json' }; +import depositAndStakeNgOnlyABI from './constants/abis/deposit_and_stake_ng_only.json' assert { type: 'json' }; import cryptoCalcZapABI from './constants/abis/crypto_calc.json' assert { type: 'json'}; import StableCalcZapABI from './constants/abis/stable_calc.json' assert { type: 'json' }; import routerABI from './constants/abis/router.json' assert { type: 'json' }; @@ -56,6 +57,9 @@ import { L2Networks } from "./constants/L2Networks.js"; import { getTwocryptoFactoryPoolData } from "./factory/factory-twocrypto.js"; import {getNetworkConstants} from "./utils.js"; + +export const OLD_CHAINS = [1, 10, 56, 100, 137, 250, 1284, 2222, 8453, 42161, 42220, 43114, 1313161554]; // these chains have non-ng pools + export const memoizedContract = (): (address: string, abi: any, provider: BrowserProvider | JsonRpcProvider | Signer) => Contract => { const cache: Record = {}; return (address: string, abi: any, provider: BrowserProvider | JsonRpcProvider | Signer): Contract => { @@ -369,7 +373,11 @@ class Curve implements ICurve { this.setContract(this.constants.ALIASES.router, routerNgPoolsOnlyABI); } - this.setContract(this.constants.ALIASES.deposit_and_stake, depositAndStakeABI); + if (OLD_CHAINS.includes(this.chainId)) { + this.setContract(this.constants.ALIASES.deposit_and_stake, depositAndStakeABI); + } else { + this.setContract(this.constants.ALIASES.deposit_and_stake, depositAndStakeNgOnlyABI); + } this.setContract(this.constants.ALIASES.crypto_calc, cryptoCalcZapABI); diff --git a/src/pools/PoolTemplate.ts b/src/pools/PoolTemplate.ts index 93b951df..cf523035 100644 --- a/src/pools/PoolTemplate.ts +++ b/src/pools/PoolTemplate.ts @@ -28,7 +28,7 @@ import { PERIODS, } from '../utils.js'; import {IDict, IProfit} from '../interfaces'; -import { curve } from "../curve.js"; +import { curve, OLD_CHAINS } from "../curve.js"; import ERC20Abi from '../constants/abis/ERC20.json' assert { type: 'json' }; import {CorePool} from "./subClasses/corePool.js"; import {StatsPool} from "./subClasses/statsPool.js"; @@ -1227,6 +1227,7 @@ export class PoolTemplate extends CorePool { const contract = curve.contracts[curve.constants.ALIASES.deposit_and_stake].contract; const useUnderlying = isUnderlying && (this.isLending || (this.isCrypto && !this.isPlain)) && (!this.zap || this.id == 'avaxcrypto'); + const useDynarray = (!this.isCrypto && this.isNg && this.isPlain) || (isUnderlying && this.isMeta && (new PoolTemplate(this.basePool)).isNg); const _expectedLpTokenAmount = isUnderlying ? curve.parseUnits(await this.depositAndStakeExpected(amounts)) : curve.parseUnits(await this.depositAndStakeWrappedExpected(amounts)); @@ -1235,37 +1236,68 @@ export class PoolTemplate extends CorePool { const ethIndex = getEthIndex(coinAddresses); const value = _amounts[ethIndex] || curve.parseUnits("0"); - const _gas = (await contract.deposit_and_stake.estimateGas( - depositAddress, - this.lpToken, - this.gauge.address, - coins.length, - coinAddresses, - _amounts, - _minMintAmount, - useUnderlying, - (!this.isCrypto && this.isNg && this.isPlain) || (isUnderlying && this.isMeta && (new PoolTemplate(this.basePool)).isNg), - this.isMetaFactory && isUnderlying ? this.address : curve.constants.ZERO_ADDRESS, - { ...curve.constantOptions, value } - )) + let _gas = BigInt(0) + if (OLD_CHAINS.includes(curve.chainId)) { + _gas = (await contract.deposit_and_stake.estimateGas( + depositAddress, + this.lpToken, + this.gauge.address, + coins.length, + coinAddresses, + _amounts, + _minMintAmount, + useUnderlying, // <--- DIFFERENCE + useDynarray, + this.isMetaFactory && isUnderlying ? this.address : curve.constants.ZERO_ADDRESS, + {...curve.constantOptions, value} + )) + } else { + _gas = (await contract.deposit_and_stake.estimateGas( + depositAddress, + this.lpToken, + this.gauge.address, + coins.length, + coinAddresses, + _amounts, + _minMintAmount, + useDynarray, + this.isMetaFactory && isUnderlying ? this.address : curve.constants.ZERO_ADDRESS, + {...curve.constantOptions, value} + )) + } if (estimateGas) return smartNumber(_gas) await curve.updateFeeData(); const gasLimit = DIGas(_gas) * curve.parseUnits("200", 0) / curve.parseUnits("100", 0); - return (await contract.deposit_and_stake( - depositAddress, - this.lpToken, - this.gauge.address, - coins.length, - coinAddresses, - _amounts, - _minMintAmount, - useUnderlying, - (!this.isCrypto && this.isNg && this.isPlain) || (isUnderlying && this.isMeta && (new PoolTemplate(this.basePool)).isNg), - this.isMetaFactory && isUnderlying ? this.address : curve.constants.ZERO_ADDRESS, - { ...curve.options, gasLimit, value } - )).hash + if (OLD_CHAINS.includes(curve.chainId)) { + return (await contract.deposit_and_stake( + depositAddress, + this.lpToken, + this.gauge.address, + coins.length, + coinAddresses, + _amounts, + _minMintAmount, + useUnderlying, // <--- DIFFERENCE + useDynarray, + this.isMetaFactory && isUnderlying ? this.address : curve.constants.ZERO_ADDRESS, + {...curve.options, gasLimit, value} + )).hash + } else { + return (await contract.deposit_and_stake( + depositAddress, + this.lpToken, + this.gauge.address, + coins.length, + coinAddresses, + _amounts, + _minMintAmount, + useDynarray, + this.isMetaFactory && isUnderlying ? this.address : curve.constants.ZERO_ADDRESS, + {...curve.options, gasLimit, value} + )).hash + } } // ---------------- WITHDRAW ---------------- diff --git a/src/router.ts b/src/router.ts index 900bf9e2..59fae84a 100644 --- a/src/router.ts +++ b/src/router.ts @@ -2,7 +2,7 @@ import axios from "axios"; import memoize from "memoizee"; import BigNumber from "bignumber.js"; import {ethers} from "ethers"; -import {curve} from "./curve.js"; +import { curve, OLD_CHAINS } from "./curve.js"; import {IDict, IRoute, IRouteOutputAndCost, IRouteStep} from "./interfaces"; import { _cutZeros, @@ -35,8 +35,6 @@ import {IRouteGraphInput, routeGraphWorker, routeGraphWorkerCode} from "./route- const MAX_STEPS = 5; const ROUTE_LENGTH = (MAX_STEPS * 2) + 1; -const OLD_CHAINS = [1, 10, 56, 100, 137, 250, 1284, 2222, 8453, 42161, 42220, 43114, 1313161554]; // these chains have non-ng pools - const _getTVL = memoize( async (poolId: string) => Number(await (getPool(poolId)).stats.totalLiquidity()), { From 7d3f109892b266dc112a37676fcd1339558bd389 Mon Sep 17 00:00:00 2001 From: macket Date: Wed, 20 Nov 2024 17:52:33 +0400 Subject: [PATCH 2/2] build: v2.65.9 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 65704ea8..42e61c87 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@curvefi/api", - "version": "2.65.8", + "version": "2.65.9", "description": "JavaScript library for curve.fi", "main": "lib/index.js", "author": "Macket",