@flapsdk/vault-runtime 0.1.4 → 0.1.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/host.d.mts CHANGED
@@ -1,9 +1,9 @@
1
- import { a as Address, B as TokenRuntimeSnapshot, z as TokenMetadataSnapshot, n as HostRuntimeInput, H as HostRuntimeAddresses, r as HostRuntimeResult, c as CreateVaultRuntimeContextInput, K as VaultRuntimeContext } from './types-DzTX2u7q.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-DzTX2u7q.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-BmDt5Z4B.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-COZWeTke.mjs';
2
+ export { A as ActionAvailabilityStage, C as ContractReadRequest, b as ContractWriteRequest, E as EndpointPolicy, F as FeeMode, d as FlapFeeVaultInfo, e as FlapI18n, f as FlapNotify, g as FlapTaxInfo, h as FlapTokenInfo, i as FlapVaultPortalInfo, j as FlapVaultSdk, k as FlapWallet, l as HostRuntimeDataSource, m as HostRuntimeDegradeReason, o as HostRuntimePolicy, p as HostRuntimePresentationFetcher, q as HostRuntimePresentationRequest, s as HostRuntimeSources, t as HostRuntimeStatus, u as HostRuntimeWarning, v as HostTokenPresentation, M as ManifestBindingEntry, w as ManifestExternalContract, O as OracleProvision, x as OracleReadRequest, y as OracleReader, P as PaymentToken, R as RuntimeOracleRegistry, S as SimulateResult, T as TokenMarketPhase, D as TxReceipt, V as VaultComponentProps, G as VaultHostContext, I as VaultManifest, J as VaultRenderSurface, L as VaultRuntimeContextOverrides, N as VaultRuntimeExtraConfig } from './types-COZWeTke.mjs';
3
+ export { C as CreateTaxInfoHostContextInput, O as OracleReadError, R as ResolveRenderSurfaceInput, a as RuntimeMatchInput, T as TaxVaultHostSnapshot, b as TxErrorKind, V as VaultBindingPolicy, Z as ZERO_ADDRESS, c as buildLocalOracleUrl, d as createLocalOracleReader, e as createTaxInfoHostContext, f as fetchOracleJson, g as fetchProvisionedOracle, h as formatCountdown, i as formatPercentBps, j as formatTokenAmount, k as getTupleField, l as getTxErrorKind, m as handleTxError, n as isActionAvailableForPhase, o as isCustomVaultTaxToken, p as isManifestRuntimeMatch, q as isSameAddress, r as isValidAddress, s as isVaultBindingMatch, t as normalizeAddress, u as parseFeeVaultInfo, v as parsePortalTokenInfo, w as parseTaxTokenInfo, x as parseTokenAmount, y as parseVaultPortalInfo, z as readTaxVaultHostContext, A as resolveFeeMode, B as resolveManifestBinding, D as resolveTaxInfoRenderSurface, E as resolveTokenMarketPhase, F as resolveVaultBinding, G as shortenAddress, H as standardErc20Abi } from './txError-Dd0Oug-u.mjs';
4
4
  import { PublicClient } from 'viem';
5
5
  export { erc20Abi } from 'viem';
6
- export { T as TaxVaultHostChainConfig, g as getTaxVaultHostChainConfig } from './hostRuntimeConfig-8d2c6qsO.mjs';
6
+ export { T as TaxVaultHostChainConfig, g as getTaxVaultHostChainConfig } from './hostRuntimeConfig-QdcwQfpd.mjs';
7
7
 
8
8
  declare function readErc20TokenMetadata(publicClient: PublicClient, tokenAddress?: Address | null): Promise<TokenMetadataSnapshot | null>;
9
9
  declare function loadTokenRuntimeSnapshot(publicClient: PublicClient, chainId: number, tokenAddress?: Address | null): Promise<TokenRuntimeSnapshot | null>;
package/host.js CHANGED
@@ -186,11 +186,13 @@ function resolveManifestBinding(manifest, input) {
186
186
  const matchesChain = (binding) => !input.chainId || binding.chainId === input.chainId;
187
187
  const matchesToken = (binding) => !input.tokenAddress || !binding.tokenAddresses?.length || binding.tokenAddresses.some((address) => isSameAddress(address, input.tokenAddress));
188
188
  const isVaultScopedBinding = (binding) => !binding.factoryAddress && Boolean(binding.vaultAddresses?.length);
189
+ const isTokenScopedBinding = (binding) => !binding.factoryAddress && !binding.vaultAddresses?.length && Boolean(binding.tokenAddresses?.length);
189
190
  if (input.factoryAddress) {
190
191
  const factoryMatch = resolveUnique(
191
192
  bindings.filter((binding) => matchesChain(binding) && Boolean(binding.factoryAddress) && isSameAddress(binding.factoryAddress, input.factoryAddress) && matchesToken(binding))
192
193
  );
193
- if (factoryMatch || !input.vaultAddress) return factoryMatch;
194
+ if (factoryMatch) return factoryMatch;
195
+ if (!input.vaultAddress && !input.tokenAddress) return null;
194
196
  }
195
197
  if (input.vaultAddress) {
196
198
  const vaultMatch = resolveUnique(
@@ -200,36 +202,55 @@ function resolveManifestBinding(manifest, input) {
200
202
  );
201
203
  if (vaultMatch) return vaultMatch;
202
204
  }
205
+ if (input.tokenAddress) {
206
+ const tokenMatch = resolveUnique(
207
+ bindings.filter(
208
+ (binding) => matchesChain(binding) && isTokenScopedBinding(binding) && Boolean(binding.tokenAddresses?.some((address) => isSameAddress(address, input.tokenAddress)))
209
+ )
210
+ );
211
+ if (tokenMatch) return tokenMatch;
212
+ }
203
213
  if (input.factoryAddress || input.vaultAddress) {
204
214
  return null;
205
215
  }
206
- if (input.chainId) {
207
- return resolveUnique(bindings.filter((binding) => binding.chainId === input.chainId && matchesToken(binding)));
216
+ if (input.chainId && input.tokenAddress) {
217
+ const tokenScopedMatch = resolveUnique(bindings.filter((binding) => binding.chainId === input.chainId && binding.tokenAddresses?.some((address) => isSameAddress(address, input.tokenAddress))));
218
+ if (tokenScopedMatch) return tokenScopedMatch;
208
219
  }
209
220
  if (input.tokenAddress) {
210
221
  return resolveUnique(bindings.filter((binding) => binding.tokenAddresses?.some((address) => isSameAddress(address, input.tokenAddress))));
211
222
  }
223
+ if (input.chainId) {
224
+ return resolveUnique(bindings.filter((binding) => binding.chainId === input.chainId && matchesToken(binding)));
225
+ }
212
226
  return null;
213
227
  }
214
228
  function isManifestRuntimeMatch(manifest, input) {
215
- if (!input.chainId || !input.factoryAddress && !input.vaultAddress) return false;
229
+ if (!input.chainId || !input.factoryAddress && !input.vaultAddress && !input.tokenAddress) return false;
216
230
  const matchingBinding = resolveManifestBinding(manifest, input);
217
231
  if (!matchingBinding) return false;
218
232
  if (matchingBinding.chainId !== input.chainId) return false;
219
233
  if (matchingBinding.factoryAddress) return isSameAddress(matchingBinding.factoryAddress, input.factoryAddress);
220
234
  const vaultAddress = matchingBinding.vaultAddresses?.[0];
221
- if (!vaultAddress || !isSameAddress(vaultAddress, input.vaultAddress)) return false;
235
+ if (vaultAddress && !isSameAddress(vaultAddress, input.vaultAddress)) return false;
222
236
  if (input.tokenAddress && matchingBinding.tokenAddresses?.length) {
223
237
  return matchingBinding.tokenAddresses.some((address) => isSameAddress(address, input.tokenAddress));
224
238
  }
239
+ if (!vaultAddress && matchingBinding.tokenAddresses?.length) return false;
225
240
  return true;
226
241
  }
227
242
  function isVaultBindingMatch(binding, input) {
228
243
  if (!input.chainId || binding.chainId !== input.chainId) return false;
229
244
  if (binding.factoryAddress) return Boolean(input.factoryAddress && isSameAddress(binding.factoryAddress, input.factoryAddress));
230
245
  const vaultAddress = binding.vaultAddresses?.[0];
231
- if (!vaultAddress || !input.vaultAddress || !isSameAddress(vaultAddress, input.vaultAddress)) return false;
232
- return true;
246
+ if (vaultAddress) {
247
+ if (!input.vaultAddress || !isSameAddress(vaultAddress, input.vaultAddress)) return false;
248
+ if (input.tokenAddress && binding.tokenAddresses?.length) {
249
+ return binding.tokenAddresses.some((address) => isSameAddress(address, input.tokenAddress));
250
+ }
251
+ return true;
252
+ }
253
+ return Boolean(input.tokenAddress && binding.tokenAddresses?.some((address) => isSameAddress(address, input.tokenAddress)));
233
254
  }
234
255
  function resolveVaultBinding(bindings, input) {
235
256
  return bindings.find((binding) => isVaultBindingMatch(binding, input)) ?? null;
package/host.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/sdk/erc20.ts","../../src/sdk/format.ts","../../src/sdk/hostRuntimeConfig.ts","../../src/sdk/taxInfo.ts","../../src/sdk/hostRead.ts","../../src/sdk/hostRuntime.ts","../../src/sdk/oracle.ts","../../src/sdk/runtimeContext.ts","../../src/sdk/txError.ts"],"names":["host"],"mappings":"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","file":"host.js","sourcesContent":["import { erc20Abi } from \"viem\";\n\nexport { erc20Abi };\nexport const standardErc20Abi = erc20Abi;\n","import Decimal from \"decimal.js\";\nimport { formatUnits, parseUnits } from \"viem\";\n\nexport function shortenAddress(raw?: string, start = 6, end = 4) {\n if (!raw) return \"\";\n if (raw.length <= start + end) return raw;\n return `${raw.slice(0, start)}...${raw.slice(-end)}`;\n}\n\nexport function formatTokenAmount(value?: bigint | string | number | null, decimals = 18, precision = 4) {\n if (value === undefined || value === null) return \"-\";\n const raw = typeof value === \"bigint\" ? formatUnits(value, decimals) : String(value);\n return new Decimal(raw).toDecimalPlaces(precision, Decimal.ROUND_DOWN).toString();\n}\n\nexport function parseTokenAmount(value: string, decimals = 18) {\n if (!/^\\d*(\\.\\d*)?$/.test(value.trim())) {\n throw new Error(\"Invalid decimal amount.\");\n }\n return parseUnits(value || \"0\", decimals);\n}\n\nexport function formatPercentBps(value?: bigint | number | null, precision = 2) {\n if (value === undefined || value === null) return \"-\";\n return `${new Decimal(String(value)).div(100).toDecimalPlaces(precision).toString()}%`;\n}\n\nexport function formatCountdown(targetTimeMs?: number) {\n if (!targetTimeMs) return \"-\";\n const diff = Math.max(0, targetTimeMs - Date.now());\n const totalSeconds = Math.floor(diff / 1000);\n const days = Math.floor(totalSeconds / 86400);\n const hours = Math.floor((totalSeconds % 86400) / 3600);\n const minutes = Math.floor((totalSeconds % 3600) / 60);\n const seconds = totalSeconds % 60;\n if (days > 0) return `${days}d ${hours}h ${minutes}m`;\n if (hours > 0) return `${hours}h ${minutes}m ${seconds}s`;\n return `${minutes}m ${seconds}s`;\n}\n","import type { Address } from \"./types\";\n\nexport interface TaxVaultHostChainConfig {\n portal: Address;\n taxTokenHelperAddress?: Address;\n vaultPortal?: Address;\n wrappedNativeTokenAddress?: Address;\n giftVaultFactory?: Address;\n hostChainSlug?: string;\n ipfsGateway?: string;\n}\n\nconst taxVaultHostChains: Record<number, TaxVaultHostChainConfig> = {\n 56: {\n portal: \"0xe2ce6ab80874fa9fa2aae65d277dd6b8e65c9de0\",\n taxTokenHelperAddress: \"0x53841c73217735F37BC1775538b03b23feFD8346\",\n vaultPortal: \"0x90497450f2a706f1951b5bdda52B4E5d16f34C06\",\n wrappedNativeTokenAddress: \"0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c\",\n giftVaultFactory: \"0x025549F52B03cF36f9e1a337c02d3AA7Af66ab32\",\n hostChainSlug: \"bnb\",\n ipfsGateway: \"https://gateway.pinata.cloud\",\n },\n 97: {\n portal: \"0x5bEacaF7ABCbB3aB280e80D007FD31fcE26510e9\",\n taxTokenHelperAddress: \"0xD64441e5FcD02D342B8cf6eBA10Ef6E40d0dA90f\",\n vaultPortal: \"0x027e3704fC5C16522e9393d04C60A3ac5c0d775f\",\n wrappedNativeTokenAddress: \"0xae13d989daC2f0dEbFf460aC112a837C89BAa7cd\",\n giftVaultFactory: \"0xa02DA44D67DB6D692efa7f751b5952bd670d5326\",\n hostChainSlug: \"bnb-testnet\",\n ipfsGateway: \"https://gateway.pinata.cloud\",\n },\n};\n\nexport function getTaxVaultHostChainConfig(chainId: number) {\n return taxVaultHostChains[chainId];\n}\n","import type {\n ActionAvailabilityStage,\n Address,\n FeeMode,\n FlapFeeVaultInfo,\n FlapTaxInfo,\n FlapTokenInfo,\n FlapVaultPortalInfo,\n ManifestBindingEntry,\n TokenMarketPhase,\n VaultHostContext,\n VaultManifest,\n VaultRenderSurface,\n} from \"./types\";\n\nexport const ZERO_ADDRESS = \"0x0000000000000000000000000000000000000000\" as Address;\n\ntype TupleLike = (Record<string, unknown> & readonly unknown[]) | Record<string, unknown> | readonly unknown[] | null | undefined;\n\nexport interface VaultBindingPolicy {\n name: string;\n chainId: number;\n factoryAddress?: Address;\n vaultAddresses?: Address[];\n extra?: Record<string, unknown>;\n isAiPowered?: boolean;\n}\n\nexport interface RuntimeMatchInput {\n chainId?: number;\n factoryAddress?: string | null;\n vaultAddress?: string | null;\n tokenAddress?: string | null;\n}\n\nexport interface CreateTaxInfoHostContextInput {\n tokenInfo?: FlapTokenInfo | null;\n taxInfo?: FlapTaxInfo | null;\n vaultInfo?: FlapVaultPortalInfo | null;\n feeMode?: FeeMode | null;\n giftVaultFactory?: string | null;\n hasTaxVaults?: boolean;\n vaultType?: string;\n copyScope?: \"tax\" | \"fee\";\n}\n\nexport interface ResolveRenderSurfaceInput {\n tokenInfo?: FlapTokenInfo | null;\n taxInfo?: FlapTaxInfo | null;\n hasTaxVaults?: boolean;\n isNonTaxFeeToken?: boolean;\n}\n\nexport interface TaxVaultHostSnapshot {\n tokenInfo?: FlapTokenInfo;\n taxInfo?: FlapTaxInfo | null;\n vaultInfo?: FlapVaultPortalInfo | null;\n feeMode: FeeMode;\n renderSurface: VaultRenderSurface;\n vaultType?: string;\n copyScope: \"tax\" | \"fee\";\n marketPhase: TokenMarketPhase;\n isListed: boolean;\n isTaxToken: boolean;\n isSupportedCustomVaultToken: boolean;\n}\n\nexport function getTupleField(data: TupleLike, name: string, index: number) {\n if (!data) return undefined;\n const record = data as Record<string, unknown>;\n const tuple = data as readonly unknown[];\n return record[name] ?? tuple[index];\n}\n\nexport function isValidAddress(value?: string | null): value is Address {\n return Boolean(value && /^0x[a-fA-F0-9]{40}$/.test(value));\n}\n\nexport function normalizeAddress(value?: string | null): Address | undefined {\n return isValidAddress(value) ? (value as Address) : undefined;\n}\n\nexport function isSameAddress(a?: string | null, b?: string | null) {\n return Boolean(a && b && a.toLowerCase() === b.toLowerCase());\n}\n\nfunction toNumber(value: unknown, fallback = 0) {\n if (typeof value === \"bigint\") return Number(value);\n if (typeof value === \"number\") return Number.isFinite(value) ? value : fallback;\n if (typeof value === \"string\" && value.trim()) {\n const parsed = Number(value);\n return Number.isFinite(parsed) ? parsed : fallback;\n }\n return fallback;\n}\n\nfunction toBigInt(value: unknown, fallback = 0n) {\n if (typeof value === \"bigint\") return value;\n if (typeof value === \"number\" && Number.isFinite(value)) return BigInt(Math.trunc(value));\n if (typeof value === \"string\" && value.trim()) {\n try {\n return BigInt(value);\n } catch {\n return fallback;\n }\n }\n return fallback;\n}\n\nfunction toBooleanOrNull(value: unknown) {\n if (typeof value === \"boolean\") return value;\n if (value === null || value === undefined) return null;\n return Boolean(value);\n}\n\nfunction toAddressOrNull(value: unknown): Address | null {\n return typeof value === \"string\" && isValidAddress(value) ? (value as Address) : null;\n}\n\nfunction toStringOrUndefined(value: unknown) {\n return typeof value === \"string\" && value.length > 0 ? value : undefined;\n}\n\nexport function parsePortalTokenInfo(tokenData: TupleLike): FlapTokenInfo | null {\n if (!tokenData) return null;\n\n const status = toNumber(getTupleField(tokenData, \"status\", 0));\n const taxRateRaw = toBigInt(getTupleField(tokenData, \"taxRate\", 12));\n const quoteTokenAddress = toAddressOrNull(getTupleField(tokenData, \"quoteTokenAddress\", 9)) ?? ZERO_ADDRESS;\n\n return {\n exists: status !== 0,\n isTaxToken: taxRateRaw > 0n,\n taxRate: Number(taxRateRaw),\n taxRateRaw,\n quoteTokenAddress,\n status,\n tokenVersion: toNumber(getTupleField(tokenData, \"tokenVersion\", 4)),\n };\n}\n\nexport function parseFeeVaultInfo(vaultInfo: TupleLike): FlapFeeVaultInfo | null {\n if (!vaultInfo) return null;\n\n return {\n addr: toAddressOrNull(getTupleField(vaultInfo, \"addr\", 0)),\n factory: toAddressOrNull(getTupleField(vaultInfo, \"factory\", 1)),\n riskLevel: toNumber(getTupleField(vaultInfo, \"riskLevel\", 2)),\n isOfficialVault: toBooleanOrNull(getTupleField(vaultInfo, \"isOfficialVault\", 3)),\n isVault: toBooleanOrNull(getTupleField(vaultInfo, \"isVault\", 4)),\n isAIConsumer: toBooleanOrNull(getTupleField(vaultInfo, \"isAIConsumer\", 5)),\n };\n}\n\nexport function parseTaxTokenInfo(\n taxInfo: TupleLike,\n taxInfoV2?: TupleLike,\n options: { wrappedNativeTokenAddress?: Address } = {},\n): FlapTaxInfo | null {\n if (!taxInfo) return null;\n\n const quoteToken = toAddressOrNull(getTupleField(taxInfo, \"quoteToken\", 11)) ?? ZERO_ADDRESS;\n const rawDividendToken = toAddressOrNull(getTupleField(taxInfoV2, \"dividendToken\", 11)) ?? quoteToken;\n const dividendToken =\n quoteToken === ZERO_ADDRESS && rawDividendToken === ZERO_ADDRESS && options.wrappedNativeTokenAddress\n ? options.wrappedNativeTokenAddress\n : rawDividendToken;\n\n return {\n marketBps: toNumber(getTupleField(taxInfo, \"marketBps\", 0)),\n deflationBps: toNumber(getTupleField(taxInfo, \"deflationBps\", 1)),\n lpBps: toNumber(getTupleField(taxInfo, \"lpBps\", 2)),\n dividendBps: toNumber(getTupleField(taxInfo, \"dividendBps\", 3)),\n feeRate: toNumber(getTupleField(taxInfo, \"feeRate\", 4)),\n buyTaxRate: taxInfoV2 ? toNumber(getTupleField(taxInfoV2, \"buyTaxRate\", 4)) : undefined,\n sellTaxRate: taxInfoV2 ? toNumber(getTupleField(taxInfoV2, \"sellTaxRate\", 5)) : undefined,\n burntTokenAmount: toBigInt(getTupleField(taxInfo, \"burntTokenAmount\", 5)),\n totalQuoteSentToDividend: toBigInt(getTupleField(taxInfo, \"totalQuoteSentToDividend\", 6)),\n totalQuoteAddedToLiquidity: toBigInt(getTupleField(taxInfo, \"totalQuoteAddedToLiquidity\", 7)),\n totalTokenAddedToLiquidity: toBigInt(getTupleField(taxInfo, \"totalTokenAddedToLiquidity\", 8)),\n totalQuoteSentToMarketing: toBigInt(getTupleField(taxInfo, \"totalQuoteSentToMarketing\", 9)),\n marketingWallet: toAddressOrNull(getTupleField(taxInfo, \"marketingWallet\", 10)) ?? ZERO_ADDRESS,\n dividendToken,\n quoteToken,\n minimumShareBalance: toBigInt(getTupleField(taxInfo, \"minimumShareBalance\", 12)),\n vaultInfo: parseFeeVaultInfo(getTupleField(taxInfoV2, \"vaultInfo\", 14) as TupleLike),\n };\n}\n\nexport function parseVaultPortalInfo(vaultData: TupleLike): FlapVaultPortalInfo | null {\n if (!vaultData) return null;\n\n const found = Boolean(getTupleField(vaultData, \"found\", 0));\n const info = getTupleField(vaultData, \"info\", 1) as TupleLike;\n\n if (!found || !info) return { found: false };\n\n return {\n found: true,\n vault: toAddressOrNull(getTupleField(info, \"vault\", 0)) ?? ZERO_ADDRESS,\n vaultFactory: toAddressOrNull(getTupleField(info, \"vaultFactory\", 1)) ?? ZERO_ADDRESS,\n description: toStringOrUndefined(getTupleField(info, \"description\", 2)),\n isOfficial: Boolean(getTupleField(info, \"isOfficial\", 3)),\n riskLevel: toNumber(getTupleField(info, \"riskLevel\", 4)),\n };\n}\n\nexport function resolveManifestBinding(manifest: Pick<VaultManifest, \"match\">, input: RuntimeMatchInput): ManifestBindingEntry | null {\n const bindings = manifest.match.bindings;\n if (!bindings.length) return null;\n\n const resolveUnique = (candidates: ManifestBindingEntry[]) => {\n if (candidates.length === 1) return candidates[0];\n return null;\n };\n\n const matchesChain = (binding: ManifestBindingEntry) => !input.chainId || binding.chainId === input.chainId;\n const matchesToken = (binding: ManifestBindingEntry) =>\n !input.tokenAddress || !binding.tokenAddresses?.length || binding.tokenAddresses.some((address) => isSameAddress(address, input.tokenAddress));\n const isVaultScopedBinding = (binding: ManifestBindingEntry) => !binding.factoryAddress && Boolean(binding.vaultAddresses?.length);\n\n if (input.factoryAddress) {\n const factoryMatch = resolveUnique(\n bindings.filter((binding) => matchesChain(binding) && Boolean(binding.factoryAddress) && isSameAddress(binding.factoryAddress, input.factoryAddress) && matchesToken(binding)),\n );\n if (factoryMatch || !input.vaultAddress) return factoryMatch;\n }\n\n if (input.vaultAddress) {\n const vaultMatch = resolveUnique(\n bindings.filter(\n (binding) =>\n matchesChain(binding) &&\n isVaultScopedBinding(binding) &&\n Boolean(binding.vaultAddresses?.some((address) => isSameAddress(address, input.vaultAddress))) &&\n matchesToken(binding),\n ),\n );\n if (vaultMatch) return vaultMatch;\n }\n\n if (input.factoryAddress || input.vaultAddress) {\n return null;\n }\n\n if (input.chainId) {\n return resolveUnique(bindings.filter((binding) => binding.chainId === input.chainId && matchesToken(binding)));\n }\n\n if (input.tokenAddress) {\n return resolveUnique(bindings.filter((binding) => binding.tokenAddresses?.some((address) => isSameAddress(address, input.tokenAddress))));\n }\n\n return null;\n}\n\nexport function isManifestRuntimeMatch(manifest: Pick<VaultManifest, \"match\">, input: RuntimeMatchInput) {\n if (!input.chainId || (!input.factoryAddress && !input.vaultAddress)) return false;\n const matchingBinding = resolveManifestBinding(manifest, input);\n if (!matchingBinding) return false;\n if (matchingBinding.chainId !== input.chainId) return false;\n if (matchingBinding.factoryAddress) return isSameAddress(matchingBinding.factoryAddress, input.factoryAddress);\n const vaultAddress = matchingBinding.vaultAddresses?.[0];\n if (!vaultAddress || !isSameAddress(vaultAddress, input.vaultAddress)) return false;\n if (input.tokenAddress && matchingBinding.tokenAddresses?.length) {\n return matchingBinding.tokenAddresses.some((address) => isSameAddress(address, input.tokenAddress));\n }\n return true;\n}\n\nexport function isVaultBindingMatch(binding: VaultBindingPolicy, input: RuntimeMatchInput) {\n if (!input.chainId || binding.chainId !== input.chainId) return false;\n if (binding.factoryAddress) return Boolean(input.factoryAddress && isSameAddress(binding.factoryAddress, input.factoryAddress));\n const vaultAddress = binding.vaultAddresses?.[0];\n if (!vaultAddress || !input.vaultAddress || !isSameAddress(vaultAddress, input.vaultAddress)) return false;\n return true;\n}\n\nexport function resolveVaultBinding(bindings: VaultBindingPolicy[], input: RuntimeMatchInput) {\n return bindings.find((binding) => isVaultBindingMatch(binding, input)) ?? null;\n}\n\nexport function resolveFeeMode(taxInfo: FlapTaxInfo | TupleLike | null | undefined, giftVaultFactory?: string | null): FeeMode {\n if (!taxInfo) return \"unknown\";\n\n const marketBps = toNumber(getTupleField(taxInfo as TupleLike, \"marketBps\", 0));\n const dividendBps = toNumber(getTupleField(taxInfo as TupleLike, \"dividendBps\", 3));\n\n if (dividendBps > 0) return \"holder\";\n if (marketBps <= 0) return \"unknown\";\n\n const parsedVaultInfo =\n \"vaultInfo\" in Object(taxInfo)\n ? (taxInfo as FlapTaxInfo).vaultInfo\n : parseFeeVaultInfo(getTupleField(taxInfo as TupleLike, \"vaultInfo\", 14) as TupleLike);\n\n if (parsedVaultInfo?.isVault === true) {\n return isSameAddress(parsedVaultInfo.factory, giftVaultFactory) ? \"gift\" : \"unknown\";\n }\n\n return \"creator\";\n}\n\nexport function resolveTaxInfoRenderSurface({\n tokenInfo,\n taxInfo,\n hasTaxVaults = false,\n isNonTaxFeeToken = false,\n}: ResolveRenderSurfaceInput): VaultRenderSurface {\n if (!tokenInfo?.exists) return \"unavailable\";\n if (!tokenInfo.isTaxToken) return isNonTaxFeeToken ? \"feeinfo\" : \"unavailable\";\n if (taxInfo?.marketBps === 10000 && hasTaxVaults) return \"vault-taxinfo\";\n return \"standard-taxinfo\";\n}\n\nexport function resolveTokenMarketPhase(tokenInfo?: FlapTokenInfo | null): TokenMarketPhase {\n if (!tokenInfo?.exists) return \"unknown\";\n return tokenInfo.status >= 2 ? \"dex-listed\" : \"internal-market\";\n}\n\nexport function isCustomVaultTaxToken(tokenInfo?: FlapTokenInfo | null) {\n return Boolean(tokenInfo?.exists && tokenInfo.isTaxToken);\n}\n\nexport function isActionAvailableForPhase(stage: ActionAvailabilityStage, marketPhase: TokenMarketPhase = \"unknown\") {\n if (stage === \"read-only\") return false;\n if (stage === \"both\") return true;\n if (marketPhase === \"unknown\") return false;\n return stage === marketPhase;\n}\n\nexport function createTaxInfoHostContext({\n tokenInfo,\n taxInfo,\n vaultInfo,\n feeMode,\n giftVaultFactory,\n hasTaxVaults,\n vaultType,\n copyScope = \"tax\",\n}: CreateTaxInfoHostContextInput): VaultHostContext {\n const resolvedFeeMode = feeMode ?? resolveFeeMode(taxInfo, giftVaultFactory);\n const renderSurface = resolveTaxInfoRenderSurface({\n tokenInfo,\n taxInfo,\n hasTaxVaults: hasTaxVaults ?? Boolean(vaultInfo?.found),\n isNonTaxFeeToken: copyScope === \"fee\",\n });\n const marketPhase = resolveTokenMarketPhase(tokenInfo);\n\n return {\n tokenInfo: tokenInfo ?? undefined,\n taxInfo: taxInfo ?? null,\n vaultInfo: vaultInfo ?? null,\n feeMode: resolvedFeeMode,\n renderSurface,\n vaultType,\n copyScope,\n isListed: tokenInfo ? tokenInfo.status >= 2 : undefined,\n marketPhase,\n };\n}\n\nexport function readTaxVaultHostContext(host?: VaultHostContext | null): TaxVaultHostSnapshot {\n const tokenInfo = host?.tokenInfo;\n const marketPhase = host?.marketPhase ?? resolveTokenMarketPhase(tokenInfo);\n const isListed = host?.isListed ?? Boolean(tokenInfo && tokenInfo.status >= 2);\n const isTaxToken = tokenInfo?.isTaxToken === true;\n\n return {\n tokenInfo,\n taxInfo: host?.taxInfo ?? null,\n vaultInfo: host?.vaultInfo ?? null,\n feeMode: host?.feeMode ?? \"unknown\",\n renderSurface: host?.renderSurface ?? \"unavailable\",\n vaultType: host?.vaultType,\n copyScope: host?.copyScope ?? \"tax\",\n marketPhase,\n isListed,\n isTaxToken,\n isSupportedCustomVaultToken: isCustomVaultTaxToken(tokenInfo),\n };\n}\n","import type { PublicClient } from \"viem\";\nimport { erc20Abi } from \"./erc20\";\nimport { getTaxVaultHostChainConfig } from \"./hostRuntimeConfig\";\nimport { createTaxInfoHostContext, isValidAddress, parsePortalTokenInfo, parseTaxTokenInfo, parseVaultPortalInfo, ZERO_ADDRESS } from \"./taxInfo\";\nimport type { Address, FlapTokenInfo, PaymentToken, TokenMetadataSnapshot, TokenRuntimeSnapshot } from \"./types\";\n\nconst portalAbi = [\n {\n name: \"getTokenV7\",\n type: \"function\",\n stateMutability: \"view\",\n inputs: [{ name: \"\", type: \"address\" }],\n outputs: [\n {\n type: \"tuple\",\n components: [\n { name: \"status\", type: \"uint8\" },\n { name: \"reserve\", type: \"uint256\" },\n { name: \"circulatingSupply\", type: \"uint256\" },\n { name: \"price\", type: \"uint256\" },\n { name: \"tokenVersion\", type: \"uint8\" },\n { name: \"r\", type: \"uint256\" },\n { name: \"h\", type: \"uint256\" },\n { name: \"k\", type: \"uint256\" },\n { name: \"dexSupplyThresh\", type: \"uint256\" },\n { name: \"quoteTokenAddress\", type: \"address\" },\n { name: \"nativeToQuoteSwapEnabled\", type: \"bool\" },\n { name: \"extensionID\", type: \"bytes32\" },\n { name: \"taxRate\", type: \"uint256\" },\n { name: \"pool\", type: \"address\" },\n { name: \"progress\", type: \"uint256\" },\n { name: \"lpFeeProfile\", type: \"uint8\" },\n { name: \"dexId\", type: \"uint8\" },\n ],\n },\n ],\n },\n] as const;\n\nconst taxTokenHelperAbi = [\n {\n name: \"getTaxTokenInfo\",\n type: \"function\",\n stateMutability: \"view\",\n inputs: [{ name: \"taxToken\", type: \"address\" }],\n outputs: [\n {\n type: \"tuple\",\n components: [\n { name: \"marketBps\", type: \"uint16\" },\n { name: \"deflationBps\", type: \"uint16\" },\n { name: \"lpBps\", type: \"uint16\" },\n { name: \"dividendBps\", type: \"uint16\" },\n { name: \"feeRate\", type: \"uint16\" },\n { name: \"burntTokenAmount\", type: \"uint256\" },\n { name: \"totalQuoteSentToDividend\", type: \"uint256\" },\n { name: \"totalQuoteAddedToLiquidity\", type: \"uint256\" },\n { name: \"totalTokenAddedToLiquidity\", type: \"uint256\" },\n { name: \"totalQuoteSentToMarketing\", type: \"uint256\" },\n { name: \"marketingWallet\", type: \"address\" },\n { name: \"quoteToken\", type: \"address\" },\n { name: \"minimumShareBalance\", type: \"uint256\" },\n ],\n },\n ],\n },\n {\n name: \"getTaxTokenInfoV2\",\n type: \"function\",\n stateMutability: \"view\",\n inputs: [{ name: \"taxToken\", type: \"address\" }],\n outputs: [\n {\n type: \"tuple\",\n components: [\n { name: \"marketBps\", type: \"uint16\" },\n { name: \"deflationBps\", type: \"uint16\" },\n { name: \"lpBps\", type: \"uint16\" },\n { name: \"dividendBps\", type: \"uint16\" },\n { name: \"buyTaxRate\", type: \"uint16\" },\n { name: \"sellTaxRate\", type: \"uint16\" },\n { name: \"burntTokenAmount\", type: \"uint256\" },\n { name: \"totalQuoteSentToDividend\", type: \"uint256\" },\n { name: \"totalQuoteAddedToLiquidity\", type: \"uint256\" },\n { name: \"totalTokenAddedToLiquidity\", type: \"uint256\" },\n { name: \"totalQuoteSentToMarketing\", type: \"uint256\" },\n { name: \"dividendToken\", type: \"address\" },\n { name: \"quoteToken\", type: \"address\" },\n { name: \"minimumShareBalance\", type: \"uint256\" },\n {\n name: \"vaultInfo\",\n type: \"tuple\",\n components: [\n { name: \"addr\", type: \"address\" },\n { name: \"factory\", type: \"address\" },\n { name: \"riskLevel\", type: \"uint8\" },\n { name: \"isOfficialVault\", type: \"bool\" },\n { name: \"isVault\", type: \"bool\" },\n { name: \"isAIConsumer\", type: \"bool\" },\n ],\n },\n ],\n },\n ],\n },\n] as const;\n\nconst vaultPortalAbi = [\n {\n name: \"tryGetVault\",\n type: \"function\",\n stateMutability: \"view\",\n inputs: [{ name: \"taxToken\", type: \"address\" }],\n outputs: [\n { name: \"found\", type: \"bool\" },\n {\n name: \"info\",\n type: \"tuple\",\n components: [\n { name: \"vault\", type: \"address\" },\n { name: \"vaultFactory\", type: \"address\" },\n { name: \"description\", type: \"string\" },\n { name: \"isOfficial\", type: \"bool\" },\n { name: \"riskLevel\", type: \"uint8\" },\n ],\n },\n ],\n },\n] as const;\n\nasync function readErc20Symbol(publicClient: PublicClient, address: Address) {\n try {\n const symbol = await publicClient.readContract({\n address,\n abi: erc20Abi,\n functionName: \"symbol\",\n });\n return typeof symbol === \"string\" && symbol.trim() ? symbol.trim() : undefined;\n } catch {\n return undefined;\n }\n}\n\nasync function readErc20Name(publicClient: PublicClient, address: Address) {\n try {\n const name = await publicClient.readContract({\n address,\n abi: erc20Abi,\n functionName: \"name\",\n });\n return typeof name === \"string\" && name.trim() ? name.trim() : undefined;\n } catch {\n return undefined;\n }\n}\n\nasync function readErc20Decimals(publicClient: PublicClient, address: Address) {\n try {\n const decimals = await publicClient.readContract({\n address,\n abi: erc20Abi,\n functionName: \"decimals\",\n });\n return typeof decimals === \"number\" ? decimals : 18;\n } catch {\n return 18;\n }\n}\n\nasync function resolvePaymentToken(publicClient: PublicClient, tokenInfo: FlapTokenInfo): Promise<PaymentToken | undefined> {\n const quoteTokenAddress = tokenInfo.quoteTokenAddress;\n if (!quoteTokenAddress) return undefined;\n\n if (quoteTokenAddress === ZERO_ADDRESS) {\n const nativeCurrency = publicClient.chain?.nativeCurrency;\n return {\n address: ZERO_ADDRESS,\n symbol: nativeCurrency?.symbol ?? \"NATIVE\",\n decimals: nativeCurrency?.decimals ?? 18,\n isNative: true,\n };\n }\n\n if (!isValidAddress(quoteTokenAddress)) return undefined;\n\n const [symbol, decimals] = await Promise.all([readErc20Symbol(publicClient, quoteTokenAddress), readErc20Decimals(publicClient, quoteTokenAddress)]);\n\n return {\n address: quoteTokenAddress,\n symbol: symbol ?? \"TOKEN\",\n decimals,\n isNative: false,\n };\n}\n\nexport async function readErc20TokenMetadata(publicClient: PublicClient, tokenAddress?: Address | null): Promise<TokenMetadataSnapshot | null> {\n if (!tokenAddress || !isValidAddress(tokenAddress) || tokenAddress === ZERO_ADDRESS) return null;\n\n const [tokenSymbol, tokenName] = await Promise.all([readErc20Symbol(publicClient, tokenAddress), readErc20Name(publicClient, tokenAddress)]);\n if (!tokenSymbol && !tokenName) return null;\n\n return {\n tokenSymbol,\n tokenName,\n };\n}\n\nexport async function loadTokenRuntimeSnapshot(\n publicClient: PublicClient,\n chainId: number,\n tokenAddress?: Address | null,\n): Promise<TokenRuntimeSnapshot | null> {\n if (!tokenAddress || !isValidAddress(tokenAddress) || tokenAddress === ZERO_ADDRESS) return null;\n\n const chainConfig = getTaxVaultHostChainConfig(chainId);\n\n // Fire metadata fetch immediately; if chainConfig exists, fire portal read in parallel.\n const metadataPromise = readErc20TokenMetadata(publicClient, tokenAddress);\n const portalPromise = chainConfig\n ? publicClient\n .readContract({\n address: chainConfig.portal,\n abi: portalAbi,\n functionName: \"getTokenV7\",\n args: [tokenAddress],\n })\n .then((data) => ({ ok: true as const, data }))\n .catch(() => ({ ok: false as const }))\n : Promise.resolve(null);\n\n const [metadata, portalResult] = await Promise.all([metadataPromise, portalPromise]);\n\n const baseSnapshot = {\n tokenSymbol: metadata?.tokenSymbol,\n tokenName: metadata?.tokenName,\n copyScope: \"tax\" as const,\n };\n\n if (!chainConfig) {\n return {\n ...baseSnapshot,\n hasTaxVaults: false,\n hostReadSupported: false,\n hostReadFromChain: false,\n };\n }\n\n // portalResult is non-null here because chainConfig exists\n if (!portalResult || !portalResult.ok) {\n return {\n ...baseSnapshot,\n hasTaxVaults: Boolean(chainConfig.vaultPortal),\n hostReadSupported: true,\n hostReadFromChain: false,\n giftVaultFactory: chainConfig.giftVaultFactory,\n };\n }\n\n const tokenData = portalResult.data;\n\n const tokenInfo = parsePortalTokenInfo(tokenData as Record<string, unknown>);\n const hasTaxVaults = Boolean(chainConfig.vaultPortal);\n if (!tokenInfo) {\n return {\n ...baseSnapshot,\n hasTaxVaults,\n hostReadSupported: true,\n hostReadFromChain: false,\n giftVaultFactory: chainConfig.giftVaultFactory,\n };\n }\n\n const paymentToken = tokenInfo.exists ? await resolvePaymentToken(publicClient, tokenInfo) : undefined;\n if (!tokenInfo.exists) {\n const host = createTaxInfoHostContext({\n tokenInfo,\n giftVaultFactory: chainConfig.giftVaultFactory,\n hasTaxVaults,\n copyScope: \"tax\",\n });\n return {\n ...baseSnapshot,\n tokenInfo,\n host,\n giftVaultFactory: chainConfig.giftVaultFactory,\n paymentToken,\n hasTaxVaults,\n hostReadSupported: true,\n hostReadFromChain: true,\n };\n }\n\n const taxInfoPromise =\n tokenInfo.isTaxToken && chainConfig.taxTokenHelperAddress\n ? Promise.allSettled([\n publicClient.readContract({\n address: chainConfig.taxTokenHelperAddress,\n abi: taxTokenHelperAbi,\n functionName: \"getTaxTokenInfo\",\n args: [tokenAddress],\n }),\n publicClient.readContract({\n address: chainConfig.taxTokenHelperAddress,\n abi: taxTokenHelperAbi,\n functionName: \"getTaxTokenInfoV2\",\n args: [tokenAddress],\n }),\n ])\n : Promise.resolve(null);\n\n const vaultInfoPromise = chainConfig.vaultPortal\n ? publicClient\n .readContract({\n address: chainConfig.vaultPortal,\n abi: vaultPortalAbi,\n functionName: \"tryGetVault\",\n args: [tokenAddress],\n })\n .catch(() => undefined)\n : Promise.resolve(undefined);\n\n const [taxResults, vaultData] = await Promise.all([taxInfoPromise, vaultInfoPromise]);\n const baseTaxInfo = Array.isArray(taxResults) && taxResults[0]?.status === \"fulfilled\" ? taxResults[0].value : undefined;\n const taxInfoV2 = Array.isArray(taxResults) && taxResults[1]?.status === \"fulfilled\" ? taxResults[1].value : undefined;\n const taxInfo = baseTaxInfo\n ? parseTaxTokenInfo(baseTaxInfo, taxInfoV2, { wrappedNativeTokenAddress: chainConfig.wrappedNativeTokenAddress })\n : undefined;\n const vaultInfo = vaultData ? parseVaultPortalInfo(vaultData) : undefined;\n const host = createTaxInfoHostContext({\n tokenInfo,\n taxInfo,\n vaultInfo,\n giftVaultFactory: chainConfig.giftVaultFactory,\n hasTaxVaults,\n copyScope: \"tax\",\n });\n\n return {\n ...baseSnapshot,\n tokenInfo,\n taxInfo,\n vaultInfo,\n host,\n giftVaultFactory: chainConfig.giftVaultFactory,\n paymentToken,\n hasTaxVaults,\n hostReadSupported: true,\n hostReadFromChain: true,\n };\n}\n","import { loadTokenRuntimeSnapshot } from \"./hostRead\";\nimport { isValidAddress, readTaxVaultHostContext, ZERO_ADDRESS } from \"./taxInfo\";\nimport type {\n Address,\n HostRuntimeAddresses,\n HostRuntimeDataSource,\n HostRuntimeDegradeReason,\n HostRuntimeInput,\n HostRuntimeResult,\n HostRuntimeSources,\n HostRuntimeStatus,\n HostRuntimeWarning,\n TokenRuntimeSnapshot,\n} from \"./types\";\n\nfunction isResolvedAddress(address?: Address | null): address is Address {\n return Boolean(address && isValidAddress(address) && address !== ZERO_ADDRESS);\n}\n\nfunction pickAddress(...candidates: Array<Address | null | undefined>) {\n for (const candidate of candidates) {\n if (isResolvedAddress(candidate)) return candidate;\n }\n return undefined;\n}\n\nfunction resolveAddresses(input: Pick<HostRuntimeInput, \"chainId\" | \"tokenAddress\" | \"factoryAddressHint\" | \"vaultAddressHint\">, snapshot?: TokenRuntimeSnapshot | null): HostRuntimeAddresses {\n return {\n chainId: input.chainId,\n tokenAddress: input.tokenAddress,\n factoryAddressHint: input.factoryAddressHint,\n vaultAddressHint: input.vaultAddressHint,\n factoryAddress: pickAddress(snapshot?.vaultInfo?.vaultFactory, snapshot?.taxInfo?.vaultInfo?.factory ?? undefined, input.factoryAddressHint),\n vaultAddress: pickAddress(snapshot?.vaultInfo?.vault, snapshot?.taxInfo?.vaultInfo?.addr ?? undefined, input.vaultAddressHint),\n };\n}\n\nfunction hasPresentationMetadata(result: HostRuntimeResult) {\n return Boolean(result.presentation?.tokenName || result.presentation?.tokenSymbol || result.presentation?.tokenImageUrl);\n}\n\nfunction resolveTokenMetadataSource(snapshot: TokenRuntimeSnapshot | null, presentationDataAvailable: boolean): HostRuntimeDataSource {\n if (presentationDataAvailable) return \"host-proxy\";\n if (snapshot?.tokenName || snapshot?.tokenSymbol) return \"onchain\";\n return \"unavailable\";\n}\n\nfunction resolveSources(snapshot: TokenRuntimeSnapshot | null, presentationDataAvailable: boolean): HostRuntimeSources {\n return {\n tokenMetadata: resolveTokenMetadataSource(snapshot, presentationDataAvailable),\n taxState: snapshot?.taxInfo ? \"onchain\" : \"unavailable\",\n vaultState: snapshot?.vaultInfo?.found || snapshot?.taxInfo?.vaultInfo?.isVault ? \"onchain\" : \"unavailable\",\n presentation: presentationDataAvailable ? \"host-proxy\" : \"unavailable\",\n };\n}\n\nfunction collectWarnings(snapshot: TokenRuntimeSnapshot | null, addresses: HostRuntimeAddresses): HostRuntimeWarning[] {\n const warnings: HostRuntimeWarning[] = [];\n\n if (!snapshot?.taxInfo) warnings.push(\"tax-info-unavailable\");\n if (snapshot?.tokenInfo?.quoteTokenAddress && !snapshot.paymentToken) warnings.push(\"payment-token-unavailable\");\n if (!addresses.vaultAddress) warnings.push(\"vault-address-unavailable\");\n if (!addresses.factoryAddress) warnings.push(\"factory-address-unavailable\");\n\n return warnings;\n}\n\nfunction resolveChainFailure(snapshot: TokenRuntimeSnapshot | null): HostRuntimeDegradeReason | null {\n if (!snapshot) return \"chain-read-unavailable\";\n if (!snapshot.hostReadSupported) return \"unsupported-chain\";\n if (!snapshot.hostReadFromChain || !snapshot.tokenInfo) return \"chain-read-unavailable\";\n if (!snapshot.tokenInfo.exists) return \"token-not-found\";\n if (!snapshot.tokenInfo.isTaxToken) return \"token-not-tax\";\n return null;\n}\n\nfunction createResult(params: {\n status: HostRuntimeStatus;\n input: Pick<HostRuntimeInput, \"chainId\" | \"tokenAddress\" | \"factoryAddressHint\" | \"vaultAddressHint\">;\n snapshot: TokenRuntimeSnapshot | null;\n degradeReason?: HostRuntimeDegradeReason;\n presentation?: HostRuntimeResult[\"presentation\"];\n policy: HostRuntimeResult[\"policy\"];\n}): HostRuntimeResult {\n const addresses = resolveAddresses(params.input, params.snapshot);\n const basePresentation = params.presentation ?? null;\n const baseResult: HostRuntimeResult = {\n status: params.status,\n policy: params.policy,\n degradeReason: params.degradeReason,\n warnings: collectWarnings(params.snapshot, addresses),\n addresses,\n snapshot: params.snapshot,\n host: params.snapshot?.host ?? undefined,\n paymentToken: params.snapshot?.paymentToken,\n tokenSymbol: basePresentation?.tokenSymbol ?? params.snapshot?.tokenSymbol,\n tokenName: basePresentation?.tokenName ?? params.snapshot?.tokenName,\n tokenImageUrl: basePresentation?.tokenImageUrl,\n tokenDetailHref: basePresentation?.tokenDetailHref,\n chainHref: basePresentation?.chainHref,\n presentation: basePresentation,\n sources: {\n tokenMetadata: \"unavailable\",\n taxState: \"unavailable\",\n vaultState: \"unavailable\",\n presentation: \"unavailable\",\n },\n };\n\n baseResult.sources = resolveSources(params.snapshot, hasPresentationMetadata(baseResult));\n return baseResult;\n}\n\nexport function resolveHostRuntimeAddresses(input: Pick<HostRuntimeInput, \"chainId\" | \"tokenAddress\" | \"factoryAddressHint\" | \"vaultAddressHint\">, snapshot?: TokenRuntimeSnapshot | null) {\n return resolveAddresses(input, snapshot);\n}\n\nexport async function runHostRuntime(input: HostRuntimeInput): Promise<HostRuntimeResult> {\n const policy = input.policy ?? \"prefer-full-host\";\n\n if (!isResolvedAddress(input.tokenAddress)) {\n return createResult({\n status: \"unavailable\",\n input,\n snapshot: null,\n degradeReason: \"invalid-token-address\",\n policy,\n });\n }\n\n const snapshot = await loadTokenRuntimeSnapshot(input.publicClient, input.chainId, input.tokenAddress);\n const chainFailure = resolveChainFailure(snapshot);\n if (chainFailure) {\n return createResult({\n status: \"unavailable\",\n input,\n snapshot,\n degradeReason: chainFailure,\n policy,\n });\n }\n\n let presentation: HostRuntimeResult[\"presentation\"] = null;\n let presentationFailure: HostRuntimeDegradeReason | undefined;\n\n if (input.presentationFetcher) {\n try {\n const resolvedAddrs = resolveAddresses(input, snapshot);\n presentation = await input.presentationFetcher({\n chainId: input.chainId,\n tokenAddress: input.tokenAddress,\n factoryAddress: resolvedAddrs.factoryAddress,\n vaultAddress: resolvedAddrs.vaultAddress,\n snapshot: snapshot!,\n });\n if (!presentation) {\n presentationFailure = \"host-presentation-unavailable\";\n }\n } catch {\n presentationFailure = \"host-presentation-unavailable\";\n }\n } else {\n presentationFailure = \"host-presentation-not-configured\";\n }\n\n if (presentation) {\n return createResult({\n status: \"full-host\",\n input,\n snapshot,\n presentation,\n policy,\n });\n }\n\n if (policy === \"require-full-host\") {\n return createResult({\n status: \"unavailable\",\n input,\n snapshot,\n degradeReason: presentationFailure === \"host-presentation-not-configured\" ? \"host-presentation-required\" : \"host-presentation-unavailable\",\n policy,\n });\n }\n\n const result = createResult({\n status: \"onchain\",\n input,\n snapshot,\n degradeReason: presentationFailure,\n policy,\n });\n\n const hostSnapshot = readTaxVaultHostContext(result.host);\n if (!hostSnapshot.isSupportedCustomVaultToken) {\n return {\n ...result,\n status: \"unavailable\",\n degradeReason: \"token-not-tax\",\n };\n }\n\n return result;\n}\n","import type { OracleProvision, OracleReadRequest, OracleReader } from \"./types\";\n\nconst DEFAULT_LOCAL_ORACLE_ENDPOINT_BASE = \"/api/runtime/oracle\";\n\nexport class OracleReadError extends Error {\n status?: number;\n\n constructor(message: string, status?: number) {\n super(message);\n this.name = \"OracleReadError\";\n this.status = status;\n }\n}\n\nfunction appendSearchParams(url: URL, params?: Record<string, string>) {\n for (const [key, value] of Object.entries(params ?? {})) {\n url.searchParams.set(key, value);\n }\n}\n\nfunction toOracleProvision(provision: string | OracleProvision): OracleProvision {\n return typeof provision === \"string\" ? { endpoint: provision } : provision;\n}\n\nexport function buildLocalOracleUrl(oracleId: string, params?: Record<string, string>, endpointBase = DEFAULT_LOCAL_ORACLE_ENDPOINT_BASE) {\n const normalizedBase = endpointBase.replace(/\\/+$/, \"\");\n const url = new URL(`${normalizedBase}/${encodeURIComponent(oracleId)}`, \"http://localhost\");\n appendSearchParams(url, params);\n return `${url.pathname}${url.search}`;\n}\n\nexport async function fetchOracleJson<T>({\n endpoint,\n params,\n fetchImpl,\n headers,\n}: {\n endpoint: string;\n params?: Record<string, string>;\n fetchImpl?: typeof fetch;\n headers?: HeadersInit;\n}): Promise<T> {\n const fallbackOrigin = typeof window !== \"undefined\" ? window.location.origin : \"http://localhost\";\n const url = new URL(endpoint, fallbackOrigin);\n appendSearchParams(url, params);\n\n const response = await (fetchImpl ?? fetch)(url.toString(), {\n cache: \"no-store\",\n headers,\n method: \"GET\",\n });\n\n if (!response.ok) {\n throw new OracleReadError(`Oracle request returned ${response.status}.`, response.status);\n }\n\n return (await response.json()) as T;\n}\n\nexport async function fetchProvisionedOracle<T>({\n provision,\n params,\n fetchImpl,\n}: {\n provision: string | OracleProvision;\n params?: Record<string, string>;\n fetchImpl?: typeof fetch;\n}): Promise<T> {\n const normalizedProvision = toOracleProvision(provision);\n const filteredParams =\n normalizedProvision.allowedParams && normalizedProvision.allowedParams.length\n ? Object.fromEntries(Object.entries(params ?? {}).filter(([key]) => normalizedProvision.allowedParams?.includes(key)))\n : params;\n\n return fetchOracleJson<T>({\n endpoint: normalizedProvision.endpoint,\n params: filteredParams,\n fetchImpl,\n headers: normalizedProvision.headers,\n });\n}\n\nexport function createLocalOracleReader(options: { endpointBase?: string; fetchImpl?: typeof fetch } = {}): OracleReader {\n const endpointBase = options.endpointBase ?? DEFAULT_LOCAL_ORACLE_ENDPOINT_BASE;\n const fetchImpl = options.fetchImpl;\n\n return async function readLocalOracle<T>({ oracleId, params }: OracleReadRequest): Promise<T> {\n return fetchOracleJson<T>({\n endpoint: buildLocalOracleUrl(oracleId, params, endpointBase),\n fetchImpl,\n });\n };\n}\n","import { resolveManifestBinding } from \"./taxInfo\";\nimport type { Address, CreateVaultRuntimeContextInput, VaultRuntimeContext, VaultRuntimeExtraConfig } from \"./types\";\n\nconst zeroAddress = \"0x0000000000000000000000000000000000000000\" as Address;\n\nexport function explorerForChain(chainId: number) {\n if (chainId === 56) return \"https://bscscan.com\";\n if (chainId === 97) return \"https://testnet.bscscan.com\";\n return undefined;\n}\n\nexport function chainLabelForChain(chainId: number) {\n if (chainId === 56) return \"BNB Chain\";\n if (chainId === 97) return \"BNB Testnet\";\n return `Chain ${chainId}`;\n}\n\nfunction buildRuntimeExtraConfig(input: CreateVaultRuntimeContextInput): VaultRuntimeExtraConfig {\n const hostRuntimeResult = input.hostRuntimeResult;\n const runtimeOverrides = input.runtimeOverrides;\n\n return {\n ...(hostRuntimeResult\n ? {\n hostRuntimeStatus: hostRuntimeResult.status,\n hostRuntimePolicy: hostRuntimeResult.policy,\n hostRuntimeDegradeReason: hostRuntimeResult.degradeReason,\n hostRuntimeWarnings: hostRuntimeResult.warnings,\n }\n : {}),\n ...(hostRuntimeResult?.presentation?.extraConfig ?? {}),\n ...(runtimeOverrides?.extraConfig ?? {}),\n };\n}\n\nexport function createVaultRuntimeContext(input: CreateVaultRuntimeContextInput): VaultRuntimeContext {\n const runtimeOverrides = input.runtimeOverrides;\n const resolvedBinding = resolveManifestBinding(input.manifest, {\n chainId: runtimeOverrides?.chainId ?? input.connectedChainId ?? input.hostRuntimeResult?.addresses.chainId,\n factoryAddress: runtimeOverrides?.factoryAddress ?? input.hostRuntimeResult?.addresses.factoryAddress,\n vaultAddress: runtimeOverrides?.vaultAddress ?? input.hostRuntimeResult?.addresses.vaultAddress,\n tokenAddress: runtimeOverrides?.tokenAddress ?? input.hostRuntimeResult?.addresses.tokenAddress,\n });\n const effectiveChainId =\n runtimeOverrides?.chainId ?? input.hostRuntimeResult?.addresses.chainId ?? input.connectedChainId ?? resolvedBinding?.chainId ?? input.manifest.match.bindings[0]?.chainId ?? 56;\n\n return {\n chainId: effectiveChainId,\n factoryAddress: runtimeOverrides?.factoryAddress ?? input.hostRuntimeResult?.addresses.factoryAddress ?? resolvedBinding?.factoryAddress ?? zeroAddress,\n tokenAddress: runtimeOverrides?.tokenAddress ?? input.hostRuntimeResult?.addresses.tokenAddress ?? zeroAddress,\n vaultAddress: runtimeOverrides?.vaultAddress ?? input.hostRuntimeResult?.addresses.vaultAddress ?? zeroAddress,\n userAddress: runtimeOverrides?.userAddress,\n tokenSymbol: runtimeOverrides?.tokenSymbol ?? input.hostRuntimeResult?.tokenSymbol,\n tokenName: runtimeOverrides?.tokenName ?? input.hostRuntimeResult?.tokenName,\n tokenImageUrl: runtimeOverrides?.tokenImageUrl ?? input.hostRuntimeResult?.tokenImageUrl,\n explorerBaseUrl: runtimeOverrides?.explorerBaseUrl ?? explorerForChain(effectiveChainId),\n paymentToken: runtimeOverrides?.paymentToken ?? input.hostRuntimeResult?.paymentToken,\n host: runtimeOverrides?.host ?? input.hostRuntimeResult?.host,\n extraConfig: buildRuntimeExtraConfig(input),\n manifest: input.manifest,\n };\n}\n","export type TxErrorKind = \"userRejected\" | \"walletDisconnected\" | \"wrongNetwork\" | \"insufficientFunds\" | \"simulationFailed\" | \"reverted\" | \"unknown\";\n\ntype TxErrorMessageMap = Partial<Record<TxErrorKind, string>>;\n\nconst defaultMessages: Record<TxErrorKind, string> = {\n userRejected: \"You rejected the wallet request.\",\n walletDisconnected: \"Connect a wallet before sending this transaction.\",\n wrongNetwork: \"Switch the wallet to the required chain before sending this transaction.\",\n insufficientFunds: \"Insufficient wallet balance to complete this transaction.\",\n simulationFailed: \"The transaction could not pass simulation.\",\n reverted: \"The contract rejected this transaction.\",\n unknown: \"Transaction failed. Please check your wallet and try again.\",\n};\n\nfunction isObject(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === \"object\";\n}\n\nfunction readString(value: unknown) {\n return typeof value === \"string\" ? value : \"\";\n}\n\nfunction collectMessages(error: unknown, depth = 0, seen = new Set<unknown>()): string[] {\n if (depth > 4 || error == null || seen.has(error)) return [];\n seen.add(error);\n\n if (typeof error === \"string\") return [error];\n if (!isObject(error)) return [];\n\n const messages = [\n readString(error.shortMessage),\n readString(error.message),\n readString(error.details),\n readString(error.reason),\n ].filter(Boolean);\n\n return [...messages, ...collectMessages(error.cause, depth + 1, seen)];\n}\n\nfunction collectCodes(error: unknown, depth = 0, seen = new Set<unknown>()): Array<string | number> {\n if (depth > 4 || error == null || seen.has(error)) return [];\n seen.add(error);\n if (!isObject(error)) return [];\n\n const codes = [error.code, error.name].filter((value) => typeof value === \"string\" || typeof value === \"number\");\n return [...codes, ...collectCodes(error.cause, depth + 1, seen)];\n}\n\nexport function getTxErrorKind(error: unknown): TxErrorKind {\n const message = collectMessages(error).join(\" \").toLowerCase();\n const codes = collectCodes(error)\n .map((value: string | number) => String(value).toLowerCase())\n .join(\" \");\n\n if (\n codes.includes(\"4001\") ||\n codes.includes(\"action_rejected\") ||\n codes.includes(\"userrejectedrequesterror\") ||\n /user rejected|user denied|rejected the request|denied transaction|request rejected|cancelled/i.test(message)\n ) {\n return \"userRejected\";\n }\n\n if (/wallet is not connected|connector not connected|account not found|no wallet client/i.test(message)) {\n return \"walletDisconnected\";\n }\n\n if (/wrong network|switch wallet to|switch network to|required chain/i.test(message)) {\n return \"wrongNetwork\";\n }\n\n if (/insufficient funds|exceeds the balance|gas \\* price \\+ value/i.test(message)) {\n return \"insufficientFunds\";\n }\n\n if (/simulation failed|simulatecontract|execution reverted during simulation/i.test(message)) {\n return \"simulationFailed\";\n }\n\n if (/execution reverted|reverted with the following reason|contract function .* reverted|call exception/i.test(message)) {\n return \"reverted\";\n }\n\n return \"unknown\";\n}\n\nexport function handleTxError(error: unknown, messages?: TxErrorMessageMap) {\n const kind = getTxErrorKind(error);\n return messages?.[kind] ?? defaultMessages[kind];\n}\n"]}
1
+ {"version":3,"sources":["../../src/sdk/erc20.ts","../../src/sdk/format.ts","../../src/sdk/hostRuntimeConfig.ts","../../src/sdk/taxInfo.ts","../../src/sdk/hostRead.ts","../../src/sdk/hostRuntime.ts","../../src/sdk/oracle.ts","../../src/sdk/runtimeContext.ts","../../src/sdk/txError.ts"],"names":["host"],"mappings":"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","file":"host.js","sourcesContent":["import { erc20Abi } from \"viem\";\n\nexport { erc20Abi };\nexport const standardErc20Abi = erc20Abi;\n","import Decimal from \"decimal.js\";\nimport { formatUnits, parseUnits } from \"viem\";\n\nexport function shortenAddress(raw?: string, start = 6, end = 4) {\n if (!raw) return \"\";\n if (raw.length <= start + end) return raw;\n return `${raw.slice(0, start)}...${raw.slice(-end)}`;\n}\n\nexport function formatTokenAmount(value?: bigint | string | number | null, decimals = 18, precision = 4) {\n if (value === undefined || value === null) return \"-\";\n const raw = typeof value === \"bigint\" ? formatUnits(value, decimals) : String(value);\n return new Decimal(raw).toDecimalPlaces(precision, Decimal.ROUND_DOWN).toString();\n}\n\nexport function parseTokenAmount(value: string, decimals = 18) {\n if (!/^\\d*(\\.\\d*)?$/.test(value.trim())) {\n throw new Error(\"Invalid decimal amount.\");\n }\n return parseUnits(value || \"0\", decimals);\n}\n\nexport function formatPercentBps(value?: bigint | number | null, precision = 2) {\n if (value === undefined || value === null) return \"-\";\n return `${new Decimal(String(value)).div(100).toDecimalPlaces(precision).toString()}%`;\n}\n\nexport function formatCountdown(targetTimeMs?: number) {\n if (!targetTimeMs) return \"-\";\n const diff = Math.max(0, targetTimeMs - Date.now());\n const totalSeconds = Math.floor(diff / 1000);\n const days = Math.floor(totalSeconds / 86400);\n const hours = Math.floor((totalSeconds % 86400) / 3600);\n const minutes = Math.floor((totalSeconds % 3600) / 60);\n const seconds = totalSeconds % 60;\n if (days > 0) return `${days}d ${hours}h ${minutes}m`;\n if (hours > 0) return `${hours}h ${minutes}m ${seconds}s`;\n return `${minutes}m ${seconds}s`;\n}\n","import type { Address } from \"./types\";\n\nexport interface TaxVaultHostChainConfig {\n portal: Address;\n taxTokenHelperAddress?: Address;\n vaultPortal?: Address;\n wrappedNativeTokenAddress?: Address;\n giftVaultFactory?: Address;\n hostChainSlug?: string;\n ipfsGateway?: string;\n}\n\nconst taxVaultHostChains: Record<number, TaxVaultHostChainConfig> = {\n 56: {\n portal: \"0xe2ce6ab80874fa9fa2aae65d277dd6b8e65c9de0\",\n taxTokenHelperAddress: \"0x53841c73217735F37BC1775538b03b23feFD8346\",\n vaultPortal: \"0x90497450f2a706f1951b5bdda52B4E5d16f34C06\",\n wrappedNativeTokenAddress: \"0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c\",\n giftVaultFactory: \"0x025549F52B03cF36f9e1a337c02d3AA7Af66ab32\",\n hostChainSlug: \"bnb\",\n ipfsGateway: \"https://gateway.pinata.cloud\",\n },\n 97: {\n portal: \"0x5bEacaF7ABCbB3aB280e80D007FD31fcE26510e9\",\n taxTokenHelperAddress: \"0xD64441e5FcD02D342B8cf6eBA10Ef6E40d0dA90f\",\n vaultPortal: \"0x027e3704fC5C16522e9393d04C60A3ac5c0d775f\",\n wrappedNativeTokenAddress: \"0xae13d989daC2f0dEbFf460aC112a837C89BAa7cd\",\n giftVaultFactory: \"0xa02DA44D67DB6D692efa7f751b5952bd670d5326\",\n hostChainSlug: \"bnb-testnet\",\n ipfsGateway: \"https://gateway.pinata.cloud\",\n },\n};\n\nexport function getTaxVaultHostChainConfig(chainId: number) {\n return taxVaultHostChains[chainId];\n}\n","import type {\n ActionAvailabilityStage,\n Address,\n FeeMode,\n FlapFeeVaultInfo,\n FlapTaxInfo,\n FlapTokenInfo,\n FlapVaultPortalInfo,\n ManifestBindingEntry,\n TokenMarketPhase,\n VaultHostContext,\n VaultManifest,\n VaultRenderSurface,\n} from \"./types\";\n\nexport const ZERO_ADDRESS = \"0x0000000000000000000000000000000000000000\" as Address;\n\ntype TupleLike = (Record<string, unknown> & readonly unknown[]) | Record<string, unknown> | readonly unknown[] | null | undefined;\n\nexport interface VaultBindingPolicy {\n name: string;\n chainId: number;\n factoryAddress?: Address;\n vaultAddresses?: Address[];\n tokenAddresses?: Address[];\n extra?: Record<string, unknown>;\n isAiPowered?: boolean;\n}\n\nexport interface RuntimeMatchInput {\n chainId?: number;\n factoryAddress?: string | null;\n vaultAddress?: string | null;\n tokenAddress?: string | null;\n}\n\nexport interface CreateTaxInfoHostContextInput {\n tokenInfo?: FlapTokenInfo | null;\n taxInfo?: FlapTaxInfo | null;\n vaultInfo?: FlapVaultPortalInfo | null;\n feeMode?: FeeMode | null;\n giftVaultFactory?: string | null;\n hasTaxVaults?: boolean;\n vaultType?: string;\n copyScope?: \"tax\" | \"fee\";\n}\n\nexport interface ResolveRenderSurfaceInput {\n tokenInfo?: FlapTokenInfo | null;\n taxInfo?: FlapTaxInfo | null;\n hasTaxVaults?: boolean;\n isNonTaxFeeToken?: boolean;\n}\n\nexport interface TaxVaultHostSnapshot {\n tokenInfo?: FlapTokenInfo;\n taxInfo?: FlapTaxInfo | null;\n vaultInfo?: FlapVaultPortalInfo | null;\n feeMode: FeeMode;\n renderSurface: VaultRenderSurface;\n vaultType?: string;\n copyScope: \"tax\" | \"fee\";\n marketPhase: TokenMarketPhase;\n isListed: boolean;\n isTaxToken: boolean;\n isSupportedCustomVaultToken: boolean;\n}\n\nexport function getTupleField(data: TupleLike, name: string, index: number) {\n if (!data) return undefined;\n const record = data as Record<string, unknown>;\n const tuple = data as readonly unknown[];\n return record[name] ?? tuple[index];\n}\n\nexport function isValidAddress(value?: string | null): value is Address {\n return Boolean(value && /^0x[a-fA-F0-9]{40}$/.test(value));\n}\n\nexport function normalizeAddress(value?: string | null): Address | undefined {\n return isValidAddress(value) ? (value as Address) : undefined;\n}\n\nexport function isSameAddress(a?: string | null, b?: string | null) {\n return Boolean(a && b && a.toLowerCase() === b.toLowerCase());\n}\n\nfunction toNumber(value: unknown, fallback = 0) {\n if (typeof value === \"bigint\") return Number(value);\n if (typeof value === \"number\") return Number.isFinite(value) ? value : fallback;\n if (typeof value === \"string\" && value.trim()) {\n const parsed = Number(value);\n return Number.isFinite(parsed) ? parsed : fallback;\n }\n return fallback;\n}\n\nfunction toBigInt(value: unknown, fallback = 0n) {\n if (typeof value === \"bigint\") return value;\n if (typeof value === \"number\" && Number.isFinite(value)) return BigInt(Math.trunc(value));\n if (typeof value === \"string\" && value.trim()) {\n try {\n return BigInt(value);\n } catch {\n return fallback;\n }\n }\n return fallback;\n}\n\nfunction toBooleanOrNull(value: unknown) {\n if (typeof value === \"boolean\") return value;\n if (value === null || value === undefined) return null;\n return Boolean(value);\n}\n\nfunction toAddressOrNull(value: unknown): Address | null {\n return typeof value === \"string\" && isValidAddress(value) ? (value as Address) : null;\n}\n\nfunction toStringOrUndefined(value: unknown) {\n return typeof value === \"string\" && value.length > 0 ? value : undefined;\n}\n\nexport function parsePortalTokenInfo(tokenData: TupleLike): FlapTokenInfo | null {\n if (!tokenData) return null;\n\n const status = toNumber(getTupleField(tokenData, \"status\", 0));\n const taxRateRaw = toBigInt(getTupleField(tokenData, \"taxRate\", 12));\n const quoteTokenAddress = toAddressOrNull(getTupleField(tokenData, \"quoteTokenAddress\", 9)) ?? ZERO_ADDRESS;\n\n return {\n exists: status !== 0,\n isTaxToken: taxRateRaw > 0n,\n taxRate: Number(taxRateRaw),\n taxRateRaw,\n quoteTokenAddress,\n status,\n tokenVersion: toNumber(getTupleField(tokenData, \"tokenVersion\", 4)),\n };\n}\n\nexport function parseFeeVaultInfo(vaultInfo: TupleLike): FlapFeeVaultInfo | null {\n if (!vaultInfo) return null;\n\n return {\n addr: toAddressOrNull(getTupleField(vaultInfo, \"addr\", 0)),\n factory: toAddressOrNull(getTupleField(vaultInfo, \"factory\", 1)),\n riskLevel: toNumber(getTupleField(vaultInfo, \"riskLevel\", 2)),\n isOfficialVault: toBooleanOrNull(getTupleField(vaultInfo, \"isOfficialVault\", 3)),\n isVault: toBooleanOrNull(getTupleField(vaultInfo, \"isVault\", 4)),\n isAIConsumer: toBooleanOrNull(getTupleField(vaultInfo, \"isAIConsumer\", 5)),\n };\n}\n\nexport function parseTaxTokenInfo(\n taxInfo: TupleLike,\n taxInfoV2?: TupleLike,\n options: { wrappedNativeTokenAddress?: Address } = {},\n): FlapTaxInfo | null {\n if (!taxInfo) return null;\n\n const quoteToken = toAddressOrNull(getTupleField(taxInfo, \"quoteToken\", 11)) ?? ZERO_ADDRESS;\n const rawDividendToken = toAddressOrNull(getTupleField(taxInfoV2, \"dividendToken\", 11)) ?? quoteToken;\n const dividendToken =\n quoteToken === ZERO_ADDRESS && rawDividendToken === ZERO_ADDRESS && options.wrappedNativeTokenAddress\n ? options.wrappedNativeTokenAddress\n : rawDividendToken;\n\n return {\n marketBps: toNumber(getTupleField(taxInfo, \"marketBps\", 0)),\n deflationBps: toNumber(getTupleField(taxInfo, \"deflationBps\", 1)),\n lpBps: toNumber(getTupleField(taxInfo, \"lpBps\", 2)),\n dividendBps: toNumber(getTupleField(taxInfo, \"dividendBps\", 3)),\n feeRate: toNumber(getTupleField(taxInfo, \"feeRate\", 4)),\n buyTaxRate: taxInfoV2 ? toNumber(getTupleField(taxInfoV2, \"buyTaxRate\", 4)) : undefined,\n sellTaxRate: taxInfoV2 ? toNumber(getTupleField(taxInfoV2, \"sellTaxRate\", 5)) : undefined,\n burntTokenAmount: toBigInt(getTupleField(taxInfo, \"burntTokenAmount\", 5)),\n totalQuoteSentToDividend: toBigInt(getTupleField(taxInfo, \"totalQuoteSentToDividend\", 6)),\n totalQuoteAddedToLiquidity: toBigInt(getTupleField(taxInfo, \"totalQuoteAddedToLiquidity\", 7)),\n totalTokenAddedToLiquidity: toBigInt(getTupleField(taxInfo, \"totalTokenAddedToLiquidity\", 8)),\n totalQuoteSentToMarketing: toBigInt(getTupleField(taxInfo, \"totalQuoteSentToMarketing\", 9)),\n marketingWallet: toAddressOrNull(getTupleField(taxInfo, \"marketingWallet\", 10)) ?? ZERO_ADDRESS,\n dividendToken,\n quoteToken,\n minimumShareBalance: toBigInt(getTupleField(taxInfo, \"minimumShareBalance\", 12)),\n vaultInfo: parseFeeVaultInfo(getTupleField(taxInfoV2, \"vaultInfo\", 14) as TupleLike),\n };\n}\n\nexport function parseVaultPortalInfo(vaultData: TupleLike): FlapVaultPortalInfo | null {\n if (!vaultData) return null;\n\n const found = Boolean(getTupleField(vaultData, \"found\", 0));\n const info = getTupleField(vaultData, \"info\", 1) as TupleLike;\n\n if (!found || !info) return { found: false };\n\n return {\n found: true,\n vault: toAddressOrNull(getTupleField(info, \"vault\", 0)) ?? ZERO_ADDRESS,\n vaultFactory: toAddressOrNull(getTupleField(info, \"vaultFactory\", 1)) ?? ZERO_ADDRESS,\n description: toStringOrUndefined(getTupleField(info, \"description\", 2)),\n isOfficial: Boolean(getTupleField(info, \"isOfficial\", 3)),\n riskLevel: toNumber(getTupleField(info, \"riskLevel\", 4)),\n };\n}\n\nexport function resolveManifestBinding(manifest: Pick<VaultManifest, \"match\">, input: RuntimeMatchInput): ManifestBindingEntry | null {\n const bindings = manifest.match.bindings;\n if (!bindings.length) return null;\n\n const resolveUnique = (candidates: ManifestBindingEntry[]) => {\n if (candidates.length === 1) return candidates[0];\n return null;\n };\n\n const matchesChain = (binding: ManifestBindingEntry) => !input.chainId || binding.chainId === input.chainId;\n const matchesToken = (binding: ManifestBindingEntry) =>\n !input.tokenAddress || !binding.tokenAddresses?.length || binding.tokenAddresses.some((address) => isSameAddress(address, input.tokenAddress));\n const isVaultScopedBinding = (binding: ManifestBindingEntry) => !binding.factoryAddress && Boolean(binding.vaultAddresses?.length);\n const isTokenScopedBinding = (binding: ManifestBindingEntry) => !binding.factoryAddress && !binding.vaultAddresses?.length && Boolean(binding.tokenAddresses?.length);\n\n if (input.factoryAddress) {\n const factoryMatch = resolveUnique(\n bindings.filter((binding) => matchesChain(binding) && Boolean(binding.factoryAddress) && isSameAddress(binding.factoryAddress, input.factoryAddress) && matchesToken(binding)),\n );\n if (factoryMatch) return factoryMatch;\n if (!input.vaultAddress && !input.tokenAddress) return null;\n }\n\n if (input.vaultAddress) {\n const vaultMatch = resolveUnique(\n bindings.filter(\n (binding) =>\n matchesChain(binding) &&\n isVaultScopedBinding(binding) &&\n Boolean(binding.vaultAddresses?.some((address) => isSameAddress(address, input.vaultAddress))) &&\n matchesToken(binding),\n ),\n );\n if (vaultMatch) return vaultMatch;\n }\n\n if (input.tokenAddress) {\n const tokenMatch = resolveUnique(\n bindings.filter(\n (binding) =>\n matchesChain(binding) &&\n isTokenScopedBinding(binding) &&\n Boolean(binding.tokenAddresses?.some((address) => isSameAddress(address, input.tokenAddress))),\n ),\n );\n if (tokenMatch) return tokenMatch;\n }\n\n if (input.factoryAddress || input.vaultAddress) {\n return null;\n }\n\n if (input.chainId && input.tokenAddress) {\n const tokenScopedMatch = resolveUnique(bindings.filter((binding) => binding.chainId === input.chainId && binding.tokenAddresses?.some((address) => isSameAddress(address, input.tokenAddress))));\n if (tokenScopedMatch) return tokenScopedMatch;\n }\n\n if (input.tokenAddress) {\n return resolveUnique(bindings.filter((binding) => binding.tokenAddresses?.some((address) => isSameAddress(address, input.tokenAddress))));\n }\n\n if (input.chainId) {\n return resolveUnique(bindings.filter((binding) => binding.chainId === input.chainId && matchesToken(binding)));\n }\n\n return null;\n}\n\nexport function isManifestRuntimeMatch(manifest: Pick<VaultManifest, \"match\">, input: RuntimeMatchInput) {\n if (!input.chainId || (!input.factoryAddress && !input.vaultAddress && !input.tokenAddress)) return false;\n const matchingBinding = resolveManifestBinding(manifest, input);\n if (!matchingBinding) return false;\n if (matchingBinding.chainId !== input.chainId) return false;\n if (matchingBinding.factoryAddress) return isSameAddress(matchingBinding.factoryAddress, input.factoryAddress);\n const vaultAddress = matchingBinding.vaultAddresses?.[0];\n if (vaultAddress && !isSameAddress(vaultAddress, input.vaultAddress)) return false;\n if (input.tokenAddress && matchingBinding.tokenAddresses?.length) {\n return matchingBinding.tokenAddresses.some((address) => isSameAddress(address, input.tokenAddress));\n }\n if (!vaultAddress && matchingBinding.tokenAddresses?.length) return false;\n return true;\n}\n\nexport function isVaultBindingMatch(binding: VaultBindingPolicy, input: RuntimeMatchInput) {\n if (!input.chainId || binding.chainId !== input.chainId) return false;\n if (binding.factoryAddress) return Boolean(input.factoryAddress && isSameAddress(binding.factoryAddress, input.factoryAddress));\n const vaultAddress = binding.vaultAddresses?.[0];\n if (vaultAddress) {\n if (!input.vaultAddress || !isSameAddress(vaultAddress, input.vaultAddress)) return false;\n if (input.tokenAddress && binding.tokenAddresses?.length) {\n return binding.tokenAddresses.some((address) => isSameAddress(address, input.tokenAddress));\n }\n return true;\n }\n return Boolean(input.tokenAddress && binding.tokenAddresses?.some((address) => isSameAddress(address, input.tokenAddress)));\n}\n\nexport function resolveVaultBinding(bindings: VaultBindingPolicy[], input: RuntimeMatchInput) {\n return bindings.find((binding) => isVaultBindingMatch(binding, input)) ?? null;\n}\n\nexport function resolveFeeMode(taxInfo: FlapTaxInfo | TupleLike | null | undefined, giftVaultFactory?: string | null): FeeMode {\n if (!taxInfo) return \"unknown\";\n\n const marketBps = toNumber(getTupleField(taxInfo as TupleLike, \"marketBps\", 0));\n const dividendBps = toNumber(getTupleField(taxInfo as TupleLike, \"dividendBps\", 3));\n\n if (dividendBps > 0) return \"holder\";\n if (marketBps <= 0) return \"unknown\";\n\n const parsedVaultInfo =\n \"vaultInfo\" in Object(taxInfo)\n ? (taxInfo as FlapTaxInfo).vaultInfo\n : parseFeeVaultInfo(getTupleField(taxInfo as TupleLike, \"vaultInfo\", 14) as TupleLike);\n\n if (parsedVaultInfo?.isVault === true) {\n return isSameAddress(parsedVaultInfo.factory, giftVaultFactory) ? \"gift\" : \"unknown\";\n }\n\n return \"creator\";\n}\n\nexport function resolveTaxInfoRenderSurface({\n tokenInfo,\n taxInfo,\n hasTaxVaults = false,\n isNonTaxFeeToken = false,\n}: ResolveRenderSurfaceInput): VaultRenderSurface {\n if (!tokenInfo?.exists) return \"unavailable\";\n if (!tokenInfo.isTaxToken) return isNonTaxFeeToken ? \"feeinfo\" : \"unavailable\";\n if (taxInfo?.marketBps === 10000 && hasTaxVaults) return \"vault-taxinfo\";\n return \"standard-taxinfo\";\n}\n\nexport function resolveTokenMarketPhase(tokenInfo?: FlapTokenInfo | null): TokenMarketPhase {\n if (!tokenInfo?.exists) return \"unknown\";\n return tokenInfo.status >= 2 ? \"dex-listed\" : \"internal-market\";\n}\n\nexport function isCustomVaultTaxToken(tokenInfo?: FlapTokenInfo | null) {\n return Boolean(tokenInfo?.exists && tokenInfo.isTaxToken);\n}\n\nexport function isActionAvailableForPhase(stage: ActionAvailabilityStage, marketPhase: TokenMarketPhase = \"unknown\") {\n if (stage === \"read-only\") return false;\n if (stage === \"both\") return true;\n if (marketPhase === \"unknown\") return false;\n return stage === marketPhase;\n}\n\nexport function createTaxInfoHostContext({\n tokenInfo,\n taxInfo,\n vaultInfo,\n feeMode,\n giftVaultFactory,\n hasTaxVaults,\n vaultType,\n copyScope = \"tax\",\n}: CreateTaxInfoHostContextInput): VaultHostContext {\n const resolvedFeeMode = feeMode ?? resolveFeeMode(taxInfo, giftVaultFactory);\n const renderSurface = resolveTaxInfoRenderSurface({\n tokenInfo,\n taxInfo,\n hasTaxVaults: hasTaxVaults ?? Boolean(vaultInfo?.found),\n isNonTaxFeeToken: copyScope === \"fee\",\n });\n const marketPhase = resolveTokenMarketPhase(tokenInfo);\n\n return {\n tokenInfo: tokenInfo ?? undefined,\n taxInfo: taxInfo ?? null,\n vaultInfo: vaultInfo ?? null,\n feeMode: resolvedFeeMode,\n renderSurface,\n vaultType,\n copyScope,\n isListed: tokenInfo ? tokenInfo.status >= 2 : undefined,\n marketPhase,\n };\n}\n\nexport function readTaxVaultHostContext(host?: VaultHostContext | null): TaxVaultHostSnapshot {\n const tokenInfo = host?.tokenInfo;\n const marketPhase = host?.marketPhase ?? resolveTokenMarketPhase(tokenInfo);\n const isListed = host?.isListed ?? Boolean(tokenInfo && tokenInfo.status >= 2);\n const isTaxToken = tokenInfo?.isTaxToken === true;\n\n return {\n tokenInfo,\n taxInfo: host?.taxInfo ?? null,\n vaultInfo: host?.vaultInfo ?? null,\n feeMode: host?.feeMode ?? \"unknown\",\n renderSurface: host?.renderSurface ?? \"unavailable\",\n vaultType: host?.vaultType,\n copyScope: host?.copyScope ?? \"tax\",\n marketPhase,\n isListed,\n isTaxToken,\n isSupportedCustomVaultToken: isCustomVaultTaxToken(tokenInfo),\n };\n}\n","import type { PublicClient } from \"viem\";\nimport { erc20Abi } from \"./erc20\";\nimport { getTaxVaultHostChainConfig } from \"./hostRuntimeConfig\";\nimport { createTaxInfoHostContext, isValidAddress, parsePortalTokenInfo, parseTaxTokenInfo, parseVaultPortalInfo, ZERO_ADDRESS } from \"./taxInfo\";\nimport type { Address, FlapTokenInfo, PaymentToken, TokenMetadataSnapshot, TokenRuntimeSnapshot } from \"./types\";\n\nconst portalAbi = [\n {\n name: \"getTokenV7\",\n type: \"function\",\n stateMutability: \"view\",\n inputs: [{ name: \"\", type: \"address\" }],\n outputs: [\n {\n type: \"tuple\",\n components: [\n { name: \"status\", type: \"uint8\" },\n { name: \"reserve\", type: \"uint256\" },\n { name: \"circulatingSupply\", type: \"uint256\" },\n { name: \"price\", type: \"uint256\" },\n { name: \"tokenVersion\", type: \"uint8\" },\n { name: \"r\", type: \"uint256\" },\n { name: \"h\", type: \"uint256\" },\n { name: \"k\", type: \"uint256\" },\n { name: \"dexSupplyThresh\", type: \"uint256\" },\n { name: \"quoteTokenAddress\", type: \"address\" },\n { name: \"nativeToQuoteSwapEnabled\", type: \"bool\" },\n { name: \"extensionID\", type: \"bytes32\" },\n { name: \"taxRate\", type: \"uint256\" },\n { name: \"pool\", type: \"address\" },\n { name: \"progress\", type: \"uint256\" },\n { name: \"lpFeeProfile\", type: \"uint8\" },\n { name: \"dexId\", type: \"uint8\" },\n ],\n },\n ],\n },\n] as const;\n\nconst taxTokenHelperAbi = [\n {\n name: \"getTaxTokenInfo\",\n type: \"function\",\n stateMutability: \"view\",\n inputs: [{ name: \"taxToken\", type: \"address\" }],\n outputs: [\n {\n type: \"tuple\",\n components: [\n { name: \"marketBps\", type: \"uint16\" },\n { name: \"deflationBps\", type: \"uint16\" },\n { name: \"lpBps\", type: \"uint16\" },\n { name: \"dividendBps\", type: \"uint16\" },\n { name: \"feeRate\", type: \"uint16\" },\n { name: \"burntTokenAmount\", type: \"uint256\" },\n { name: \"totalQuoteSentToDividend\", type: \"uint256\" },\n { name: \"totalQuoteAddedToLiquidity\", type: \"uint256\" },\n { name: \"totalTokenAddedToLiquidity\", type: \"uint256\" },\n { name: \"totalQuoteSentToMarketing\", type: \"uint256\" },\n { name: \"marketingWallet\", type: \"address\" },\n { name: \"quoteToken\", type: \"address\" },\n { name: \"minimumShareBalance\", type: \"uint256\" },\n ],\n },\n ],\n },\n {\n name: \"getTaxTokenInfoV2\",\n type: \"function\",\n stateMutability: \"view\",\n inputs: [{ name: \"taxToken\", type: \"address\" }],\n outputs: [\n {\n type: \"tuple\",\n components: [\n { name: \"marketBps\", type: \"uint16\" },\n { name: \"deflationBps\", type: \"uint16\" },\n { name: \"lpBps\", type: \"uint16\" },\n { name: \"dividendBps\", type: \"uint16\" },\n { name: \"buyTaxRate\", type: \"uint16\" },\n { name: \"sellTaxRate\", type: \"uint16\" },\n { name: \"burntTokenAmount\", type: \"uint256\" },\n { name: \"totalQuoteSentToDividend\", type: \"uint256\" },\n { name: \"totalQuoteAddedToLiquidity\", type: \"uint256\" },\n { name: \"totalTokenAddedToLiquidity\", type: \"uint256\" },\n { name: \"totalQuoteSentToMarketing\", type: \"uint256\" },\n { name: \"dividendToken\", type: \"address\" },\n { name: \"quoteToken\", type: \"address\" },\n { name: \"minimumShareBalance\", type: \"uint256\" },\n {\n name: \"vaultInfo\",\n type: \"tuple\",\n components: [\n { name: \"addr\", type: \"address\" },\n { name: \"factory\", type: \"address\" },\n { name: \"riskLevel\", type: \"uint8\" },\n { name: \"isOfficialVault\", type: \"bool\" },\n { name: \"isVault\", type: \"bool\" },\n { name: \"isAIConsumer\", type: \"bool\" },\n ],\n },\n ],\n },\n ],\n },\n] as const;\n\nconst vaultPortalAbi = [\n {\n name: \"tryGetVault\",\n type: \"function\",\n stateMutability: \"view\",\n inputs: [{ name: \"taxToken\", type: \"address\" }],\n outputs: [\n { name: \"found\", type: \"bool\" },\n {\n name: \"info\",\n type: \"tuple\",\n components: [\n { name: \"vault\", type: \"address\" },\n { name: \"vaultFactory\", type: \"address\" },\n { name: \"description\", type: \"string\" },\n { name: \"isOfficial\", type: \"bool\" },\n { name: \"riskLevel\", type: \"uint8\" },\n ],\n },\n ],\n },\n] as const;\n\nasync function readErc20Symbol(publicClient: PublicClient, address: Address) {\n try {\n const symbol = await publicClient.readContract({\n address,\n abi: erc20Abi,\n functionName: \"symbol\",\n });\n return typeof symbol === \"string\" && symbol.trim() ? symbol.trim() : undefined;\n } catch {\n return undefined;\n }\n}\n\nasync function readErc20Name(publicClient: PublicClient, address: Address) {\n try {\n const name = await publicClient.readContract({\n address,\n abi: erc20Abi,\n functionName: \"name\",\n });\n return typeof name === \"string\" && name.trim() ? name.trim() : undefined;\n } catch {\n return undefined;\n }\n}\n\nasync function readErc20Decimals(publicClient: PublicClient, address: Address) {\n try {\n const decimals = await publicClient.readContract({\n address,\n abi: erc20Abi,\n functionName: \"decimals\",\n });\n return typeof decimals === \"number\" ? decimals : 18;\n } catch {\n return 18;\n }\n}\n\nasync function resolvePaymentToken(publicClient: PublicClient, tokenInfo: FlapTokenInfo): Promise<PaymentToken | undefined> {\n const quoteTokenAddress = tokenInfo.quoteTokenAddress;\n if (!quoteTokenAddress) return undefined;\n\n if (quoteTokenAddress === ZERO_ADDRESS) {\n const nativeCurrency = publicClient.chain?.nativeCurrency;\n return {\n address: ZERO_ADDRESS,\n symbol: nativeCurrency?.symbol ?? \"NATIVE\",\n decimals: nativeCurrency?.decimals ?? 18,\n isNative: true,\n };\n }\n\n if (!isValidAddress(quoteTokenAddress)) return undefined;\n\n const [symbol, decimals] = await Promise.all([readErc20Symbol(publicClient, quoteTokenAddress), readErc20Decimals(publicClient, quoteTokenAddress)]);\n\n return {\n address: quoteTokenAddress,\n symbol: symbol ?? \"TOKEN\",\n decimals,\n isNative: false,\n };\n}\n\nexport async function readErc20TokenMetadata(publicClient: PublicClient, tokenAddress?: Address | null): Promise<TokenMetadataSnapshot | null> {\n if (!tokenAddress || !isValidAddress(tokenAddress) || tokenAddress === ZERO_ADDRESS) return null;\n\n const [tokenSymbol, tokenName] = await Promise.all([readErc20Symbol(publicClient, tokenAddress), readErc20Name(publicClient, tokenAddress)]);\n if (!tokenSymbol && !tokenName) return null;\n\n return {\n tokenSymbol,\n tokenName,\n };\n}\n\nexport async function loadTokenRuntimeSnapshot(\n publicClient: PublicClient,\n chainId: number,\n tokenAddress?: Address | null,\n): Promise<TokenRuntimeSnapshot | null> {\n if (!tokenAddress || !isValidAddress(tokenAddress) || tokenAddress === ZERO_ADDRESS) return null;\n\n const chainConfig = getTaxVaultHostChainConfig(chainId);\n\n // Fire metadata fetch immediately; if chainConfig exists, fire portal read in parallel.\n const metadataPromise = readErc20TokenMetadata(publicClient, tokenAddress);\n const portalPromise = chainConfig\n ? publicClient\n .readContract({\n address: chainConfig.portal,\n abi: portalAbi,\n functionName: \"getTokenV7\",\n args: [tokenAddress],\n })\n .then((data) => ({ ok: true as const, data }))\n .catch(() => ({ ok: false as const }))\n : Promise.resolve(null);\n\n const [metadata, portalResult] = await Promise.all([metadataPromise, portalPromise]);\n\n const baseSnapshot = {\n tokenSymbol: metadata?.tokenSymbol,\n tokenName: metadata?.tokenName,\n copyScope: \"tax\" as const,\n };\n\n if (!chainConfig) {\n return {\n ...baseSnapshot,\n hasTaxVaults: false,\n hostReadSupported: false,\n hostReadFromChain: false,\n };\n }\n\n // portalResult is non-null here because chainConfig exists\n if (!portalResult || !portalResult.ok) {\n return {\n ...baseSnapshot,\n hasTaxVaults: Boolean(chainConfig.vaultPortal),\n hostReadSupported: true,\n hostReadFromChain: false,\n giftVaultFactory: chainConfig.giftVaultFactory,\n };\n }\n\n const tokenData = portalResult.data;\n\n const tokenInfo = parsePortalTokenInfo(tokenData as Record<string, unknown>);\n const hasTaxVaults = Boolean(chainConfig.vaultPortal);\n if (!tokenInfo) {\n return {\n ...baseSnapshot,\n hasTaxVaults,\n hostReadSupported: true,\n hostReadFromChain: false,\n giftVaultFactory: chainConfig.giftVaultFactory,\n };\n }\n\n const paymentToken = tokenInfo.exists ? await resolvePaymentToken(publicClient, tokenInfo) : undefined;\n if (!tokenInfo.exists) {\n const host = createTaxInfoHostContext({\n tokenInfo,\n giftVaultFactory: chainConfig.giftVaultFactory,\n hasTaxVaults,\n copyScope: \"tax\",\n });\n return {\n ...baseSnapshot,\n tokenInfo,\n host,\n giftVaultFactory: chainConfig.giftVaultFactory,\n paymentToken,\n hasTaxVaults,\n hostReadSupported: true,\n hostReadFromChain: true,\n };\n }\n\n const taxInfoPromise =\n tokenInfo.isTaxToken && chainConfig.taxTokenHelperAddress\n ? Promise.allSettled([\n publicClient.readContract({\n address: chainConfig.taxTokenHelperAddress,\n abi: taxTokenHelperAbi,\n functionName: \"getTaxTokenInfo\",\n args: [tokenAddress],\n }),\n publicClient.readContract({\n address: chainConfig.taxTokenHelperAddress,\n abi: taxTokenHelperAbi,\n functionName: \"getTaxTokenInfoV2\",\n args: [tokenAddress],\n }),\n ])\n : Promise.resolve(null);\n\n const vaultInfoPromise = chainConfig.vaultPortal\n ? publicClient\n .readContract({\n address: chainConfig.vaultPortal,\n abi: vaultPortalAbi,\n functionName: \"tryGetVault\",\n args: [tokenAddress],\n })\n .catch(() => undefined)\n : Promise.resolve(undefined);\n\n const [taxResults, vaultData] = await Promise.all([taxInfoPromise, vaultInfoPromise]);\n const baseTaxInfo = Array.isArray(taxResults) && taxResults[0]?.status === \"fulfilled\" ? taxResults[0].value : undefined;\n const taxInfoV2 = Array.isArray(taxResults) && taxResults[1]?.status === \"fulfilled\" ? taxResults[1].value : undefined;\n const taxInfo = baseTaxInfo\n ? parseTaxTokenInfo(baseTaxInfo, taxInfoV2, { wrappedNativeTokenAddress: chainConfig.wrappedNativeTokenAddress })\n : undefined;\n const vaultInfo = vaultData ? parseVaultPortalInfo(vaultData) : undefined;\n const host = createTaxInfoHostContext({\n tokenInfo,\n taxInfo,\n vaultInfo,\n giftVaultFactory: chainConfig.giftVaultFactory,\n hasTaxVaults,\n copyScope: \"tax\",\n });\n\n return {\n ...baseSnapshot,\n tokenInfo,\n taxInfo,\n vaultInfo,\n host,\n giftVaultFactory: chainConfig.giftVaultFactory,\n paymentToken,\n hasTaxVaults,\n hostReadSupported: true,\n hostReadFromChain: true,\n };\n}\n","import { loadTokenRuntimeSnapshot } from \"./hostRead\";\nimport { isValidAddress, readTaxVaultHostContext, ZERO_ADDRESS } from \"./taxInfo\";\nimport type {\n Address,\n HostRuntimeAddresses,\n HostRuntimeDataSource,\n HostRuntimeDegradeReason,\n HostRuntimeInput,\n HostRuntimeResult,\n HostRuntimeSources,\n HostRuntimeStatus,\n HostRuntimeWarning,\n TokenRuntimeSnapshot,\n} from \"./types\";\n\nfunction isResolvedAddress(address?: Address | null): address is Address {\n return Boolean(address && isValidAddress(address) && address !== ZERO_ADDRESS);\n}\n\nfunction pickAddress(...candidates: Array<Address | null | undefined>) {\n for (const candidate of candidates) {\n if (isResolvedAddress(candidate)) return candidate;\n }\n return undefined;\n}\n\nfunction resolveAddresses(input: Pick<HostRuntimeInput, \"chainId\" | \"tokenAddress\" | \"factoryAddressHint\" | \"vaultAddressHint\">, snapshot?: TokenRuntimeSnapshot | null): HostRuntimeAddresses {\n return {\n chainId: input.chainId,\n tokenAddress: input.tokenAddress,\n factoryAddressHint: input.factoryAddressHint,\n vaultAddressHint: input.vaultAddressHint,\n factoryAddress: pickAddress(snapshot?.vaultInfo?.vaultFactory, snapshot?.taxInfo?.vaultInfo?.factory ?? undefined, input.factoryAddressHint),\n vaultAddress: pickAddress(snapshot?.vaultInfo?.vault, snapshot?.taxInfo?.vaultInfo?.addr ?? undefined, input.vaultAddressHint),\n };\n}\n\nfunction hasPresentationMetadata(result: HostRuntimeResult) {\n return Boolean(result.presentation?.tokenName || result.presentation?.tokenSymbol || result.presentation?.tokenImageUrl);\n}\n\nfunction resolveTokenMetadataSource(snapshot: TokenRuntimeSnapshot | null, presentationDataAvailable: boolean): HostRuntimeDataSource {\n if (presentationDataAvailable) return \"host-proxy\";\n if (snapshot?.tokenName || snapshot?.tokenSymbol) return \"onchain\";\n return \"unavailable\";\n}\n\nfunction resolveSources(snapshot: TokenRuntimeSnapshot | null, presentationDataAvailable: boolean): HostRuntimeSources {\n return {\n tokenMetadata: resolveTokenMetadataSource(snapshot, presentationDataAvailable),\n taxState: snapshot?.taxInfo ? \"onchain\" : \"unavailable\",\n vaultState: snapshot?.vaultInfo?.found || snapshot?.taxInfo?.vaultInfo?.isVault ? \"onchain\" : \"unavailable\",\n presentation: presentationDataAvailable ? \"host-proxy\" : \"unavailable\",\n };\n}\n\nfunction collectWarnings(snapshot: TokenRuntimeSnapshot | null, addresses: HostRuntimeAddresses): HostRuntimeWarning[] {\n const warnings: HostRuntimeWarning[] = [];\n\n if (!snapshot?.taxInfo) warnings.push(\"tax-info-unavailable\");\n if (snapshot?.tokenInfo?.quoteTokenAddress && !snapshot.paymentToken) warnings.push(\"payment-token-unavailable\");\n if (!addresses.vaultAddress) warnings.push(\"vault-address-unavailable\");\n if (!addresses.factoryAddress) warnings.push(\"factory-address-unavailable\");\n\n return warnings;\n}\n\nfunction resolveChainFailure(snapshot: TokenRuntimeSnapshot | null): HostRuntimeDegradeReason | null {\n if (!snapshot) return \"chain-read-unavailable\";\n if (!snapshot.hostReadSupported) return \"unsupported-chain\";\n if (!snapshot.hostReadFromChain || !snapshot.tokenInfo) return \"chain-read-unavailable\";\n if (!snapshot.tokenInfo.exists) return \"token-not-found\";\n if (!snapshot.tokenInfo.isTaxToken) return \"token-not-tax\";\n return null;\n}\n\nfunction createResult(params: {\n status: HostRuntimeStatus;\n input: Pick<HostRuntimeInput, \"chainId\" | \"tokenAddress\" | \"factoryAddressHint\" | \"vaultAddressHint\">;\n snapshot: TokenRuntimeSnapshot | null;\n degradeReason?: HostRuntimeDegradeReason;\n presentation?: HostRuntimeResult[\"presentation\"];\n policy: HostRuntimeResult[\"policy\"];\n}): HostRuntimeResult {\n const addresses = resolveAddresses(params.input, params.snapshot);\n const basePresentation = params.presentation ?? null;\n const baseResult: HostRuntimeResult = {\n status: params.status,\n policy: params.policy,\n degradeReason: params.degradeReason,\n warnings: collectWarnings(params.snapshot, addresses),\n addresses,\n snapshot: params.snapshot,\n host: params.snapshot?.host ?? undefined,\n paymentToken: params.snapshot?.paymentToken,\n tokenSymbol: basePresentation?.tokenSymbol ?? params.snapshot?.tokenSymbol,\n tokenName: basePresentation?.tokenName ?? params.snapshot?.tokenName,\n tokenImageUrl: basePresentation?.tokenImageUrl,\n tokenDetailHref: basePresentation?.tokenDetailHref,\n chainHref: basePresentation?.chainHref,\n presentation: basePresentation,\n sources: {\n tokenMetadata: \"unavailable\",\n taxState: \"unavailable\",\n vaultState: \"unavailable\",\n presentation: \"unavailable\",\n },\n };\n\n baseResult.sources = resolveSources(params.snapshot, hasPresentationMetadata(baseResult));\n return baseResult;\n}\n\nexport function resolveHostRuntimeAddresses(input: Pick<HostRuntimeInput, \"chainId\" | \"tokenAddress\" | \"factoryAddressHint\" | \"vaultAddressHint\">, snapshot?: TokenRuntimeSnapshot | null) {\n return resolveAddresses(input, snapshot);\n}\n\nexport async function runHostRuntime(input: HostRuntimeInput): Promise<HostRuntimeResult> {\n const policy = input.policy ?? \"prefer-full-host\";\n\n if (!isResolvedAddress(input.tokenAddress)) {\n return createResult({\n status: \"unavailable\",\n input,\n snapshot: null,\n degradeReason: \"invalid-token-address\",\n policy,\n });\n }\n\n const snapshot = await loadTokenRuntimeSnapshot(input.publicClient, input.chainId, input.tokenAddress);\n const chainFailure = resolveChainFailure(snapshot);\n if (chainFailure) {\n return createResult({\n status: \"unavailable\",\n input,\n snapshot,\n degradeReason: chainFailure,\n policy,\n });\n }\n\n let presentation: HostRuntimeResult[\"presentation\"] = null;\n let presentationFailure: HostRuntimeDegradeReason | undefined;\n\n if (input.presentationFetcher) {\n try {\n const resolvedAddrs = resolveAddresses(input, snapshot);\n presentation = await input.presentationFetcher({\n chainId: input.chainId,\n tokenAddress: input.tokenAddress,\n factoryAddress: resolvedAddrs.factoryAddress,\n vaultAddress: resolvedAddrs.vaultAddress,\n snapshot: snapshot!,\n });\n if (!presentation) {\n presentationFailure = \"host-presentation-unavailable\";\n }\n } catch {\n presentationFailure = \"host-presentation-unavailable\";\n }\n } else {\n presentationFailure = \"host-presentation-not-configured\";\n }\n\n if (presentation) {\n return createResult({\n status: \"full-host\",\n input,\n snapshot,\n presentation,\n policy,\n });\n }\n\n if (policy === \"require-full-host\") {\n return createResult({\n status: \"unavailable\",\n input,\n snapshot,\n degradeReason: presentationFailure === \"host-presentation-not-configured\" ? \"host-presentation-required\" : \"host-presentation-unavailable\",\n policy,\n });\n }\n\n const result = createResult({\n status: \"onchain\",\n input,\n snapshot,\n degradeReason: presentationFailure,\n policy,\n });\n\n const hostSnapshot = readTaxVaultHostContext(result.host);\n if (!hostSnapshot.isSupportedCustomVaultToken) {\n return {\n ...result,\n status: \"unavailable\",\n degradeReason: \"token-not-tax\",\n };\n }\n\n return result;\n}\n","import type { OracleProvision, OracleReadRequest, OracleReader } from \"./types\";\n\nconst DEFAULT_LOCAL_ORACLE_ENDPOINT_BASE = \"/api/runtime/oracle\";\n\nexport class OracleReadError extends Error {\n status?: number;\n\n constructor(message: string, status?: number) {\n super(message);\n this.name = \"OracleReadError\";\n this.status = status;\n }\n}\n\nfunction appendSearchParams(url: URL, params?: Record<string, string>) {\n for (const [key, value] of Object.entries(params ?? {})) {\n url.searchParams.set(key, value);\n }\n}\n\nfunction toOracleProvision(provision: string | OracleProvision): OracleProvision {\n return typeof provision === \"string\" ? { endpoint: provision } : provision;\n}\n\nexport function buildLocalOracleUrl(oracleId: string, params?: Record<string, string>, endpointBase = DEFAULT_LOCAL_ORACLE_ENDPOINT_BASE) {\n const normalizedBase = endpointBase.replace(/\\/+$/, \"\");\n const url = new URL(`${normalizedBase}/${encodeURIComponent(oracleId)}`, \"http://localhost\");\n appendSearchParams(url, params);\n return `${url.pathname}${url.search}`;\n}\n\nexport async function fetchOracleJson<T>({\n endpoint,\n params,\n fetchImpl,\n headers,\n}: {\n endpoint: string;\n params?: Record<string, string>;\n fetchImpl?: typeof fetch;\n headers?: HeadersInit;\n}): Promise<T> {\n const fallbackOrigin = typeof window !== \"undefined\" ? window.location.origin : \"http://localhost\";\n const url = new URL(endpoint, fallbackOrigin);\n appendSearchParams(url, params);\n\n const response = await (fetchImpl ?? fetch)(url.toString(), {\n cache: \"no-store\",\n headers,\n method: \"GET\",\n });\n\n if (!response.ok) {\n throw new OracleReadError(`Oracle request returned ${response.status}.`, response.status);\n }\n\n return (await response.json()) as T;\n}\n\nexport async function fetchProvisionedOracle<T>({\n provision,\n params,\n fetchImpl,\n}: {\n provision: string | OracleProvision;\n params?: Record<string, string>;\n fetchImpl?: typeof fetch;\n}): Promise<T> {\n const normalizedProvision = toOracleProvision(provision);\n const filteredParams =\n normalizedProvision.allowedParams && normalizedProvision.allowedParams.length\n ? Object.fromEntries(Object.entries(params ?? {}).filter(([key]) => normalizedProvision.allowedParams?.includes(key)))\n : params;\n\n return fetchOracleJson<T>({\n endpoint: normalizedProvision.endpoint,\n params: filteredParams,\n fetchImpl,\n headers: normalizedProvision.headers,\n });\n}\n\nexport function createLocalOracleReader(options: { endpointBase?: string; fetchImpl?: typeof fetch } = {}): OracleReader {\n const endpointBase = options.endpointBase ?? DEFAULT_LOCAL_ORACLE_ENDPOINT_BASE;\n const fetchImpl = options.fetchImpl;\n\n return async function readLocalOracle<T>({ oracleId, params }: OracleReadRequest): Promise<T> {\n return fetchOracleJson<T>({\n endpoint: buildLocalOracleUrl(oracleId, params, endpointBase),\n fetchImpl,\n });\n };\n}\n","import { resolveManifestBinding } from \"./taxInfo\";\nimport type { Address, CreateVaultRuntimeContextInput, VaultRuntimeContext, VaultRuntimeExtraConfig } from \"./types\";\n\nconst zeroAddress = \"0x0000000000000000000000000000000000000000\" as Address;\n\nexport function explorerForChain(chainId: number) {\n if (chainId === 56) return \"https://bscscan.com\";\n if (chainId === 97) return \"https://testnet.bscscan.com\";\n return undefined;\n}\n\nexport function chainLabelForChain(chainId: number) {\n if (chainId === 56) return \"BNB Chain\";\n if (chainId === 97) return \"BNB Testnet\";\n return `Chain ${chainId}`;\n}\n\nfunction buildRuntimeExtraConfig(input: CreateVaultRuntimeContextInput): VaultRuntimeExtraConfig {\n const hostRuntimeResult = input.hostRuntimeResult;\n const runtimeOverrides = input.runtimeOverrides;\n\n return {\n ...(hostRuntimeResult\n ? {\n hostRuntimeStatus: hostRuntimeResult.status,\n hostRuntimePolicy: hostRuntimeResult.policy,\n hostRuntimeDegradeReason: hostRuntimeResult.degradeReason,\n hostRuntimeWarnings: hostRuntimeResult.warnings,\n }\n : {}),\n ...(hostRuntimeResult?.presentation?.extraConfig ?? {}),\n ...(runtimeOverrides?.extraConfig ?? {}),\n };\n}\n\nexport function createVaultRuntimeContext(input: CreateVaultRuntimeContextInput): VaultRuntimeContext {\n const runtimeOverrides = input.runtimeOverrides;\n const resolvedBinding = resolveManifestBinding(input.manifest, {\n chainId: runtimeOverrides?.chainId ?? input.connectedChainId ?? input.hostRuntimeResult?.addresses.chainId,\n factoryAddress: runtimeOverrides?.factoryAddress ?? input.hostRuntimeResult?.addresses.factoryAddress,\n vaultAddress: runtimeOverrides?.vaultAddress ?? input.hostRuntimeResult?.addresses.vaultAddress,\n tokenAddress: runtimeOverrides?.tokenAddress ?? input.hostRuntimeResult?.addresses.tokenAddress,\n });\n const effectiveChainId =\n runtimeOverrides?.chainId ?? input.hostRuntimeResult?.addresses.chainId ?? input.connectedChainId ?? resolvedBinding?.chainId ?? input.manifest.match.bindings[0]?.chainId ?? 56;\n\n return {\n chainId: effectiveChainId,\n factoryAddress: runtimeOverrides?.factoryAddress ?? input.hostRuntimeResult?.addresses.factoryAddress ?? resolvedBinding?.factoryAddress ?? zeroAddress,\n tokenAddress: runtimeOverrides?.tokenAddress ?? input.hostRuntimeResult?.addresses.tokenAddress ?? zeroAddress,\n vaultAddress: runtimeOverrides?.vaultAddress ?? input.hostRuntimeResult?.addresses.vaultAddress ?? zeroAddress,\n userAddress: runtimeOverrides?.userAddress,\n tokenSymbol: runtimeOverrides?.tokenSymbol ?? input.hostRuntimeResult?.tokenSymbol,\n tokenName: runtimeOverrides?.tokenName ?? input.hostRuntimeResult?.tokenName,\n tokenImageUrl: runtimeOverrides?.tokenImageUrl ?? input.hostRuntimeResult?.tokenImageUrl,\n explorerBaseUrl: runtimeOverrides?.explorerBaseUrl ?? explorerForChain(effectiveChainId),\n paymentToken: runtimeOverrides?.paymentToken ?? input.hostRuntimeResult?.paymentToken,\n host: runtimeOverrides?.host ?? input.hostRuntimeResult?.host,\n extraConfig: buildRuntimeExtraConfig(input),\n manifest: input.manifest,\n };\n}\n","export type TxErrorKind = \"userRejected\" | \"walletDisconnected\" | \"wrongNetwork\" | \"insufficientFunds\" | \"simulationFailed\" | \"reverted\" | \"unknown\";\n\ntype TxErrorMessageMap = Partial<Record<TxErrorKind, string>>;\n\nconst defaultMessages: Record<TxErrorKind, string> = {\n userRejected: \"You rejected the wallet request.\",\n walletDisconnected: \"Connect a wallet before sending this transaction.\",\n wrongNetwork: \"Switch the wallet to the required chain before sending this transaction.\",\n insufficientFunds: \"Insufficient wallet balance to complete this transaction.\",\n simulationFailed: \"The transaction could not pass simulation.\",\n reverted: \"The contract rejected this transaction.\",\n unknown: \"Transaction failed. Please check your wallet and try again.\",\n};\n\nfunction isObject(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === \"object\";\n}\n\nfunction readString(value: unknown) {\n return typeof value === \"string\" ? value : \"\";\n}\n\nfunction collectMessages(error: unknown, depth = 0, seen = new Set<unknown>()): string[] {\n if (depth > 4 || error == null || seen.has(error)) return [];\n seen.add(error);\n\n if (typeof error === \"string\") return [error];\n if (!isObject(error)) return [];\n\n const messages = [\n readString(error.shortMessage),\n readString(error.message),\n readString(error.details),\n readString(error.reason),\n ].filter(Boolean);\n\n return [...messages, ...collectMessages(error.cause, depth + 1, seen)];\n}\n\nfunction collectCodes(error: unknown, depth = 0, seen = new Set<unknown>()): Array<string | number> {\n if (depth > 4 || error == null || seen.has(error)) return [];\n seen.add(error);\n if (!isObject(error)) return [];\n\n const codes = [error.code, error.name].filter((value) => typeof value === \"string\" || typeof value === \"number\");\n return [...codes, ...collectCodes(error.cause, depth + 1, seen)];\n}\n\nexport function getTxErrorKind(error: unknown): TxErrorKind {\n const message = collectMessages(error).join(\" \").toLowerCase();\n const codes = collectCodes(error)\n .map((value: string | number) => String(value).toLowerCase())\n .join(\" \");\n\n if (\n codes.includes(\"4001\") ||\n codes.includes(\"action_rejected\") ||\n codes.includes(\"userrejectedrequesterror\") ||\n /user rejected|user denied|rejected the request|denied transaction|request rejected|cancelled/i.test(message)\n ) {\n return \"userRejected\";\n }\n\n if (/wallet is not connected|connector not connected|account not found|no wallet client/i.test(message)) {\n return \"walletDisconnected\";\n }\n\n if (/wrong network|switch wallet to|switch network to|required chain/i.test(message)) {\n return \"wrongNetwork\";\n }\n\n if (/insufficient funds|exceeds the balance|gas \\* price \\+ value/i.test(message)) {\n return \"insufficientFunds\";\n }\n\n if (/simulation failed|simulatecontract|execution reverted during simulation/i.test(message)) {\n return \"simulationFailed\";\n }\n\n if (/execution reverted|reverted with the following reason|contract function .* reverted|call exception/i.test(message)) {\n return \"reverted\";\n }\n\n return \"unknown\";\n}\n\nexport function handleTxError(error: unknown, messages?: TxErrorMessageMap) {\n const kind = getTxErrorKind(error);\n return messages?.[kind] ?? defaultMessages[kind];\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { a as Address } from './types-DzTX2u7q.mjs';
1
+ import { a as Address } from './types-COZWeTke.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.4",
3
+ "version": "0.1.5",
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.4",
4
+ "packageVersion": "0.1.5",
5
5
  "stableAuthoringAliases": [
6
6
  "@/src/sdk",
7
7
  "@/src/ui"
package/sdk.d.mts CHANGED
@@ -1,6 +1,6 @@
1
- import { I as VaultManifest, L as VaultRuntimeContextOverrides, r as HostRuntimeResult, y as OracleReader, K as VaultRuntimeContext, e as FlapI18n, f as FlapNotify, j as FlapVaultSdk, k as FlapWallet } from './types-DzTX2u7q.mjs';
2
- export { A as ActionAvailabilityStage, a as Address, C as ContractReadRequest, b as ContractWriteRequest, F as FeeMode, d as FlapFeeVaultInfo, g as FlapTaxInfo, h as FlapTokenInfo, i as FlapVaultPortalInfo, M as ManifestBindingEntry, O as OracleProvision, x as OracleReadRequest, P as PaymentToken, R as RuntimeOracleRegistry, S as SimulateResult, T as TokenMarketPhase, D as TxReceipt, V as VaultComponentProps, G as VaultHostContext, J as VaultRenderSurface, N as VaultRuntimeExtraConfig } from './types-DzTX2u7q.mjs';
3
- export { O as OracleReadError, Z as ZERO_ADDRESS, c as buildLocalOracleUrl, d as createLocalOracleReader, f as fetchOracleJson, g as fetchProvisionedOracle, h as formatCountdown, i as formatPercentBps, j as formatTokenAmount, l as getTxErrorKind, m as handleTxError, n as isActionAvailableForPhase, o as isCustomVaultTaxToken, r as isValidAddress, x as parseTokenAmount, z as readTaxVaultHostContext, E as resolveTokenMarketPhase, G as shortenAddress, H as standardErc20Abi } from './txError-BmDt5Z4B.mjs';
1
+ import { I as VaultManifest, L as VaultRuntimeContextOverrides, r as HostRuntimeResult, y as OracleReader, K as VaultRuntimeContext, e as FlapI18n, f as FlapNotify, j as FlapVaultSdk, k as FlapWallet } from './types-COZWeTke.mjs';
2
+ export { A as ActionAvailabilityStage, a as Address, C as ContractReadRequest, b as ContractWriteRequest, F as FeeMode, d as FlapFeeVaultInfo, g as FlapTaxInfo, h as FlapTokenInfo, i as FlapVaultPortalInfo, M as ManifestBindingEntry, O as OracleProvision, x as OracleReadRequest, P as PaymentToken, R as RuntimeOracleRegistry, S as SimulateResult, T as TokenMarketPhase, D as TxReceipt, V as VaultComponentProps, G as VaultHostContext, J as VaultRenderSurface, N as VaultRuntimeExtraConfig } from './types-COZWeTke.mjs';
3
+ export { O as OracleReadError, Z as ZERO_ADDRESS, c as buildLocalOracleUrl, d as createLocalOracleReader, f as fetchOracleJson, g as fetchProvisionedOracle, h as formatCountdown, i as formatPercentBps, j as formatTokenAmount, l as getTxErrorKind, m as handleTxError, n as isActionAvailableForPhase, o as isCustomVaultTaxToken, r as isValidAddress, x as parseTokenAmount, z as readTaxVaultHostContext, E as resolveTokenMarketPhase, G as shortenAddress, H as standardErc20Abi } from './txError-Dd0Oug-u.mjs';
4
4
  import * as React from 'react';
5
5
  import { ReactNode } from 'react';
6
6
  export { erc20Abi } from 'viem';
package/sdk.js CHANGED
@@ -235,11 +235,13 @@ function resolveManifestBinding(manifest, input) {
235
235
  const matchesChain = (binding) => !input.chainId || binding.chainId === input.chainId;
236
236
  const matchesToken = (binding) => !input.tokenAddress || !binding.tokenAddresses?.length || binding.tokenAddresses.some((address) => isSameAddress(address, input.tokenAddress));
237
237
  const isVaultScopedBinding = (binding) => !binding.factoryAddress && Boolean(binding.vaultAddresses?.length);
238
+ const isTokenScopedBinding = (binding) => !binding.factoryAddress && !binding.vaultAddresses?.length && Boolean(binding.tokenAddresses?.length);
238
239
  if (input.factoryAddress) {
239
240
  const factoryMatch = resolveUnique(
240
241
  bindings.filter((binding) => matchesChain(binding) && Boolean(binding.factoryAddress) && isSameAddress(binding.factoryAddress, input.factoryAddress) && matchesToken(binding))
241
242
  );
242
- if (factoryMatch || !input.vaultAddress) return factoryMatch;
243
+ if (factoryMatch) return factoryMatch;
244
+ if (!input.vaultAddress && !input.tokenAddress) return null;
243
245
  }
244
246
  if (input.vaultAddress) {
245
247
  const vaultMatch = resolveUnique(
@@ -249,15 +251,27 @@ function resolveManifestBinding(manifest, input) {
249
251
  );
250
252
  if (vaultMatch) return vaultMatch;
251
253
  }
254
+ if (input.tokenAddress) {
255
+ const tokenMatch = resolveUnique(
256
+ bindings.filter(
257
+ (binding) => matchesChain(binding) && isTokenScopedBinding(binding) && Boolean(binding.tokenAddresses?.some((address) => isSameAddress(address, input.tokenAddress)))
258
+ )
259
+ );
260
+ if (tokenMatch) return tokenMatch;
261
+ }
252
262
  if (input.factoryAddress || input.vaultAddress) {
253
263
  return null;
254
264
  }
255
- if (input.chainId) {
256
- return resolveUnique(bindings.filter((binding) => binding.chainId === input.chainId && matchesToken(binding)));
265
+ if (input.chainId && input.tokenAddress) {
266
+ const tokenScopedMatch = resolveUnique(bindings.filter((binding) => binding.chainId === input.chainId && binding.tokenAddresses?.some((address) => isSameAddress(address, input.tokenAddress))));
267
+ if (tokenScopedMatch) return tokenScopedMatch;
257
268
  }
258
269
  if (input.tokenAddress) {
259
270
  return resolveUnique(bindings.filter((binding) => binding.tokenAddresses?.some((address) => isSameAddress(address, input.tokenAddress))));
260
271
  }
272
+ if (input.chainId) {
273
+ return resolveUnique(bindings.filter((binding) => binding.chainId === input.chainId && matchesToken(binding)));
274
+ }
261
275
  return null;
262
276
  }
263
277
  function resolveTokenMarketPhase(tokenInfo) {
@@ -476,7 +490,8 @@ function VaultRuntimeProvider({ children, manifest, i18n, runtimeContext: runtim
476
490
  address: request.address,
477
491
  abi: request.abi,
478
492
  functionName: request.functionName,
479
- args: request.args
493
+ args: request.args,
494
+ account: request.account
480
495
  });
481
496
  },
482
497
  [publicClient]
package/sdk.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/sdk/erc20.ts","../../src/sdk/format.ts","../../src/sdk/oracle.ts","../../src/ui/utils.ts","../../src/ui/Alert.tsx","../../src/ui/Button.tsx","../../src/ui/Card.tsx","../../src/ui/Input.tsx","../../src/sdk/taxInfo.ts","../../src/sdk/runtimeContext.ts","../../src/sdk/runtime.tsx","../../src/sdk/txError.ts","../../src/sdk/useFlapWallet.ts"],"names":["React2","React4","useState","useEffect","useMemo","formatUnits"],"mappings":";;;;;;;;;;;;AAGO,IAAM,gBAAA,GAAmB;ACAzB,SAAS,cAAA,CAAe,GAAA,EAAc,KAAA,GAAQ,CAAA,EAAG,MAAM,CAAA,EAAG;AAC/D,EAAA,IAAI,CAAC,KAAK,OAAO,EAAA;AACjB,EAAA,IAAI,GAAA,CAAI,MAAA,IAAU,KAAA,GAAQ,GAAA,EAAK,OAAO,GAAA;AACtC,EAAA,OAAO,CAAA,EAAG,GAAA,CAAI,KAAA,CAAM,CAAA,EAAG,KAAK,CAAC,CAAA,GAAA,EAAM,GAAA,CAAI,KAAA,CAAM,CAAC,GAAG,CAAC,CAAA,CAAA;AACpD;AAEO,SAAS,iBAAA,CAAkB,KAAA,EAAyC,QAAA,GAAW,EAAA,EAAI,YAAY,CAAA,EAAG;AACvG,EAAA,IAAI,KAAA,KAAU,MAAA,IAAa,KAAA,KAAU,IAAA,EAAM,OAAO,GAAA;AAClD,EAAA,MAAM,GAAA,GAAM,OAAO,KAAA,KAAU,QAAA,GAAW,YAAY,KAAA,EAAO,QAAQ,CAAA,GAAI,MAAA,CAAO,KAAK,CAAA;AACnF,EAAA,OAAO,IAAI,QAAQ,GAAG,CAAA,CAAE,gBAAgB,SAAA,EAAW,OAAA,CAAQ,UAAU,CAAA,CAAE,QAAA,EAAS;AAClF;AAEO,SAAS,gBAAA,CAAiB,KAAA,EAAe,QAAA,GAAW,EAAA,EAAI;AAC7D,EAAA,IAAI,CAAC,eAAA,CAAgB,IAAA,CAAK,KAAA,CAAM,IAAA,EAAM,CAAA,EAAG;AACvC,IAAA,MAAM,IAAI,MAAM,yBAAyB,CAAA;AAAA,EAC3C;AACA,EAAA,OAAO,UAAA,CAAW,KAAA,IAAS,GAAA,EAAK,QAAQ,CAAA;AAC1C;AAEO,SAAS,gBAAA,CAAiB,KAAA,EAAgC,SAAA,GAAY,CAAA,EAAG;AAC9E,EAAA,IAAI,KAAA,KAAU,MAAA,IAAa,KAAA,KAAU,IAAA,EAAM,OAAO,GAAA;AAClD,EAAA,OAAO,CAAA,EAAG,IAAI,OAAA,CAAQ,MAAA,CAAO,KAAK,CAAC,CAAA,CAAE,GAAA,CAAI,GAAG,CAAA,CAAE,eAAA,CAAgB,SAAS,CAAA,CAAE,UAAU,CAAA,CAAA,CAAA;AACrF;AAEO,SAAS,gBAAgB,YAAA,EAAuB;AACrD,EAAA,IAAI,CAAC,cAAc,OAAO,GAAA;AAC1B,EAAA,MAAM,OAAO,IAAA,CAAK,GAAA,CAAI,GAAG,YAAA,GAAe,IAAA,CAAK,KAAK,CAAA;AAClD,EAAA,MAAM,YAAA,GAAe,IAAA,CAAK,KAAA,CAAM,IAAA,GAAO,GAAI,CAAA;AAC3C,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,YAAA,GAAe,KAAK,CAAA;AAC5C,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAO,YAAA,GAAe,QAAS,IAAI,CAAA;AACtD,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAO,YAAA,GAAe,OAAQ,EAAE,CAAA;AACrD,EAAA,MAAM,UAAU,YAAA,GAAe,EAAA;AAC/B,EAAA,IAAI,IAAA,GAAO,GAAG,OAAO,CAAA,EAAG,IAAI,CAAA,EAAA,EAAK,KAAK,KAAK,OAAO,CAAA,CAAA,CAAA;AAClD,EAAA,IAAI,KAAA,GAAQ,GAAG,OAAO,CAAA,EAAG,KAAK,CAAA,EAAA,EAAK,OAAO,KAAK,OAAO,CAAA,CAAA,CAAA;AACtD,EAAA,OAAO,CAAA,EAAG,OAAO,CAAA,EAAA,EAAK,OAAO,CAAA,CAAA,CAAA;AAC/B;;;ACpCA,IAAM,kCAAA,GAAqC,qBAAA;AAEpC,IAAM,eAAA,GAAN,cAA8B,KAAA,CAAM;AAAA,EAGzC,WAAA,CAAY,SAAiB,MAAA,EAAiB;AAC5C,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,iBAAA;AACZ,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AAAA,EAChB;AACF;AAEA,SAAS,kBAAA,CAAmB,KAAU,MAAA,EAAiC;AACrE,EAAA,KAAA,MAAW,CAAC,KAAK,KAAK,CAAA,IAAK,OAAO,OAAA,CAAQ,MAAA,IAAU,EAAE,CAAA,EAAG;AACvD,IAAA,GAAA,CAAI,YAAA,CAAa,GAAA,CAAI,GAAA,EAAK,KAAK,CAAA;AAAA,EACjC;AACF;AAEA,SAAS,kBAAkB,SAAA,EAAsD;AAC/E,EAAA,OAAO,OAAO,SAAA,KAAc,QAAA,GAAW,EAAE,QAAA,EAAU,WAAU,GAAI,SAAA;AACnE;AAEO,SAAS,mBAAA,CAAoB,QAAA,EAAkB,MAAA,EAAiC,YAAA,GAAe,kCAAA,EAAoC;AACxI,EAAA,MAAM,cAAA,GAAiB,YAAA,CAAa,OAAA,CAAQ,MAAA,EAAQ,EAAE,CAAA;AACtD,EAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,CAAA,EAAG,cAAc,IAAI,kBAAA,CAAmB,QAAQ,CAAC,CAAA,CAAA,EAAI,kBAAkB,CAAA;AAC3F,EAAA,kBAAA,CAAmB,KAAK,MAAM,CAAA;AAC9B,EAAA,OAAO,CAAA,EAAG,GAAA,CAAI,QAAQ,CAAA,EAAG,IAAI,MAAM,CAAA,CAAA;AACrC;AAEA,eAAsB,eAAA,CAAmB;AAAA,EACvC,QAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAA,EAKe;AACb,EAAA,MAAM,iBAAiB,OAAO,MAAA,KAAW,WAAA,GAAc,MAAA,CAAO,SAAS,MAAA,GAAS,kBAAA;AAChF,EAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,QAAA,EAAU,cAAc,CAAA;AAC5C,EAAA,kBAAA,CAAmB,KAAK,MAAM,CAAA;AAE9B,EAAA,MAAM,WAAW,MAAA,CAAO,SAAA,IAAa,KAAA,EAAO,GAAA,CAAI,UAAS,EAAG;AAAA,IAC1D,KAAA,EAAO,UAAA;AAAA,IACP,OAAA;AAAA,IACA,MAAA,EAAQ;AAAA,GACT,CAAA;AAED,EAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,IAAA,MAAM,IAAI,eAAA,CAAgB,CAAA,wBAAA,EAA2B,SAAS,MAAM,CAAA,CAAA,CAAA,EAAK,SAAS,MAAM,CAAA;AAAA,EAC1F;AAEA,EAAA,OAAQ,MAAM,SAAS,IAAA,EAAK;AAC9B;AAEA,eAAsB,sBAAA,CAA0B;AAAA,EAC9C,SAAA;AAAA,EACA,MAAA;AAAA,EACA;AACF,CAAA,EAIe;AACb,EAAA,MAAM,mBAAA,GAAsB,kBAAkB,SAAS,CAAA;AACvD,EAAA,MAAM,cAAA,GACJ,mBAAA,CAAoB,aAAA,IAAiB,mBAAA,CAAoB,aAAA,CAAc,SACnE,MAAA,CAAO,WAAA,CAAY,MAAA,CAAO,OAAA,CAAQ,MAAA,IAAU,EAAE,CAAA,CAAE,MAAA,CAAO,CAAC,CAAC,GAAG,CAAA,KAAM,mBAAA,CAAoB,aAAA,EAAe,QAAA,CAAS,GAAG,CAAC,CAAC,CAAA,GACnH,MAAA;AAEN,EAAA,OAAO,eAAA,CAAmB;AAAA,IACxB,UAAU,mBAAA,CAAoB,QAAA;AAAA,IAC9B,MAAA,EAAQ,cAAA;AAAA,IACR,SAAA;AAAA,IACA,SAAS,mBAAA,CAAoB;AAAA,GAC9B,CAAA;AACH;AAEO,SAAS,uBAAA,CAAwB,OAAA,GAA+D,EAAC,EAAiB;AACvH,EAAA,MAAM,YAAA,GAAe,QAAQ,YAAA,IAAgB,kCAAA;AAC7C,EAAA,MAAM,YAAY,OAAA,CAAQ,SAAA;AAE1B,EAAA,OAAO,eAAe,eAAA,CAAmB,EAAE,QAAA,EAAU,QAAO,EAAkC;AAC5F,IAAA,OAAO,eAAA,CAAmB;AAAA,MACxB,QAAA,EAAU,mBAAA,CAAoB,QAAA,EAAU,MAAA,EAAQ,YAAY,CAAA;AAAA,MAC5D;AAAA,KACD,CAAA;AAAA,EACH,CAAA;AACF;ACzFO,SAAS,MAAM,MAAA,EAAsB;AAC1C,EAAA,OAAO,OAAA,CAAQ,IAAA,CAAK,MAAM,CAAC,CAAA;AAC7B;;;ACCA,IAAM,SAAA,GAAuC;AAAA,EAC3C,IAAA,EAAM,8CAAA;AAAA,EACN,OAAA,EAAS,iDAAA;AAAA,EACT,OAAA,EAAS,iDAAA;AAAA,EACT,MAAA,EAAQ;AACV,CAAA;AAEA,IAAM,OAAA,GAAU;AAAA,EACd,IAAA,EAAM,IAAA;AAAA,EACN,OAAA,EAAS,YAAA;AAAA,EACT,OAAA,EAAS,aAAA;AAAA,EACT,MAAA,EAAQ;AACV,CAAA;AAEO,SAAS,MAAM,EAAE,QAAA,EAAU,IAAA,GAAO,MAAA,EAAQ,WAAU,EAAkE;AAC3H,EAAA,MAAM,IAAA,GAAO,QAAQ,IAAI,CAAA;AACzB,EAAA,uBACE,KAAA,CAAA,aAAA,CAAC,SAAI,SAAA,EAAW,EAAA,CAAG,kEAAkE,SAAA,CAAU,IAAI,GAAG,SAAS,CAAA,EAAA,sCAC5G,IAAA,EAAA,EAAK,SAAA,EAAU,sCAAqC,CAAA,kBACrD,KAAA,CAAA,aAAA,CAAC,SAAI,SAAA,EAAU,qBAAA,EAAA,EAAuB,QAAS,CACjD,CAAA;AAEJ;ACtBA,IAAM,cAAA,GAAiB,GAAA;AAAA,EACrB,qPAAA;AAAA,EACA;AAAA,IACE,QAAA,EAAU;AAAA,MACR,OAAA,EAAS;AAAA,QACP,OAAA,EAAS,qHAAA;AAAA,QACT,SAAA,EAAW,oEAAA;AAAA,QACX,OAAA,EAAS,+FAAA;AAAA,QACT,KAAA,EAAO,oDAAA;AAAA,QACP,WAAA,EAAa;AAAA,OACf;AAAA,MACA,IAAA,EAAM;AAAA,QACJ,OAAA,EAAS,WAAA;AAAA,QACT,EAAA,EAAI,kBAAA;AAAA,QACJ,EAAA,EAAI,WAAA;AAAA,QACJ,IAAA,EAAM;AAAA;AACR,KACF;AAAA,IACA,eAAA,EAAiB;AAAA,MACf,OAAA,EAAS,SAAA;AAAA,MACT,IAAA,EAAM;AAAA;AACR;AAEJ,CAAA;AAOA,IAAM,MAAA,GAAeA,MAAA,CAAA,UAAA;AAAA,EACnB,CAAC,EAAE,SAAA,EAAW,OAAA,EAAS,MAAM,OAAA,GAAU,KAAA,EAAO,OAAA,GAAU,KAAA,EAAO,QAAA,EAAU,QAAA,EAAU,GAAG,KAAA,IAAS,GAAA,KAAQ;AACrG,IAAA,MAAM,IAAA,GAAO,UAAU,IAAA,GAAO,QAAA;AAC9B,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,uBACEA,MAAA,CAAA,aAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAW,EAAA,CAAG,eAAe,EAAE,OAAA,EAAS,IAAA,EAAM,SAAA,EAAW,CAAC,CAAA,EAAG,GAAA,EAAW,GAAG,SAC9E,QACH,CAAA;AAAA,IAEJ;AACA,IAAA,uBACEA,MAAA,CAAA,aAAA;AAAA,MAAC,IAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAW,GAAG,cAAA,CAAe,EAAE,SAAS,IAAA,EAAM,SAAA,EAAW,CAAC,CAAA;AAAA,QAC1D,GAAA;AAAA,QACA,UAAU,QAAA,IAAY,OAAA;AAAA,QACrB,GAAG;AAAA,OAAA;AAAA,MAEH,OAAA,mBAAUA,MAAA,CAAA,aAAA,CAAC,OAAA,EAAA,EAAQ,SAAA,EAAU,wBAAuB,CAAA,GAAK,IAAA;AAAA,MACzD;AAAA,KACH;AAAA,EAEJ;AACF,CAAA;AACA,MAAA,CAAO,WAAA,GAAc,QAAA;ACxDrB,IAAM,IAAA,GAAa,kBAAiE,CAAC,EAAE,WAAW,GAAG,KAAA,IAAS,GAAA,qBAC5G,MAAA,CAAA,aAAA;AAAA,EAAC,KAAA;AAAA,EAAA;AAAA,IACC,GAAA;AAAA,IACA,SAAA,EAAW,EAAA;AAAA,MACT,uGAAA;AAAA,MACA;AAAA,KACF;AAAA,IACC,GAAG;AAAA;AACN,CACD,CAAA;AACD,IAAA,CAAK,WAAA,GAAc,MAAA;AAEnB,IAAM,UAAA,GAAmB,MAAA,CAAA,UAAA;AAAA,EACvB,CAAC,EAAE,SAAA,EAAW,GAAG,KAAA,IAAS,GAAA,qBACxB,MAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,GAAA,EAAU,WAAW,EAAA,CAAG,2BAAA,EAA6B,SAAS,CAAA,EAAI,GAAG,KAAA,EAAO;AAErF,CAAA;AACA,UAAA,CAAW,WAAA,GAAc,YAAA;AAEzB,IAAM,SAAA,GAAkB,MAAA,CAAA,UAAA;AAAA,EACtB,CAAC,EAAE,SAAA,EAAW,GAAG,KAAA,IAAS,GAAA,qBACxB,MAAA,CAAA,aAAA,CAAC,IAAA,EAAA,EAAG,GAAA,EAAU,WAAW,EAAA,CAAG,gEAAA,EAAkE,SAAS,CAAA,EAAI,GAAG,KAAA,EAAO;AAEzH,CAAA;AACA,SAAA,CAAU,WAAA,GAAc,WAAA;AAExB,IAAM,eAAA,GAAwB,MAAA,CAAA,UAAA;AAAA,EAC5B,CAAC,EAAE,SAAA,EAAW,GAAG,KAAA,IAAS,GAAA,qBACxB,MAAA,CAAA,aAAA,CAAC,GAAA,EAAA,EAAE,GAAA,EAAU,WAAW,EAAA,CAAG,kCAAA,EAAoC,SAAS,CAAA,EAAI,GAAG,KAAA,EAAO;AAE1F,CAAA;AACA,eAAA,CAAgB,WAAA,GAAc,iBAAA;AAE9B,IAAM,WAAA,GAAoB,MAAA,CAAA,UAAA;AAAA,EACxB,CAAC,EAAE,SAAA,EAAW,GAAG,KAAA,IAAS,GAAA,qBAAQ,MAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,GAAA,EAAU,WAAW,EAAA,CAAG,UAAA,EAAY,SAAS,CAAA,EAAI,GAAG,KAAA,EAAO;AACpG,CAAA;AACA,WAAA,CAAY,WAAA,GAAc,aAAA;AClC1B,IAAM,KAAA,GAAcC,kBAAyC,CAAC,EAAE,WAAW,GAAG,KAAA,IAAS,GAAA,qBACrFA,MAAA,CAAA,aAAA;AAAA,EAAC,OAAA;AAAA,EAAA;AAAA,IACC,GAAA;AAAA,IACA,SAAA,EAAW,EAAA;AAAA,MACT,udAAA;AAAA,MACA;AAAA,KACF;AAAA,IACC,GAAG;AAAA;AACN,CACD,CAAA;AACD,KAAA,CAAM,WAAA,GAAc,OAAA;;;ACAb,IAAM,YAAA,GAAe;AA2DrB,SAAS,eAAe,KAAA,EAAyC;AACtE,EAAA,OAAO,OAAA,CAAQ,KAAA,IAAS,qBAAA,CAAsB,IAAA,CAAK,KAAK,CAAC,CAAA;AAC3D;AAMO,SAAS,aAAA,CAAc,GAAmB,CAAA,EAAmB;AAClE,EAAA,OAAO,OAAA,CAAQ,KAAK,CAAA,IAAK,CAAA,CAAE,aAAY,KAAM,CAAA,CAAE,aAAa,CAAA;AAC9D;AA2HO,SAAS,sBAAA,CAAuB,UAAwC,KAAA,EAAuD;AACpI,EAAA,MAAM,QAAA,GAAW,SAAS,KAAA,CAAM,QAAA;AAChC,EAAA,IAAI,CAAC,QAAA,CAAS,MAAA,EAAQ,OAAO,IAAA;AAE7B,EAAA,MAAM,aAAA,GAAgB,CAAC,UAAA,KAAuC;AAC5D,IAAA,IAAI,UAAA,CAAW,MAAA,KAAW,CAAA,EAAG,OAAO,WAAW,CAAC,CAAA;AAChD,IAAA,OAAO,IAAA;AAAA,EACT,CAAA;AAEA,EAAA,MAAM,YAAA,GAAe,CAAC,OAAA,KAAkC,CAAC,MAAM,OAAA,IAAW,OAAA,CAAQ,YAAY,KAAA,CAAM,OAAA;AACpG,EAAA,MAAM,eAAe,CAAC,OAAA,KACpB,CAAC,KAAA,CAAM,YAAA,IAAgB,CAAC,OAAA,CAAQ,cAAA,EAAgB,UAAU,OAAA,CAAQ,cAAA,CAAe,KAAK,CAAC,OAAA,KAAY,cAAc,OAAA,EAAS,KAAA,CAAM,YAAY,CAAC,CAAA;AAC/I,EAAA,MAAM,oBAAA,GAAuB,CAAC,OAAA,KAAkC,CAAC,QAAQ,cAAA,IAAkB,OAAA,CAAQ,OAAA,CAAQ,cAAA,EAAgB,MAAM,CAAA;AAEjI,EAAA,IAAI,MAAM,cAAA,EAAgB;AACxB,IAAA,MAAM,YAAA,GAAe,aAAA;AAAA,MACnB,SAAS,MAAA,CAAO,CAAC,YAAY,YAAA,CAAa,OAAO,KAAK,OAAA,CAAQ,OAAA,CAAQ,cAAc,CAAA,IAAK,aAAA,CAAc,QAAQ,cAAA,EAAgB,KAAA,CAAM,cAAc,CAAA,IAAK,YAAA,CAAa,OAAO,CAAC;AAAA,KAC/K;AACA,IAAA,IAAI,YAAA,IAAgB,CAAC,KAAA,CAAM,YAAA,EAAc,OAAO,YAAA;AAAA,EAClD;AAEA,EAAA,IAAI,MAAM,YAAA,EAAc;AACtB,IAAA,MAAM,UAAA,GAAa,aAAA;AAAA,MACjB,QAAA,CAAS,MAAA;AAAA,QACP,CAAC,YACC,YAAA,CAAa,OAAO,KACpB,oBAAA,CAAqB,OAAO,CAAA,IAC5B,OAAA,CAAQ,OAAA,CAAQ,cAAA,EAAgB,KAAK,CAAC,OAAA,KAAY,cAAc,OAAA,EAAS,KAAA,CAAM,YAAY,CAAC,CAAC,CAAA,IAC7F,YAAA,CAAa,OAAO;AAAA;AACxB,KACF;AACA,IAAA,IAAI,YAAY,OAAO,UAAA;AAAA,EACzB;AAEA,EAAA,IAAI,KAAA,CAAM,cAAA,IAAkB,KAAA,CAAM,YAAA,EAAc;AAC9C,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,IAAI,MAAM,OAAA,EAAS;AACjB,IAAA,OAAO,aAAA,CAAc,QAAA,CAAS,MAAA,CAAO,CAAC,OAAA,KAAY,OAAA,CAAQ,OAAA,KAAY,KAAA,CAAM,OAAA,IAAW,YAAA,CAAa,OAAO,CAAC,CAAC,CAAA;AAAA,EAC/G;AAEA,EAAA,IAAI,MAAM,YAAA,EAAc;AACtB,IAAA,OAAO,cAAc,QAAA,CAAS,MAAA,CAAO,CAAC,OAAA,KAAY,QAAQ,cAAA,EAAgB,IAAA,CAAK,CAAC,OAAA,KAAY,cAAc,OAAA,EAAS,KAAA,CAAM,YAAY,CAAC,CAAC,CAAC,CAAA;AAAA,EAC1I;AAEA,EAAA,OAAO,IAAA;AACT;AA6DO,SAAS,wBAAwB,SAAA,EAAoD;AAC1F,EAAA,IAAI,CAAC,SAAA,EAAW,MAAA,EAAQ,OAAO,SAAA;AAC/B,EAAA,OAAO,SAAA,CAAU,MAAA,IAAU,CAAA,GAAI,YAAA,GAAe,iBAAA;AAChD;AAEO,SAAS,sBAAsB,SAAA,EAAkC;AACtE,EAAA,OAAO,OAAA,CAAQ,SAAA,EAAW,MAAA,IAAU,SAAA,CAAU,UAAU,CAAA;AAC1D;AAEO,SAAS,yBAAA,CAA0B,KAAA,EAAgC,WAAA,GAAgC,SAAA,EAAW;AACnH,EAAA,IAAI,KAAA,KAAU,aAAa,OAAO,KAAA;AAClC,EAAA,IAAI,KAAA,KAAU,QAAQ,OAAO,IAAA;AAC7B,EAAA,IAAI,WAAA,KAAgB,WAAW,OAAO,KAAA;AACtC,EAAA,OAAO,KAAA,KAAU,WAAA;AACnB;AAkCO,SAAS,wBAAwB,IAAA,EAAsD;AAC5F,EAAA,MAAM,YAAY,IAAA,EAAM,SAAA;AACxB,EAAA,MAAM,WAAA,GAAc,IAAA,EAAM,WAAA,IAAe,uBAAA,CAAwB,SAAS,CAAA;AAC1E,EAAA,MAAM,WAAW,IAAA,EAAM,QAAA,IAAY,QAAQ,SAAA,IAAa,SAAA,CAAU,UAAU,CAAC,CAAA;AAC7E,EAAA,MAAM,UAAA,GAAa,WAAW,UAAA,KAAe,IAAA;AAE7C,EAAA,OAAO;AAAA,IACL,SAAA;AAAA,IACA,OAAA,EAAS,MAAM,OAAA,IAAW,IAAA;AAAA,IAC1B,SAAA,EAAW,MAAM,SAAA,IAAa,IAAA;AAAA,IAC9B,OAAA,EAAS,MAAM,OAAA,IAAW,SAAA;AAAA,IAC1B,aAAA,EAAe,MAAM,aAAA,IAAiB,aAAA;AAAA,IACtC,WAAW,IAAA,EAAM,SAAA;AAAA,IACjB,SAAA,EAAW,MAAM,SAAA,IAAa,KAAA;AAAA,IAC9B,WAAA;AAAA,IACA,QAAA;AAAA,IACA,UAAA;AAAA,IACA,2BAAA,EAA6B,sBAAsB,SAAS;AAAA,GAC9D;AACF;;;AC3XA,IAAM,WAAA,GAAc,4CAAA;AAEb,SAAS,iBAAiB,OAAA,EAAiB;AAChD,EAAA,IAAI,OAAA,KAAY,IAAI,OAAO,qBAAA;AAC3B,EAAA,IAAI,OAAA,KAAY,IAAI,OAAO,6BAAA;AAC3B,EAAA,OAAO,MAAA;AACT;AAEO,SAAS,mBAAmB,OAAA,EAAiB;AAClD,EAAA,IAAI,OAAA,KAAY,IAAI,OAAO,WAAA;AAC3B,EAAA,IAAI,OAAA,KAAY,IAAI,OAAO,aAAA;AAC3B,EAAA,OAAO,SAAS,OAAO,CAAA,CAAA;AACzB;AAEA,SAAS,wBAAwB,KAAA,EAAgE;AAC/F,EAAA,MAAM,oBAAoB,KAAA,CAAM,iBAAA;AAChC,EAAA,MAAM,mBAAmB,KAAA,CAAM,gBAAA;AAE/B,EAAA,OAAO;AAAA,IACL,GAAI,iBAAA,GACA;AAAA,MACE,mBAAmB,iBAAA,CAAkB,MAAA;AAAA,MACrC,mBAAmB,iBAAA,CAAkB,MAAA;AAAA,MACrC,0BAA0B,iBAAA,CAAkB,aAAA;AAAA,MAC5C,qBAAqB,iBAAA,CAAkB;AAAA,QAEzC,EAAC;AAAA,IACL,GAAI,iBAAA,EAAmB,YAAA,EAAc,WAAA,IAAe,EAAC;AAAA,IACrD,GAAI,gBAAA,EAAkB,WAAA,IAAe;AAAC,GACxC;AACF;AAEO,SAAS,0BAA0B,KAAA,EAA4D;AACpG,EAAA,MAAM,mBAAmB,KAAA,CAAM,gBAAA;AAC/B,EAAA,MAAM,eAAA,GAAkB,sBAAA,CAAuB,KAAA,CAAM,QAAA,EAAU;AAAA,IAC7D,SAAS,gBAAA,EAAkB,OAAA,IAAW,MAAM,gBAAA,IAAoB,KAAA,CAAM,mBAAmB,SAAA,CAAU,OAAA;AAAA,IACnG,cAAA,EAAgB,gBAAA,EAAkB,cAAA,IAAkB,KAAA,CAAM,mBAAmB,SAAA,CAAU,cAAA;AAAA,IACvF,YAAA,EAAc,gBAAA,EAAkB,YAAA,IAAgB,KAAA,CAAM,mBAAmB,SAAA,CAAU,YAAA;AAAA,IACnF,YAAA,EAAc,gBAAA,EAAkB,YAAA,IAAgB,KAAA,CAAM,mBAAmB,SAAA,CAAU;AAAA,GACpF,CAAA;AACD,EAAA,MAAM,mBACJ,gBAAA,EAAkB,OAAA,IAAW,KAAA,CAAM,iBAAA,EAAmB,UAAU,OAAA,IAAW,KAAA,CAAM,gBAAA,IAAoB,eAAA,EAAiB,WAAW,KAAA,CAAM,QAAA,CAAS,MAAM,QAAA,CAAS,CAAC,GAAG,OAAA,IAAW,EAAA;AAEhL,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,gBAAA;AAAA,IACT,cAAA,EAAgB,kBAAkB,cAAA,IAAkB,KAAA,CAAM,mBAAmB,SAAA,CAAU,cAAA,IAAkB,iBAAiB,cAAA,IAAkB,WAAA;AAAA,IAC5I,cAAc,gBAAA,EAAkB,YAAA,IAAgB,KAAA,CAAM,iBAAA,EAAmB,UAAU,YAAA,IAAgB,WAAA;AAAA,IACnG,cAAc,gBAAA,EAAkB,YAAA,IAAgB,KAAA,CAAM,iBAAA,EAAmB,UAAU,YAAA,IAAgB,WAAA;AAAA,IACnG,aAAa,gBAAA,EAAkB,WAAA;AAAA,IAC/B,WAAA,EAAa,gBAAA,EAAkB,WAAA,IAAe,KAAA,CAAM,iBAAA,EAAmB,WAAA;AAAA,IACvE,SAAA,EAAW,gBAAA,EAAkB,SAAA,IAAa,KAAA,CAAM,iBAAA,EAAmB,SAAA;AAAA,IACnE,aAAA,EAAe,gBAAA,EAAkB,aAAA,IAAiB,KAAA,CAAM,iBAAA,EAAmB,aAAA;AAAA,IAC3E,eAAA,EAAiB,gBAAA,EAAkB,eAAA,IAAmB,gBAAA,CAAiB,gBAAgB,CAAA;AAAA,IACvF,YAAA,EAAc,gBAAA,EAAkB,YAAA,IAAgB,KAAA,CAAM,iBAAA,EAAmB,YAAA;AAAA,IACzE,IAAA,EAAM,gBAAA,EAAkB,IAAA,IAAQ,KAAA,CAAM,iBAAA,EAAmB,IAAA;AAAA,IACzD,WAAA,EAAa,wBAAwB,KAAK,CAAA;AAAA,IAC1C,UAAU,KAAA,CAAM;AAAA,GAClB;AACF;;;ACpCA,IAAM,cAAA,GAAiB,cAAmC,IAAI,CAAA;AAmB9D,SAAS,WAAA,CAAY,OAAe,MAAA,EAA0C;AAC5E,EAAA,IAAI,CAAC,QAAQ,OAAO,KAAA;AACpB,EAAA,OAAO,MAAA,CAAO,QAAQ,MAAM,CAAA,CAAE,OAAO,CAAC,GAAA,EAAK,CAAC,GAAA,EAAK,IAAI,MAAM,GAAA,CAAI,UAAA,CAAW,IAAI,GAAG,CAAA,CAAA,CAAA,EAAK,OAAO,IAAI,CAAC,GAAG,KAAK,CAAA;AAC5G;AAEA,SAAS,wBAAA,CAAyB,aAAkD,QAAA,EAAkB;AACpG,EAAA,MAAM,kBAAkB,WAAA,EAAa,eAAA;AACrC,EAAA,IAAI,CAAC,mBAAmB,OAAO,eAAA,KAAoB,YAAY,KAAA,CAAM,OAAA,CAAQ,eAAe,CAAA,EAAG,OAAO,MAAA;AACtG,EAAA,MAAM,QAAA,GAAY,gBAA4C,QAAQ,CAAA;AACtE,EAAA,OAAO,OAAO,QAAA,KAAa,QAAA,GAAW,QAAA,GAAW,MAAA;AACnD;AAEO,SAAS,oBAAA,CAAqB,EAAE,QAAA,EAAU,QAAA,EAAU,IAAA,EAAM,cAAA,EAAgB,gBAAA,EAAkB,iBAAA,EAAmB,MAAA,GAAS,IAAA,EAAM,YAAA,EAAa,EAAyB;AACzK,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIC,SAAS,CAAC,CAAA;AACxC,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,QAAAA,CAAsB,EAAE,CAAA;AACxD,EAAA,MAAM,cAAA,GAAiB,MAAA,iBAA4B,IAAI,GAAA,EAAK,CAAA;AAC5D,EAAA,MAAM,EAAE,OAAA,EAAS,cAAA,EAAgB,WAAA,KAAgB,UAAA,EAAW;AAC5D,EAAA,MAAM,mBAAmB,UAAA,EAAW;AACpC,EAAA,MAAM,EAAE,OAAA,EAAS,UAAA,EAAW,GAAI,UAAA,EAAW;AAC3C,EAAA,MAAM,EAAE,UAAA,EAAW,GAAI,aAAA,EAAc;AACrC,EAAA,MAAM,EAAE,gBAAA,EAAkB,SAAA,EAAW,gBAAA,KAAqB,cAAA,EAAe;AACzE,EAAA,MAAM,gBAAA,GAAmB,gBAAA,EAAkB,OAAA,IAAW,iBAAA,EAAmB,SAAA,CAAU,OAAA,IAAW,gBAAA,IAAoB,QAAA,CAAS,KAAA,CAAM,QAAA,CAAS,CAAC,CAAA,EAAG,OAAA,IAAW,EAAA;AACzJ,EAAA,MAAM,YAAA,GAAe,eAAA,CAAgB,EAAE,OAAA,EAAS,kBAAkB,CAAA;AAClE,EAAA,MAAM,EAAE,IAAA,EAAM,YAAA,EAAa,GAAI,eAAA,EAAgB;AAC/C,EAAA,MAAM,EAAE,IAAA,EAAM,aAAA,EAAc,GAAI,UAAA,CAAW,EAAE,OAAA,EAAS,cAAA,EAAgB,OAAA,EAAS,WAAA,GAAc,gBAAA,GAAmB,MAAA,EAAW,CAAA;AAE3H,EAAA,MAAM,cAAA,GAAiB,WAAA,CAAY,CAAC,EAAA,KAAe;AACjD,IAAA,MAAM,OAAA,GAAU,cAAA,CAAe,OAAA,CAAQ,GAAA,CAAI,EAAE,CAAA;AAC7C,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,MAAA,CAAO,aAAa,OAAO,CAAA;AAC3B,MAAA,cAAA,CAAe,OAAA,CAAQ,OAAO,EAAE,CAAA;AAAA,IAClC;AACA,IAAA,WAAA,CAAY,CAAC,UAAU,KAAA,CAAM,MAAA,CAAO,CAAC,IAAA,KAAS,IAAA,CAAK,EAAA,KAAO,EAAE,CAAC,CAAA;AAAA,EAC/D,CAAA,EAAG,EAAE,CAAA;AAEL,EAAAC,UAAU,MAAM;AACd,IAAA,MAAM,SAAS,cAAA,CAAe,OAAA;AAC9B,IAAA,OAAO,MAAM;AACX,MAAA,KAAA,MAAW,OAAA,IAAW,MAAA,CAAO,MAAA,EAAO,EAAG;AACrC,QAAA,MAAA,CAAO,aAAa,OAAO,CAAA;AAAA,MAC7B;AACA,MAAA,MAAA,CAAO,KAAA,EAAM;AAAA,IACf,CAAA;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,cAAA,GAAiBC,QAA6B,MAAM;AACxD,IAAA,OAAO,yBAAA,CAA0B;AAAA,MAC/B,QAAA;AAAA,MACA,gBAAA;AAAA,MACA,iBAAA;AAAA,MACA,gBAAA,EAAkB;AAAA,QAChB,GAAG,gBAAA;AAAA,QACH,WAAA,EAAa,kBAAkB,WAAA,IAAe;AAAA;AAChD,KACD,CAAA;AAAA,EACH,GAAG,CAAC,cAAA,EAAgB,kBAAkB,iBAAA,EAAmB,QAAA,EAAU,gBAAgB,CAAC,CAAA;AAEpF,EAAA,MAAM,OAAA,GAAUA,OAAAA;AAAA,IACd,OAAO;AAAA,MACL,MAAA;AAAA,MACA,CAAA,CAAE,GAAA,EAAK,QAAA,EAAU,MAAA,EAAQ;AACvB,QAAA,MAAM,aAAA,GAAgB,QAAA,CAAS,IAAA,CAAK,CAAC,CAAA;AACrC,QAAA,MAAM,QAAA,GAAW,IAAA,CAAK,MAAM,CAAA,GAAI,GAAG,CAAA,IAAK,IAAA,CAAK,aAAa,CAAA,GAAI,GAAG,CAAA,IAAK,IAAA,CAAK,EAAA,GAAK,GAAG,KAAK,QAAA,IAAY,GAAA;AACpG,QAAA,OAAO,WAAA,CAAY,UAAU,MAAM,CAAA;AAAA,MACrC;AAAA,KACF,CAAA;AAAA,IACA,CAAC,IAAA,EAAM,MAAA,EAAQ,QAAA,CAAS,IAAI;AAAA,GAC9B;AAEA,EAAA,MAAM,IAAA,GAAO,WAAA;AAAA,IACX,CAAC,OAAmB,OAAA,KAAoB;AACtC,MAAA,MAAM,EAAA,GAAK,KAAK,GAAA,EAAI,GAAI,KAAK,KAAA,CAAM,IAAA,CAAK,MAAA,EAAO,GAAI,GAAI,CAAA;AACvD,MAAA,WAAA,CAAY,CAAC,KAAA,KAAU,CAAC,EAAE,IAAI,KAAA,EAAO,OAAA,EAAQ,EAAG,GAAG,KAAK,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA;AACrE,MAAA,MAAM,OAAA,GAAU,MAAA,CAAO,UAAA,CAAW,MAAM;AACtC,QAAA,cAAA,CAAe,EAAE,CAAA;AAAA,MACnB,GAAG,IAAI,CAAA;AACP,MAAA,cAAA,CAAe,OAAA,CAAQ,GAAA,CAAI,EAAA,EAAI,OAAO,CAAA;AAAA,IACxC,CAAA;AAAA,IACA,CAAC,cAAc;AAAA,GACjB;AAEA,EAAA,MAAM,MAAA,GAASA,OAAAA;AAAA,IACb,OAAO;AAAA,MACL,IAAA,EAAM,CAAC,OAAA,KAAY,IAAA,CAAK,QAAQ,OAAO,CAAA;AAAA,MACvC,OAAA,EAAS,CAAC,OAAA,KAAY,IAAA,CAAK,WAAW,OAAO,CAAA;AAAA,MAC7C,OAAA,EAAS,CAAC,OAAA,KAAY,IAAA,CAAK,WAAW,OAAO,CAAA;AAAA,MAC7C,KAAA,EAAO,CAAC,OAAA,KAAY,IAAA,CAAK,SAAS,OAAO;AAAA,KAC3C,CAAA;AAAA,IACA,CAAC,IAAI;AAAA,GACP;AAEA,EAAA,MAAM,MAAA,GAASA,OAAAA;AAAA,IACb,OAAO;AAAA,MACL,OAAA,EAAS,cAAA;AAAA,MACT,OAAA,EAAS,cAAc,gBAAA,GAAmB,MAAA;AAAA,MAC1C,UAAA,EAAY,WAAA,GAAc,kBAAA,CAAmB,gBAAgB,CAAA,GAAI,MAAA;AAAA,MACjE,iBAAiB,cAAA,CAAe,OAAA;AAAA,MAChC,kBAAA,EAAoB,kBAAA,CAAmB,cAAA,CAAe,OAAO,CAAA;AAAA,MAC7D,WAAA;AAAA,MACA,cAAA,EAAgB,OAAA,CAAQ,WAAA,IAAe,gBAAA,KAAqB,eAAe,OAAO,CAAA;AAAA,MAClF,cAAA,EAAgB,QAAQ,gBAAgB,CAAA;AAAA,MACxC,gBAAA;AAAA;AAAA,MAEA,SAAS,aAAA,GAAgBC,WAAAA,CAAY,cAAc,KAAA,EAAO,aAAA,CAAc,QAAQ,CAAA,GAAI,GAAA;AAAA;AAAA;AAAA,MAGpF,SAAS,MAAM;AACb,QAAA,MAAM,SAAA,GAAY,WAAW,CAAC,CAAA;AAC9B,QAAA,IAAI,SAAA,EAAW,OAAA,CAAQ,EAAE,SAAA,EAAW,CAAA;AAAA,MACtC,CAAA;AAAA,MACA,UAAA,EAAY,MAAM,UAAA,EAAW;AAAA,MAC7B,aAAa,YAAY;AACvB,QAAA,IAAI,CAAC,gBAAA,EAAkB;AACrB,UAAA,MAAM,IAAI,KAAA,CAAM,CAAA,iBAAA,EAAoB,mBAAmB,cAAA,CAAe,OAAO,CAAC,CAAA,mBAAA,CAAqB,CAAA;AAAA,QACrG;AACA,QAAA,MAAM,gBAAA,CAAiB,EAAE,OAAA,EAAS,cAAA,CAAe,SAAS,CAAA;AAAA,MAC5D;AAAA,KACF,CAAA;AAAA,IACA,CAAC,cAAA,EAAgB,OAAA,EAAS,gBAAA,EAAkB,UAAA,EAAY,UAAA,EAAY,WAAA,EAAa,gBAAA,EAAkB,aAAA,EAAe,cAAA,CAAe,OAAA,EAAS,gBAAgB;AAAA,GAC5J;AAEA,EAAA,MAAM,sBAAA,GAAyB,WAAA;AAAA,IAC7B,CAAC,WAAA,KAAwB;AACvB,MAAA,IAAI,CAAC,cAAA,EAAgB,MAAM,IAAI,MAAM,0BAA0B,CAAA;AAC/D,MAAA,IAAI,WAAA,IAAe,gBAAA,KAAqB,cAAA,CAAe,OAAA,EAAS;AAC9D,QAAA,MAAM,IAAI,MAAM,CAAA,gCAAA,EAAmC,kBAAA,CAAmB,eAAe,OAAO,CAAC,CAAA,QAAA,EAAW,WAAW,CAAA,CAAA,CAAG,CAAA;AAAA,MACxH;AAAA,IACF,CAAA;AAAA,IACA,CAAC,cAAA,EAAgB,gBAAA,EAAkB,WAAA,EAAa,eAAe,OAAO;AAAA,GACxE;AAEA,EAAA,MAAM,YAAA,GAAe,WAAA;AAAA,IACnB,OAAW,OAAA,KAA6C;AACtD,MAAA,IAAI,CAAC,YAAA,IAAgB,CAAC,QAAQ,GAAA,IAAO,CAAC,QAAQ,OAAA,EAAS;AACrD,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,cAAA,EAAiB,OAAA,CAAQ,YAAY,CAAA,4CAAA,CAA8C,CAAA;AAAA,MACrG;AACA,MAAA,OAAQ,MAAM,aAAa,YAAA,CAAa;AAAA,QACtC,SAAS,OAAA,CAAQ,OAAA;AAAA,QACjB,KAAK,OAAA,CAAQ,GAAA;AAAA,QACb,cAAc,OAAA,CAAQ,YAAA;AAAA,QACtB,MAAM,OAAA,CAAQ;AAAA,OACf,CAAA;AAAA,IACH,CAAA;AAAA,IACA,CAAC,YAAY;AAAA,GACf;AAEA,EAAA,MAAM,gBAAA,GAAmB,WAAA;AAAA,IACvB,OAAO,OAAA,KAA2D;AAChE,MAAA,sBAAA,CAAuB,CAAA,WAAA,EAAc,OAAA,CAAQ,YAAY,CAAA,CAAE,CAAA;AAC3D,MAAA,IAAI,CAAC,YAAA,IAAgB,CAAC,QAAQ,GAAA,IAAO,CAAC,QAAQ,OAAA,EAAS;AACrD,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,oBAAA,EAAuB,OAAA,CAAQ,YAAY,CAAA,4CAAA,CAA8C,CAAA;AAAA,MAC3G;AACA,MAAA,MAAM,UAAA,GAAa,MAAM,YAAA,CAAa,gBAAA,CAAiB;AAAA,QACrD,OAAA,EAAS,cAAA;AAAA,QACT,SAAS,OAAA,CAAQ,OAAA;AAAA,QACjB,KAAK,OAAA,CAAQ,GAAA;AAAA,QACb,cAAc,OAAA,CAAQ,YAAA;AAAA,QACtB,MAAM,OAAA,CAAQ,IAAA;AAAA,QACd,OAAO,OAAA,CAAQ;AAAA,OAChB,CAAA;AACD,MAAA,OAAO,EAAE,OAAA,EAAS,MAAA,EAAQ,UAAA,CAAW,MAAA,EAAO;AAAA,IAC9C,CAAA;AAAA,IACA,CAAC,cAAA,EAAgB,sBAAA,EAAwB,YAAY;AAAA,GACvD;AAEA,EAAA,MAAM,aAAA,GAAgB,WAAA;AAAA,IACpB,OAAO,OAAA,KAAoD;AACzD,MAAA,sBAAA,CAAuB,CAAA,QAAA,EAAW,OAAA,CAAQ,YAAY,CAAA,CAAE,CAAA;AACxD,MAAA,IAAI,CAAC,YAAA,IAAgB,CAAC,QAAQ,GAAA,IAAO,CAAC,QAAQ,OAAA,EAAS;AACrD,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,eAAA,EAAkB,OAAA,CAAQ,YAAY,CAAA,4CAAA,CAA8C,CAAA;AAAA,MACtG;AACA,MAAA,MAAM,IAAA,GAAO,MAAM,YAAA,CAAa,aAAA,CAAc;AAAA,QAC5C,SAAS,OAAA,CAAQ,OAAA;AAAA,QACjB,KAAK,OAAA,CAAQ,GAAA;AAAA,QACb,cAAc,OAAA,CAAQ,YAAA;AAAA,QACtB,MAAM,OAAA,CAAQ,IAAA;AAAA,QACd,OAAO,OAAA,CAAQ;AAAA,OAChB,CAAA;AACD,MAAA,OAAO,IAAA;AAAA,IACT,CAAA;AAAA,IACA,CAAC,wBAAwB,YAAY;AAAA,GACvC;AAEA,EAAA,MAAM,SAAA,GAAY,WAAA;AAAA,IAChB,OAAO,IAAA,KAAsC;AAC3C,MAAA,IAAI,CAAC,YAAA,EAAc,MAAM,IAAI,MAAM,+CAA+C,CAAA;AAClF,MAAA,MAAM,UAAU,MAAM,YAAA,CAAa,yBAAA,CAA0B,EAAE,MAAM,CAAA;AACrE,MAAA,OAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,QAAQ,MAAA,KAAW,SAAA,GAAY,YAAY,UAAA,EAAW;AAAA,IAC/E,CAAA;AAAA,IACA,CAAC,YAAY;AAAA,GACf;AAEA,EAAA,MAAM,UAAA,GAAa,WAAA;AAAA,IACjB,OAAW,UAAkB,MAAA,KAAgD;AAC3E,MAAA,IAAI,YAAA,EAAc;AAChB,QAAA,OAAO,YAAA,CAAgB;AAAA,UACrB,QAAA;AAAA,UACA,MAAA;AAAA,UACA,OAAA,EAAS;AAAA,SACV,CAAA;AAAA,MACH;AAEA,MAAA,MAAM,QAAA,GAAW,wBAAA,CAAyB,cAAA,CAAe,WAAA,EAAa,QAAQ,CAAA;AAC9E,MAAA,IAAI,CAAC,QAAA,EAAU,MAAM,IAAI,KAAA,CAAM,CAAA,OAAA,EAAU,QAAQ,CAAA,mCAAA,CAAqC,CAAA;AAEtF,MAAA,OAAO,eAAA,CAAmB;AAAA,QACxB,QAAA;AAAA,QACA;AAAA,OACD,CAAA;AAAA,IACH,CAAA;AAAA,IACA,CAAC,cAAc,cAAc;AAAA,GAC/B;AAEA,EAAA,MAAM,OAAA,GAAU,YAAY,YAAY;AACtC,IAAA,UAAA,CAAW,CAAC,IAAA,KAAS,IAAA,GAAO,CAAC,CAAA;AAAA,EAC/B,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,cAAA,GAAiB,WAAA;AAAA,IACrB,CAAC,IAAA,KAAkB;AACjB,MAAA,IAAI,CAAC,eAAe,eAAA,EAAiB;AACrC,MAAA,MAAA,CAAO,IAAA,CAAK,CAAA,EAAG,cAAA,CAAe,eAAA,CAAgB,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAC,CAAA,IAAA,EAAO,IAAI,CAAA,CAAA,EAAI,QAAA,EAAU,YAAY,CAAA;AAAA,IACvG,CAAA;AAAA,IACA,CAAC,eAAe,eAAe;AAAA,GACjC;AAEA,EAAA,MAAM,GAAA,GAAMD,OAAAA;AAAA,IACV,OAAO;AAAA,MACL,OAAA,EAAS,cAAA;AAAA,MACT,IAAA,EAAM,OAAA;AAAA,MACN,MAAA;AAAA,MACA,MAAA;AAAA,MACA,YAAA;AAAA,MACA,gBAAA;AAAA,MACA,aAAA;AAAA,MACA,SAAA;AAAA,MACA,UAAA;AAAA,MACA,OAAA;AAAA,MACA,YAAA,EAAc,OAAA;AAAA,MACd;AAAA,KACF,CAAA;AAAA,IACA,CAAC,OAAA,EAAS,MAAA,EAAQ,cAAA,EAAgB,YAAA,EAAc,UAAA,EAAY,OAAA,EAAS,cAAA,EAAgB,gBAAA,EAAkB,OAAA,EAAS,SAAA,EAAW,MAAA,EAAQ,aAAa;AAAA,GAClJ;AAEA,EAAA,uBACE,KAAA,CAAA,aAAA,CAAC,eAAe,QAAA,EAAf,EAAwB,OAAO,GAAA,EAAA,EAC7B,QAAA,sCACA,KAAA,EAAA,EAAI,SAAA,EAAU,yGACZ,QAAA,CAAS,GAAA,CAAI,CAAC,OAAA,qBACb,KAAA,CAAA,aAAA,CAAC,SAAI,GAAA,EAAK,OAAA,CAAQ,EAAA,EAAI,SAAA,EAAU,qBAAA,EAAA,kBAC9B,KAAA,CAAA,aAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAM,OAAA,CAAQ,KAAA,KAAU,OAAA,GAAU,WAAW,OAAA,CAAQ,KAAA;AAAA,MACrD,SAAA,EAAU;AAAA,KAAA;AAAA,oBAEV,KAAA,CAAA,aAAA,CAAC,QAAA,EAAA,EAAO,IAAA,EAAK,QAAA,EAAS,SAAA,EAAU,kBAAA,EAAmB,OAAA,EAAS,MAAM,cAAA,CAAe,OAAA,CAAQ,EAAE,CAAA,EAAA,EACxF,QAAQ,OACX;AAAA,GAEJ,CACD,CACH,CACF,CAAA;AAEJ;AAEO,SAAS,UAAA,GAAa;AAC3B,EAAA,MAAM,GAAA,GAAM,WAAW,cAAc,CAAA;AACrC,EAAA,IAAI,CAAC,GAAA,EAAK,MAAM,IAAI,MAAM,sDAAsD,CAAA;AAChF,EAAA,OAAO,GAAA;AACT;AAEO,SAAS,eAAA,GAAkB;AAChC,EAAA,OAAO,YAAW,CAAE,OAAA;AACtB;AAEO,SAAS,WAAA,GAAc;AAC5B,EAAA,OAAO,YAAW,CAAE,IAAA;AACtB;AAEO,SAAS,aAAA,GAAgB;AAC9B,EAAA,OAAO,YAAW,CAAE,MAAA;AACtB;;;AChUA,IAAM,eAAA,GAA+C;AAAA,EACnD,YAAA,EAAc,kCAAA;AAAA,EACd,kBAAA,EAAoB,mDAAA;AAAA,EACpB,YAAA,EAAc,0EAAA;AAAA,EACd,iBAAA,EAAmB,2DAAA;AAAA,EACnB,gBAAA,EAAkB,4CAAA;AAAA,EAClB,QAAA,EAAU,yCAAA;AAAA,EACV,OAAA,EAAS;AACX,CAAA;AAEA,SAAS,SAAS,KAAA,EAAkD;AAClE,EAAA,OAAO,OAAA,CAAQ,KAAK,CAAA,IAAK,OAAO,KAAA,KAAU,QAAA;AAC5C;AAEA,SAAS,WAAW,KAAA,EAAgB;AAClC,EAAA,OAAO,OAAO,KAAA,KAAU,QAAA,GAAW,KAAA,GAAQ,EAAA;AAC7C;AAEA,SAAS,gBAAgB,KAAA,EAAgB,KAAA,GAAQ,GAAG,IAAA,mBAAO,IAAI,KAAa,EAAa;AACvF,EAAA,IAAI,KAAA,GAAQ,KAAK,KAAA,IAAS,IAAA,IAAQ,KAAK,GAAA,CAAI,KAAK,CAAA,EAAG,OAAO,EAAC;AAC3D,EAAA,IAAA,CAAK,IAAI,KAAK,CAAA;AAEd,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,EAAU,OAAO,CAAC,KAAK,CAAA;AAC5C,EAAA,IAAI,CAAC,QAAA,CAAS,KAAK,CAAA,SAAU,EAAC;AAE9B,EAAA,MAAM,QAAA,GAAW;AAAA,IACf,UAAA,CAAW,MAAM,YAAY,CAAA;AAAA,IAC7B,UAAA,CAAW,MAAM,OAAO,CAAA;AAAA,IACxB,UAAA,CAAW,MAAM,OAAO,CAAA;AAAA,IACxB,UAAA,CAAW,MAAM,MAAM;AAAA,GACzB,CAAE,OAAO,OAAO,CAAA;AAEhB,EAAA,OAAO,CAAC,GAAG,QAAA,EAAU,GAAG,eAAA,CAAgB,MAAM,KAAA,EAAO,KAAA,GAAQ,CAAA,EAAG,IAAI,CAAC,CAAA;AACvE;AAEA,SAAS,aAAa,KAAA,EAAgB,KAAA,GAAQ,GAAG,IAAA,mBAAO,IAAI,KAAa,EAA2B;AAClG,EAAA,IAAI,KAAA,GAAQ,KAAK,KAAA,IAAS,IAAA,IAAQ,KAAK,GAAA,CAAI,KAAK,CAAA,EAAG,OAAO,EAAC;AAC3D,EAAA,IAAA,CAAK,IAAI,KAAK,CAAA;AACd,EAAA,IAAI,CAAC,QAAA,CAAS,KAAK,CAAA,SAAU,EAAC;AAE9B,EAAA,MAAM,KAAA,GAAQ,CAAC,KAAA,CAAM,IAAA,EAAM,MAAM,IAAI,CAAA,CAAE,MAAA,CAAO,CAAC,UAAU,OAAO,KAAA,KAAU,QAAA,IAAY,OAAO,UAAU,QAAQ,CAAA;AAC/G,EAAA,OAAO,CAAC,GAAG,KAAA,EAAO,GAAG,YAAA,CAAa,MAAM,KAAA,EAAO,KAAA,GAAQ,CAAA,EAAG,IAAI,CAAC,CAAA;AACjE;AAEO,SAAS,eAAe,KAAA,EAA6B;AAC1D,EAAA,MAAM,UAAU,eAAA,CAAgB,KAAK,EAAE,IAAA,CAAK,GAAG,EAAE,WAAA,EAAY;AAC7D,EAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,KAAK,CAAA,CAC7B,IAAI,CAAC,KAAA,KAA2B,MAAA,CAAO,KAAK,CAAA,CAAE,WAAA,EAAa,CAAA,CAC3D,KAAK,GAAG,CAAA;AAEX,EAAA,IACE,KAAA,CAAM,QAAA,CAAS,MAAM,CAAA,IACrB,MAAM,QAAA,CAAS,iBAAiB,CAAA,IAChC,KAAA,CAAM,SAAS,0BAA0B,CAAA,IACzC,+FAAA,CAAgG,IAAA,CAAK,OAAO,CAAA,EAC5G;AACA,IAAA,OAAO,cAAA;AAAA,EACT;AAEA,EAAA,IAAI,qFAAA,CAAsF,IAAA,CAAK,OAAO,CAAA,EAAG;AACvG,IAAA,OAAO,oBAAA;AAAA,EACT;AAEA,EAAA,IAAI,kEAAA,CAAmE,IAAA,CAAK,OAAO,CAAA,EAAG;AACpF,IAAA,OAAO,cAAA;AAAA,EACT;AAEA,EAAA,IAAI,+DAAA,CAAgE,IAAA,CAAK,OAAO,CAAA,EAAG;AACjF,IAAA,OAAO,mBAAA;AAAA,EACT;AAEA,EAAA,IAAI,0EAAA,CAA2E,IAAA,CAAK,OAAO,CAAA,EAAG;AAC5F,IAAA,OAAO,kBAAA;AAAA,EACT;AAEA,EAAA,IAAI,qGAAA,CAAsG,IAAA,CAAK,OAAO,CAAA,EAAG;AACvH,IAAA,OAAO,UAAA;AAAA,EACT;AAEA,EAAA,OAAO,SAAA;AACT;AAEO,SAAS,aAAA,CAAc,OAAgB,QAAA,EAA8B;AAC1E,EAAA,MAAM,IAAA,GAAO,eAAe,KAAK,CAAA;AACjC,EAAA,OAAO,QAAA,GAAW,IAAI,CAAA,IAAK,eAAA,CAAgB,IAAI,CAAA;AACjD;;;ACvFO,SAAS,aAAA,GAAgB;AAC9B,EAAA,OAAO,YAAW,CAAE,MAAA;AACtB","file":"sdk.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 { 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 { type ClassValue, clsx } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","import { AlertTriangle, CheckCircle2, Info } from \"lucide-react\";\nimport { ReactNode } from \"react\";\nimport { cn } from \"./utils\";\n\ntype AlertTone = \"info\" | \"success\" | \"warning\" | \"danger\";\n\nconst toneClass: Record<AlertTone, string> = {\n info: \"border-[#3f5f8f] bg-[#17243a] text-[#d8e2ef]\",\n success: \"border-[#35d39d]/35 bg-[#173c39] text-[#8ff4c8]\",\n warning: \"border-[#f2c94c]/35 bg-[#42381f] text-[#fff0b8]\",\n danger: \"border-[#ff6b6b]/35 bg-[#4a1f27] text-[#ffc4c4]\",\n};\n\nconst iconMap = {\n info: Info,\n success: CheckCircle2,\n warning: AlertTriangle,\n danger: AlertTriangle,\n};\n\nexport function Alert({ children, tone = \"info\", className }: { children: ReactNode; tone?: AlertTone; className?: string }) {\n const Icon = iconMap[tone];\n return (\n <div className={cn(\"flex gap-3 rounded-md border p-3 text-sm font-medium leading-6\", toneClass[tone], className)}>\n <Icon className=\"mt-0.5 h-4 w-4 shrink-0 opacity-90\" />\n <div className=\"min-w-0 break-words\">{children}</div>\n </div>\n );\n}\n","import * as React from \"react\";\nimport { Slot } from \"@radix-ui/react-slot\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { Loader2 } from \"lucide-react\";\nimport { cn } from \"./utils\";\n\nconst buttonVariants = cva(\n \"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-semibold transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[#4a90ff]/60 disabled:pointer-events-none disabled:opacity-50\",\n {\n variants: {\n variant: {\n default: \"border border-[#4a90ff]/60 bg-[#315fb5] text-white shadow-[inset_0_1px_0_rgba(255,255,255,0.16)] hover:bg-[#3b70d6]\",\n secondary: \"border border-[#3a4d66] bg-[#304057] text-white hover:bg-[#3a4c65]\",\n outline: \"border border-[#3d6ba8] bg-[#17243a] text-[#d8e8ff] hover:border-[#559cff] hover:bg-[#1d3150]\",\n ghost: \"text-[#a8b5c7] hover:bg-[#304057] hover:text-white\",\n destructive: \"bg-destructive text-destructive-foreground hover:bg-destructive/90\",\n },\n size: {\n default: \"h-10 px-4\",\n sm: \"h-8 px-3 text-xs\",\n lg: \"h-12 px-5\",\n icon: \"h-10 w-10\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n },\n);\n\nexport interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement>, VariantProps<typeof buttonVariants> {\n asChild?: boolean;\n loading?: boolean;\n}\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n ({ className, variant, size, asChild = false, loading = false, disabled, children, ...props }, ref) => {\n const Comp = asChild ? Slot : \"button\";\n if (asChild) {\n return (\n <Comp className={cn(buttonVariants({ variant, size, className }))} ref={ref} {...props}>\n {children}\n </Comp>\n );\n }\n return (\n <Comp\n className={cn(buttonVariants({ variant, size, className }))}\n ref={ref}\n disabled={disabled || loading}\n {...props}\n >\n {loading ? <Loader2 className=\"h-4 w-4 animate-spin\" /> : null}\n {children}\n </Comp>\n );\n },\n);\nButton.displayName = \"Button\";\n\nexport { Button, buttonVariants };\n","import * as React from \"react\";\nimport { cn } from \"./utils\";\n\nconst Card = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\n \"rounded-lg border border-[#3a4d66] bg-[#1d2938] text-white shadow-panel shadow-black/30 backdrop-blur\",\n className,\n )}\n {...props}\n />\n));\nCard.displayName = \"Card\";\n\nconst CardHeader = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div ref={ref} className={cn(\"flex flex-col gap-1.5 p-5\", className)} {...props} />\n ),\n);\nCardHeader.displayName = \"CardHeader\";\n\nconst CardTitle = React.forwardRef<HTMLHeadingElement, React.HTMLAttributes<HTMLHeadingElement>>(\n ({ className, ...props }, ref) => (\n <h3 ref={ref} className={cn(\"text-lg font-semibold leading-tight tracking-normal text-white\", className)} {...props} />\n ),\n);\nCardTitle.displayName = \"CardTitle\";\n\nconst CardDescription = React.forwardRef<HTMLParagraphElement, React.HTMLAttributes<HTMLParagraphElement>>(\n ({ className, ...props }, ref) => (\n <p ref={ref} className={cn(\"text-sm leading-6 text-[#a8b5c7]\", className)} {...props} />\n ),\n);\nCardDescription.displayName = \"CardDescription\";\n\nconst CardContent = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => <div ref={ref} className={cn(\"p-5 pt-0\", className)} {...props} />,\n);\nCardContent.displayName = \"CardContent\";\n\nexport { Card, CardContent, CardDescription, CardHeader, CardTitle };\n","import * as React from \"react\";\nimport { cn } from \"./utils\";\n\nexport interface InputProps extends React.InputHTMLAttributes<HTMLInputElement> {}\n\nconst Input = React.forwardRef<HTMLInputElement, InputProps>(({ className, ...props }, ref) => (\n <input\n ref={ref}\n className={cn(\n \"flex h-11 w-full rounded-md border border-[#aebdd0] bg-[#101827] px-3 py-2 text-sm font-semibold text-white caret-white shadow-[inset_0_1px_0_rgba(255,255,255,0.05)] outline-none transition-colors selection:bg-[#4a90ff]/45 selection:text-white placeholder:text-[#7f8ca0] focus:border-[#64a7ff] focus:bg-[#132033] focus:ring-2 focus:ring-[#4a90ff]/30 disabled:cursor-not-allowed disabled:border-[#40536c] disabled:bg-[#1d2938] disabled:text-[#8d9caf] disabled:opacity-80\",\n className,\n )}\n {...props}\n />\n));\nInput.displayName = \"Input\";\n\nexport { Input };\n","import type {\n ActionAvailabilityStage,\n Address,\n FeeMode,\n FlapFeeVaultInfo,\n FlapTaxInfo,\n FlapTokenInfo,\n FlapVaultPortalInfo,\n ManifestBindingEntry,\n TokenMarketPhase,\n VaultHostContext,\n VaultManifest,\n VaultRenderSurface,\n} from \"./types\";\n\nexport const ZERO_ADDRESS = \"0x0000000000000000000000000000000000000000\" as Address;\n\ntype TupleLike = (Record<string, unknown> & readonly unknown[]) | Record<string, unknown> | readonly unknown[] | null | undefined;\n\nexport interface VaultBindingPolicy {\n name: string;\n chainId: number;\n factoryAddress?: Address;\n vaultAddresses?: Address[];\n extra?: Record<string, unknown>;\n isAiPowered?: boolean;\n}\n\nexport interface RuntimeMatchInput {\n chainId?: number;\n factoryAddress?: string | null;\n vaultAddress?: string | null;\n tokenAddress?: string | null;\n}\n\nexport interface CreateTaxInfoHostContextInput {\n tokenInfo?: FlapTokenInfo | null;\n taxInfo?: FlapTaxInfo | null;\n vaultInfo?: FlapVaultPortalInfo | null;\n feeMode?: FeeMode | null;\n giftVaultFactory?: string | null;\n hasTaxVaults?: boolean;\n vaultType?: string;\n copyScope?: \"tax\" | \"fee\";\n}\n\nexport interface ResolveRenderSurfaceInput {\n tokenInfo?: FlapTokenInfo | null;\n taxInfo?: FlapTaxInfo | null;\n hasTaxVaults?: boolean;\n isNonTaxFeeToken?: boolean;\n}\n\nexport interface TaxVaultHostSnapshot {\n tokenInfo?: FlapTokenInfo;\n taxInfo?: FlapTaxInfo | null;\n vaultInfo?: FlapVaultPortalInfo | null;\n feeMode: FeeMode;\n renderSurface: VaultRenderSurface;\n vaultType?: string;\n copyScope: \"tax\" | \"fee\";\n marketPhase: TokenMarketPhase;\n isListed: boolean;\n isTaxToken: boolean;\n isSupportedCustomVaultToken: boolean;\n}\n\nexport function getTupleField(data: TupleLike, name: string, index: number) {\n if (!data) return undefined;\n const record = data as Record<string, unknown>;\n const tuple = data as readonly unknown[];\n return record[name] ?? tuple[index];\n}\n\nexport function isValidAddress(value?: string | null): value is Address {\n return Boolean(value && /^0x[a-fA-F0-9]{40}$/.test(value));\n}\n\nexport function normalizeAddress(value?: string | null): Address | undefined {\n return isValidAddress(value) ? (value as Address) : undefined;\n}\n\nexport function isSameAddress(a?: string | null, b?: string | null) {\n return Boolean(a && b && a.toLowerCase() === b.toLowerCase());\n}\n\nfunction toNumber(value: unknown, fallback = 0) {\n if (typeof value === \"bigint\") return Number(value);\n if (typeof value === \"number\") return Number.isFinite(value) ? value : fallback;\n if (typeof value === \"string\" && value.trim()) {\n const parsed = Number(value);\n return Number.isFinite(parsed) ? parsed : fallback;\n }\n return fallback;\n}\n\nfunction toBigInt(value: unknown, fallback = 0n) {\n if (typeof value === \"bigint\") return value;\n if (typeof value === \"number\" && Number.isFinite(value)) return BigInt(Math.trunc(value));\n if (typeof value === \"string\" && value.trim()) {\n try {\n return BigInt(value);\n } catch {\n return fallback;\n }\n }\n return fallback;\n}\n\nfunction toBooleanOrNull(value: unknown) {\n if (typeof value === \"boolean\") return value;\n if (value === null || value === undefined) return null;\n return Boolean(value);\n}\n\nfunction toAddressOrNull(value: unknown): Address | null {\n return typeof value === \"string\" && isValidAddress(value) ? (value as Address) : null;\n}\n\nfunction toStringOrUndefined(value: unknown) {\n return typeof value === \"string\" && value.length > 0 ? value : undefined;\n}\n\nexport function parsePortalTokenInfo(tokenData: TupleLike): FlapTokenInfo | null {\n if (!tokenData) return null;\n\n const status = toNumber(getTupleField(tokenData, \"status\", 0));\n const taxRateRaw = toBigInt(getTupleField(tokenData, \"taxRate\", 12));\n const quoteTokenAddress = toAddressOrNull(getTupleField(tokenData, \"quoteTokenAddress\", 9)) ?? ZERO_ADDRESS;\n\n return {\n exists: status !== 0,\n isTaxToken: taxRateRaw > 0n,\n taxRate: Number(taxRateRaw),\n taxRateRaw,\n quoteTokenAddress,\n status,\n tokenVersion: toNumber(getTupleField(tokenData, \"tokenVersion\", 4)),\n };\n}\n\nexport function parseFeeVaultInfo(vaultInfo: TupleLike): FlapFeeVaultInfo | null {\n if (!vaultInfo) return null;\n\n return {\n addr: toAddressOrNull(getTupleField(vaultInfo, \"addr\", 0)),\n factory: toAddressOrNull(getTupleField(vaultInfo, \"factory\", 1)),\n riskLevel: toNumber(getTupleField(vaultInfo, \"riskLevel\", 2)),\n isOfficialVault: toBooleanOrNull(getTupleField(vaultInfo, \"isOfficialVault\", 3)),\n isVault: toBooleanOrNull(getTupleField(vaultInfo, \"isVault\", 4)),\n isAIConsumer: toBooleanOrNull(getTupleField(vaultInfo, \"isAIConsumer\", 5)),\n };\n}\n\nexport function parseTaxTokenInfo(\n taxInfo: TupleLike,\n taxInfoV2?: TupleLike,\n options: { wrappedNativeTokenAddress?: Address } = {},\n): FlapTaxInfo | null {\n if (!taxInfo) return null;\n\n const quoteToken = toAddressOrNull(getTupleField(taxInfo, \"quoteToken\", 11)) ?? ZERO_ADDRESS;\n const rawDividendToken = toAddressOrNull(getTupleField(taxInfoV2, \"dividendToken\", 11)) ?? quoteToken;\n const dividendToken =\n quoteToken === ZERO_ADDRESS && rawDividendToken === ZERO_ADDRESS && options.wrappedNativeTokenAddress\n ? options.wrappedNativeTokenAddress\n : rawDividendToken;\n\n return {\n marketBps: toNumber(getTupleField(taxInfo, \"marketBps\", 0)),\n deflationBps: toNumber(getTupleField(taxInfo, \"deflationBps\", 1)),\n lpBps: toNumber(getTupleField(taxInfo, \"lpBps\", 2)),\n dividendBps: toNumber(getTupleField(taxInfo, \"dividendBps\", 3)),\n feeRate: toNumber(getTupleField(taxInfo, \"feeRate\", 4)),\n buyTaxRate: taxInfoV2 ? toNumber(getTupleField(taxInfoV2, \"buyTaxRate\", 4)) : undefined,\n sellTaxRate: taxInfoV2 ? toNumber(getTupleField(taxInfoV2, \"sellTaxRate\", 5)) : undefined,\n burntTokenAmount: toBigInt(getTupleField(taxInfo, \"burntTokenAmount\", 5)),\n totalQuoteSentToDividend: toBigInt(getTupleField(taxInfo, \"totalQuoteSentToDividend\", 6)),\n totalQuoteAddedToLiquidity: toBigInt(getTupleField(taxInfo, \"totalQuoteAddedToLiquidity\", 7)),\n totalTokenAddedToLiquidity: toBigInt(getTupleField(taxInfo, \"totalTokenAddedToLiquidity\", 8)),\n totalQuoteSentToMarketing: toBigInt(getTupleField(taxInfo, \"totalQuoteSentToMarketing\", 9)),\n marketingWallet: toAddressOrNull(getTupleField(taxInfo, \"marketingWallet\", 10)) ?? ZERO_ADDRESS,\n dividendToken,\n quoteToken,\n minimumShareBalance: toBigInt(getTupleField(taxInfo, \"minimumShareBalance\", 12)),\n vaultInfo: parseFeeVaultInfo(getTupleField(taxInfoV2, \"vaultInfo\", 14) as TupleLike),\n };\n}\n\nexport function parseVaultPortalInfo(vaultData: TupleLike): FlapVaultPortalInfo | null {\n if (!vaultData) return null;\n\n const found = Boolean(getTupleField(vaultData, \"found\", 0));\n const info = getTupleField(vaultData, \"info\", 1) as TupleLike;\n\n if (!found || !info) return { found: false };\n\n return {\n found: true,\n vault: toAddressOrNull(getTupleField(info, \"vault\", 0)) ?? ZERO_ADDRESS,\n vaultFactory: toAddressOrNull(getTupleField(info, \"vaultFactory\", 1)) ?? ZERO_ADDRESS,\n description: toStringOrUndefined(getTupleField(info, \"description\", 2)),\n isOfficial: Boolean(getTupleField(info, \"isOfficial\", 3)),\n riskLevel: toNumber(getTupleField(info, \"riskLevel\", 4)),\n };\n}\n\nexport function resolveManifestBinding(manifest: Pick<VaultManifest, \"match\">, input: RuntimeMatchInput): ManifestBindingEntry | null {\n const bindings = manifest.match.bindings;\n if (!bindings.length) return null;\n\n const resolveUnique = (candidates: ManifestBindingEntry[]) => {\n if (candidates.length === 1) return candidates[0];\n return null;\n };\n\n const matchesChain = (binding: ManifestBindingEntry) => !input.chainId || binding.chainId === input.chainId;\n const matchesToken = (binding: ManifestBindingEntry) =>\n !input.tokenAddress || !binding.tokenAddresses?.length || binding.tokenAddresses.some((address) => isSameAddress(address, input.tokenAddress));\n const isVaultScopedBinding = (binding: ManifestBindingEntry) => !binding.factoryAddress && Boolean(binding.vaultAddresses?.length);\n\n if (input.factoryAddress) {\n const factoryMatch = resolveUnique(\n bindings.filter((binding) => matchesChain(binding) && Boolean(binding.factoryAddress) && isSameAddress(binding.factoryAddress, input.factoryAddress) && matchesToken(binding)),\n );\n if (factoryMatch || !input.vaultAddress) return factoryMatch;\n }\n\n if (input.vaultAddress) {\n const vaultMatch = resolveUnique(\n bindings.filter(\n (binding) =>\n matchesChain(binding) &&\n isVaultScopedBinding(binding) &&\n Boolean(binding.vaultAddresses?.some((address) => isSameAddress(address, input.vaultAddress))) &&\n matchesToken(binding),\n ),\n );\n if (vaultMatch) return vaultMatch;\n }\n\n if (input.factoryAddress || input.vaultAddress) {\n return null;\n }\n\n if (input.chainId) {\n return resolveUnique(bindings.filter((binding) => binding.chainId === input.chainId && matchesToken(binding)));\n }\n\n if (input.tokenAddress) {\n return resolveUnique(bindings.filter((binding) => binding.tokenAddresses?.some((address) => isSameAddress(address, input.tokenAddress))));\n }\n\n return null;\n}\n\nexport function isManifestRuntimeMatch(manifest: Pick<VaultManifest, \"match\">, input: RuntimeMatchInput) {\n if (!input.chainId || (!input.factoryAddress && !input.vaultAddress)) return false;\n const matchingBinding = resolveManifestBinding(manifest, input);\n if (!matchingBinding) return false;\n if (matchingBinding.chainId !== input.chainId) return false;\n if (matchingBinding.factoryAddress) return isSameAddress(matchingBinding.factoryAddress, input.factoryAddress);\n const vaultAddress = matchingBinding.vaultAddresses?.[0];\n if (!vaultAddress || !isSameAddress(vaultAddress, input.vaultAddress)) return false;\n if (input.tokenAddress && matchingBinding.tokenAddresses?.length) {\n return matchingBinding.tokenAddresses.some((address) => isSameAddress(address, input.tokenAddress));\n }\n return true;\n}\n\nexport function isVaultBindingMatch(binding: VaultBindingPolicy, input: RuntimeMatchInput) {\n if (!input.chainId || binding.chainId !== input.chainId) return false;\n if (binding.factoryAddress) return Boolean(input.factoryAddress && isSameAddress(binding.factoryAddress, input.factoryAddress));\n const vaultAddress = binding.vaultAddresses?.[0];\n if (!vaultAddress || !input.vaultAddress || !isSameAddress(vaultAddress, input.vaultAddress)) return false;\n return true;\n}\n\nexport function resolveVaultBinding(bindings: VaultBindingPolicy[], input: RuntimeMatchInput) {\n return bindings.find((binding) => isVaultBindingMatch(binding, input)) ?? null;\n}\n\nexport function resolveFeeMode(taxInfo: FlapTaxInfo | TupleLike | null | undefined, giftVaultFactory?: string | null): FeeMode {\n if (!taxInfo) return \"unknown\";\n\n const marketBps = toNumber(getTupleField(taxInfo as TupleLike, \"marketBps\", 0));\n const dividendBps = toNumber(getTupleField(taxInfo as TupleLike, \"dividendBps\", 3));\n\n if (dividendBps > 0) return \"holder\";\n if (marketBps <= 0) return \"unknown\";\n\n const parsedVaultInfo =\n \"vaultInfo\" in Object(taxInfo)\n ? (taxInfo as FlapTaxInfo).vaultInfo\n : parseFeeVaultInfo(getTupleField(taxInfo as TupleLike, \"vaultInfo\", 14) as TupleLike);\n\n if (parsedVaultInfo?.isVault === true) {\n return isSameAddress(parsedVaultInfo.factory, giftVaultFactory) ? \"gift\" : \"unknown\";\n }\n\n return \"creator\";\n}\n\nexport function resolveTaxInfoRenderSurface({\n tokenInfo,\n taxInfo,\n hasTaxVaults = false,\n isNonTaxFeeToken = false,\n}: ResolveRenderSurfaceInput): VaultRenderSurface {\n if (!tokenInfo?.exists) return \"unavailable\";\n if (!tokenInfo.isTaxToken) return isNonTaxFeeToken ? \"feeinfo\" : \"unavailable\";\n if (taxInfo?.marketBps === 10000 && hasTaxVaults) return \"vault-taxinfo\";\n return \"standard-taxinfo\";\n}\n\nexport function resolveTokenMarketPhase(tokenInfo?: FlapTokenInfo | null): TokenMarketPhase {\n if (!tokenInfo?.exists) return \"unknown\";\n return tokenInfo.status >= 2 ? \"dex-listed\" : \"internal-market\";\n}\n\nexport function isCustomVaultTaxToken(tokenInfo?: FlapTokenInfo | null) {\n return Boolean(tokenInfo?.exists && tokenInfo.isTaxToken);\n}\n\nexport function isActionAvailableForPhase(stage: ActionAvailabilityStage, marketPhase: TokenMarketPhase = \"unknown\") {\n if (stage === \"read-only\") return false;\n if (stage === \"both\") return true;\n if (marketPhase === \"unknown\") return false;\n return stage === marketPhase;\n}\n\nexport function createTaxInfoHostContext({\n tokenInfo,\n taxInfo,\n vaultInfo,\n feeMode,\n giftVaultFactory,\n hasTaxVaults,\n vaultType,\n copyScope = \"tax\",\n}: CreateTaxInfoHostContextInput): VaultHostContext {\n const resolvedFeeMode = feeMode ?? resolveFeeMode(taxInfo, giftVaultFactory);\n const renderSurface = resolveTaxInfoRenderSurface({\n tokenInfo,\n taxInfo,\n hasTaxVaults: hasTaxVaults ?? Boolean(vaultInfo?.found),\n isNonTaxFeeToken: copyScope === \"fee\",\n });\n const marketPhase = resolveTokenMarketPhase(tokenInfo);\n\n return {\n tokenInfo: tokenInfo ?? undefined,\n taxInfo: taxInfo ?? null,\n vaultInfo: vaultInfo ?? null,\n feeMode: resolvedFeeMode,\n renderSurface,\n vaultType,\n copyScope,\n isListed: tokenInfo ? tokenInfo.status >= 2 : undefined,\n marketPhase,\n };\n}\n\nexport function readTaxVaultHostContext(host?: VaultHostContext | null): TaxVaultHostSnapshot {\n const tokenInfo = host?.tokenInfo;\n const marketPhase = host?.marketPhase ?? resolveTokenMarketPhase(tokenInfo);\n const isListed = host?.isListed ?? Boolean(tokenInfo && tokenInfo.status >= 2);\n const isTaxToken = tokenInfo?.isTaxToken === true;\n\n return {\n tokenInfo,\n taxInfo: host?.taxInfo ?? null,\n vaultInfo: host?.vaultInfo ?? null,\n feeMode: host?.feeMode ?? \"unknown\",\n renderSurface: host?.renderSurface ?? \"unavailable\",\n vaultType: host?.vaultType,\n copyScope: host?.copyScope ?? \"tax\",\n marketPhase,\n isListed,\n isTaxToken,\n isSupportedCustomVaultToken: isCustomVaultTaxToken(tokenInfo),\n };\n}\n","import { resolveManifestBinding } from \"./taxInfo\";\nimport type { Address, CreateVaultRuntimeContextInput, VaultRuntimeContext, VaultRuntimeExtraConfig } from \"./types\";\n\nconst zeroAddress = \"0x0000000000000000000000000000000000000000\" as Address;\n\nexport function explorerForChain(chainId: number) {\n if (chainId === 56) return \"https://bscscan.com\";\n if (chainId === 97) return \"https://testnet.bscscan.com\";\n return undefined;\n}\n\nexport function chainLabelForChain(chainId: number) {\n if (chainId === 56) return \"BNB Chain\";\n if (chainId === 97) return \"BNB Testnet\";\n return `Chain ${chainId}`;\n}\n\nfunction buildRuntimeExtraConfig(input: CreateVaultRuntimeContextInput): VaultRuntimeExtraConfig {\n const hostRuntimeResult = input.hostRuntimeResult;\n const runtimeOverrides = input.runtimeOverrides;\n\n return {\n ...(hostRuntimeResult\n ? {\n hostRuntimeStatus: hostRuntimeResult.status,\n hostRuntimePolicy: hostRuntimeResult.policy,\n hostRuntimeDegradeReason: hostRuntimeResult.degradeReason,\n hostRuntimeWarnings: hostRuntimeResult.warnings,\n }\n : {}),\n ...(hostRuntimeResult?.presentation?.extraConfig ?? {}),\n ...(runtimeOverrides?.extraConfig ?? {}),\n };\n}\n\nexport function createVaultRuntimeContext(input: CreateVaultRuntimeContextInput): VaultRuntimeContext {\n const runtimeOverrides = input.runtimeOverrides;\n const resolvedBinding = resolveManifestBinding(input.manifest, {\n chainId: runtimeOverrides?.chainId ?? input.connectedChainId ?? input.hostRuntimeResult?.addresses.chainId,\n factoryAddress: runtimeOverrides?.factoryAddress ?? input.hostRuntimeResult?.addresses.factoryAddress,\n vaultAddress: runtimeOverrides?.vaultAddress ?? input.hostRuntimeResult?.addresses.vaultAddress,\n tokenAddress: runtimeOverrides?.tokenAddress ?? input.hostRuntimeResult?.addresses.tokenAddress,\n });\n const effectiveChainId =\n runtimeOverrides?.chainId ?? input.hostRuntimeResult?.addresses.chainId ?? input.connectedChainId ?? resolvedBinding?.chainId ?? input.manifest.match.bindings[0]?.chainId ?? 56;\n\n return {\n chainId: effectiveChainId,\n factoryAddress: runtimeOverrides?.factoryAddress ?? input.hostRuntimeResult?.addresses.factoryAddress ?? resolvedBinding?.factoryAddress ?? zeroAddress,\n tokenAddress: runtimeOverrides?.tokenAddress ?? input.hostRuntimeResult?.addresses.tokenAddress ?? zeroAddress,\n vaultAddress: runtimeOverrides?.vaultAddress ?? input.hostRuntimeResult?.addresses.vaultAddress ?? zeroAddress,\n userAddress: runtimeOverrides?.userAddress,\n tokenSymbol: runtimeOverrides?.tokenSymbol ?? input.hostRuntimeResult?.tokenSymbol,\n tokenName: runtimeOverrides?.tokenName ?? input.hostRuntimeResult?.tokenName,\n tokenImageUrl: runtimeOverrides?.tokenImageUrl ?? input.hostRuntimeResult?.tokenImageUrl,\n explorerBaseUrl: runtimeOverrides?.explorerBaseUrl ?? explorerForChain(effectiveChainId),\n paymentToken: runtimeOverrides?.paymentToken ?? input.hostRuntimeResult?.paymentToken,\n host: runtimeOverrides?.host ?? input.hostRuntimeResult?.host,\n extraConfig: buildRuntimeExtraConfig(input),\n manifest: input.manifest,\n };\n}\n","\"use client\";\n\nimport { createContext, ReactNode, useCallback, useContext, useEffect, useMemo, useRef, useState } from \"react\";\nimport { useAccount, useBalance, useChainId, useConnect, useDisconnect, usePublicClient, useSwitchChain, useWalletClient } from \"wagmi\";\nimport { formatUnits } from \"viem\";\nimport { Alert } from \"@/src/ui\";\nimport type {\n Address,\n ContractReadRequest,\n ContractWriteRequest,\n FlapI18n,\n FlapNotify,\n FlapWallet,\n FlapVaultSdk,\n HostRuntimeResult,\n OracleReader,\n SimulateResult,\n TxReceipt,\n VaultManifest,\n VaultRuntimeContext,\n VaultRuntimeContextOverrides,\n} from \"./types\";\nimport { chainLabelForChain, createVaultRuntimeContext } from \"./runtimeContext\";\nimport { fetchOracleJson } from \"./oracle\";\n\nconst RuntimeContext = createContext<FlapVaultSdk | null>(null);\ntype ToastLevel = \"info\" | \"success\" | \"warning\" | \"error\";\n\ninterface ToastItem {\n id: number;\n level: ToastLevel;\n message: string;\n}\n\ninterface RuntimeProviderProps {\n children: ReactNode;\n manifest: VaultManifest;\n i18n: Record<string, Record<string, string>>;\n runtimeContext?: VaultRuntimeContextOverrides;\n hostRuntimeResult?: HostRuntimeResult | null;\n locale?: string;\n oracleReader?: OracleReader;\n}\n\nfunction applyParams(value: string, params?: Record<string, string | number>) {\n if (!params) return value;\n return Object.entries(params).reduce((acc, [key, item]) => acc.replaceAll(`{${key}}`, String(item)), value);\n}\n\nfunction getPreviewOracleEndpoint(extraConfig: Record<string, unknown> | undefined, oracleId: string) {\n const oracleEndpoints = extraConfig?.oracleEndpoints;\n if (!oracleEndpoints || typeof oracleEndpoints !== \"object\" || Array.isArray(oracleEndpoints)) return undefined;\n const endpoint = (oracleEndpoints as Record<string, unknown>)[oracleId];\n return typeof endpoint === \"string\" ? endpoint : undefined;\n}\n\nexport function VaultRuntimeProvider({ children, manifest, i18n, runtimeContext: runtimeOverrides, hostRuntimeResult, locale = \"en\", oracleReader }: RuntimeProviderProps) {\n const [version, setVersion] = useState(0);\n const [messages, setMessages] = useState<ToastItem[]>([]);\n const toastTimersRef = useRef<Map<number, number>>(new Map());\n const { address: accountAddress, isConnected } = useAccount();\n const connectedChainId = useChainId();\n const { connect, connectors } = useConnect();\n const { disconnect } = useDisconnect();\n const { switchChainAsync, isPending: isSwitchingChain } = useSwitchChain();\n const effectiveChainId = runtimeOverrides?.chainId ?? hostRuntimeResult?.addresses.chainId ?? connectedChainId ?? manifest.match.bindings[0]?.chainId ?? 56;\n const publicClient = usePublicClient({ chainId: effectiveChainId });\n const { data: walletClient } = useWalletClient();\n const { data: nativeBalance } = useBalance({ address: accountAddress, chainId: isConnected ? connectedChainId : undefined });\n\n const dismissMessage = useCallback((id: number) => {\n const timerId = toastTimersRef.current.get(id);\n if (timerId) {\n window.clearTimeout(timerId);\n toastTimersRef.current.delete(id);\n }\n setMessages((items) => items.filter((item) => item.id !== id));\n }, []);\n\n useEffect(() => {\n const timers = toastTimersRef.current;\n return () => {\n for (const timerId of timers.values()) {\n window.clearTimeout(timerId);\n }\n timers.clear();\n };\n }, []);\n\n const runtimeContext = useMemo<VaultRuntimeContext>(() => {\n return createVaultRuntimeContext({\n manifest,\n connectedChainId,\n hostRuntimeResult,\n runtimeOverrides: {\n ...runtimeOverrides,\n userAddress: runtimeOverrides?.userAddress ?? accountAddress,\n },\n });\n }, [accountAddress, connectedChainId, hostRuntimeResult, manifest, runtimeOverrides]);\n\n const i18nApi = useMemo<FlapI18n>(\n () => ({\n locale,\n t(key, fallback, params) {\n const defaultLocale = manifest.i18n[0];\n const resolved = i18n[locale]?.[key] ?? i18n[defaultLocale]?.[key] ?? i18n.en?.[key] ?? fallback ?? key;\n return applyParams(resolved, params);\n },\n }),\n [i18n, locale, manifest.i18n],\n );\n\n const push = useCallback(\n (level: ToastLevel, message: string) => {\n const id = Date.now() + Math.floor(Math.random() * 1000);\n setMessages((items) => [{ id, level, message }, ...items].slice(0, 4));\n const timerId = window.setTimeout(() => {\n dismissMessage(id);\n }, 4200);\n toastTimersRef.current.set(id, timerId);\n },\n [dismissMessage],\n );\n\n const notify = useMemo<FlapNotify>(\n () => ({\n info: (message) => push(\"info\", message),\n success: (message) => push(\"success\", message),\n warning: (message) => push(\"warning\", message),\n error: (message) => push(\"error\", message),\n }),\n [push],\n );\n\n const wallet = useMemo<FlapWallet>(\n () => ({\n address: accountAddress,\n chainId: isConnected ? connectedChainId : undefined,\n chainLabel: isConnected ? chainLabelForChain(connectedChainId) : undefined,\n requiredChainId: runtimeContext.chainId,\n requiredChainLabel: chainLabelForChain(runtimeContext.chainId),\n isConnected,\n isWrongNetwork: Boolean(isConnected && connectedChainId !== runtimeContext.chainId),\n canSwitchChain: Boolean(switchChainAsync),\n isSwitchingChain,\n // Real native-token balance from the connected wallet. \"0\" until a wallet is connected.\n balance: nativeBalance ? formatUnits(nativeBalance.value, nativeBalance.decimals) : \"0\",\n // Wallet connection is host/shell-owned. In this preview the SDK forwards to the\n // injected wagmi connector so the surface is functional rather than a no-op stub.\n connect: () => {\n const connector = connectors[0];\n if (connector) connect({ connector });\n },\n disconnect: () => disconnect(),\n switchChain: async () => {\n if (!switchChainAsync) {\n throw new Error(`Switch wallet to ${chainLabelForChain(runtimeContext.chainId)} before continuing.`);\n }\n await switchChainAsync({ chainId: runtimeContext.chainId });\n },\n }),\n [accountAddress, connect, connectedChainId, connectors, disconnect, isConnected, isSwitchingChain, nativeBalance, runtimeContext.chainId, switchChainAsync],\n );\n\n const assertWalletWriteReady = useCallback(\n (actionLabel: string) => {\n if (!accountAddress) throw new Error(\"Wallet is not connected.\");\n if (isConnected && connectedChainId !== runtimeContext.chainId) {\n throw new Error(`Wrong network. Switch wallet to ${chainLabelForChain(runtimeContext.chainId)} before ${actionLabel}.`);\n }\n },\n [accountAddress, connectedChainId, isConnected, runtimeContext.chainId],\n );\n\n const readContract = useCallback(\n async <T,>(request: ContractReadRequest): Promise<T> => {\n if (!publicClient || !request.abi || !request.address) {\n throw new Error(`Contract read ${request.functionName} requires a public client, ABI, and address.`);\n }\n return (await publicClient.readContract({\n address: request.address,\n abi: request.abi,\n functionName: request.functionName,\n args: request.args,\n })) as T;\n },\n [publicClient],\n );\n\n const simulateContract = useCallback(\n async (request: ContractWriteRequest): Promise<SimulateResult> => {\n assertWalletWriteReady(`simulating ${request.functionName}`);\n if (!publicClient || !request.abi || !request.address) {\n throw new Error(`Contract simulation ${request.functionName} requires a public client, ABI, and address.`);\n }\n const simulation = await publicClient.simulateContract({\n account: accountAddress,\n address: request.address,\n abi: request.abi,\n functionName: request.functionName,\n args: request.args,\n value: request.value,\n });\n return { request, result: simulation.result };\n },\n [accountAddress, assertWalletWriteReady, publicClient],\n );\n\n const writeContract = useCallback(\n async (request: ContractWriteRequest): Promise<Address> => {\n assertWalletWriteReady(`writing ${request.functionName}`);\n if (!walletClient || !request.abi || !request.address) {\n throw new Error(`Contract write ${request.functionName} requires a wallet client, ABI, and address.`);\n }\n const hash = await walletClient.writeContract({\n address: request.address,\n abi: request.abi,\n functionName: request.functionName,\n args: request.args,\n value: request.value,\n });\n return hash as Address;\n },\n [assertWalletWriteReady, walletClient],\n );\n\n const waitForTx = useCallback(\n async (hash: Address): Promise<TxReceipt> => {\n if (!publicClient) throw new Error(\"Transaction receipt requires a public client.\");\n const receipt = await publicClient.waitForTransactionReceipt({ hash });\n return { hash, status: receipt.status === \"success\" ? \"success\" : \"reverted\" };\n },\n [publicClient],\n );\n\n const readOracle = useCallback(\n async <T,>(oracleId: string, params?: Record<string, string>): Promise<T> => {\n if (oracleReader) {\n return oracleReader<T>({\n oracleId,\n params,\n context: runtimeContext,\n });\n }\n\n const endpoint = getPreviewOracleEndpoint(runtimeContext.extraConfig, oracleId);\n if (!endpoint) throw new Error(`Oracle ${oracleId} is not provisioned by the runtime.`);\n\n return fetchOracleJson<T>({\n endpoint,\n params,\n });\n },\n [oracleReader, runtimeContext],\n );\n\n const refetch = useCallback(async () => {\n setVersion((item) => item + 1);\n }, []);\n\n const openExplorerTx = useCallback(\n (hash: Address) => {\n if (!runtimeContext.explorerBaseUrl) return;\n window.open(`${runtimeContext.explorerBaseUrl.replace(/\\/$/, \"\")}/tx/${hash}`, \"_blank\", \"noreferrer\");\n },\n [runtimeContext.explorerBaseUrl],\n );\n\n const sdk = useMemo<FlapVaultSdk>(\n () => ({\n context: runtimeContext,\n i18n: i18nApi,\n notify,\n wallet,\n readContract,\n simulateContract,\n writeContract,\n waitForTx,\n readOracle,\n refetch,\n refetchNonce: version,\n openExplorerTx,\n }),\n [i18nApi, notify, openExplorerTx, readContract, readOracle, refetch, runtimeContext, simulateContract, version, waitForTx, wallet, writeContract],\n );\n\n return (\n <RuntimeContext.Provider value={sdk}>\n {children}\n <div className=\"pointer-events-none fixed bottom-4 right-4 z-50 flex w-[min(360px,calc(100vw-2rem))] flex-col gap-2\">\n {messages.map((message) => (\n <div key={message.id} className=\"pointer-events-auto\">\n <Alert\n tone={message.level === \"error\" ? \"danger\" : message.level}\n className=\"cursor-pointer shadow-panel backdrop-blur-sm transition hover:translate-y-[-1px]\"\n >\n <button type=\"button\" className=\"w-full text-left\" onClick={() => dismissMessage(message.id)}>\n {message.message}\n </button>\n </Alert>\n </div>\n ))}\n </div>\n </RuntimeContext.Provider>\n );\n}\n\nexport function useFlapSdk() {\n const sdk = useContext(RuntimeContext);\n if (!sdk) throw new Error(\"useFlapSdk must be used within VaultRuntimeProvider.\");\n return sdk;\n}\n\nexport function useVaultContext() {\n return useFlapSdk().context;\n}\n\nexport function useFlapI18n() {\n return useFlapSdk().i18n;\n}\n\nexport function useFlapNotify() {\n return useFlapSdk().notify;\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","import { useFlapSdk } from \"./runtime\";\n\nexport function useFlapWallet() {\n return useFlapSdk().wallet;\n}\n"]}
1
+ {"version":3,"sources":["../../src/sdk/erc20.ts","../../src/sdk/format.ts","../../src/sdk/oracle.ts","../../src/ui/utils.ts","../../src/ui/Alert.tsx","../../src/ui/Button.tsx","../../src/ui/Card.tsx","../../src/ui/Input.tsx","../../src/sdk/taxInfo.ts","../../src/sdk/runtimeContext.ts","../../src/sdk/runtime.tsx","../../src/sdk/txError.ts","../../src/sdk/useFlapWallet.ts"],"names":["React2","React4","useState","useEffect","useMemo","formatUnits"],"mappings":"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","file":"sdk.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 { 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 { type ClassValue, clsx } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","import { AlertTriangle, CheckCircle2, Info } from \"lucide-react\";\nimport { ReactNode } from \"react\";\nimport { cn } from \"./utils\";\n\ntype AlertTone = \"info\" | \"success\" | \"warning\" | \"danger\";\n\nconst toneClass: Record<AlertTone, string> = {\n info: \"border-[#3f5f8f] bg-[#17243a] text-[#d8e2ef]\",\n success: \"border-[#35d39d]/35 bg-[#173c39] text-[#8ff4c8]\",\n warning: \"border-[#f2c94c]/35 bg-[#42381f] text-[#fff0b8]\",\n danger: \"border-[#ff6b6b]/35 bg-[#4a1f27] text-[#ffc4c4]\",\n};\n\nconst iconMap = {\n info: Info,\n success: CheckCircle2,\n warning: AlertTriangle,\n danger: AlertTriangle,\n};\n\nexport function Alert({ children, tone = \"info\", className }: { children: ReactNode; tone?: AlertTone; className?: string }) {\n const Icon = iconMap[tone];\n return (\n <div className={cn(\"flex gap-3 rounded-md border p-3 text-sm font-medium leading-6\", toneClass[tone], className)}>\n <Icon className=\"mt-0.5 h-4 w-4 shrink-0 opacity-90\" />\n <div className=\"min-w-0 break-words\">{children}</div>\n </div>\n );\n}\n","import * as React from \"react\";\nimport { Slot } from \"@radix-ui/react-slot\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { Loader2 } from \"lucide-react\";\nimport { cn } from \"./utils\";\n\nconst buttonVariants = cva(\n \"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-semibold transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[#4a90ff]/60 disabled:pointer-events-none disabled:opacity-50\",\n {\n variants: {\n variant: {\n default: \"border border-[#4a90ff]/60 bg-[#315fb5] text-white shadow-[inset_0_1px_0_rgba(255,255,255,0.16)] hover:bg-[#3b70d6]\",\n secondary: \"border border-[#3a4d66] bg-[#304057] text-white hover:bg-[#3a4c65]\",\n outline: \"border border-[#3d6ba8] bg-[#17243a] text-[#d8e8ff] hover:border-[#559cff] hover:bg-[#1d3150]\",\n ghost: \"text-[#a8b5c7] hover:bg-[#304057] hover:text-white\",\n destructive: \"bg-destructive text-destructive-foreground hover:bg-destructive/90\",\n },\n size: {\n default: \"h-10 px-4\",\n sm: \"h-8 px-3 text-xs\",\n lg: \"h-12 px-5\",\n icon: \"h-10 w-10\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n },\n);\n\nexport interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement>, VariantProps<typeof buttonVariants> {\n asChild?: boolean;\n loading?: boolean;\n}\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n ({ className, variant, size, asChild = false, loading = false, disabled, children, ...props }, ref) => {\n const Comp = asChild ? Slot : \"button\";\n if (asChild) {\n return (\n <Comp className={cn(buttonVariants({ variant, size, className }))} ref={ref} {...props}>\n {children}\n </Comp>\n );\n }\n return (\n <Comp\n className={cn(buttonVariants({ variant, size, className }))}\n ref={ref}\n disabled={disabled || loading}\n {...props}\n >\n {loading ? <Loader2 className=\"h-4 w-4 animate-spin\" /> : null}\n {children}\n </Comp>\n );\n },\n);\nButton.displayName = \"Button\";\n\nexport { Button, buttonVariants };\n","import * as React from \"react\";\nimport { cn } from \"./utils\";\n\nconst Card = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\n \"rounded-lg border border-[#3a4d66] bg-[#1d2938] text-white shadow-panel shadow-black/30 backdrop-blur\",\n className,\n )}\n {...props}\n />\n));\nCard.displayName = \"Card\";\n\nconst CardHeader = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div ref={ref} className={cn(\"flex flex-col gap-1.5 p-5\", className)} {...props} />\n ),\n);\nCardHeader.displayName = \"CardHeader\";\n\nconst CardTitle = React.forwardRef<HTMLHeadingElement, React.HTMLAttributes<HTMLHeadingElement>>(\n ({ className, ...props }, ref) => (\n <h3 ref={ref} className={cn(\"text-lg font-semibold leading-tight tracking-normal text-white\", className)} {...props} />\n ),\n);\nCardTitle.displayName = \"CardTitle\";\n\nconst CardDescription = React.forwardRef<HTMLParagraphElement, React.HTMLAttributes<HTMLParagraphElement>>(\n ({ className, ...props }, ref) => (\n <p ref={ref} className={cn(\"text-sm leading-6 text-[#a8b5c7]\", className)} {...props} />\n ),\n);\nCardDescription.displayName = \"CardDescription\";\n\nconst CardContent = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => <div ref={ref} className={cn(\"p-5 pt-0\", className)} {...props} />,\n);\nCardContent.displayName = \"CardContent\";\n\nexport { Card, CardContent, CardDescription, CardHeader, CardTitle };\n","import * as React from \"react\";\nimport { cn } from \"./utils\";\n\nexport interface InputProps extends React.InputHTMLAttributes<HTMLInputElement> {}\n\nconst Input = React.forwardRef<HTMLInputElement, InputProps>(({ className, ...props }, ref) => (\n <input\n ref={ref}\n className={cn(\n \"flex h-11 w-full rounded-md border border-[#aebdd0] bg-[#101827] px-3 py-2 text-sm font-semibold text-white caret-white shadow-[inset_0_1px_0_rgba(255,255,255,0.05)] outline-none transition-colors selection:bg-[#4a90ff]/45 selection:text-white placeholder:text-[#7f8ca0] focus:border-[#64a7ff] focus:bg-[#132033] focus:ring-2 focus:ring-[#4a90ff]/30 disabled:cursor-not-allowed disabled:border-[#40536c] disabled:bg-[#1d2938] disabled:text-[#8d9caf] disabled:opacity-80\",\n className,\n )}\n {...props}\n />\n));\nInput.displayName = \"Input\";\n\nexport { Input };\n","import type {\n ActionAvailabilityStage,\n Address,\n FeeMode,\n FlapFeeVaultInfo,\n FlapTaxInfo,\n FlapTokenInfo,\n FlapVaultPortalInfo,\n ManifestBindingEntry,\n TokenMarketPhase,\n VaultHostContext,\n VaultManifest,\n VaultRenderSurface,\n} from \"./types\";\n\nexport const ZERO_ADDRESS = \"0x0000000000000000000000000000000000000000\" as Address;\n\ntype TupleLike = (Record<string, unknown> & readonly unknown[]) | Record<string, unknown> | readonly unknown[] | null | undefined;\n\nexport interface VaultBindingPolicy {\n name: string;\n chainId: number;\n factoryAddress?: Address;\n vaultAddresses?: Address[];\n tokenAddresses?: Address[];\n extra?: Record<string, unknown>;\n isAiPowered?: boolean;\n}\n\nexport interface RuntimeMatchInput {\n chainId?: number;\n factoryAddress?: string | null;\n vaultAddress?: string | null;\n tokenAddress?: string | null;\n}\n\nexport interface CreateTaxInfoHostContextInput {\n tokenInfo?: FlapTokenInfo | null;\n taxInfo?: FlapTaxInfo | null;\n vaultInfo?: FlapVaultPortalInfo | null;\n feeMode?: FeeMode | null;\n giftVaultFactory?: string | null;\n hasTaxVaults?: boolean;\n vaultType?: string;\n copyScope?: \"tax\" | \"fee\";\n}\n\nexport interface ResolveRenderSurfaceInput {\n tokenInfo?: FlapTokenInfo | null;\n taxInfo?: FlapTaxInfo | null;\n hasTaxVaults?: boolean;\n isNonTaxFeeToken?: boolean;\n}\n\nexport interface TaxVaultHostSnapshot {\n tokenInfo?: FlapTokenInfo;\n taxInfo?: FlapTaxInfo | null;\n vaultInfo?: FlapVaultPortalInfo | null;\n feeMode: FeeMode;\n renderSurface: VaultRenderSurface;\n vaultType?: string;\n copyScope: \"tax\" | \"fee\";\n marketPhase: TokenMarketPhase;\n isListed: boolean;\n isTaxToken: boolean;\n isSupportedCustomVaultToken: boolean;\n}\n\nexport function getTupleField(data: TupleLike, name: string, index: number) {\n if (!data) return undefined;\n const record = data as Record<string, unknown>;\n const tuple = data as readonly unknown[];\n return record[name] ?? tuple[index];\n}\n\nexport function isValidAddress(value?: string | null): value is Address {\n return Boolean(value && /^0x[a-fA-F0-9]{40}$/.test(value));\n}\n\nexport function normalizeAddress(value?: string | null): Address | undefined {\n return isValidAddress(value) ? (value as Address) : undefined;\n}\n\nexport function isSameAddress(a?: string | null, b?: string | null) {\n return Boolean(a && b && a.toLowerCase() === b.toLowerCase());\n}\n\nfunction toNumber(value: unknown, fallback = 0) {\n if (typeof value === \"bigint\") return Number(value);\n if (typeof value === \"number\") return Number.isFinite(value) ? value : fallback;\n if (typeof value === \"string\" && value.trim()) {\n const parsed = Number(value);\n return Number.isFinite(parsed) ? parsed : fallback;\n }\n return fallback;\n}\n\nfunction toBigInt(value: unknown, fallback = 0n) {\n if (typeof value === \"bigint\") return value;\n if (typeof value === \"number\" && Number.isFinite(value)) return BigInt(Math.trunc(value));\n if (typeof value === \"string\" && value.trim()) {\n try {\n return BigInt(value);\n } catch {\n return fallback;\n }\n }\n return fallback;\n}\n\nfunction toBooleanOrNull(value: unknown) {\n if (typeof value === \"boolean\") return value;\n if (value === null || value === undefined) return null;\n return Boolean(value);\n}\n\nfunction toAddressOrNull(value: unknown): Address | null {\n return typeof value === \"string\" && isValidAddress(value) ? (value as Address) : null;\n}\n\nfunction toStringOrUndefined(value: unknown) {\n return typeof value === \"string\" && value.length > 0 ? value : undefined;\n}\n\nexport function parsePortalTokenInfo(tokenData: TupleLike): FlapTokenInfo | null {\n if (!tokenData) return null;\n\n const status = toNumber(getTupleField(tokenData, \"status\", 0));\n const taxRateRaw = toBigInt(getTupleField(tokenData, \"taxRate\", 12));\n const quoteTokenAddress = toAddressOrNull(getTupleField(tokenData, \"quoteTokenAddress\", 9)) ?? ZERO_ADDRESS;\n\n return {\n exists: status !== 0,\n isTaxToken: taxRateRaw > 0n,\n taxRate: Number(taxRateRaw),\n taxRateRaw,\n quoteTokenAddress,\n status,\n tokenVersion: toNumber(getTupleField(tokenData, \"tokenVersion\", 4)),\n };\n}\n\nexport function parseFeeVaultInfo(vaultInfo: TupleLike): FlapFeeVaultInfo | null {\n if (!vaultInfo) return null;\n\n return {\n addr: toAddressOrNull(getTupleField(vaultInfo, \"addr\", 0)),\n factory: toAddressOrNull(getTupleField(vaultInfo, \"factory\", 1)),\n riskLevel: toNumber(getTupleField(vaultInfo, \"riskLevel\", 2)),\n isOfficialVault: toBooleanOrNull(getTupleField(vaultInfo, \"isOfficialVault\", 3)),\n isVault: toBooleanOrNull(getTupleField(vaultInfo, \"isVault\", 4)),\n isAIConsumer: toBooleanOrNull(getTupleField(vaultInfo, \"isAIConsumer\", 5)),\n };\n}\n\nexport function parseTaxTokenInfo(\n taxInfo: TupleLike,\n taxInfoV2?: TupleLike,\n options: { wrappedNativeTokenAddress?: Address } = {},\n): FlapTaxInfo | null {\n if (!taxInfo) return null;\n\n const quoteToken = toAddressOrNull(getTupleField(taxInfo, \"quoteToken\", 11)) ?? ZERO_ADDRESS;\n const rawDividendToken = toAddressOrNull(getTupleField(taxInfoV2, \"dividendToken\", 11)) ?? quoteToken;\n const dividendToken =\n quoteToken === ZERO_ADDRESS && rawDividendToken === ZERO_ADDRESS && options.wrappedNativeTokenAddress\n ? options.wrappedNativeTokenAddress\n : rawDividendToken;\n\n return {\n marketBps: toNumber(getTupleField(taxInfo, \"marketBps\", 0)),\n deflationBps: toNumber(getTupleField(taxInfo, \"deflationBps\", 1)),\n lpBps: toNumber(getTupleField(taxInfo, \"lpBps\", 2)),\n dividendBps: toNumber(getTupleField(taxInfo, \"dividendBps\", 3)),\n feeRate: toNumber(getTupleField(taxInfo, \"feeRate\", 4)),\n buyTaxRate: taxInfoV2 ? toNumber(getTupleField(taxInfoV2, \"buyTaxRate\", 4)) : undefined,\n sellTaxRate: taxInfoV2 ? toNumber(getTupleField(taxInfoV2, \"sellTaxRate\", 5)) : undefined,\n burntTokenAmount: toBigInt(getTupleField(taxInfo, \"burntTokenAmount\", 5)),\n totalQuoteSentToDividend: toBigInt(getTupleField(taxInfo, \"totalQuoteSentToDividend\", 6)),\n totalQuoteAddedToLiquidity: toBigInt(getTupleField(taxInfo, \"totalQuoteAddedToLiquidity\", 7)),\n totalTokenAddedToLiquidity: toBigInt(getTupleField(taxInfo, \"totalTokenAddedToLiquidity\", 8)),\n totalQuoteSentToMarketing: toBigInt(getTupleField(taxInfo, \"totalQuoteSentToMarketing\", 9)),\n marketingWallet: toAddressOrNull(getTupleField(taxInfo, \"marketingWallet\", 10)) ?? ZERO_ADDRESS,\n dividendToken,\n quoteToken,\n minimumShareBalance: toBigInt(getTupleField(taxInfo, \"minimumShareBalance\", 12)),\n vaultInfo: parseFeeVaultInfo(getTupleField(taxInfoV2, \"vaultInfo\", 14) as TupleLike),\n };\n}\n\nexport function parseVaultPortalInfo(vaultData: TupleLike): FlapVaultPortalInfo | null {\n if (!vaultData) return null;\n\n const found = Boolean(getTupleField(vaultData, \"found\", 0));\n const info = getTupleField(vaultData, \"info\", 1) as TupleLike;\n\n if (!found || !info) return { found: false };\n\n return {\n found: true,\n vault: toAddressOrNull(getTupleField(info, \"vault\", 0)) ?? ZERO_ADDRESS,\n vaultFactory: toAddressOrNull(getTupleField(info, \"vaultFactory\", 1)) ?? ZERO_ADDRESS,\n description: toStringOrUndefined(getTupleField(info, \"description\", 2)),\n isOfficial: Boolean(getTupleField(info, \"isOfficial\", 3)),\n riskLevel: toNumber(getTupleField(info, \"riskLevel\", 4)),\n };\n}\n\nexport function resolveManifestBinding(manifest: Pick<VaultManifest, \"match\">, input: RuntimeMatchInput): ManifestBindingEntry | null {\n const bindings = manifest.match.bindings;\n if (!bindings.length) return null;\n\n const resolveUnique = (candidates: ManifestBindingEntry[]) => {\n if (candidates.length === 1) return candidates[0];\n return null;\n };\n\n const matchesChain = (binding: ManifestBindingEntry) => !input.chainId || binding.chainId === input.chainId;\n const matchesToken = (binding: ManifestBindingEntry) =>\n !input.tokenAddress || !binding.tokenAddresses?.length || binding.tokenAddresses.some((address) => isSameAddress(address, input.tokenAddress));\n const isVaultScopedBinding = (binding: ManifestBindingEntry) => !binding.factoryAddress && Boolean(binding.vaultAddresses?.length);\n const isTokenScopedBinding = (binding: ManifestBindingEntry) => !binding.factoryAddress && !binding.vaultAddresses?.length && Boolean(binding.tokenAddresses?.length);\n\n if (input.factoryAddress) {\n const factoryMatch = resolveUnique(\n bindings.filter((binding) => matchesChain(binding) && Boolean(binding.factoryAddress) && isSameAddress(binding.factoryAddress, input.factoryAddress) && matchesToken(binding)),\n );\n if (factoryMatch) return factoryMatch;\n if (!input.vaultAddress && !input.tokenAddress) return null;\n }\n\n if (input.vaultAddress) {\n const vaultMatch = resolveUnique(\n bindings.filter(\n (binding) =>\n matchesChain(binding) &&\n isVaultScopedBinding(binding) &&\n Boolean(binding.vaultAddresses?.some((address) => isSameAddress(address, input.vaultAddress))) &&\n matchesToken(binding),\n ),\n );\n if (vaultMatch) return vaultMatch;\n }\n\n if (input.tokenAddress) {\n const tokenMatch = resolveUnique(\n bindings.filter(\n (binding) =>\n matchesChain(binding) &&\n isTokenScopedBinding(binding) &&\n Boolean(binding.tokenAddresses?.some((address) => isSameAddress(address, input.tokenAddress))),\n ),\n );\n if (tokenMatch) return tokenMatch;\n }\n\n if (input.factoryAddress || input.vaultAddress) {\n return null;\n }\n\n if (input.chainId && input.tokenAddress) {\n const tokenScopedMatch = resolveUnique(bindings.filter((binding) => binding.chainId === input.chainId && binding.tokenAddresses?.some((address) => isSameAddress(address, input.tokenAddress))));\n if (tokenScopedMatch) return tokenScopedMatch;\n }\n\n if (input.tokenAddress) {\n return resolveUnique(bindings.filter((binding) => binding.tokenAddresses?.some((address) => isSameAddress(address, input.tokenAddress))));\n }\n\n if (input.chainId) {\n return resolveUnique(bindings.filter((binding) => binding.chainId === input.chainId && matchesToken(binding)));\n }\n\n return null;\n}\n\nexport function isManifestRuntimeMatch(manifest: Pick<VaultManifest, \"match\">, input: RuntimeMatchInput) {\n if (!input.chainId || (!input.factoryAddress && !input.vaultAddress && !input.tokenAddress)) return false;\n const matchingBinding = resolveManifestBinding(manifest, input);\n if (!matchingBinding) return false;\n if (matchingBinding.chainId !== input.chainId) return false;\n if (matchingBinding.factoryAddress) return isSameAddress(matchingBinding.factoryAddress, input.factoryAddress);\n const vaultAddress = matchingBinding.vaultAddresses?.[0];\n if (vaultAddress && !isSameAddress(vaultAddress, input.vaultAddress)) return false;\n if (input.tokenAddress && matchingBinding.tokenAddresses?.length) {\n return matchingBinding.tokenAddresses.some((address) => isSameAddress(address, input.tokenAddress));\n }\n if (!vaultAddress && matchingBinding.tokenAddresses?.length) return false;\n return true;\n}\n\nexport function isVaultBindingMatch(binding: VaultBindingPolicy, input: RuntimeMatchInput) {\n if (!input.chainId || binding.chainId !== input.chainId) return false;\n if (binding.factoryAddress) return Boolean(input.factoryAddress && isSameAddress(binding.factoryAddress, input.factoryAddress));\n const vaultAddress = binding.vaultAddresses?.[0];\n if (vaultAddress) {\n if (!input.vaultAddress || !isSameAddress(vaultAddress, input.vaultAddress)) return false;\n if (input.tokenAddress && binding.tokenAddresses?.length) {\n return binding.tokenAddresses.some((address) => isSameAddress(address, input.tokenAddress));\n }\n return true;\n }\n return Boolean(input.tokenAddress && binding.tokenAddresses?.some((address) => isSameAddress(address, input.tokenAddress)));\n}\n\nexport function resolveVaultBinding(bindings: VaultBindingPolicy[], input: RuntimeMatchInput) {\n return bindings.find((binding) => isVaultBindingMatch(binding, input)) ?? null;\n}\n\nexport function resolveFeeMode(taxInfo: FlapTaxInfo | TupleLike | null | undefined, giftVaultFactory?: string | null): FeeMode {\n if (!taxInfo) return \"unknown\";\n\n const marketBps = toNumber(getTupleField(taxInfo as TupleLike, \"marketBps\", 0));\n const dividendBps = toNumber(getTupleField(taxInfo as TupleLike, \"dividendBps\", 3));\n\n if (dividendBps > 0) return \"holder\";\n if (marketBps <= 0) return \"unknown\";\n\n const parsedVaultInfo =\n \"vaultInfo\" in Object(taxInfo)\n ? (taxInfo as FlapTaxInfo).vaultInfo\n : parseFeeVaultInfo(getTupleField(taxInfo as TupleLike, \"vaultInfo\", 14) as TupleLike);\n\n if (parsedVaultInfo?.isVault === true) {\n return isSameAddress(parsedVaultInfo.factory, giftVaultFactory) ? \"gift\" : \"unknown\";\n }\n\n return \"creator\";\n}\n\nexport function resolveTaxInfoRenderSurface({\n tokenInfo,\n taxInfo,\n hasTaxVaults = false,\n isNonTaxFeeToken = false,\n}: ResolveRenderSurfaceInput): VaultRenderSurface {\n if (!tokenInfo?.exists) return \"unavailable\";\n if (!tokenInfo.isTaxToken) return isNonTaxFeeToken ? \"feeinfo\" : \"unavailable\";\n if (taxInfo?.marketBps === 10000 && hasTaxVaults) return \"vault-taxinfo\";\n return \"standard-taxinfo\";\n}\n\nexport function resolveTokenMarketPhase(tokenInfo?: FlapTokenInfo | null): TokenMarketPhase {\n if (!tokenInfo?.exists) return \"unknown\";\n return tokenInfo.status >= 2 ? \"dex-listed\" : \"internal-market\";\n}\n\nexport function isCustomVaultTaxToken(tokenInfo?: FlapTokenInfo | null) {\n return Boolean(tokenInfo?.exists && tokenInfo.isTaxToken);\n}\n\nexport function isActionAvailableForPhase(stage: ActionAvailabilityStage, marketPhase: TokenMarketPhase = \"unknown\") {\n if (stage === \"read-only\") return false;\n if (stage === \"both\") return true;\n if (marketPhase === \"unknown\") return false;\n return stage === marketPhase;\n}\n\nexport function createTaxInfoHostContext({\n tokenInfo,\n taxInfo,\n vaultInfo,\n feeMode,\n giftVaultFactory,\n hasTaxVaults,\n vaultType,\n copyScope = \"tax\",\n}: CreateTaxInfoHostContextInput): VaultHostContext {\n const resolvedFeeMode = feeMode ?? resolveFeeMode(taxInfo, giftVaultFactory);\n const renderSurface = resolveTaxInfoRenderSurface({\n tokenInfo,\n taxInfo,\n hasTaxVaults: hasTaxVaults ?? Boolean(vaultInfo?.found),\n isNonTaxFeeToken: copyScope === \"fee\",\n });\n const marketPhase = resolveTokenMarketPhase(tokenInfo);\n\n return {\n tokenInfo: tokenInfo ?? undefined,\n taxInfo: taxInfo ?? null,\n vaultInfo: vaultInfo ?? null,\n feeMode: resolvedFeeMode,\n renderSurface,\n vaultType,\n copyScope,\n isListed: tokenInfo ? tokenInfo.status >= 2 : undefined,\n marketPhase,\n };\n}\n\nexport function readTaxVaultHostContext(host?: VaultHostContext | null): TaxVaultHostSnapshot {\n const tokenInfo = host?.tokenInfo;\n const marketPhase = host?.marketPhase ?? resolveTokenMarketPhase(tokenInfo);\n const isListed = host?.isListed ?? Boolean(tokenInfo && tokenInfo.status >= 2);\n const isTaxToken = tokenInfo?.isTaxToken === true;\n\n return {\n tokenInfo,\n taxInfo: host?.taxInfo ?? null,\n vaultInfo: host?.vaultInfo ?? null,\n feeMode: host?.feeMode ?? \"unknown\",\n renderSurface: host?.renderSurface ?? \"unavailable\",\n vaultType: host?.vaultType,\n copyScope: host?.copyScope ?? \"tax\",\n marketPhase,\n isListed,\n isTaxToken,\n isSupportedCustomVaultToken: isCustomVaultTaxToken(tokenInfo),\n };\n}\n","import { resolveManifestBinding } from \"./taxInfo\";\nimport type { Address, CreateVaultRuntimeContextInput, VaultRuntimeContext, VaultRuntimeExtraConfig } from \"./types\";\n\nconst zeroAddress = \"0x0000000000000000000000000000000000000000\" as Address;\n\nexport function explorerForChain(chainId: number) {\n if (chainId === 56) return \"https://bscscan.com\";\n if (chainId === 97) return \"https://testnet.bscscan.com\";\n return undefined;\n}\n\nexport function chainLabelForChain(chainId: number) {\n if (chainId === 56) return \"BNB Chain\";\n if (chainId === 97) return \"BNB Testnet\";\n return `Chain ${chainId}`;\n}\n\nfunction buildRuntimeExtraConfig(input: CreateVaultRuntimeContextInput): VaultRuntimeExtraConfig {\n const hostRuntimeResult = input.hostRuntimeResult;\n const runtimeOverrides = input.runtimeOverrides;\n\n return {\n ...(hostRuntimeResult\n ? {\n hostRuntimeStatus: hostRuntimeResult.status,\n hostRuntimePolicy: hostRuntimeResult.policy,\n hostRuntimeDegradeReason: hostRuntimeResult.degradeReason,\n hostRuntimeWarnings: hostRuntimeResult.warnings,\n }\n : {}),\n ...(hostRuntimeResult?.presentation?.extraConfig ?? {}),\n ...(runtimeOverrides?.extraConfig ?? {}),\n };\n}\n\nexport function createVaultRuntimeContext(input: CreateVaultRuntimeContextInput): VaultRuntimeContext {\n const runtimeOverrides = input.runtimeOverrides;\n const resolvedBinding = resolveManifestBinding(input.manifest, {\n chainId: runtimeOverrides?.chainId ?? input.connectedChainId ?? input.hostRuntimeResult?.addresses.chainId,\n factoryAddress: runtimeOverrides?.factoryAddress ?? input.hostRuntimeResult?.addresses.factoryAddress,\n vaultAddress: runtimeOverrides?.vaultAddress ?? input.hostRuntimeResult?.addresses.vaultAddress,\n tokenAddress: runtimeOverrides?.tokenAddress ?? input.hostRuntimeResult?.addresses.tokenAddress,\n });\n const effectiveChainId =\n runtimeOverrides?.chainId ?? input.hostRuntimeResult?.addresses.chainId ?? input.connectedChainId ?? resolvedBinding?.chainId ?? input.manifest.match.bindings[0]?.chainId ?? 56;\n\n return {\n chainId: effectiveChainId,\n factoryAddress: runtimeOverrides?.factoryAddress ?? input.hostRuntimeResult?.addresses.factoryAddress ?? resolvedBinding?.factoryAddress ?? zeroAddress,\n tokenAddress: runtimeOverrides?.tokenAddress ?? input.hostRuntimeResult?.addresses.tokenAddress ?? zeroAddress,\n vaultAddress: runtimeOverrides?.vaultAddress ?? input.hostRuntimeResult?.addresses.vaultAddress ?? zeroAddress,\n userAddress: runtimeOverrides?.userAddress,\n tokenSymbol: runtimeOverrides?.tokenSymbol ?? input.hostRuntimeResult?.tokenSymbol,\n tokenName: runtimeOverrides?.tokenName ?? input.hostRuntimeResult?.tokenName,\n tokenImageUrl: runtimeOverrides?.tokenImageUrl ?? input.hostRuntimeResult?.tokenImageUrl,\n explorerBaseUrl: runtimeOverrides?.explorerBaseUrl ?? explorerForChain(effectiveChainId),\n paymentToken: runtimeOverrides?.paymentToken ?? input.hostRuntimeResult?.paymentToken,\n host: runtimeOverrides?.host ?? input.hostRuntimeResult?.host,\n extraConfig: buildRuntimeExtraConfig(input),\n manifest: input.manifest,\n };\n}\n","\"use client\";\n\nimport { createContext, ReactNode, useCallback, useContext, useEffect, useMemo, useRef, useState } from \"react\";\nimport { useAccount, useBalance, useChainId, useConnect, useDisconnect, usePublicClient, useSwitchChain, useWalletClient } from \"wagmi\";\nimport { formatUnits } from \"viem\";\nimport { Alert } from \"@/src/ui\";\nimport type {\n Address,\n ContractReadRequest,\n ContractWriteRequest,\n FlapI18n,\n FlapNotify,\n FlapWallet,\n FlapVaultSdk,\n HostRuntimeResult,\n OracleReader,\n SimulateResult,\n TxReceipt,\n VaultManifest,\n VaultRuntimeContext,\n VaultRuntimeContextOverrides,\n} from \"./types\";\nimport { chainLabelForChain, createVaultRuntimeContext } from \"./runtimeContext\";\nimport { fetchOracleJson } from \"./oracle\";\n\nconst RuntimeContext = createContext<FlapVaultSdk | null>(null);\ntype ToastLevel = \"info\" | \"success\" | \"warning\" | \"error\";\n\ninterface ToastItem {\n id: number;\n level: ToastLevel;\n message: string;\n}\n\ninterface RuntimeProviderProps {\n children: ReactNode;\n manifest: VaultManifest;\n i18n: Record<string, Record<string, string>>;\n runtimeContext?: VaultRuntimeContextOverrides;\n hostRuntimeResult?: HostRuntimeResult | null;\n locale?: string;\n oracleReader?: OracleReader;\n}\n\nfunction applyParams(value: string, params?: Record<string, string | number>) {\n if (!params) return value;\n return Object.entries(params).reduce((acc, [key, item]) => acc.replaceAll(`{${key}}`, String(item)), value);\n}\n\nfunction getPreviewOracleEndpoint(extraConfig: Record<string, unknown> | undefined, oracleId: string) {\n const oracleEndpoints = extraConfig?.oracleEndpoints;\n if (!oracleEndpoints || typeof oracleEndpoints !== \"object\" || Array.isArray(oracleEndpoints)) return undefined;\n const endpoint = (oracleEndpoints as Record<string, unknown>)[oracleId];\n return typeof endpoint === \"string\" ? endpoint : undefined;\n}\n\nexport function VaultRuntimeProvider({ children, manifest, i18n, runtimeContext: runtimeOverrides, hostRuntimeResult, locale = \"en\", oracleReader }: RuntimeProviderProps) {\n const [version, setVersion] = useState(0);\n const [messages, setMessages] = useState<ToastItem[]>([]);\n const toastTimersRef = useRef<Map<number, number>>(new Map());\n const { address: accountAddress, isConnected } = useAccount();\n const connectedChainId = useChainId();\n const { connect, connectors } = useConnect();\n const { disconnect } = useDisconnect();\n const { switchChainAsync, isPending: isSwitchingChain } = useSwitchChain();\n const effectiveChainId = runtimeOverrides?.chainId ?? hostRuntimeResult?.addresses.chainId ?? connectedChainId ?? manifest.match.bindings[0]?.chainId ?? 56;\n const publicClient = usePublicClient({ chainId: effectiveChainId });\n const { data: walletClient } = useWalletClient();\n const { data: nativeBalance } = useBalance({ address: accountAddress, chainId: isConnected ? connectedChainId : undefined });\n\n const dismissMessage = useCallback((id: number) => {\n const timerId = toastTimersRef.current.get(id);\n if (timerId) {\n window.clearTimeout(timerId);\n toastTimersRef.current.delete(id);\n }\n setMessages((items) => items.filter((item) => item.id !== id));\n }, []);\n\n useEffect(() => {\n const timers = toastTimersRef.current;\n return () => {\n for (const timerId of timers.values()) {\n window.clearTimeout(timerId);\n }\n timers.clear();\n };\n }, []);\n\n const runtimeContext = useMemo<VaultRuntimeContext>(() => {\n return createVaultRuntimeContext({\n manifest,\n connectedChainId,\n hostRuntimeResult,\n runtimeOverrides: {\n ...runtimeOverrides,\n userAddress: runtimeOverrides?.userAddress ?? accountAddress,\n },\n });\n }, [accountAddress, connectedChainId, hostRuntimeResult, manifest, runtimeOverrides]);\n\n const i18nApi = useMemo<FlapI18n>(\n () => ({\n locale,\n t(key, fallback, params) {\n const defaultLocale = manifest.i18n[0];\n const resolved = i18n[locale]?.[key] ?? i18n[defaultLocale]?.[key] ?? i18n.en?.[key] ?? fallback ?? key;\n return applyParams(resolved, params);\n },\n }),\n [i18n, locale, manifest.i18n],\n );\n\n const push = useCallback(\n (level: ToastLevel, message: string) => {\n const id = Date.now() + Math.floor(Math.random() * 1000);\n setMessages((items) => [{ id, level, message }, ...items].slice(0, 4));\n const timerId = window.setTimeout(() => {\n dismissMessage(id);\n }, 4200);\n toastTimersRef.current.set(id, timerId);\n },\n [dismissMessage],\n );\n\n const notify = useMemo<FlapNotify>(\n () => ({\n info: (message) => push(\"info\", message),\n success: (message) => push(\"success\", message),\n warning: (message) => push(\"warning\", message),\n error: (message) => push(\"error\", message),\n }),\n [push],\n );\n\n const wallet = useMemo<FlapWallet>(\n () => ({\n address: accountAddress,\n chainId: isConnected ? connectedChainId : undefined,\n chainLabel: isConnected ? chainLabelForChain(connectedChainId) : undefined,\n requiredChainId: runtimeContext.chainId,\n requiredChainLabel: chainLabelForChain(runtimeContext.chainId),\n isConnected,\n isWrongNetwork: Boolean(isConnected && connectedChainId !== runtimeContext.chainId),\n canSwitchChain: Boolean(switchChainAsync),\n isSwitchingChain,\n // Real native-token balance from the connected wallet. \"0\" until a wallet is connected.\n balance: nativeBalance ? formatUnits(nativeBalance.value, nativeBalance.decimals) : \"0\",\n // Wallet connection is host/shell-owned. In this preview the SDK forwards to the\n // injected wagmi connector so the surface is functional rather than a no-op stub.\n connect: () => {\n const connector = connectors[0];\n if (connector) connect({ connector });\n },\n disconnect: () => disconnect(),\n switchChain: async () => {\n if (!switchChainAsync) {\n throw new Error(`Switch wallet to ${chainLabelForChain(runtimeContext.chainId)} before continuing.`);\n }\n await switchChainAsync({ chainId: runtimeContext.chainId });\n },\n }),\n [accountAddress, connect, connectedChainId, connectors, disconnect, isConnected, isSwitchingChain, nativeBalance, runtimeContext.chainId, switchChainAsync],\n );\n\n const assertWalletWriteReady = useCallback(\n (actionLabel: string) => {\n if (!accountAddress) throw new Error(\"Wallet is not connected.\");\n if (isConnected && connectedChainId !== runtimeContext.chainId) {\n throw new Error(`Wrong network. Switch wallet to ${chainLabelForChain(runtimeContext.chainId)} before ${actionLabel}.`);\n }\n },\n [accountAddress, connectedChainId, isConnected, runtimeContext.chainId],\n );\n\n const readContract = useCallback(\n async <T,>(request: ContractReadRequest): Promise<T> => {\n if (!publicClient || !request.abi || !request.address) {\n throw new Error(`Contract read ${request.functionName} requires a public client, ABI, and address.`);\n }\n return (await publicClient.readContract({\n address: request.address,\n abi: request.abi,\n functionName: request.functionName,\n args: request.args,\n account: request.account,\n })) as T;\n },\n [publicClient],\n );\n\n const simulateContract = useCallback(\n async (request: ContractWriteRequest): Promise<SimulateResult> => {\n assertWalletWriteReady(`simulating ${request.functionName}`);\n if (!publicClient || !request.abi || !request.address) {\n throw new Error(`Contract simulation ${request.functionName} requires a public client, ABI, and address.`);\n }\n const simulation = await publicClient.simulateContract({\n account: accountAddress,\n address: request.address,\n abi: request.abi,\n functionName: request.functionName,\n args: request.args,\n value: request.value,\n });\n return { request, result: simulation.result };\n },\n [accountAddress, assertWalletWriteReady, publicClient],\n );\n\n const writeContract = useCallback(\n async (request: ContractWriteRequest): Promise<Address> => {\n assertWalletWriteReady(`writing ${request.functionName}`);\n if (!walletClient || !request.abi || !request.address) {\n throw new Error(`Contract write ${request.functionName} requires a wallet client, ABI, and address.`);\n }\n const hash = await walletClient.writeContract({\n address: request.address,\n abi: request.abi,\n functionName: request.functionName,\n args: request.args,\n value: request.value,\n });\n return hash as Address;\n },\n [assertWalletWriteReady, walletClient],\n );\n\n const waitForTx = useCallback(\n async (hash: Address): Promise<TxReceipt> => {\n if (!publicClient) throw new Error(\"Transaction receipt requires a public client.\");\n const receipt = await publicClient.waitForTransactionReceipt({ hash });\n return { hash, status: receipt.status === \"success\" ? \"success\" : \"reverted\" };\n },\n [publicClient],\n );\n\n const readOracle = useCallback(\n async <T,>(oracleId: string, params?: Record<string, string>): Promise<T> => {\n if (oracleReader) {\n return oracleReader<T>({\n oracleId,\n params,\n context: runtimeContext,\n });\n }\n\n const endpoint = getPreviewOracleEndpoint(runtimeContext.extraConfig, oracleId);\n if (!endpoint) throw new Error(`Oracle ${oracleId} is not provisioned by the runtime.`);\n\n return fetchOracleJson<T>({\n endpoint,\n params,\n });\n },\n [oracleReader, runtimeContext],\n );\n\n const refetch = useCallback(async () => {\n setVersion((item) => item + 1);\n }, []);\n\n const openExplorerTx = useCallback(\n (hash: Address) => {\n if (!runtimeContext.explorerBaseUrl) return;\n window.open(`${runtimeContext.explorerBaseUrl.replace(/\\/$/, \"\")}/tx/${hash}`, \"_blank\", \"noreferrer\");\n },\n [runtimeContext.explorerBaseUrl],\n );\n\n const sdk = useMemo<FlapVaultSdk>(\n () => ({\n context: runtimeContext,\n i18n: i18nApi,\n notify,\n wallet,\n readContract,\n simulateContract,\n writeContract,\n waitForTx,\n readOracle,\n refetch,\n refetchNonce: version,\n openExplorerTx,\n }),\n [i18nApi, notify, openExplorerTx, readContract, readOracle, refetch, runtimeContext, simulateContract, version, waitForTx, wallet, writeContract],\n );\n\n return (\n <RuntimeContext.Provider value={sdk}>\n {children}\n <div className=\"pointer-events-none fixed bottom-4 right-4 z-50 flex w-[min(360px,calc(100vw-2rem))] flex-col gap-2\">\n {messages.map((message) => (\n <div key={message.id} className=\"pointer-events-auto\">\n <Alert\n tone={message.level === \"error\" ? \"danger\" : message.level}\n className=\"cursor-pointer shadow-panel backdrop-blur-sm transition hover:translate-y-[-1px]\"\n >\n <button type=\"button\" className=\"w-full text-left\" onClick={() => dismissMessage(message.id)}>\n {message.message}\n </button>\n </Alert>\n </div>\n ))}\n </div>\n </RuntimeContext.Provider>\n );\n}\n\nexport function useFlapSdk() {\n const sdk = useContext(RuntimeContext);\n if (!sdk) throw new Error(\"useFlapSdk must be used within VaultRuntimeProvider.\");\n return sdk;\n}\n\nexport function useVaultContext() {\n return useFlapSdk().context;\n}\n\nexport function useFlapI18n() {\n return useFlapSdk().i18n;\n}\n\nexport function useFlapNotify() {\n return useFlapSdk().notify;\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","import { useFlapSdk } from \"./runtime\";\n\nexport function useFlapWallet() {\n return useFlapSdk().wallet;\n}\n"]}
package/server.d.mts CHANGED
@@ -1,6 +1,6 @@
1
- import { a as Address, p as HostRuntimePresentationFetcher, v as HostTokenPresentation, R as RuntimeOracleRegistry, O as OracleProvision } from './types-DzTX2u7q.mjs';
2
- export { A as ActionAvailabilityStage, C as ContractReadRequest, b as ContractWriteRequest, c as CreateVaultRuntimeContextInput, 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, H as HostRuntimeAddresses, l as HostRuntimeDataSource, m as HostRuntimeDegradeReason, n as HostRuntimeInput, o as HostRuntimePolicy, q as HostRuntimePresentationRequest, r as HostRuntimeResult, s as HostRuntimeSources, t as HostRuntimeStatus, u as HostRuntimeWarning, M as ManifestBindingEntry, w as ManifestExternalContract, x as OracleReadRequest, y as OracleReader, P as PaymentToken, S as SimulateResult, T as TokenMarketPhase, z as TokenMetadataSnapshot, B as TokenRuntimeSnapshot, D as TxReceipt, V as VaultComponentProps, G as VaultHostContext, I as VaultManifest, J as VaultRenderSurface, K as VaultRuntimeContext, L as VaultRuntimeContextOverrides, N as VaultRuntimeExtraConfig } from './types-DzTX2u7q.mjs';
3
- export { T as TaxVaultHostChainConfig, g as getTaxVaultHostChainConfig } from './hostRuntimeConfig-8d2c6qsO.mjs';
1
+ import { a as Address, p as HostRuntimePresentationFetcher, v as HostTokenPresentation, R as RuntimeOracleRegistry, O as OracleProvision } from './types-COZWeTke.mjs';
2
+ export { A as ActionAvailabilityStage, C as ContractReadRequest, b as ContractWriteRequest, c as CreateVaultRuntimeContextInput, 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, H as HostRuntimeAddresses, l as HostRuntimeDataSource, m as HostRuntimeDegradeReason, n as HostRuntimeInput, o as HostRuntimePolicy, q as HostRuntimePresentationRequest, r as HostRuntimeResult, s as HostRuntimeSources, t as HostRuntimeStatus, u as HostRuntimeWarning, M as ManifestBindingEntry, w as ManifestExternalContract, x as OracleReadRequest, y as OracleReader, P as PaymentToken, S as SimulateResult, T as TokenMarketPhase, z as TokenMetadataSnapshot, B as TokenRuntimeSnapshot, D as TxReceipt, V as VaultComponentProps, G as VaultHostContext, I as VaultManifest, J as VaultRenderSurface, K as VaultRuntimeContext, L as VaultRuntimeContextOverrides, N as VaultRuntimeExtraConfig } from './types-COZWeTke.mjs';
3
+ export { T as TaxVaultHostChainConfig, g as getTaxVaultHostChainConfig } from './hostRuntimeConfig-QdcwQfpd.mjs';
4
4
  import 'viem';
5
5
 
6
6
  interface ResolveHostPresentationInput {
@@ -1,4 +1,4 @@
1
- import { y as OracleReader, O as OracleProvision, a as Address, A as ActionAvailabilityStage, T as TokenMarketPhase, h as FlapTokenInfo, G as VaultHostContext, g as FlapTaxInfo, i as FlapVaultPortalInfo, F as FeeMode, J as VaultRenderSurface, I as VaultManifest, d as FlapFeeVaultInfo, M as ManifestBindingEntry } from './types-DzTX2u7q.mjs';
1
+ import { y as OracleReader, O as OracleProvision, a as Address, A as ActionAvailabilityStage, T as TokenMarketPhase, h as FlapTokenInfo, G as VaultHostContext, g as FlapTaxInfo, i as FlapVaultPortalInfo, F as FeeMode, J as VaultRenderSurface, I as VaultManifest, d as FlapFeeVaultInfo, M as ManifestBindingEntry } from './types-COZWeTke.mjs';
2
2
 
3
3
  declare const standardErc20Abi: readonly [{
4
4
  readonly type: "event";
@@ -170,6 +170,7 @@ interface VaultBindingPolicy {
170
170
  chainId: number;
171
171
  factoryAddress?: Address;
172
172
  vaultAddresses?: Address[];
173
+ tokenAddresses?: Address[];
173
174
  extra?: Record<string, unknown>;
174
175
  isAiPowered?: boolean;
175
176
  }
@@ -219,6 +219,8 @@ interface ContractReadRequest {
219
219
  abi?: Abi;
220
220
  functionName: string;
221
221
  args?: unknown[];
222
+ /** Optional call account for view functions that depend on msg.sender. */
223
+ account?: Address;
222
224
  }
223
225
  interface ContractWriteRequest extends ContractReadRequest {
224
226
  value?: bigint;