@curvefi/llamalend-api 1.0.41 → 1.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/.github/workflows/publish.yml +7 -14
- package/README.md +451 -1
- package/lib/constants/aliases.js +15 -0
- package/lib/interfaces.d.ts +11 -0
- package/lib/lendMarkets/LendMarketTemplate.d.ts +6 -3
- package/lib/lendMarkets/LendMarketTemplate.js +40 -1
- package/lib/lendMarkets/interfaces/leverageZapV2.d.ts +223 -0
- package/lib/lendMarkets/interfaces/leverageZapV2.js +1 -0
- package/lib/lendMarkets/modules/index.d.ts +1 -0
- package/lib/lendMarkets/modules/index.js +1 -0
- package/lib/lendMarkets/modules/leverageZapV2.d.ts +253 -0
- package/lib/lendMarkets/modules/leverageZapV2.js +681 -0
- package/lib/llamalend.js +1 -0
- package/lib/utils.d.ts +1 -0
- package/lib/utils.js +5 -0
- package/package.json +2 -1
- package/src/cache/index.ts +1 -1
- package/src/constants/aliases.ts +15 -0
- package/src/external-api.ts +4 -4
- package/src/interfaces.ts +19 -0
- package/src/lendMarkets/LendMarketTemplate.ts +81 -32
- package/src/lendMarkets/interfaces/leverageZapV2.ts +282 -0
- package/src/lendMarkets/modules/index.ts +1 -0
- package/src/lendMarkets/modules/leverageZapV2.ts +991 -0
- package/src/llamalend.ts +1 -0
- package/src/utils.ts +12 -1
|
@@ -4,7 +4,6 @@ on:
|
|
|
4
4
|
push:
|
|
5
5
|
branches:
|
|
6
6
|
- main
|
|
7
|
-
- feat/init
|
|
8
7
|
|
|
9
8
|
jobs:
|
|
10
9
|
release:
|
|
@@ -12,7 +11,7 @@ jobs:
|
|
|
12
11
|
runs-on: ubuntu-latest
|
|
13
12
|
steps:
|
|
14
13
|
- name: Checkout code
|
|
15
|
-
uses: actions/checkout@
|
|
14
|
+
uses: actions/checkout@v5
|
|
16
15
|
- name: get-npm-version
|
|
17
16
|
id: package-version
|
|
18
17
|
uses: martinbeentjes/npm-get-version-action@main
|
|
@@ -42,19 +41,13 @@ jobs:
|
|
|
42
41
|
permissions:
|
|
43
42
|
contents: read
|
|
44
43
|
id-token: write
|
|
44
|
+
environment: production
|
|
45
45
|
steps:
|
|
46
|
-
- uses: actions/checkout@
|
|
47
|
-
-
|
|
48
|
-
uses: actions/setup-node@v4
|
|
46
|
+
- uses: actions/checkout@v5
|
|
47
|
+
- uses: actions/setup-node@v5
|
|
49
48
|
with:
|
|
50
49
|
node-version: 24
|
|
51
50
|
cache: npm
|
|
52
|
-
|
|
53
|
-
-
|
|
54
|
-
|
|
55
|
-
- name: Build
|
|
56
|
-
run: npm run build
|
|
57
|
-
- name: Publish to npm
|
|
58
|
-
run: npm publish --access public
|
|
59
|
-
env:
|
|
60
|
-
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
|
|
51
|
+
- run: npm ci
|
|
52
|
+
- run: npm run build
|
|
53
|
+
- run: npm publish
|
package/README.md
CHANGED
|
@@ -947,7 +947,457 @@ await lendMarket.forceUpdateUserState(txHash, "0x123...");
|
|
|
947
947
|
})()
|
|
948
948
|
```
|
|
949
949
|
|
|
950
|
-
### Leverage (createLoan, borrowMore, repay) for lendMarket
|
|
950
|
+
### Leverage (createLoan, borrowMore, repay) for lendMarket leverageZapV2
|
|
951
|
+
|
|
952
|
+
LendMarket leverage operations support different routers and require quote information from external routing services.
|
|
953
|
+
|
|
954
|
+
#### Breaking Changes
|
|
955
|
+
|
|
956
|
+
**1. New metrics methods - get all metrics in one call**
|
|
957
|
+
- Instead of `createLoanBands`, `createLoanPrices`, `createLoanHealth`, `createLoanPriceImpact`: `createLoanExpectedMetrics()` - returns priceImpact, bands, prices, health
|
|
958
|
+
- Instead of `borrowMoreBands`, `borrowMorePrices`, `borrowMoreHealth`, `borrowMorePriceImpact`:
|
|
959
|
+
`borrowMoreExpectedMetrics()` – returns priceImpact, bands, prices, health
|
|
960
|
+
- Instead of `repayBands`, `repayPrices`, `repayHealth`, `repayPriceImpact`:
|
|
961
|
+
`repayExpectedMetrics()` – returns priceImpact, bands, prices, health
|
|
962
|
+
|
|
963
|
+
|
|
964
|
+
**ILeverageMetrics** - metrics object returned by new methods:
|
|
965
|
+
|
|
966
|
+
```ts
|
|
967
|
+
interface ILeverageMetrics {
|
|
968
|
+
priceImpact: number;
|
|
969
|
+
bands: [number, number];
|
|
970
|
+
prices: string[];
|
|
971
|
+
health: string;
|
|
972
|
+
}
|
|
973
|
+
```
|
|
974
|
+
|
|
975
|
+
**2. Final methods now require `router` and `calldata` parameters**
|
|
976
|
+
- **Before**: `createLoan(userCollateral, userBorrowed, debt, range)`
|
|
977
|
+
- **Now**: `createLoan(userCollateral, userBorrowed, debt, range, router, calldata)`
|
|
978
|
+
- **Before**: `borrowMore(userCollateral, userBorrowed, debt, slippage)`
|
|
979
|
+
- **Now**: `borrowMore(userCollateral, userBorrowed, debt, router, calldata)`
|
|
980
|
+
- **Before**: `repay(stateCollateral, userCollateral, userBorrowed, slippage)`
|
|
981
|
+
- **Now**: `repay(stateCollateral, userCollateral, userBorrowed, router, calldata)`
|
|
982
|
+
|
|
983
|
+
where `router` - address of router, `calldata` - calldata byte code
|
|
984
|
+
|
|
985
|
+
#### Understanding Callback Functions and Quotes
|
|
986
|
+
|
|
987
|
+
**GetExpectedFn** - callback function for fetching quotes from router (e.g., Odos, Curve):
|
|
988
|
+
|
|
989
|
+
```ts
|
|
990
|
+
type GetExpectedFn = (
|
|
991
|
+
fromToken: string, // Address of token to swap from
|
|
992
|
+
toToken: string, // Address of token to swap to
|
|
993
|
+
amountIn: bigint, // Amount of tokens to swap (in wei)
|
|
994
|
+
blacklist: string | string[], // Contract/pool addresses to exclude
|
|
995
|
+
) => Promise<IQuote>;
|
|
996
|
+
```
|
|
997
|
+
|
|
998
|
+
**IQuote** - quote object with swap information:
|
|
999
|
+
|
|
1000
|
+
```ts
|
|
1001
|
+
interface IQuote {
|
|
1002
|
+
outAmount: string; // Amount of tokens to receive
|
|
1003
|
+
priceImpact: number; // Price impac
|
|
1004
|
+
}
|
|
1005
|
+
```
|
|
1006
|
+
|
|
1007
|
+
#### Which quotes are needed for different operations
|
|
1008
|
+
|
|
1009
|
+
| Action type | Quote inputAmount |
|
|
1010
|
+
|--------------|------------------|
|
|
1011
|
+
| createLoan | debt + userBorrowed |
|
|
1012
|
+
| borrowMore | debt + userBorrowed |
|
|
1013
|
+
| repay | stateCollateral + userCollateral |
|
|
1014
|
+
|
|
1015
|
+
**For createLoan and borrowMore:**
|
|
1016
|
+
- Get quote for swapping `(debt + userBorrowed)` borrowed tokens → collateral tokens
|
|
1017
|
+
- Example: For debt=2000 and userBorrowed=1000, get quote for swapping 3000 borrowed tokens to collateral
|
|
1018
|
+
|
|
1019
|
+
!!! Be careful: here debt means the amount of debt added during the operation, not the new total debt the user will have after it.
|
|
1020
|
+
|
|
1021
|
+
**For repay:**
|
|
1022
|
+
- Get quote for swapping `(stateCollateral + userCollateral)` collateral tokens → borrowed tokens
|
|
1023
|
+
- Example: For stateCollateral=2 and userCollateral=1, get quote for swapping 3 collateral tokens to borrowed tokens
|
|
1024
|
+
|
|
1025
|
+
|
|
1026
|
+
#### Leverage operations with routers
|
|
1027
|
+
|
|
1028
|
+
```ts
|
|
1029
|
+
(async () => {
|
|
1030
|
+
await llamalend.init('JsonRpc', {});
|
|
1031
|
+
await llamalend.lendMarkets.fetchMarkets();
|
|
1032
|
+
|
|
1033
|
+
const lendMarket = llamalend.getLendMarket('one-way-market-0');
|
|
1034
|
+
|
|
1035
|
+
const router = '0x.....'; // router name
|
|
1036
|
+
const calldata = '0x...'; // calldata from router for executing swap
|
|
1037
|
+
const quote = // quote from your router (debt + userBorrowed)
|
|
1038
|
+
|
|
1039
|
+
// - Create Loan -
|
|
1040
|
+
|
|
1041
|
+
// Creates leveraged position (userCollateral + collateralFromUserBorrowed + leverage_collateral)
|
|
1042
|
+
// ^
|
|
1043
|
+
// |
|
|
1044
|
+
// userCollateral | debt debt + userBorrowed
|
|
1045
|
+
// user ---> controller ----> leverage_zap ----> router
|
|
1046
|
+
// | ^ | ^ ^ |
|
|
1047
|
+
// | |__________________| | |___________________|
|
|
1048
|
+
// | leverageCollateral + collateralFromUserBorrowed
|
|
1049
|
+
// |_____________________________________|
|
|
1050
|
+
// userBorrowed
|
|
1051
|
+
|
|
1052
|
+
let userCollateral = 1;
|
|
1053
|
+
let userBorrowed = 1000;
|
|
1054
|
+
let debt = 2000;
|
|
1055
|
+
const range = 10;
|
|
1056
|
+
await lendMarket.leverageZapV2.maxLeverage(range);
|
|
1057
|
+
// 7.4728229145282742179
|
|
1058
|
+
|
|
1059
|
+
// Get maximum possible debt for given parameters
|
|
1060
|
+
await lendMarket.leverageZapV2.createLoanMaxRecv({ userCollateral, userBorrowed, range, getExpected });
|
|
1061
|
+
// {
|
|
1062
|
+
// maxDebt: '26089.494406081862861214',
|
|
1063
|
+
// maxTotalCollateral: '9.539182089833411347',
|
|
1064
|
+
// userCollateral: '1',
|
|
1065
|
+
// collateralFromUserBorrowed: '0.315221168834966496',
|
|
1066
|
+
// collateralFromMaxDebt: '8.223960920998444851',
|
|
1067
|
+
// maxLeverage: '7.25291100528992828612',
|
|
1068
|
+
// avgPrice: '3172.3757757003568790858'
|
|
1069
|
+
// }
|
|
1070
|
+
|
|
1071
|
+
// Get quote for swapping (debt + userBorrowed)!!!
|
|
1072
|
+
|
|
1073
|
+
// Get expected collateral amount
|
|
1074
|
+
await lendMarket.leverageZapV2.createLoanExpectedCollateral({ userCollateral, userBorrowed, debt, quote });
|
|
1075
|
+
// {
|
|
1076
|
+
// totalCollateral: '1.946422996710829',
|
|
1077
|
+
// userCollateral: '1.0',
|
|
1078
|
+
// collateralFromUserBorrowed: '0.315474332236942984',
|
|
1079
|
+
// collateralFromDebt: '0.630948664473886',
|
|
1080
|
+
// leverage: '1.4796358613861877'
|
|
1081
|
+
// avgPrice: '3169.8299919022623523421'
|
|
1082
|
+
// }
|
|
1083
|
+
|
|
1084
|
+
// NEW: Get all metrics in one call
|
|
1085
|
+
const metrics = await lendMarket.leverageZapV2.createLoanExpectedMetrics({
|
|
1086
|
+
userCollateral,
|
|
1087
|
+
userBorrowed,
|
|
1088
|
+
debt,
|
|
1089
|
+
range,
|
|
1090
|
+
quote,
|
|
1091
|
+
healthIsFull: true // true for full health, false for not full
|
|
1092
|
+
});
|
|
1093
|
+
// {
|
|
1094
|
+
// priceImpact: 0.08944411854377342, // %
|
|
1095
|
+
// bands: [76, 67],
|
|
1096
|
+
// prices: ['1027.977701011670136614', '1187.061409925215211173'],
|
|
1097
|
+
// health: '195.8994783042570637' // %
|
|
1098
|
+
//
|
|
1099
|
+
|
|
1100
|
+
await lendMarket.leverageZapV2.createLoanIsApproved({ userCollateral, userBorrowed });
|
|
1101
|
+
// false
|
|
1102
|
+
await lendMarket.leverageZapV2.createLoanApprove({ userCollateral, userBorrowed });
|
|
1103
|
+
// [
|
|
1104
|
+
// '0xd5491d9f1e9d8ac84b03867494e35b25efad151c597d2fa4211d7bf5d540c98e',
|
|
1105
|
+
// '0x93565f37ec5be902a824714a30bddc25cf9cd9ed39b4c0e8de61fab44af5bc8c'
|
|
1106
|
+
// ]
|
|
1107
|
+
|
|
1108
|
+
|
|
1109
|
+
// Create loan, passing router address and calldata from router
|
|
1110
|
+
await lendMarket.leverageZapV2.createLoan({ userCollateral, userBorrowed, debt, range, router, calldata });
|
|
1111
|
+
// 0xeb1b7a92bcb02598f00dc8bbfe8fa3a554e7a2b1ca764e0ee45e2bf583edf731
|
|
1112
|
+
|
|
1113
|
+
await lendMarket.wallet.balances();
|
|
1114
|
+
// {
|
|
1115
|
+
// collateral: '99.0',
|
|
1116
|
+
// borrowed: '599000.0',
|
|
1117
|
+
// vaultShares: '1400000000.0',
|
|
1118
|
+
// gauge: '0'
|
|
1119
|
+
// }
|
|
1120
|
+
await lendMarket.userState();
|
|
1121
|
+
// {
|
|
1122
|
+
// collateral: '1.945616160868693648',
|
|
1123
|
+
// borrowed: '0.0',
|
|
1124
|
+
// debt: '2000.0',
|
|
1125
|
+
// N: '10'
|
|
1126
|
+
// }
|
|
1127
|
+
await lendMarket.userBands();
|
|
1128
|
+
// [ 76, 67 ]
|
|
1129
|
+
await lendMarket.userPrices();
|
|
1130
|
+
// [ '1027.977718614028011906', '1187.061430251609195098' ]
|
|
1131
|
+
await lendMarket.userHealth();
|
|
1132
|
+
// 195.8372633833293605
|
|
1133
|
+
await lendMarket.userHealth(false);
|
|
1134
|
+
// 3.2518122092914609
|
|
1135
|
+
|
|
1136
|
+
|
|
1137
|
+
// - Borrow More -
|
|
1138
|
+
|
|
1139
|
+
// Updates leveraged position (dCollateral = userCollateral + collateralFromUserBorrowed + leverageCollateral)
|
|
1140
|
+
// ^
|
|
1141
|
+
// |
|
|
1142
|
+
// userCollateral | dDebt dDebt + userBorrowed
|
|
1143
|
+
// user ---> controller ----> leverage_zap ----> router
|
|
1144
|
+
// | ^ | ^ ^ |
|
|
1145
|
+
// | |__________________| | |___________________|
|
|
1146
|
+
// | leverageCollateral + collateralFromUSerBorrowed
|
|
1147
|
+
// |_____________________________________|
|
|
1148
|
+
// userBorrowed
|
|
1149
|
+
|
|
1150
|
+
userCollateral = 2;
|
|
1151
|
+
userBorrowed = 2000;
|
|
1152
|
+
debt = 10000;
|
|
1153
|
+
|
|
1154
|
+
// Get maximum possible debt for given parameters
|
|
1155
|
+
await lendMarket.leverageZapV2.borrowMoreMaxRecv({ userCollateral, userBorrowed, getExpected });
|
|
1156
|
+
// {
|
|
1157
|
+
// maxDebt: '76182.8497941193262889',
|
|
1158
|
+
// maxTotalCollateral: '26.639775583730298462',
|
|
1159
|
+
// userCollateral: '2',
|
|
1160
|
+
// collateralFromUserBorrowed: '1.677318306610359627',
|
|
1161
|
+
// collateralFromMaxDebt: '22.962457277119938834',
|
|
1162
|
+
// avgPrice: '3172.55402418338331369083'
|
|
1163
|
+
// }
|
|
1164
|
+
|
|
1165
|
+
// Get quote for swapping (debt + userBorrowed)
|
|
1166
|
+
|
|
1167
|
+
await lendMarket.leverageZapV2.borrowMoreExpectedCollateral({ userCollateral, userBorrowed, dDebt: debt, quote });
|
|
1168
|
+
// {
|
|
1169
|
+
// totalCollateral: '5.783452104143246413',
|
|
1170
|
+
// userCollateral: '2.0',
|
|
1171
|
+
// collateralFromUserBorrowed: '0.630575350690541071',
|
|
1172
|
+
// collateralFromDebt: '3.152876753452705342'
|
|
1173
|
+
// avgPrice: '3171.70659749038129067231'
|
|
1174
|
+
// }
|
|
1175
|
+
|
|
1176
|
+
// NEW: Get all metrics in one call
|
|
1177
|
+
const metricsBM = await lendMarket.leverageZapV2.borrowMoreExpectedMetrics({
|
|
1178
|
+
userCollateral,
|
|
1179
|
+
userBorrowed,
|
|
1180
|
+
debt,
|
|
1181
|
+
quote,
|
|
1182
|
+
healthIsFull: true // true for full health, false for not full
|
|
1183
|
+
});
|
|
1184
|
+
// {
|
|
1185
|
+
// priceImpact: 0.010784277354269765, // %
|
|
1186
|
+
// bands: [47, 38],
|
|
1187
|
+
// prices: ['1560.282474721398939216', '1801.742501325928269008'],
|
|
1188
|
+
// health: '91.6798951784708552' // %
|
|
1189
|
+
// }
|
|
1190
|
+
|
|
1191
|
+
await lendMarket.leverageZapV2.borrowMoreIsApproved({ userCollateral, userBorrowed });
|
|
1192
|
+
// true
|
|
1193
|
+
await lendMarket.leverageZapV2.borrowMoreApprove({ userCollateral, userBorrowed });
|
|
1194
|
+
// []
|
|
1195
|
+
|
|
1196
|
+
// Execute borrowMore, passing router address and calldata from router
|
|
1197
|
+
await lendMarket.leverageZapV2.borrowMore({ userCollateral, userBorrowed, debt, router, calldata });
|
|
1198
|
+
// 0x6357dd6ea7250d7adb2344cd9295f8255fd8fbbe85f00120fbcd1ebf139e057c
|
|
1199
|
+
|
|
1200
|
+
await lendMarket.wallet.balances();
|
|
1201
|
+
// {
|
|
1202
|
+
// collateral: '97.0',
|
|
1203
|
+
// borrowed: '597000.0',
|
|
1204
|
+
// vaultShares: '1400000000.0',
|
|
1205
|
+
// gauge: '0'
|
|
1206
|
+
// }
|
|
1207
|
+
await lendMarket.userState();
|
|
1208
|
+
// {
|
|
1209
|
+
// collateral: '7.727839965845165558',
|
|
1210
|
+
// borrowed: '0.0',
|
|
1211
|
+
// debt: '12000.000010193901375446',
|
|
1212
|
+
// N: '10'
|
|
1213
|
+
// }
|
|
1214
|
+
await lendMarket.userBands();
|
|
1215
|
+
// [ 47, 38 ]
|
|
1216
|
+
await lendMarket.userPrices();
|
|
1217
|
+
// [ '1560.28248267408177179', '1801.742510509320950242' ]
|
|
1218
|
+
await lendMarket.userHealth();
|
|
1219
|
+
// 91.6519475547753288
|
|
1220
|
+
await lendMarket.userHealth(false);
|
|
1221
|
+
// 3.7449386373872907
|
|
1222
|
+
|
|
1223
|
+
|
|
1224
|
+
// - Repay -
|
|
1225
|
+
|
|
1226
|
+
|
|
1227
|
+
// Deleveraged position (-dDebt = borrowedFromStateCollateral + borrowedFromUSerCollateral + userBorrowed)
|
|
1228
|
+
// ^
|
|
1229
|
+
// | userCollateral
|
|
1230
|
+
// user ___|__________________________
|
|
1231
|
+
// | |
|
|
1232
|
+
// | | stateCollateral ↓ userCollateral + stateCollateral
|
|
1233
|
+
// | controller --> leverage_zap --> router
|
|
1234
|
+
// | ^ | ^ ^ |
|
|
1235
|
+
// | |______________________| | |___________________|
|
|
1236
|
+
// | | borrowedFromStateCollateral
|
|
1237
|
+
// |________________________________| +
|
|
1238
|
+
// userBorrowed borrowedFromUSerCollateral
|
|
1239
|
+
|
|
1240
|
+
const stateCollateral = 2;
|
|
1241
|
+
userCollateral = 1;
|
|
1242
|
+
userBorrowed = 1500;
|
|
1243
|
+
|
|
1244
|
+
// Get quote for swapping (stateCollateral + userCollateral)
|
|
1245
|
+
|
|
1246
|
+
await lendMarket.leverageZapV2.repayExpectedBorrowed({ stateCollateral, userCollateral, userBorrowed, quote });
|
|
1247
|
+
// {
|
|
1248
|
+
// totalBorrowed: '10998.882838599741571472',
|
|
1249
|
+
// borrowedFromStateCollateral: '6332.588559066494374648',
|
|
1250
|
+
// borrowedFromUserCollateral: '3166.294279533247196824',
|
|
1251
|
+
// userBorrowed: '1500'
|
|
1252
|
+
// avgPrice: '3166.29427953324743125312'
|
|
1253
|
+
// }
|
|
1254
|
+
|
|
1255
|
+
await lendMarket.leverageZapV2.repayIsFull({ stateCollateral, userCollateral, userBorrowed, quote });
|
|
1256
|
+
// false
|
|
1257
|
+
await lendMarket.leverageZapV2.repayIsAvailable({ stateCollateral, userCollateral, userBorrowed, quote });
|
|
1258
|
+
// true
|
|
1259
|
+
|
|
1260
|
+
// NEW: Get all metrics in one call
|
|
1261
|
+
const metricsRepay = await lendMarket.leverageZapV2.repayExpectedMetrics({
|
|
1262
|
+
stateCollateral,
|
|
1263
|
+
userCollateral,
|
|
1264
|
+
userBorrowed,
|
|
1265
|
+
healthIsFull: true, // true for full health, false for not full
|
|
1266
|
+
quote,
|
|
1267
|
+
address: llamalend.signerAddress
|
|
1268
|
+
});
|
|
1269
|
+
// {
|
|
1270
|
+
// priceImpact: 0.013150142802201724, // %
|
|
1271
|
+
// bands: [199, 190],
|
|
1272
|
+
// prices: ['175.130965754280721633', '202.233191367561902757'],
|
|
1273
|
+
// health: '1699.6097751079226865' // %
|
|
1274
|
+
// }
|
|
1275
|
+
|
|
1276
|
+
await lendMarket.leverageZapV2.repayIsApproved({ userCollateral, userBorrowed });
|
|
1277
|
+
// false
|
|
1278
|
+
await lendMarket.leverageZapV2.repayApprove({ userCollateral, userBorrowed });
|
|
1279
|
+
// ['0xd8a8d3b3f67395e1a4f4d4f95b041edcaf1c9f7bab5eb8a8a767467678295498']
|
|
1280
|
+
|
|
1281
|
+
// Execute repay, passing router address and calldata from router
|
|
1282
|
+
await lendMarket.leverageZapV2.repay({ stateCollateral, userCollateral, userBorrowed, router, calldata });
|
|
1283
|
+
// 0xe48a97fef1c54180a2c7d104d210a95ac1a516fdd22109682179f1582da23a82
|
|
1284
|
+
|
|
1285
|
+
await lendMarket.wallet.balances();
|
|
1286
|
+
// {
|
|
1287
|
+
// collateral: '96.0',
|
|
1288
|
+
// borrowed: '595500.0',
|
|
1289
|
+
// vaultShares: '1400000000.0',
|
|
1290
|
+
// gauge: '0'
|
|
1291
|
+
// }
|
|
1292
|
+
await lendMarket.userState();
|
|
1293
|
+
// {
|
|
1294
|
+
// collateral: '5.727839965845165558',
|
|
1295
|
+
// borrowed: '0.0',
|
|
1296
|
+
// debt: '992.083214663467727334',
|
|
1297
|
+
// N: '10'
|
|
1298
|
+
// }
|
|
1299
|
+
await lendMarket.userBands();
|
|
1300
|
+
// [ 199, 190 ]
|
|
1301
|
+
await lendMarket.userPrices();
|
|
1302
|
+
// [ '175.13096689602455189', '202.233192685995210783' ]
|
|
1303
|
+
await lendMarket.userHealth();
|
|
1304
|
+
// 1716.0249924305707883
|
|
1305
|
+
await lendMarket.userHealth(false);
|
|
1306
|
+
// 3.6389352509210336
|
|
1307
|
+
})()
|
|
1308
|
+
```
|
|
1309
|
+
|
|
1310
|
+
### Leverage createLoan all ranges methods for lendMarket
|
|
1311
|
+
```ts
|
|
1312
|
+
await llamalend.init('JsonRpc', {});
|
|
1313
|
+
await llamalend.lendMarkets.fetchMarkets();
|
|
1314
|
+
|
|
1315
|
+
const lendMarket = llamalend.getLendMarket('one-way-market-0');
|
|
1316
|
+
|
|
1317
|
+
const userCollateral = 1;
|
|
1318
|
+
const userBorrowed = 1000;
|
|
1319
|
+
const debt = 2000;
|
|
1320
|
+
|
|
1321
|
+
// Get maximum values for all possible ranges
|
|
1322
|
+
await lendMarket.leverageZapV2.createLoanMaxRecvAllRanges({ userCollateral, userBorrowed, getExpected });
|
|
1323
|
+
// {
|
|
1324
|
+
// '4': {
|
|
1325
|
+
// maxDebt: '37916.338071504823875251',
|
|
1326
|
+
// maxTotalCollateral: '13.286983617364703479',
|
|
1327
|
+
// userCollateral: '1',
|
|
1328
|
+
// collateralFromUserBorrowed: '0.315728154966395280',
|
|
1329
|
+
// collateralFromMaxDebt: '11.971255462398308199',
|
|
1330
|
+
// maxLeverage: '10.09857816541446843865',
|
|
1331
|
+
// avgPrice: '3167.28167656266072703689'
|
|
1332
|
+
// },
|
|
1333
|
+
// '5': {
|
|
1334
|
+
// maxDebt: '35363.440522143354729759',
|
|
1335
|
+
// maxTotalCollateral: '12.480961984286574804',
|
|
1336
|
+
// userCollateral: '1',
|
|
1337
|
+
// collateralFromUserBorrowed: '0.315728154966395280',
|
|
1338
|
+
// collateralFromMaxDebt: '11.165233829320179524',
|
|
1339
|
+
// maxLeverage: '9.48597317551918486951',
|
|
1340
|
+
// avgPrice: '3167.28167656266072703689'
|
|
1341
|
+
// },
|
|
1342
|
+
// '6': {
|
|
1343
|
+
// maxDebt: '33122.824118147617102062',
|
|
1344
|
+
// maxTotalCollateral: '11.773536301065561222',
|
|
1345
|
+
// userCollateral: '1',
|
|
1346
|
+
// collateralFromUserBorrowed: '0.315728154966395280',
|
|
1347
|
+
// collateralFromMaxDebt: '10.457808146099165942',
|
|
1348
|
+
// maxLeverage: '8.94830459971897955699',
|
|
1349
|
+
// avgPrice: '3167.28167656266072703689'
|
|
1350
|
+
// },
|
|
1351
|
+
// '7': {
|
|
1352
|
+
// maxDebt: '31140.555201395785060968',
|
|
1353
|
+
// maxTotalCollateral: '11.147678193332270290',
|
|
1354
|
+
// userCollateral: '1',
|
|
1355
|
+
// collateralFromUserBorrowed: '0.315728154966395280',
|
|
1356
|
+
// collateralFromMaxDebt: '9.831950038365875010',
|
|
1357
|
+
// maxLeverage: '8.47263027035929823721',
|
|
1358
|
+
// avgPrice: '3167.28167656266072703689'
|
|
1359
|
+
// },
|
|
1360
|
+
//
|
|
1361
|
+
// ...
|
|
1362
|
+
//
|
|
1363
|
+
// '50': {
|
|
1364
|
+
// maxDebt: '8122.705063645852013929',
|
|
1365
|
+
// maxTotalCollateral: '3.880294838047496482',
|
|
1366
|
+
// userCollateral: '1',
|
|
1367
|
+
// collateralFromUserBorrowed: '0.315728154966395280',
|
|
1368
|
+
// collateralFromMaxDebt: '2.564566683081101202',
|
|
1369
|
+
// maxLeverage: '2.94916151440614435181',
|
|
1370
|
+
// avgPrice: '3167.28167656266072703689'
|
|
1371
|
+
// }
|
|
1372
|
+
|
|
1373
|
+
// Get quote for specific debt + userBorrowed
|
|
1374
|
+
// and provide getExpected callback
|
|
1375
|
+
await lendMarket.leverageZapV2.createLoanBandsAllRanges({ userCollateral, userBorrowed, debt, getExpected, quote });
|
|
1376
|
+
// {
|
|
1377
|
+
// '4': [ 73, 70 ],
|
|
1378
|
+
// '5': [ 73, 69 ],
|
|
1379
|
+
// '6': [ 74, 69 ],
|
|
1380
|
+
// '7': [ 74, 68 ],
|
|
1381
|
+
//
|
|
1382
|
+
// ...
|
|
1383
|
+
//
|
|
1384
|
+
// '50': [ 97, 48 ]
|
|
1385
|
+
// }
|
|
1386
|
+
|
|
1387
|
+
await lendMarket.leverageZapV2.createLoanPricesAllRanges({ userCollateral, userBorrowed, debt, getExpected, quote });
|
|
1388
|
+
// {
|
|
1389
|
+
// '4': [ '1073.323292757532604807', '1136.910693647788699808' ],
|
|
1390
|
+
// '5': [ '1073.323292757532604807', '1153.387660222394333133' ],
|
|
1391
|
+
// '6': [ '1057.990102860996424743', '1153.387660222394333133' ],
|
|
1392
|
+
// '7': [ '1057.990102860996424743', '1170.103423414023236507' ],
|
|
1393
|
+
//
|
|
1394
|
+
// ...
|
|
1395
|
+
//
|
|
1396
|
+
// '50': [ '759.898822708156242647', '1560.282492846180089068' ]
|
|
1397
|
+
// }
|
|
1398
|
+
```
|
|
1399
|
+
|
|
1400
|
+
### Leverage (createLoan, borrowMore, repay) for lendMarket (Deprecated!!! Will be deleted in the future, please use leverageZapV2)
|
|
951
1401
|
```ts
|
|
952
1402
|
(async () => {
|
|
953
1403
|
await llamalend.init('JsonRpc', {}, {}, API_KEY_1INCH);
|
package/lib/constants/aliases.js
CHANGED
|
@@ -7,6 +7,7 @@ export const ALIASES_ETHEREUM = lowerCaseValues({
|
|
|
7
7
|
"gauge_factory": "0xabC000d88f23Bb45525E447528DBF656A9D55bf5",
|
|
8
8
|
// "leverage_zap": "0x3294514B78Df4Bb90132567fcf8E5e99f390B687", // 1inch
|
|
9
9
|
"leverage_zap": "0xC5898606BdB494a994578453B92e7910a90aA873", // odos
|
|
10
|
+
"leverage_zap_v2": "0x0000000000000000000000000000000000000000",
|
|
10
11
|
"leverage_markets_start_id": "9",
|
|
11
12
|
"crvUSD": "0xf939E0A03FB07F59A73314E73794Be0E57ac1b4E",
|
|
12
13
|
"st_crvUSD": "0x0655977FEb2f289A4aB78af67BAB0d17aAb84367",
|
|
@@ -17,6 +18,7 @@ export const ALIASES_POLYGON = lowerCaseValues({
|
|
|
17
18
|
"gauge_controller": "0x2F50D538606Fa9EDD2B11E2446BEb18C9D5846bB",
|
|
18
19
|
"gauge_factory": "0xabC000d88f23Bb45525E447528DBF656A9D55bf5",
|
|
19
20
|
"leverage_zap": "0x0000000000000000000000000000000000000000",
|
|
21
|
+
"leverage_zap_v2": "0x0000000000000000000000000000000000000000",
|
|
20
22
|
});
|
|
21
23
|
export const ALIASES_FANTOM = lowerCaseValues({
|
|
22
24
|
"crv": "0x1E4F97b9f9F913c46F1632781732927B9019C68b",
|
|
@@ -24,6 +26,7 @@ export const ALIASES_FANTOM = lowerCaseValues({
|
|
|
24
26
|
"gauge_controller": "0x2F50D538606Fa9EDD2B11E2446BEb18C9D5846bB",
|
|
25
27
|
"gauge_factory": "0xabC000d88f23Bb45525E447528DBF656A9D55bf5",
|
|
26
28
|
"leverage_zap": "0x0000000000000000000000000000000000000000",
|
|
29
|
+
"leverage_zap_v2": "0x0000000000000000000000000000000000000000",
|
|
27
30
|
});
|
|
28
31
|
export const ALIASES_AVALANCHE = lowerCaseValues({
|
|
29
32
|
"crv": "0x47536F17F4fF30e64A96a7555826b8f9e66ec468",
|
|
@@ -31,6 +34,7 @@ export const ALIASES_AVALANCHE = lowerCaseValues({
|
|
|
31
34
|
"gauge_controller": "0x2F50D538606Fa9EDD2B11E2446BEb18C9D5846bB",
|
|
32
35
|
"gauge_factory": "0xabC000d88f23Bb45525E447528DBF656A9D55bf5",
|
|
33
36
|
"leverage_zap": "0x0000000000000000000000000000000000000000",
|
|
37
|
+
"leverage_zap_v2": "0x0000000000000000000000000000000000000000",
|
|
34
38
|
});
|
|
35
39
|
export const ALIASES_ARBITRUM = lowerCaseValues({
|
|
36
40
|
"crv": "0x11cDb42B0EB46D95f990BeDD4695A6e3fA034978",
|
|
@@ -39,6 +43,7 @@ export const ALIASES_ARBITRUM = lowerCaseValues({
|
|
|
39
43
|
"gauge_factory": "0xabC000d88f23Bb45525E447528DBF656A9D55bf5",
|
|
40
44
|
// "leverage_zap": "0x61C404B60ee9c5fB09F70F9A645DD38fE5b3A956", // 1inch
|
|
41
45
|
"leverage_zap": "0xb7b240CFa985306563A301bC417Bc9715059a117", // odos
|
|
46
|
+
"leverage_zap_v2": "0x5b07Db9a85992c877b9fBeA6DCC4F79292577640",
|
|
42
47
|
"leverage_markets_start_id": "9",
|
|
43
48
|
});
|
|
44
49
|
export const ALIASES_OPTIMISM = lowerCaseValues({
|
|
@@ -48,6 +53,7 @@ export const ALIASES_OPTIMISM = lowerCaseValues({
|
|
|
48
53
|
"gauge_factory_old": "0xabC000d88f23Bb45525E447528DBF656A9D55bf5",
|
|
49
54
|
"gauge_factory": "0x871fBD4E01012e2E8457346059e8C189d664DbA4",
|
|
50
55
|
"leverage_zap": "0x273e44B9a1841857d9360e8792bB59f9e1FfE9Da",
|
|
56
|
+
"leverage_zap_v2": "0x0000000000000000000000000000000000000000",
|
|
51
57
|
"leverage_markets_start_id": "0",
|
|
52
58
|
"gas_oracle": '0xc0d3C0d3C0d3c0D3C0D3C0d3C0d3C0D3C0D3000f',
|
|
53
59
|
"gas_oracle_blob": '0x420000000000000000000000000000000000000f',
|
|
@@ -58,6 +64,7 @@ export const ALIASES_XDAI = lowerCaseValues({
|
|
|
58
64
|
"gauge_controller": "0x2F50D538606Fa9EDD2B11E2446BEb18C9D5846bB",
|
|
59
65
|
"gauge_factory": "0xabC000d88f23Bb45525E447528DBF656A9D55bf5",
|
|
60
66
|
"leverage_zap": "0x0000000000000000000000000000000000000000",
|
|
67
|
+
"leverage_zap_v2": "0x0000000000000000000000000000000000000000",
|
|
61
68
|
});
|
|
62
69
|
export const ALIASES_MOONBEAM = lowerCaseValues({
|
|
63
70
|
"crv": "0x7C598c96D02398d89FbCb9d41Eab3DF0C16F227D",
|
|
@@ -65,6 +72,7 @@ export const ALIASES_MOONBEAM = lowerCaseValues({
|
|
|
65
72
|
"gauge_controller": "0x2F50D538606Fa9EDD2B11E2446BEb18C9D5846bB",
|
|
66
73
|
"gauge_factory": "0xabC000d88f23Bb45525E447528DBF656A9D55bf5",
|
|
67
74
|
"leverage_zap": "0x0000000000000000000000000000000000000000",
|
|
75
|
+
"leverage_zap_v2": "0x0000000000000000000000000000000000000000",
|
|
68
76
|
});
|
|
69
77
|
export const ALIASES_AURORA = lowerCaseValues({
|
|
70
78
|
"crv": "0x64D5BaF5ac030e2b7c435aDD967f787ae94D0205",
|
|
@@ -78,6 +86,7 @@ export const ALIASES_KAVA = lowerCaseValues({
|
|
|
78
86
|
"gauge_controller": "0x2F50D538606Fa9EDD2B11E2446BEb18C9D5846bB",
|
|
79
87
|
"gauge_factory": "0xabC000d88f23Bb45525E447528DBF656A9D55bf5",
|
|
80
88
|
"leverage_zap": "0x0000000000000000000000000000000000000000",
|
|
89
|
+
"leverage_zap_v2": "0x0000000000000000000000000000000000000000",
|
|
81
90
|
});
|
|
82
91
|
export const ALIASES_CELO = lowerCaseValues({
|
|
83
92
|
"crv": "0x0a7432cF27F1aE3825c313F3C81e7D3efD7639aB", // <--- TODO CHANGE
|
|
@@ -85,6 +94,7 @@ export const ALIASES_CELO = lowerCaseValues({
|
|
|
85
94
|
"gauge_controller": "0x2F50D538606Fa9EDD2B11E2446BEb18C9D5846bB",
|
|
86
95
|
"gauge_factory": "0xabC000d88f23Bb45525E447528DBF656A9D55bf5",
|
|
87
96
|
"leverage_zap": "0x0000000000000000000000000000000000000000",
|
|
97
|
+
"leverage_zap_v2": "0x0000000000000000000000000000000000000000",
|
|
88
98
|
});
|
|
89
99
|
export const ALIASES_ZKSYNC = lowerCaseValues({
|
|
90
100
|
"crv": "0x0a7432cF27F1aE3825c313F3C81e7D3efD7639aB", // <--- TODO CHANGE
|
|
@@ -92,6 +102,7 @@ export const ALIASES_ZKSYNC = lowerCaseValues({
|
|
|
92
102
|
"gauge_controller": "0x2F50D538606Fa9EDD2B11E2446BEb18C9D5846bB", // <--- TODO CHANGE
|
|
93
103
|
"gauge_factory": "0x0000000000000000000000000000000000000000",
|
|
94
104
|
"leverage_zap": "0x0000000000000000000000000000000000000000",
|
|
105
|
+
"leverage_zap_v2": "0x0000000000000000000000000000000000000000",
|
|
95
106
|
});
|
|
96
107
|
export const ALIASES_BASE = lowerCaseValues({
|
|
97
108
|
"crv": "0x8Ee73c484A26e0A5df2Ee2a4960B789967dd0415",
|
|
@@ -99,6 +110,7 @@ export const ALIASES_BASE = lowerCaseValues({
|
|
|
99
110
|
"gauge_controller": "0x2F50D538606Fa9EDD2B11E2446BEb18C9D5846bB", // <--- TODO CHANGE
|
|
100
111
|
"gauge_factory": "0xabC000d88f23Bb45525E447528DBF656A9D55bf5",
|
|
101
112
|
"leverage_zap": "0x0000000000000000000000000000000000000000",
|
|
113
|
+
"leverage_zap_v2": "0x0000000000000000000000000000000000000000",
|
|
102
114
|
});
|
|
103
115
|
export const ALIASES_BSC = lowerCaseValues({
|
|
104
116
|
"crv": "0x8Ee73c484A26e0A5df2Ee2a4960B789967dd0415", // <--- TODO CHANGE
|
|
@@ -106,6 +118,7 @@ export const ALIASES_BSC = lowerCaseValues({
|
|
|
106
118
|
"gauge_controller": "0x0000000000000000000000000000000000000000", // <--- TODO CHANGE
|
|
107
119
|
"gauge_factory": "0xabC000d88f23Bb45525E447528DBF656A9D55bf5",
|
|
108
120
|
"leverage_zap": "0x0000000000000000000000000000000000000000",
|
|
121
|
+
"leverage_zap_v2": "0x0000000000000000000000000000000000000000",
|
|
109
122
|
});
|
|
110
123
|
export const ALIASES_FRAXTAL = lowerCaseValues({
|
|
111
124
|
"crv": "0x331B9182088e2A7d6D3Fe4742AbA1fB231aEcc56",
|
|
@@ -114,6 +127,7 @@ export const ALIASES_FRAXTAL = lowerCaseValues({
|
|
|
114
127
|
"gauge_factory_old": "0xeF672bD94913CB6f1d2812a6e18c1fFdEd8eFf5c",
|
|
115
128
|
"gauge_factory": "0x0b8d6b6cefc7aa1c2852442e518443b1b22e1c52",
|
|
116
129
|
"leverage_zap": "0x37c5ab57AF7100Bdc9B668d766e193CCbF6614FD", // odos
|
|
130
|
+
"leverage_zap_v2": "0x0000000000000000000000000000000000000000",
|
|
117
131
|
"leverage_markets_start_id": "0",
|
|
118
132
|
});
|
|
119
133
|
export const ALIASES_SONIC = lowerCaseValues({
|
|
@@ -122,5 +136,6 @@ export const ALIASES_SONIC = lowerCaseValues({
|
|
|
122
136
|
"gauge_controller": "0x2F50D538606Fa9EDD2B11E2446BEb18C9D5846bB",
|
|
123
137
|
"gauge_factory": "0xf3A431008396df8A8b2DF492C913706BDB0874ef",
|
|
124
138
|
"leverage_zap": "0x5552b631e2aD801fAa129Aacf4B701071cC9D1f7", // odos
|
|
139
|
+
"leverage_zap_v2": "0x0000000000000000000000000000000000000000",
|
|
125
140
|
"leverage_markets_start_id": "0",
|
|
126
141
|
});
|
package/lib/interfaces.d.ts
CHANGED
|
@@ -218,4 +218,15 @@ export interface ILlamma {
|
|
|
218
218
|
export interface IResponseApi {
|
|
219
219
|
data: any;
|
|
220
220
|
}
|
|
221
|
+
export interface IQuote {
|
|
222
|
+
outAmount: string;
|
|
223
|
+
priceImpact: number;
|
|
224
|
+
}
|
|
225
|
+
export interface ILeverageMetrics {
|
|
226
|
+
priceImpact: number;
|
|
227
|
+
bands: [number, number];
|
|
228
|
+
prices: string[];
|
|
229
|
+
health: string;
|
|
230
|
+
}
|
|
231
|
+
export type GetExpectedFn = (fromToken: string, toToken: string, amountIn: bigint, blacklist: string | string[]) => Promise<IQuote>;
|
|
221
232
|
export {};
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import memoize from "memoizee";
|
|
2
2
|
import type { Llamalend } from "../llamalend.js";
|
|
3
3
|
import { IDict, TGas, TAmount, IReward, IQuoteOdos, IOneWayMarket, IPartialFrac } from "../interfaces.js";
|
|
4
|
+
import { ILeverageZapV2 } from "./interfaces/leverageZapV2.js";
|
|
4
5
|
export declare class LendMarketTemplate {
|
|
5
6
|
private llamalend;
|
|
6
7
|
id: string;
|
|
@@ -252,6 +253,7 @@ export declare class LendMarketTemplate {
|
|
|
252
253
|
repay: (stateCollateral: TAmount, userCollateral: TAmount, userBorrowed: TAmount, slippage?: number) => Promise<number>;
|
|
253
254
|
};
|
|
254
255
|
};
|
|
256
|
+
leverageZapV2: ILeverageZapV2;
|
|
255
257
|
constructor(id: string, marketData: IOneWayMarket, llamalend: Llamalend);
|
|
256
258
|
private _getMarketId;
|
|
257
259
|
private vaultMaxDeposit;
|
|
@@ -357,7 +359,7 @@ export declare class LendMarketTemplate {
|
|
|
357
359
|
collateral: string;
|
|
358
360
|
borrowed: string;
|
|
359
361
|
}>>;
|
|
360
|
-
|
|
362
|
+
_checkRange(range: number): void;
|
|
361
363
|
createLoanMaxRecv(collateral: number | string, range: number): Promise<string>;
|
|
362
364
|
createLoanMaxRecvAllRanges: ((collateral: number | string) => Promise<{
|
|
363
365
|
[index: number]: string;
|
|
@@ -367,8 +369,8 @@ export declare class LendMarketTemplate {
|
|
|
367
369
|
getMaxRange(collateral: number | string, debt: number | string): Promise<number>;
|
|
368
370
|
private _calcN1;
|
|
369
371
|
private _calcN1AllRanges;
|
|
370
|
-
|
|
371
|
-
|
|
372
|
+
_getPrices(_n2: bigint, _n1: bigint): Promise<string[]>;
|
|
373
|
+
_calcPrices(_n2: bigint, _n1: bigint): Promise<[string, string]>;
|
|
372
374
|
private _createLoanBands;
|
|
373
375
|
private _createLoanBandsAllRanges;
|
|
374
376
|
createLoanBands(collateral: number | string, debt: number | string, range: number): Promise<[number, number]>;
|
|
@@ -522,4 +524,5 @@ export declare class LendMarketTemplate {
|
|
|
522
524
|
currentPnL(userAddress?: string): Promise<Record<string, string>>;
|
|
523
525
|
userBoost(address?: string): Promise<string>;
|
|
524
526
|
forceUpdateUserState(newTx: string, userAddress?: string): Promise<void>;
|
|
527
|
+
getLlamalend(): Llamalend;
|
|
525
528
|
}
|