recon-crypto-mcp 0.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/LICENSE +21 -0
- package/README.md +153 -0
- package/dist/abis/aave-pool.d.ts +174 -0
- package/dist/abis/aave-pool.js +101 -0
- package/dist/abis/aave-pool.js.map +1 -0
- package/dist/abis/aave-ui-pool-data-provider.d.ts +232 -0
- package/dist/abis/aave-ui-pool-data-provider.js +107 -0
- package/dist/abis/aave-ui-pool-data-provider.js.map +1 -0
- package/dist/abis/access-control.d.ts +94 -0
- package/dist/abis/access-control.js +51 -0
- package/dist/abis/access-control.js.map +1 -0
- package/dist/abis/compound-comet.d.ts +120 -0
- package/dist/abis/compound-comet.js +84 -0
- package/dist/abis/compound-comet.js.map +1 -0
- package/dist/abis/eigenlayer-delegation-manager.d.ts +23 -0
- package/dist/abis/eigenlayer-delegation-manager.js +18 -0
- package/dist/abis/eigenlayer-delegation-manager.js.map +1 -0
- package/dist/abis/eigenlayer-strategy-manager.d.ts +53 -0
- package/dist/abis/eigenlayer-strategy-manager.js +47 -0
- package/dist/abis/eigenlayer-strategy-manager.js.map +1 -0
- package/dist/abis/erc20.d.ts +78 -0
- package/dist/abis/erc20.js +10 -0
- package/dist/abis/erc20.js.map +1 -0
- package/dist/abis/lido.d.ts +80 -0
- package/dist/abis/lido.js +60 -0
- package/dist/abis/lido.js.map +1 -0
- package/dist/abis/morpho-blue.d.ts +321 -0
- package/dist/abis/morpho-blue.js +193 -0
- package/dist/abis/morpho-blue.js.map +1 -0
- package/dist/abis/uniswap-pool.d.ts +70 -0
- package/dist/abis/uniswap-pool.js +53 -0
- package/dist/abis/uniswap-pool.js.map +1 -0
- package/dist/abis/uniswap-position-manager.d.ts +71 -0
- package/dist/abis/uniswap-position-manager.js +41 -0
- package/dist/abis/uniswap-position-manager.js.map +1 -0
- package/dist/config/cache.d.ts +12 -0
- package/dist/config/cache.js +12 -0
- package/dist/config/cache.js.map +1 -0
- package/dist/config/chains.d.ts +24 -0
- package/dist/config/chains.js +158 -0
- package/dist/config/chains.js.map +1 -0
- package/dist/config/contracts.d.ts +107 -0
- package/dist/config/contracts.js +123 -0
- package/dist/config/contracts.js.map +1 -0
- package/dist/config/user-config.d.ts +15 -0
- package/dist/config/user-config.js +93 -0
- package/dist/config/user-config.js.map +1 -0
- package/dist/data/apis/etherscan.d.ts +30 -0
- package/dist/data/apis/etherscan.js +109 -0
- package/dist/data/apis/etherscan.js.map +1 -0
- package/dist/data/cache.d.ts +18 -0
- package/dist/data/cache.js +47 -0
- package/dist/data/cache.js.map +1 -0
- package/dist/data/format.d.ts +6 -0
- package/dist/data/format.js +44 -0
- package/dist/data/format.js.map +1 -0
- package/dist/data/prices.d.ts +12 -0
- package/dist/data/prices.js +81 -0
- package/dist/data/prices.js.map +1 -0
- package/dist/data/rpc.d.ts +17 -0
- package/dist/data/rpc.js +68 -0
- package/dist/data/rpc.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +344 -0
- package/dist/index.js.map +1 -0
- package/dist/modules/balances/index.d.ts +20 -0
- package/dist/modules/balances/index.js +49 -0
- package/dist/modules/balances/index.js.map +1 -0
- package/dist/modules/balances/schemas.d.ts +32 -0
- package/dist/modules/balances/schemas.js +21 -0
- package/dist/modules/balances/schemas.js.map +1 -0
- package/dist/modules/bitcoin/index.d.ts +26 -0
- package/dist/modules/bitcoin/index.js +128 -0
- package/dist/modules/bitcoin/index.js.map +1 -0
- package/dist/modules/bitcoin/schemas.d.ts +49 -0
- package/dist/modules/bitcoin/schemas.js +51 -0
- package/dist/modules/bitcoin/schemas.js.map +1 -0
- package/dist/modules/bitcoin/send.d.ts +52 -0
- package/dist/modules/bitcoin/send.js +158 -0
- package/dist/modules/bitcoin/send.js.map +1 -0
- package/dist/modules/bitcoin/utxo.d.ts +99 -0
- package/dist/modules/bitcoin/utxo.js +116 -0
- package/dist/modules/bitcoin/utxo.js.map +1 -0
- package/dist/modules/compound/actions.d.ts +8 -0
- package/dist/modules/compound/actions.js +154 -0
- package/dist/modules/compound/actions.js.map +1 -0
- package/dist/modules/compound/index.d.ts +26 -0
- package/dist/modules/compound/index.js +141 -0
- package/dist/modules/compound/index.js.map +1 -0
- package/dist/modules/compound/schemas.d.ts +95 -0
- package/dist/modules/compound/schemas.js +37 -0
- package/dist/modules/compound/schemas.js.map +1 -0
- package/dist/modules/execution/index.d.ts +51 -0
- package/dist/modules/execution/index.js +271 -0
- package/dist/modules/execution/index.js.map +1 -0
- package/dist/modules/execution/schemas.d.ts +183 -0
- package/dist/modules/execution/schemas.js +88 -0
- package/dist/modules/execution/schemas.js.map +1 -0
- package/dist/modules/feedback/index.d.ts +28 -0
- package/dist/modules/feedback/index.js +161 -0
- package/dist/modules/feedback/index.js.map +1 -0
- package/dist/modules/feedback/rate-limit.d.ts +15 -0
- package/dist/modules/feedback/rate-limit.js +110 -0
- package/dist/modules/feedback/rate-limit.js.map +1 -0
- package/dist/modules/feedback/schemas.d.ts +41 -0
- package/dist/modules/feedback/schemas.js +40 -0
- package/dist/modules/feedback/schemas.js.map +1 -0
- package/dist/modules/morpho/actions.d.ts +8 -0
- package/dist/modules/morpho/actions.js +265 -0
- package/dist/modules/morpho/actions.js.map +1 -0
- package/dist/modules/morpho/index.d.ts +26 -0
- package/dist/modules/morpho/index.js +94 -0
- package/dist/modules/morpho/index.js.map +1 -0
- package/dist/modules/morpho/schemas.d.ts +130 -0
- package/dist/modules/morpho/schemas.js +34 -0
- package/dist/modules/morpho/schemas.js.map +1 -0
- package/dist/modules/portfolio/index.d.ts +3 -0
- package/dist/modules/portfolio/index.js +197 -0
- package/dist/modules/portfolio/index.js.map +1 -0
- package/dist/modules/portfolio/schemas.d.ts +20 -0
- package/dist/modules/portfolio/schemas.js +15 -0
- package/dist/modules/portfolio/schemas.js.map +1 -0
- package/dist/modules/positions/aave.d.ts +22 -0
- package/dist/modules/positions/aave.js +197 -0
- package/dist/modules/positions/aave.js.map +1 -0
- package/dist/modules/positions/actions.d.ts +18 -0
- package/dist/modules/positions/actions.js +205 -0
- package/dist/modules/positions/actions.js.map +1 -0
- package/dist/modules/positions/index.d.ts +37 -0
- package/dist/modules/positions/index.js +59 -0
- package/dist/modules/positions/index.js.map +1 -0
- package/dist/modules/positions/schemas.d.ts +55 -0
- package/dist/modules/positions/schemas.js +25 -0
- package/dist/modules/positions/schemas.js.map +1 -0
- package/dist/modules/positions/uniswap.d.ts +4 -0
- package/dist/modules/positions/uniswap.js +181 -0
- package/dist/modules/positions/uniswap.js.map +1 -0
- package/dist/modules/prices/index.d.ts +19 -0
- package/dist/modules/prices/index.js +22 -0
- package/dist/modules/prices/index.js.map +1 -0
- package/dist/modules/security/index.d.ts +26 -0
- package/dist/modules/security/index.js +13 -0
- package/dist/modules/security/index.js.map +1 -0
- package/dist/modules/security/permissions.d.ts +8 -0
- package/dist/modules/security/permissions.js +96 -0
- package/dist/modules/security/permissions.js.map +1 -0
- package/dist/modules/security/risk-score.d.ts +18 -0
- package/dist/modules/security/risk-score.js +116 -0
- package/dist/modules/security/risk-score.js.map +1 -0
- package/dist/modules/security/schemas.d.ts +31 -0
- package/dist/modules/security/schemas.js +16 -0
- package/dist/modules/security/schemas.js.map +1 -0
- package/dist/modules/security/verification.d.ts +4 -0
- package/dist/modules/security/verification.js +82 -0
- package/dist/modules/security/verification.js.map +1 -0
- package/dist/modules/shared/approval.d.ts +71 -0
- package/dist/modules/shared/approval.js +130 -0
- package/dist/modules/shared/approval.js.map +1 -0
- package/dist/modules/staking/actions.d.ts +22 -0
- package/dist/modules/staking/actions.js +100 -0
- package/dist/modules/staking/actions.js.map +1 -0
- package/dist/modules/staking/eigenlayer.d.ts +14 -0
- package/dist/modules/staking/eigenlayer.js +105 -0
- package/dist/modules/staking/eigenlayer.js.map +1 -0
- package/dist/modules/staking/index.d.ts +24 -0
- package/dist/modules/staking/index.js +59 -0
- package/dist/modules/staking/index.js.map +1 -0
- package/dist/modules/staking/lido.d.ts +14 -0
- package/dist/modules/staking/lido.js +113 -0
- package/dist/modules/staking/lido.js.map +1 -0
- package/dist/modules/staking/schemas.d.ts +34 -0
- package/dist/modules/staking/schemas.js +20 -0
- package/dist/modules/staking/schemas.js.map +1 -0
- package/dist/modules/swap/index.d.ts +47 -0
- package/dist/modules/swap/index.js +376 -0
- package/dist/modules/swap/index.js.map +1 -0
- package/dist/modules/swap/lifi.d.ts +17 -0
- package/dist/modules/swap/lifi.js +44 -0
- package/dist/modules/swap/lifi.js.map +1 -0
- package/dist/modules/swap/oneinch.d.ts +26 -0
- package/dist/modules/swap/oneinch.js +33 -0
- package/dist/modules/swap/oneinch.js.map +1 -0
- package/dist/modules/swap/schemas.d.ts +65 -0
- package/dist/modules/swap/schemas.js +46 -0
- package/dist/modules/swap/schemas.js.map +1 -0
- package/dist/setup.d.ts +2 -0
- package/dist/setup.js +257 -0
- package/dist/setup.js.map +1 -0
- package/dist/signing/pre-sign-check.d.ts +8 -0
- package/dist/signing/pre-sign-check.js +231 -0
- package/dist/signing/pre-sign-check.js.map +1 -0
- package/dist/signing/session.d.ts +28 -0
- package/dist/signing/session.js +26 -0
- package/dist/signing/session.js.map +1 -0
- package/dist/signing/tx-store.d.ts +29 -0
- package/dist/signing/tx-store.js +85 -0
- package/dist/signing/tx-store.js.map +1 -0
- package/dist/signing/walletconnect.d.ts +33 -0
- package/dist/signing/walletconnect.js +226 -0
- package/dist/signing/walletconnect.js.map +1 -0
- package/dist/types/index.d.ts +222 -0
- package/dist/types/index.js +18 -0
- package/dist/types/index.js.map +1 -0
- package/package.json +134 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"actions.js","sourceRoot":"","sources":["../../../src/modules/morpho/actions.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { GetMorphoPositionsArgs } from "./schemas.js";
|
|
2
|
+
import type { SupportedChain, TokenAmount } from "../../types/index.js";
|
|
3
|
+
/**
|
|
4
|
+
* A Morpho Blue position in a single (loanToken, collateralToken, oracle, irm, lltv) market.
|
|
5
|
+
* Shares are converted to assets using the market's live totalSupplyAssets / totalSupplyShares ratio
|
|
6
|
+
* (and likewise for borrow), which is an accurate snapshot at block-time.
|
|
7
|
+
*/
|
|
8
|
+
export interface MorphoPosition {
|
|
9
|
+
protocol: "morpho-blue";
|
|
10
|
+
chain: SupportedChain;
|
|
11
|
+
marketId: `0x${string}`;
|
|
12
|
+
loanToken: `0x${string}`;
|
|
13
|
+
collateralToken: `0x${string}`;
|
|
14
|
+
lltv: string;
|
|
15
|
+
supplied: TokenAmount | null;
|
|
16
|
+
borrowed: TokenAmount | null;
|
|
17
|
+
collateral: TokenAmount | null;
|
|
18
|
+
totalCollateralUsd: number;
|
|
19
|
+
totalDebtUsd: number;
|
|
20
|
+
totalSuppliedUsd: number;
|
|
21
|
+
netValueUsd: number;
|
|
22
|
+
}
|
|
23
|
+
export declare function getMorphoPositions(args: GetMorphoPositionsArgs): Promise<{
|
|
24
|
+
wallet: `0x${string}`;
|
|
25
|
+
positions: MorphoPosition[];
|
|
26
|
+
}>;
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { getClient } from "../../data/rpc.js";
|
|
2
|
+
import { CONTRACTS } from "../../config/contracts.js";
|
|
3
|
+
import { morphoBlueAbi } from "../../abis/morpho-blue.js";
|
|
4
|
+
import { erc20Abi } from "../../abis/erc20.js";
|
|
5
|
+
import { makeTokenAmount, priceTokenAmounts, round } from "../../data/format.js";
|
|
6
|
+
function morphoAddress(chain) {
|
|
7
|
+
const entry = CONTRACTS[chain]
|
|
8
|
+
?.morpho;
|
|
9
|
+
const addr = entry?.blue;
|
|
10
|
+
return addr ?? null;
|
|
11
|
+
}
|
|
12
|
+
async function readMarketPosition(wallet, chain, morpho, marketId) {
|
|
13
|
+
const client = getClient(chain);
|
|
14
|
+
const [position, params, market] = await client.multicall({
|
|
15
|
+
contracts: [
|
|
16
|
+
{
|
|
17
|
+
address: morpho,
|
|
18
|
+
abi: morphoBlueAbi,
|
|
19
|
+
functionName: "position",
|
|
20
|
+
args: [marketId, wallet],
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
address: morpho,
|
|
24
|
+
abi: morphoBlueAbi,
|
|
25
|
+
functionName: "idToMarketParams",
|
|
26
|
+
args: [marketId],
|
|
27
|
+
},
|
|
28
|
+
{ address: morpho, abi: morphoBlueAbi, functionName: "market", args: [marketId] },
|
|
29
|
+
],
|
|
30
|
+
allowFailure: false,
|
|
31
|
+
});
|
|
32
|
+
const supplyShares = position[0];
|
|
33
|
+
const borrowShares = position[1];
|
|
34
|
+
const collateralWei = position[2];
|
|
35
|
+
if (supplyShares === 0n && borrowShares === 0n && collateralWei === 0n) {
|
|
36
|
+
return null;
|
|
37
|
+
}
|
|
38
|
+
const [loanToken, collateralToken, , , lltv] = params;
|
|
39
|
+
const [totalSupplyAssets, totalSupplyShares, totalBorrowAssets, totalBorrowShares] = market;
|
|
40
|
+
// Morpho share math: assets = shares * totalAssets / totalShares (virtual offset ignored — Morpho's
|
|
41
|
+
// SharesMathLib adds 1 wei + 1e6 virtual offset, but for UI-level accuracy this is negligible).
|
|
42
|
+
const suppliedWei = totalSupplyShares > 0n ? (supplyShares * totalSupplyAssets) / totalSupplyShares : 0n;
|
|
43
|
+
const borrowedWei = totalBorrowShares > 0n ? (borrowShares * totalBorrowAssets) / totalBorrowShares : 0n;
|
|
44
|
+
const [loanDecimals, loanSymbol, collateralDecimals, collateralSymbol] = await client.multicall({
|
|
45
|
+
contracts: [
|
|
46
|
+
{ address: loanToken, abi: erc20Abi, functionName: "decimals" },
|
|
47
|
+
{ address: loanToken, abi: erc20Abi, functionName: "symbol" },
|
|
48
|
+
{ address: collateralToken, abi: erc20Abi, functionName: "decimals" },
|
|
49
|
+
{ address: collateralToken, abi: erc20Abi, functionName: "symbol" },
|
|
50
|
+
],
|
|
51
|
+
allowFailure: false,
|
|
52
|
+
});
|
|
53
|
+
const lDec = Number(loanDecimals);
|
|
54
|
+
const lSym = loanSymbol;
|
|
55
|
+
const cDec = Number(collateralDecimals);
|
|
56
|
+
const cSym = collateralSymbol;
|
|
57
|
+
const supplied = suppliedWei > 0n ? makeTokenAmount(chain, loanToken, suppliedWei, lDec, lSym) : null;
|
|
58
|
+
const borrowed = borrowedWei > 0n ? makeTokenAmount(chain, loanToken, borrowedWei, lDec, lSym) : null;
|
|
59
|
+
const collateral = collateralWei > 0n
|
|
60
|
+
? makeTokenAmount(chain, collateralToken, collateralWei, cDec, cSym)
|
|
61
|
+
: null;
|
|
62
|
+
const toPrice = [supplied, borrowed, collateral].filter((t) => t !== null);
|
|
63
|
+
await priceTokenAmounts(chain, toPrice);
|
|
64
|
+
const totalSuppliedUsd = supplied?.valueUsd ?? 0;
|
|
65
|
+
const totalDebtUsd = borrowed?.valueUsd ?? 0;
|
|
66
|
+
const totalCollateralUsd = collateral?.valueUsd ?? 0;
|
|
67
|
+
return {
|
|
68
|
+
protocol: "morpho-blue",
|
|
69
|
+
chain,
|
|
70
|
+
marketId,
|
|
71
|
+
loanToken,
|
|
72
|
+
collateralToken,
|
|
73
|
+
lltv: lltv.toString(),
|
|
74
|
+
supplied,
|
|
75
|
+
borrowed,
|
|
76
|
+
collateral,
|
|
77
|
+
totalCollateralUsd: round(totalCollateralUsd, 2),
|
|
78
|
+
totalDebtUsd: round(totalDebtUsd, 2),
|
|
79
|
+
totalSuppliedUsd: round(totalSuppliedUsd, 2),
|
|
80
|
+
netValueUsd: round(totalSuppliedUsd + totalCollateralUsd - totalDebtUsd, 2),
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
export async function getMorphoPositions(args) {
|
|
84
|
+
const wallet = args.wallet;
|
|
85
|
+
const chain = args.chain;
|
|
86
|
+
const morpho = morphoAddress(chain);
|
|
87
|
+
if (!morpho) {
|
|
88
|
+
return { wallet, positions: [] };
|
|
89
|
+
}
|
|
90
|
+
const marketIds = args.marketIds;
|
|
91
|
+
const results = await Promise.all(marketIds.map((id) => readMarketPosition(wallet, chain, morpho, id)));
|
|
92
|
+
return { wallet, positions: results.filter((p) => p !== null) };
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/modules/morpho/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export declare const getMorphoPositionsInput: z.ZodObject<{
|
|
3
|
+
wallet: z.ZodString;
|
|
4
|
+
chain: z.ZodDefault<z.ZodEnum<[string, ...string[]]>>;
|
|
5
|
+
/** Morpho Blue market IDs (bytes32 each) to check. Discover via the Morpho app or subgraph. */
|
|
6
|
+
marketIds: z.ZodArray<z.ZodString, "many">;
|
|
7
|
+
}, "strip", z.ZodTypeAny, {
|
|
8
|
+
chain: string;
|
|
9
|
+
wallet: string;
|
|
10
|
+
marketIds: string[];
|
|
11
|
+
}, {
|
|
12
|
+
wallet: string;
|
|
13
|
+
marketIds: string[];
|
|
14
|
+
chain?: string | undefined;
|
|
15
|
+
}>;
|
|
16
|
+
export declare const prepareMorphoSupplyInput: z.ZodObject<{
|
|
17
|
+
wallet: z.ZodString;
|
|
18
|
+
chain: z.ZodDefault<z.ZodEnum<[string, ...string[]]>>;
|
|
19
|
+
marketId: z.ZodString;
|
|
20
|
+
amount: z.ZodString;
|
|
21
|
+
} & {
|
|
22
|
+
approvalCap: z.ZodOptional<z.ZodString>;
|
|
23
|
+
}, "strip", z.ZodTypeAny, {
|
|
24
|
+
chain: string;
|
|
25
|
+
amount: string;
|
|
26
|
+
wallet: string;
|
|
27
|
+
marketId: string;
|
|
28
|
+
approvalCap?: string | undefined;
|
|
29
|
+
}, {
|
|
30
|
+
amount: string;
|
|
31
|
+
wallet: string;
|
|
32
|
+
marketId: string;
|
|
33
|
+
chain?: string | undefined;
|
|
34
|
+
approvalCap?: string | undefined;
|
|
35
|
+
}>;
|
|
36
|
+
export declare const prepareMorphoWithdrawInput: z.ZodObject<{
|
|
37
|
+
wallet: z.ZodString;
|
|
38
|
+
chain: z.ZodDefault<z.ZodEnum<[string, ...string[]]>>;
|
|
39
|
+
marketId: z.ZodString;
|
|
40
|
+
amount: z.ZodString;
|
|
41
|
+
}, "strip", z.ZodTypeAny, {
|
|
42
|
+
chain: string;
|
|
43
|
+
amount: string;
|
|
44
|
+
wallet: string;
|
|
45
|
+
marketId: string;
|
|
46
|
+
}, {
|
|
47
|
+
amount: string;
|
|
48
|
+
wallet: string;
|
|
49
|
+
marketId: string;
|
|
50
|
+
chain?: string | undefined;
|
|
51
|
+
}>;
|
|
52
|
+
export declare const prepareMorphoBorrowInput: z.ZodObject<{
|
|
53
|
+
wallet: z.ZodString;
|
|
54
|
+
chain: z.ZodDefault<z.ZodEnum<[string, ...string[]]>>;
|
|
55
|
+
marketId: z.ZodString;
|
|
56
|
+
amount: z.ZodString;
|
|
57
|
+
}, "strip", z.ZodTypeAny, {
|
|
58
|
+
chain: string;
|
|
59
|
+
amount: string;
|
|
60
|
+
wallet: string;
|
|
61
|
+
marketId: string;
|
|
62
|
+
}, {
|
|
63
|
+
amount: string;
|
|
64
|
+
wallet: string;
|
|
65
|
+
marketId: string;
|
|
66
|
+
chain?: string | undefined;
|
|
67
|
+
}>;
|
|
68
|
+
export declare const prepareMorphoRepayInput: z.ZodObject<{
|
|
69
|
+
wallet: z.ZodString;
|
|
70
|
+
chain: z.ZodDefault<z.ZodEnum<[string, ...string[]]>>;
|
|
71
|
+
marketId: z.ZodString;
|
|
72
|
+
amount: z.ZodString;
|
|
73
|
+
} & {
|
|
74
|
+
approvalCap: z.ZodOptional<z.ZodString>;
|
|
75
|
+
}, "strip", z.ZodTypeAny, {
|
|
76
|
+
chain: string;
|
|
77
|
+
amount: string;
|
|
78
|
+
wallet: string;
|
|
79
|
+
marketId: string;
|
|
80
|
+
approvalCap?: string | undefined;
|
|
81
|
+
}, {
|
|
82
|
+
amount: string;
|
|
83
|
+
wallet: string;
|
|
84
|
+
marketId: string;
|
|
85
|
+
chain?: string | undefined;
|
|
86
|
+
approvalCap?: string | undefined;
|
|
87
|
+
}>;
|
|
88
|
+
export declare const prepareMorphoSupplyCollateralInput: z.ZodObject<{
|
|
89
|
+
wallet: z.ZodString;
|
|
90
|
+
chain: z.ZodDefault<z.ZodEnum<[string, ...string[]]>>;
|
|
91
|
+
marketId: z.ZodString;
|
|
92
|
+
amount: z.ZodString;
|
|
93
|
+
} & {
|
|
94
|
+
approvalCap: z.ZodOptional<z.ZodString>;
|
|
95
|
+
}, "strip", z.ZodTypeAny, {
|
|
96
|
+
chain: string;
|
|
97
|
+
amount: string;
|
|
98
|
+
wallet: string;
|
|
99
|
+
marketId: string;
|
|
100
|
+
approvalCap?: string | undefined;
|
|
101
|
+
}, {
|
|
102
|
+
amount: string;
|
|
103
|
+
wallet: string;
|
|
104
|
+
marketId: string;
|
|
105
|
+
chain?: string | undefined;
|
|
106
|
+
approvalCap?: string | undefined;
|
|
107
|
+
}>;
|
|
108
|
+
export declare const prepareMorphoWithdrawCollateralInput: z.ZodObject<{
|
|
109
|
+
wallet: z.ZodString;
|
|
110
|
+
chain: z.ZodDefault<z.ZodEnum<[string, ...string[]]>>;
|
|
111
|
+
marketId: z.ZodString;
|
|
112
|
+
amount: z.ZodString;
|
|
113
|
+
}, "strip", z.ZodTypeAny, {
|
|
114
|
+
chain: string;
|
|
115
|
+
amount: string;
|
|
116
|
+
wallet: string;
|
|
117
|
+
marketId: string;
|
|
118
|
+
}, {
|
|
119
|
+
amount: string;
|
|
120
|
+
wallet: string;
|
|
121
|
+
marketId: string;
|
|
122
|
+
chain?: string | undefined;
|
|
123
|
+
}>;
|
|
124
|
+
export type GetMorphoPositionsArgs = z.infer<typeof getMorphoPositionsInput>;
|
|
125
|
+
export type PrepareMorphoSupplyArgs = z.infer<typeof prepareMorphoSupplyInput>;
|
|
126
|
+
export type PrepareMorphoWithdrawArgs = z.infer<typeof prepareMorphoWithdrawInput>;
|
|
127
|
+
export type PrepareMorphoBorrowArgs = z.infer<typeof prepareMorphoBorrowInput>;
|
|
128
|
+
export type PrepareMorphoRepayArgs = z.infer<typeof prepareMorphoRepayInput>;
|
|
129
|
+
export type PrepareMorphoSupplyCollateralArgs = z.infer<typeof prepareMorphoSupplyCollateralInput>;
|
|
130
|
+
export type PrepareMorphoWithdrawCollateralArgs = z.infer<typeof prepareMorphoWithdrawCollateralInput>;
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { SUPPORTED_CHAINS } from "../../types/index.js";
|
|
3
|
+
import { approvalCapSchema } from "../shared/approval.js";
|
|
4
|
+
const chainEnum = z.enum(SUPPORTED_CHAINS);
|
|
5
|
+
const walletSchema = z.string().regex(/^0x[a-fA-F0-9]{40}$/);
|
|
6
|
+
const marketIdSchema = z.string().regex(/^0x[a-fA-F0-9]{64}$/);
|
|
7
|
+
export const getMorphoPositionsInput = z.object({
|
|
8
|
+
wallet: walletSchema,
|
|
9
|
+
chain: chainEnum.default("ethereum"),
|
|
10
|
+
/** Morpho Blue market IDs (bytes32 each) to check. Discover via the Morpho app or subgraph. */
|
|
11
|
+
marketIds: z.array(marketIdSchema).min(1),
|
|
12
|
+
});
|
|
13
|
+
const baseMarketAction = z.object({
|
|
14
|
+
wallet: walletSchema,
|
|
15
|
+
chain: chainEnum.default("ethereum"),
|
|
16
|
+
marketId: marketIdSchema,
|
|
17
|
+
amount: z
|
|
18
|
+
.string()
|
|
19
|
+
.describe('Human-readable decimal amount, NOT raw wei/base units. ' +
|
|
20
|
+
'Example: "10" for 10 USDC. Pass "max" for full-balance withdraw/repay.'),
|
|
21
|
+
});
|
|
22
|
+
export const prepareMorphoSupplyInput = baseMarketAction.extend({
|
|
23
|
+
approvalCap: approvalCapSchema,
|
|
24
|
+
});
|
|
25
|
+
export const prepareMorphoWithdrawInput = baseMarketAction;
|
|
26
|
+
export const prepareMorphoBorrowInput = baseMarketAction;
|
|
27
|
+
export const prepareMorphoRepayInput = baseMarketAction.extend({
|
|
28
|
+
approvalCap: approvalCapSchema,
|
|
29
|
+
});
|
|
30
|
+
export const prepareMorphoSupplyCollateralInput = baseMarketAction.extend({
|
|
31
|
+
approvalCap: approvalCapSchema,
|
|
32
|
+
});
|
|
33
|
+
export const prepareMorphoWithdrawCollateralInput = baseMarketAction;
|
|
34
|
+
//# sourceMappingURL=schemas.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schemas.js","sourceRoot":"","sources":["../../../src/modules/morpho/schemas.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAE1D,MAAM,SAAS,GAAG,CAAC,CAAC,IAAI,CAAC,gBAAoD,CAAC,CAAC;AAC/E,MAAM,YAAY,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC;AAC7D,MAAM,cAAc,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC;AAE/D,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC9C,MAAM,EAAE,YAAY;IACpB,KAAK,EAAE,SAAS,CAAC,OAAO,CAAC,UAAU,CAAC;IACpC,+FAA+F;IAC/F,SAAS,EAAE,CAAC,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;CAC1C,CAAC,CAAC;AAEH,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IAChC,MAAM,EAAE,YAAY;IACpB,KAAK,EAAE,SAAS,CAAC,OAAO,CAAC,UAAU,CAAC;IACpC,QAAQ,EAAE,cAAc;IACxB,MAAM,EAAE,CAAC;SACN,MAAM,EAAE;SACR,QAAQ,CACP,yDAAyD;QACvD,wEAAwE,CAC3E;CACJ,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,wBAAwB,GAAG,gBAAgB,CAAC,MAAM,CAAC;IAC9D,WAAW,EAAE,iBAAiB;CAC/B,CAAC,CAAC;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAG,gBAAgB,CAAC;AAC3D,MAAM,CAAC,MAAM,wBAAwB,GAAG,gBAAgB,CAAC;AACzD,MAAM,CAAC,MAAM,uBAAuB,GAAG,gBAAgB,CAAC,MAAM,CAAC;IAC7D,WAAW,EAAE,iBAAiB;CAC/B,CAAC,CAAC;AACH,MAAM,CAAC,MAAM,kCAAkC,GAAG,gBAAgB,CAAC,MAAM,CAAC;IACxE,WAAW,EAAE,iBAAiB;CAC/B,CAAC,CAAC;AACH,MAAM,CAAC,MAAM,oCAAoC,GAAG,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import type { GetPortfolioSummaryArgs } from "./schemas.js";
|
|
2
|
+
import type { MultiWalletPortfolioSummary, PortfolioSummary } from "../../types/index.js";
|
|
3
|
+
export declare function getPortfolioSummary(args: GetPortfolioSummaryArgs): Promise<PortfolioSummary | MultiWalletPortfolioSummary>;
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
import { getClient } from "../../data/rpc.js";
|
|
2
|
+
import { CONTRACTS, NATIVE_SYMBOL } from "../../config/contracts.js";
|
|
3
|
+
import { erc20Abi } from "../../abis/erc20.js";
|
|
4
|
+
import { makeTokenAmount, priceTokenAmounts, round } from "../../data/format.js";
|
|
5
|
+
import { getTokenPrice } from "../../data/prices.js";
|
|
6
|
+
import { getLendingPositions, getLpPositions } from "../positions/index.js";
|
|
7
|
+
import { getStakingPositions } from "../staking/index.js";
|
|
8
|
+
import { getCompoundPositions } from "../compound/index.js";
|
|
9
|
+
import { SUPPORTED_CHAINS } from "../../types/index.js";
|
|
10
|
+
function zeroNative(wallet, chain) {
|
|
11
|
+
return makeTokenAmount(chain, "0x0000000000000000000000000000000000000000", 0n, 18, NATIVE_SYMBOL[chain]);
|
|
12
|
+
}
|
|
13
|
+
async function fetchNativeBalance(wallet, chain) {
|
|
14
|
+
const client = getClient(chain);
|
|
15
|
+
const [balance, ethPrice] = await Promise.all([
|
|
16
|
+
client.getBalance({ address: wallet }),
|
|
17
|
+
getTokenPrice(chain, "native"),
|
|
18
|
+
]);
|
|
19
|
+
return makeTokenAmount(chain, "0x0000000000000000000000000000000000000000", balance, 18, NATIVE_SYMBOL[chain], ethPrice);
|
|
20
|
+
}
|
|
21
|
+
async function fetchTopErc20Balances(wallet, chain) {
|
|
22
|
+
const tokens = CONTRACTS[chain].tokens;
|
|
23
|
+
const entries = Object.entries(tokens);
|
|
24
|
+
if (entries.length === 0)
|
|
25
|
+
return [];
|
|
26
|
+
const client = getClient(chain);
|
|
27
|
+
const calls = entries.flatMap(([, addr]) => [
|
|
28
|
+
{ address: addr, abi: erc20Abi, functionName: "balanceOf", args: [wallet] },
|
|
29
|
+
{ address: addr, abi: erc20Abi, functionName: "decimals" },
|
|
30
|
+
]);
|
|
31
|
+
const results = await client.multicall({ contracts: calls, allowFailure: true });
|
|
32
|
+
const out = [];
|
|
33
|
+
for (let i = 0; i < entries.length; i++) {
|
|
34
|
+
const [symbol, addr] = entries[i];
|
|
35
|
+
const balanceRes = results[i * 2];
|
|
36
|
+
const decimalsRes = results[i * 2 + 1];
|
|
37
|
+
if (balanceRes.status !== "success" || decimalsRes.status !== "success")
|
|
38
|
+
continue;
|
|
39
|
+
const balance = balanceRes.result;
|
|
40
|
+
if (balance === 0n)
|
|
41
|
+
continue;
|
|
42
|
+
const decimals = Number(decimalsRes.result);
|
|
43
|
+
out.push(makeTokenAmount(chain, addr, balance, decimals, symbol));
|
|
44
|
+
}
|
|
45
|
+
await priceTokenAmounts(chain, out);
|
|
46
|
+
return out;
|
|
47
|
+
}
|
|
48
|
+
export async function getPortfolioSummary(args) {
|
|
49
|
+
if (!args.wallet && !(args.wallets && args.wallets.length > 0)) {
|
|
50
|
+
throw new Error("Provide at least one of `wallet` or `wallets`.");
|
|
51
|
+
}
|
|
52
|
+
const chains = (args.chains ?? [...SUPPORTED_CHAINS]);
|
|
53
|
+
const wallets = args.wallets?.length
|
|
54
|
+
? args.wallets
|
|
55
|
+
: args.wallet
|
|
56
|
+
? [args.wallet]
|
|
57
|
+
: [];
|
|
58
|
+
// Branch: single wallet returns the flat summary; multi-wallet aggregates.
|
|
59
|
+
if (wallets.length === 1) {
|
|
60
|
+
return buildWalletSummary(wallets[0], chains);
|
|
61
|
+
}
|
|
62
|
+
const perWallet = await Promise.all(wallets.map((w) => buildWalletSummary(w, chains)));
|
|
63
|
+
const totalUsd = round(perWallet.reduce((s, p) => s + p.totalUsd, 0), 2);
|
|
64
|
+
const walletBalancesUsd = round(perWallet.reduce((s, p) => s + p.walletBalancesUsd, 0), 2);
|
|
65
|
+
const lendingNetUsd = round(perWallet.reduce((s, p) => s + p.lendingNetUsd, 0), 2);
|
|
66
|
+
const lpUsd = round(perWallet.reduce((s, p) => s + p.lpUsd, 0), 2);
|
|
67
|
+
const stakingUsd = round(perWallet.reduce((s, p) => s + p.stakingUsd, 0), 2);
|
|
68
|
+
const perChain = Object.fromEntries(chains.map((c) => [c, 0]));
|
|
69
|
+
for (const p of perWallet) {
|
|
70
|
+
for (const c of chains) {
|
|
71
|
+
perChain[c] = round((perChain[c] ?? 0) + (p.perChain[c] ?? 0), 2);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
// Aggregate coverage: a subsystem is considered errored across the group if
|
|
75
|
+
// ANY wallet's fetch failed — because the group-level total will be short
|
|
76
|
+
// that wallet's contribution. Notes get merged to the worst (errored) state.
|
|
77
|
+
const mergedCoverage = {
|
|
78
|
+
aave: mergeCoverage(perWallet.map((p) => p.coverage.aave)),
|
|
79
|
+
compound: mergeCoverage(perWallet.map((p) => p.coverage.compound)),
|
|
80
|
+
morpho: perWallet[0]?.coverage.morpho ?? {
|
|
81
|
+
covered: false,
|
|
82
|
+
note: "Morpho Blue requires caller-supplied marketIds.",
|
|
83
|
+
},
|
|
84
|
+
uniswapV3: mergeCoverage(perWallet.map((p) => p.coverage.uniswapV3)),
|
|
85
|
+
staking: mergeCoverage(perWallet.map((p) => p.coverage.staking)),
|
|
86
|
+
unpricedAssets: perWallet.reduce((s, p) => s + p.coverage.unpricedAssets, 0),
|
|
87
|
+
};
|
|
88
|
+
return {
|
|
89
|
+
wallets,
|
|
90
|
+
chains,
|
|
91
|
+
totalUsd,
|
|
92
|
+
walletBalancesUsd,
|
|
93
|
+
lendingNetUsd,
|
|
94
|
+
lpUsd,
|
|
95
|
+
stakingUsd,
|
|
96
|
+
perChain,
|
|
97
|
+
perWallet,
|
|
98
|
+
coverage: mergedCoverage,
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
function mergeCoverage(entries) {
|
|
102
|
+
const anyErrored = entries.some((e) => e.errored);
|
|
103
|
+
const allCovered = entries.every((e) => e.covered);
|
|
104
|
+
return {
|
|
105
|
+
covered: allCovered && !anyErrored,
|
|
106
|
+
...(anyErrored ? { errored: true } : {}),
|
|
107
|
+
...(entries.find((e) => e.note)?.note ? { note: entries.find((e) => e.note).note } : {}),
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
async function buildWalletSummary(wallet, chains) {
|
|
111
|
+
// Each subquery is independent — one failing shouldn't kill the summary. We swap
|
|
112
|
+
// Promise.all for per-task catchers that return empty payloads on error, so a flaky
|
|
113
|
+
// Aave read (say, "returned no data") still lets us report native + ERC-20 + LP totals.
|
|
114
|
+
// Morpho Blue is deliberately NOT included here: it requires caller-supplied marketIds
|
|
115
|
+
// (Blue has no on-chain enumeration of a user's markets). Surface Morpho via the
|
|
116
|
+
// dedicated get_morpho_positions tool instead.
|
|
117
|
+
const emptyPositions = { wallet, positions: [] };
|
|
118
|
+
// Wrap each subquery so the portfolio can distinguish failure from empty. A
|
|
119
|
+
// thrown fetch becomes errored:true so callers don't mistake "Aave down" for
|
|
120
|
+
// "no Aave position".
|
|
121
|
+
const errors = { aave: false, compound: false, lp: false, staking: false };
|
|
122
|
+
const [nativeAmounts, erc20Amounts, aave, compound, lp, staking] = await Promise.all([
|
|
123
|
+
Promise.all(chains.map((c) => fetchNativeBalance(wallet, c).catch(() => zeroNative(wallet, c)))),
|
|
124
|
+
Promise.all(chains.map((c) => fetchTopErc20Balances(wallet, c).catch(() => []))),
|
|
125
|
+
getLendingPositions({ wallet, chains }).catch(() => {
|
|
126
|
+
errors.aave = true;
|
|
127
|
+
return emptyPositions;
|
|
128
|
+
}),
|
|
129
|
+
getCompoundPositions({ wallet, chains }).catch(() => {
|
|
130
|
+
errors.compound = true;
|
|
131
|
+
return emptyPositions;
|
|
132
|
+
}),
|
|
133
|
+
getLpPositions({ wallet, chains }).catch(() => {
|
|
134
|
+
errors.lp = true;
|
|
135
|
+
return emptyPositions;
|
|
136
|
+
}),
|
|
137
|
+
getStakingPositions({ wallet, chains }).catch(() => {
|
|
138
|
+
errors.staking = true;
|
|
139
|
+
return emptyPositions;
|
|
140
|
+
}),
|
|
141
|
+
]);
|
|
142
|
+
// Filter zero native balances out.
|
|
143
|
+
const native = nativeAmounts.filter((a) => a.amount !== "0");
|
|
144
|
+
const erc20 = erc20Amounts.flat();
|
|
145
|
+
// Merge Aave + Compound into a single lending bucket — they both carry `chain` and
|
|
146
|
+
// `netValueUsd`, which is all the summary math needs.
|
|
147
|
+
const lendingPositions = [
|
|
148
|
+
...aave.positions,
|
|
149
|
+
...compound.positions,
|
|
150
|
+
];
|
|
151
|
+
const walletBalancesUsd = round([...native, ...erc20].reduce((sum, t) => sum + (t.valueUsd ?? 0), 0), 2);
|
|
152
|
+
const lendingNetUsd = round(lendingPositions.reduce((sum, p) => sum + p.netValueUsd, 0), 2);
|
|
153
|
+
const lpUsd = round(lp.positions.reduce((sum, p) => sum + p.totalValueUsd, 0), 2);
|
|
154
|
+
const stakingUsd = round(staking.positions.reduce((sum, p) => sum + (p.stakedAmount.valueUsd ?? 0), 0), 2);
|
|
155
|
+
const totalUsd = round(walletBalancesUsd + lendingNetUsd + lpUsd + stakingUsd, 2);
|
|
156
|
+
// Per-chain breakdown (sums everything tagged to each chain).
|
|
157
|
+
const perChain = Object.fromEntries(chains.map((c) => [c, 0]));
|
|
158
|
+
chains.forEach((c, i) => {
|
|
159
|
+
const chainNative = nativeAmounts[i]?.valueUsd ?? 0;
|
|
160
|
+
const chainErc20 = erc20Amounts[i].reduce((s, t) => s + (t.valueUsd ?? 0), 0);
|
|
161
|
+
const chainLending = lendingPositions.filter((p) => p.chain === c).reduce((s, p) => s + p.netValueUsd, 0);
|
|
162
|
+
const chainLp = lp.positions.filter((p) => p.chain === c).reduce((s, p) => s + p.totalValueUsd, 0);
|
|
163
|
+
const chainStaking = staking.positions.filter((p) => p.chain === c).reduce((s, p) => s + (p.stakedAmount.valueUsd ?? 0), 0);
|
|
164
|
+
perChain[c] = round(chainNative + chainErc20 + chainLending + chainLp + chainStaking, 2);
|
|
165
|
+
});
|
|
166
|
+
const unpricedAssets = [...native, ...erc20].filter((t) => t.priceMissing).length;
|
|
167
|
+
const coverage = {
|
|
168
|
+
aave: { covered: !errors.aave, ...(errors.aave ? { errored: true, note: "Aave fetch failed — positions not included in totals." } : {}) },
|
|
169
|
+
compound: { covered: !errors.compound, ...(errors.compound ? { errored: true, note: "Compound V3 fetch failed — positions not included in totals." } : {}) },
|
|
170
|
+
morpho: {
|
|
171
|
+
covered: false,
|
|
172
|
+
note: "Morpho Blue positions require caller-supplied marketIds (no on-chain enumeration from a wallet). Call get_morpho_positions separately if the user has Morpho exposure.",
|
|
173
|
+
},
|
|
174
|
+
uniswapV3: { covered: !errors.lp, ...(errors.lp ? { errored: true, note: "Uniswap V3 LP fetch failed — positions not included." } : {}) },
|
|
175
|
+
staking: { covered: !errors.staking, ...(errors.staking ? { errored: true, note: "Staking (Lido/EigenLayer) fetch failed — positions not included." } : {}) },
|
|
176
|
+
unpricedAssets,
|
|
177
|
+
};
|
|
178
|
+
return {
|
|
179
|
+
wallet,
|
|
180
|
+
chains,
|
|
181
|
+
walletBalancesUsd,
|
|
182
|
+
lendingNetUsd,
|
|
183
|
+
lpUsd,
|
|
184
|
+
stakingUsd,
|
|
185
|
+
totalUsd,
|
|
186
|
+
perChain,
|
|
187
|
+
breakdown: {
|
|
188
|
+
native,
|
|
189
|
+
erc20,
|
|
190
|
+
lending: lendingPositions,
|
|
191
|
+
lp: lp.positions,
|
|
192
|
+
staking: staking.positions,
|
|
193
|
+
},
|
|
194
|
+
coverage,
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/modules/portfolio/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
/**
|
|
3
|
+
* Raw shape — MCP requires a bare ZodObject (no .refine) so it can expose `.shape`
|
|
4
|
+
* to build the JSON schema. Cross-field validation is enforced in the handler.
|
|
5
|
+
*/
|
|
6
|
+
export declare const getPortfolioSummaryInput: z.ZodObject<{
|
|
7
|
+
/** Single wallet — kept for backward compatibility. Use `wallets` for multi-wallet reports. */
|
|
8
|
+
wallet: z.ZodOptional<z.ZodString>;
|
|
9
|
+
wallets: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
10
|
+
chains: z.ZodOptional<z.ZodArray<z.ZodEnum<[string, ...string[]]>, "many">>;
|
|
11
|
+
}, "strip", z.ZodTypeAny, {
|
|
12
|
+
wallet?: string | undefined;
|
|
13
|
+
chains?: string[] | undefined;
|
|
14
|
+
wallets?: string[] | undefined;
|
|
15
|
+
}, {
|
|
16
|
+
wallet?: string | undefined;
|
|
17
|
+
chains?: string[] | undefined;
|
|
18
|
+
wallets?: string[] | undefined;
|
|
19
|
+
}>;
|
|
20
|
+
export type GetPortfolioSummaryArgs = z.infer<typeof getPortfolioSummaryInput>;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { SUPPORTED_CHAINS } from "../../types/index.js";
|
|
3
|
+
const chainEnum = z.enum(SUPPORTED_CHAINS);
|
|
4
|
+
const walletSchema = z.string().regex(/^0x[a-fA-F0-9]{40}$/);
|
|
5
|
+
/**
|
|
6
|
+
* Raw shape — MCP requires a bare ZodObject (no .refine) so it can expose `.shape`
|
|
7
|
+
* to build the JSON schema. Cross-field validation is enforced in the handler.
|
|
8
|
+
*/
|
|
9
|
+
export const getPortfolioSummaryInput = z.object({
|
|
10
|
+
/** Single wallet — kept for backward compatibility. Use `wallets` for multi-wallet reports. */
|
|
11
|
+
wallet: walletSchema.optional(),
|
|
12
|
+
wallets: z.array(walletSchema).min(1).optional(),
|
|
13
|
+
chains: z.array(chainEnum).optional(),
|
|
14
|
+
});
|
|
15
|
+
//# sourceMappingURL=schemas.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schemas.js","sourceRoot":"","sources":["../../../src/modules/portfolio/schemas.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAExD,MAAM,SAAS,GAAG,CAAC,CAAC,IAAI,CAAC,gBAAoD,CAAC,CAAC;AAC/E,MAAM,YAAY,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC;AAE7D;;;GAGG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC/C,+FAA+F;IAC/F,MAAM,EAAE,YAAY,CAAC,QAAQ,EAAE;IAC/B,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;IAChD,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,QAAQ,EAAE;CACtC,CAAC,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { parseUnits, maxUint256 } from "viem";
|
|
2
|
+
import type { LendingPosition, SupportedChain } from "../../types/index.js";
|
|
3
|
+
/**
|
|
4
|
+
* Fetch the fully-resolved Aave V3 lending position on a single chain.
|
|
5
|
+
* Returns null if the user has no Aave activity OR the RPC returned empty data for any of
|
|
6
|
+
* the required reads (batching mis-handling, rate-limit, transient). The caller treats a
|
|
7
|
+
* null result as "no position on this chain" — safer than exploding the whole portfolio.
|
|
8
|
+
*/
|
|
9
|
+
export declare function getAaveLendingPosition(wallet: `0x${string}`, chain: SupportedChain): Promise<LendingPosition | null>;
|
|
10
|
+
/**
|
|
11
|
+
* Simulate a delta to the lending position and return the projected health factor.
|
|
12
|
+
* We work in USD space: newHF = (newCollateral × liqThreshold) / newDebt.
|
|
13
|
+
*/
|
|
14
|
+
export declare function simulateHealthFactorChange(base: LendingPosition, action: "add_collateral" | "remove_collateral" | "borrow" | "repay", deltaUsd: number): {
|
|
15
|
+
newHealthFactor: number;
|
|
16
|
+
newCollateralUsd: number;
|
|
17
|
+
newDebtUsd: number;
|
|
18
|
+
safe: boolean;
|
|
19
|
+
};
|
|
20
|
+
/** Export a tiny helper for action builders. */
|
|
21
|
+
export declare function getAavePoolAddress(chain: SupportedChain): Promise<`0x${string}`>;
|
|
22
|
+
export { maxUint256, parseUnits };
|