@morpho-org/blue-sdk 5.3.0-next.0 → 5.3.0-next.2

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/lib/errors.d.ts CHANGED
@@ -1,4 +1,9 @@
1
+ import { type Hex } from "viem";
1
2
  import type { Address, MarketId } from "./types.js";
3
+ export declare class InvalidMarketParamsError extends Error {
4
+ readonly data: Hex;
5
+ constructor(data: Hex);
6
+ }
2
7
  export declare class UnknownDataError extends Error {
3
8
  }
4
9
  export declare class UnknownTokenError extends UnknownDataError {
package/lib/errors.js CHANGED
@@ -1,8 +1,16 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.VaultV2Errors = exports.BlueErrors = exports.UnsupportedVaultV2AdapterError = exports.UnsupportedPreLiquidationParamsError = exports.UnsupportedChainIdError = exports.UnknownVaultConfigError = exports.UnknownMarketParamsError = exports.UnknownTokenPriceError = exports.UnknownTokenError = exports.UnknownDataError = void 0;
3
+ exports.VaultV2Errors = exports.BlueErrors = exports.UnsupportedVaultV2AdapterError = exports.UnsupportedPreLiquidationParamsError = exports.UnsupportedChainIdError = exports.UnknownVaultConfigError = exports.UnknownMarketParamsError = exports.UnknownTokenPriceError = exports.UnknownTokenError = exports.UnknownDataError = exports.InvalidMarketParamsError = void 0;
4
4
  exports._try = _try;
5
5
  const viem_1 = require("viem");
6
+ class InvalidMarketParamsError extends Error {
7
+ data;
8
+ constructor(data) {
9
+ super(`cannot decode valid MarketParams from "${data}"`);
10
+ this.data = data;
11
+ }
12
+ }
13
+ exports.InvalidMarketParamsError = InvalidMarketParamsError;
6
14
  class UnknownDataError extends Error {
7
15
  }
8
16
  exports.UnknownDataError = UnknownDataError;
@@ -1,4 +1,5 @@
1
1
  import type { Address, BigIntish, MarketId } from "../types.js";
2
+ import { type Hex } from "viem";
2
3
  export interface IMarketParams {
3
4
  loanToken: Address;
4
5
  collateralToken: Address;
@@ -7,6 +8,25 @@ export interface IMarketParams {
7
8
  lltv: BigIntish;
8
9
  }
9
10
  export type InputMarketParams = Pick<MarketParams, "loanToken" | "collateralToken" | "oracle" | "irm" | "lltv">;
11
+ export declare const marketParamsAbi: {
12
+ readonly type: "tuple";
13
+ readonly components: readonly [{
14
+ readonly type: "address";
15
+ readonly name: "loanToken";
16
+ }, {
17
+ readonly type: "address";
18
+ readonly name: "collateralToken";
19
+ }, {
20
+ readonly type: "address";
21
+ readonly name: "oracle";
22
+ }, {
23
+ readonly type: "address";
24
+ readonly name: "irm";
25
+ }, {
26
+ readonly type: "uint256";
27
+ readonly name: "lltv";
28
+ }];
29
+ };
10
30
  /**
11
31
  * Represents a market's configuration (also called market params).
12
32
  */
@@ -21,6 +41,7 @@ export declare class MarketParams implements IMarketParams {
21
41
  * Returns the canonical idle market configuration for the given loan token.
22
42
  */
23
43
  static idle(token: Address): MarketParams;
44
+ static fromHex(data: Hex): MarketParams;
24
45
  /**
25
46
  * The market's collateral token address.
26
47
  */
@@ -1,9 +1,20 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.MarketParams = void 0;
3
+ exports.MarketParams = exports.marketParamsAbi = void 0;
4
4
  const morpho_ts_1 = require("@morpho-org/morpho-ts");
5
5
  const errors_js_1 = require("../errors.js");
6
+ const viem_1 = require("viem");
6
7
  const MarketUtils_js_1 = require("./MarketUtils.js");
8
+ exports.marketParamsAbi = {
9
+ type: "tuple",
10
+ components: [
11
+ { type: "address", name: "loanToken" },
12
+ { type: "address", name: "collateralToken" },
13
+ { type: "address", name: "oracle" },
14
+ { type: "address", name: "irm" },
15
+ { type: "uint256", name: "lltv" },
16
+ ],
17
+ };
7
18
  /**
8
19
  * Represents a market's configuration (also called market params).
9
20
  */
@@ -31,6 +42,15 @@ class MarketParams {
31
42
  lltv: 0n,
32
43
  });
33
44
  }
45
+ static fromHex(data) {
46
+ try {
47
+ const [marketParams] = (0, viem_1.decodeAbiParameters)([exports.marketParamsAbi], data);
48
+ return new MarketParams(marketParams);
49
+ }
50
+ catch {
51
+ throw new errors_js_1.InvalidMarketParamsError(data);
52
+ }
53
+ }
34
54
  /**
35
55
  * The market's collateral token address.
36
56
  */
@@ -204,5 +204,5 @@ export declare class AccrualVault extends Vault implements IAccrualVault {
204
204
  * Returns a new vault derived from this vault, whose interest has been accrued up to the given timestamp.
205
205
  * @param timestamp The timestamp at which to accrue interest. Must be greater than or equal to each of the vault's market's `lastUpdate`.
206
206
  */
207
- accrueInterest(timestamp: BigIntish): AccrualVault;
207
+ accrueInterest(timestamp?: BigIntish): AccrualVault;
208
208
  }
@@ -6,7 +6,6 @@ const errors_1 = require("../../errors");
6
6
  const math_1 = require("../../math");
7
7
  const token_1 = require("../../token");
8
8
  const utils_1 = require("../../utils");
9
- const VaultV2MorphoVaultV1Adapter_1 = require("./VaultV2MorphoVaultV1Adapter");
10
9
  class VaultV2 extends token_1.WrappedToken {
11
10
  asset;
12
11
  totalAssets;
@@ -73,9 +72,8 @@ class AccrualVaultV2 extends VaultV2 {
73
72
  if (this.liquidityAdapter === viem_1.zeroAddress)
74
73
  return { value: BigInt(assets), limiter: utils_1.CapacityLimitReason.balance };
75
74
  let liquidityAdapterLimit;
76
- if (this.accrualLiquidityAdapter instanceof VaultV2MorphoVaultV1Adapter_1.AccrualVaultV2MorphoVaultV1Adapter) {
75
+ if (this.accrualLiquidityAdapter != null)
77
76
  liquidityAdapterLimit = this.accrualLiquidityAdapter.maxDeposit(this.liquidityData, assets);
78
- }
79
77
  if (this.liquidityAllocations == null || liquidityAdapterLimit == null)
80
78
  throw new errors_1.VaultV2Errors.UnsupportedLiquidityAdapter(this.liquidityAdapter);
81
79
  // At this stage: `liquidityAdapterLimit.value <= assets`
@@ -109,7 +107,7 @@ class AccrualVaultV2 extends VaultV2 {
109
107
  if (this.liquidityAdapter === viem_1.zeroAddress)
110
108
  return { value: BigInt(assets), limiter: utils_1.CapacityLimitReason.balance };
111
109
  let liquidity = this.assetBalance;
112
- if (this.accrualLiquidityAdapter instanceof VaultV2MorphoVaultV1Adapter_1.AccrualVaultV2MorphoVaultV1Adapter)
110
+ if (this.accrualLiquidityAdapter != null)
113
111
  liquidity += this.accrualLiquidityAdapter.maxWithdraw(this.liquidityData).value;
114
112
  if (assets > liquidity)
115
113
  return {
@@ -0,0 +1,30 @@
1
+ import { type Address, type Hex } from "viem";
2
+ import { type IMarketParams, MarketParams } from "../../market";
3
+ import type { AccrualPosition } from "../../position";
4
+ import type { BigIntish } from "../../types";
5
+ import { CapacityLimitReason } from "../../utils";
6
+ import { VaultV2Adapter } from "./VaultV2Adapter";
7
+ import type { IAccrualVaultV2Adapter, IVaultV2Adapter } from "./VaultV2Adapter";
8
+ export interface IVaultV2MorphoMarketV1Adapter extends Omit<IVaultV2Adapter, "adapterId"> {
9
+ marketParamsList: IMarketParams[];
10
+ }
11
+ export declare class VaultV2MorphoMarketV1Adapter extends VaultV2Adapter implements IVaultV2MorphoMarketV1Adapter {
12
+ static adapterId(address: Address): `0x${string}`;
13
+ static collateralId(address: Address): `0x${string}`;
14
+ static marketParamsId(address: Address, params: MarketParams): `0x${string}`;
15
+ marketParamsList: MarketParams[];
16
+ constructor({ marketParamsList, ...vaultV2Adapter }: IVaultV2MorphoMarketV1Adapter);
17
+ ids(params: MarketParams): `0x${string}`[];
18
+ }
19
+ export interface IAccrualVaultV2MorphoMarketV1Adapter extends IVaultV2MorphoMarketV1Adapter {
20
+ }
21
+ export declare class AccrualVaultV2MorphoMarketV1Adapter extends VaultV2MorphoMarketV1Adapter implements IAccrualVaultV2MorphoMarketV1Adapter, IAccrualVaultV2Adapter {
22
+ positions: AccrualPosition[];
23
+ constructor(adapter: IAccrualVaultV2MorphoMarketV1Adapter, positions: AccrualPosition[]);
24
+ realAssets(timestamp?: BigIntish): bigint;
25
+ maxDeposit(_data: Hex, assets: BigIntish): {
26
+ value: bigint;
27
+ limiter: CapacityLimitReason;
28
+ };
29
+ maxWithdraw(data: Hex): import("../../utils").CapacityLimit;
30
+ }
@@ -0,0 +1,59 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AccrualVaultV2MorphoMarketV1Adapter = exports.VaultV2MorphoMarketV1Adapter = void 0;
4
+ const viem_1 = require("viem");
5
+ const market_1 = require("../../market");
6
+ const utils_1 = require("../../utils");
7
+ const VaultV2Adapter_1 = require("./VaultV2Adapter");
8
+ class VaultV2MorphoMarketV1Adapter extends VaultV2Adapter_1.VaultV2Adapter {
9
+ static adapterId(address) {
10
+ return (0, viem_1.keccak256)((0, viem_1.encodeAbiParameters)([{ type: "string" }, { type: "address" }], ["this", address]));
11
+ }
12
+ static collateralId(address) {
13
+ return (0, viem_1.keccak256)((0, viem_1.encodeAbiParameters)([{ type: "string" }, { type: "address" }], ["collateralToken", address]));
14
+ }
15
+ static marketParamsId(address, params) {
16
+ return (0, viem_1.keccak256)((0, viem_1.encodeAbiParameters)([{ type: "string" }, { type: "address" }, market_1.marketParamsAbi], ["this/marketParams", address, params]));
17
+ }
18
+ marketParamsList;
19
+ constructor({ marketParamsList, ...vaultV2Adapter }) {
20
+ super({
21
+ ...vaultV2Adapter,
22
+ adapterId: VaultV2MorphoMarketV1Adapter.adapterId(vaultV2Adapter.address),
23
+ });
24
+ this.marketParamsList = marketParamsList.map((params) => new market_1.MarketParams(params));
25
+ }
26
+ ids(params) {
27
+ return [
28
+ this.adapterId,
29
+ VaultV2MorphoMarketV1Adapter.collateralId(params.collateralToken),
30
+ VaultV2MorphoMarketV1Adapter.marketParamsId(this.address, params),
31
+ ];
32
+ }
33
+ }
34
+ exports.VaultV2MorphoMarketV1Adapter = VaultV2MorphoMarketV1Adapter;
35
+ class AccrualVaultV2MorphoMarketV1Adapter extends VaultV2MorphoMarketV1Adapter {
36
+ positions;
37
+ constructor(adapter, positions) {
38
+ super(adapter);
39
+ this.positions = positions;
40
+ }
41
+ realAssets(timestamp) {
42
+ return this.positions.reduce((total, position) => total + position.accrueInterest(timestamp).supplyAssets, 0n);
43
+ }
44
+ maxDeposit(_data, assets) {
45
+ return {
46
+ value: BigInt(assets),
47
+ limiter: utils_1.CapacityLimitReason.balance,
48
+ };
49
+ }
50
+ maxWithdraw(data) {
51
+ const marketId = market_1.MarketParams.fromHex(data).id;
52
+ const position = this.positions.find((position) => position.marketId === marketId);
53
+ return (position?.market?.getWithdrawCapacityLimit(position) ?? {
54
+ value: 0n,
55
+ limiter: utils_1.CapacityLimitReason.position,
56
+ });
57
+ }
58
+ }
59
+ exports.AccrualVaultV2MorphoMarketV1Adapter = AccrualVaultV2MorphoMarketV1Adapter;
@@ -1,6 +1,6 @@
1
1
  import { type Address, type Hex } from "viem";
2
2
  import { VaultV2Adapter } from "./VaultV2Adapter";
3
- export interface IVaultV2MorphoVaultV1Adapter extends IVaultV2Adapter {
3
+ export interface IVaultV2MorphoVaultV1Adapter extends Omit<IVaultV2Adapter, "adapterId"> {
4
4
  morphoVaultV1: Address;
5
5
  }
6
6
  import type { BigIntish } from "../../types";
@@ -18,7 +18,7 @@ export declare class AccrualVaultV2MorphoVaultV1Adapter extends VaultV2MorphoVau
18
18
  accrualVaultV1: AccrualVault;
19
19
  shares: bigint;
20
20
  constructor(adapter: IAccrualVaultV2MorphoVaultV1Adapter, accrualVaultV1: AccrualVault, shares: bigint);
21
- realAssets(timestamp: BigIntish): bigint;
21
+ realAssets(timestamp?: BigIntish): bigint;
22
22
  maxDeposit(_data: Hex, assets: BigIntish): import("../..").CapacityLimit;
23
23
  maxWithdraw(_data: Hex): import("../..").CapacityLimit;
24
24
  }
@@ -1,3 +1,4 @@
1
1
  export * from "./VaultV2.js";
2
2
  export * from "./VaultV2Adapter.js";
3
+ export * from "./VaultV2MorphoMarketV1Adapter.js";
3
4
  export * from "./VaultV2MorphoVaultV1Adapter.js";
@@ -16,4 +16,5 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
17
  __exportStar(require("./VaultV2.js"), exports);
18
18
  __exportStar(require("./VaultV2Adapter.js"), exports);
19
+ __exportStar(require("./VaultV2MorphoMarketV1Adapter.js"), exports);
19
20
  __exportStar(require("./VaultV2MorphoVaultV1Adapter.js"), exports);
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@morpho-org/blue-sdk",
3
3
  "description": "Framework-agnostic package that defines Morpho-related entity classes (such as `Market`, `Token`, `Vault`).",
4
- "version": "5.3.0-next.0",
4
+ "version": "5.3.0-next.2",
5
5
  "author": "Morpho Association <contact@morpho.org>",
6
6
  "contributors": [
7
7
  "Rubilmax <rmilon@gmail.com>"