From a633833eae0f7c3cdafe2350079ea9389fa9fa88 Mon Sep 17 00:00:00 2001 From: Rubilmax Date: Mon, 21 Oct 2024 11:25:14 +0200 Subject: [PATCH] fix(liquidation): update example typings --- packages/blue-sdk/src/position/Position.ts | 11 +- .../examples/whitelisted-erc4626-1inch.js | 335 ++++++++++++++++++ .../examples/whitelisted-erc4626-1inch.ts | 9 +- packages/liquidation-sdk-viem/package.json | 2 +- .../whitelisted-erc4626-1inch.test.ts | 28 +- 5 files changed, 366 insertions(+), 19 deletions(-) create mode 100644 packages/liquidation-sdk-viem/examples/whitelisted-erc4626-1inch.js diff --git a/packages/blue-sdk/src/position/Position.ts b/packages/blue-sdk/src/position/Position.ts index 57791f67..48ee006b 100644 --- a/packages/blue-sdk/src/position/Position.ts +++ b/packages/blue-sdk/src/position/Position.ts @@ -77,6 +77,7 @@ export class AccrualPosition extends Position implements InputAccrualPosition { /** * The value of this position's collateral quoted in loan assets. + * Undefined iff the market's oracle is undefined or reverts. */ get collateralValue() { return this.market.getCollateralValue(this.collateral); @@ -84,6 +85,7 @@ export class AccrualPosition extends Position implements InputAccrualPosition { /** * The maximum amount of loan assets that can be borrowed against this position's collateral. + * Undefined iff the market's oracle is undefined or reverts. */ get maxBorrowAssets() { return this.market.getMaxBorrowAssets(this.collateral); @@ -91,6 +93,7 @@ export class AccrualPosition extends Position implements InputAccrualPosition { /** * The maximum additional amount of assets that can be borrowed against this position's collateral. + * Undefined iff the market's oracle is undefined or reverts. */ get maxBorrowableAssets() { return this.market.getMaxBorrowableAssets(this); @@ -98,6 +101,7 @@ export class AccrualPosition extends Position implements InputAccrualPosition { /** * The maximum amount of collateral that can be seized in exchange for the outstanding debt. + * Undefined iff the market's oracle is undefined or reverts. */ get seizableCollateral() { return this.market.getSeizableCollateral(this); @@ -105,6 +109,7 @@ export class AccrualPosition extends Position implements InputAccrualPosition { /** * The maximum amount of collateral that can be withdrawn. + * Undefined iff the market's oracle is undefined or reverts. */ get withdrawableCollateral() { return this.market.getWithdrawableCollateral(this); @@ -112,6 +117,7 @@ export class AccrualPosition extends Position implements InputAccrualPosition { /** * Whether this position is healthy. + * Undefined iff the market's oracle is undefined or reverts. */ get isHealthy() { return this.market.isHealthy(this); @@ -127,7 +133,8 @@ export class AccrualPosition extends Position implements InputAccrualPosition { /** * The price variation required for the position to reach its liquidation threshold (scaled by WAD). * Negative when healthy (the price needs to drop x%), positive when unhealthy (the price needs to soar x%). - * Returns null if the position is not a borrow. + * Undefined iff the market's oracle is undefined or reverts. + * Null if the position is not a borrow. */ get priceVariationToLiquidationPrice() { return this.market.getPriceVariationToLiquidationPrice(this); @@ -136,6 +143,7 @@ export class AccrualPosition extends Position implements InputAccrualPosition { /** * This position's Loan-To-Value (debt over collateral power, scaled by WAD). * If the collateral price is 0, LTV is `MaxUint256`. + * Undefined iff the market's oracle is undefined or reverts. */ get ltv() { return this.market.getLtv(this); @@ -144,6 +152,7 @@ export class AccrualPosition extends Position implements InputAccrualPosition { /** * This position's health factor (collateral power over debt, scaled by WAD). * If the debt is 0, health factor is `MaxUint256`. + * Undefined iff the market's oracle is undefined or reverts. */ get healthFactor() { return this.market.getHealthFactor(this); diff --git a/packages/liquidation-sdk-viem/examples/whitelisted-erc4626-1inch.js b/packages/liquidation-sdk-viem/examples/whitelisted-erc4626-1inch.js new file mode 100644 index 00000000..022e1e09 --- /dev/null +++ b/packages/liquidation-sdk-viem/examples/whitelisted-erc4626-1inch.js @@ -0,0 +1,335 @@ +"use strict"; +var __assign = (this && this.__assign) || function () { + __assign = Object.assign || function(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) + t[p] = s[p]; + } + return t; + }; + return __assign.apply(this, arguments); +}; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __generator = (this && this.__generator) || function (thisArg, body) { + var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype); + return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; + function verb(n) { return function (v) { return step([n, v]); }; } + function step(op) { + if (f) throw new TypeError("Generator is already executing."); + while (g && (g = 0, op[0] && (_ = 0)), _) try { + if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; + if (y = 0, t) op = [op[0] & 2, t.value]; + switch (op[0]) { + case 0: case 1: t = op; break; + case 4: _.label++; return { value: op[1], done: false }; + case 5: _.label++; y = op[1]; op = [0]; continue; + case 7: op = _.ops.pop(); _.trys.pop(); continue; + default: + if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } + if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } + if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } + if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } + if (t[2]) _.ops.pop(); + _.trys.pop(); continue; + } + op = body.call(thisArg, _); + } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } + if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; + } +}; +var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) { + if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) { + if (ar || !(i in from)) { + if (!ar) ar = Array.prototype.slice.call(from, 0, i); + ar[i] = from[i]; + } + } + return to.concat(ar || Array.prototype.slice.call(from)); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.check = void 0; +var blue_api_sdk_1 = require("@morpho-org/blue-api-sdk"); +var blue_sdk_1 = require("@morpho-org/blue-sdk"); +var blue_sdk_viem_1 = require("@morpho-org/blue-sdk-viem"); +var liquidation_sdk_viem_1 = require("@morpho-org/liquidation-sdk-viem"); +var morpho_ts_1 = require("@morpho-org/morpho-ts"); +var viem_1 = require("viem"); +var actions_1 = require("viem/actions"); +var converter = new blue_api_sdk_1.BlueSdkConverter({ + parseAddress: blue_sdk_viem_1.safeGetAddress, + parseNumber: blue_sdk_viem_1.safeParseNumber, +}); +var check = function (executorAddress_1, client_1, flashbotsAccount_1) { + var args_1 = []; + for (var _i = 3; _i < arguments.length; _i++) { + args_1[_i - 3] = arguments[_i]; + } + return __awaiter(void 0, __spreadArray([executorAddress_1, client_1, flashbotsAccount_1], args_1, true), void 0, function (executorAddress, client, flashbotsAccount, additionalMarketIds) { + var chainId, markets, _a, morpho, wNative, _b, wethPriceUsd, positions, ethPriceUsd, pendleTokens; + var _c; + if (additionalMarketIds === void 0) { additionalMarketIds = []; } + return __generator(this, function (_d) { + switch (_d.label) { + case 0: + chainId = blue_sdk_1.ChainUtils.parseSupportedChainId(client.chain.id); + return [4 /*yield*/, liquidation_sdk_viem_1.apiSdk.getWhitelistedMarketIds({ + chainId: chainId, + })]; + case 1: + markets = (_d.sent()).markets.items; + _a = (0, blue_sdk_1.getChainAddresses)(chainId), morpho = _a.morpho, wNative = _a.wNative; + return [4 /*yield*/, liquidation_sdk_viem_1.apiSdk.getLiquidatablePositions({ + chainId: chainId, + wNative: wNative, + marketIds: additionalMarketIds.concat((_c = markets === null || markets === void 0 ? void 0 : markets.map(function (_a) { + var uniqueKey = _a.uniqueKey; + return uniqueKey; + })) !== null && _c !== void 0 ? _c : []), + })]; + case 2: + _b = _d.sent(), wethPriceUsd = _b.assetByAddress.priceUsd, positions = _b.marketPositions.items; + if (wethPriceUsd == null) + return [2 /*return*/, []]; + ethPriceUsd = (0, blue_sdk_viem_1.safeParseNumber)(wethPriceUsd, 18); + return [4 /*yield*/, liquidation_sdk_viem_1.Pendle.getTokens(chainId)]; + case 3: + pendleTokens = _d.sent(); + return [2 /*return*/, Promise.all((positions !== null && positions !== void 0 ? positions : []).map(function (position) { return __awaiter(void 0, void 0, void 0, function () { + var accrualPosition, _a, user, market, seizableCollateral, collateralToken_1, loanToken_1, _b, collateralUnderlyingAsset_1, loanMorphoAllowance_1, triedLiquidity, slippage_1, error_1; + return __generator(this, function (_c) { + switch (_c.label) { + case 0: + if (position.market.collateralAsset == null) + return [2 /*return*/]; + return [4 /*yield*/, (0, blue_sdk_viem_1.fetchAccrualPosition)(position.user.address, position.market.uniqueKey, client, { chainId: chainId })]; + case 1: + accrualPosition = _c.sent(); + _a = accrualPosition.accrueInterest(morpho_ts_1.Time.timestamp()), user = _a.user, market = _a.market, seizableCollateral = _a.seizableCollateral; + _c.label = 2; + case 2: + _c.trys.push([2, 5, , 6]); + collateralToken_1 = converter.getTokenWithPrice(position.market.collateralAsset, wethPriceUsd); + if (collateralToken_1.price == null) + throw new blue_sdk_1.UnknownTokenPriceError(collateralToken_1.address); + loanToken_1 = converter.getTokenWithPrice(position.market.loanAsset, wethPriceUsd); + if (loanToken_1.price == null) + throw new blue_sdk_1.UnknownTokenPriceError(loanToken_1.address); + return [4 /*yield*/, Promise.all(__spreadArray([ + // Convex staking wrapper tokens expose both EIP-4626's `asset` and OZ's ERC20Wrapper's `underlying` view function. + (0, actions_1.readContract)(client, { + address: market.params.collateralToken, + abi: viem_1.erc4626Abi, + functionName: "asset", + }).catch(function () { return undefined; }), + (0, actions_1.readContract)(client, { + address: loanToken_1.address, + abi: viem_1.erc20Abi, + functionName: "allowance", + args: [executorAddress, morpho], + }) + ], new Array(10) + .fill(undefined) + .map(function (_v, i) { return seizableCollateral / Math.pow(2n, BigInt(i)); }) + .filter(function (seizedAssets) { + return collateralToken_1.toUsd(seizedAssets) > (0, viem_1.parseEther)("1000"); + }) + .map(function (seizedAssets) { return __awaiter(void 0, void 0, void 0, function () { + var repaidShares; + var _a; + return __generator(this, function (_b) { + switch (_b.label) { + case 0: + repaidShares = market.getLiquidationRepaidShares(seizedAssets); + _a = { + seizedAssets: seizedAssets, + repaidShares: repaidShares, + repaidAssets: market.toBorrowAssets(repaidShares) + }; + return [4 /*yield*/, (0, actions_1.readContract)(client, { + address: market.params.collateralToken, + abi: viem_1.erc4626Abi, + functionName: "previewRedeem", + args: [seizedAssets], + blockTag: "pending", + }) + // Convex staking wrapper tokens do not expose the ERC-4626 `previewRedeem` view function. + .catch(function () { return undefined; })]; + case 1: return [2 /*return*/, (_a.withdrawnAssets = _b.sent(), + _a)]; + } + }); + }); }), true))]; + case 3: + _b = _c.sent(), collateralUnderlyingAsset_1 = _b[0], loanMorphoAllowance_1 = _b[1], triedLiquidity = _b.slice(2); + if (triedLiquidity.length === 0) + throw Error("seized zero"); + slippage_1 = (market.params.liquidationIncentiveFactor - BigInt.WAD) / 2n; + return [4 /*yield*/, Promise.allSettled(triedLiquidity.map(function (_a) { return __awaiter(void 0, [_a], void 0, function (_b) { + var srcToken, srcAmount, encoder, dstAmount, usdsWithdrawalAmount, _c, bestSwap, populatedTx, _d, gasLimit, blockNumber, txCount, maxFeePerGas, gasLimitUsd, profitUsd, transaction, signedBundle, error_2; + var _e; + var seizedAssets = _b.seizedAssets, repaidAssets = _b.repaidAssets, withdrawnAssets = _b.withdrawnAssets; + return __generator(this, function (_f) { + switch (_f.label) { + case 0: + _f.trys.push([0, 17, , 18]); + srcToken = collateralUnderlyingAsset_1 !== null && collateralUnderlyingAsset_1 !== void 0 ? collateralUnderlyingAsset_1 : market.params.collateralToken; + srcAmount = withdrawnAssets !== null && withdrawnAssets !== void 0 ? withdrawnAssets : seizedAssets; + encoder = new liquidation_sdk_viem_1.LiquidationEncoder(executorAddress, client); + dstAmount = 0n; + return [4 /*yield*/, encoder.handlePendleTokens(market.params.collateralToken, seizedAssets, pendleTokens)]; + case 1: + // Handle Pendle Tokens + // To retrieve the tokens, we need to call the Pendle API to get the swap calldata + (_e = _f.sent(), srcAmount = _e.srcAmount, srcToken = _e.srcToken); + if (!(market.params.collateralToken === liquidation_sdk_viem_1.mainnetAddresses.sUsds && + chainId === blue_sdk_1.ChainId.EthMainnet)) return [3 /*break*/, 3]; + return [4 /*yield*/, encoder.previewUSDSWithdrawalAmount(srcAmount)]; + case 2: + usdsWithdrawalAmount = _f.sent(); + encoder.erc20Approve(liquidation_sdk_viem_1.mainnetAddresses.sUsds, liquidation_sdk_viem_1.mainnetAddresses.sUsds, viem_1.maxUint256); + encoder.usdsWithdraw(usdsWithdrawalAmount, executorAddress, executorAddress); + srcAmount = usdsWithdrawalAmount; + srcToken = liquidation_sdk_viem_1.mainnetAddresses.usds; + _f.label = 3; + case 3: + _c = true; + switch (_c) { + case market.params.collateralToken === + liquidation_sdk_viem_1.mainnetAddresses["usd0usd0++"] && + chainId === blue_sdk_1.ChainId.EthMainnet: return [3 /*break*/, 4]; + case market.params.collateralToken === + liquidation_sdk_viem_1.mainnetAddresses["usd0++"] && + chainId === blue_sdk_1.ChainId.EthMainnet: return [3 /*break*/, 6]; + } + return [3 /*break*/, 8]; + case 4: return [4 /*yield*/, encoder.curveSwapUsd0Usd0PPForUsdc(srcAmount, accrualPosition.market.toBorrowAssets(accrualPosition.market.getLiquidationRepaidShares(seizedAssets)), executorAddress)]; + case 5: + dstAmount = _f.sent(); + return [3 /*break*/, 10]; + case 6: return [4 /*yield*/, encoder.swapUSD0PPToUSDC(srcAmount, accrualPosition.market.toBorrowAssets(accrualPosition.market.getLiquidationRepaidShares(seizedAssets)), executorAddress)]; + case 7: + dstAmount = _f.sent(); + return [3 /*break*/, 10]; + case 8: return [4 /*yield*/, (0, liquidation_sdk_viem_1.fetchBestSwap)({ + chainId: chainId, + src: srcToken, + dst: market.params.loanToken, + amount: srcAmount, + from: executorAddress, + slippage: slippage_1, + includeTokensInfo: false, + includeProtocols: false, + includeGas: false, + allowPartialFill: false, + disableEstimate: true, + usePermit2: false, + })]; + case 9: + bestSwap = _f.sent(); + if (!bestSwap) + throw Error("could not fetch swap from both 1inch and paraswap"); + dstAmount = BigInt(bestSwap.dstAmount); + if (dstAmount < repaidAssets.wadMulDown(BigInt.WAD + slippage_1)) + return [2 /*return*/]; + encoder + .erc20Approve(srcToken, bestSwap.tx.to, srcAmount) + .pushCall(bestSwap.tx.to, BigInt(bestSwap.tx.value), bestSwap.tx.data); + return [3 /*break*/, 10]; + case 10: + // Handle ERC20Wrapper collateral tokens. + if (blue_sdk_1.erc20WrapperTokens[chainId].has(market.params.collateralToken)) + encoder.erc20WrapperWithdrawTo(market.params.collateralToken, executorAddress, seizedAssets); + // Handle ERC4626 share tokens. + // Convex staking wrapper tokens will have an underlying token but won't expose the corresponding withdrawn asset, + // which are automatically withdrawn upon liquidation, at an exchange rate of 1. + if (collateralUnderlyingAsset_1 != null && + withdrawnAssets != null && + !(liquidation_sdk_viem_1.mainnetAddresses.sUsds && chainId === blue_sdk_1.ChainId.EthMainnet)) + encoder.erc4626Redeem(market.params.collateralToken, seizedAssets, executorAddress, executorAddress); + if (loanMorphoAllowance_1 === 0n) + // Allows to handle changes in repaidAssets due to price changes and saves gas. + encoder.erc20Approve(market.params.loanToken, morpho, viem_1.maxUint256); + encoder.morphoBlueLiquidate(morpho, market.params, user, seizedAssets, 0n, encoder.flush()); + return [4 /*yield*/, encoder.encodeExec()]; + case 11: + populatedTx = _f.sent(); + return [4 /*yield*/, Promise.all([ + (0, actions_1.estimateGas)(client, populatedTx), + (0, actions_1.getBlockNumber)(client), + (0, actions_1.getTransactionCount)(client, { + address: client.account.address, + }), // Always use latest committed nonce (not pending) to guarantee tx can be included. + (0, actions_1.estimateFeesPerGas)(client), + ])]; + case 12: + _d = _f.sent(), gasLimit = _d[0], blockNumber = _d[1], txCount = _d[2], maxFeePerGas = _d[3].maxFeePerGas; + gasLimitUsd = ethPriceUsd.wadMulDown(gasLimit * maxFeePerGas); + profitUsd = loanToken_1.toUsd(dstAmount - repaidAssets); + if (gasLimitUsd > profitUsd) + throw Error("gas cost ($".concat(gasLimitUsd.formatWad(2), ") > profit ($").concat(profitUsd.formatWad(2), ")")); + transaction = __assign(__assign({}, populatedTx), { chainId: chainId, nonce: txCount, gas: gasLimit, // Avoid estimating gas again. + maxFeePerGas: maxFeePerGas }); + if (!(chainId === blue_sdk_1.ChainId.EthMainnet)) return [3 /*break*/, 15]; + return [4 /*yield*/, liquidation_sdk_viem_1.Flashbots.signBundle([ + { + transaction: transaction, + client: client, + }, + ])]; + case 13: + signedBundle = _f.sent(); + return [4 /*yield*/, liquidation_sdk_viem_1.Flashbots.sendRawBundle(signedBundle, blockNumber + 1n, flashbotsAccount)]; + case 14: return [2 /*return*/, _f.sent()]; + case 15: return [4 /*yield*/, (0, actions_1.sendTransaction)(client, transaction)]; + case 16: return [2 /*return*/, _f.sent()]; + case 17: + error_2 = _f.sent(); + console.warn("Tried liquidating \"".concat(seizedAssets, "\" collateral (\"").concat(withdrawnAssets, "\" underlying) from \"").concat(user, "\" on market \"").concat(market.id, "\":\n"), error_2 instanceof Error ? error_2.stack : error_2); + return [2 /*return*/]; + case 18: return [2 /*return*/]; + } + }); + }); }))]; + case 4: + _c.sent(); + return [3 /*break*/, 6]; + case 5: + error_1 = _c.sent(); + if (error_1 instanceof Error) + // eslint-disable-next-line no-console + console.warn("Could not liquidate user \"".concat(user, "\" on market \"").concat(market.id, "\":"), error_1.message); + return [2 /*return*/]; + case 6: return [2 /*return*/]; + } + }); + }); }))]; + } + }); + }); +}; +exports.check = check; +var main = function (executorAddress_1, client_1, flashbotsAccount_1) { + var args_1 = []; + for (var _i = 3; _i < arguments.length; _i++) { + args_1[_i - 3] = arguments[_i]; + } + return __awaiter(void 0, __spreadArray([executorAddress_1, client_1, flashbotsAccount_1], args_1, true), void 0, function (executorAddress, client, flashbotsAccount, additionalMarketIds) { + if (additionalMarketIds === void 0) { additionalMarketIds = []; } + return __generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, (0, exports.check)(executorAddress, client, flashbotsAccount, additionalMarketIds.filter(blue_sdk_1.isMarketId))]; + case 1: return [2 /*return*/, _a.sent()]; + } + }); + }); +}; +exports.default = main; diff --git a/packages/liquidation-sdk-viem/examples/whitelisted-erc4626-1inch.ts b/packages/liquidation-sdk-viem/examples/whitelisted-erc4626-1inch.ts index 612261de..8979dcb1 100644 --- a/packages/liquidation-sdk-viem/examples/whitelisted-erc4626-1inch.ts +++ b/packages/liquidation-sdk-viem/examples/whitelisted-erc4626-1inch.ts @@ -98,6 +98,9 @@ export const check = async < const { user, market, seizableCollateral } = accrualPosition.accrueInterest(Time.timestamp()); + if (seizableCollateral == null) + return console.warn(`Unknown oracle price for market "${market.id}"`); + try { const collateralToken = converter.getTokenWithPrice( position.market.collateralAsset, @@ -139,7 +142,7 @@ export const check = async < ) .map(async (seizedAssets) => { const repaidShares = - market.getLiquidationRepaidShares(seizedAssets); + market.getLiquidationRepaidShares(seizedAssets)!; return { seizedAssets, @@ -215,7 +218,7 @@ export const check = async < accrualPosition.market.toBorrowAssets( accrualPosition.market.getLiquidationRepaidShares( seizedAssets, - ), + )!, ), executorAddress, ); @@ -229,7 +232,7 @@ export const check = async < accrualPosition.market.toBorrowAssets( accrualPosition.market.getLiquidationRepaidShares( seizedAssets, - ), + )!, ), executorAddress, ); diff --git a/packages/liquidation-sdk-viem/package.json b/packages/liquidation-sdk-viem/package.json index 59974cbd..5b2e98e7 100644 --- a/packages/liquidation-sdk-viem/package.json +++ b/packages/liquidation-sdk-viem/package.json @@ -16,7 +16,7 @@ "scripts": { "prepublish": "$npm_execpath build", "compile": "hardhat compile", - "build": "tsc --build tsconfig.build.json", + "build": "tsc --noEmit && tsc --build tsconfig.build.json", "codegen": "graphql-codegen --config codegen.ts" }, "dependencies": { diff --git a/packages/liquidation-sdk-viem/test/examples/whitelisted-erc4626-1inch.test.ts b/packages/liquidation-sdk-viem/test/examples/whitelisted-erc4626-1inch.test.ts index dabbbc53..d1eed467 100644 --- a/packages/liquidation-sdk-viem/test/examples/whitelisted-erc4626-1inch.test.ts +++ b/packages/liquidation-sdk-viem/test/examples/whitelisted-erc4626-1inch.test.ts @@ -482,7 +482,7 @@ describe("erc4626-1inch", () => { typeof market.params, "collateralToken" | "loanToken" | "oracle" | "irm" | "lltv" >, - market.getMaxBorrowAssets(collateral) - 10n, + market.getMaxBorrowAssets(collateral)! - 10n, 0n, borrower.address, borrower.address, @@ -534,7 +534,7 @@ describe("erc4626-1inch", () => { client, ); const accruedPosition = accrualPosition.accrueInterest(timestamp); - const seizedCollateral = accruedPosition.seizableCollateral / 2n; + const seizedCollateral = accruedPosition.seizableCollateral! / 2n; mockOneInch(encoder, seizedCollateral, "60475733900"); mockParaSwap(encoder, seizedCollateral, "60475733901"); @@ -592,7 +592,7 @@ describe("erc4626-1inch", () => { args: [market.params, collateral, borrower.address, "0x"], }); - const borrowed = market.getMaxBorrowAssets(collateral) - 1n; + const borrowed = market.getMaxBorrowAssets(collateral)! - 1n; await client.deal({ erc20: loanToken.address, account: borrower.address, @@ -678,7 +678,7 @@ describe("erc4626-1inch", () => { client, ); const accruedPosition = accrualPosition.accrueInterest(timestamp); - const seizedCollateral = accruedPosition.seizableCollateral / 2n; + const seizedCollateral = accruedPosition.seizableCollateral! / 2n; mockOneInch(encoder, seizedCollateral, "11669266773005108147659"); mockParaSwap(encoder, seizedCollateral, "11669266773005108147658"); @@ -746,7 +746,7 @@ describe("erc4626-1inch", () => { typeof market.params, "collateralToken" | "loanToken" | "oracle" | "irm" | "lltv" >, - market.getMaxBorrowAssets(collateral) - 1n, + market.getMaxBorrowAssets(collateral)! - 1n, 0n, borrower.address, borrower.address, @@ -800,7 +800,7 @@ describe("erc4626-1inch", () => { client, ); const accruedPosition = accrualPosition.accrueInterest(timestamp); - const seizedCollateral = accruedPosition.seizableCollateral / 2n; + const seizedCollateral = accruedPosition.seizableCollateral! / 2n; mockPendleOperations( encoder, @@ -874,7 +874,7 @@ describe("erc4626-1inch", () => { typeof market.params, "collateralToken" | "loanToken" | "oracle" | "irm" | "lltv" >, - market.getMaxBorrowAssets(collateral) - 1n, + market.getMaxBorrowAssets(collateral)! - 1n, 0n, borrower.address, borrower.address, @@ -933,7 +933,7 @@ describe("erc4626-1inch", () => { client, ); const accruedPosition = accrualPosition.accrueInterest(postMaturity); - const seizedCollateral = accruedPosition.seizableCollateral / 2n; + const seizedCollateral = accruedPosition.seizableCollateral! / 2n; mockPendleOperations( encoder, @@ -1035,7 +1035,7 @@ describe("erc4626-1inch", () => { typeof market.params, "collateralToken" | "loanToken" | "oracle" | "irm" | "lltv" >, - market.getMaxBorrowAssets(newCollatValue) - 1n, + market.getMaxBorrowAssets(newCollatValue)! - 1n, 0n, borrower.address, borrower.address, @@ -1091,7 +1091,7 @@ describe("erc4626-1inch", () => { client, ); const accruedPosition = accrualPosition.accrueInterest(timestamp); - const seizedCollateral = accruedPosition.seizableCollateral / 2n; + const seizedCollateral = accruedPosition.seizableCollateral! / 2n; const { morphoBlueLiquidate } = LiquidationEncoder.prototype; vi.spyOn( @@ -1175,7 +1175,7 @@ describe("erc4626-1inch", () => { typeof market.params, "collateralToken" | "loanToken" | "oracle" | "irm" | "lltv" >, - market.getMaxBorrowAssets(collateral) - 1n, + market.getMaxBorrowAssets(collateral)! - 1n, 0n, borrower.address, borrower.address, @@ -1231,7 +1231,7 @@ describe("erc4626-1inch", () => { client, ); const accruedPosition = accrualPosition.accrueInterest(timestamp); - const seizedCollateral = accruedPosition.seizableCollateral / 2n; + const seizedCollateral = accruedPosition.seizableCollateral! / 2n; const { morphoBlueLiquidate } = LiquidationEncoder.prototype; vi.spyOn( @@ -1299,7 +1299,7 @@ describe("erc4626-1inch", () => { args: [market.params, collateral, borrower.address, "0x"], }); - const borrowed = market.getMaxBorrowAssets(collateral) - 1n; + const borrowed = market.getMaxBorrowAssets(collateral)! - 1n; await client.deal({ erc20: loanToken.address, account: borrower.address, @@ -1386,7 +1386,7 @@ describe("erc4626-1inch", () => { const accruedPosition = accrualPosition.accrueInterest(timestamp); const usdsWithdrawalAmount = await encoder.previewUSDSWithdrawalAmount( - accruedPosition.seizableCollateral / 2n, + accruedPosition.seizableCollateral! / 2n, ); mockOneInch(encoder, usdsWithdrawalAmount, "11669266773005108147656"); mockParaSwap(encoder, usdsWithdrawalAmount, "11669266773005108147657");