@flapsdk/vault-runtime 0.1.4 → 0.1.6
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/host.d.mts +4 -4
- package/host.js +28 -7
- package/host.js.map +1 -1
- package/{hostRuntimeConfig-8d2c6qsO.d.mts → hostRuntimeConfig-QdcwQfpd.d.mts} +1 -1
- package/package.json +1 -1
- package/runtime-contract.json +1 -1
- package/sdk.d.mts +3 -3
- package/sdk.js +19 -4
- package/sdk.js.map +1 -1
- package/server.d.mts +3 -3
- package/{txError-BmDt5Z4B.d.mts → txError-Dd0Oug-u.d.mts} +2 -1
- package/{types-DzTX2u7q.d.mts → types-COZWeTke.d.mts} +2 -0
- package/ui.d.mts +10 -1
- package/ui.js +26 -1
- package/ui.js.map +1 -1
package/host.d.mts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { a as Address, B as TokenRuntimeSnapshot, z as TokenMetadataSnapshot, n as HostRuntimeInput, H as HostRuntimeAddresses, r as HostRuntimeResult, c as CreateVaultRuntimeContextInput, K as VaultRuntimeContext } from './types-
|
|
2
|
-
export { A as ActionAvailabilityStage, C as ContractReadRequest, b as ContractWriteRequest, E as EndpointPolicy, F as FeeMode, d as FlapFeeVaultInfo, e as FlapI18n, f as FlapNotify, g as FlapTaxInfo, h as FlapTokenInfo, i as FlapVaultPortalInfo, j as FlapVaultSdk, k as FlapWallet, l as HostRuntimeDataSource, m as HostRuntimeDegradeReason, o as HostRuntimePolicy, p as HostRuntimePresentationFetcher, q as HostRuntimePresentationRequest, s as HostRuntimeSources, t as HostRuntimeStatus, u as HostRuntimeWarning, v as HostTokenPresentation, M as ManifestBindingEntry, w as ManifestExternalContract, O as OracleProvision, x as OracleReadRequest, y as OracleReader, P as PaymentToken, R as RuntimeOracleRegistry, S as SimulateResult, T as TokenMarketPhase, D as TxReceipt, V as VaultComponentProps, G as VaultHostContext, I as VaultManifest, J as VaultRenderSurface, L as VaultRuntimeContextOverrides, N as VaultRuntimeExtraConfig } from './types-
|
|
3
|
-
export { C as CreateTaxInfoHostContextInput, O as OracleReadError, R as ResolveRenderSurfaceInput, a as RuntimeMatchInput, T as TaxVaultHostSnapshot, b as TxErrorKind, V as VaultBindingPolicy, Z as ZERO_ADDRESS, c as buildLocalOracleUrl, d as createLocalOracleReader, e as createTaxInfoHostContext, f as fetchOracleJson, g as fetchProvisionedOracle, h as formatCountdown, i as formatPercentBps, j as formatTokenAmount, k as getTupleField, l as getTxErrorKind, m as handleTxError, n as isActionAvailableForPhase, o as isCustomVaultTaxToken, p as isManifestRuntimeMatch, q as isSameAddress, r as isValidAddress, s as isVaultBindingMatch, t as normalizeAddress, u as parseFeeVaultInfo, v as parsePortalTokenInfo, w as parseTaxTokenInfo, x as parseTokenAmount, y as parseVaultPortalInfo, z as readTaxVaultHostContext, A as resolveFeeMode, B as resolveManifestBinding, D as resolveTaxInfoRenderSurface, E as resolveTokenMarketPhase, F as resolveVaultBinding, G as shortenAddress, H as standardErc20Abi } from './txError-
|
|
1
|
+
import { a as Address, B as TokenRuntimeSnapshot, z as TokenMetadataSnapshot, n as HostRuntimeInput, H as HostRuntimeAddresses, r as HostRuntimeResult, c as CreateVaultRuntimeContextInput, K as VaultRuntimeContext } from './types-COZWeTke.mjs';
|
|
2
|
+
export { A as ActionAvailabilityStage, C as ContractReadRequest, b as ContractWriteRequest, E as EndpointPolicy, F as FeeMode, d as FlapFeeVaultInfo, e as FlapI18n, f as FlapNotify, g as FlapTaxInfo, h as FlapTokenInfo, i as FlapVaultPortalInfo, j as FlapVaultSdk, k as FlapWallet, l as HostRuntimeDataSource, m as HostRuntimeDegradeReason, o as HostRuntimePolicy, p as HostRuntimePresentationFetcher, q as HostRuntimePresentationRequest, s as HostRuntimeSources, t as HostRuntimeStatus, u as HostRuntimeWarning, v as HostTokenPresentation, M as ManifestBindingEntry, w as ManifestExternalContract, O as OracleProvision, x as OracleReadRequest, y as OracleReader, P as PaymentToken, R as RuntimeOracleRegistry, S as SimulateResult, T as TokenMarketPhase, D as TxReceipt, V as VaultComponentProps, G as VaultHostContext, I as VaultManifest, J as VaultRenderSurface, L as VaultRuntimeContextOverrides, N as VaultRuntimeExtraConfig } from './types-COZWeTke.mjs';
|
|
3
|
+
export { C as CreateTaxInfoHostContextInput, O as OracleReadError, R as ResolveRenderSurfaceInput, a as RuntimeMatchInput, T as TaxVaultHostSnapshot, b as TxErrorKind, V as VaultBindingPolicy, Z as ZERO_ADDRESS, c as buildLocalOracleUrl, d as createLocalOracleReader, e as createTaxInfoHostContext, f as fetchOracleJson, g as fetchProvisionedOracle, h as formatCountdown, i as formatPercentBps, j as formatTokenAmount, k as getTupleField, l as getTxErrorKind, m as handleTxError, n as isActionAvailableForPhase, o as isCustomVaultTaxToken, p as isManifestRuntimeMatch, q as isSameAddress, r as isValidAddress, s as isVaultBindingMatch, t as normalizeAddress, u as parseFeeVaultInfo, v as parsePortalTokenInfo, w as parseTaxTokenInfo, x as parseTokenAmount, y as parseVaultPortalInfo, z as readTaxVaultHostContext, A as resolveFeeMode, B as resolveManifestBinding, D as resolveTaxInfoRenderSurface, E as resolveTokenMarketPhase, F as resolveVaultBinding, G as shortenAddress, H as standardErc20Abi } from './txError-Dd0Oug-u.mjs';
|
|
4
4
|
import { PublicClient } from 'viem';
|
|
5
5
|
export { erc20Abi } from 'viem';
|
|
6
|
-
export { T as TaxVaultHostChainConfig, g as getTaxVaultHostChainConfig } from './hostRuntimeConfig-
|
|
6
|
+
export { T as TaxVaultHostChainConfig, g as getTaxVaultHostChainConfig } from './hostRuntimeConfig-QdcwQfpd.mjs';
|
|
7
7
|
|
|
8
8
|
declare function readErc20TokenMetadata(publicClient: PublicClient, tokenAddress?: Address | null): Promise<TokenMetadataSnapshot | null>;
|
|
9
9
|
declare function loadTokenRuntimeSnapshot(publicClient: PublicClient, chainId: number, tokenAddress?: Address | null): Promise<TokenRuntimeSnapshot | null>;
|
package/host.js
CHANGED
|
@@ -186,11 +186,13 @@ function resolveManifestBinding(manifest, input) {
|
|
|
186
186
|
const matchesChain = (binding) => !input.chainId || binding.chainId === input.chainId;
|
|
187
187
|
const matchesToken = (binding) => !input.tokenAddress || !binding.tokenAddresses?.length || binding.tokenAddresses.some((address) => isSameAddress(address, input.tokenAddress));
|
|
188
188
|
const isVaultScopedBinding = (binding) => !binding.factoryAddress && Boolean(binding.vaultAddresses?.length);
|
|
189
|
+
const isTokenScopedBinding = (binding) => !binding.factoryAddress && !binding.vaultAddresses?.length && Boolean(binding.tokenAddresses?.length);
|
|
189
190
|
if (input.factoryAddress) {
|
|
190
191
|
const factoryMatch = resolveUnique(
|
|
191
192
|
bindings.filter((binding) => matchesChain(binding) && Boolean(binding.factoryAddress) && isSameAddress(binding.factoryAddress, input.factoryAddress) && matchesToken(binding))
|
|
192
193
|
);
|
|
193
|
-
if (factoryMatch
|
|
194
|
+
if (factoryMatch) return factoryMatch;
|
|
195
|
+
if (!input.vaultAddress && !input.tokenAddress) return null;
|
|
194
196
|
}
|
|
195
197
|
if (input.vaultAddress) {
|
|
196
198
|
const vaultMatch = resolveUnique(
|
|
@@ -200,36 +202,55 @@ function resolveManifestBinding(manifest, input) {
|
|
|
200
202
|
);
|
|
201
203
|
if (vaultMatch) return vaultMatch;
|
|
202
204
|
}
|
|
205
|
+
if (input.tokenAddress) {
|
|
206
|
+
const tokenMatch = resolveUnique(
|
|
207
|
+
bindings.filter(
|
|
208
|
+
(binding) => matchesChain(binding) && isTokenScopedBinding(binding) && Boolean(binding.tokenAddresses?.some((address) => isSameAddress(address, input.tokenAddress)))
|
|
209
|
+
)
|
|
210
|
+
);
|
|
211
|
+
if (tokenMatch) return tokenMatch;
|
|
212
|
+
}
|
|
203
213
|
if (input.factoryAddress || input.vaultAddress) {
|
|
204
214
|
return null;
|
|
205
215
|
}
|
|
206
|
-
if (input.chainId) {
|
|
207
|
-
|
|
216
|
+
if (input.chainId && input.tokenAddress) {
|
|
217
|
+
const tokenScopedMatch = resolveUnique(bindings.filter((binding) => binding.chainId === input.chainId && binding.tokenAddresses?.some((address) => isSameAddress(address, input.tokenAddress))));
|
|
218
|
+
if (tokenScopedMatch) return tokenScopedMatch;
|
|
208
219
|
}
|
|
209
220
|
if (input.tokenAddress) {
|
|
210
221
|
return resolveUnique(bindings.filter((binding) => binding.tokenAddresses?.some((address) => isSameAddress(address, input.tokenAddress))));
|
|
211
222
|
}
|
|
223
|
+
if (input.chainId) {
|
|
224
|
+
return resolveUnique(bindings.filter((binding) => binding.chainId === input.chainId && matchesToken(binding)));
|
|
225
|
+
}
|
|
212
226
|
return null;
|
|
213
227
|
}
|
|
214
228
|
function isManifestRuntimeMatch(manifest, input) {
|
|
215
|
-
if (!input.chainId || !input.factoryAddress && !input.vaultAddress) return false;
|
|
229
|
+
if (!input.chainId || !input.factoryAddress && !input.vaultAddress && !input.tokenAddress) return false;
|
|
216
230
|
const matchingBinding = resolveManifestBinding(manifest, input);
|
|
217
231
|
if (!matchingBinding) return false;
|
|
218
232
|
if (matchingBinding.chainId !== input.chainId) return false;
|
|
219
233
|
if (matchingBinding.factoryAddress) return isSameAddress(matchingBinding.factoryAddress, input.factoryAddress);
|
|
220
234
|
const vaultAddress = matchingBinding.vaultAddresses?.[0];
|
|
221
|
-
if (
|
|
235
|
+
if (vaultAddress && !isSameAddress(vaultAddress, input.vaultAddress)) return false;
|
|
222
236
|
if (input.tokenAddress && matchingBinding.tokenAddresses?.length) {
|
|
223
237
|
return matchingBinding.tokenAddresses.some((address) => isSameAddress(address, input.tokenAddress));
|
|
224
238
|
}
|
|
239
|
+
if (!vaultAddress && matchingBinding.tokenAddresses?.length) return false;
|
|
225
240
|
return true;
|
|
226
241
|
}
|
|
227
242
|
function isVaultBindingMatch(binding, input) {
|
|
228
243
|
if (!input.chainId || binding.chainId !== input.chainId) return false;
|
|
229
244
|
if (binding.factoryAddress) return Boolean(input.factoryAddress && isSameAddress(binding.factoryAddress, input.factoryAddress));
|
|
230
245
|
const vaultAddress = binding.vaultAddresses?.[0];
|
|
231
|
-
if (
|
|
232
|
-
|
|
246
|
+
if (vaultAddress) {
|
|
247
|
+
if (!input.vaultAddress || !isSameAddress(vaultAddress, input.vaultAddress)) return false;
|
|
248
|
+
if (input.tokenAddress && binding.tokenAddresses?.length) {
|
|
249
|
+
return binding.tokenAddresses.some((address) => isSameAddress(address, input.tokenAddress));
|
|
250
|
+
}
|
|
251
|
+
return true;
|
|
252
|
+
}
|
|
253
|
+
return Boolean(input.tokenAddress && binding.tokenAddresses?.some((address) => isSameAddress(address, input.tokenAddress)));
|
|
233
254
|
}
|
|
234
255
|
function resolveVaultBinding(bindings, input) {
|
|
235
256
|
return bindings.find((binding) => isVaultBindingMatch(binding, input)) ?? null;
|
package/host.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/sdk/erc20.ts","../../src/sdk/format.ts","../../src/sdk/hostRuntimeConfig.ts","../../src/sdk/taxInfo.ts","../../src/sdk/hostRead.ts","../../src/sdk/hostRuntime.ts","../../src/sdk/oracle.ts","../../src/sdk/runtimeContext.ts","../../src/sdk/txError.ts"],"names":["host"],"mappings":"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","file":"host.js","sourcesContent":["import { erc20Abi } from \"viem\";\n\nexport { erc20Abi };\nexport const standardErc20Abi = erc20Abi;\n","import Decimal from \"decimal.js\";\nimport { formatUnits, parseUnits } from \"viem\";\n\nexport function shortenAddress(raw?: string, start = 6, end = 4) {\n if (!raw) return \"\";\n if (raw.length <= start + end) return raw;\n return `${raw.slice(0, start)}...${raw.slice(-end)}`;\n}\n\nexport function formatTokenAmount(value?: bigint | string | number | null, decimals = 18, precision = 4) {\n if (value === undefined || value === null) return \"-\";\n const raw = typeof value === \"bigint\" ? formatUnits(value, decimals) : String(value);\n return new Decimal(raw).toDecimalPlaces(precision, Decimal.ROUND_DOWN).toString();\n}\n\nexport function parseTokenAmount(value: string, decimals = 18) {\n if (!/^\\d*(\\.\\d*)?$/.test(value.trim())) {\n throw new Error(\"Invalid decimal amount.\");\n }\n return parseUnits(value || \"0\", decimals);\n}\n\nexport function formatPercentBps(value?: bigint | number | null, precision = 2) {\n if (value === undefined || value === null) return \"-\";\n return `${new Decimal(String(value)).div(100).toDecimalPlaces(precision).toString()}%`;\n}\n\nexport function formatCountdown(targetTimeMs?: number) {\n if (!targetTimeMs) return \"-\";\n const diff = Math.max(0, targetTimeMs - Date.now());\n const totalSeconds = Math.floor(diff / 1000);\n const days = Math.floor(totalSeconds / 86400);\n const hours = Math.floor((totalSeconds % 86400) / 3600);\n const minutes = Math.floor((totalSeconds % 3600) / 60);\n const seconds = totalSeconds % 60;\n if (days > 0) return `${days}d ${hours}h ${minutes}m`;\n if (hours > 0) return `${hours}h ${minutes}m ${seconds}s`;\n return `${minutes}m ${seconds}s`;\n}\n","import type { Address } from \"./types\";\n\nexport interface TaxVaultHostChainConfig {\n portal: Address;\n taxTokenHelperAddress?: Address;\n vaultPortal?: Address;\n wrappedNativeTokenAddress?: Address;\n giftVaultFactory?: Address;\n hostChainSlug?: string;\n ipfsGateway?: string;\n}\n\nconst taxVaultHostChains: Record<number, TaxVaultHostChainConfig> = {\n 56: {\n portal: \"0xe2ce6ab80874fa9fa2aae65d277dd6b8e65c9de0\",\n taxTokenHelperAddress: \"0x53841c73217735F37BC1775538b03b23feFD8346\",\n vaultPortal: \"0x90497450f2a706f1951b5bdda52B4E5d16f34C06\",\n wrappedNativeTokenAddress: \"0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c\",\n giftVaultFactory: \"0x025549F52B03cF36f9e1a337c02d3AA7Af66ab32\",\n hostChainSlug: \"bnb\",\n ipfsGateway: \"https://gateway.pinata.cloud\",\n },\n 97: {\n portal: \"0x5bEacaF7ABCbB3aB280e80D007FD31fcE26510e9\",\n taxTokenHelperAddress: \"0xD64441e5FcD02D342B8cf6eBA10Ef6E40d0dA90f\",\n vaultPortal: \"0x027e3704fC5C16522e9393d04C60A3ac5c0d775f\",\n wrappedNativeTokenAddress: \"0xae13d989daC2f0dEbFf460aC112a837C89BAa7cd\",\n giftVaultFactory: \"0xa02DA44D67DB6D692efa7f751b5952bd670d5326\",\n hostChainSlug: \"bnb-testnet\",\n ipfsGateway: \"https://gateway.pinata.cloud\",\n },\n};\n\nexport function getTaxVaultHostChainConfig(chainId: number) {\n return taxVaultHostChains[chainId];\n}\n","import type {\n ActionAvailabilityStage,\n Address,\n FeeMode,\n FlapFeeVaultInfo,\n FlapTaxInfo,\n FlapTokenInfo,\n FlapVaultPortalInfo,\n ManifestBindingEntry,\n TokenMarketPhase,\n VaultHostContext,\n VaultManifest,\n VaultRenderSurface,\n} from \"./types\";\n\nexport const ZERO_ADDRESS = \"0x0000000000000000000000000000000000000000\" as Address;\n\ntype TupleLike = (Record<string, unknown> & readonly unknown[]) | Record<string, unknown> | readonly unknown[] | null | undefined;\n\nexport interface VaultBindingPolicy {\n name: string;\n chainId: number;\n factoryAddress?: Address;\n vaultAddresses?: Address[];\n extra?: Record<string, unknown>;\n isAiPowered?: boolean;\n}\n\nexport interface RuntimeMatchInput {\n chainId?: number;\n factoryAddress?: string | null;\n vaultAddress?: string | null;\n tokenAddress?: string | null;\n}\n\nexport interface CreateTaxInfoHostContextInput {\n tokenInfo?: FlapTokenInfo | null;\n taxInfo?: FlapTaxInfo | null;\n vaultInfo?: FlapVaultPortalInfo | null;\n feeMode?: FeeMode | null;\n giftVaultFactory?: string | null;\n hasTaxVaults?: boolean;\n vaultType?: string;\n copyScope?: \"tax\" | \"fee\";\n}\n\nexport interface ResolveRenderSurfaceInput {\n tokenInfo?: FlapTokenInfo | null;\n taxInfo?: FlapTaxInfo | null;\n hasTaxVaults?: boolean;\n isNonTaxFeeToken?: boolean;\n}\n\nexport interface TaxVaultHostSnapshot {\n tokenInfo?: FlapTokenInfo;\n taxInfo?: FlapTaxInfo | null;\n vaultInfo?: FlapVaultPortalInfo | null;\n feeMode: FeeMode;\n renderSurface: VaultRenderSurface;\n vaultType?: string;\n copyScope: \"tax\" | \"fee\";\n marketPhase: TokenMarketPhase;\n isListed: boolean;\n isTaxToken: boolean;\n isSupportedCustomVaultToken: boolean;\n}\n\nexport function getTupleField(data: TupleLike, name: string, index: number) {\n if (!data) return undefined;\n const record = data as Record<string, unknown>;\n const tuple = data as readonly unknown[];\n return record[name] ?? tuple[index];\n}\n\nexport function isValidAddress(value?: string | null): value is Address {\n return Boolean(value && /^0x[a-fA-F0-9]{40}$/.test(value));\n}\n\nexport function normalizeAddress(value?: string | null): Address | undefined {\n return isValidAddress(value) ? (value as Address) : undefined;\n}\n\nexport function isSameAddress(a?: string | null, b?: string | null) {\n return Boolean(a && b && a.toLowerCase() === b.toLowerCase());\n}\n\nfunction toNumber(value: unknown, fallback = 0) {\n if (typeof value === \"bigint\") return Number(value);\n if (typeof value === \"number\") return Number.isFinite(value) ? value : fallback;\n if (typeof value === \"string\" && value.trim()) {\n const parsed = Number(value);\n return Number.isFinite(parsed) ? parsed : fallback;\n }\n return fallback;\n}\n\nfunction toBigInt(value: unknown, fallback = 0n) {\n if (typeof value === \"bigint\") return value;\n if (typeof value === \"number\" && Number.isFinite(value)) return BigInt(Math.trunc(value));\n if (typeof value === \"string\" && value.trim()) {\n try {\n return BigInt(value);\n } catch {\n return fallback;\n }\n }\n return fallback;\n}\n\nfunction toBooleanOrNull(value: unknown) {\n if (typeof value === \"boolean\") return value;\n if (value === null || value === undefined) return null;\n return Boolean(value);\n}\n\nfunction toAddressOrNull(value: unknown): Address | null {\n return typeof value === \"string\" && isValidAddress(value) ? (value as Address) : null;\n}\n\nfunction toStringOrUndefined(value: unknown) {\n return typeof value === \"string\" && value.length > 0 ? value : undefined;\n}\n\nexport function parsePortalTokenInfo(tokenData: TupleLike): FlapTokenInfo | null {\n if (!tokenData) return null;\n\n const status = toNumber(getTupleField(tokenData, \"status\", 0));\n const taxRateRaw = toBigInt(getTupleField(tokenData, \"taxRate\", 12));\n const quoteTokenAddress = toAddressOrNull(getTupleField(tokenData, \"quoteTokenAddress\", 9)) ?? ZERO_ADDRESS;\n\n return {\n exists: status !== 0,\n isTaxToken: taxRateRaw > 0n,\n taxRate: Number(taxRateRaw),\n taxRateRaw,\n quoteTokenAddress,\n status,\n tokenVersion: toNumber(getTupleField(tokenData, \"tokenVersion\", 4)),\n };\n}\n\nexport function parseFeeVaultInfo(vaultInfo: TupleLike): FlapFeeVaultInfo | null {\n if (!vaultInfo) return null;\n\n return {\n addr: toAddressOrNull(getTupleField(vaultInfo, \"addr\", 0)),\n factory: toAddressOrNull(getTupleField(vaultInfo, \"factory\", 1)),\n riskLevel: toNumber(getTupleField(vaultInfo, \"riskLevel\", 2)),\n isOfficialVault: toBooleanOrNull(getTupleField(vaultInfo, \"isOfficialVault\", 3)),\n isVault: toBooleanOrNull(getTupleField(vaultInfo, \"isVault\", 4)),\n isAIConsumer: toBooleanOrNull(getTupleField(vaultInfo, \"isAIConsumer\", 5)),\n };\n}\n\nexport function parseTaxTokenInfo(\n taxInfo: TupleLike,\n taxInfoV2?: TupleLike,\n options: { wrappedNativeTokenAddress?: Address } = {},\n): FlapTaxInfo | null {\n if (!taxInfo) return null;\n\n const quoteToken = toAddressOrNull(getTupleField(taxInfo, \"quoteToken\", 11)) ?? ZERO_ADDRESS;\n const rawDividendToken = toAddressOrNull(getTupleField(taxInfoV2, \"dividendToken\", 11)) ?? quoteToken;\n const dividendToken =\n quoteToken === ZERO_ADDRESS && rawDividendToken === ZERO_ADDRESS && options.wrappedNativeTokenAddress\n ? options.wrappedNativeTokenAddress\n : rawDividendToken;\n\n return {\n marketBps: toNumber(getTupleField(taxInfo, \"marketBps\", 0)),\n deflationBps: toNumber(getTupleField(taxInfo, \"deflationBps\", 1)),\n lpBps: toNumber(getTupleField(taxInfo, \"lpBps\", 2)),\n dividendBps: toNumber(getTupleField(taxInfo, \"dividendBps\", 3)),\n feeRate: toNumber(getTupleField(taxInfo, \"feeRate\", 4)),\n buyTaxRate: taxInfoV2 ? toNumber(getTupleField(taxInfoV2, \"buyTaxRate\", 4)) : undefined,\n sellTaxRate: taxInfoV2 ? toNumber(getTupleField(taxInfoV2, \"sellTaxRate\", 5)) : undefined,\n burntTokenAmount: toBigInt(getTupleField(taxInfo, \"burntTokenAmount\", 5)),\n totalQuoteSentToDividend: toBigInt(getTupleField(taxInfo, \"totalQuoteSentToDividend\", 6)),\n totalQuoteAddedToLiquidity: toBigInt(getTupleField(taxInfo, \"totalQuoteAddedToLiquidity\", 7)),\n totalTokenAddedToLiquidity: toBigInt(getTupleField(taxInfo, \"totalTokenAddedToLiquidity\", 8)),\n totalQuoteSentToMarketing: toBigInt(getTupleField(taxInfo, \"totalQuoteSentToMarketing\", 9)),\n marketingWallet: toAddressOrNull(getTupleField(taxInfo, \"marketingWallet\", 10)) ?? ZERO_ADDRESS,\n dividendToken,\n quoteToken,\n minimumShareBalance: toBigInt(getTupleField(taxInfo, \"minimumShareBalance\", 12)),\n vaultInfo: parseFeeVaultInfo(getTupleField(taxInfoV2, \"vaultInfo\", 14) as TupleLike),\n };\n}\n\nexport function parseVaultPortalInfo(vaultData: TupleLike): FlapVaultPortalInfo | null {\n if (!vaultData) return null;\n\n const found = Boolean(getTupleField(vaultData, \"found\", 0));\n const info = getTupleField(vaultData, \"info\", 1) as TupleLike;\n\n if (!found || !info) return { found: false };\n\n return {\n found: true,\n vault: toAddressOrNull(getTupleField(info, \"vault\", 0)) ?? ZERO_ADDRESS,\n vaultFactory: toAddressOrNull(getTupleField(info, \"vaultFactory\", 1)) ?? ZERO_ADDRESS,\n description: toStringOrUndefined(getTupleField(info, \"description\", 2)),\n isOfficial: Boolean(getTupleField(info, \"isOfficial\", 3)),\n riskLevel: toNumber(getTupleField(info, \"riskLevel\", 4)),\n };\n}\n\nexport function resolveManifestBinding(manifest: Pick<VaultManifest, \"match\">, input: RuntimeMatchInput): ManifestBindingEntry | null {\n const bindings = manifest.match.bindings;\n if (!bindings.length) return null;\n\n const resolveUnique = (candidates: ManifestBindingEntry[]) => {\n if (candidates.length === 1) return candidates[0];\n return null;\n };\n\n const matchesChain = (binding: ManifestBindingEntry) => !input.chainId || binding.chainId === input.chainId;\n const matchesToken = (binding: ManifestBindingEntry) =>\n !input.tokenAddress || !binding.tokenAddresses?.length || binding.tokenAddresses.some((address) => isSameAddress(address, input.tokenAddress));\n const isVaultScopedBinding = (binding: ManifestBindingEntry) => !binding.factoryAddress && Boolean(binding.vaultAddresses?.length);\n\n if (input.factoryAddress) {\n const factoryMatch = resolveUnique(\n bindings.filter((binding) => matchesChain(binding) && Boolean(binding.factoryAddress) && isSameAddress(binding.factoryAddress, input.factoryAddress) && matchesToken(binding)),\n );\n if (factoryMatch || !input.vaultAddress) return factoryMatch;\n }\n\n if (input.vaultAddress) {\n const vaultMatch = resolveUnique(\n bindings.filter(\n (binding) =>\n matchesChain(binding) &&\n isVaultScopedBinding(binding) &&\n Boolean(binding.vaultAddresses?.some((address) => isSameAddress(address, input.vaultAddress))) &&\n matchesToken(binding),\n ),\n );\n if (vaultMatch) return vaultMatch;\n }\n\n if (input.factoryAddress || input.vaultAddress) {\n return null;\n }\n\n if (input.chainId) {\n return resolveUnique(bindings.filter((binding) => binding.chainId === input.chainId && matchesToken(binding)));\n }\n\n if (input.tokenAddress) {\n return resolveUnique(bindings.filter((binding) => binding.tokenAddresses?.some((address) => isSameAddress(address, input.tokenAddress))));\n }\n\n return null;\n}\n\nexport function isManifestRuntimeMatch(manifest: Pick<VaultManifest, \"match\">, input: RuntimeMatchInput) {\n if (!input.chainId || (!input.factoryAddress && !input.vaultAddress)) return false;\n const matchingBinding = resolveManifestBinding(manifest, input);\n if (!matchingBinding) return false;\n if (matchingBinding.chainId !== input.chainId) return false;\n if (matchingBinding.factoryAddress) return isSameAddress(matchingBinding.factoryAddress, input.factoryAddress);\n const vaultAddress = matchingBinding.vaultAddresses?.[0];\n if (!vaultAddress || !isSameAddress(vaultAddress, input.vaultAddress)) return false;\n if (input.tokenAddress && matchingBinding.tokenAddresses?.length) {\n return matchingBinding.tokenAddresses.some((address) => isSameAddress(address, input.tokenAddress));\n }\n return true;\n}\n\nexport function isVaultBindingMatch(binding: VaultBindingPolicy, input: RuntimeMatchInput) {\n if (!input.chainId || binding.chainId !== input.chainId) return false;\n if (binding.factoryAddress) return Boolean(input.factoryAddress && isSameAddress(binding.factoryAddress, input.factoryAddress));\n const vaultAddress = binding.vaultAddresses?.[0];\n if (!vaultAddress || !input.vaultAddress || !isSameAddress(vaultAddress, input.vaultAddress)) return false;\n return true;\n}\n\nexport function resolveVaultBinding(bindings: VaultBindingPolicy[], input: RuntimeMatchInput) {\n return bindings.find((binding) => isVaultBindingMatch(binding, input)) ?? null;\n}\n\nexport function resolveFeeMode(taxInfo: FlapTaxInfo | TupleLike | null | undefined, giftVaultFactory?: string | null): FeeMode {\n if (!taxInfo) return \"unknown\";\n\n const marketBps = toNumber(getTupleField(taxInfo as TupleLike, \"marketBps\", 0));\n const dividendBps = toNumber(getTupleField(taxInfo as TupleLike, \"dividendBps\", 3));\n\n if (dividendBps > 0) return \"holder\";\n if (marketBps <= 0) return \"unknown\";\n\n const parsedVaultInfo =\n \"vaultInfo\" in Object(taxInfo)\n ? (taxInfo as FlapTaxInfo).vaultInfo\n : parseFeeVaultInfo(getTupleField(taxInfo as TupleLike, \"vaultInfo\", 14) as TupleLike);\n\n if (parsedVaultInfo?.isVault === true) {\n return isSameAddress(parsedVaultInfo.factory, giftVaultFactory) ? \"gift\" : \"unknown\";\n }\n\n return \"creator\";\n}\n\nexport function resolveTaxInfoRenderSurface({\n tokenInfo,\n taxInfo,\n hasTaxVaults = false,\n isNonTaxFeeToken = false,\n}: ResolveRenderSurfaceInput): VaultRenderSurface {\n if (!tokenInfo?.exists) return \"unavailable\";\n if (!tokenInfo.isTaxToken) return isNonTaxFeeToken ? \"feeinfo\" : \"unavailable\";\n if (taxInfo?.marketBps === 10000 && hasTaxVaults) return \"vault-taxinfo\";\n return \"standard-taxinfo\";\n}\n\nexport function resolveTokenMarketPhase(tokenInfo?: FlapTokenInfo | null): TokenMarketPhase {\n if (!tokenInfo?.exists) return \"unknown\";\n return tokenInfo.status >= 2 ? \"dex-listed\" : \"internal-market\";\n}\n\nexport function isCustomVaultTaxToken(tokenInfo?: FlapTokenInfo | null) {\n return Boolean(tokenInfo?.exists && tokenInfo.isTaxToken);\n}\n\nexport function isActionAvailableForPhase(stage: ActionAvailabilityStage, marketPhase: TokenMarketPhase = \"unknown\") {\n if (stage === \"read-only\") return false;\n if (stage === \"both\") return true;\n if (marketPhase === \"unknown\") return false;\n return stage === marketPhase;\n}\n\nexport function createTaxInfoHostContext({\n tokenInfo,\n taxInfo,\n vaultInfo,\n feeMode,\n giftVaultFactory,\n hasTaxVaults,\n vaultType,\n copyScope = \"tax\",\n}: CreateTaxInfoHostContextInput): VaultHostContext {\n const resolvedFeeMode = feeMode ?? resolveFeeMode(taxInfo, giftVaultFactory);\n const renderSurface = resolveTaxInfoRenderSurface({\n tokenInfo,\n taxInfo,\n hasTaxVaults: hasTaxVaults ?? Boolean(vaultInfo?.found),\n isNonTaxFeeToken: copyScope === \"fee\",\n });\n const marketPhase = resolveTokenMarketPhase(tokenInfo);\n\n return {\n tokenInfo: tokenInfo ?? undefined,\n taxInfo: taxInfo ?? null,\n vaultInfo: vaultInfo ?? null,\n feeMode: resolvedFeeMode,\n renderSurface,\n vaultType,\n copyScope,\n isListed: tokenInfo ? tokenInfo.status >= 2 : undefined,\n marketPhase,\n };\n}\n\nexport function readTaxVaultHostContext(host?: VaultHostContext | null): TaxVaultHostSnapshot {\n const tokenInfo = host?.tokenInfo;\n const marketPhase = host?.marketPhase ?? resolveTokenMarketPhase(tokenInfo);\n const isListed = host?.isListed ?? Boolean(tokenInfo && tokenInfo.status >= 2);\n const isTaxToken = tokenInfo?.isTaxToken === true;\n\n return {\n tokenInfo,\n taxInfo: host?.taxInfo ?? null,\n vaultInfo: host?.vaultInfo ?? null,\n feeMode: host?.feeMode ?? \"unknown\",\n renderSurface: host?.renderSurface ?? \"unavailable\",\n vaultType: host?.vaultType,\n copyScope: host?.copyScope ?? \"tax\",\n marketPhase,\n isListed,\n isTaxToken,\n isSupportedCustomVaultToken: isCustomVaultTaxToken(tokenInfo),\n };\n}\n","import type { PublicClient } from \"viem\";\nimport { erc20Abi } from \"./erc20\";\nimport { getTaxVaultHostChainConfig } from \"./hostRuntimeConfig\";\nimport { createTaxInfoHostContext, isValidAddress, parsePortalTokenInfo, parseTaxTokenInfo, parseVaultPortalInfo, ZERO_ADDRESS } from \"./taxInfo\";\nimport type { Address, FlapTokenInfo, PaymentToken, TokenMetadataSnapshot, TokenRuntimeSnapshot } from \"./types\";\n\nconst portalAbi = [\n {\n name: \"getTokenV7\",\n type: \"function\",\n stateMutability: \"view\",\n inputs: [{ name: \"\", type: \"address\" }],\n outputs: [\n {\n type: \"tuple\",\n components: [\n { name: \"status\", type: \"uint8\" },\n { name: \"reserve\", type: \"uint256\" },\n { name: \"circulatingSupply\", type: \"uint256\" },\n { name: \"price\", type: \"uint256\" },\n { name: \"tokenVersion\", type: \"uint8\" },\n { name: \"r\", type: \"uint256\" },\n { name: \"h\", type: \"uint256\" },\n { name: \"k\", type: \"uint256\" },\n { name: \"dexSupplyThresh\", type: \"uint256\" },\n { name: \"quoteTokenAddress\", type: \"address\" },\n { name: \"nativeToQuoteSwapEnabled\", type: \"bool\" },\n { name: \"extensionID\", type: \"bytes32\" },\n { name: \"taxRate\", type: \"uint256\" },\n { name: \"pool\", type: \"address\" },\n { name: \"progress\", type: \"uint256\" },\n { name: \"lpFeeProfile\", type: \"uint8\" },\n { name: \"dexId\", type: \"uint8\" },\n ],\n },\n ],\n },\n] as const;\n\nconst taxTokenHelperAbi = [\n {\n name: \"getTaxTokenInfo\",\n type: \"function\",\n stateMutability: \"view\",\n inputs: [{ name: \"taxToken\", type: \"address\" }],\n outputs: [\n {\n type: \"tuple\",\n components: [\n { name: \"marketBps\", type: \"uint16\" },\n { name: \"deflationBps\", type: \"uint16\" },\n { name: \"lpBps\", type: \"uint16\" },\n { name: \"dividendBps\", type: \"uint16\" },\n { name: \"feeRate\", type: \"uint16\" },\n { name: \"burntTokenAmount\", type: \"uint256\" },\n { name: \"totalQuoteSentToDividend\", type: \"uint256\" },\n { name: \"totalQuoteAddedToLiquidity\", type: \"uint256\" },\n { name: \"totalTokenAddedToLiquidity\", type: \"uint256\" },\n { name: \"totalQuoteSentToMarketing\", type: \"uint256\" },\n { name: \"marketingWallet\", type: \"address\" },\n { name: \"quoteToken\", type: \"address\" },\n { name: \"minimumShareBalance\", type: \"uint256\" },\n ],\n },\n ],\n },\n {\n name: \"getTaxTokenInfoV2\",\n type: \"function\",\n stateMutability: \"view\",\n inputs: [{ name: \"taxToken\", type: \"address\" }],\n outputs: [\n {\n type: \"tuple\",\n components: [\n { name: \"marketBps\", type: \"uint16\" },\n { name: \"deflationBps\", type: \"uint16\" },\n { name: \"lpBps\", type: \"uint16\" },\n { name: \"dividendBps\", type: \"uint16\" },\n { name: \"buyTaxRate\", type: \"uint16\" },\n { name: \"sellTaxRate\", type: \"uint16\" },\n { name: \"burntTokenAmount\", type: \"uint256\" },\n { name: \"totalQuoteSentToDividend\", type: \"uint256\" },\n { name: \"totalQuoteAddedToLiquidity\", type: \"uint256\" },\n { name: \"totalTokenAddedToLiquidity\", type: \"uint256\" },\n { name: \"totalQuoteSentToMarketing\", type: \"uint256\" },\n { name: \"dividendToken\", type: \"address\" },\n { name: \"quoteToken\", type: \"address\" },\n { name: \"minimumShareBalance\", type: \"uint256\" },\n {\n name: \"vaultInfo\",\n type: \"tuple\",\n components: [\n { name: \"addr\", type: \"address\" },\n { name: \"factory\", type: \"address\" },\n { name: \"riskLevel\", type: \"uint8\" },\n { name: \"isOfficialVault\", type: \"bool\" },\n { name: \"isVault\", type: \"bool\" },\n { name: \"isAIConsumer\", type: \"bool\" },\n ],\n },\n ],\n },\n ],\n },\n] as const;\n\nconst vaultPortalAbi = [\n {\n name: \"tryGetVault\",\n type: \"function\",\n stateMutability: \"view\",\n inputs: [{ name: \"taxToken\", type: \"address\" }],\n outputs: [\n { name: \"found\", type: \"bool\" },\n {\n name: \"info\",\n type: \"tuple\",\n components: [\n { name: \"vault\", type: \"address\" },\n { name: \"vaultFactory\", type: \"address\" },\n { name: \"description\", type: \"string\" },\n { name: \"isOfficial\", type: \"bool\" },\n { name: \"riskLevel\", type: \"uint8\" },\n ],\n },\n ],\n },\n] as const;\n\nasync function readErc20Symbol(publicClient: PublicClient, address: Address) {\n try {\n const symbol = await publicClient.readContract({\n address,\n abi: erc20Abi,\n functionName: \"symbol\",\n });\n return typeof symbol === \"string\" && symbol.trim() ? symbol.trim() : undefined;\n } catch {\n return undefined;\n }\n}\n\nasync function readErc20Name(publicClient: PublicClient, address: Address) {\n try {\n const name = await publicClient.readContract({\n address,\n abi: erc20Abi,\n functionName: \"name\",\n });\n return typeof name === \"string\" && name.trim() ? name.trim() : undefined;\n } catch {\n return undefined;\n }\n}\n\nasync function readErc20Decimals(publicClient: PublicClient, address: Address) {\n try {\n const decimals = await publicClient.readContract({\n address,\n abi: erc20Abi,\n functionName: \"decimals\",\n });\n return typeof decimals === \"number\" ? decimals : 18;\n } catch {\n return 18;\n }\n}\n\nasync function resolvePaymentToken(publicClient: PublicClient, tokenInfo: FlapTokenInfo): Promise<PaymentToken | undefined> {\n const quoteTokenAddress = tokenInfo.quoteTokenAddress;\n if (!quoteTokenAddress) return undefined;\n\n if (quoteTokenAddress === ZERO_ADDRESS) {\n const nativeCurrency = publicClient.chain?.nativeCurrency;\n return {\n address: ZERO_ADDRESS,\n symbol: nativeCurrency?.symbol ?? \"NATIVE\",\n decimals: nativeCurrency?.decimals ?? 18,\n isNative: true,\n };\n }\n\n if (!isValidAddress(quoteTokenAddress)) return undefined;\n\n const [symbol, decimals] = await Promise.all([readErc20Symbol(publicClient, quoteTokenAddress), readErc20Decimals(publicClient, quoteTokenAddress)]);\n\n return {\n address: quoteTokenAddress,\n symbol: symbol ?? \"TOKEN\",\n decimals,\n isNative: false,\n };\n}\n\nexport async function readErc20TokenMetadata(publicClient: PublicClient, tokenAddress?: Address | null): Promise<TokenMetadataSnapshot | null> {\n if (!tokenAddress || !isValidAddress(tokenAddress) || tokenAddress === ZERO_ADDRESS) return null;\n\n const [tokenSymbol, tokenName] = await Promise.all([readErc20Symbol(publicClient, tokenAddress), readErc20Name(publicClient, tokenAddress)]);\n if (!tokenSymbol && !tokenName) return null;\n\n return {\n tokenSymbol,\n tokenName,\n };\n}\n\nexport async function loadTokenRuntimeSnapshot(\n publicClient: PublicClient,\n chainId: number,\n tokenAddress?: Address | null,\n): Promise<TokenRuntimeSnapshot | null> {\n if (!tokenAddress || !isValidAddress(tokenAddress) || tokenAddress === ZERO_ADDRESS) return null;\n\n const chainConfig = getTaxVaultHostChainConfig(chainId);\n\n // Fire metadata fetch immediately; if chainConfig exists, fire portal read in parallel.\n const metadataPromise = readErc20TokenMetadata(publicClient, tokenAddress);\n const portalPromise = chainConfig\n ? publicClient\n .readContract({\n address: chainConfig.portal,\n abi: portalAbi,\n functionName: \"getTokenV7\",\n args: [tokenAddress],\n })\n .then((data) => ({ ok: true as const, data }))\n .catch(() => ({ ok: false as const }))\n : Promise.resolve(null);\n\n const [metadata, portalResult] = await Promise.all([metadataPromise, portalPromise]);\n\n const baseSnapshot = {\n tokenSymbol: metadata?.tokenSymbol,\n tokenName: metadata?.tokenName,\n copyScope: \"tax\" as const,\n };\n\n if (!chainConfig) {\n return {\n ...baseSnapshot,\n hasTaxVaults: false,\n hostReadSupported: false,\n hostReadFromChain: false,\n };\n }\n\n // portalResult is non-null here because chainConfig exists\n if (!portalResult || !portalResult.ok) {\n return {\n ...baseSnapshot,\n hasTaxVaults: Boolean(chainConfig.vaultPortal),\n hostReadSupported: true,\n hostReadFromChain: false,\n giftVaultFactory: chainConfig.giftVaultFactory,\n };\n }\n\n const tokenData = portalResult.data;\n\n const tokenInfo = parsePortalTokenInfo(tokenData as Record<string, unknown>);\n const hasTaxVaults = Boolean(chainConfig.vaultPortal);\n if (!tokenInfo) {\n return {\n ...baseSnapshot,\n hasTaxVaults,\n hostReadSupported: true,\n hostReadFromChain: false,\n giftVaultFactory: chainConfig.giftVaultFactory,\n };\n }\n\n const paymentToken = tokenInfo.exists ? await resolvePaymentToken(publicClient, tokenInfo) : undefined;\n if (!tokenInfo.exists) {\n const host = createTaxInfoHostContext({\n tokenInfo,\n giftVaultFactory: chainConfig.giftVaultFactory,\n hasTaxVaults,\n copyScope: \"tax\",\n });\n return {\n ...baseSnapshot,\n tokenInfo,\n host,\n giftVaultFactory: chainConfig.giftVaultFactory,\n paymentToken,\n hasTaxVaults,\n hostReadSupported: true,\n hostReadFromChain: true,\n };\n }\n\n const taxInfoPromise =\n tokenInfo.isTaxToken && chainConfig.taxTokenHelperAddress\n ? Promise.allSettled([\n publicClient.readContract({\n address: chainConfig.taxTokenHelperAddress,\n abi: taxTokenHelperAbi,\n functionName: \"getTaxTokenInfo\",\n args: [tokenAddress],\n }),\n publicClient.readContract({\n address: chainConfig.taxTokenHelperAddress,\n abi: taxTokenHelperAbi,\n functionName: \"getTaxTokenInfoV2\",\n args: [tokenAddress],\n }),\n ])\n : Promise.resolve(null);\n\n const vaultInfoPromise = chainConfig.vaultPortal\n ? publicClient\n .readContract({\n address: chainConfig.vaultPortal,\n abi: vaultPortalAbi,\n functionName: \"tryGetVault\",\n args: [tokenAddress],\n })\n .catch(() => undefined)\n : Promise.resolve(undefined);\n\n const [taxResults, vaultData] = await Promise.all([taxInfoPromise, vaultInfoPromise]);\n const baseTaxInfo = Array.isArray(taxResults) && taxResults[0]?.status === \"fulfilled\" ? taxResults[0].value : undefined;\n const taxInfoV2 = Array.isArray(taxResults) && taxResults[1]?.status === \"fulfilled\" ? taxResults[1].value : undefined;\n const taxInfo = baseTaxInfo\n ? parseTaxTokenInfo(baseTaxInfo, taxInfoV2, { wrappedNativeTokenAddress: chainConfig.wrappedNativeTokenAddress })\n : undefined;\n const vaultInfo = vaultData ? parseVaultPortalInfo(vaultData) : undefined;\n const host = createTaxInfoHostContext({\n tokenInfo,\n taxInfo,\n vaultInfo,\n giftVaultFactory: chainConfig.giftVaultFactory,\n hasTaxVaults,\n copyScope: \"tax\",\n });\n\n return {\n ...baseSnapshot,\n tokenInfo,\n taxInfo,\n vaultInfo,\n host,\n giftVaultFactory: chainConfig.giftVaultFactory,\n paymentToken,\n hasTaxVaults,\n hostReadSupported: true,\n hostReadFromChain: true,\n };\n}\n","import { loadTokenRuntimeSnapshot } from \"./hostRead\";\nimport { isValidAddress, readTaxVaultHostContext, ZERO_ADDRESS } from \"./taxInfo\";\nimport type {\n Address,\n HostRuntimeAddresses,\n HostRuntimeDataSource,\n HostRuntimeDegradeReason,\n HostRuntimeInput,\n HostRuntimeResult,\n HostRuntimeSources,\n HostRuntimeStatus,\n HostRuntimeWarning,\n TokenRuntimeSnapshot,\n} from \"./types\";\n\nfunction isResolvedAddress(address?: Address | null): address is Address {\n return Boolean(address && isValidAddress(address) && address !== ZERO_ADDRESS);\n}\n\nfunction pickAddress(...candidates: Array<Address | null | undefined>) {\n for (const candidate of candidates) {\n if (isResolvedAddress(candidate)) return candidate;\n }\n return undefined;\n}\n\nfunction resolveAddresses(input: Pick<HostRuntimeInput, \"chainId\" | \"tokenAddress\" | \"factoryAddressHint\" | \"vaultAddressHint\">, snapshot?: TokenRuntimeSnapshot | null): HostRuntimeAddresses {\n return {\n chainId: input.chainId,\n tokenAddress: input.tokenAddress,\n factoryAddressHint: input.factoryAddressHint,\n vaultAddressHint: input.vaultAddressHint,\n factoryAddress: pickAddress(snapshot?.vaultInfo?.vaultFactory, snapshot?.taxInfo?.vaultInfo?.factory ?? undefined, input.factoryAddressHint),\n vaultAddress: pickAddress(snapshot?.vaultInfo?.vault, snapshot?.taxInfo?.vaultInfo?.addr ?? undefined, input.vaultAddressHint),\n };\n}\n\nfunction hasPresentationMetadata(result: HostRuntimeResult) {\n return Boolean(result.presentation?.tokenName || result.presentation?.tokenSymbol || result.presentation?.tokenImageUrl);\n}\n\nfunction resolveTokenMetadataSource(snapshot: TokenRuntimeSnapshot | null, presentationDataAvailable: boolean): HostRuntimeDataSource {\n if (presentationDataAvailable) return \"host-proxy\";\n if (snapshot?.tokenName || snapshot?.tokenSymbol) return \"onchain\";\n return \"unavailable\";\n}\n\nfunction resolveSources(snapshot: TokenRuntimeSnapshot | null, presentationDataAvailable: boolean): HostRuntimeSources {\n return {\n tokenMetadata: resolveTokenMetadataSource(snapshot, presentationDataAvailable),\n taxState: snapshot?.taxInfo ? \"onchain\" : \"unavailable\",\n vaultState: snapshot?.vaultInfo?.found || snapshot?.taxInfo?.vaultInfo?.isVault ? \"onchain\" : \"unavailable\",\n presentation: presentationDataAvailable ? \"host-proxy\" : \"unavailable\",\n };\n}\n\nfunction collectWarnings(snapshot: TokenRuntimeSnapshot | null, addresses: HostRuntimeAddresses): HostRuntimeWarning[] {\n const warnings: HostRuntimeWarning[] = [];\n\n if (!snapshot?.taxInfo) warnings.push(\"tax-info-unavailable\");\n if (snapshot?.tokenInfo?.quoteTokenAddress && !snapshot.paymentToken) warnings.push(\"payment-token-unavailable\");\n if (!addresses.vaultAddress) warnings.push(\"vault-address-unavailable\");\n if (!addresses.factoryAddress) warnings.push(\"factory-address-unavailable\");\n\n return warnings;\n}\n\nfunction resolveChainFailure(snapshot: TokenRuntimeSnapshot | null): HostRuntimeDegradeReason | null {\n if (!snapshot) return \"chain-read-unavailable\";\n if (!snapshot.hostReadSupported) return \"unsupported-chain\";\n if (!snapshot.hostReadFromChain || !snapshot.tokenInfo) return \"chain-read-unavailable\";\n if (!snapshot.tokenInfo.exists) return \"token-not-found\";\n if (!snapshot.tokenInfo.isTaxToken) return \"token-not-tax\";\n return null;\n}\n\nfunction createResult(params: {\n status: HostRuntimeStatus;\n input: Pick<HostRuntimeInput, \"chainId\" | \"tokenAddress\" | \"factoryAddressHint\" | \"vaultAddressHint\">;\n snapshot: TokenRuntimeSnapshot | null;\n degradeReason?: HostRuntimeDegradeReason;\n presentation?: HostRuntimeResult[\"presentation\"];\n policy: HostRuntimeResult[\"policy\"];\n}): HostRuntimeResult {\n const addresses = resolveAddresses(params.input, params.snapshot);\n const basePresentation = params.presentation ?? null;\n const baseResult: HostRuntimeResult = {\n status: params.status,\n policy: params.policy,\n degradeReason: params.degradeReason,\n warnings: collectWarnings(params.snapshot, addresses),\n addresses,\n snapshot: params.snapshot,\n host: params.snapshot?.host ?? undefined,\n paymentToken: params.snapshot?.paymentToken,\n tokenSymbol: basePresentation?.tokenSymbol ?? params.snapshot?.tokenSymbol,\n tokenName: basePresentation?.tokenName ?? params.snapshot?.tokenName,\n tokenImageUrl: basePresentation?.tokenImageUrl,\n tokenDetailHref: basePresentation?.tokenDetailHref,\n chainHref: basePresentation?.chainHref,\n presentation: basePresentation,\n sources: {\n tokenMetadata: \"unavailable\",\n taxState: \"unavailable\",\n vaultState: \"unavailable\",\n presentation: \"unavailable\",\n },\n };\n\n baseResult.sources = resolveSources(params.snapshot, hasPresentationMetadata(baseResult));\n return baseResult;\n}\n\nexport function resolveHostRuntimeAddresses(input: Pick<HostRuntimeInput, \"chainId\" | \"tokenAddress\" | \"factoryAddressHint\" | \"vaultAddressHint\">, snapshot?: TokenRuntimeSnapshot | null) {\n return resolveAddresses(input, snapshot);\n}\n\nexport async function runHostRuntime(input: HostRuntimeInput): Promise<HostRuntimeResult> {\n const policy = input.policy ?? \"prefer-full-host\";\n\n if (!isResolvedAddress(input.tokenAddress)) {\n return createResult({\n status: \"unavailable\",\n input,\n snapshot: null,\n degradeReason: \"invalid-token-address\",\n policy,\n });\n }\n\n const snapshot = await loadTokenRuntimeSnapshot(input.publicClient, input.chainId, input.tokenAddress);\n const chainFailure = resolveChainFailure(snapshot);\n if (chainFailure) {\n return createResult({\n status: \"unavailable\",\n input,\n snapshot,\n degradeReason: chainFailure,\n policy,\n });\n }\n\n let presentation: HostRuntimeResult[\"presentation\"] = null;\n let presentationFailure: HostRuntimeDegradeReason | undefined;\n\n if (input.presentationFetcher) {\n try {\n const resolvedAddrs = resolveAddresses(input, snapshot);\n presentation = await input.presentationFetcher({\n chainId: input.chainId,\n tokenAddress: input.tokenAddress,\n factoryAddress: resolvedAddrs.factoryAddress,\n vaultAddress: resolvedAddrs.vaultAddress,\n snapshot: snapshot!,\n });\n if (!presentation) {\n presentationFailure = \"host-presentation-unavailable\";\n }\n } catch {\n presentationFailure = \"host-presentation-unavailable\";\n }\n } else {\n presentationFailure = \"host-presentation-not-configured\";\n }\n\n if (presentation) {\n return createResult({\n status: \"full-host\",\n input,\n snapshot,\n presentation,\n policy,\n });\n }\n\n if (policy === \"require-full-host\") {\n return createResult({\n status: \"unavailable\",\n input,\n snapshot,\n degradeReason: presentationFailure === \"host-presentation-not-configured\" ? \"host-presentation-required\" : \"host-presentation-unavailable\",\n policy,\n });\n }\n\n const result = createResult({\n status: \"onchain\",\n input,\n snapshot,\n degradeReason: presentationFailure,\n policy,\n });\n\n const hostSnapshot = readTaxVaultHostContext(result.host);\n if (!hostSnapshot.isSupportedCustomVaultToken) {\n return {\n ...result,\n status: \"unavailable\",\n degradeReason: \"token-not-tax\",\n };\n }\n\n return result;\n}\n","import type { OracleProvision, OracleReadRequest, OracleReader } from \"./types\";\n\nconst DEFAULT_LOCAL_ORACLE_ENDPOINT_BASE = \"/api/runtime/oracle\";\n\nexport class OracleReadError extends Error {\n status?: number;\n\n constructor(message: string, status?: number) {\n super(message);\n this.name = \"OracleReadError\";\n this.status = status;\n }\n}\n\nfunction appendSearchParams(url: URL, params?: Record<string, string>) {\n for (const [key, value] of Object.entries(params ?? {})) {\n url.searchParams.set(key, value);\n }\n}\n\nfunction toOracleProvision(provision: string | OracleProvision): OracleProvision {\n return typeof provision === \"string\" ? { endpoint: provision } : provision;\n}\n\nexport function buildLocalOracleUrl(oracleId: string, params?: Record<string, string>, endpointBase = DEFAULT_LOCAL_ORACLE_ENDPOINT_BASE) {\n const normalizedBase = endpointBase.replace(/\\/+$/, \"\");\n const url = new URL(`${normalizedBase}/${encodeURIComponent(oracleId)}`, \"http://localhost\");\n appendSearchParams(url, params);\n return `${url.pathname}${url.search}`;\n}\n\nexport async function fetchOracleJson<T>({\n endpoint,\n params,\n fetchImpl,\n headers,\n}: {\n endpoint: string;\n params?: Record<string, string>;\n fetchImpl?: typeof fetch;\n headers?: HeadersInit;\n}): Promise<T> {\n const fallbackOrigin = typeof window !== \"undefined\" ? window.location.origin : \"http://localhost\";\n const url = new URL(endpoint, fallbackOrigin);\n appendSearchParams(url, params);\n\n const response = await (fetchImpl ?? fetch)(url.toString(), {\n cache: \"no-store\",\n headers,\n method: \"GET\",\n });\n\n if (!response.ok) {\n throw new OracleReadError(`Oracle request returned ${response.status}.`, response.status);\n }\n\n return (await response.json()) as T;\n}\n\nexport async function fetchProvisionedOracle<T>({\n provision,\n params,\n fetchImpl,\n}: {\n provision: string | OracleProvision;\n params?: Record<string, string>;\n fetchImpl?: typeof fetch;\n}): Promise<T> {\n const normalizedProvision = toOracleProvision(provision);\n const filteredParams =\n normalizedProvision.allowedParams && normalizedProvision.allowedParams.length\n ? Object.fromEntries(Object.entries(params ?? {}).filter(([key]) => normalizedProvision.allowedParams?.includes(key)))\n : params;\n\n return fetchOracleJson<T>({\n endpoint: normalizedProvision.endpoint,\n params: filteredParams,\n fetchImpl,\n headers: normalizedProvision.headers,\n });\n}\n\nexport function createLocalOracleReader(options: { endpointBase?: string; fetchImpl?: typeof fetch } = {}): OracleReader {\n const endpointBase = options.endpointBase ?? DEFAULT_LOCAL_ORACLE_ENDPOINT_BASE;\n const fetchImpl = options.fetchImpl;\n\n return async function readLocalOracle<T>({ oracleId, params }: OracleReadRequest): Promise<T> {\n return fetchOracleJson<T>({\n endpoint: buildLocalOracleUrl(oracleId, params, endpointBase),\n fetchImpl,\n });\n };\n}\n","import { resolveManifestBinding } from \"./taxInfo\";\nimport type { Address, CreateVaultRuntimeContextInput, VaultRuntimeContext, VaultRuntimeExtraConfig } from \"./types\";\n\nconst zeroAddress = \"0x0000000000000000000000000000000000000000\" as Address;\n\nexport function explorerForChain(chainId: number) {\n if (chainId === 56) return \"https://bscscan.com\";\n if (chainId === 97) return \"https://testnet.bscscan.com\";\n return undefined;\n}\n\nexport function chainLabelForChain(chainId: number) {\n if (chainId === 56) return \"BNB Chain\";\n if (chainId === 97) return \"BNB Testnet\";\n return `Chain ${chainId}`;\n}\n\nfunction buildRuntimeExtraConfig(input: CreateVaultRuntimeContextInput): VaultRuntimeExtraConfig {\n const hostRuntimeResult = input.hostRuntimeResult;\n const runtimeOverrides = input.runtimeOverrides;\n\n return {\n ...(hostRuntimeResult\n ? {\n hostRuntimeStatus: hostRuntimeResult.status,\n hostRuntimePolicy: hostRuntimeResult.policy,\n hostRuntimeDegradeReason: hostRuntimeResult.degradeReason,\n hostRuntimeWarnings: hostRuntimeResult.warnings,\n }\n : {}),\n ...(hostRuntimeResult?.presentation?.extraConfig ?? {}),\n ...(runtimeOverrides?.extraConfig ?? {}),\n };\n}\n\nexport function createVaultRuntimeContext(input: CreateVaultRuntimeContextInput): VaultRuntimeContext {\n const runtimeOverrides = input.runtimeOverrides;\n const resolvedBinding = resolveManifestBinding(input.manifest, {\n chainId: runtimeOverrides?.chainId ?? input.connectedChainId ?? input.hostRuntimeResult?.addresses.chainId,\n factoryAddress: runtimeOverrides?.factoryAddress ?? input.hostRuntimeResult?.addresses.factoryAddress,\n vaultAddress: runtimeOverrides?.vaultAddress ?? input.hostRuntimeResult?.addresses.vaultAddress,\n tokenAddress: runtimeOverrides?.tokenAddress ?? input.hostRuntimeResult?.addresses.tokenAddress,\n });\n const effectiveChainId =\n runtimeOverrides?.chainId ?? input.hostRuntimeResult?.addresses.chainId ?? input.connectedChainId ?? resolvedBinding?.chainId ?? input.manifest.match.bindings[0]?.chainId ?? 56;\n\n return {\n chainId: effectiveChainId,\n factoryAddress: runtimeOverrides?.factoryAddress ?? input.hostRuntimeResult?.addresses.factoryAddress ?? resolvedBinding?.factoryAddress ?? zeroAddress,\n tokenAddress: runtimeOverrides?.tokenAddress ?? input.hostRuntimeResult?.addresses.tokenAddress ?? zeroAddress,\n vaultAddress: runtimeOverrides?.vaultAddress ?? input.hostRuntimeResult?.addresses.vaultAddress ?? zeroAddress,\n userAddress: runtimeOverrides?.userAddress,\n tokenSymbol: runtimeOverrides?.tokenSymbol ?? input.hostRuntimeResult?.tokenSymbol,\n tokenName: runtimeOverrides?.tokenName ?? input.hostRuntimeResult?.tokenName,\n tokenImageUrl: runtimeOverrides?.tokenImageUrl ?? input.hostRuntimeResult?.tokenImageUrl,\n explorerBaseUrl: runtimeOverrides?.explorerBaseUrl ?? explorerForChain(effectiveChainId),\n paymentToken: runtimeOverrides?.paymentToken ?? input.hostRuntimeResult?.paymentToken,\n host: runtimeOverrides?.host ?? input.hostRuntimeResult?.host,\n extraConfig: buildRuntimeExtraConfig(input),\n manifest: input.manifest,\n };\n}\n","export type TxErrorKind = \"userRejected\" | \"walletDisconnected\" | \"wrongNetwork\" | \"insufficientFunds\" | \"simulationFailed\" | \"reverted\" | \"unknown\";\n\ntype TxErrorMessageMap = Partial<Record<TxErrorKind, string>>;\n\nconst defaultMessages: Record<TxErrorKind, string> = {\n userRejected: \"You rejected the wallet request.\",\n walletDisconnected: \"Connect a wallet before sending this transaction.\",\n wrongNetwork: \"Switch the wallet to the required chain before sending this transaction.\",\n insufficientFunds: \"Insufficient wallet balance to complete this transaction.\",\n simulationFailed: \"The transaction could not pass simulation.\",\n reverted: \"The contract rejected this transaction.\",\n unknown: \"Transaction failed. Please check your wallet and try again.\",\n};\n\nfunction isObject(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === \"object\";\n}\n\nfunction readString(value: unknown) {\n return typeof value === \"string\" ? value : \"\";\n}\n\nfunction collectMessages(error: unknown, depth = 0, seen = new Set<unknown>()): string[] {\n if (depth > 4 || error == null || seen.has(error)) return [];\n seen.add(error);\n\n if (typeof error === \"string\") return [error];\n if (!isObject(error)) return [];\n\n const messages = [\n readString(error.shortMessage),\n readString(error.message),\n readString(error.details),\n readString(error.reason),\n ].filter(Boolean);\n\n return [...messages, ...collectMessages(error.cause, depth + 1, seen)];\n}\n\nfunction collectCodes(error: unknown, depth = 0, seen = new Set<unknown>()): Array<string | number> {\n if (depth > 4 || error == null || seen.has(error)) return [];\n seen.add(error);\n if (!isObject(error)) return [];\n\n const codes = [error.code, error.name].filter((value) => typeof value === \"string\" || typeof value === \"number\");\n return [...codes, ...collectCodes(error.cause, depth + 1, seen)];\n}\n\nexport function getTxErrorKind(error: unknown): TxErrorKind {\n const message = collectMessages(error).join(\" \").toLowerCase();\n const codes = collectCodes(error)\n .map((value: string | number) => String(value).toLowerCase())\n .join(\" \");\n\n if (\n codes.includes(\"4001\") ||\n codes.includes(\"action_rejected\") ||\n codes.includes(\"userrejectedrequesterror\") ||\n /user rejected|user denied|rejected the request|denied transaction|request rejected|cancelled/i.test(message)\n ) {\n return \"userRejected\";\n }\n\n if (/wallet is not connected|connector not connected|account not found|no wallet client/i.test(message)) {\n return \"walletDisconnected\";\n }\n\n if (/wrong network|switch wallet to|switch network to|required chain/i.test(message)) {\n return \"wrongNetwork\";\n }\n\n if (/insufficient funds|exceeds the balance|gas \\* price \\+ value/i.test(message)) {\n return \"insufficientFunds\";\n }\n\n if (/simulation failed|simulatecontract|execution reverted during simulation/i.test(message)) {\n return \"simulationFailed\";\n }\n\n if (/execution reverted|reverted with the following reason|contract function .* reverted|call exception/i.test(message)) {\n return \"reverted\";\n }\n\n return \"unknown\";\n}\n\nexport function handleTxError(error: unknown, messages?: TxErrorMessageMap) {\n const kind = getTxErrorKind(error);\n return messages?.[kind] ?? defaultMessages[kind];\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/sdk/erc20.ts","../../src/sdk/format.ts","../../src/sdk/hostRuntimeConfig.ts","../../src/sdk/taxInfo.ts","../../src/sdk/hostRead.ts","../../src/sdk/hostRuntime.ts","../../src/sdk/oracle.ts","../../src/sdk/runtimeContext.ts","../../src/sdk/txError.ts"],"names":["host"],"mappings":"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","file":"host.js","sourcesContent":["import { erc20Abi } from \"viem\";\n\nexport { erc20Abi };\nexport const standardErc20Abi = erc20Abi;\n","import Decimal from \"decimal.js\";\nimport { formatUnits, parseUnits } from \"viem\";\n\nexport function shortenAddress(raw?: string, start = 6, end = 4) {\n if (!raw) return \"\";\n if (raw.length <= start + end) return raw;\n return `${raw.slice(0, start)}...${raw.slice(-end)}`;\n}\n\nexport function formatTokenAmount(value?: bigint | string | number | null, decimals = 18, precision = 4) {\n if (value === undefined || value === null) return \"-\";\n const raw = typeof value === \"bigint\" ? formatUnits(value, decimals) : String(value);\n return new Decimal(raw).toDecimalPlaces(precision, Decimal.ROUND_DOWN).toString();\n}\n\nexport function parseTokenAmount(value: string, decimals = 18) {\n if (!/^\\d*(\\.\\d*)?$/.test(value.trim())) {\n throw new Error(\"Invalid decimal amount.\");\n }\n return parseUnits(value || \"0\", decimals);\n}\n\nexport function formatPercentBps(value?: bigint | number | null, precision = 2) {\n if (value === undefined || value === null) return \"-\";\n return `${new Decimal(String(value)).div(100).toDecimalPlaces(precision).toString()}%`;\n}\n\nexport function formatCountdown(targetTimeMs?: number) {\n if (!targetTimeMs) return \"-\";\n const diff = Math.max(0, targetTimeMs - Date.now());\n const totalSeconds = Math.floor(diff / 1000);\n const days = Math.floor(totalSeconds / 86400);\n const hours = Math.floor((totalSeconds % 86400) / 3600);\n const minutes = Math.floor((totalSeconds % 3600) / 60);\n const seconds = totalSeconds % 60;\n if (days > 0) return `${days}d ${hours}h ${minutes}m`;\n if (hours > 0) return `${hours}h ${minutes}m ${seconds}s`;\n return `${minutes}m ${seconds}s`;\n}\n","import type { Address } from \"./types\";\n\nexport interface TaxVaultHostChainConfig {\n portal: Address;\n taxTokenHelperAddress?: Address;\n vaultPortal?: Address;\n wrappedNativeTokenAddress?: Address;\n giftVaultFactory?: Address;\n hostChainSlug?: string;\n ipfsGateway?: string;\n}\n\nconst taxVaultHostChains: Record<number, TaxVaultHostChainConfig> = {\n 56: {\n portal: \"0xe2ce6ab80874fa9fa2aae65d277dd6b8e65c9de0\",\n taxTokenHelperAddress: \"0x53841c73217735F37BC1775538b03b23feFD8346\",\n vaultPortal: \"0x90497450f2a706f1951b5bdda52B4E5d16f34C06\",\n wrappedNativeTokenAddress: \"0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c\",\n giftVaultFactory: \"0x025549F52B03cF36f9e1a337c02d3AA7Af66ab32\",\n hostChainSlug: \"bnb\",\n ipfsGateway: \"https://gateway.pinata.cloud\",\n },\n 97: {\n portal: \"0x5bEacaF7ABCbB3aB280e80D007FD31fcE26510e9\",\n taxTokenHelperAddress: \"0xD64441e5FcD02D342B8cf6eBA10Ef6E40d0dA90f\",\n vaultPortal: \"0x027e3704fC5C16522e9393d04C60A3ac5c0d775f\",\n wrappedNativeTokenAddress: \"0xae13d989daC2f0dEbFf460aC112a837C89BAa7cd\",\n giftVaultFactory: \"0xa02DA44D67DB6D692efa7f751b5952bd670d5326\",\n hostChainSlug: \"bnb-testnet\",\n ipfsGateway: \"https://gateway.pinata.cloud\",\n },\n};\n\nexport function getTaxVaultHostChainConfig(chainId: number) {\n return taxVaultHostChains[chainId];\n}\n","import type {\n ActionAvailabilityStage,\n Address,\n FeeMode,\n FlapFeeVaultInfo,\n FlapTaxInfo,\n FlapTokenInfo,\n FlapVaultPortalInfo,\n ManifestBindingEntry,\n TokenMarketPhase,\n VaultHostContext,\n VaultManifest,\n VaultRenderSurface,\n} from \"./types\";\n\nexport const ZERO_ADDRESS = \"0x0000000000000000000000000000000000000000\" as Address;\n\ntype TupleLike = (Record<string, unknown> & readonly unknown[]) | Record<string, unknown> | readonly unknown[] | null | undefined;\n\nexport interface VaultBindingPolicy {\n name: string;\n chainId: number;\n factoryAddress?: Address;\n vaultAddresses?: Address[];\n tokenAddresses?: Address[];\n extra?: Record<string, unknown>;\n isAiPowered?: boolean;\n}\n\nexport interface RuntimeMatchInput {\n chainId?: number;\n factoryAddress?: string | null;\n vaultAddress?: string | null;\n tokenAddress?: string | null;\n}\n\nexport interface CreateTaxInfoHostContextInput {\n tokenInfo?: FlapTokenInfo | null;\n taxInfo?: FlapTaxInfo | null;\n vaultInfo?: FlapVaultPortalInfo | null;\n feeMode?: FeeMode | null;\n giftVaultFactory?: string | null;\n hasTaxVaults?: boolean;\n vaultType?: string;\n copyScope?: \"tax\" | \"fee\";\n}\n\nexport interface ResolveRenderSurfaceInput {\n tokenInfo?: FlapTokenInfo | null;\n taxInfo?: FlapTaxInfo | null;\n hasTaxVaults?: boolean;\n isNonTaxFeeToken?: boolean;\n}\n\nexport interface TaxVaultHostSnapshot {\n tokenInfo?: FlapTokenInfo;\n taxInfo?: FlapTaxInfo | null;\n vaultInfo?: FlapVaultPortalInfo | null;\n feeMode: FeeMode;\n renderSurface: VaultRenderSurface;\n vaultType?: string;\n copyScope: \"tax\" | \"fee\";\n marketPhase: TokenMarketPhase;\n isListed: boolean;\n isTaxToken: boolean;\n isSupportedCustomVaultToken: boolean;\n}\n\nexport function getTupleField(data: TupleLike, name: string, index: number) {\n if (!data) return undefined;\n const record = data as Record<string, unknown>;\n const tuple = data as readonly unknown[];\n return record[name] ?? tuple[index];\n}\n\nexport function isValidAddress(value?: string | null): value is Address {\n return Boolean(value && /^0x[a-fA-F0-9]{40}$/.test(value));\n}\n\nexport function normalizeAddress(value?: string | null): Address | undefined {\n return isValidAddress(value) ? (value as Address) : undefined;\n}\n\nexport function isSameAddress(a?: string | null, b?: string | null) {\n return Boolean(a && b && a.toLowerCase() === b.toLowerCase());\n}\n\nfunction toNumber(value: unknown, fallback = 0) {\n if (typeof value === \"bigint\") return Number(value);\n if (typeof value === \"number\") return Number.isFinite(value) ? value : fallback;\n if (typeof value === \"string\" && value.trim()) {\n const parsed = Number(value);\n return Number.isFinite(parsed) ? parsed : fallback;\n }\n return fallback;\n}\n\nfunction toBigInt(value: unknown, fallback = 0n) {\n if (typeof value === \"bigint\") return value;\n if (typeof value === \"number\" && Number.isFinite(value)) return BigInt(Math.trunc(value));\n if (typeof value === \"string\" && value.trim()) {\n try {\n return BigInt(value);\n } catch {\n return fallback;\n }\n }\n return fallback;\n}\n\nfunction toBooleanOrNull(value: unknown) {\n if (typeof value === \"boolean\") return value;\n if (value === null || value === undefined) return null;\n return Boolean(value);\n}\n\nfunction toAddressOrNull(value: unknown): Address | null {\n return typeof value === \"string\" && isValidAddress(value) ? (value as Address) : null;\n}\n\nfunction toStringOrUndefined(value: unknown) {\n return typeof value === \"string\" && value.length > 0 ? value : undefined;\n}\n\nexport function parsePortalTokenInfo(tokenData: TupleLike): FlapTokenInfo | null {\n if (!tokenData) return null;\n\n const status = toNumber(getTupleField(tokenData, \"status\", 0));\n const taxRateRaw = toBigInt(getTupleField(tokenData, \"taxRate\", 12));\n const quoteTokenAddress = toAddressOrNull(getTupleField(tokenData, \"quoteTokenAddress\", 9)) ?? ZERO_ADDRESS;\n\n return {\n exists: status !== 0,\n isTaxToken: taxRateRaw > 0n,\n taxRate: Number(taxRateRaw),\n taxRateRaw,\n quoteTokenAddress,\n status,\n tokenVersion: toNumber(getTupleField(tokenData, \"tokenVersion\", 4)),\n };\n}\n\nexport function parseFeeVaultInfo(vaultInfo: TupleLike): FlapFeeVaultInfo | null {\n if (!vaultInfo) return null;\n\n return {\n addr: toAddressOrNull(getTupleField(vaultInfo, \"addr\", 0)),\n factory: toAddressOrNull(getTupleField(vaultInfo, \"factory\", 1)),\n riskLevel: toNumber(getTupleField(vaultInfo, \"riskLevel\", 2)),\n isOfficialVault: toBooleanOrNull(getTupleField(vaultInfo, \"isOfficialVault\", 3)),\n isVault: toBooleanOrNull(getTupleField(vaultInfo, \"isVault\", 4)),\n isAIConsumer: toBooleanOrNull(getTupleField(vaultInfo, \"isAIConsumer\", 5)),\n };\n}\n\nexport function parseTaxTokenInfo(\n taxInfo: TupleLike,\n taxInfoV2?: TupleLike,\n options: { wrappedNativeTokenAddress?: Address } = {},\n): FlapTaxInfo | null {\n if (!taxInfo) return null;\n\n const quoteToken = toAddressOrNull(getTupleField(taxInfo, \"quoteToken\", 11)) ?? ZERO_ADDRESS;\n const rawDividendToken = toAddressOrNull(getTupleField(taxInfoV2, \"dividendToken\", 11)) ?? quoteToken;\n const dividendToken =\n quoteToken === ZERO_ADDRESS && rawDividendToken === ZERO_ADDRESS && options.wrappedNativeTokenAddress\n ? options.wrappedNativeTokenAddress\n : rawDividendToken;\n\n return {\n marketBps: toNumber(getTupleField(taxInfo, \"marketBps\", 0)),\n deflationBps: toNumber(getTupleField(taxInfo, \"deflationBps\", 1)),\n lpBps: toNumber(getTupleField(taxInfo, \"lpBps\", 2)),\n dividendBps: toNumber(getTupleField(taxInfo, \"dividendBps\", 3)),\n feeRate: toNumber(getTupleField(taxInfo, \"feeRate\", 4)),\n buyTaxRate: taxInfoV2 ? toNumber(getTupleField(taxInfoV2, \"buyTaxRate\", 4)) : undefined,\n sellTaxRate: taxInfoV2 ? toNumber(getTupleField(taxInfoV2, \"sellTaxRate\", 5)) : undefined,\n burntTokenAmount: toBigInt(getTupleField(taxInfo, \"burntTokenAmount\", 5)),\n totalQuoteSentToDividend: toBigInt(getTupleField(taxInfo, \"totalQuoteSentToDividend\", 6)),\n totalQuoteAddedToLiquidity: toBigInt(getTupleField(taxInfo, \"totalQuoteAddedToLiquidity\", 7)),\n totalTokenAddedToLiquidity: toBigInt(getTupleField(taxInfo, \"totalTokenAddedToLiquidity\", 8)),\n totalQuoteSentToMarketing: toBigInt(getTupleField(taxInfo, \"totalQuoteSentToMarketing\", 9)),\n marketingWallet: toAddressOrNull(getTupleField(taxInfo, \"marketingWallet\", 10)) ?? ZERO_ADDRESS,\n dividendToken,\n quoteToken,\n minimumShareBalance: toBigInt(getTupleField(taxInfo, \"minimumShareBalance\", 12)),\n vaultInfo: parseFeeVaultInfo(getTupleField(taxInfoV2, \"vaultInfo\", 14) as TupleLike),\n };\n}\n\nexport function parseVaultPortalInfo(vaultData: TupleLike): FlapVaultPortalInfo | null {\n if (!vaultData) return null;\n\n const found = Boolean(getTupleField(vaultData, \"found\", 0));\n const info = getTupleField(vaultData, \"info\", 1) as TupleLike;\n\n if (!found || !info) return { found: false };\n\n return {\n found: true,\n vault: toAddressOrNull(getTupleField(info, \"vault\", 0)) ?? ZERO_ADDRESS,\n vaultFactory: toAddressOrNull(getTupleField(info, \"vaultFactory\", 1)) ?? ZERO_ADDRESS,\n description: toStringOrUndefined(getTupleField(info, \"description\", 2)),\n isOfficial: Boolean(getTupleField(info, \"isOfficial\", 3)),\n riskLevel: toNumber(getTupleField(info, \"riskLevel\", 4)),\n };\n}\n\nexport function resolveManifestBinding(manifest: Pick<VaultManifest, \"match\">, input: RuntimeMatchInput): ManifestBindingEntry | null {\n const bindings = manifest.match.bindings;\n if (!bindings.length) return null;\n\n const resolveUnique = (candidates: ManifestBindingEntry[]) => {\n if (candidates.length === 1) return candidates[0];\n return null;\n };\n\n const matchesChain = (binding: ManifestBindingEntry) => !input.chainId || binding.chainId === input.chainId;\n const matchesToken = (binding: ManifestBindingEntry) =>\n !input.tokenAddress || !binding.tokenAddresses?.length || binding.tokenAddresses.some((address) => isSameAddress(address, input.tokenAddress));\n const isVaultScopedBinding = (binding: ManifestBindingEntry) => !binding.factoryAddress && Boolean(binding.vaultAddresses?.length);\n const isTokenScopedBinding = (binding: ManifestBindingEntry) => !binding.factoryAddress && !binding.vaultAddresses?.length && Boolean(binding.tokenAddresses?.length);\n\n if (input.factoryAddress) {\n const factoryMatch = resolveUnique(\n bindings.filter((binding) => matchesChain(binding) && Boolean(binding.factoryAddress) && isSameAddress(binding.factoryAddress, input.factoryAddress) && matchesToken(binding)),\n );\n if (factoryMatch) return factoryMatch;\n if (!input.vaultAddress && !input.tokenAddress) return null;\n }\n\n if (input.vaultAddress) {\n const vaultMatch = resolveUnique(\n bindings.filter(\n (binding) =>\n matchesChain(binding) &&\n isVaultScopedBinding(binding) &&\n Boolean(binding.vaultAddresses?.some((address) => isSameAddress(address, input.vaultAddress))) &&\n matchesToken(binding),\n ),\n );\n if (vaultMatch) return vaultMatch;\n }\n\n if (input.tokenAddress) {\n const tokenMatch = resolveUnique(\n bindings.filter(\n (binding) =>\n matchesChain(binding) &&\n isTokenScopedBinding(binding) &&\n Boolean(binding.tokenAddresses?.some((address) => isSameAddress(address, input.tokenAddress))),\n ),\n );\n if (tokenMatch) return tokenMatch;\n }\n\n if (input.factoryAddress || input.vaultAddress) {\n return null;\n }\n\n if (input.chainId && input.tokenAddress) {\n const tokenScopedMatch = resolveUnique(bindings.filter((binding) => binding.chainId === input.chainId && binding.tokenAddresses?.some((address) => isSameAddress(address, input.tokenAddress))));\n if (tokenScopedMatch) return tokenScopedMatch;\n }\n\n if (input.tokenAddress) {\n return resolveUnique(bindings.filter((binding) => binding.tokenAddresses?.some((address) => isSameAddress(address, input.tokenAddress))));\n }\n\n if (input.chainId) {\n return resolveUnique(bindings.filter((binding) => binding.chainId === input.chainId && matchesToken(binding)));\n }\n\n return null;\n}\n\nexport function isManifestRuntimeMatch(manifest: Pick<VaultManifest, \"match\">, input: RuntimeMatchInput) {\n if (!input.chainId || (!input.factoryAddress && !input.vaultAddress && !input.tokenAddress)) return false;\n const matchingBinding = resolveManifestBinding(manifest, input);\n if (!matchingBinding) return false;\n if (matchingBinding.chainId !== input.chainId) return false;\n if (matchingBinding.factoryAddress) return isSameAddress(matchingBinding.factoryAddress, input.factoryAddress);\n const vaultAddress = matchingBinding.vaultAddresses?.[0];\n if (vaultAddress && !isSameAddress(vaultAddress, input.vaultAddress)) return false;\n if (input.tokenAddress && matchingBinding.tokenAddresses?.length) {\n return matchingBinding.tokenAddresses.some((address) => isSameAddress(address, input.tokenAddress));\n }\n if (!vaultAddress && matchingBinding.tokenAddresses?.length) return false;\n return true;\n}\n\nexport function isVaultBindingMatch(binding: VaultBindingPolicy, input: RuntimeMatchInput) {\n if (!input.chainId || binding.chainId !== input.chainId) return false;\n if (binding.factoryAddress) return Boolean(input.factoryAddress && isSameAddress(binding.factoryAddress, input.factoryAddress));\n const vaultAddress = binding.vaultAddresses?.[0];\n if (vaultAddress) {\n if (!input.vaultAddress || !isSameAddress(vaultAddress, input.vaultAddress)) return false;\n if (input.tokenAddress && binding.tokenAddresses?.length) {\n return binding.tokenAddresses.some((address) => isSameAddress(address, input.tokenAddress));\n }\n return true;\n }\n return Boolean(input.tokenAddress && binding.tokenAddresses?.some((address) => isSameAddress(address, input.tokenAddress)));\n}\n\nexport function resolveVaultBinding(bindings: VaultBindingPolicy[], input: RuntimeMatchInput) {\n return bindings.find((binding) => isVaultBindingMatch(binding, input)) ?? null;\n}\n\nexport function resolveFeeMode(taxInfo: FlapTaxInfo | TupleLike | null | undefined, giftVaultFactory?: string | null): FeeMode {\n if (!taxInfo) return \"unknown\";\n\n const marketBps = toNumber(getTupleField(taxInfo as TupleLike, \"marketBps\", 0));\n const dividendBps = toNumber(getTupleField(taxInfo as TupleLike, \"dividendBps\", 3));\n\n if (dividendBps > 0) return \"holder\";\n if (marketBps <= 0) return \"unknown\";\n\n const parsedVaultInfo =\n \"vaultInfo\" in Object(taxInfo)\n ? (taxInfo as FlapTaxInfo).vaultInfo\n : parseFeeVaultInfo(getTupleField(taxInfo as TupleLike, \"vaultInfo\", 14) as TupleLike);\n\n if (parsedVaultInfo?.isVault === true) {\n return isSameAddress(parsedVaultInfo.factory, giftVaultFactory) ? \"gift\" : \"unknown\";\n }\n\n return \"creator\";\n}\n\nexport function resolveTaxInfoRenderSurface({\n tokenInfo,\n taxInfo,\n hasTaxVaults = false,\n isNonTaxFeeToken = false,\n}: ResolveRenderSurfaceInput): VaultRenderSurface {\n if (!tokenInfo?.exists) return \"unavailable\";\n if (!tokenInfo.isTaxToken) return isNonTaxFeeToken ? \"feeinfo\" : \"unavailable\";\n if (taxInfo?.marketBps === 10000 && hasTaxVaults) return \"vault-taxinfo\";\n return \"standard-taxinfo\";\n}\n\nexport function resolveTokenMarketPhase(tokenInfo?: FlapTokenInfo | null): TokenMarketPhase {\n if (!tokenInfo?.exists) return \"unknown\";\n return tokenInfo.status >= 2 ? \"dex-listed\" : \"internal-market\";\n}\n\nexport function isCustomVaultTaxToken(tokenInfo?: FlapTokenInfo | null) {\n return Boolean(tokenInfo?.exists && tokenInfo.isTaxToken);\n}\n\nexport function isActionAvailableForPhase(stage: ActionAvailabilityStage, marketPhase: TokenMarketPhase = \"unknown\") {\n if (stage === \"read-only\") return false;\n if (stage === \"both\") return true;\n if (marketPhase === \"unknown\") return false;\n return stage === marketPhase;\n}\n\nexport function createTaxInfoHostContext({\n tokenInfo,\n taxInfo,\n vaultInfo,\n feeMode,\n giftVaultFactory,\n hasTaxVaults,\n vaultType,\n copyScope = \"tax\",\n}: CreateTaxInfoHostContextInput): VaultHostContext {\n const resolvedFeeMode = feeMode ?? resolveFeeMode(taxInfo, giftVaultFactory);\n const renderSurface = resolveTaxInfoRenderSurface({\n tokenInfo,\n taxInfo,\n hasTaxVaults: hasTaxVaults ?? Boolean(vaultInfo?.found),\n isNonTaxFeeToken: copyScope === \"fee\",\n });\n const marketPhase = resolveTokenMarketPhase(tokenInfo);\n\n return {\n tokenInfo: tokenInfo ?? undefined,\n taxInfo: taxInfo ?? null,\n vaultInfo: vaultInfo ?? null,\n feeMode: resolvedFeeMode,\n renderSurface,\n vaultType,\n copyScope,\n isListed: tokenInfo ? tokenInfo.status >= 2 : undefined,\n marketPhase,\n };\n}\n\nexport function readTaxVaultHostContext(host?: VaultHostContext | null): TaxVaultHostSnapshot {\n const tokenInfo = host?.tokenInfo;\n const marketPhase = host?.marketPhase ?? resolveTokenMarketPhase(tokenInfo);\n const isListed = host?.isListed ?? Boolean(tokenInfo && tokenInfo.status >= 2);\n const isTaxToken = tokenInfo?.isTaxToken === true;\n\n return {\n tokenInfo,\n taxInfo: host?.taxInfo ?? null,\n vaultInfo: host?.vaultInfo ?? null,\n feeMode: host?.feeMode ?? \"unknown\",\n renderSurface: host?.renderSurface ?? \"unavailable\",\n vaultType: host?.vaultType,\n copyScope: host?.copyScope ?? \"tax\",\n marketPhase,\n isListed,\n isTaxToken,\n isSupportedCustomVaultToken: isCustomVaultTaxToken(tokenInfo),\n };\n}\n","import type { PublicClient } from \"viem\";\nimport { erc20Abi } from \"./erc20\";\nimport { getTaxVaultHostChainConfig } from \"./hostRuntimeConfig\";\nimport { createTaxInfoHostContext, isValidAddress, parsePortalTokenInfo, parseTaxTokenInfo, parseVaultPortalInfo, ZERO_ADDRESS } from \"./taxInfo\";\nimport type { Address, FlapTokenInfo, PaymentToken, TokenMetadataSnapshot, TokenRuntimeSnapshot } from \"./types\";\n\nconst portalAbi = [\n {\n name: \"getTokenV7\",\n type: \"function\",\n stateMutability: \"view\",\n inputs: [{ name: \"\", type: \"address\" }],\n outputs: [\n {\n type: \"tuple\",\n components: [\n { name: \"status\", type: \"uint8\" },\n { name: \"reserve\", type: \"uint256\" },\n { name: \"circulatingSupply\", type: \"uint256\" },\n { name: \"price\", type: \"uint256\" },\n { name: \"tokenVersion\", type: \"uint8\" },\n { name: \"r\", type: \"uint256\" },\n { name: \"h\", type: \"uint256\" },\n { name: \"k\", type: \"uint256\" },\n { name: \"dexSupplyThresh\", type: \"uint256\" },\n { name: \"quoteTokenAddress\", type: \"address\" },\n { name: \"nativeToQuoteSwapEnabled\", type: \"bool\" },\n { name: \"extensionID\", type: \"bytes32\" },\n { name: \"taxRate\", type: \"uint256\" },\n { name: \"pool\", type: \"address\" },\n { name: \"progress\", type: \"uint256\" },\n { name: \"lpFeeProfile\", type: \"uint8\" },\n { name: \"dexId\", type: \"uint8\" },\n ],\n },\n ],\n },\n] as const;\n\nconst taxTokenHelperAbi = [\n {\n name: \"getTaxTokenInfo\",\n type: \"function\",\n stateMutability: \"view\",\n inputs: [{ name: \"taxToken\", type: \"address\" }],\n outputs: [\n {\n type: \"tuple\",\n components: [\n { name: \"marketBps\", type: \"uint16\" },\n { name: \"deflationBps\", type: \"uint16\" },\n { name: \"lpBps\", type: \"uint16\" },\n { name: \"dividendBps\", type: \"uint16\" },\n { name: \"feeRate\", type: \"uint16\" },\n { name: \"burntTokenAmount\", type: \"uint256\" },\n { name: \"totalQuoteSentToDividend\", type: \"uint256\" },\n { name: \"totalQuoteAddedToLiquidity\", type: \"uint256\" },\n { name: \"totalTokenAddedToLiquidity\", type: \"uint256\" },\n { name: \"totalQuoteSentToMarketing\", type: \"uint256\" },\n { name: \"marketingWallet\", type: \"address\" },\n { name: \"quoteToken\", type: \"address\" },\n { name: \"minimumShareBalance\", type: \"uint256\" },\n ],\n },\n ],\n },\n {\n name: \"getTaxTokenInfoV2\",\n type: \"function\",\n stateMutability: \"view\",\n inputs: [{ name: \"taxToken\", type: \"address\" }],\n outputs: [\n {\n type: \"tuple\",\n components: [\n { name: \"marketBps\", type: \"uint16\" },\n { name: \"deflationBps\", type: \"uint16\" },\n { name: \"lpBps\", type: \"uint16\" },\n { name: \"dividendBps\", type: \"uint16\" },\n { name: \"buyTaxRate\", type: \"uint16\" },\n { name: \"sellTaxRate\", type: \"uint16\" },\n { name: \"burntTokenAmount\", type: \"uint256\" },\n { name: \"totalQuoteSentToDividend\", type: \"uint256\" },\n { name: \"totalQuoteAddedToLiquidity\", type: \"uint256\" },\n { name: \"totalTokenAddedToLiquidity\", type: \"uint256\" },\n { name: \"totalQuoteSentToMarketing\", type: \"uint256\" },\n { name: \"dividendToken\", type: \"address\" },\n { name: \"quoteToken\", type: \"address\" },\n { name: \"minimumShareBalance\", type: \"uint256\" },\n {\n name: \"vaultInfo\",\n type: \"tuple\",\n components: [\n { name: \"addr\", type: \"address\" },\n { name: \"factory\", type: \"address\" },\n { name: \"riskLevel\", type: \"uint8\" },\n { name: \"isOfficialVault\", type: \"bool\" },\n { name: \"isVault\", type: \"bool\" },\n { name: \"isAIConsumer\", type: \"bool\" },\n ],\n },\n ],\n },\n ],\n },\n] as const;\n\nconst vaultPortalAbi = [\n {\n name: \"tryGetVault\",\n type: \"function\",\n stateMutability: \"view\",\n inputs: [{ name: \"taxToken\", type: \"address\" }],\n outputs: [\n { name: \"found\", type: \"bool\" },\n {\n name: \"info\",\n type: \"tuple\",\n components: [\n { name: \"vault\", type: \"address\" },\n { name: \"vaultFactory\", type: \"address\" },\n { name: \"description\", type: \"string\" },\n { name: \"isOfficial\", type: \"bool\" },\n { name: \"riskLevel\", type: \"uint8\" },\n ],\n },\n ],\n },\n] as const;\n\nasync function readErc20Symbol(publicClient: PublicClient, address: Address) {\n try {\n const symbol = await publicClient.readContract({\n address,\n abi: erc20Abi,\n functionName: \"symbol\",\n });\n return typeof symbol === \"string\" && symbol.trim() ? symbol.trim() : undefined;\n } catch {\n return undefined;\n }\n}\n\nasync function readErc20Name(publicClient: PublicClient, address: Address) {\n try {\n const name = await publicClient.readContract({\n address,\n abi: erc20Abi,\n functionName: \"name\",\n });\n return typeof name === \"string\" && name.trim() ? name.trim() : undefined;\n } catch {\n return undefined;\n }\n}\n\nasync function readErc20Decimals(publicClient: PublicClient, address: Address) {\n try {\n const decimals = await publicClient.readContract({\n address,\n abi: erc20Abi,\n functionName: \"decimals\",\n });\n return typeof decimals === \"number\" ? decimals : 18;\n } catch {\n return 18;\n }\n}\n\nasync function resolvePaymentToken(publicClient: PublicClient, tokenInfo: FlapTokenInfo): Promise<PaymentToken | undefined> {\n const quoteTokenAddress = tokenInfo.quoteTokenAddress;\n if (!quoteTokenAddress) return undefined;\n\n if (quoteTokenAddress === ZERO_ADDRESS) {\n const nativeCurrency = publicClient.chain?.nativeCurrency;\n return {\n address: ZERO_ADDRESS,\n symbol: nativeCurrency?.symbol ?? \"NATIVE\",\n decimals: nativeCurrency?.decimals ?? 18,\n isNative: true,\n };\n }\n\n if (!isValidAddress(quoteTokenAddress)) return undefined;\n\n const [symbol, decimals] = await Promise.all([readErc20Symbol(publicClient, quoteTokenAddress), readErc20Decimals(publicClient, quoteTokenAddress)]);\n\n return {\n address: quoteTokenAddress,\n symbol: symbol ?? \"TOKEN\",\n decimals,\n isNative: false,\n };\n}\n\nexport async function readErc20TokenMetadata(publicClient: PublicClient, tokenAddress?: Address | null): Promise<TokenMetadataSnapshot | null> {\n if (!tokenAddress || !isValidAddress(tokenAddress) || tokenAddress === ZERO_ADDRESS) return null;\n\n const [tokenSymbol, tokenName] = await Promise.all([readErc20Symbol(publicClient, tokenAddress), readErc20Name(publicClient, tokenAddress)]);\n if (!tokenSymbol && !tokenName) return null;\n\n return {\n tokenSymbol,\n tokenName,\n };\n}\n\nexport async function loadTokenRuntimeSnapshot(\n publicClient: PublicClient,\n chainId: number,\n tokenAddress?: Address | null,\n): Promise<TokenRuntimeSnapshot | null> {\n if (!tokenAddress || !isValidAddress(tokenAddress) || tokenAddress === ZERO_ADDRESS) return null;\n\n const chainConfig = getTaxVaultHostChainConfig(chainId);\n\n // Fire metadata fetch immediately; if chainConfig exists, fire portal read in parallel.\n const metadataPromise = readErc20TokenMetadata(publicClient, tokenAddress);\n const portalPromise = chainConfig\n ? publicClient\n .readContract({\n address: chainConfig.portal,\n abi: portalAbi,\n functionName: \"getTokenV7\",\n args: [tokenAddress],\n })\n .then((data) => ({ ok: true as const, data }))\n .catch(() => ({ ok: false as const }))\n : Promise.resolve(null);\n\n const [metadata, portalResult] = await Promise.all([metadataPromise, portalPromise]);\n\n const baseSnapshot = {\n tokenSymbol: metadata?.tokenSymbol,\n tokenName: metadata?.tokenName,\n copyScope: \"tax\" as const,\n };\n\n if (!chainConfig) {\n return {\n ...baseSnapshot,\n hasTaxVaults: false,\n hostReadSupported: false,\n hostReadFromChain: false,\n };\n }\n\n // portalResult is non-null here because chainConfig exists\n if (!portalResult || !portalResult.ok) {\n return {\n ...baseSnapshot,\n hasTaxVaults: Boolean(chainConfig.vaultPortal),\n hostReadSupported: true,\n hostReadFromChain: false,\n giftVaultFactory: chainConfig.giftVaultFactory,\n };\n }\n\n const tokenData = portalResult.data;\n\n const tokenInfo = parsePortalTokenInfo(tokenData as Record<string, unknown>);\n const hasTaxVaults = Boolean(chainConfig.vaultPortal);\n if (!tokenInfo) {\n return {\n ...baseSnapshot,\n hasTaxVaults,\n hostReadSupported: true,\n hostReadFromChain: false,\n giftVaultFactory: chainConfig.giftVaultFactory,\n };\n }\n\n const paymentToken = tokenInfo.exists ? await resolvePaymentToken(publicClient, tokenInfo) : undefined;\n if (!tokenInfo.exists) {\n const host = createTaxInfoHostContext({\n tokenInfo,\n giftVaultFactory: chainConfig.giftVaultFactory,\n hasTaxVaults,\n copyScope: \"tax\",\n });\n return {\n ...baseSnapshot,\n tokenInfo,\n host,\n giftVaultFactory: chainConfig.giftVaultFactory,\n paymentToken,\n hasTaxVaults,\n hostReadSupported: true,\n hostReadFromChain: true,\n };\n }\n\n const taxInfoPromise =\n tokenInfo.isTaxToken && chainConfig.taxTokenHelperAddress\n ? Promise.allSettled([\n publicClient.readContract({\n address: chainConfig.taxTokenHelperAddress,\n abi: taxTokenHelperAbi,\n functionName: \"getTaxTokenInfo\",\n args: [tokenAddress],\n }),\n publicClient.readContract({\n address: chainConfig.taxTokenHelperAddress,\n abi: taxTokenHelperAbi,\n functionName: \"getTaxTokenInfoV2\",\n args: [tokenAddress],\n }),\n ])\n : Promise.resolve(null);\n\n const vaultInfoPromise = chainConfig.vaultPortal\n ? publicClient\n .readContract({\n address: chainConfig.vaultPortal,\n abi: vaultPortalAbi,\n functionName: \"tryGetVault\",\n args: [tokenAddress],\n })\n .catch(() => undefined)\n : Promise.resolve(undefined);\n\n const [taxResults, vaultData] = await Promise.all([taxInfoPromise, vaultInfoPromise]);\n const baseTaxInfo = Array.isArray(taxResults) && taxResults[0]?.status === \"fulfilled\" ? taxResults[0].value : undefined;\n const taxInfoV2 = Array.isArray(taxResults) && taxResults[1]?.status === \"fulfilled\" ? taxResults[1].value : undefined;\n const taxInfo = baseTaxInfo\n ? parseTaxTokenInfo(baseTaxInfo, taxInfoV2, { wrappedNativeTokenAddress: chainConfig.wrappedNativeTokenAddress })\n : undefined;\n const vaultInfo = vaultData ? parseVaultPortalInfo(vaultData) : undefined;\n const host = createTaxInfoHostContext({\n tokenInfo,\n taxInfo,\n vaultInfo,\n giftVaultFactory: chainConfig.giftVaultFactory,\n hasTaxVaults,\n copyScope: \"tax\",\n });\n\n return {\n ...baseSnapshot,\n tokenInfo,\n taxInfo,\n vaultInfo,\n host,\n giftVaultFactory: chainConfig.giftVaultFactory,\n paymentToken,\n hasTaxVaults,\n hostReadSupported: true,\n hostReadFromChain: true,\n };\n}\n","import { loadTokenRuntimeSnapshot } from \"./hostRead\";\nimport { isValidAddress, readTaxVaultHostContext, ZERO_ADDRESS } from \"./taxInfo\";\nimport type {\n Address,\n HostRuntimeAddresses,\n HostRuntimeDataSource,\n HostRuntimeDegradeReason,\n HostRuntimeInput,\n HostRuntimeResult,\n HostRuntimeSources,\n HostRuntimeStatus,\n HostRuntimeWarning,\n TokenRuntimeSnapshot,\n} from \"./types\";\n\nfunction isResolvedAddress(address?: Address | null): address is Address {\n return Boolean(address && isValidAddress(address) && address !== ZERO_ADDRESS);\n}\n\nfunction pickAddress(...candidates: Array<Address | null | undefined>) {\n for (const candidate of candidates) {\n if (isResolvedAddress(candidate)) return candidate;\n }\n return undefined;\n}\n\nfunction resolveAddresses(input: Pick<HostRuntimeInput, \"chainId\" | \"tokenAddress\" | \"factoryAddressHint\" | \"vaultAddressHint\">, snapshot?: TokenRuntimeSnapshot | null): HostRuntimeAddresses {\n return {\n chainId: input.chainId,\n tokenAddress: input.tokenAddress,\n factoryAddressHint: input.factoryAddressHint,\n vaultAddressHint: input.vaultAddressHint,\n factoryAddress: pickAddress(snapshot?.vaultInfo?.vaultFactory, snapshot?.taxInfo?.vaultInfo?.factory ?? undefined, input.factoryAddressHint),\n vaultAddress: pickAddress(snapshot?.vaultInfo?.vault, snapshot?.taxInfo?.vaultInfo?.addr ?? undefined, input.vaultAddressHint),\n };\n}\n\nfunction hasPresentationMetadata(result: HostRuntimeResult) {\n return Boolean(result.presentation?.tokenName || result.presentation?.tokenSymbol || result.presentation?.tokenImageUrl);\n}\n\nfunction resolveTokenMetadataSource(snapshot: TokenRuntimeSnapshot | null, presentationDataAvailable: boolean): HostRuntimeDataSource {\n if (presentationDataAvailable) return \"host-proxy\";\n if (snapshot?.tokenName || snapshot?.tokenSymbol) return \"onchain\";\n return \"unavailable\";\n}\n\nfunction resolveSources(snapshot: TokenRuntimeSnapshot | null, presentationDataAvailable: boolean): HostRuntimeSources {\n return {\n tokenMetadata: resolveTokenMetadataSource(snapshot, presentationDataAvailable),\n taxState: snapshot?.taxInfo ? \"onchain\" : \"unavailable\",\n vaultState: snapshot?.vaultInfo?.found || snapshot?.taxInfo?.vaultInfo?.isVault ? \"onchain\" : \"unavailable\",\n presentation: presentationDataAvailable ? \"host-proxy\" : \"unavailable\",\n };\n}\n\nfunction collectWarnings(snapshot: TokenRuntimeSnapshot | null, addresses: HostRuntimeAddresses): HostRuntimeWarning[] {\n const warnings: HostRuntimeWarning[] = [];\n\n if (!snapshot?.taxInfo) warnings.push(\"tax-info-unavailable\");\n if (snapshot?.tokenInfo?.quoteTokenAddress && !snapshot.paymentToken) warnings.push(\"payment-token-unavailable\");\n if (!addresses.vaultAddress) warnings.push(\"vault-address-unavailable\");\n if (!addresses.factoryAddress) warnings.push(\"factory-address-unavailable\");\n\n return warnings;\n}\n\nfunction resolveChainFailure(snapshot: TokenRuntimeSnapshot | null): HostRuntimeDegradeReason | null {\n if (!snapshot) return \"chain-read-unavailable\";\n if (!snapshot.hostReadSupported) return \"unsupported-chain\";\n if (!snapshot.hostReadFromChain || !snapshot.tokenInfo) return \"chain-read-unavailable\";\n if (!snapshot.tokenInfo.exists) return \"token-not-found\";\n if (!snapshot.tokenInfo.isTaxToken) return \"token-not-tax\";\n return null;\n}\n\nfunction createResult(params: {\n status: HostRuntimeStatus;\n input: Pick<HostRuntimeInput, \"chainId\" | \"tokenAddress\" | \"factoryAddressHint\" | \"vaultAddressHint\">;\n snapshot: TokenRuntimeSnapshot | null;\n degradeReason?: HostRuntimeDegradeReason;\n presentation?: HostRuntimeResult[\"presentation\"];\n policy: HostRuntimeResult[\"policy\"];\n}): HostRuntimeResult {\n const addresses = resolveAddresses(params.input, params.snapshot);\n const basePresentation = params.presentation ?? null;\n const baseResult: HostRuntimeResult = {\n status: params.status,\n policy: params.policy,\n degradeReason: params.degradeReason,\n warnings: collectWarnings(params.snapshot, addresses),\n addresses,\n snapshot: params.snapshot,\n host: params.snapshot?.host ?? undefined,\n paymentToken: params.snapshot?.paymentToken,\n tokenSymbol: basePresentation?.tokenSymbol ?? params.snapshot?.tokenSymbol,\n tokenName: basePresentation?.tokenName ?? params.snapshot?.tokenName,\n tokenImageUrl: basePresentation?.tokenImageUrl,\n tokenDetailHref: basePresentation?.tokenDetailHref,\n chainHref: basePresentation?.chainHref,\n presentation: basePresentation,\n sources: {\n tokenMetadata: \"unavailable\",\n taxState: \"unavailable\",\n vaultState: \"unavailable\",\n presentation: \"unavailable\",\n },\n };\n\n baseResult.sources = resolveSources(params.snapshot, hasPresentationMetadata(baseResult));\n return baseResult;\n}\n\nexport function resolveHostRuntimeAddresses(input: Pick<HostRuntimeInput, \"chainId\" | \"tokenAddress\" | \"factoryAddressHint\" | \"vaultAddressHint\">, snapshot?: TokenRuntimeSnapshot | null) {\n return resolveAddresses(input, snapshot);\n}\n\nexport async function runHostRuntime(input: HostRuntimeInput): Promise<HostRuntimeResult> {\n const policy = input.policy ?? \"prefer-full-host\";\n\n if (!isResolvedAddress(input.tokenAddress)) {\n return createResult({\n status: \"unavailable\",\n input,\n snapshot: null,\n degradeReason: \"invalid-token-address\",\n policy,\n });\n }\n\n const snapshot = await loadTokenRuntimeSnapshot(input.publicClient, input.chainId, input.tokenAddress);\n const chainFailure = resolveChainFailure(snapshot);\n if (chainFailure) {\n return createResult({\n status: \"unavailable\",\n input,\n snapshot,\n degradeReason: chainFailure,\n policy,\n });\n }\n\n let presentation: HostRuntimeResult[\"presentation\"] = null;\n let presentationFailure: HostRuntimeDegradeReason | undefined;\n\n if (input.presentationFetcher) {\n try {\n const resolvedAddrs = resolveAddresses(input, snapshot);\n presentation = await input.presentationFetcher({\n chainId: input.chainId,\n tokenAddress: input.tokenAddress,\n factoryAddress: resolvedAddrs.factoryAddress,\n vaultAddress: resolvedAddrs.vaultAddress,\n snapshot: snapshot!,\n });\n if (!presentation) {\n presentationFailure = \"host-presentation-unavailable\";\n }\n } catch {\n presentationFailure = \"host-presentation-unavailable\";\n }\n } else {\n presentationFailure = \"host-presentation-not-configured\";\n }\n\n if (presentation) {\n return createResult({\n status: \"full-host\",\n input,\n snapshot,\n presentation,\n policy,\n });\n }\n\n if (policy === \"require-full-host\") {\n return createResult({\n status: \"unavailable\",\n input,\n snapshot,\n degradeReason: presentationFailure === \"host-presentation-not-configured\" ? \"host-presentation-required\" : \"host-presentation-unavailable\",\n policy,\n });\n }\n\n const result = createResult({\n status: \"onchain\",\n input,\n snapshot,\n degradeReason: presentationFailure,\n policy,\n });\n\n const hostSnapshot = readTaxVaultHostContext(result.host);\n if (!hostSnapshot.isSupportedCustomVaultToken) {\n return {\n ...result,\n status: \"unavailable\",\n degradeReason: \"token-not-tax\",\n };\n }\n\n return result;\n}\n","import type { OracleProvision, OracleReadRequest, OracleReader } from \"./types\";\n\nconst DEFAULT_LOCAL_ORACLE_ENDPOINT_BASE = \"/api/runtime/oracle\";\n\nexport class OracleReadError extends Error {\n status?: number;\n\n constructor(message: string, status?: number) {\n super(message);\n this.name = \"OracleReadError\";\n this.status = status;\n }\n}\n\nfunction appendSearchParams(url: URL, params?: Record<string, string>) {\n for (const [key, value] of Object.entries(params ?? {})) {\n url.searchParams.set(key, value);\n }\n}\n\nfunction toOracleProvision(provision: string | OracleProvision): OracleProvision {\n return typeof provision === \"string\" ? { endpoint: provision } : provision;\n}\n\nexport function buildLocalOracleUrl(oracleId: string, params?: Record<string, string>, endpointBase = DEFAULT_LOCAL_ORACLE_ENDPOINT_BASE) {\n const normalizedBase = endpointBase.replace(/\\/+$/, \"\");\n const url = new URL(`${normalizedBase}/${encodeURIComponent(oracleId)}`, \"http://localhost\");\n appendSearchParams(url, params);\n return `${url.pathname}${url.search}`;\n}\n\nexport async function fetchOracleJson<T>({\n endpoint,\n params,\n fetchImpl,\n headers,\n}: {\n endpoint: string;\n params?: Record<string, string>;\n fetchImpl?: typeof fetch;\n headers?: HeadersInit;\n}): Promise<T> {\n const fallbackOrigin = typeof window !== \"undefined\" ? window.location.origin : \"http://localhost\";\n const url = new URL(endpoint, fallbackOrigin);\n appendSearchParams(url, params);\n\n const response = await (fetchImpl ?? fetch)(url.toString(), {\n cache: \"no-store\",\n headers,\n method: \"GET\",\n });\n\n if (!response.ok) {\n throw new OracleReadError(`Oracle request returned ${response.status}.`, response.status);\n }\n\n return (await response.json()) as T;\n}\n\nexport async function fetchProvisionedOracle<T>({\n provision,\n params,\n fetchImpl,\n}: {\n provision: string | OracleProvision;\n params?: Record<string, string>;\n fetchImpl?: typeof fetch;\n}): Promise<T> {\n const normalizedProvision = toOracleProvision(provision);\n const filteredParams =\n normalizedProvision.allowedParams && normalizedProvision.allowedParams.length\n ? Object.fromEntries(Object.entries(params ?? {}).filter(([key]) => normalizedProvision.allowedParams?.includes(key)))\n : params;\n\n return fetchOracleJson<T>({\n endpoint: normalizedProvision.endpoint,\n params: filteredParams,\n fetchImpl,\n headers: normalizedProvision.headers,\n });\n}\n\nexport function createLocalOracleReader(options: { endpointBase?: string; fetchImpl?: typeof fetch } = {}): OracleReader {\n const endpointBase = options.endpointBase ?? DEFAULT_LOCAL_ORACLE_ENDPOINT_BASE;\n const fetchImpl = options.fetchImpl;\n\n return async function readLocalOracle<T>({ oracleId, params }: OracleReadRequest): Promise<T> {\n return fetchOracleJson<T>({\n endpoint: buildLocalOracleUrl(oracleId, params, endpointBase),\n fetchImpl,\n });\n };\n}\n","import { resolveManifestBinding } from \"./taxInfo\";\nimport type { Address, CreateVaultRuntimeContextInput, VaultRuntimeContext, VaultRuntimeExtraConfig } from \"./types\";\n\nconst zeroAddress = \"0x0000000000000000000000000000000000000000\" as Address;\n\nexport function explorerForChain(chainId: number) {\n if (chainId === 56) return \"https://bscscan.com\";\n if (chainId === 97) return \"https://testnet.bscscan.com\";\n return undefined;\n}\n\nexport function chainLabelForChain(chainId: number) {\n if (chainId === 56) return \"BNB Chain\";\n if (chainId === 97) return \"BNB Testnet\";\n return `Chain ${chainId}`;\n}\n\nfunction buildRuntimeExtraConfig(input: CreateVaultRuntimeContextInput): VaultRuntimeExtraConfig {\n const hostRuntimeResult = input.hostRuntimeResult;\n const runtimeOverrides = input.runtimeOverrides;\n\n return {\n ...(hostRuntimeResult\n ? {\n hostRuntimeStatus: hostRuntimeResult.status,\n hostRuntimePolicy: hostRuntimeResult.policy,\n hostRuntimeDegradeReason: hostRuntimeResult.degradeReason,\n hostRuntimeWarnings: hostRuntimeResult.warnings,\n }\n : {}),\n ...(hostRuntimeResult?.presentation?.extraConfig ?? {}),\n ...(runtimeOverrides?.extraConfig ?? {}),\n };\n}\n\nexport function createVaultRuntimeContext(input: CreateVaultRuntimeContextInput): VaultRuntimeContext {\n const runtimeOverrides = input.runtimeOverrides;\n const resolvedBinding = resolveManifestBinding(input.manifest, {\n chainId: runtimeOverrides?.chainId ?? input.connectedChainId ?? input.hostRuntimeResult?.addresses.chainId,\n factoryAddress: runtimeOverrides?.factoryAddress ?? input.hostRuntimeResult?.addresses.factoryAddress,\n vaultAddress: runtimeOverrides?.vaultAddress ?? input.hostRuntimeResult?.addresses.vaultAddress,\n tokenAddress: runtimeOverrides?.tokenAddress ?? input.hostRuntimeResult?.addresses.tokenAddress,\n });\n const effectiveChainId =\n runtimeOverrides?.chainId ?? input.hostRuntimeResult?.addresses.chainId ?? input.connectedChainId ?? resolvedBinding?.chainId ?? input.manifest.match.bindings[0]?.chainId ?? 56;\n\n return {\n chainId: effectiveChainId,\n factoryAddress: runtimeOverrides?.factoryAddress ?? input.hostRuntimeResult?.addresses.factoryAddress ?? resolvedBinding?.factoryAddress ?? zeroAddress,\n tokenAddress: runtimeOverrides?.tokenAddress ?? input.hostRuntimeResult?.addresses.tokenAddress ?? zeroAddress,\n vaultAddress: runtimeOverrides?.vaultAddress ?? input.hostRuntimeResult?.addresses.vaultAddress ?? zeroAddress,\n userAddress: runtimeOverrides?.userAddress,\n tokenSymbol: runtimeOverrides?.tokenSymbol ?? input.hostRuntimeResult?.tokenSymbol,\n tokenName: runtimeOverrides?.tokenName ?? input.hostRuntimeResult?.tokenName,\n tokenImageUrl: runtimeOverrides?.tokenImageUrl ?? input.hostRuntimeResult?.tokenImageUrl,\n explorerBaseUrl: runtimeOverrides?.explorerBaseUrl ?? explorerForChain(effectiveChainId),\n paymentToken: runtimeOverrides?.paymentToken ?? input.hostRuntimeResult?.paymentToken,\n host: runtimeOverrides?.host ?? input.hostRuntimeResult?.host,\n extraConfig: buildRuntimeExtraConfig(input),\n manifest: input.manifest,\n };\n}\n","export type TxErrorKind = \"userRejected\" | \"walletDisconnected\" | \"wrongNetwork\" | \"insufficientFunds\" | \"simulationFailed\" | \"reverted\" | \"unknown\";\n\ntype TxErrorMessageMap = Partial<Record<TxErrorKind, string>>;\n\nconst defaultMessages: Record<TxErrorKind, string> = {\n userRejected: \"You rejected the wallet request.\",\n walletDisconnected: \"Connect a wallet before sending this transaction.\",\n wrongNetwork: \"Switch the wallet to the required chain before sending this transaction.\",\n insufficientFunds: \"Insufficient wallet balance to complete this transaction.\",\n simulationFailed: \"The transaction could not pass simulation.\",\n reverted: \"The contract rejected this transaction.\",\n unknown: \"Transaction failed. Please check your wallet and try again.\",\n};\n\nfunction isObject(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === \"object\";\n}\n\nfunction readString(value: unknown) {\n return typeof value === \"string\" ? value : \"\";\n}\n\nfunction collectMessages(error: unknown, depth = 0, seen = new Set<unknown>()): string[] {\n if (depth > 4 || error == null || seen.has(error)) return [];\n seen.add(error);\n\n if (typeof error === \"string\") return [error];\n if (!isObject(error)) return [];\n\n const messages = [\n readString(error.shortMessage),\n readString(error.message),\n readString(error.details),\n readString(error.reason),\n ].filter(Boolean);\n\n return [...messages, ...collectMessages(error.cause, depth + 1, seen)];\n}\n\nfunction collectCodes(error: unknown, depth = 0, seen = new Set<unknown>()): Array<string | number> {\n if (depth > 4 || error == null || seen.has(error)) return [];\n seen.add(error);\n if (!isObject(error)) return [];\n\n const codes = [error.code, error.name].filter((value) => typeof value === \"string\" || typeof value === \"number\");\n return [...codes, ...collectCodes(error.cause, depth + 1, seen)];\n}\n\nexport function getTxErrorKind(error: unknown): TxErrorKind {\n const message = collectMessages(error).join(\" \").toLowerCase();\n const codes = collectCodes(error)\n .map((value: string | number) => String(value).toLowerCase())\n .join(\" \");\n\n if (\n codes.includes(\"4001\") ||\n codes.includes(\"action_rejected\") ||\n codes.includes(\"userrejectedrequesterror\") ||\n /user rejected|user denied|rejected the request|denied transaction|request rejected|cancelled/i.test(message)\n ) {\n return \"userRejected\";\n }\n\n if (/wallet is not connected|connector not connected|account not found|no wallet client/i.test(message)) {\n return \"walletDisconnected\";\n }\n\n if (/wrong network|switch wallet to|switch network to|required chain/i.test(message)) {\n return \"wrongNetwork\";\n }\n\n if (/insufficient funds|exceeds the balance|gas \\* price \\+ value/i.test(message)) {\n return \"insufficientFunds\";\n }\n\n if (/simulation failed|simulatecontract|execution reverted during simulation/i.test(message)) {\n return \"simulationFailed\";\n }\n\n if (/execution reverted|reverted with the following reason|contract function .* reverted|call exception/i.test(message)) {\n return \"reverted\";\n }\n\n return \"unknown\";\n}\n\nexport function handleTxError(error: unknown, messages?: TxErrorMessageMap) {\n const kind = getTxErrorKind(error);\n return messages?.[kind] ?? defaultMessages[kind];\n}\n"]}
|
package/package.json
CHANGED
package/runtime-contract.json
CHANGED
package/sdk.d.mts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { I as VaultManifest, L as VaultRuntimeContextOverrides, r as HostRuntimeResult, y as OracleReader, K as VaultRuntimeContext, e as FlapI18n, f as FlapNotify, j as FlapVaultSdk, k as FlapWallet } from './types-
|
|
2
|
-
export { A as ActionAvailabilityStage, a as Address, C as ContractReadRequest, b as ContractWriteRequest, F as FeeMode, d as FlapFeeVaultInfo, g as FlapTaxInfo, h as FlapTokenInfo, i as FlapVaultPortalInfo, M as ManifestBindingEntry, O as OracleProvision, x as OracleReadRequest, P as PaymentToken, R as RuntimeOracleRegistry, S as SimulateResult, T as TokenMarketPhase, D as TxReceipt, V as VaultComponentProps, G as VaultHostContext, J as VaultRenderSurface, N as VaultRuntimeExtraConfig } from './types-
|
|
3
|
-
export { O as OracleReadError, Z as ZERO_ADDRESS, c as buildLocalOracleUrl, d as createLocalOracleReader, f as fetchOracleJson, g as fetchProvisionedOracle, h as formatCountdown, i as formatPercentBps, j as formatTokenAmount, l as getTxErrorKind, m as handleTxError, n as isActionAvailableForPhase, o as isCustomVaultTaxToken, r as isValidAddress, x as parseTokenAmount, z as readTaxVaultHostContext, E as resolveTokenMarketPhase, G as shortenAddress, H as standardErc20Abi } from './txError-
|
|
1
|
+
import { I as VaultManifest, L as VaultRuntimeContextOverrides, r as HostRuntimeResult, y as OracleReader, K as VaultRuntimeContext, e as FlapI18n, f as FlapNotify, j as FlapVaultSdk, k as FlapWallet } from './types-COZWeTke.mjs';
|
|
2
|
+
export { A as ActionAvailabilityStage, a as Address, C as ContractReadRequest, b as ContractWriteRequest, F as FeeMode, d as FlapFeeVaultInfo, g as FlapTaxInfo, h as FlapTokenInfo, i as FlapVaultPortalInfo, M as ManifestBindingEntry, O as OracleProvision, x as OracleReadRequest, P as PaymentToken, R as RuntimeOracleRegistry, S as SimulateResult, T as TokenMarketPhase, D as TxReceipt, V as VaultComponentProps, G as VaultHostContext, J as VaultRenderSurface, N as VaultRuntimeExtraConfig } from './types-COZWeTke.mjs';
|
|
3
|
+
export { O as OracleReadError, Z as ZERO_ADDRESS, c as buildLocalOracleUrl, d as createLocalOracleReader, f as fetchOracleJson, g as fetchProvisionedOracle, h as formatCountdown, i as formatPercentBps, j as formatTokenAmount, l as getTxErrorKind, m as handleTxError, n as isActionAvailableForPhase, o as isCustomVaultTaxToken, r as isValidAddress, x as parseTokenAmount, z as readTaxVaultHostContext, E as resolveTokenMarketPhase, G as shortenAddress, H as standardErc20Abi } from './txError-Dd0Oug-u.mjs';
|
|
4
4
|
import * as React from 'react';
|
|
5
5
|
import { ReactNode } from 'react';
|
|
6
6
|
export { erc20Abi } from 'viem';
|