@oydual31/more-vaults-sdk 0.4.2 → 0.6.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/README.md +94 -0
- package/dist/{spokeRoutes-B8Lnk-t4.d.cts → curatorBridge-CNs59kT9.d.cts} +222 -1
- package/dist/{spokeRoutes-B8Lnk-t4.d.ts → curatorBridge-CNs59kT9.d.ts} +222 -1
- package/dist/ethers/index.cjs +328 -3
- package/dist/ethers/index.cjs.map +1 -1
- package/dist/ethers/index.d.cts +279 -1
- package/dist/ethers/index.d.ts +279 -1
- package/dist/ethers/index.js +318 -5
- package/dist/ethers/index.js.map +1 -1
- package/dist/react/index.cjs +375 -0
- package/dist/react/index.cjs.map +1 -1
- package/dist/react/index.d.cts +266 -2
- package/dist/react/index.d.ts +266 -2
- package/dist/react/index.js +372 -2
- package/dist/react/index.js.map +1 -1
- package/dist/viem/index.cjs +377 -0
- package/dist/viem/index.cjs.map +1 -1
- package/dist/viem/index.d.cts +261 -3
- package/dist/viem/index.d.ts +261 -3
- package/dist/viem/index.js +367 -2
- package/dist/viem/index.js.map +1 -1
- package/package.json +1 -1
- package/src/ethers/abis.ts +24 -0
- package/src/ethers/curatorBridge.ts +235 -0
- package/src/ethers/curatorSubVaults.ts +443 -0
- package/src/ethers/index.ts +26 -0
- package/src/ethers/types.ts +99 -0
- package/src/react/index.ts +14 -0
- package/src/react/useCuratorBridgeQuote.ts +43 -0
- package/src/react/useERC7540RequestStatus.ts +43 -0
- package/src/react/useExecuteBridge.ts +50 -0
- package/src/react/useSubVaultPositions.ts +35 -0
- package/src/react/useVaultPortfolio.ts +35 -0
- package/src/viem/abis.ts +24 -0
- package/src/viem/curatorBridge.ts +288 -0
- package/src/viem/curatorSubVaults.ts +514 -0
- package/src/viem/index.ts +23 -0
- package/src/viem/types.ts +100 -0
package/dist/viem/index.cjs
CHANGED
|
@@ -1128,6 +1128,23 @@ var REGISTRY_ABI = [
|
|
|
1128
1128
|
{ type: "function", name: "isBridgeAllowed", inputs: [{ name: "bridge", type: "address" }], outputs: [{ type: "bool" }], stateMutability: "view" },
|
|
1129
1129
|
{ type: "function", name: "getAllowedFacets", inputs: [], outputs: [{ type: "address[]" }], stateMutability: "view" }
|
|
1130
1130
|
];
|
|
1131
|
+
var SUB_VAULT_ABI = [
|
|
1132
|
+
// ConfigurationFacet reads — called on the MoreVaults diamond proxy
|
|
1133
|
+
{ type: "function", name: "tokensHeld", inputs: [{ name: "id", type: "bytes32" }], outputs: [{ name: "", type: "address[]" }], stateMutability: "view" },
|
|
1134
|
+
{ type: "function", name: "lockedTokensAmountOfAsset", inputs: [{ name: "asset", type: "address" }], outputs: [{ name: "", type: "uint256" }], stateMutability: "view" },
|
|
1135
|
+
// ERC4626 standard reads — called on the sub-vault contract
|
|
1136
|
+
{ type: "function", name: "convertToAssets", inputs: [{ name: "shares", type: "uint256" }], outputs: [{ name: "", type: "uint256" }], stateMutability: "view" },
|
|
1137
|
+
{ type: "function", name: "convertToShares", inputs: [{ name: "assets", type: "uint256" }], outputs: [{ name: "", type: "uint256" }], stateMutability: "view" },
|
|
1138
|
+
{ type: "function", name: "previewDeposit", inputs: [{ name: "assets", type: "uint256" }], outputs: [{ name: "", type: "uint256" }], stateMutability: "view" },
|
|
1139
|
+
{ type: "function", name: "previewRedeem", inputs: [{ name: "shares", type: "uint256" }], outputs: [{ name: "", type: "uint256" }], stateMutability: "view" },
|
|
1140
|
+
{ type: "function", name: "maxDeposit", inputs: [{ name: "receiver", type: "address" }], outputs: [{ name: "", type: "uint256" }], stateMutability: "view" },
|
|
1141
|
+
{ type: "function", name: "maxRedeem", inputs: [{ name: "owner", type: "address" }], outputs: [{ name: "", type: "uint256" }], stateMutability: "view" },
|
|
1142
|
+
// ERC7540 async reads — called on the sub-vault contract
|
|
1143
|
+
{ type: "function", name: "pendingDepositRequest", inputs: [{ name: "requestId", type: "uint256" }, { name: "controller", type: "address" }], outputs: [{ name: "", type: "uint256" }], stateMutability: "view" },
|
|
1144
|
+
{ type: "function", name: "claimableDepositRequest", inputs: [{ name: "requestId", type: "uint256" }, { name: "controller", type: "address" }], outputs: [{ name: "", type: "uint256" }], stateMutability: "view" },
|
|
1145
|
+
{ type: "function", name: "pendingRedeemRequest", inputs: [{ name: "requestId", type: "uint256" }, { name: "controller", type: "address" }], outputs: [{ name: "", type: "uint256" }], stateMutability: "view" },
|
|
1146
|
+
{ type: "function", name: "claimableRedeemRequest", inputs: [{ name: "requestId", type: "uint256" }, { name: "controller", type: "address" }], outputs: [{ name: "", type: "uint256" }], stateMutability: "view" }
|
|
1147
|
+
];
|
|
1131
1148
|
var LZ_ENDPOINT_ABI = [
|
|
1132
1149
|
{
|
|
1133
1150
|
type: "function",
|
|
@@ -3947,6 +3964,354 @@ function buildUniswapV3Swap(params) {
|
|
|
3947
3964
|
}
|
|
3948
3965
|
};
|
|
3949
3966
|
}
|
|
3967
|
+
function encodeBridgeParams(params) {
|
|
3968
|
+
return viem.encodeAbiParameters(
|
|
3969
|
+
[
|
|
3970
|
+
{ type: "address" },
|
|
3971
|
+
{ type: "uint32" },
|
|
3972
|
+
{ type: "uint256" },
|
|
3973
|
+
{ type: "address" },
|
|
3974
|
+
{ type: "address" }
|
|
3975
|
+
],
|
|
3976
|
+
[
|
|
3977
|
+
viem.getAddress(params.oftToken),
|
|
3978
|
+
params.dstEid,
|
|
3979
|
+
params.amount,
|
|
3980
|
+
viem.getAddress(params.dstVault),
|
|
3981
|
+
viem.getAddress(params.refundAddress)
|
|
3982
|
+
]
|
|
3983
|
+
);
|
|
3984
|
+
}
|
|
3985
|
+
function encodeBridgeParamsForQuote(params) {
|
|
3986
|
+
return viem.encodeAbiParameters(
|
|
3987
|
+
[
|
|
3988
|
+
{ type: "address" },
|
|
3989
|
+
{ type: "uint32" },
|
|
3990
|
+
{ type: "uint256" },
|
|
3991
|
+
{ type: "address" }
|
|
3992
|
+
],
|
|
3993
|
+
[
|
|
3994
|
+
viem.getAddress(params.oftToken),
|
|
3995
|
+
params.dstEid,
|
|
3996
|
+
params.amount,
|
|
3997
|
+
viem.getAddress(params.dstVault)
|
|
3998
|
+
]
|
|
3999
|
+
);
|
|
4000
|
+
}
|
|
4001
|
+
function findBridgeRoute(srcChainId, dstChainId, tokenAddress) {
|
|
4002
|
+
const normalizedToken = viem.getAddress(tokenAddress);
|
|
4003
|
+
for (const [symbol, chains] of Object.entries(OFT_ROUTES)) {
|
|
4004
|
+
const srcEntry = chains[srcChainId];
|
|
4005
|
+
const dstEntry = chains[dstChainId];
|
|
4006
|
+
if (!srcEntry || !dstEntry) continue;
|
|
4007
|
+
const srcToken = viem.getAddress(srcEntry.token);
|
|
4008
|
+
const srcOft = viem.getAddress(srcEntry.oft);
|
|
4009
|
+
if (srcToken === normalizedToken || srcOft === normalizedToken) {
|
|
4010
|
+
return {
|
|
4011
|
+
oftSrc: srcOft,
|
|
4012
|
+
oftDst: viem.getAddress(dstEntry.oft),
|
|
4013
|
+
symbol
|
|
4014
|
+
};
|
|
4015
|
+
}
|
|
4016
|
+
}
|
|
4017
|
+
return null;
|
|
4018
|
+
}
|
|
4019
|
+
async function quoteCuratorBridgeFee(publicClient, vault, params) {
|
|
4020
|
+
const status = await getCuratorVaultStatus(publicClient, vault);
|
|
4021
|
+
const lzAdapter = status.lzAdapter;
|
|
4022
|
+
const bridgeSpecificParams = encodeBridgeParamsForQuote(params);
|
|
4023
|
+
const nativeFee = await publicClient.readContract({
|
|
4024
|
+
address: lzAdapter,
|
|
4025
|
+
abi: LZ_ADAPTER_ABI,
|
|
4026
|
+
functionName: "quoteBridgeFee",
|
|
4027
|
+
args: [bridgeSpecificParams]
|
|
4028
|
+
});
|
|
4029
|
+
return nativeFee;
|
|
4030
|
+
}
|
|
4031
|
+
async function executeCuratorBridge(walletClient, publicClient, vault, token, params) {
|
|
4032
|
+
const account = walletClient.account;
|
|
4033
|
+
const v = viem.getAddress(vault);
|
|
4034
|
+
const status = await getCuratorVaultStatus(publicClient, vault);
|
|
4035
|
+
const lzAdapter = status.lzAdapter;
|
|
4036
|
+
const fee = await quoteCuratorBridgeFee(publicClient, vault, params);
|
|
4037
|
+
const bridgeSpecificParams = encodeBridgeParams(params);
|
|
4038
|
+
const txHash = await walletClient.writeContract({
|
|
4039
|
+
address: v,
|
|
4040
|
+
abi: BRIDGE_FACET_ABI,
|
|
4041
|
+
functionName: "executeBridging",
|
|
4042
|
+
args: [
|
|
4043
|
+
lzAdapter,
|
|
4044
|
+
viem.getAddress(token),
|
|
4045
|
+
params.amount,
|
|
4046
|
+
bridgeSpecificParams
|
|
4047
|
+
],
|
|
4048
|
+
value: fee,
|
|
4049
|
+
account,
|
|
4050
|
+
chain: walletClient.chain
|
|
4051
|
+
});
|
|
4052
|
+
return txHash;
|
|
4053
|
+
}
|
|
4054
|
+
var ERC4626_ID = viem.keccak256(viem.toHex("ERC4626_ID"));
|
|
4055
|
+
var ERC7540_ID = viem.keccak256(viem.toHex("ERC7540_ID"));
|
|
4056
|
+
async function getSubVaultPositions(publicClient, vault) {
|
|
4057
|
+
const v = viem.getAddress(vault);
|
|
4058
|
+
const [erc4626Raw, erc7540Raw] = await Promise.all([
|
|
4059
|
+
publicClient.readContract({
|
|
4060
|
+
address: v,
|
|
4061
|
+
abi: SUB_VAULT_ABI,
|
|
4062
|
+
functionName: "tokensHeld",
|
|
4063
|
+
args: [ERC4626_ID]
|
|
4064
|
+
}).catch(() => []),
|
|
4065
|
+
publicClient.readContract({
|
|
4066
|
+
address: v,
|
|
4067
|
+
abi: SUB_VAULT_ABI,
|
|
4068
|
+
functionName: "tokensHeld",
|
|
4069
|
+
args: [ERC7540_ID]
|
|
4070
|
+
}).catch(() => [])
|
|
4071
|
+
]);
|
|
4072
|
+
const erc4626Vaults = erc4626Raw.map(viem.getAddress);
|
|
4073
|
+
const erc7540Vaults = erc7540Raw.map(viem.getAddress);
|
|
4074
|
+
const allSubVaults = [
|
|
4075
|
+
...erc4626Vaults.map((a) => ({ address: a, type: "erc4626" })),
|
|
4076
|
+
...erc7540Vaults.map((a) => ({ address: a, type: "erc7540" }))
|
|
4077
|
+
];
|
|
4078
|
+
if (allSubVaults.length === 0) return [];
|
|
4079
|
+
const PER_SV = 5;
|
|
4080
|
+
const subVaultCalls = allSubVaults.flatMap(({ address: sv }) => [
|
|
4081
|
+
{ address: sv, abi: ERC20_ABI, functionName: "balanceOf", args: [v] },
|
|
4082
|
+
{ address: sv, abi: VAULT_ABI, functionName: "asset" },
|
|
4083
|
+
{ address: sv, abi: METADATA_ABI, functionName: "name" },
|
|
4084
|
+
{ address: sv, abi: METADATA_ABI, functionName: "symbol" },
|
|
4085
|
+
{ address: sv, abi: METADATA_ABI, functionName: "decimals" }
|
|
4086
|
+
]);
|
|
4087
|
+
const subVaultResults = await publicClient.multicall({
|
|
4088
|
+
contracts: subVaultCalls,
|
|
4089
|
+
allowFailure: true
|
|
4090
|
+
});
|
|
4091
|
+
const partials = allSubVaults.map(({ address: sv, type }, i) => {
|
|
4092
|
+
const base = i * PER_SV;
|
|
4093
|
+
const sharesBalance = subVaultResults[base]?.status === "success" ? subVaultResults[base].result : 0n;
|
|
4094
|
+
const underlyingAsset = subVaultResults[base + 1]?.status === "success" ? viem.getAddress(subVaultResults[base + 1].result) : viem.zeroAddress;
|
|
4095
|
+
const name = subVaultResults[base + 2]?.status === "success" ? subVaultResults[base + 2].result : "";
|
|
4096
|
+
const symbol = subVaultResults[base + 3]?.status === "success" ? subVaultResults[base + 3].result : "";
|
|
4097
|
+
const decimals = subVaultResults[base + 4]?.status === "success" ? subVaultResults[base + 4].result : 18;
|
|
4098
|
+
return { address: sv, type, sharesBalance, underlyingAsset, name, symbol, decimals };
|
|
4099
|
+
});
|
|
4100
|
+
const active = partials.filter((p) => p.sharesBalance > 0n);
|
|
4101
|
+
if (active.length === 0) return [];
|
|
4102
|
+
const PER_ACTIVE = 4;
|
|
4103
|
+
const activeCalls = active.flatMap(({ address: sv, sharesBalance, underlyingAsset }) => [
|
|
4104
|
+
{ address: sv, abi: SUB_VAULT_ABI, functionName: "convertToAssets", args: [sharesBalance] },
|
|
4105
|
+
{ address: underlyingAsset, abi: METADATA_ABI, functionName: "name" },
|
|
4106
|
+
{ address: underlyingAsset, abi: METADATA_ABI, functionName: "symbol" },
|
|
4107
|
+
{ address: underlyingAsset, abi: METADATA_ABI, functionName: "decimals" }
|
|
4108
|
+
]);
|
|
4109
|
+
const activeResults = await publicClient.multicall({
|
|
4110
|
+
contracts: activeCalls,
|
|
4111
|
+
allowFailure: true
|
|
4112
|
+
});
|
|
4113
|
+
return active.map((p, i) => {
|
|
4114
|
+
const base = i * PER_ACTIVE;
|
|
4115
|
+
const underlyingValue = activeResults[base]?.status === "success" ? activeResults[base].result : 0n;
|
|
4116
|
+
const underlyingSymbol = activeResults[base + 2]?.status === "success" ? activeResults[base + 2].result : "";
|
|
4117
|
+
const underlyingDecimals = activeResults[base + 3]?.status === "success" ? activeResults[base + 3].result : 18;
|
|
4118
|
+
return {
|
|
4119
|
+
address: p.address,
|
|
4120
|
+
type: p.type,
|
|
4121
|
+
name: p.name,
|
|
4122
|
+
symbol: p.symbol,
|
|
4123
|
+
decimals: p.decimals,
|
|
4124
|
+
sharesBalance: p.sharesBalance,
|
|
4125
|
+
underlyingValue,
|
|
4126
|
+
underlyingAsset: p.underlyingAsset,
|
|
4127
|
+
underlyingSymbol,
|
|
4128
|
+
underlyingDecimals
|
|
4129
|
+
};
|
|
4130
|
+
});
|
|
4131
|
+
}
|
|
4132
|
+
async function detectSubVaultType(publicClient, subVault) {
|
|
4133
|
+
const sv = viem.getAddress(subVault);
|
|
4134
|
+
const [erc7540Result, erc4626Result] = await publicClient.multicall({
|
|
4135
|
+
contracts: [
|
|
4136
|
+
{
|
|
4137
|
+
address: sv,
|
|
4138
|
+
abi: SUB_VAULT_ABI,
|
|
4139
|
+
functionName: "pendingDepositRequest",
|
|
4140
|
+
args: [0n, viem.zeroAddress]
|
|
4141
|
+
},
|
|
4142
|
+
{
|
|
4143
|
+
address: sv,
|
|
4144
|
+
abi: SUB_VAULT_ABI,
|
|
4145
|
+
functionName: "convertToAssets",
|
|
4146
|
+
args: [0n]
|
|
4147
|
+
}
|
|
4148
|
+
],
|
|
4149
|
+
allowFailure: true
|
|
4150
|
+
});
|
|
4151
|
+
if (erc7540Result?.status === "success") return "erc7540";
|
|
4152
|
+
if (erc4626Result?.status === "success") return "erc4626";
|
|
4153
|
+
return null;
|
|
4154
|
+
}
|
|
4155
|
+
async function getSubVaultInfo(publicClient, vault, subVault) {
|
|
4156
|
+
const v = viem.getAddress(vault);
|
|
4157
|
+
const sv = viem.getAddress(subVault);
|
|
4158
|
+
const [type, basicResults] = await Promise.all([
|
|
4159
|
+
detectSubVaultType(publicClient, sv),
|
|
4160
|
+
publicClient.multicall({
|
|
4161
|
+
contracts: [
|
|
4162
|
+
{ address: sv, abi: METADATA_ABI, functionName: "name" },
|
|
4163
|
+
{ address: sv, abi: METADATA_ABI, functionName: "symbol" },
|
|
4164
|
+
{ address: sv, abi: METADATA_ABI, functionName: "decimals" },
|
|
4165
|
+
{ address: sv, abi: VAULT_ABI, functionName: "asset" },
|
|
4166
|
+
{ address: sv, abi: SUB_VAULT_ABI, functionName: "maxDeposit", args: [v] }
|
|
4167
|
+
],
|
|
4168
|
+
allowFailure: true
|
|
4169
|
+
})
|
|
4170
|
+
]);
|
|
4171
|
+
const name = basicResults[0]?.status === "success" ? basicResults[0].result : "";
|
|
4172
|
+
const symbol = basicResults[1]?.status === "success" ? basicResults[1].result : "";
|
|
4173
|
+
const decimals = basicResults[2]?.status === "success" ? basicResults[2].result : 18;
|
|
4174
|
+
const underlying = basicResults[3]?.status === "success" ? viem.getAddress(basicResults[3].result) : viem.zeroAddress;
|
|
4175
|
+
const maxDeposit = basicResults[4]?.status === "success" ? basicResults[4].result : 0n;
|
|
4176
|
+
const [underlyingResults, registryRaw] = await Promise.all([
|
|
4177
|
+
publicClient.multicall({
|
|
4178
|
+
contracts: [
|
|
4179
|
+
{ address: underlying, abi: METADATA_ABI, functionName: "name" },
|
|
4180
|
+
{ address: underlying, abi: METADATA_ABI, functionName: "symbol" },
|
|
4181
|
+
{ address: underlying, abi: METADATA_ABI, functionName: "decimals" }
|
|
4182
|
+
],
|
|
4183
|
+
allowFailure: true
|
|
4184
|
+
}),
|
|
4185
|
+
publicClient.readContract({ address: v, abi: VAULT_ANALYSIS_ABI, functionName: "moreVaultsRegistry" }).catch(() => null)
|
|
4186
|
+
]);
|
|
4187
|
+
const underlyingSymbol = underlyingResults[1]?.status === "success" ? underlyingResults[1].result : "";
|
|
4188
|
+
const underlyingDecimals = underlyingResults[2]?.status === "success" ? underlyingResults[2].result : 18;
|
|
4189
|
+
let isWhitelisted = false;
|
|
4190
|
+
if (registryRaw) {
|
|
4191
|
+
const registry = viem.getAddress(registryRaw);
|
|
4192
|
+
const whitelistResult = await publicClient.readContract({
|
|
4193
|
+
address: registry,
|
|
4194
|
+
abi: REGISTRY_ABI,
|
|
4195
|
+
functionName: "isWhitelisted",
|
|
4196
|
+
args: [sv]
|
|
4197
|
+
}).catch(() => false);
|
|
4198
|
+
isWhitelisted = whitelistResult;
|
|
4199
|
+
}
|
|
4200
|
+
return {
|
|
4201
|
+
address: sv,
|
|
4202
|
+
type: type ?? "erc4626",
|
|
4203
|
+
name,
|
|
4204
|
+
symbol,
|
|
4205
|
+
decimals,
|
|
4206
|
+
underlyingAsset: underlying,
|
|
4207
|
+
underlyingSymbol,
|
|
4208
|
+
underlyingDecimals,
|
|
4209
|
+
maxDeposit,
|
|
4210
|
+
isWhitelisted
|
|
4211
|
+
};
|
|
4212
|
+
}
|
|
4213
|
+
async function getERC7540RequestStatus(publicClient, vault, subVault) {
|
|
4214
|
+
const v = viem.getAddress(vault);
|
|
4215
|
+
const sv = viem.getAddress(subVault);
|
|
4216
|
+
const results = await publicClient.multicall({
|
|
4217
|
+
contracts: [
|
|
4218
|
+
{ address: sv, abi: SUB_VAULT_ABI, functionName: "pendingDepositRequest", args: [0n, v] },
|
|
4219
|
+
{ address: sv, abi: SUB_VAULT_ABI, functionName: "claimableDepositRequest", args: [0n, v] },
|
|
4220
|
+
{ address: sv, abi: SUB_VAULT_ABI, functionName: "pendingRedeemRequest", args: [0n, v] },
|
|
4221
|
+
{ address: sv, abi: SUB_VAULT_ABI, functionName: "claimableRedeemRequest", args: [0n, v] }
|
|
4222
|
+
],
|
|
4223
|
+
allowFailure: true
|
|
4224
|
+
});
|
|
4225
|
+
const pendingDeposit = results[0]?.status === "success" ? results[0].result : 0n;
|
|
4226
|
+
const claimableDeposit = results[1]?.status === "success" ? results[1].result : 0n;
|
|
4227
|
+
const pendingRedeem = results[2]?.status === "success" ? results[2].result : 0n;
|
|
4228
|
+
const claimableRedeem = results[3]?.status === "success" ? results[3].result : 0n;
|
|
4229
|
+
return {
|
|
4230
|
+
subVault: sv,
|
|
4231
|
+
pendingDeposit,
|
|
4232
|
+
claimableDeposit,
|
|
4233
|
+
pendingRedeem,
|
|
4234
|
+
claimableRedeem,
|
|
4235
|
+
canFinalizeDeposit: claimableDeposit > 0n,
|
|
4236
|
+
canFinalizeRedeem: claimableRedeem > 0n
|
|
4237
|
+
};
|
|
4238
|
+
}
|
|
4239
|
+
async function previewSubVaultDeposit(publicClient, subVault, assets) {
|
|
4240
|
+
const result = await publicClient.readContract({
|
|
4241
|
+
address: viem.getAddress(subVault),
|
|
4242
|
+
abi: SUB_VAULT_ABI,
|
|
4243
|
+
functionName: "previewDeposit",
|
|
4244
|
+
args: [assets]
|
|
4245
|
+
});
|
|
4246
|
+
return result;
|
|
4247
|
+
}
|
|
4248
|
+
async function previewSubVaultRedeem(publicClient, subVault, shares) {
|
|
4249
|
+
const result = await publicClient.readContract({
|
|
4250
|
+
address: viem.getAddress(subVault),
|
|
4251
|
+
abi: SUB_VAULT_ABI,
|
|
4252
|
+
functionName: "previewRedeem",
|
|
4253
|
+
args: [shares]
|
|
4254
|
+
});
|
|
4255
|
+
return result;
|
|
4256
|
+
}
|
|
4257
|
+
async function getVaultPortfolio(publicClient, vault) {
|
|
4258
|
+
const v = viem.getAddress(vault);
|
|
4259
|
+
const [availableRaw, subVaultPositions, vaultTotals] = await Promise.all([
|
|
4260
|
+
publicClient.readContract({ address: v, abi: VAULT_ANALYSIS_ABI, functionName: "getAvailableAssets" }).catch(() => []),
|
|
4261
|
+
getSubVaultPositions(publicClient, v),
|
|
4262
|
+
publicClient.multicall({
|
|
4263
|
+
contracts: [
|
|
4264
|
+
{ address: v, abi: VAULT_ABI, functionName: "totalAssets" },
|
|
4265
|
+
{ address: v, abi: VAULT_ABI, functionName: "totalSupply" },
|
|
4266
|
+
{ address: v, abi: VAULT_ABI, functionName: "asset" }
|
|
4267
|
+
],
|
|
4268
|
+
allowFailure: true
|
|
4269
|
+
})
|
|
4270
|
+
]);
|
|
4271
|
+
const totalAssets = vaultTotals[0]?.status === "success" ? vaultTotals[0].result : 0n;
|
|
4272
|
+
const totalSupply = vaultTotals[1]?.status === "success" ? vaultTotals[1].result : 0n;
|
|
4273
|
+
const underlyingAsset = vaultTotals[2]?.status === "success" ? viem.getAddress(vaultTotals[2].result) : viem.zeroAddress;
|
|
4274
|
+
const availableAddresses = availableRaw.map(viem.getAddress);
|
|
4275
|
+
const subVaultAddressSet = new Set(subVaultPositions.map((p) => p.address.toLowerCase()));
|
|
4276
|
+
const liquidAddresses = availableAddresses.filter(
|
|
4277
|
+
(addr) => !subVaultAddressSet.has(addr.toLowerCase())
|
|
4278
|
+
);
|
|
4279
|
+
const PER_ASSET = 4;
|
|
4280
|
+
const liquidCalls = liquidAddresses.flatMap((addr) => [
|
|
4281
|
+
{ address: addr, abi: ERC20_ABI, functionName: "balanceOf", args: [v] },
|
|
4282
|
+
{ address: addr, abi: METADATA_ABI, functionName: "name" },
|
|
4283
|
+
{ address: addr, abi: METADATA_ABI, functionName: "symbol" },
|
|
4284
|
+
{ address: addr, abi: METADATA_ABI, functionName: "decimals" }
|
|
4285
|
+
]);
|
|
4286
|
+
const liquidResults = liquidAddresses.length > 0 ? await publicClient.multicall({ contracts: liquidCalls, allowFailure: true }) : [];
|
|
4287
|
+
const liquidAssets = liquidAddresses.map((addr, i) => {
|
|
4288
|
+
const base = i * PER_ASSET;
|
|
4289
|
+
const balance = liquidResults[base]?.status === "success" ? liquidResults[base].result : 0n;
|
|
4290
|
+
const name = liquidResults[base + 1]?.status === "success" ? liquidResults[base + 1].result : "";
|
|
4291
|
+
const symbol = liquidResults[base + 2]?.status === "success" ? liquidResults[base + 2].result : "";
|
|
4292
|
+
const decimals = liquidResults[base + 3]?.status === "success" ? liquidResults[base + 3].result : 18;
|
|
4293
|
+
return { address: addr, name, symbol, decimals, balance };
|
|
4294
|
+
});
|
|
4295
|
+
const lockedAssets = await publicClient.readContract({
|
|
4296
|
+
address: v,
|
|
4297
|
+
abi: SUB_VAULT_ABI,
|
|
4298
|
+
functionName: "lockedTokensAmountOfAsset",
|
|
4299
|
+
args: [underlyingAsset]
|
|
4300
|
+
}).catch(() => 0n);
|
|
4301
|
+
const subVaultTotal = subVaultPositions.reduce((sum, p) => sum + p.underlyingValue, 0n);
|
|
4302
|
+
const underlyingBalance = liquidAssets.find(
|
|
4303
|
+
(a) => a.address.toLowerCase() === underlyingAsset.toLowerCase()
|
|
4304
|
+
)?.balance ?? 0n;
|
|
4305
|
+
const totalValue = underlyingBalance + subVaultTotal;
|
|
4306
|
+
return {
|
|
4307
|
+
liquidAssets,
|
|
4308
|
+
subVaultPositions,
|
|
4309
|
+
totalValue,
|
|
4310
|
+
totalAssets,
|
|
4311
|
+
totalSupply,
|
|
4312
|
+
lockedAssets
|
|
4313
|
+
};
|
|
4314
|
+
}
|
|
3950
4315
|
|
|
3951
4316
|
// src/viem/wagmiCompat.ts
|
|
3952
4317
|
function asSdkClient(client) {
|
|
@@ -3986,6 +4351,7 @@ exports.OFT_ROUTES = OFT_ROUTES;
|
|
|
3986
4351
|
exports.OMNI_FACTORY_ADDRESS = OMNI_FACTORY_ADDRESS;
|
|
3987
4352
|
exports.REGISTRY_ABI = REGISTRY_ABI;
|
|
3988
4353
|
exports.STARGATE_TAXI_CMD = STARGATE_TAXI_CMD;
|
|
4354
|
+
exports.SUB_VAULT_ABI = SUB_VAULT_ABI;
|
|
3989
4355
|
exports.UNISWAP_V3_ROUTERS = UNISWAP_V3_ROUTERS;
|
|
3990
4356
|
exports.USDC_STARGATE_OFT = USDC_STARGATE_OFT;
|
|
3991
4357
|
exports.USDC_TOKEN = USDC_TOKEN;
|
|
@@ -4007,21 +4373,28 @@ exports.depositFromSpokeAsync = depositFromSpoke;
|
|
|
4007
4373
|
exports.depositMultiAsset = depositMultiAsset;
|
|
4008
4374
|
exports.depositSimple = depositSimple;
|
|
4009
4375
|
exports.detectStargateOft = detectStargateOft;
|
|
4376
|
+
exports.detectSubVaultType = detectSubVaultType;
|
|
4010
4377
|
exports.discoverVaultTopology = discoverVaultTopology;
|
|
4378
|
+
exports.encodeBridgeParams = encodeBridgeParams;
|
|
4011
4379
|
exports.encodeCuratorAction = encodeCuratorAction;
|
|
4012
4380
|
exports.encodeUniswapV3SwapCalldata = encodeUniswapV3SwapCalldata;
|
|
4013
4381
|
exports.ensureAllowance = ensureAllowance;
|
|
4014
4382
|
exports.executeActions = executeActions;
|
|
4015
4383
|
exports.executeCompose = executeCompose;
|
|
4384
|
+
exports.executeCuratorBridge = executeCuratorBridge;
|
|
4385
|
+
exports.findBridgeRoute = findBridgeRoute;
|
|
4016
4386
|
exports.getAllVaultChainIds = getAllVaultChainIds;
|
|
4017
4387
|
exports.getAsyncRequestStatus = getAsyncRequestStatus;
|
|
4018
4388
|
exports.getAsyncRequestStatusLabel = getAsyncRequestStatusLabel;
|
|
4019
4389
|
exports.getCuratorVaultStatus = getCuratorVaultStatus;
|
|
4390
|
+
exports.getERC7540RequestStatus = getERC7540RequestStatus;
|
|
4020
4391
|
exports.getFullVaultTopology = getFullVaultTopology;
|
|
4021
4392
|
exports.getInboundRoutes = getInboundRoutes;
|
|
4022
4393
|
exports.getMaxWithdrawable = getMaxWithdrawable;
|
|
4023
4394
|
exports.getOutboundRoutes = getOutboundRoutes;
|
|
4024
4395
|
exports.getPendingActions = getPendingActions;
|
|
4396
|
+
exports.getSubVaultInfo = getSubVaultInfo;
|
|
4397
|
+
exports.getSubVaultPositions = getSubVaultPositions;
|
|
4025
4398
|
exports.getUserBalances = getUserBalances;
|
|
4026
4399
|
exports.getUserBalancesForRoutes = getUserBalancesForRoutes;
|
|
4027
4400
|
exports.getUserPosition = getUserPosition;
|
|
@@ -4031,6 +4404,7 @@ exports.getVaultAssetBreakdown = getVaultAssetBreakdown;
|
|
|
4031
4404
|
exports.getVaultDistribution = getVaultDistribution;
|
|
4032
4405
|
exports.getVaultDistributionWithTopology = getVaultDistributionWithTopology;
|
|
4033
4406
|
exports.getVaultMetadata = getVaultMetadata;
|
|
4407
|
+
exports.getVaultPortfolio = getVaultPortfolio;
|
|
4034
4408
|
exports.getVaultStatus = getVaultStatus;
|
|
4035
4409
|
exports.getVaultSummary = getVaultSummary;
|
|
4036
4410
|
exports.getVaultTopology = getVaultTopology;
|
|
@@ -4046,7 +4420,10 @@ exports.preflightSpokeRedeem = preflightSpokeRedeem;
|
|
|
4046
4420
|
exports.preflightSync = preflightSync;
|
|
4047
4421
|
exports.previewDeposit = previewDeposit;
|
|
4048
4422
|
exports.previewRedeem = previewRedeem;
|
|
4423
|
+
exports.previewSubVaultDeposit = previewSubVaultDeposit;
|
|
4424
|
+
exports.previewSubVaultRedeem = previewSubVaultRedeem;
|
|
4049
4425
|
exports.quoteComposeFee = quoteComposeFee;
|
|
4426
|
+
exports.quoteCuratorBridgeFee = quoteCuratorBridgeFee;
|
|
4050
4427
|
exports.quoteDepositFromSpokeFee = quoteDepositFromSpokeFee;
|
|
4051
4428
|
exports.quoteLzFee = quoteLzFee;
|
|
4052
4429
|
exports.quoteRouteDepositFee = quoteRouteDepositFee;
|