@flapsdk/vault-runtime 0.1.0 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -6,9 +6,9 @@ This package is the shared runtime surface that local preview, Artifact Workbenc
6
6
 
7
7
  ## Exports
8
8
 
9
- - `./sdk`: component-facing SDK hooks, helpers, types, and provider
9
+ - `./sdk`: component-facing SDK hooks, helpers, types, provider, and local oracle reader helper
10
10
  - `./ui`: shared UI primitives
11
11
  - `./host`: host/runtime preflight helpers
12
- - `./server`: server-side presentation and host-proxy helpers
12
+ - `./server`: server-side presentation plus runtime oracle-registry helpers
13
13
 
14
14
  See `runtime-contract.json` for the machine-readable subpath contract.
package/host.d.mts CHANGED
@@ -1,9 +1,9 @@
1
- import { a as Address, x as TokenRuntimeSnapshot, w as TokenMetadataSnapshot, n as HostRuntimeInput, H as HostRuntimeAddresses, r as HostRuntimeResult, c as CreateVaultRuntimeContextInput, G as VaultRuntimeContext } from './types-CX7pLmiT.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, P as PaymentToken, S as SimulateResult, T as TokenMarketPhase, y as TxReceipt, V as VaultComponentProps, z as VaultHostContext, B as VaultManifest, D as VaultRenderSurface, I as VaultRuntimeContextOverrides, J as VaultRuntimeExtraConfig } from './types-CX7pLmiT.mjs';
3
- export { C as CreateTaxInfoHostContextInput, R as ResolveRenderSurfaceInput, a as RuntimeMatchInput, T as TaxVaultHostSnapshot, b as TxErrorKind, V as VaultBindingPolicy, Z as ZERO_ADDRESS, c as createTaxInfoHostContext, f as formatCountdown, d as formatPercentBps, e as formatTokenAmount, g as getTupleField, h as getTxErrorKind, i as handleTxError, j as isActionAvailableForPhase, k as isCustomVaultTaxToken, l as isManifestRuntimeMatch, m as isSameAddress, n as isValidAddress, o as isVaultBindingMatch, p as normalizeAddress, q as parseFeeVaultInfo, r as parsePortalTokenInfo, s as parseTaxTokenInfo, t as parseTokenAmount, u as parseVaultPortalInfo, v as readTaxVaultHostContext, w as resolveFeeMode, x as resolveManifestBinding, y as resolveTaxInfoRenderSurface, z as resolveTokenMarketPhase, A as resolveVaultBinding, B as shortenAddress, D as standardErc20Abi } from './txError-1lPZHdqI.mjs';
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-Di-5da9N.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-Di-5da9N.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-CCPPX3Rf.mjs';
4
4
  import { PublicClient } from 'viem';
5
5
  export { erc20Abi } from 'viem';
6
- export { T as TaxVaultHostChainConfig, g as getTaxVaultHostChainConfig } from './hostRuntimeConfig-BOEJo2nq.mjs';
6
+ export { T as TaxVaultHostChainConfig, g as getTaxVaultHostChainConfig } from './hostRuntimeConfig-BHrk6mth.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
@@ -28,9 +28,11 @@ function formatCountdown(targetTimeMs) {
28
28
  if (!targetTimeMs) return "-";
29
29
  const diff = Math.max(0, targetTimeMs - Date.now());
30
30
  const totalSeconds = Math.floor(diff / 1e3);
31
- const hours = Math.floor(totalSeconds / 3600);
31
+ const days = Math.floor(totalSeconds / 86400);
32
+ const hours = Math.floor(totalSeconds % 86400 / 3600);
32
33
  const minutes = Math.floor(totalSeconds % 3600 / 60);
33
34
  const seconds = totalSeconds % 60;
35
+ if (days > 0) return `${days}d ${hours}h ${minutes}m`;
34
36
  if (hours > 0) return `${hours}h ${minutes}m ${seconds}s`;
35
37
  return `${minutes}m ${seconds}s`;
36
38
  }
@@ -482,8 +484,15 @@ async function readErc20TokenMetadata(publicClient, tokenAddress) {
482
484
  }
483
485
  async function loadTokenRuntimeSnapshot(publicClient, chainId, tokenAddress) {
484
486
  if (!tokenAddress || !isValidAddress(tokenAddress) || tokenAddress === ZERO_ADDRESS) return null;
485
- const metadata = await readErc20TokenMetadata(publicClient, tokenAddress);
486
487
  const chainConfig = getTaxVaultHostChainConfig(chainId);
488
+ const metadataPromise = readErc20TokenMetadata(publicClient, tokenAddress);
489
+ const portalPromise = chainConfig ? publicClient.readContract({
490
+ address: chainConfig.portal,
491
+ abi: portalAbi,
492
+ functionName: "getTokenV7",
493
+ args: [tokenAddress]
494
+ }).then((data) => ({ ok: true, data })).catch(() => ({ ok: false })) : Promise.resolve(null);
495
+ const [metadata, portalResult] = await Promise.all([metadataPromise, portalPromise]);
487
496
  const baseSnapshot = {
488
497
  tokenSymbol: metadata?.tokenSymbol,
489
498
  tokenName: metadata?.tokenName,
@@ -497,15 +506,7 @@ async function loadTokenRuntimeSnapshot(publicClient, chainId, tokenAddress) {
497
506
  hostReadFromChain: false
498
507
  };
499
508
  }
500
- let tokenData;
501
- try {
502
- tokenData = await publicClient.readContract({
503
- address: chainConfig.portal,
504
- abi: portalAbi,
505
- functionName: "getTokenV7",
506
- args: [tokenAddress]
507
- });
508
- } catch {
509
+ if (!portalResult || !portalResult.ok) {
509
510
  return {
510
511
  ...baseSnapshot,
511
512
  hasTaxVaults: Boolean(chainConfig.vaultPortal),
@@ -514,6 +515,7 @@ async function loadTokenRuntimeSnapshot(publicClient, chainId, tokenAddress) {
514
515
  giftVaultFactory: chainConfig.giftVaultFactory
515
516
  };
516
517
  }
518
+ const tokenData = portalResult.data;
517
519
  const tokenInfo = parsePortalTokenInfo(tokenData);
518
520
  const hasTaxVaults = Boolean(chainConfig.vaultPortal);
519
521
  if (!tokenInfo) {
@@ -607,8 +609,8 @@ function resolveAddresses(input, snapshot) {
607
609
  tokenAddress: input.tokenAddress,
608
610
  factoryAddressHint: input.factoryAddressHint,
609
611
  vaultAddressHint: input.vaultAddressHint,
610
- factoryAddress: pickAddress(input.factoryAddressHint, snapshot?.vaultInfo?.vaultFactory, snapshot?.taxInfo?.vaultInfo?.factory ?? void 0),
611
- vaultAddress: pickAddress(input.vaultAddressHint, snapshot?.vaultInfo?.vault, snapshot?.taxInfo?.vaultInfo?.addr ?? void 0)
612
+ factoryAddress: pickAddress(snapshot?.vaultInfo?.vaultFactory, snapshot?.taxInfo?.vaultInfo?.factory ?? void 0, input.factoryAddressHint),
613
+ vaultAddress: pickAddress(snapshot?.vaultInfo?.vault, snapshot?.taxInfo?.vaultInfo?.addr ?? void 0, input.vaultAddressHint)
612
614
  };
613
615
  }
614
616
  function hasPresentationMetadata(result) {
@@ -700,11 +702,12 @@ async function runHostRuntime(input) {
700
702
  let presentationFailure;
701
703
  if (input.presentationFetcher) {
702
704
  try {
705
+ const resolvedAddrs = resolveAddresses(input, snapshot);
703
706
  presentation = await input.presentationFetcher({
704
707
  chainId: input.chainId,
705
708
  tokenAddress: input.tokenAddress,
706
- factoryAddress: resolveAddresses(input, snapshot).factoryAddress,
707
- vaultAddress: resolveAddresses(input, snapshot).vaultAddress,
709
+ factoryAddress: resolvedAddrs.factoryAddress,
710
+ vaultAddress: resolvedAddrs.vaultAddress,
708
711
  snapshot
709
712
  });
710
713
  if (!presentation) {
@@ -752,6 +755,73 @@ async function runHostRuntime(input) {
752
755
  return result;
753
756
  }
754
757
 
758
+ // src/sdk/oracle.ts
759
+ var DEFAULT_LOCAL_ORACLE_ENDPOINT_BASE = "/api/runtime/oracle";
760
+ var OracleReadError = class extends Error {
761
+ constructor(message, status) {
762
+ super(message);
763
+ this.name = "OracleReadError";
764
+ this.status = status;
765
+ }
766
+ };
767
+ function appendSearchParams(url, params) {
768
+ for (const [key, value] of Object.entries(params ?? {})) {
769
+ url.searchParams.set(key, value);
770
+ }
771
+ }
772
+ function toOracleProvision(provision) {
773
+ return typeof provision === "string" ? { endpoint: provision } : provision;
774
+ }
775
+ function buildLocalOracleUrl(oracleId, params, endpointBase = DEFAULT_LOCAL_ORACLE_ENDPOINT_BASE) {
776
+ const normalizedBase = endpointBase.replace(/\/+$/, "");
777
+ const url = new URL(`${normalizedBase}/${encodeURIComponent(oracleId)}`, "http://localhost");
778
+ appendSearchParams(url, params);
779
+ return `${url.pathname}${url.search}`;
780
+ }
781
+ async function fetchOracleJson({
782
+ endpoint,
783
+ params,
784
+ fetchImpl,
785
+ headers
786
+ }) {
787
+ const fallbackOrigin = typeof window !== "undefined" ? window.location.origin : "http://localhost";
788
+ const url = new URL(endpoint, fallbackOrigin);
789
+ appendSearchParams(url, params);
790
+ const response = await (fetchImpl ?? fetch)(url.toString(), {
791
+ cache: "no-store",
792
+ headers,
793
+ method: "GET"
794
+ });
795
+ if (!response.ok) {
796
+ throw new OracleReadError(`Oracle request returned ${response.status}.`, response.status);
797
+ }
798
+ return await response.json();
799
+ }
800
+ async function fetchProvisionedOracle({
801
+ provision,
802
+ params,
803
+ fetchImpl
804
+ }) {
805
+ const normalizedProvision = toOracleProvision(provision);
806
+ const filteredParams = normalizedProvision.allowedParams && normalizedProvision.allowedParams.length ? Object.fromEntries(Object.entries(params ?? {}).filter(([key]) => normalizedProvision.allowedParams?.includes(key))) : params;
807
+ return fetchOracleJson({
808
+ endpoint: normalizedProvision.endpoint,
809
+ params: filteredParams,
810
+ fetchImpl,
811
+ headers: normalizedProvision.headers
812
+ });
813
+ }
814
+ function createLocalOracleReader(options = {}) {
815
+ const endpointBase = options.endpointBase ?? DEFAULT_LOCAL_ORACLE_ENDPOINT_BASE;
816
+ const fetchImpl = options.fetchImpl;
817
+ return async function readLocalOracle({ oracleId, params }) {
818
+ return fetchOracleJson({
819
+ endpoint: buildLocalOracleUrl(oracleId, params, endpointBase),
820
+ fetchImpl
821
+ });
822
+ };
823
+ }
824
+
755
825
  // src/sdk/runtimeContext.ts
756
826
  var zeroAddress = "0x0000000000000000000000000000000000000000";
757
827
  function explorerForChain(chainId) {
@@ -866,6 +936,6 @@ function handleTxError(error, messages) {
866
936
  return messages?.[kind] ?? defaultMessages[kind];
867
937
  }
868
938
 
869
- export { ZERO_ADDRESS, chainLabelForChain, createTaxInfoHostContext, createVaultRuntimeContext, explorerForChain, formatCountdown, formatPercentBps, formatTokenAmount, getTaxVaultHostChainConfig, getTupleField, getTxErrorKind, handleTxError, isActionAvailableForPhase, isCustomVaultTaxToken, isManifestRuntimeMatch, isSameAddress, isValidAddress, isVaultBindingMatch, loadTokenRuntimeSnapshot, normalizeAddress, parseFeeVaultInfo, parsePortalTokenInfo, parseTaxTokenInfo, parseTokenAmount, parseVaultPortalInfo, readErc20TokenMetadata, readTaxVaultHostContext, resolveFeeMode, resolveHostRuntimeAddresses, resolveManifestBinding, resolveTaxInfoRenderSurface, resolveTokenMarketPhase, resolveVaultBinding, runHostRuntime, shortenAddress, standardErc20Abi };
939
+ export { OracleReadError, ZERO_ADDRESS, buildLocalOracleUrl, chainLabelForChain, createLocalOracleReader, createTaxInfoHostContext, createVaultRuntimeContext, explorerForChain, fetchOracleJson, fetchProvisionedOracle, formatCountdown, formatPercentBps, formatTokenAmount, getTaxVaultHostChainConfig, getTupleField, getTxErrorKind, handleTxError, isActionAvailableForPhase, isCustomVaultTaxToken, isManifestRuntimeMatch, isSameAddress, isValidAddress, isVaultBindingMatch, loadTokenRuntimeSnapshot, normalizeAddress, parseFeeVaultInfo, parsePortalTokenInfo, parseTaxTokenInfo, parseTokenAmount, parseVaultPortalInfo, readErc20TokenMetadata, readTaxVaultHostContext, resolveFeeMode, resolveHostRuntimeAddresses, resolveManifestBinding, resolveTaxInfoRenderSurface, resolveTokenMarketPhase, resolveVaultBinding, runHostRuntime, shortenAddress, standardErc20Abi };
870
940
  //# sourceMappingURL=host.js.map
871
941
  //# sourceMappingURL=host.js.map
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/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 hours = Math.floor(totalSeconds / 3600);\n const minutes = Math.floor((totalSeconds % 3600) / 60);\n const seconds = totalSeconds % 60;\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 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 if (input.chainId && input.factoryAddress) {\n return resolveUnique(bindings.filter((binding) => binding.chainId === input.chainId && isSameAddress(binding.factoryAddress, input.factoryAddress)));\n }\n\n if (input.chainId) {\n return resolveUnique(bindings.filter((binding) => binding.chainId === input.chainId));\n }\n\n if (input.factoryAddress) {\n return resolveUnique(bindings.filter((binding) => isSameAddress(binding.factoryAddress, input.factoryAddress)));\n }\n\n return null;\n}\n\nexport function isManifestRuntimeMatch(manifest: Pick<VaultManifest, \"match\">, input: RuntimeMatchInput) {\n if (!input.chainId || !input.factoryAddress) return false;\n const matchingBinding = resolveManifestBinding(manifest, input);\n if (!matchingBinding) return false;\n return matchingBinding.chainId === input.chainId && isSameAddress(matchingBinding.factoryAddress, input.factoryAddress);\n}\n\nexport function isVaultBindingMatch(binding: VaultBindingPolicy, input: RuntimeMatchInput) {\n if (!input.chainId || binding.chainId !== input.chainId) return false;\n if (!input.factoryAddress || !isSameAddress(binding.factoryAddress, input.factoryAddress)) 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 metadata = await readErc20TokenMetadata(publicClient, tokenAddress);\n const chainConfig = getTaxVaultHostChainConfig(chainId);\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 let tokenData: unknown;\n try {\n tokenData = await publicClient.readContract({\n address: chainConfig.portal,\n abi: portalAbi,\n functionName: \"getTokenV7\",\n args: [tokenAddress],\n });\n } catch {\n return {\n ...baseSnapshot,\n hasTaxVaults: Boolean(chainConfig.vaultPortal),\n hostReadSupported: true,\n hostReadFromChain: false,\n giftVaultFactory: chainConfig.giftVaultFactory,\n };\n }\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(input.factoryAddressHint, snapshot?.vaultInfo?.vaultFactory, snapshot?.taxInfo?.vaultInfo?.factory ?? undefined),\n vaultAddress: pickAddress(input.vaultAddressHint, snapshot?.vaultInfo?.vault, snapshot?.taxInfo?.vaultInfo?.addr ?? undefined),\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 presentation = await input.presentationFetcher({\n chainId: input.chainId,\n tokenAddress: input.tokenAddress,\n factoryAddress: resolveAddresses(input, snapshot).factoryAddress,\n vaultAddress: resolveAddresses(input, snapshot).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 { 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 });\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 extra?: Record<string, unknown>;\n isAiPowered?: boolean;\n}\n\nexport interface RuntimeMatchInput {\n chainId?: number;\n factoryAddress?: 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 if (input.chainId && input.factoryAddress) {\n return resolveUnique(bindings.filter((binding) => binding.chainId === input.chainId && isSameAddress(binding.factoryAddress, input.factoryAddress)));\n }\n\n if (input.chainId) {\n return resolveUnique(bindings.filter((binding) => binding.chainId === input.chainId));\n }\n\n if (input.factoryAddress) {\n return resolveUnique(bindings.filter((binding) => isSameAddress(binding.factoryAddress, input.factoryAddress)));\n }\n\n return null;\n}\n\nexport function isManifestRuntimeMatch(manifest: Pick<VaultManifest, \"match\">, input: RuntimeMatchInput) {\n if (!input.chainId || !input.factoryAddress) return false;\n const matchingBinding = resolveManifestBinding(manifest, input);\n if (!matchingBinding) return false;\n return matchingBinding.chainId === input.chainId && isSameAddress(matchingBinding.factoryAddress, input.factoryAddress);\n}\n\nexport function isVaultBindingMatch(binding: VaultBindingPolicy, input: RuntimeMatchInput) {\n if (!input.chainId || binding.chainId !== input.chainId) return false;\n if (!input.factoryAddress || !isSameAddress(binding.factoryAddress, input.factoryAddress)) 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 });\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,4 +1,4 @@
1
- import { a as Address } from './types-CX7pLmiT.mjs';
1
+ import { a as Address } from './types-Di-5da9N.mjs';
2
2
 
3
3
  interface TaxVaultHostChainConfig {
4
4
  portal: Address;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@flapsdk/vault-runtime",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "description": "Shared runtime surface for Flap Vault UI hosts, Workbench preview, and custom Vault components.",
5
5
  "type": "module",
6
6
  "sideEffects": false,
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "runtimeContractVersion": 1,
3
3
  "packageName": "@flapsdk/vault-runtime",
4
- "packageVersion": "0.1.0",
4
+ "packageVersion": "0.1.1",
5
5
  "stableAuthoringAliases": [
6
6
  "@/src/sdk",
7
7
  "@/src/ui"