@defisaver/positions-sdk 0.0.5 → 0.0.7

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.
Files changed (72) hide show
  1. package/cjs/aaveV2/index.d.ts +2 -2
  2. package/cjs/aaveV2/index.js +5 -3
  3. package/cjs/aaveV3/index.js +1 -1
  4. package/cjs/chickenBonds/index.js +2 -1
  5. package/cjs/compoundV3/index.d.ts +2 -2
  6. package/cjs/compoundV3/index.js +8 -5
  7. package/cjs/config/contracts.d.ts +144 -0
  8. package/cjs/config/contracts.js +18 -0
  9. package/cjs/contracts.d.ts +3 -0
  10. package/cjs/contracts.js +4 -1
  11. package/cjs/helpers/aaveHelpers/index.js +14 -2
  12. package/cjs/helpers/chickenBondsHelpers/index.d.ts +1 -0
  13. package/cjs/helpers/chickenBondsHelpers/index.js +14 -1
  14. package/cjs/helpers/compoundHelpers/index.d.ts +2 -2
  15. package/cjs/helpers/compoundHelpers/index.js +5 -4
  16. package/cjs/morphoAaveV2/index.d.ts +2 -2
  17. package/cjs/morphoAaveV2/index.js +5 -3
  18. package/cjs/services/priceService.d.ts +4 -0
  19. package/cjs/services/priceService.js +36 -0
  20. package/cjs/types/chickenBonds.d.ts +1 -0
  21. package/cjs/types/contracts/generated/COMPPriceFeed.d.ts +135 -0
  22. package/cjs/types/contracts/generated/COMPPriceFeed.js +5 -0
  23. package/cjs/types/contracts/generated/ETHPriceFeed.d.ts +135 -0
  24. package/cjs/types/contracts/generated/ETHPriceFeed.js +5 -0
  25. package/cjs/types/contracts/generated/USDCPriceFeed.d.ts +135 -0
  26. package/cjs/types/contracts/generated/USDCPriceFeed.js +5 -0
  27. package/cjs/types/contracts/generated/index.d.ts +3 -0
  28. package/esm/aaveV2/index.d.ts +2 -2
  29. package/esm/aaveV2/index.js +5 -3
  30. package/esm/aaveV3/index.js +1 -1
  31. package/esm/chickenBonds/index.js +3 -2
  32. package/esm/compoundV3/index.d.ts +2 -2
  33. package/esm/compoundV3/index.js +8 -5
  34. package/esm/config/contracts.d.ts +144 -0
  35. package/esm/config/contracts.js +18 -0
  36. package/esm/contracts.d.ts +3 -0
  37. package/esm/contracts.js +3 -0
  38. package/esm/helpers/aaveHelpers/index.js +14 -2
  39. package/esm/helpers/chickenBondsHelpers/index.d.ts +1 -0
  40. package/esm/helpers/chickenBondsHelpers/index.js +12 -0
  41. package/esm/helpers/compoundHelpers/index.d.ts +2 -2
  42. package/esm/helpers/compoundHelpers/index.js +5 -4
  43. package/esm/morphoAaveV2/index.d.ts +2 -2
  44. package/esm/morphoAaveV2/index.js +5 -3
  45. package/esm/services/priceService.d.ts +4 -0
  46. package/esm/services/priceService.js +27 -0
  47. package/esm/types/chickenBonds.d.ts +1 -0
  48. package/esm/types/contracts/generated/COMPPriceFeed.d.ts +135 -0
  49. package/esm/types/contracts/generated/COMPPriceFeed.js +4 -0
  50. package/esm/types/contracts/generated/ETHPriceFeed.d.ts +135 -0
  51. package/esm/types/contracts/generated/ETHPriceFeed.js +4 -0
  52. package/esm/types/contracts/generated/USDCPriceFeed.d.ts +135 -0
  53. package/esm/types/contracts/generated/USDCPriceFeed.js +4 -0
  54. package/esm/types/contracts/generated/index.d.ts +3 -0
  55. package/package.json +1 -1
  56. package/src/aaveV2/index.ts +5 -3
  57. package/src/aaveV3/index.ts +1 -0
  58. package/src/chickenBonds/index.ts +3 -2
  59. package/src/compoundV3/index.ts +8 -5
  60. package/src/config/contracts.js +18 -0
  61. package/src/contracts.ts +5 -1
  62. package/src/helpers/aaveHelpers/index.ts +16 -2
  63. package/src/helpers/chickenBondsHelpers/index.ts +11 -0
  64. package/src/helpers/compoundHelpers/index.ts +7 -4
  65. package/src/morphoAaveV2/index.ts +5 -3
  66. package/src/services/priceService.ts +22 -0
  67. package/src/types/chickenBonds.ts +1 -0
  68. package/src/types/contracts/generated/COMPPriceFeed.ts +202 -0
  69. package/src/types/contracts/generated/ETHPriceFeed.ts +202 -0
  70. package/src/types/contracts/generated/USDCPriceFeed.ts +202 -0
  71. package/src/types/contracts/generated/index.ts +3 -0
  72. package/yarn-error.log +64 -0
@@ -0,0 +1,135 @@
1
+ /// <reference types="node" />
2
+ import type BN from "bn.js";
3
+ import type { ContractOptions } from "web3-eth-contract";
4
+ import type { EventLog } from "web3-core";
5
+ import type { EventEmitter } from "events";
6
+ import type { Callback, NonPayableTransactionObject, BlockType, ContractEventLog, BaseContract } from "./types";
7
+ export interface EventOptions {
8
+ filter?: object;
9
+ fromBlock?: BlockType;
10
+ topics?: string[];
11
+ }
12
+ export type AnswerUpdated = ContractEventLog<{
13
+ current: string;
14
+ roundId: string;
15
+ updatedAt: string;
16
+ 0: string;
17
+ 1: string;
18
+ 2: string;
19
+ }>;
20
+ export type NewRound = ContractEventLog<{
21
+ roundId: string;
22
+ startedBy: string;
23
+ startedAt: string;
24
+ 0: string;
25
+ 1: string;
26
+ 2: string;
27
+ }>;
28
+ export type OwnershipTransferRequested = ContractEventLog<{
29
+ from: string;
30
+ to: string;
31
+ 0: string;
32
+ 1: string;
33
+ }>;
34
+ export type OwnershipTransferred = ContractEventLog<{
35
+ from: string;
36
+ to: string;
37
+ 0: string;
38
+ 1: string;
39
+ }>;
40
+ export interface ETHPriceFeed extends BaseContract {
41
+ constructor(jsonInterface: any[], address?: string, options?: ContractOptions): ETHPriceFeed;
42
+ clone(): ETHPriceFeed;
43
+ methods: {
44
+ acceptOwnership(): NonPayableTransactionObject<void>;
45
+ accessController(): NonPayableTransactionObject<string>;
46
+ aggregator(): NonPayableTransactionObject<string>;
47
+ confirmAggregator(_aggregator: string): NonPayableTransactionObject<void>;
48
+ decimals(): NonPayableTransactionObject<string>;
49
+ description(): NonPayableTransactionObject<string>;
50
+ getAnswer(_roundId: number | string | BN): NonPayableTransactionObject<string>;
51
+ getRoundData(_roundId: number | string | BN): NonPayableTransactionObject<[
52
+ string,
53
+ string,
54
+ string,
55
+ string,
56
+ string
57
+ ] & {
58
+ roundId: string;
59
+ answer: string;
60
+ startedAt: string;
61
+ updatedAt: string;
62
+ answeredInRound: string;
63
+ }>;
64
+ getTimestamp(_roundId: number | string | BN): NonPayableTransactionObject<string>;
65
+ latestAnswer(): NonPayableTransactionObject<string>;
66
+ latestRound(): NonPayableTransactionObject<string>;
67
+ latestRoundData(): NonPayableTransactionObject<[
68
+ string,
69
+ string,
70
+ string,
71
+ string,
72
+ string
73
+ ] & {
74
+ roundId: string;
75
+ answer: string;
76
+ startedAt: string;
77
+ updatedAt: string;
78
+ answeredInRound: string;
79
+ }>;
80
+ latestTimestamp(): NonPayableTransactionObject<string>;
81
+ owner(): NonPayableTransactionObject<string>;
82
+ phaseAggregators(arg0: number | string | BN): NonPayableTransactionObject<string>;
83
+ phaseId(): NonPayableTransactionObject<string>;
84
+ proposeAggregator(_aggregator: string): NonPayableTransactionObject<void>;
85
+ proposedAggregator(): NonPayableTransactionObject<string>;
86
+ proposedGetRoundData(_roundId: number | string | BN): NonPayableTransactionObject<[
87
+ string,
88
+ string,
89
+ string,
90
+ string,
91
+ string
92
+ ] & {
93
+ roundId: string;
94
+ answer: string;
95
+ startedAt: string;
96
+ updatedAt: string;
97
+ answeredInRound: string;
98
+ }>;
99
+ proposedLatestRoundData(): NonPayableTransactionObject<[
100
+ string,
101
+ string,
102
+ string,
103
+ string,
104
+ string
105
+ ] & {
106
+ roundId: string;
107
+ answer: string;
108
+ startedAt: string;
109
+ updatedAt: string;
110
+ answeredInRound: string;
111
+ }>;
112
+ setController(_accessController: string): NonPayableTransactionObject<void>;
113
+ transferOwnership(_to: string): NonPayableTransactionObject<void>;
114
+ version(): NonPayableTransactionObject<string>;
115
+ };
116
+ events: {
117
+ AnswerUpdated(cb?: Callback<AnswerUpdated>): EventEmitter;
118
+ AnswerUpdated(options?: EventOptions, cb?: Callback<AnswerUpdated>): EventEmitter;
119
+ NewRound(cb?: Callback<NewRound>): EventEmitter;
120
+ NewRound(options?: EventOptions, cb?: Callback<NewRound>): EventEmitter;
121
+ OwnershipTransferRequested(cb?: Callback<OwnershipTransferRequested>): EventEmitter;
122
+ OwnershipTransferRequested(options?: EventOptions, cb?: Callback<OwnershipTransferRequested>): EventEmitter;
123
+ OwnershipTransferred(cb?: Callback<OwnershipTransferred>): EventEmitter;
124
+ OwnershipTransferred(options?: EventOptions, cb?: Callback<OwnershipTransferred>): EventEmitter;
125
+ allEvents(options?: EventOptions, cb?: Callback<EventLog>): EventEmitter;
126
+ };
127
+ once(event: "AnswerUpdated", cb: Callback<AnswerUpdated>): void;
128
+ once(event: "AnswerUpdated", options: EventOptions, cb: Callback<AnswerUpdated>): void;
129
+ once(event: "NewRound", cb: Callback<NewRound>): void;
130
+ once(event: "NewRound", options: EventOptions, cb: Callback<NewRound>): void;
131
+ once(event: "OwnershipTransferRequested", cb: Callback<OwnershipTransferRequested>): void;
132
+ once(event: "OwnershipTransferRequested", options: EventOptions, cb: Callback<OwnershipTransferRequested>): void;
133
+ once(event: "OwnershipTransferred", cb: Callback<OwnershipTransferred>): void;
134
+ once(event: "OwnershipTransferred", options: EventOptions, cb: Callback<OwnershipTransferred>): void;
135
+ }
@@ -0,0 +1,4 @@
1
+ /* Autogenerated file. Do not edit manually. */
2
+ /* tslint:disable */
3
+ /* eslint-disable */
4
+ export {};
@@ -0,0 +1,135 @@
1
+ /// <reference types="node" />
2
+ import type BN from "bn.js";
3
+ import type { ContractOptions } from "web3-eth-contract";
4
+ import type { EventLog } from "web3-core";
5
+ import type { EventEmitter } from "events";
6
+ import type { Callback, NonPayableTransactionObject, BlockType, ContractEventLog, BaseContract } from "./types";
7
+ export interface EventOptions {
8
+ filter?: object;
9
+ fromBlock?: BlockType;
10
+ topics?: string[];
11
+ }
12
+ export type AnswerUpdated = ContractEventLog<{
13
+ current: string;
14
+ roundId: string;
15
+ updatedAt: string;
16
+ 0: string;
17
+ 1: string;
18
+ 2: string;
19
+ }>;
20
+ export type NewRound = ContractEventLog<{
21
+ roundId: string;
22
+ startedBy: string;
23
+ startedAt: string;
24
+ 0: string;
25
+ 1: string;
26
+ 2: string;
27
+ }>;
28
+ export type OwnershipTransferRequested = ContractEventLog<{
29
+ from: string;
30
+ to: string;
31
+ 0: string;
32
+ 1: string;
33
+ }>;
34
+ export type OwnershipTransferred = ContractEventLog<{
35
+ from: string;
36
+ to: string;
37
+ 0: string;
38
+ 1: string;
39
+ }>;
40
+ export interface USDCPriceFeed extends BaseContract {
41
+ constructor(jsonInterface: any[], address?: string, options?: ContractOptions): USDCPriceFeed;
42
+ clone(): USDCPriceFeed;
43
+ methods: {
44
+ acceptOwnership(): NonPayableTransactionObject<void>;
45
+ accessController(): NonPayableTransactionObject<string>;
46
+ aggregator(): NonPayableTransactionObject<string>;
47
+ confirmAggregator(_aggregator: string): NonPayableTransactionObject<void>;
48
+ decimals(): NonPayableTransactionObject<string>;
49
+ description(): NonPayableTransactionObject<string>;
50
+ getAnswer(_roundId: number | string | BN): NonPayableTransactionObject<string>;
51
+ getRoundData(_roundId: number | string | BN): NonPayableTransactionObject<[
52
+ string,
53
+ string,
54
+ string,
55
+ string,
56
+ string
57
+ ] & {
58
+ roundId: string;
59
+ answer: string;
60
+ startedAt: string;
61
+ updatedAt: string;
62
+ answeredInRound: string;
63
+ }>;
64
+ getTimestamp(_roundId: number | string | BN): NonPayableTransactionObject<string>;
65
+ latestAnswer(): NonPayableTransactionObject<string>;
66
+ latestRound(): NonPayableTransactionObject<string>;
67
+ latestRoundData(): NonPayableTransactionObject<[
68
+ string,
69
+ string,
70
+ string,
71
+ string,
72
+ string
73
+ ] & {
74
+ roundId: string;
75
+ answer: string;
76
+ startedAt: string;
77
+ updatedAt: string;
78
+ answeredInRound: string;
79
+ }>;
80
+ latestTimestamp(): NonPayableTransactionObject<string>;
81
+ owner(): NonPayableTransactionObject<string>;
82
+ phaseAggregators(arg0: number | string | BN): NonPayableTransactionObject<string>;
83
+ phaseId(): NonPayableTransactionObject<string>;
84
+ proposeAggregator(_aggregator: string): NonPayableTransactionObject<void>;
85
+ proposedAggregator(): NonPayableTransactionObject<string>;
86
+ proposedGetRoundData(_roundId: number | string | BN): NonPayableTransactionObject<[
87
+ string,
88
+ string,
89
+ string,
90
+ string,
91
+ string
92
+ ] & {
93
+ roundId: string;
94
+ answer: string;
95
+ startedAt: string;
96
+ updatedAt: string;
97
+ answeredInRound: string;
98
+ }>;
99
+ proposedLatestRoundData(): NonPayableTransactionObject<[
100
+ string,
101
+ string,
102
+ string,
103
+ string,
104
+ string
105
+ ] & {
106
+ roundId: string;
107
+ answer: string;
108
+ startedAt: string;
109
+ updatedAt: string;
110
+ answeredInRound: string;
111
+ }>;
112
+ setController(_accessController: string): NonPayableTransactionObject<void>;
113
+ transferOwnership(_to: string): NonPayableTransactionObject<void>;
114
+ version(): NonPayableTransactionObject<string>;
115
+ };
116
+ events: {
117
+ AnswerUpdated(cb?: Callback<AnswerUpdated>): EventEmitter;
118
+ AnswerUpdated(options?: EventOptions, cb?: Callback<AnswerUpdated>): EventEmitter;
119
+ NewRound(cb?: Callback<NewRound>): EventEmitter;
120
+ NewRound(options?: EventOptions, cb?: Callback<NewRound>): EventEmitter;
121
+ OwnershipTransferRequested(cb?: Callback<OwnershipTransferRequested>): EventEmitter;
122
+ OwnershipTransferRequested(options?: EventOptions, cb?: Callback<OwnershipTransferRequested>): EventEmitter;
123
+ OwnershipTransferred(cb?: Callback<OwnershipTransferred>): EventEmitter;
124
+ OwnershipTransferred(options?: EventOptions, cb?: Callback<OwnershipTransferred>): EventEmitter;
125
+ allEvents(options?: EventOptions, cb?: Callback<EventLog>): EventEmitter;
126
+ };
127
+ once(event: "AnswerUpdated", cb: Callback<AnswerUpdated>): void;
128
+ once(event: "AnswerUpdated", options: EventOptions, cb: Callback<AnswerUpdated>): void;
129
+ once(event: "NewRound", cb: Callback<NewRound>): void;
130
+ once(event: "NewRound", options: EventOptions, cb: Callback<NewRound>): void;
131
+ once(event: "OwnershipTransferRequested", cb: Callback<OwnershipTransferRequested>): void;
132
+ once(event: "OwnershipTransferRequested", options: EventOptions, cb: Callback<OwnershipTransferRequested>): void;
133
+ once(event: "OwnershipTransferred", cb: Callback<OwnershipTransferred>): void;
134
+ once(event: "OwnershipTransferred", options: EventOptions, cb: Callback<OwnershipTransferred>): void;
135
+ }
@@ -0,0 +1,4 @@
1
+ /* Autogenerated file. Do not edit manually. */
2
+ /* tslint:disable */
3
+ /* eslint-disable */
4
+ export {};
@@ -7,6 +7,7 @@ export type { AaveV3PoolAddressesProvider } from "./AaveV3PoolAddressesProvider"
7
7
  export type { AaveV3ProtocolDataProvider } from "./AaveV3ProtocolDataProvider";
8
8
  export type { AaveV3View } from "./AaveV3View";
9
9
  export type { BalanceScanner } from "./BalanceScanner";
10
+ export type { COMPPriceFeed } from "./COMPPriceFeed";
10
11
  export type { CbEth } from "./CbEth";
11
12
  export type { ChickenBondsManager } from "./ChickenBondsManager";
12
13
  export type { ChickenBondsView } from "./ChickenBondsView";
@@ -17,6 +18,7 @@ export type { CompV3USDbCBulker } from "./CompV3USDbCBulker";
17
18
  export type { CompV3View } from "./CompV3View";
18
19
  export type { CompoundLoanInfo } from "./CompoundLoanInfo";
19
20
  export type { Comptroller } from "./Comptroller";
21
+ export type { ETHPriceFeed } from "./ETHPriceFeed";
20
22
  export type { Erc20 } from "./Erc20";
21
23
  export type { GHO } from "./GHO";
22
24
  export type { GhoDiscountRateStrategy } from "./GhoDiscountRateStrategy";
@@ -43,6 +45,7 @@ export type { SparkPoolAddressesProvider } from "./SparkPoolAddressesProvider";
43
45
  export type { SparkProtocolDataProvider } from "./SparkProtocolDataProvider";
44
46
  export type { SparkView } from "./SparkView";
45
47
  export type { TroveManager } from "./TroveManager";
48
+ export type { USDCPriceFeed } from "./USDCPriceFeed";
46
49
  export type { UniMulticall } from "./UniMulticall";
47
50
  export type { CETHv3 } from "./CETHv3";
48
51
  export type { CUSDCv3 } from "./CUSDCv3";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@defisaver/positions-sdk",
3
- "version": "0.0.5",
3
+ "version": "0.0.7",
4
4
  "description": "",
5
5
  "main": "./cjs/index.js",
6
6
  "module": "./esm/index.js",
@@ -15,8 +15,10 @@ import {
15
15
  import { EMPTY_AAVE_DATA } from '../aaveV3';
16
16
  import { AAVE_V2 } from '../markets/aave';
17
17
  import { aaveAnyGetAggregatedPositionData } from '../helpers/aaveHelpers';
18
+ import { getEthPrice } from '../services/priceService';
18
19
 
19
- export const getAaveV2MarketsData = async (web3: Web3, network: NetworkNumber, selectedMarket: AaveMarketInfo, ethPrice: string, mainnetWeb3: Web3) => {
20
+ export const getAaveV2MarketsData = async (web3: Web3, network: NetworkNumber, selectedMarket: AaveMarketInfo, mainnetWeb3: Web3) => {
21
+ const ethPrice = await getEthPrice(mainnetWeb3);
20
22
  const _addresses = selectedMarket.assets.map(a => getAssetInfo(ethToWeth(a)).address);
21
23
  const loanInfoContract = AaveLoanInfoV2Contract(web3, network);
22
24
  const marketAddress = selectedMarket.providerAddress;
@@ -212,8 +214,8 @@ export const getAaveV2AccountData = async (web3: Web3, network: NetworkNumber, a
212
214
  return payload;
213
215
  };
214
216
 
215
- export const getAaveV2FullPositionData = async (web3: Web3, network: NetworkNumber, address: string, market: AaveMarketInfo, ethPrice: string, mainnetWeb3: Web3): Promise<AaveV2PositionData> => {
216
- const marketData = await getAaveV2MarketsData(web3, network, market, ethPrice, mainnetWeb3);
217
+ export const getAaveV2FullPositionData = async (web3: Web3, network: NetworkNumber, address: string, market: AaveMarketInfo, mainnetWeb3: Web3): Promise<AaveV2PositionData> => {
218
+ const marketData = await getAaveV2MarketsData(web3, network, market, mainnetWeb3);
217
219
  const positionData = await getAaveV2AccountData(web3, network, address, marketData.assetsData, market);
218
220
  return positionData;
219
221
  };
@@ -237,6 +237,7 @@ export async function getAaveV3MarketData(web3: Web3, network: NetworkNumber, ma
237
237
  collateralFactor: new Dec(tokenMarket.ltv).div(10000).toString(),
238
238
  priceSource: tokenMarket.priceSource,
239
239
  },
240
+ aTokenAddress: tokenMarket.aTokenAddress,
240
241
  });
241
242
  }));
242
243
 
@@ -9,7 +9,7 @@ import {
9
9
  import { ChickenBondsManagerContract, ChickenBondsViewContract } from '../contracts';
10
10
  import { BondInfoBasic, ChickenBondsSystemInfoBasic } from '../types';
11
11
  import { multicall } from '../multicall';
12
- import { calcAverageBondAgeMs, calcCBondsBLUSDFloorPrice } from '../helpers/chickenBondsHelpers';
12
+ import { calcAverageBondAgeMs, calcCBondsBLUSDFloorPrice, decodeTokenURIToSvg } from '../helpers/chickenBondsHelpers';
13
13
 
14
14
  export const getChickenBondsAccountBalances = async (web3: Web3, network: NetworkNumber, block: Blockish, addressMapping: boolean, bondId: string): Promise<PositionBalances> => {
15
15
  const viewContract = ChickenBondsViewContract(web3, network, block);
@@ -94,7 +94,7 @@ export const fetchCBondsForUser = async (web3: Web3, network: NetworkNumber, add
94
94
  }) => ({
95
95
  bondId: bondID,
96
96
  status,
97
- // tokenURI: decodeTokenURIToSvg(tokenURI),
97
+ tokenURI: decodeTokenURIToSvg(tokenURI),
98
98
  startTime: new Date(+startTime * 1000),
99
99
  endTime: new Date(+endTime * 1000),
100
100
  accruedBLUSD: assetAmountInEth(accruedBLUSD, 'bLUSD'),
@@ -118,5 +118,6 @@ export const fetchCBondForId = async (web3: Web3, network: NetworkNumber, bondId
118
118
  claimedBLUSD: assetAmountInEth(bond.claimedBLUSD, 'bLUSD'),
119
119
  lusdAmount: assetAmountInEth(bond.lusdAmount, 'LUSD'),
120
120
  maxAmountBLUSD: assetAmountInEth(bond.maxAmountBLUSD, 'bLUSD'),
121
+ tokenURI: decodeTokenURIToSvg(bond.tokenURI),
121
122
  };
122
123
  };
@@ -21,8 +21,11 @@ import {
21
21
  formatBaseData, formatMarketData, getCompoundV3AggregatedData, getIncentiveApys,
22
22
  } from '../helpers/compoundHelpers';
23
23
  import { COMPOUND_V3_ETH, COMPOUND_V3_USDBC, COMPOUND_V3_USDC } from '../markets/compound';
24
+ import { getEthPrice, getCompPrice, getUSDCPrice } from '../services/priceService';
24
25
 
25
- export const getCompoundV3MarketsData = async (web3: Web3, network: NetworkNumber, selectedMarket: CompoundMarketData, compPrice: string, defaultWeb3: Web3): Promise<CompoundV3MarketsData> => {
26
+ export const getCompoundV3MarketsData = async (web3: Web3, network: NetworkNumber, selectedMarket: CompoundMarketData, defaultWeb3: Web3): Promise<CompoundV3MarketsData> => {
27
+ const baseAssetPrice = selectedMarket.baseAsset === 'ETH' ? await getEthPrice(defaultWeb3) : await getUSDCPrice(defaultWeb3);
28
+ const compPrice = await getCompPrice(defaultWeb3);
26
29
  const contract = CompV3ViewContract(web3, network);
27
30
  const CompV3ViewAddress = contract.options.address;
28
31
  const calls = [
@@ -38,7 +41,7 @@ export const getCompoundV3MarketsData = async (web3: Web3, network: NetworkNumbe
38
41
  },
39
42
  ];
40
43
  const data = await multicall(calls, web3, network);
41
- const colls = data[1].colls.map((coll: any) => formatMarketData(coll, network)) as CompoundV3AssetData[];
44
+ const colls = data[1].colls.map((coll: any) => formatMarketData(coll, network, baseAssetPrice)) as CompoundV3AssetData[];
42
45
  if (selectedMarket.value === CompoundVersions.CompoundV3ETH) {
43
46
  for (const coll of colls) {
44
47
  if (coll.symbol === 'wstETH') {
@@ -65,7 +68,7 @@ export const getCompoundV3MarketsData = async (web3: Web3, network: NetworkNumbe
65
68
  }
66
69
  }
67
70
  }
68
- const base = formatBaseData(data[0].baseToken, network);
71
+ const base = formatBaseData(data[0].baseToken, network, baseAssetPrice);
69
72
 
70
73
  const payload: CompoundV3AssetsData = {};
71
74
 
@@ -252,8 +255,8 @@ export const getCompoundV3AccountData = async (
252
255
  return payload;
253
256
  };
254
257
 
255
- export const getCompoundV3FullPositionData = async (web3: Web3, network: NetworkNumber, address: string, proxyAddress: string, selectedMarket: CompoundMarketData, compPrice: string, mainnetWeb3: Web3): Promise<CompoundV3PositionData> => {
256
- const marketData = await getCompoundV3MarketsData(web3, network, selectedMarket, compPrice, mainnetWeb3);
258
+ export const getCompoundV3FullPositionData = async (web3: Web3, network: NetworkNumber, address: string, proxyAddress: string, selectedMarket: CompoundMarketData, mainnetWeb3: Web3): Promise<CompoundV3PositionData> => {
259
+ const marketData = await getCompoundV3MarketsData(web3, network, selectedMarket, mainnetWeb3);
257
260
  const positionData = await getCompoundV3AccountData(web3, network, address, proxyAddress, { selectedMarket, assetsData: marketData.assetsData });
258
261
  return positionData;
259
262
  };
@@ -597,5 +597,23 @@ module.exports = {
597
597
  "networks": {
598
598
  "1": { "address": "0x57619FE9C539f890b19c61812226F9703ce37137" }
599
599
  }
600
+ },
601
+ "COMPPriceFeed": {
602
+ "abi": [{"inputs":[{"internalType":"address","name":"_aggregator","type":"address"},{"internalType":"address","name":"_accessController","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"int256","name":"current","type":"int256"},{"indexed":true,"internalType":"uint256","name":"roundId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"updatedAt","type":"uint256"}],"name":"AnswerUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"roundId","type":"uint256"},{"indexed":true,"internalType":"address","name":"startedBy","type":"address"},{"indexed":false,"internalType":"uint256","name":"startedAt","type":"uint256"}],"name":"NewRound","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"OwnershipTransferRequested","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"accessController","outputs":[{"internalType":"contract AccessControllerInterface","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"aggregator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_aggregator","type":"address"}],"name":"confirmAggregator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"description","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_roundId","type":"uint256"}],"name":"getAnswer","outputs":[{"internalType":"int256","name":"","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint80","name":"_roundId","type":"uint80"}],"name":"getRoundData","outputs":[{"internalType":"uint80","name":"roundId","type":"uint80"},{"internalType":"int256","name":"answer","type":"int256"},{"internalType":"uint256","name":"startedAt","type":"uint256"},{"internalType":"uint256","name":"updatedAt","type":"uint256"},{"internalType":"uint80","name":"answeredInRound","type":"uint80"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_roundId","type":"uint256"}],"name":"getTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"latestAnswer","outputs":[{"internalType":"int256","name":"","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"latestRound","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"latestRoundData","outputs":[{"internalType":"uint80","name":"roundId","type":"uint80"},{"internalType":"int256","name":"answer","type":"int256"},{"internalType":"uint256","name":"startedAt","type":"uint256"},{"internalType":"uint256","name":"updatedAt","type":"uint256"},{"internalType":"uint80","name":"answeredInRound","type":"uint80"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"latestTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"}],"name":"phaseAggregators","outputs":[{"internalType":"contract AggregatorV2V3Interface","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"phaseId","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_aggregator","type":"address"}],"name":"proposeAggregator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"proposedAggregator","outputs":[{"internalType":"contract AggregatorV2V3Interface","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint80","name":"_roundId","type":"uint80"}],"name":"proposedGetRoundData","outputs":[{"internalType":"uint80","name":"roundId","type":"uint80"},{"internalType":"int256","name":"answer","type":"int256"},{"internalType":"uint256","name":"startedAt","type":"uint256"},{"internalType":"uint256","name":"updatedAt","type":"uint256"},{"internalType":"uint80","name":"answeredInRound","type":"uint80"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proposedLatestRoundData","outputs":[{"internalType":"uint80","name":"roundId","type":"uint80"},{"internalType":"int256","name":"answer","type":"int256"},{"internalType":"uint256","name":"startedAt","type":"uint256"},{"internalType":"uint256","name":"updatedAt","type":"uint256"},{"internalType":"uint80","name":"answeredInRound","type":"uint80"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_accessController","type":"address"}],"name":"setController","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"version","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}],
603
+ "networks": {
604
+ "1": { "address": "0xdbd020CAeF83eFd542f4De03e3cF0C28A4428bd5" }
605
+ }
606
+ },
607
+ "ETHPriceFeed": {
608
+ "abi": [{"inputs":[{"internalType":"address","name":"_aggregator","type":"address"},{"internalType":"address","name":"_accessController","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"int256","name":"current","type":"int256"},{"indexed":true,"internalType":"uint256","name":"roundId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"updatedAt","type":"uint256"}],"name":"AnswerUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"roundId","type":"uint256"},{"indexed":true,"internalType":"address","name":"startedBy","type":"address"},{"indexed":false,"internalType":"uint256","name":"startedAt","type":"uint256"}],"name":"NewRound","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"OwnershipTransferRequested","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"accessController","outputs":[{"internalType":"contract AccessControllerInterface","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"aggregator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_aggregator","type":"address"}],"name":"confirmAggregator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"description","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_roundId","type":"uint256"}],"name":"getAnswer","outputs":[{"internalType":"int256","name":"","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint80","name":"_roundId","type":"uint80"}],"name":"getRoundData","outputs":[{"internalType":"uint80","name":"roundId","type":"uint80"},{"internalType":"int256","name":"answer","type":"int256"},{"internalType":"uint256","name":"startedAt","type":"uint256"},{"internalType":"uint256","name":"updatedAt","type":"uint256"},{"internalType":"uint80","name":"answeredInRound","type":"uint80"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_roundId","type":"uint256"}],"name":"getTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"latestAnswer","outputs":[{"internalType":"int256","name":"","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"latestRound","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"latestRoundData","outputs":[{"internalType":"uint80","name":"roundId","type":"uint80"},{"internalType":"int256","name":"answer","type":"int256"},{"internalType":"uint256","name":"startedAt","type":"uint256"},{"internalType":"uint256","name":"updatedAt","type":"uint256"},{"internalType":"uint80","name":"answeredInRound","type":"uint80"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"latestTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"}],"name":"phaseAggregators","outputs":[{"internalType":"contract AggregatorV2V3Interface","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"phaseId","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_aggregator","type":"address"}],"name":"proposeAggregator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"proposedAggregator","outputs":[{"internalType":"contract AggregatorV2V3Interface","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint80","name":"_roundId","type":"uint80"}],"name":"proposedGetRoundData","outputs":[{"internalType":"uint80","name":"roundId","type":"uint80"},{"internalType":"int256","name":"answer","type":"int256"},{"internalType":"uint256","name":"startedAt","type":"uint256"},{"internalType":"uint256","name":"updatedAt","type":"uint256"},{"internalType":"uint80","name":"answeredInRound","type":"uint80"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proposedLatestRoundData","outputs":[{"internalType":"uint80","name":"roundId","type":"uint80"},{"internalType":"int256","name":"answer","type":"int256"},{"internalType":"uint256","name":"startedAt","type":"uint256"},{"internalType":"uint256","name":"updatedAt","type":"uint256"},{"internalType":"uint80","name":"answeredInRound","type":"uint80"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_accessController","type":"address"}],"name":"setController","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"version","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}],
609
+ "networks": {
610
+ "1": { "address": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419" }
611
+ },
612
+ },
613
+ "USDCPriceFeed": {
614
+ "abi": [{"inputs":[{"internalType":"address","name":"_aggregator","type":"address"},{"internalType":"address","name":"_accessController","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"int256","name":"current","type":"int256"},{"indexed":true,"internalType":"uint256","name":"roundId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"updatedAt","type":"uint256"}],"name":"AnswerUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"roundId","type":"uint256"},{"indexed":true,"internalType":"address","name":"startedBy","type":"address"},{"indexed":false,"internalType":"uint256","name":"startedAt","type":"uint256"}],"name":"NewRound","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"OwnershipTransferRequested","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"accessController","outputs":[{"internalType":"contract AccessControllerInterface","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"aggregator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_aggregator","type":"address"}],"name":"confirmAggregator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"description","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_roundId","type":"uint256"}],"name":"getAnswer","outputs":[{"internalType":"int256","name":"","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint80","name":"_roundId","type":"uint80"}],"name":"getRoundData","outputs":[{"internalType":"uint80","name":"roundId","type":"uint80"},{"internalType":"int256","name":"answer","type":"int256"},{"internalType":"uint256","name":"startedAt","type":"uint256"},{"internalType":"uint256","name":"updatedAt","type":"uint256"},{"internalType":"uint80","name":"answeredInRound","type":"uint80"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_roundId","type":"uint256"}],"name":"getTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"latestAnswer","outputs":[{"internalType":"int256","name":"","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"latestRound","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"latestRoundData","outputs":[{"internalType":"uint80","name":"roundId","type":"uint80"},{"internalType":"int256","name":"answer","type":"int256"},{"internalType":"uint256","name":"startedAt","type":"uint256"},{"internalType":"uint256","name":"updatedAt","type":"uint256"},{"internalType":"uint80","name":"answeredInRound","type":"uint80"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"latestTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"}],"name":"phaseAggregators","outputs":[{"internalType":"contract AggregatorV2V3Interface","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"phaseId","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_aggregator","type":"address"}],"name":"proposeAggregator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"proposedAggregator","outputs":[{"internalType":"contract AggregatorV2V3Interface","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint80","name":"_roundId","type":"uint80"}],"name":"proposedGetRoundData","outputs":[{"internalType":"uint80","name":"roundId","type":"uint80"},{"internalType":"int256","name":"answer","type":"int256"},{"internalType":"uint256","name":"startedAt","type":"uint256"},{"internalType":"uint256","name":"updatedAt","type":"uint256"},{"internalType":"uint80","name":"answeredInRound","type":"uint80"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proposedLatestRoundData","outputs":[{"internalType":"uint80","name":"roundId","type":"uint80"},{"internalType":"int256","name":"answer","type":"int256"},{"internalType":"uint256","name":"startedAt","type":"uint256"},{"internalType":"uint256","name":"updatedAt","type":"uint256"},{"internalType":"uint80","name":"answeredInRound","type":"uint80"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_accessController","type":"address"}],"name":"setController","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"version","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}],
615
+ "networks": {
616
+ "1": { "address": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6" }
617
+ }
600
618
  }
601
619
  }
package/src/contracts.ts CHANGED
@@ -94,4 +94,8 @@ export const McdJugContract = createContractFromConfigFunc<ContractTypes.McdJug>
94
94
  export const McdVatContract = createContractFromConfigFunc<ContractTypes.McdVat>('McdVat');
95
95
 
96
96
  export const ChickenBondsViewContract = createContractFromConfigFunc<ContractTypes.ChickenBondsView>('ChickenBondsView');
97
- export const ChickenBondsManagerContract = createContractFromConfigFunc<ContractTypes.ChickenBondsManager>('ChickenBondsManager');
97
+ export const ChickenBondsManagerContract = createContractFromConfigFunc<ContractTypes.ChickenBondsManager>('ChickenBondsManager');
98
+
99
+ export const ETHPriceFeedContract = createContractFromConfigFunc<ContractTypes.ETHPriceFeed>('ETHPriceFeed');
100
+ export const COMPPriceFeedContract = createContractFromConfigFunc<ContractTypes.COMPPriceFeed>('COMPPriceFeed');
101
+ export const USDCPriceFeedContract = createContractFromConfigFunc<ContractTypes.USDCPriceFeed>('USDCPriceFeed');
@@ -87,12 +87,26 @@ export const aaveAnyGetAggregatedPositionData = ({
87
87
  payload.borrowLimitUsd = getAssetsTotal(
88
88
  usedAssets,
89
89
  ({ isSupplied, collateral }: { isSupplied: boolean, collateral: string }) => isSupplied && collateral,
90
- ({ symbol, suppliedUsd }: { symbol: string, suppliedUsd: string }) => new Dec(suppliedUsd).mul(aaveAnyGetEmodeMutableProps(data, symbol).collateralFactor),
90
+ ({ symbol, suppliedUsd }: { symbol: string, suppliedUsd: string }) => {
91
+ const suppliedUsdAmount = isMorphoAaveV3(data)
92
+ // Morpho has a slightly different method for calculating health ratio than underlying pool (To account for potential errors in rounding)
93
+ ? new Dec(suppliedUsd).minus(new Dec(suppliedUsd).div(100).times(0.1)).toString()
94
+ : suppliedUsd;
95
+
96
+ return new Dec(suppliedUsdAmount).mul(aaveAnyGetEmodeMutableProps(data, symbol).collateralFactor);
97
+ },
91
98
  );
92
99
  payload.liquidationLimitUsd = getAssetsTotal(
93
100
  usedAssets,
94
101
  ({ isSupplied, collateral }: { isSupplied: boolean, collateral: string }) => isSupplied && collateral,
95
- ({ symbol, suppliedUsd }: { symbol: string, suppliedUsd: string }) => new Dec(suppliedUsd).mul(aaveAnyGetEmodeMutableProps(data, symbol).liquidationRatio),
102
+ ({ symbol, suppliedUsd }: { symbol: string, suppliedUsd: string }) => {
103
+ const suppliedUsdAmount = isMorphoAaveV3(data)
104
+ // Morpho has a slightly different method for calculating health ratio than underlying pool (To account for potential errors in rounding)
105
+ ? new Dec(suppliedUsd).minus(new Dec(suppliedUsd).div(100).times(0.1)).toString()
106
+ : suppliedUsd;
107
+
108
+ return new Dec(suppliedUsdAmount).mul(aaveAnyGetEmodeMutableProps(data, symbol).liquidationRatio);
109
+ },
96
110
  );
97
111
  payload.borrowedUsd = getAssetsTotal(usedAssets, ({ isBorrowed }: { isBorrowed: boolean }) => isBorrowed, ({ borrowedUsd }: { borrowedUsd: string }) => borrowedUsd);
98
112
  const leftToBorrowUsd = new Dec(payload.borrowLimitUsd).sub(payload.borrowedUsd);
@@ -10,4 +10,15 @@ export const calcAverageBondAgeMs = (totalWeightedStartTimes: string, totalPendi
10
10
  .toNumber();
11
11
 
12
12
  return Date.now() - averageStartTimeMs;
13
+ };
14
+
15
+ export const decodeTokenURIToSvg = (tokenURI: string): string => {
16
+ try {
17
+ const dataStartIndex = tokenURI.indexOf('base64,') + 'base64,'.length;
18
+ const json = atob(tokenURI.slice(dataStartIndex));
19
+ return JSON.parse(json)?.image;
20
+ } catch (e) {
21
+ console.error(e);
22
+ return 'Error parsing NFT image';
23
+ }
13
24
  };
@@ -11,12 +11,14 @@ import {
11
11
  import { calculateNetApy } from '../../staking';
12
12
  import { NetworkNumber } from '../../types/common';
13
13
 
14
- export const formatMarketData = (data: any, network: NetworkNumber): CompoundV3AssetData => {
14
+ export const formatMarketData = (data: any, network: NetworkNumber, baseAssetPrice: string): CompoundV3AssetData => {
15
15
  const assetInfo = getAssetInfoByAddress(data.tokenAddr, network);
16
16
  const isWETH = assetInfo.symbol === 'WETH';
17
+ const price = getEthAmountForDecimals(data.price, 8);
17
18
  return ({
18
19
  ...data,
19
- price: getEthAmountForDecimals(data.price, 8),
20
+ priceInBaseAsset: getEthAmountForDecimals(data.price, 8),
21
+ price: new Dec(price).mul(baseAssetPrice).toString(),
20
22
  collateralFactor: getEthAmountForDecimals(data.borrowCollateralFactor, 18),
21
23
  liquidationRatio: getEthAmountForDecimals(data.liquidateCollateralFactor, 18),
22
24
  supplyCap: getEthAmountForDecimals(data.supplyCap, assetInfo.decimals),
@@ -30,7 +32,7 @@ export const formatMarketData = (data: any, network: NetworkNumber): CompoundV3A
30
32
  };
31
33
 
32
34
  // TODO: maybe not hardcode decimals
33
- export const formatBaseData = (data: any, network: NetworkNumber): CompoundV3AssetData & BaseAdditionalAssetData => {
35
+ export const formatBaseData = (data: any, network: NetworkNumber, baseAssetPrice: string): CompoundV3AssetData & BaseAdditionalAssetData => {
34
36
  const assetInfo = getAssetInfoByAddress(data.tokenAddr, network);
35
37
  const totalSupply = getEthAmountForDecimals(new Dec(data.totalSupply).mul(data.supplyIndex).toString(), 15 + assetInfo.decimals);
36
38
  const totalBorrow = getEthAmountForDecimals(new Dec(data.totalBorrow).mul(data.borrowIndex).toString(), 15 + assetInfo.decimals);
@@ -45,7 +47,8 @@ export const formatBaseData = (data: any, network: NetworkNumber): CompoundV3Ass
45
47
  totalBorrow,
46
48
  marketLiquidity: new Dec(totalSupply).minus(totalBorrow).toString(),
47
49
  symbol: wethToEth(assetInfo.symbol),
48
- price: getEthAmountForDecimals(data.price, 8),
50
+ priceInBaseAsset: getEthAmountForDecimals(data.price, 8),
51
+ price: baseAssetPrice,
49
52
  collateralFactor: '0',
50
53
  liquidationRatio: '0',
51
54
  canBeBorrowed: true,
@@ -14,8 +14,10 @@ import {
14
14
  import { calculateBorrowingAssetLimit } from '../moneymarket';
15
15
  import { EMPTY_AAVE_DATA } from '../aaveV3';
16
16
  import { aaveAnyGetAggregatedPositionData } from '../helpers/aaveHelpers';
17
+ import { getEthPrice } from '../services/priceService';
17
18
 
18
- export const getMorphoAaveV2MarketsData = async (web3: Web3, network: NetworkNumber, ethPrice: string, mainnetWeb3: Web3): Promise<MorphoAaveV2MarketData> => {
19
+ export const getMorphoAaveV2MarketsData = async (web3: Web3, network: NetworkNumber, mainnetWeb3: Web3): Promise<MorphoAaveV2MarketData> => {
20
+ const ethPrice = await getEthPrice(mainnetWeb3);
19
21
  const morphoAaveV2ViewContract = MorphoAaveV2ViewContract(web3, network);
20
22
 
21
23
  const [contractData, morphoRewardsRes] = await Promise.allSettled([
@@ -246,8 +248,8 @@ export const getMorphoAaveV2AccountData = async (web3: Web3, network: NetworkNum
246
248
  return payload;
247
249
  };
248
250
 
249
- export const getMorphoAaveV2FullPositionData = async (web3: Web3, network: NetworkNumber, address: string, ethPrice: string, mainnetWeb3: Web3): Promise<MorphoAaveV2PositionData> => {
250
- const marketData = await getMorphoAaveV2MarketsData(web3, network, ethPrice, mainnetWeb3);
251
+ export const getMorphoAaveV2FullPositionData = async (web3: Web3, network: NetworkNumber, address: string, mainnetWeb3: Web3): Promise<MorphoAaveV2PositionData> => {
252
+ const marketData = await getMorphoAaveV2MarketsData(web3, network, mainnetWeb3);
251
253
  const positionData = await getMorphoAaveV2AccountData(web3, network, address, marketData.assetsData);
252
254
  return positionData;
253
255
  };