@curvefi/api 1.25.1 → 2.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +797 -590
- package/docs/v1/README.md +916 -0
- package/lib/boosting.d.ts +12 -12
- package/lib/boosting.js +23 -23
- package/lib/constants/abis/{json/2pool → 2pool}/swap.json +0 -0
- package/lib/constants/abis/{json/3pool → 3pool}/swap.json +0 -0
- package/lib/constants/abis/{json/4pool → 4pool}/swap.json +0 -0
- package/lib/constants/abis/{json/ERC20.json → ERC20.json} +0 -0
- package/lib/constants/abis/{json/aave → aave}/rewards.json +0 -0
- package/lib/constants/abis/{json/aave → aave}/swap.json +0 -0
- package/lib/constants/abis/{json/address_provider.json → address_provider.json} +0 -0
- package/lib/constants/abis/{json/ankreth → ankreth}/sCurveRewards.json +0 -0
- package/lib/constants/abis/{json/ankreth → ankreth}/swap.json +0 -0
- package/lib/constants/abis/{json/atricrypto3 → atricrypto3}/swap.json +0 -0
- package/lib/constants/abis/{json/atricrypto3 → atricrypto3}/zap.json +0 -0
- package/lib/constants/abis/{json/bbtc → bbtc}/deposit.json +0 -0
- package/lib/constants/abis/{json/bbtc → bbtc}/swap.json +0 -0
- package/lib/constants/abis/{json/busd → busd}/deposit.json +0 -0
- package/lib/constants/abis/{json/busd → busd}/swap.json +0 -0
- package/lib/constants/abis/{json/cERC20.json → cERC20.json} +0 -0
- package/lib/constants/abis/{json/compound → compound}/deposit.json +0 -0
- package/lib/constants/abis/{json/compound → compound}/swap.json +0 -0
- package/lib/constants/abis/{json/crveth → crveth}/swap.json +0 -0
- package/lib/constants/abis/{json/deposit_and_stake.json → deposit_and_stake.json} +0 -0
- package/lib/constants/abis/{json/dusd → dusd}/deposit.json +0 -0
- package/lib/constants/abis/{json/dusd → dusd}/sCurveRewards.json +0 -0
- package/lib/constants/abis/{json/dusd → dusd}/swap.json +0 -0
- package/lib/constants/abis/{json/eurs → eurs}/sCurveRewards.json +0 -0
- package/lib/constants/abis/{json/eurs → eurs}/swap.json +0 -0
- package/lib/constants/abis/{json/eursusd → eursusd}/swap.json +0 -0
- package/lib/constants/abis/{json/eurt → eurt}/swap.json +0 -0
- package/lib/constants/abis/{json/eurtusd → eurtusd}/deposit.json +0 -0
- package/lib/constants/abis/{json/eurtusd → eurtusd}/swap.json +0 -0
- package/lib/constants/abis/{json/factory-crypto → factory-crypto}/factory-crypto-pool-2.json +0 -0
- package/lib/constants/abis/{json/factory-crypto.json → factory-crypto.json} +0 -0
- package/lib/constants/abis/{json/factory-v2 → factory-v2}/DepositZapMetaBtcPolygon.json +0 -0
- package/lib/constants/abis/{json/factory-v2 → factory-v2}/DepositZapMetaUsdPolygon.json +0 -0
- package/lib/constants/abis/{json/factory-v2 → factory-v2}/MetaBTC.json +0 -0
- package/lib/constants/abis/{json/factory-v2 → factory-v2}/MetaBTCBalances.json +0 -0
- package/lib/constants/abis/{json/factory-v2 → factory-v2}/MetaBTCBalancesRen.json +0 -0
- package/lib/constants/abis/{json/factory-v2 → factory-v2}/MetaBTCRen.json +0 -0
- package/lib/constants/abis/{json/factory-v2 → factory-v2}/MetaUSD.json +0 -0
- package/lib/constants/abis/{json/factory-v2 → factory-v2}/MetaUSDBalances.json +0 -0
- package/lib/constants/abis/{json/factory-v2 → factory-v2}/Plain2Balances.json +0 -0
- package/lib/constants/abis/{json/factory-v2 → factory-v2}/Plain2Basic.json +0 -0
- package/lib/constants/abis/{json/factory-v2 → factory-v2}/Plain2ETH.json +0 -0
- package/lib/constants/abis/{json/factory-v2 → factory-v2}/Plain2Optimized.json +0 -0
- package/lib/constants/abis/{json/factory-v2 → factory-v2}/Plain3Balances.json +0 -0
- package/lib/constants/abis/{json/factory-v2 → factory-v2}/Plain3Basic.json +0 -0
- package/lib/constants/abis/{json/factory-v2 → factory-v2}/Plain3ETH.json +0 -0
- package/lib/constants/abis/{json/factory-v2 → factory-v2}/Plain3Optimized.json +0 -0
- package/lib/constants/abis/{json/factory-v2 → factory-v2}/Plain4Balances.json +0 -0
- package/lib/constants/abis/{json/factory-v2 → factory-v2}/Plain4Basic.json +0 -0
- package/lib/constants/abis/{json/factory-v2 → factory-v2}/Plain4ETH.json +0 -0
- package/lib/constants/abis/{json/factory-v2 → factory-v2}/Plain4Optimized.json +0 -0
- package/lib/constants/abis/{json/factory.json → factory.json} +0 -0
- package/lib/constants/abis/{json/factoryPools → factoryPools}/deposit.json +0 -0
- package/lib/constants/abis/{json/factoryPools → factoryPools}/rewards.json +0 -0
- package/lib/constants/abis/{json/factoryPools → factoryPools}/swap.json +0 -0
- package/lib/constants/abis/{json/gauge.json → gauge.json} +0 -0
- package/lib/constants/abis/{json/gauge_factory.json → gauge_factory.json} +0 -0
- package/lib/constants/abis/{json/gauge_rewards_only.json → gauge_rewards_only.json} +0 -0
- package/lib/constants/abis/{json/gauge_synthetix.json → gauge_synthetix.json} +0 -0
- package/lib/constants/abis/{json/gauge_v2.json → gauge_v2.json} +0 -0
- package/lib/constants/abis/{json/gauge_v3.json → gauge_v3.json} +0 -0
- package/lib/constants/abis/{json/gauge_v4.json → gauge_v4.json} +0 -0
- package/lib/constants/abis/{json/gauge_v5.json → gauge_v5.json} +0 -0
- package/lib/constants/abis/{json/gaugecontroller.json → gaugecontroller.json} +0 -0
- package/lib/constants/abis/{json/gusd → gusd}/deposit.json +0 -0
- package/lib/constants/abis/{json/gusd → gusd}/swap.json +0 -0
- package/lib/constants/abis/{json/hbtc → hbtc}/swap.json +0 -0
- package/lib/constants/abis/{json/husd → husd}/deposit.json +0 -0
- package/lib/constants/abis/{json/husd → husd}/swap.json +0 -0
- package/lib/constants/abis/{json/ib → ib}/swap.json +0 -0
- package/lib/constants/abis/{json/iearn → iearn}/deposit.json +0 -0
- package/lib/constants/abis/{json/iearn → iearn}/sCurveRewards.json +0 -0
- package/lib/constants/abis/{json/iearn → iearn}/swap.json +0 -0
- package/lib/constants/abis/{json/link → link}/swap.json +0 -0
- package/lib/constants/abis/{json/minter.json → minter.json} +0 -0
- package/lib/constants/abis/{json/musd → musd}/deposit.json +0 -0
- package/lib/constants/abis/{json/musd → musd}/sCurveRewards.json +0 -0
- package/lib/constants/abis/{json/musd → musd}/swap.json +0 -0
- package/lib/constants/abis/{json/obtc → obtc}/deposit.json +0 -0
- package/lib/constants/abis/{json/obtc → obtc}/sCurveRewards.json +0 -0
- package/lib/constants/abis/{json/obtc → obtc}/swap.json +0 -0
- package/lib/constants/abis/{json/paave → paave}/rewards.json +0 -0
- package/lib/constants/abis/{json/pax → pax}/deposit.json +0 -0
- package/lib/constants/abis/{json/pax → pax}/swap.json +0 -0
- package/lib/constants/abis/{json/pbtc → pbtc}/deposit.json +0 -0
- package/lib/constants/abis/{json/pbtc → pbtc}/sCurveRewards.json +0 -0
- package/lib/constants/abis/{json/pbtc → pbtc}/swap.json +0 -0
- package/lib/constants/abis/{json/rai → rai}/deposit.json +0 -0
- package/lib/constants/abis/{json/rai → rai}/swap.json +0 -0
- package/lib/constants/abis/{json/registry_exchange.json → registry_exchange.json} +0 -0
- package/lib/constants/abis/{json/ren → ren}/swap.json +0 -0
- package/lib/constants/abis/{json/ren-polygon → ren-polygon}/swap.json +0 -0
- package/lib/constants/abis/{json/reth → reth}/swap.json +0 -0
- package/lib/constants/abis/{json/router.json → router.json} +0 -0
- package/lib/constants/abis/{json/rsv → rsv}/deposit.json +0 -0
- package/lib/constants/abis/{json/rsv → rsv}/sCurveRewards.json +0 -0
- package/lib/constants/abis/{json/rsv → rsv}/swap.json +0 -0
- package/lib/constants/abis/{json/saave → saave}/swap.json +0 -0
- package/lib/constants/abis/{json/sbtc → sbtc}/sCurveRewards.json +0 -0
- package/lib/constants/abis/{json/sbtc → sbtc}/swap.json +0 -0
- package/lib/constants/abis/{json/seth → seth}/swap.json +0 -0
- package/lib/constants/abis/{json/steth → steth}/sCurveRewards.json +0 -0
- package/lib/constants/abis/{json/steth → steth}/swap.json +0 -0
- package/lib/constants/abis/{json/streamer.json → streamer.json} +0 -0
- package/lib/constants/abis/{json/susdv2 → susdv2}/deposit.json +0 -0
- package/lib/constants/abis/{json/susdv2 → susdv2}/sCurveRewards.json +0 -0
- package/lib/constants/abis/{json/susdv2 → susdv2}/swap.json +0 -0
- package/lib/constants/abis/{json/tbtc → tbtc}/deposit.json +0 -0
- package/lib/constants/abis/{json/tbtc → tbtc}/sCurveRewards.json +0 -0
- package/lib/constants/abis/{json/tbtc → tbtc}/swap.json +0 -0
- package/lib/constants/abis/{json/tricrypto2 → tricrypto2}/deposit.json +0 -0
- package/lib/constants/abis/{json/tricrypto2 → tricrypto2}/swap.json +0 -0
- package/lib/constants/abis/{json/usdk → usdk}/deposit.json +0 -0
- package/lib/constants/abis/{json/usdk → usdk}/swap.json +0 -0
- package/lib/constants/abis/{json/usdn → usdn}/deposit.json +0 -0
- package/lib/constants/abis/{json/usdn → usdn}/swap.json +0 -0
- package/lib/constants/abis/{json/usdp → usdp}/deposit.json +0 -0
- package/lib/constants/abis/{json/usdp → usdp}/swap.json +0 -0
- package/lib/constants/abis/{json/usdt → usdt}/deposit.json +0 -0
- package/lib/constants/abis/{json/usdt → usdt}/swap.json +0 -0
- package/lib/constants/abis/{json/ust → ust}/deposit.json +0 -0
- package/lib/constants/abis/{json/ust → ust}/swap.json +0 -0
- package/lib/constants/abis/{json/votingescrow.json → votingescrow.json} +0 -0
- package/lib/constants/abis/{json/yERC20.json → yERC20.json} +0 -0
- package/lib/constants/aliases.d.ts +2 -24
- package/lib/constants/aliases.js +5 -4
- package/lib/constants/{coins-ethereum.d.ts → coins/ethereum.d.ts} +0 -9
- package/lib/constants/{coins-ethereum.js → coins/ethereum.js} +12 -23
- package/lib/constants/{coins-polygon.d.ts → coins/polygon.d.ts} +0 -12
- package/lib/constants/{coins-polygon.js → coins/polygon.js} +8 -20
- package/lib/constants/pools/ethereum.d.ts +2 -0
- package/lib/constants/{abis/abis-ethereum.js → pools/ethereum.js} +517 -1012
- package/lib/constants/pools/index.d.ts +3 -0
- package/lib/constants/pools/index.js +7 -0
- package/lib/constants/pools/polygon.d.ts +4 -0
- package/lib/constants/{abis/abis-polygon.js → pools/polygon.js} +53 -81
- package/lib/constants/utils.d.ts +5 -0
- package/lib/constants/utils.js +69 -0
- package/lib/curve.d.ts +10 -32
- package/lib/curve.js +188 -232
- package/lib/external-api.d.ts +3 -1
- package/lib/external-api.js +34 -1
- package/lib/factory/constants.d.ts +15 -15
- package/lib/factory/constants.js +19 -19
- package/lib/factory/factory-api.d.ts +2 -2
- package/lib/factory/factory-api.js +52 -45
- package/lib/factory/factory-crypto.d.ts +2 -2
- package/lib/factory/factory-crypto.js +23 -31
- package/lib/factory/factory.d.ts +2 -2
- package/lib/factory/factory.js +53 -66
- package/lib/index.d.ts +37 -53
- package/lib/index.js +28 -35
- package/lib/interfaces.d.ts +35 -72
- package/lib/pools/PoolTemplate.d.ts +212 -0
- package/lib/pools/PoolTemplate.js +2371 -0
- package/lib/pools/index.d.ts +3 -0
- package/lib/pools/index.js +7 -0
- package/lib/pools/mixins/common.d.ts +3 -0
- package/lib/pools/mixins/common.js +77 -0
- package/lib/pools/mixins/depositBalancedAmountsMixins.d.ts +5 -0
- package/lib/pools/mixins/depositBalancedAmountsMixins.js +145 -0
- package/lib/pools/mixins/depositBonusMixins.d.ts +5 -0
- package/lib/pools/mixins/depositBonusMixins.js +164 -0
- package/lib/pools/mixins/depositMixins.d.ts +5 -0
- package/lib/pools/mixins/depositMixins.js +373 -0
- package/lib/pools/mixins/depositWrappedMixins.d.ts +3 -0
- package/lib/pools/mixins/depositWrappedMixins.js +243 -0
- package/lib/pools/mixins/poolBalancesMixin.d.ts +4 -0
- package/lib/pools/mixins/poolBalancesMixin.js +129 -0
- package/lib/pools/mixins/swapMixins.d.ts +4 -0
- package/lib/pools/mixins/swapMixins.js +313 -0
- package/lib/pools/mixins/swapWrappedMixins.d.ts +4 -0
- package/lib/pools/mixins/swapWrappedMixins.js +297 -0
- package/lib/pools/mixins/withdrawExpectedMixins.d.ts +6 -0
- package/lib/pools/mixins/withdrawExpectedMixins.js +164 -0
- package/lib/pools/mixins/withdrawImbalanceMixins.d.ts +5 -0
- package/lib/pools/mixins/withdrawImbalanceMixins.js +348 -0
- package/lib/pools/mixins/withdrawImbalanceWrappedMixins.d.ts +3 -0
- package/lib/pools/mixins/withdrawImbalanceWrappedMixins.js +207 -0
- package/lib/pools/mixins/withdrawMixins.d.ts +5 -0
- package/lib/pools/mixins/withdrawMixins.js +347 -0
- package/lib/pools/mixins/withdrawOneCoinExpectedMixins.d.ts +5 -0
- package/lib/pools/mixins/withdrawOneCoinExpectedMixins.js +104 -0
- package/lib/pools/mixins/withdrawOneCoinMixins.d.ts +5 -0
- package/lib/pools/mixins/withdrawOneCoinMixins.js +347 -0
- package/lib/pools/mixins/withdrawOneCoinWrappedExpectedMixins.d.ts +3 -0
- package/lib/pools/mixins/withdrawOneCoinWrappedExpectedMixins.js +72 -0
- package/lib/pools/mixins/withdrawOneCoinWrappedMixins.d.ts +3 -0
- package/lib/pools/mixins/withdrawOneCoinWrappedMixins.js +205 -0
- package/lib/pools/mixins/withdrawWrappedMixins.d.ts +3 -0
- package/lib/pools/mixins/withdrawWrappedMixins.js +206 -0
- package/lib/pools/poolConstructor.d.ts +2 -0
- package/lib/pools/poolConstructor.js +228 -0
- package/lib/pools/utils.d.ts +4 -0
- package/lib/pools/utils.js +85 -0
- package/lib/router.d.ts +13 -0
- package/lib/router.js +651 -0
- package/lib/utils.d.ts +11 -16
- package/lib/utils.js +47 -130
- package/package.json +1 -1
- package/lib/constants/abis/abis-ethereum.d.ts +0 -4
- package/lib/constants/abis/abis-polygon.d.ts +0 -4
- package/lib/constants/abis/json/aRewards.json +0 -1
- package/lib/constants/abis/json/compound/migration.json +0 -57
- package/lib/constants/abis/json/compound/oldSwap.json +0 -688
- package/lib/constants/abis/json/ren/adapter.json +0 -1
- package/lib/constants/abis/json/sbtc/adapter.json +0 -1
- package/lib/pools.d.ts +0 -267
- package/lib/pools.js +0 -4742
|
@@ -0,0 +1,916 @@
|
|
|
1
|
+
# Curve JS
|
|
2
|
+
|
|
3
|
+
## Setup
|
|
4
|
+
|
|
5
|
+
Install from npm:
|
|
6
|
+
|
|
7
|
+
`npm install @curvefi/api`
|
|
8
|
+
|
|
9
|
+
## Init
|
|
10
|
+
```ts
|
|
11
|
+
import curve from "@curvefi/api";
|
|
12
|
+
|
|
13
|
+
(async () => {
|
|
14
|
+
// 1. Dev
|
|
15
|
+
await curve.init('JsonRpc', {url: 'http://localhost:8545/', privateKey: ''}, { gasPrice: 0, maxFeePerGas: 0, maxPriorityFeePerGas: 0, chainId: 1 });
|
|
16
|
+
// OR
|
|
17
|
+
await curve.init('JsonRpc', {}, { chainId: 1 }); // In this case fee data will be specified automatically
|
|
18
|
+
|
|
19
|
+
// 2. Infura
|
|
20
|
+
curve.init("Infura", { network: "homestead", apiKey: <INFURA_KEY> }, { chainId: 1 });
|
|
21
|
+
|
|
22
|
+
// 3. Web3 provider
|
|
23
|
+
curve.init('Web3', { externalProvider: <WEB3_PROVIDER> }, { chainId: 1 });
|
|
24
|
+
})()
|
|
25
|
+
```
|
|
26
|
+
**Note 1.** ```chainId``` parameter is optional, but you must specify it in the case you use Metamask on localhost network, because Metamask has that [bug](https://hardhat.org/metamask-issue.html)
|
|
27
|
+
|
|
28
|
+
**Note 2.** Web3 init requires the address. Therefore, it can be initialized only after receiving the address.
|
|
29
|
+
|
|
30
|
+
**Wrong ❌️**
|
|
31
|
+
```tsx
|
|
32
|
+
import type { FunctionComponent } from 'react'
|
|
33
|
+
import { useState, useMemo } from 'react'
|
|
34
|
+
import { providers } from 'ethers'
|
|
35
|
+
import Onboard from 'bnc-onboard'
|
|
36
|
+
import type { Wallet } from 'bnc-onboard/dist/src/interfaces'
|
|
37
|
+
import curve from '@curvefi/api'
|
|
38
|
+
|
|
39
|
+
...
|
|
40
|
+
|
|
41
|
+
const WalletProvider: FunctionComponent = ({ children }) => {
|
|
42
|
+
const [wallet, setWallet] = useState<Wallet>()
|
|
43
|
+
const [provider, setProvider] = useState<providers.Web3Provider>()
|
|
44
|
+
const [address, setAddress] = useState<string>()
|
|
45
|
+
|
|
46
|
+
const networkId = 1
|
|
47
|
+
|
|
48
|
+
const onboard = useMemo(
|
|
49
|
+
() =>
|
|
50
|
+
Onboard({
|
|
51
|
+
dappId: DAPP_ID,
|
|
52
|
+
networkId,
|
|
53
|
+
|
|
54
|
+
subscriptions: {
|
|
55
|
+
address: (address) => {
|
|
56
|
+
setAddress(address)
|
|
57
|
+
},
|
|
58
|
+
|
|
59
|
+
wallet: (wallet) => {
|
|
60
|
+
setWallet(wallet)
|
|
61
|
+
if (wallet.provider) {
|
|
62
|
+
curve.init("Web3", { externalProvider: wallet.provider }, { chainId: networkId })
|
|
63
|
+
}
|
|
64
|
+
},
|
|
65
|
+
},
|
|
66
|
+
walletSelect: {
|
|
67
|
+
wallets: wallets,
|
|
68
|
+
},
|
|
69
|
+
}),
|
|
70
|
+
[]
|
|
71
|
+
)
|
|
72
|
+
|
|
73
|
+
...
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
**Right ✔️**
|
|
77
|
+
```tsx
|
|
78
|
+
import type { FunctionComponent } from 'react'
|
|
79
|
+
import { useState, useMemo, useEffect } from 'react'
|
|
80
|
+
import { providers } from 'ethers'
|
|
81
|
+
import Onboard from 'bnc-onboard'
|
|
82
|
+
import type { Wallet } from 'bnc-onboard/dist/src/interfaces'
|
|
83
|
+
import curve from '@curvefi/api'
|
|
84
|
+
|
|
85
|
+
...
|
|
86
|
+
|
|
87
|
+
const WalletProvider: FunctionComponent = ({ children }) => {
|
|
88
|
+
const [wallet, setWallet] = useState<Wallet>()
|
|
89
|
+
const [provider, setProvider] = useState<providers.Web3Provider>()
|
|
90
|
+
const [address, setAddress] = useState<string>()
|
|
91
|
+
|
|
92
|
+
const networkId = 1
|
|
93
|
+
|
|
94
|
+
const onboard = useMemo(
|
|
95
|
+
() =>
|
|
96
|
+
Onboard({
|
|
97
|
+
dappId: DAPP_ID,
|
|
98
|
+
networkId,
|
|
99
|
+
|
|
100
|
+
subscriptions: {
|
|
101
|
+
address: (address) => {
|
|
102
|
+
setAddress(address)
|
|
103
|
+
},
|
|
104
|
+
|
|
105
|
+
wallet: (wallet) => {
|
|
106
|
+
setWallet(wallet)
|
|
107
|
+
},
|
|
108
|
+
},
|
|
109
|
+
walletSelect: {
|
|
110
|
+
wallets: wallets,
|
|
111
|
+
},
|
|
112
|
+
}),
|
|
113
|
+
[]
|
|
114
|
+
)
|
|
115
|
+
|
|
116
|
+
useEffect(() => {
|
|
117
|
+
if (address && wallet?.provider) {
|
|
118
|
+
curve.init("Web3", { externalProvider: wallet.provider }, { chainId: networkId })
|
|
119
|
+
}
|
|
120
|
+
}, [address, wallet?.provider]);
|
|
121
|
+
|
|
122
|
+
...
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
## Available pools
|
|
126
|
+
```ts
|
|
127
|
+
import curve from "@curvefi/api";
|
|
128
|
+
|
|
129
|
+
(async () => {
|
|
130
|
+
await curve.init('JsonRpc', {}, {gasPrice: 0, maxFeePerGas: 0, maxPriorityFeePerGas: 0});
|
|
131
|
+
|
|
132
|
+
console.log(curve.getPoolList());
|
|
133
|
+
// [
|
|
134
|
+
// 'compound', 'usdt', 'y', 'busd',
|
|
135
|
+
// 'susd', 'pax', 'ren', 'sbtc',
|
|
136
|
+
// 'hbtc', '3pool', 'gusd', 'husd',
|
|
137
|
+
// 'usdk', 'usdn', 'musd', 'rsv',
|
|
138
|
+
// 'tbtc', 'dusd', 'pbtc', 'bbtc',
|
|
139
|
+
// 'obtc', 'seth', 'eurs', 'ust',
|
|
140
|
+
// 'aave', 'steth', 'saave', 'ankreth',
|
|
141
|
+
// 'usdp', 'ib', 'link', 'tusd',
|
|
142
|
+
// 'frax', 'lusd', 'busdv2', 'reth',
|
|
143
|
+
// 'alusd', 'mim', 'tricrypto2', 'eurt',
|
|
144
|
+
// 'eurtusd', 'crveth', 'cvxeth'
|
|
145
|
+
// ]
|
|
146
|
+
})()
|
|
147
|
+
````
|
|
148
|
+
|
|
149
|
+
## Balances
|
|
150
|
+
```ts
|
|
151
|
+
import curve from "@curvefi/api";
|
|
152
|
+
|
|
153
|
+
(async () => {
|
|
154
|
+
await curve.init('JsonRpc', {}, { gasPrice: 0, maxFeePerGas: 0, maxPriorityFeePerGas: 0 });
|
|
155
|
+
|
|
156
|
+
console.log(await curve.getBalances(['DAI', 'sUSD']));
|
|
157
|
+
// OR console.log(await curve.getBalances(['0x6B175474E89094C44Da98b954EedeAC495271d0F', '0x57Ab1ec28D129707052df4dF418D58a2D46d5f51']));
|
|
158
|
+
|
|
159
|
+
// [ '10000.0', '10000.0' ]
|
|
160
|
+
|
|
161
|
+
console.log(await curve.getBalances(['aDAI', 'aSUSD']));
|
|
162
|
+
// OR console.log(await curve.getBalances(['0x028171bCA77440897B824Ca71D1c56caC55b68A3', '0x6c5024cd4f8a59110119c56f8933403a539555eb']));
|
|
163
|
+
|
|
164
|
+
// [ '10000.00017727177059715', '10000.000080108429034461' ]
|
|
165
|
+
|
|
166
|
+
|
|
167
|
+
// --- Pool ---
|
|
168
|
+
|
|
169
|
+
const saave = new curve.Pool('saave');
|
|
170
|
+
|
|
171
|
+
// 1. Current address balances (signer balances)
|
|
172
|
+
|
|
173
|
+
console.log(await saave.balances());
|
|
174
|
+
// {
|
|
175
|
+
// lpToken: '0.0',
|
|
176
|
+
// gauge: '0.0',
|
|
177
|
+
// '0x6B175474E89094C44Da98b954EedeAC495271d0F': '10000.0',
|
|
178
|
+
// '0x57Ab1ec28D129707052df4dF418D58a2D46d5f51': '10000.0',
|
|
179
|
+
// '0x028171bCA77440897B824Ca71D1c56caC55b68A3': '10000.00017727177059715',
|
|
180
|
+
// '0x6c5024cd4f8a59110119c56f8933403a539555eb': '10000.000080108429034461'
|
|
181
|
+
// }
|
|
182
|
+
|
|
183
|
+
console.log(await saave.lpTokenBalances());
|
|
184
|
+
// { lpToken: '0.0', gauge: '0.0' }
|
|
185
|
+
|
|
186
|
+
console.log(await saave.underlyingCoinBalances());
|
|
187
|
+
// {
|
|
188
|
+
// '0x6B175474E89094C44Da98b954EedeAC495271d0F': '10000.0',
|
|
189
|
+
// '0x57Ab1ec28D129707052df4dF418D58a2D46d5f51': '10000.0'
|
|
190
|
+
// }
|
|
191
|
+
|
|
192
|
+
console.log(await saave.coinBalances());
|
|
193
|
+
// {
|
|
194
|
+
// '0x028171bCA77440897B824Ca71D1c56caC55b68A3': '10000.00017727177059715',
|
|
195
|
+
// '0x6c5024cd4f8a59110119c56f8933403a539555eb': '10000.000080108429034461'
|
|
196
|
+
// }
|
|
197
|
+
|
|
198
|
+
console.log(await saave.allCoinBalances());
|
|
199
|
+
// {
|
|
200
|
+
// '0x6B175474E89094C44Da98b954EedeAC495271d0F': '10000.0',
|
|
201
|
+
// '0x57Ab1ec28D129707052df4dF418D58a2D46d5f51': '10000.0',
|
|
202
|
+
// '0x028171bCA77440897B824Ca71D1c56caC55b68A3': '10000.00017727177059715',
|
|
203
|
+
// '0x6c5024cd4f8a59110119c56f8933403a539555eb': '10000.000080108429034461'
|
|
204
|
+
// }
|
|
205
|
+
|
|
206
|
+
|
|
207
|
+
// 2. For every method above you can specify the address
|
|
208
|
+
|
|
209
|
+
console.log(await saave.balances("0x0063046686E46Dc6F15918b61AE2B121458534a5"));
|
|
210
|
+
// {
|
|
211
|
+
// lpToken: '0.0',
|
|
212
|
+
// gauge: '0.0',
|
|
213
|
+
// '0x6B175474E89094C44Da98b954EedeAC495271d0F': '0.0',
|
|
214
|
+
// '0x57Ab1ec28D129707052df4dF418D58a2D46d5f51': '0.0',
|
|
215
|
+
// '0x028171bCA77440897B824Ca71D1c56caC55b68A3': '0.0',
|
|
216
|
+
// '0x6c5024cd4f8a59110119c56f8933403a539555eb': '0.0'
|
|
217
|
+
// }
|
|
218
|
+
|
|
219
|
+
// Or several addresses
|
|
220
|
+
console.log(await saave.balances("0x0063046686E46Dc6F15918b61AE2B121458534a5", "0x66aB6D9362d4F35596279692F0251Db635165871"));
|
|
221
|
+
// {
|
|
222
|
+
// '0x0063046686E46Dc6F15918b61AE2B121458534a5': {
|
|
223
|
+
// lpToken: '0.0',
|
|
224
|
+
// gauge: '0.0',
|
|
225
|
+
// '0x6B175474E89094C44Da98b954EedeAC495271d0F': '0.0',
|
|
226
|
+
// '0x57Ab1ec28D129707052df4dF418D58a2D46d5f51': '0.0',
|
|
227
|
+
// '0x028171bCA77440897B824Ca71D1c56caC55b68A3': '0.0',
|
|
228
|
+
// '0x6c5024cd4f8a59110119c56f8933403a539555eb': '0.0'
|
|
229
|
+
// },
|
|
230
|
+
// '0x66aB6D9362d4F35596279692F0251Db635165871': {
|
|
231
|
+
// lpToken: '0.0',
|
|
232
|
+
// gauge: '0.0',
|
|
233
|
+
// '0x6B175474E89094C44Da98b954EedeAC495271d0F': '10000.0',
|
|
234
|
+
// '0x57Ab1ec28D129707052df4dF418D58a2D46d5f51': '10000.0',
|
|
235
|
+
// '0x028171bCA77440897B824Ca71D1c56caC55b68A3': '10000.00017727177059715',
|
|
236
|
+
// '0x6c5024cd4f8a59110119c56f8933403a539555eb': '10000.000080108429034461'
|
|
237
|
+
// }
|
|
238
|
+
// }
|
|
239
|
+
|
|
240
|
+
|
|
241
|
+
})()
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
## Stats
|
|
245
|
+
```ts
|
|
246
|
+
import curve from "@curvefi/api";
|
|
247
|
+
|
|
248
|
+
(async () => {
|
|
249
|
+
await curve.init('JsonRpc', {}, {gasPrice: 0, maxFeePerGas: 0, maxPriorityFeePerGas: 0});
|
|
250
|
+
|
|
251
|
+
console.log(await curve.getTVL());
|
|
252
|
+
// 19281307454.671753
|
|
253
|
+
|
|
254
|
+
const aave = new curve.Pool('aave');
|
|
255
|
+
|
|
256
|
+
console.log(await aave.stats.getParameters());
|
|
257
|
+
// {
|
|
258
|
+
// virtualPrice: '1.082056814810440924',
|
|
259
|
+
// fee: '0.04',
|
|
260
|
+
// adminFee: '0.02',
|
|
261
|
+
// A: '2000',
|
|
262
|
+
// future_A: '2000',
|
|
263
|
+
// initial_A: '200',
|
|
264
|
+
// future_A_time: 1628525830000,
|
|
265
|
+
// initial_A_time: 1627923611000,
|
|
266
|
+
// gamma: undefined
|
|
267
|
+
// }
|
|
268
|
+
|
|
269
|
+
|
|
270
|
+
console.log(await aave.stats.getPoolBalances());
|
|
271
|
+
// [ '19619514.600802512613372364', '18740372.790339', '16065974.167437' ]
|
|
272
|
+
|
|
273
|
+
console.log(await aave.stats.getPoolWrappedBalances());
|
|
274
|
+
// [ '19619514.600802512613372364', '18740372.790339', '16065974.167437' ]
|
|
275
|
+
|
|
276
|
+
console.log(await aave.stats.getTotalLiquidity());
|
|
277
|
+
// 54425861.55857851
|
|
278
|
+
|
|
279
|
+
console.log(await aave.stats.getVolume());
|
|
280
|
+
// 175647.68180084194
|
|
281
|
+
|
|
282
|
+
console.log(await aave.stats.getBaseApy());
|
|
283
|
+
// { day: '3.2015', week: '3.1185', month: '3.1318', total: '7.7286' }
|
|
284
|
+
|
|
285
|
+
console.log(await aave.stats.getTokenApy());
|
|
286
|
+
// [ '0.4093', '1.0233' ]
|
|
287
|
+
|
|
288
|
+
console.log(await aave.stats.getRewardsApy());
|
|
289
|
+
// [
|
|
290
|
+
// {
|
|
291
|
+
// token: '0x4da27a545c0c5B758a6BA100e3a049001de870f5',
|
|
292
|
+
// symbol: 'stkAAVE',
|
|
293
|
+
// apy: '0.4978306501849664'
|
|
294
|
+
// }
|
|
295
|
+
// ]
|
|
296
|
+
})()
|
|
297
|
+
````
|
|
298
|
+
|
|
299
|
+
## Add/remove liquidity
|
|
300
|
+
|
|
301
|
+
```ts
|
|
302
|
+
import curve from "@curvefi/api";
|
|
303
|
+
|
|
304
|
+
(async () => {
|
|
305
|
+
await curve.init('JsonRpc', {}, { gasPrice: 0, maxFeePerGas: 0, maxPriorityFeePerGas: 0, chainId: 1 });
|
|
306
|
+
|
|
307
|
+
const pool = new curve.Pool('aave');
|
|
308
|
+
console.log(pool.underlyingCoins); // [ 'DAI', 'USDC', 'USDT' ]
|
|
309
|
+
console.log(pool.coins); // [ 'aDAI', 'aUSDC', 'aUSDT' ]
|
|
310
|
+
|
|
311
|
+
console.log(await pool.balances());
|
|
312
|
+
//{
|
|
313
|
+
// lpToken: '0.0',
|
|
314
|
+
// gauge: '0.0',
|
|
315
|
+
// DAI: '1000.0',
|
|
316
|
+
// USDC: '1000.0',
|
|
317
|
+
// USDT: '1000.0',
|
|
318
|
+
// aDAI: '1000.000012756069187853',
|
|
319
|
+
// aUSDC: '1000.000005',
|
|
320
|
+
// aUSDT: '1000.0'
|
|
321
|
+
//}
|
|
322
|
+
|
|
323
|
+
|
|
324
|
+
// --- ADD LIQUIDITY ---
|
|
325
|
+
|
|
326
|
+
const expectedLpTokenAmount1 = await pool.addLiquidityExpected(['100', '100', '100']);
|
|
327
|
+
// 283.535915313504880343
|
|
328
|
+
const tx = await pool.addLiquidity(['100', '100', '100']);
|
|
329
|
+
console.log(tx); // 0x7aef5b13385207f1d311b7e5d485d4994a6520482e8dc682b5ef26e9addc53be
|
|
330
|
+
|
|
331
|
+
//{
|
|
332
|
+
// lpToken: '283.531953275007017412',
|
|
333
|
+
// gauge: '0.0',
|
|
334
|
+
// DAI: '900.0',
|
|
335
|
+
// USDC: '900.0',
|
|
336
|
+
// USDT: '900.0',
|
|
337
|
+
// aDAI: '1000.000091543555348124',
|
|
338
|
+
// aUSDC: '1000.00007',
|
|
339
|
+
// aUSDT: '1000.000095'
|
|
340
|
+
//}
|
|
341
|
+
|
|
342
|
+
|
|
343
|
+
// --- ADD LIQUIDITY WRAPPED ---
|
|
344
|
+
|
|
345
|
+
await pool.addLiquidityWrappedExpected(['100', '100', '100']);
|
|
346
|
+
// 283.53589268907800207
|
|
347
|
+
await pool.addLiquidityWrapped(['100', '100', '100']);
|
|
348
|
+
|
|
349
|
+
//{
|
|
350
|
+
// lpToken: '567.06390438645751582',
|
|
351
|
+
// gauge: '0.0',
|
|
352
|
+
// DAI: '900.0',
|
|
353
|
+
// USDC: '900.0',
|
|
354
|
+
// USDT: '900.0',
|
|
355
|
+
// aDAI: '900.00009904712567354',
|
|
356
|
+
// aUSDC: '900.000077',
|
|
357
|
+
// aUSDT: '900.000104'
|
|
358
|
+
//}
|
|
359
|
+
|
|
360
|
+
|
|
361
|
+
// --- GAUGE DEPOSIT ---
|
|
362
|
+
|
|
363
|
+
const lpTokenBalance = (await pool.balances())['lpToken'];
|
|
364
|
+
await pool.gaugeDeposit(lpTokenBalance);
|
|
365
|
+
|
|
366
|
+
//{
|
|
367
|
+
// lpToken: '0.0',
|
|
368
|
+
// gauge: '567.06390438645751582',
|
|
369
|
+
// DAI: '900.0',
|
|
370
|
+
// USDC: '900.0',
|
|
371
|
+
// USDT: '900.0',
|
|
372
|
+
// aDAI: '900.00009972244701026',
|
|
373
|
+
// aUSDC: '900.000077',
|
|
374
|
+
// aUSDT: '900.000105'
|
|
375
|
+
//}
|
|
376
|
+
|
|
377
|
+
|
|
378
|
+
// --- GAUGE WITHDRAW ---
|
|
379
|
+
|
|
380
|
+
await pool.gaugeWithdraw(lpTokenBalance);
|
|
381
|
+
|
|
382
|
+
//{
|
|
383
|
+
// lpToken: '567.06390438645751582',
|
|
384
|
+
// gauge: '0.0',
|
|
385
|
+
// DAI: '900.0',
|
|
386
|
+
// USDC: '900.0',
|
|
387
|
+
// USDT: '900.0',
|
|
388
|
+
// aDAI: '900.000116605480428249',
|
|
389
|
+
// aUSDC: '900.000091',
|
|
390
|
+
// aUSDT: '900.000125'
|
|
391
|
+
//}
|
|
392
|
+
|
|
393
|
+
|
|
394
|
+
// --- REMOVE LIQUIDITY ---
|
|
395
|
+
|
|
396
|
+
await pool.removeLiquidityExpected('10');
|
|
397
|
+
// [ '3.200409227699300211', '3.697305', '3.683197' ]
|
|
398
|
+
await pool.removeLiquidity('10');
|
|
399
|
+
|
|
400
|
+
//{
|
|
401
|
+
// lpToken: '557.06390438645751582',
|
|
402
|
+
// gauge: '0.0',
|
|
403
|
+
// DAI: '903.200409232502213136',
|
|
404
|
+
// USDC: '903.697304',
|
|
405
|
+
// USDT: '903.683196',
|
|
406
|
+
// aDAI: '900.000117956123101688',
|
|
407
|
+
// aUSDC: '900.000092',
|
|
408
|
+
// aUSDT: '900.000127'
|
|
409
|
+
//}
|
|
410
|
+
|
|
411
|
+
|
|
412
|
+
// --- REMOVE LIQUIDITY WRAPPED ---
|
|
413
|
+
|
|
414
|
+
await pool.removeLiquidityWrappedExpected('10');
|
|
415
|
+
// [ '3.200409232502213137', '3.697305', '3.683197' ]
|
|
416
|
+
await pool.removeLiquidityWrapped('10');
|
|
417
|
+
|
|
418
|
+
//{
|
|
419
|
+
// lpToken: '547.06390438645751582',
|
|
420
|
+
// gauge: '0.0',
|
|
421
|
+
// DAI: '903.200409232502213136',
|
|
422
|
+
// USDC: '903.697304',
|
|
423
|
+
// USDT: '903.683196',
|
|
424
|
+
// aDAI: '903.200529221793815936',
|
|
425
|
+
// aUSDC: '903.697398',
|
|
426
|
+
// aUSDT: '903.683325'
|
|
427
|
+
//}
|
|
428
|
+
|
|
429
|
+
|
|
430
|
+
// --- REMOVE LIQUIDITY IMBALANCE ---
|
|
431
|
+
|
|
432
|
+
await pool.removeLiquidityImbalanceExpected(['10', '10', '10']);
|
|
433
|
+
// 28.353588385263656951
|
|
434
|
+
await pool.removeLiquidityImbalance(['10', '10', '10']);
|
|
435
|
+
|
|
436
|
+
//{
|
|
437
|
+
// lpToken: '518.709923802845859288',
|
|
438
|
+
// gauge: '0.0',
|
|
439
|
+
// DAI: '913.200409232502213136',
|
|
440
|
+
// USDC: '913.697304',
|
|
441
|
+
// USDT: '913.683196',
|
|
442
|
+
// aDAI: '903.200530577239468989',
|
|
443
|
+
// aUSDC: '903.697399',
|
|
444
|
+
// aUSDT: '903.683327'
|
|
445
|
+
//}
|
|
446
|
+
|
|
447
|
+
|
|
448
|
+
// --- REMOVE LIQUIDITY IMBALANCE WRAPPED ---
|
|
449
|
+
|
|
450
|
+
await pool.removeLiquidityImbalanceWrappedExpected(['10', '10', '10']);
|
|
451
|
+
// 28.353588342257067439
|
|
452
|
+
await pool.removeLiquidityImbalanceWrapped(['10', '10', '10']);
|
|
453
|
+
|
|
454
|
+
//{
|
|
455
|
+
// lpToken: '490.355943262223785163',
|
|
456
|
+
// gauge: '0.0',
|
|
457
|
+
// DAI: '913.200409232502213136',
|
|
458
|
+
// USDC: '913.697304',
|
|
459
|
+
// USDT: '913.683196',
|
|
460
|
+
// aDAI: '913.200531932685151936',
|
|
461
|
+
// aUSDC: '913.6974',
|
|
462
|
+
// aUSDT: '913.683329'
|
|
463
|
+
//}
|
|
464
|
+
|
|
465
|
+
|
|
466
|
+
// --- REMOVE LIQUIDITY ONE COIN ---
|
|
467
|
+
|
|
468
|
+
await pool.removeLiquidityOneCoinExpected('10','DAI'); // OR await pool.removeLiquidityOneCoinExpected('10', 0);
|
|
469
|
+
// 10.573292542135201585 (DAI amount)
|
|
470
|
+
await pool.removeLiquidityOneCoin('10', 'DAI'); // OR await pool.removeLiquidityOneCoin('10', 0);
|
|
471
|
+
|
|
472
|
+
//{
|
|
473
|
+
// lpToken: '480.355943262223785163',
|
|
474
|
+
// gauge: '0.0',
|
|
475
|
+
// DAI: '923.773701782667764366',
|
|
476
|
+
// USDC: '913.697304',
|
|
477
|
+
// USDT: '913.683196',
|
|
478
|
+
// aDAI: '913.200532617911563408',
|
|
479
|
+
// aUSDC: '913.697401',
|
|
480
|
+
// aUSDT: '913.68333'
|
|
481
|
+
//}
|
|
482
|
+
|
|
483
|
+
|
|
484
|
+
// --- REMOVE LIQUIDITY ONE COIN WRAPPED ---
|
|
485
|
+
|
|
486
|
+
await pool.removeLiquidityOneCoinWrappedExpected('10', 'aUSDC'); // OR await pool.removeLiquidityOneCoinWrappedExpected('10', 1);
|
|
487
|
+
// 10.581285 (aUSDC amount)
|
|
488
|
+
await pool.removeLiquidityOneCoinWrapped('10', 'aUSDC'); // OR await pool.removeLiquidityOneCoinWrapped('10', 1);
|
|
489
|
+
|
|
490
|
+
//{
|
|
491
|
+
// lpToken: '470.355943262223785163',
|
|
492
|
+
// gauge: '0.0',
|
|
493
|
+
// DAI: '923.773701782667764366',
|
|
494
|
+
// USDC: '913.697304',
|
|
495
|
+
// USDT: '913.683196',
|
|
496
|
+
// aDAI: '913.200533988364413768',
|
|
497
|
+
// aUSDC: '924.278687',
|
|
498
|
+
// aUSDT: '913.683331'
|
|
499
|
+
//}
|
|
500
|
+
})()
|
|
501
|
+
```
|
|
502
|
+
|
|
503
|
+
## Exchange
|
|
504
|
+
|
|
505
|
+
### Router exchange
|
|
506
|
+
|
|
507
|
+
```ts
|
|
508
|
+
import curve from "@curvefi/api";
|
|
509
|
+
|
|
510
|
+
(async () => {
|
|
511
|
+
await curve.init('JsonRpc', {}, { gasPrice: 0, chainId: 1 });
|
|
512
|
+
|
|
513
|
+
console.log(await curve.getBalances(['DAI', 'CRV']));
|
|
514
|
+
// [ '9900.0', '100049.744832225238317557' ]
|
|
515
|
+
|
|
516
|
+
const { route, output } = await curve.getBestRouteAndOutput('DAI', 'CRV', '1000');
|
|
517
|
+
// OR await curve.getBestPoolAndOutput('0x6B175474E89094C44Da98b954EedeAC495271d0F', '0xD533a949740bb3306d119CC777fa900bA034cd52', '10000');
|
|
518
|
+
const expected = await curve.routerExchangeExpected('DAI', 'CRV', '1000');
|
|
519
|
+
// OR await curve.exchangeExpected('0x6B175474E89094C44Da98b954EedeAC495271d0F', '0xD533a949740bb3306d119CC777fa900bA034cd52', '10000');
|
|
520
|
+
|
|
521
|
+
console.log(route, output, expected);
|
|
522
|
+
// route = [
|
|
523
|
+
// {
|
|
524
|
+
// poolId: '3pool',
|
|
525
|
+
// poolAddress: '0xbEbc44782C7dB0a1A60Cb6fe97d0b483032FF1C7',
|
|
526
|
+
// outputCoinAddress: '0xdac17f958d2ee523a2206206994597c13d831ec7',
|
|
527
|
+
// i: 0,
|
|
528
|
+
// j: 2,
|
|
529
|
+
// swapType: 1,
|
|
530
|
+
// swapAddress: '0x0000000000000000000000000000000000000000'
|
|
531
|
+
// },
|
|
532
|
+
// {
|
|
533
|
+
// poolId: 'tricrypto2',
|
|
534
|
+
// poolAddress: '0xD51a44d3FaE010294C616388b506AcdA1bfAAE46',
|
|
535
|
+
// outputCoinAddress: '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2',
|
|
536
|
+
// i: 0,
|
|
537
|
+
// j: 2,
|
|
538
|
+
// swapType: 3,
|
|
539
|
+
// swapAddress: '0x0000000000000000000000000000000000000000'
|
|
540
|
+
// },
|
|
541
|
+
// {
|
|
542
|
+
// poolId: 'crveth',
|
|
543
|
+
// poolAddress: '0x8301AE4fc9c624d1D396cbDAa1ed877821D7C511',
|
|
544
|
+
// outputCoinAddress: '0xd533a949740bb3306d119cc777fa900ba034cd52',
|
|
545
|
+
// i: 0,
|
|
546
|
+
// j: 1,
|
|
547
|
+
// swapType: 3,
|
|
548
|
+
// swapAddress: '0x0000000000000000000000000000000000000000'
|
|
549
|
+
// }
|
|
550
|
+
// ]
|
|
551
|
+
//
|
|
552
|
+
// output = expected = 378.881631202862354937
|
|
553
|
+
|
|
554
|
+
await curve.routerExchange('DAI', 'CRV', '1000')
|
|
555
|
+
// OR await curve.exchange('0x6B175474E89094C44Da98b954EedeAC495271d0F', '0xD533a949740bb3306d119CC777fa900bA034cd52', '10000');
|
|
556
|
+
|
|
557
|
+
console.log(await curve.getBalances(['DAI', 'CRV']));
|
|
558
|
+
// [ '8900.0', '100428.626463428100672494' ]
|
|
559
|
+
})()
|
|
560
|
+
```
|
|
561
|
+
|
|
562
|
+
### Single-pool exchange
|
|
563
|
+
|
|
564
|
+
```ts
|
|
565
|
+
import curve from "@curvefi/api";
|
|
566
|
+
|
|
567
|
+
(async () => {
|
|
568
|
+
await curve.init('JsonRpc', {}, { gasPrice: 0, maxFeePerGas: 0, maxPriorityFeePerGas: 0, chainId: 1 });
|
|
569
|
+
|
|
570
|
+
console.log(await curve.getBalances(['DAI', 'USDC']));
|
|
571
|
+
// [ '1000.0', '0.0' ]
|
|
572
|
+
|
|
573
|
+
const { poolAddress, output } = await curve.getBestPoolAndOutput('DAI', 'USDC', '100');
|
|
574
|
+
// OR await curve.getBestPoolAndOutput('0x6B175474E89094C44Da98b954EedeAC495271d0F', '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48', '100');
|
|
575
|
+
const expected = await curve.exchangeExpected('DAI', 'USDC', '100');
|
|
576
|
+
// OR await curve.exchangeExpected('0x6B175474E89094C44Da98b954EedeAC495271d0F', '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48', '100');
|
|
577
|
+
|
|
578
|
+
console.log(poolAddress, output, expected);
|
|
579
|
+
// poolAddress = 0x79a8C46DeA5aDa233ABaFFD40F3A0A2B1e5A4F27, output = expected = 100.071099
|
|
580
|
+
|
|
581
|
+
await curve.exchange('DAI', 'USDC', '10')
|
|
582
|
+
// OR await curve.exchange('0x6B175474E89094C44Da98b954EedeAC495271d0F', '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48', '100');
|
|
583
|
+
|
|
584
|
+
console.log(await curve.getBalances(['DAI', 'USDC']));
|
|
585
|
+
// [ '900.0', '100.071098' ]
|
|
586
|
+
})()
|
|
587
|
+
```
|
|
588
|
+
|
|
589
|
+
### Cross-Asset Exchange
|
|
590
|
+
|
|
591
|
+
```ts
|
|
592
|
+
import curve from "@curvefi/api";
|
|
593
|
+
|
|
594
|
+
(async () => {
|
|
595
|
+
await curve.init('JsonRpc', {}, { gasPrice: 0, maxFeePerGas: 0, maxPriorityFeePerGas: 0, chainId: 1 });
|
|
596
|
+
|
|
597
|
+
console.log(await curve.getBalances(['DAI', 'WBTC']));
|
|
598
|
+
// [ '1000.0', '0.0' ]
|
|
599
|
+
|
|
600
|
+
console.log(await curve.crossAssetExchangeAvailable('DAI', 'WBTC'));
|
|
601
|
+
// true
|
|
602
|
+
console.log(await curve.crossAssetExchangeOutputAndSlippage('DAI', 'WBTC', '500'));
|
|
603
|
+
// { output: '0.01207752', slippage: 0.0000016559718476472085 }
|
|
604
|
+
console.log(await curve.crossAssetExchangeExpected('DAI', 'WBTC', '500'));
|
|
605
|
+
// 0.01207752
|
|
606
|
+
|
|
607
|
+
const tx = await curve.crossAssetExchange('DAI', 'WBTC', '500');
|
|
608
|
+
console.log(tx);
|
|
609
|
+
// 0xf452fbb49d9e4ba8976dc6762bcfcc87d5e164577c21f3fa087ae4fe275d1710
|
|
610
|
+
|
|
611
|
+
console.log(await curve.getBalances(['DAI', 'WBTC']));
|
|
612
|
+
// [ '500.0', '0.01207752' ]
|
|
613
|
+
})()
|
|
614
|
+
```
|
|
615
|
+
|
|
616
|
+
## Boosting
|
|
617
|
+
```ts
|
|
618
|
+
import curve from "@curvefi/api";
|
|
619
|
+
|
|
620
|
+
(async () => {
|
|
621
|
+
await curve.init('JsonRpc', {}, { gasPrice: 0, maxFeePerGas: 0, maxPriorityFeePerGas: 0, chainId: 1 });
|
|
622
|
+
|
|
623
|
+
console.log(await curve.boosting.getCrv());
|
|
624
|
+
// 100000.0
|
|
625
|
+
|
|
626
|
+
await curve.boosting.createLock('1000', 365);
|
|
627
|
+
// 99000.0 CRV
|
|
628
|
+
|
|
629
|
+
console.log(await curve.boosting.getLockedAmountAndUnlockTime());
|
|
630
|
+
// { lockedAmount: '1000.0', unlockTime: 1657152000000 }
|
|
631
|
+
console.log(await curve.boosting.getVeCrv());
|
|
632
|
+
// 248.193183980208499221
|
|
633
|
+
console.log(await curve.boosting.getVeCrvPct());
|
|
634
|
+
// 0.000006190640156035
|
|
635
|
+
|
|
636
|
+
await curve.boosting.increaseAmount('500');
|
|
637
|
+
|
|
638
|
+
// 98500.0 CRV
|
|
639
|
+
// { lockedAmount: '1500.0', unlockTime: 1657152000000 }
|
|
640
|
+
// 372.289692732093137414 veCRV
|
|
641
|
+
// 0.000009285953543912 veCRV %
|
|
642
|
+
|
|
643
|
+
|
|
644
|
+
await curve.boosting.increaseUnlockTime(365);
|
|
645
|
+
|
|
646
|
+
// { lockedAmount: '1500.0', unlockTime: 1688601600000 }
|
|
647
|
+
// 746.262271689452535192 veCRV
|
|
648
|
+
// 0.000018613852077810 veCRV %
|
|
649
|
+
})()
|
|
650
|
+
```
|
|
651
|
+
|
|
652
|
+
## Allowance and approve
|
|
653
|
+
### General methods
|
|
654
|
+
```ts
|
|
655
|
+
const spender = "0xbEbc44782C7dB0a1A60Cb6fe97d0b483032FF1C7" // 3pool swap address
|
|
656
|
+
|
|
657
|
+
await curve.getAllowance(["DAI", "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48"], curve.signerAddress, spender)
|
|
658
|
+
// [ '0.0', '0.0' ]
|
|
659
|
+
await curve.hasAllowance(["DAI", "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48"], ['1000', '1000'], curve.signerAddress, spender)
|
|
660
|
+
// false
|
|
661
|
+
await curve.ensureAllowance(["DAI", "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48"], ['1000', '1000'], spender)
|
|
662
|
+
// [
|
|
663
|
+
// '0xb0cada2a2983dc0ed85a26916d32b9caefe45fecde47640bd7d0e214ff22aed3',
|
|
664
|
+
// '0x00ea7d827b3ad50ce933e96c579810cd7e70d66a034a86ec4e1e10005634d041'
|
|
665
|
+
// ]
|
|
666
|
+
|
|
667
|
+
```
|
|
668
|
+
|
|
669
|
+
### Pools
|
|
670
|
+
```ts
|
|
671
|
+
const pool = new curve.Pool('usdn');
|
|
672
|
+
|
|
673
|
+
// --- Add Liquidity ---
|
|
674
|
+
|
|
675
|
+
await pool.addLiquidityIsApproved(["1000", "1000", "1000", "1000"])
|
|
676
|
+
// false
|
|
677
|
+
await pool.addLiquidityApprove(["1000", "1000", "1000", "1000"])
|
|
678
|
+
// [
|
|
679
|
+
// '0xbac4b0271ad340488a8135dda2f9adf3e3c402361b514f483ba2b7e9cafbdc21',
|
|
680
|
+
// '0x39fe196a52d9fb649f9c099fbd40ae773d28c457195c878ecdb7cd05be0f6512',
|
|
681
|
+
// '0xf39ebfb4b11434b879f951a08a1c633a038425c35eae09b2b7015816d068de3c',
|
|
682
|
+
// '0xa8b1631384da247efe1987b56fe010b852fc1d38e4d71d204c7dc5448a3a6c96'
|
|
683
|
+
// ]
|
|
684
|
+
|
|
685
|
+
|
|
686
|
+
// --- Add Liquidity Wrapped ---
|
|
687
|
+
|
|
688
|
+
await pool.addLiquidityWrappedIsApproved(["1000", "1000"])
|
|
689
|
+
// false
|
|
690
|
+
await pool.addLiquidityWrappedApprove(["1000", "1000"])
|
|
691
|
+
// [
|
|
692
|
+
// '0xe486bfba5e9e8190be580ad528707876136e6b0c201e228db0f3bd82e51619fa',
|
|
693
|
+
// '0xd56f7d583b20f4f7760510cc4310e3651f7dab8c276fe3bcde7e7200d65ed0dd'
|
|
694
|
+
// ]
|
|
695
|
+
|
|
696
|
+
|
|
697
|
+
// --- Remove Liquidity ---
|
|
698
|
+
|
|
699
|
+
await pool.removeLiquidityIsApproved("1000")
|
|
700
|
+
await pool.removeLiquidityApprove("1000")
|
|
701
|
+
|
|
702
|
+
|
|
703
|
+
// --- Remove Liquidity Imbalance ---
|
|
704
|
+
|
|
705
|
+
await pool.removeLiquidityImbalanceIsApproved(["1000", "1000", "1000", "1000"])
|
|
706
|
+
await pool.removeLiquidityImbalanceApprove(["1000", "1000", "1000", "1000"])
|
|
707
|
+
|
|
708
|
+
|
|
709
|
+
// --- Remove Liquidity One Coin ---
|
|
710
|
+
|
|
711
|
+
await pool.removeLiquidityOneCoinIsApproved("1000")
|
|
712
|
+
await pool.removeLiquidityOneCoinApprove("1000")
|
|
713
|
+
|
|
714
|
+
|
|
715
|
+
// --- Gauge Deposit ---
|
|
716
|
+
|
|
717
|
+
await pool.gaugeDepositIsApproved("1000")
|
|
718
|
+
await pool.gaugeDepositApprove("1000")
|
|
719
|
+
|
|
720
|
+
|
|
721
|
+
// --- Exchange ---
|
|
722
|
+
|
|
723
|
+
await pool.exchangeIsApproved("DAI", "1000")
|
|
724
|
+
await pool.exchangeApprove("DAI", "1000")
|
|
725
|
+
|
|
726
|
+
|
|
727
|
+
// --- Exchange Wrapped ---
|
|
728
|
+
|
|
729
|
+
await pool.exchangeWrappedIsApproved("0x6c3F90f043a72FA612cbac8115EE7e52BDe6E490", "1000")
|
|
730
|
+
await pool.exchangeWrappedApprove("0x6c3F90f043a72FA612cbac8115EE7e52BDe6E490", "1000")
|
|
731
|
+
```
|
|
732
|
+
**Note.** Removing wrapped does not require approve.
|
|
733
|
+
|
|
734
|
+
### Exchange
|
|
735
|
+
```ts
|
|
736
|
+
// Router
|
|
737
|
+
await curve.routerExchangeisApproved("DAI", "0x99d8a9c45b2eca8864373a26d1459e3dff1e17f3", "1000"); // DAI -> MIM
|
|
738
|
+
await curve.routerExchangeApprove("DAI", "0x99d8a9c45b2eca8864373a26d1459e3dff1e17f3", "1000"); // DAI -> MIM
|
|
739
|
+
|
|
740
|
+
// Straight
|
|
741
|
+
await curve.exchangeisApproved("DAI", "0x99d8a9c45b2eca8864373a26d1459e3dff1e17f3", "1000"); // DAI -> MIM
|
|
742
|
+
await curve.exchangeApprove("DAI", "0x99d8a9c45b2eca8864373a26d1459e3dff1e17f3", "1000"); // DAI -> MIM
|
|
743
|
+
|
|
744
|
+
// Cross-Asset
|
|
745
|
+
await curve.crossAssetExchangeIsApproved("DAI", "1000");
|
|
746
|
+
await curve.crossAssetExchangeApprove("DAI", "1000");
|
|
747
|
+
```
|
|
748
|
+
|
|
749
|
+
### Boosting
|
|
750
|
+
```ts
|
|
751
|
+
await curve.boosting.isApproved('1000')
|
|
752
|
+
await curve.boosting.approve('1000')
|
|
753
|
+
```
|
|
754
|
+
|
|
755
|
+
## Gas estimation
|
|
756
|
+
Every non-constant method has corresponding gas estimation method. Rule: ```obj.method -> obj.estimateGas.method```
|
|
757
|
+
|
|
758
|
+
**Examples**
|
|
759
|
+
```ts
|
|
760
|
+
const spender = "0xbEbc44782C7dB0a1A60Cb6fe97d0b483032FF1C7" // 3pool swap address
|
|
761
|
+
await curve.estimateGas.ensureAllowance(["DAI", "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48"], curve.signerAddress, spender);
|
|
762
|
+
|
|
763
|
+
const pool = new curve.Pool('usdn');
|
|
764
|
+
await pool.estimateGas.addLiquidityApprove(["1000", "1000", "1000", "1000"])
|
|
765
|
+
await pool.estimateGas.addLiquidity(["1000", "1000", "1000", "1000"])
|
|
766
|
+
|
|
767
|
+
await curve.estimateGas.crossAssetExchange('DAI', "WBTC", "1000", 0.01)
|
|
768
|
+
|
|
769
|
+
await curve.boosting.estimateGas.createLock('1000', 365)
|
|
770
|
+
```
|
|
771
|
+
|
|
772
|
+
## Rewards
|
|
773
|
+
```ts
|
|
774
|
+
const pool = new curve.Pool('susd');
|
|
775
|
+
|
|
776
|
+
// CRV
|
|
777
|
+
console.log(await pool.gaugeClaimableTokens());
|
|
778
|
+
// 0.006296257916265276
|
|
779
|
+
await pool.gaugeClaimTokens();
|
|
780
|
+
|
|
781
|
+
// Additional rewards
|
|
782
|
+
console.log(await pool.gaugeClaimableRewards());
|
|
783
|
+
// [
|
|
784
|
+
// {
|
|
785
|
+
// token: '0xC011a73ee8576Fb46F5E1c5751cA3B9Fe0af2a6F',
|
|
786
|
+
// symbol: 'SNX',
|
|
787
|
+
// amount: '0.000596325465987726'
|
|
788
|
+
// }
|
|
789
|
+
// ]
|
|
790
|
+
await pool.gaugeClaimRewards();
|
|
791
|
+
```
|
|
792
|
+
|
|
793
|
+
## Deposit&Stake
|
|
794
|
+
Add liquidity and deposit into gauge in one transaction.
|
|
795
|
+
|
|
796
|
+
### Underlying
|
|
797
|
+
```ts
|
|
798
|
+
(async () => {
|
|
799
|
+
const pool = new curve.Pool('compound');
|
|
800
|
+
const amounts = ['1000', '1000'];
|
|
801
|
+
|
|
802
|
+
console.log(await pool.underlyingCoinBalances());
|
|
803
|
+
// { DAI: '10000.0', USDC: '10000.0' }
|
|
804
|
+
console.log(await pool.lpTokenBalances());
|
|
805
|
+
// { lpToken: '0.0', gauge: '0.0' }
|
|
806
|
+
|
|
807
|
+
console.log(await pool.depositAndStakeExpected(amounts));
|
|
808
|
+
// 1820.604572902286288394
|
|
809
|
+
console.log(await pool.depositAndStakeSlippage(amounts));
|
|
810
|
+
// -0.0000036435051742755193
|
|
811
|
+
|
|
812
|
+
console.log(await pool.depositAndStakeIsApproved(amounts));
|
|
813
|
+
// false
|
|
814
|
+
|
|
815
|
+
await pool.depositAndStakeApprove(amounts);
|
|
816
|
+
await pool.depositAndStake(amounts);
|
|
817
|
+
|
|
818
|
+
console.log(await pool.underlyingCoinBalances());
|
|
819
|
+
// { DAI: '9000.0', USDC: '9000.0' }
|
|
820
|
+
console.log(await pool.lpTokenBalances());
|
|
821
|
+
// { lpToken: '0.0', gauge: '1820.556829935710883568' }
|
|
822
|
+
})();
|
|
823
|
+
```
|
|
824
|
+
|
|
825
|
+
### Wrapped
|
|
826
|
+
```ts
|
|
827
|
+
(async () => {
|
|
828
|
+
const pool = new curve.Pool('compound');
|
|
829
|
+
const amounts = ['1000', '1000'];
|
|
830
|
+
|
|
831
|
+
console.log(await pool.coinBalances());
|
|
832
|
+
// { cDAI: '10000.0', cUSDC: '10000.0' }
|
|
833
|
+
console.log(await pool.lpTokenBalances());
|
|
834
|
+
// { lpToken: '0.0', gauge: '1820.556829935710883568' }
|
|
835
|
+
|
|
836
|
+
console.log(await pool.depositAndStakeWrappedExpected(amounts));
|
|
837
|
+
// 40.328408669183101673
|
|
838
|
+
console.log(await pool.depositAndStakeWrappedSlippage(amounts));
|
|
839
|
+
// -0.0020519915272297325
|
|
840
|
+
|
|
841
|
+
console.log(await pool.depositAndStakeWrappedIsApproved(amounts));
|
|
842
|
+
// false
|
|
843
|
+
|
|
844
|
+
await pool.depositAndStakeWrappedApprove(amounts);
|
|
845
|
+
await pool.depositAndStakeWrapped(amounts);
|
|
846
|
+
|
|
847
|
+
console.log(await pool.coinBalances());
|
|
848
|
+
// { cDAI: '9000.0', cUSDC: '9000.0' }
|
|
849
|
+
console.log(await pool.lpTokenBalances());
|
|
850
|
+
// { lpToken: '0.0', gauge: '1860.884096082215274556' }
|
|
851
|
+
})();
|
|
852
|
+
```
|
|
853
|
+
|
|
854
|
+
## Factory
|
|
855
|
+
All the methods above can be used for factory pools. It's only needed to fetch them.
|
|
856
|
+
```ts
|
|
857
|
+
import curve from "@curvefi/api";
|
|
858
|
+
|
|
859
|
+
(async () => {
|
|
860
|
+
await curve.init('JsonRpc', {}, { chainId: 1 });
|
|
861
|
+
await curve.fetchFactoryPools();
|
|
862
|
+
await curve.fetchCryptoFactoryPools();
|
|
863
|
+
|
|
864
|
+
const factoryPools = curve.getFactoryPoolList();
|
|
865
|
+
// [
|
|
866
|
+
// 'factory-v2-0', 'factory-v2-1', 'factory-v2-2', 'factory-v2-3',
|
|
867
|
+
// 'factory-v2-4', 'factory-v2-5', 'factory-v2-6', 'factory-v2-7',
|
|
868
|
+
// 'factory-v2-8', 'factory-v2-9', 'factory-v2-10', 'factory-v2-11',
|
|
869
|
+
// 'factory-v2-12', 'factory-v2-13', 'factory-v2-14', 'factory-v2-15',
|
|
870
|
+
// 'factory-v2-16', 'factory-v2-17', 'factory-v2-18', 'factory-v2-19',
|
|
871
|
+
// 'factory-v2-20', 'factory-v2-21', 'factory-v2-22', 'factory-v2-23',
|
|
872
|
+
// 'factory-v2-24', 'factory-v2-25', 'factory-v2-26', 'factory-v2-27',
|
|
873
|
+
// 'factory-v2-28', 'factory-v2-29', 'factory-v2-30', 'factory-v2-31',
|
|
874
|
+
// 'factory-v2-32', 'factory-v2-33', 'factory-v2-34', 'factory-v2-35',
|
|
875
|
+
// 'factory-v2-36', 'factory-v2-37', 'factory-v2-38', 'factory-v2-39',
|
|
876
|
+
// 'factory-v2-40', 'factory-v2-41', 'factory-v2-42', 'factory-v2-43',
|
|
877
|
+
// 'factory-v2-44', 'factory-v2-45', 'factory-v2-46', 'factory-v2-47',
|
|
878
|
+
// 'factory-v2-48', 'factory-v2-49', 'factory-v2-50', 'factory-v2-51',
|
|
879
|
+
// 'factory-v2-52', 'factory-v2-53', 'factory-v2-54', 'factory-v2-55',
|
|
880
|
+
// 'factory-v2-56', 'factory-v2-57', 'factory-v2-58', 'factory-v2-59',
|
|
881
|
+
// 'factory-v2-60', 'factory-v2-61', 'factory-v2-62', 'factory-v2-63',
|
|
882
|
+
// 'factory-v2-64', 'factory-v2-65', 'factory-v2-66', 'factory-v2-67',
|
|
883
|
+
// 'factory-v2-68', 'factory-v2-69', 'factory-v2-70', 'factory-v2-71',
|
|
884
|
+
// 'factory-v2-72', 'factory-v2-73', 'factory-v2-74', 'factory-v2-75',
|
|
885
|
+
// 'factory-v2-76', 'factory-v2-77', 'factory-v2-78', 'factory-v2-79',
|
|
886
|
+
// 'factory-v2-80', 'factory-v2-81', 'factory-v2-82', 'factory-v2-83',
|
|
887
|
+
// 'factory-v2-84', 'factory-v2-85', 'factory-v2-86', 'factory-v2-87',
|
|
888
|
+
// 'factory-v2-88', 'factory-v2-89', 'factory-v2-90', 'factory-v2-91',
|
|
889
|
+
// 'factory-v2-92', 'factory-v2-93', 'factory-v2-94', 'factory-v2-95',
|
|
890
|
+
// 'factory-v2-96', 'factory-v2-97', 'factory-v2-98', 'factory-v2-99',
|
|
891
|
+
// ]
|
|
892
|
+
|
|
893
|
+
const cryptoFactoryPools = curve.getCryptoFactoryPoolList()
|
|
894
|
+
// [
|
|
895
|
+
// 'factory-crypto-0', 'factory-crypto-1',
|
|
896
|
+
// 'factory-crypto-2', 'factory-crypto-3',
|
|
897
|
+
// 'factory-crypto-4', 'factory-crypto-5',
|
|
898
|
+
// 'factory-crypto-6', 'factory-crypto-7',
|
|
899
|
+
// 'factory-crypto-8', 'factory-crypto-9',
|
|
900
|
+
// 'factory-crypto-10', 'factory-crypto-11',
|
|
901
|
+
// 'factory-crypto-12', 'factory-crypto-13',
|
|
902
|
+
// 'factory-crypto-14', 'factory-crypto-15',
|
|
903
|
+
// 'factory-crypto-16', 'factory-crypto-17',
|
|
904
|
+
// 'factory-crypto-18', 'factory-crypto-19',
|
|
905
|
+
// 'factory-crypto-20', 'factory-crypto-21',
|
|
906
|
+
// 'factory-crypto-22', 'factory-crypto-23',
|
|
907
|
+
// 'factory-crypto-24', 'factory-crypto-25',
|
|
908
|
+
// 'factory-crypto-26', 'factory-crypto-27',
|
|
909
|
+
// 'factory-crypto-28', 'factory-crypto-29',
|
|
910
|
+
// 'factory-crypto-30', 'factory-crypto-31',
|
|
911
|
+
// 'factory-crypto-32', 'factory-crypto-33',
|
|
912
|
+
// 'factory-crypto-34', 'factory-crypto-35',
|
|
913
|
+
// 'factory-crypto-36', 'factory-crypto-37'
|
|
914
|
+
// ]
|
|
915
|
+
})()
|
|
916
|
+
```
|