@flapsdk/vault-runtime 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +14 -0
- package/host.d.mts +18 -0
- package/host.js +871 -0
- package/host.js.map +1 -0
- package/hostRuntimeConfig-BOEJo2nq.d.mts +14 -0
- package/package.json +49 -0
- package/runtime-contract.json +27 -0
- package/sdk.d.mts +24 -0
- package/sdk.js +571 -0
- package/sdk.js.map +1 -0
- package/server.d.mts +26 -0
- package/server.js +200 -0
- package/server.js.map +1 -0
- package/txError-1lPZHdqI.d.mts +216 -0
- package/types-CX7pLmiT.d.mts +270 -0
- package/ui.d.mts +99 -0
- package/ui.js +232 -0
- package/ui.js.map +1 -0
package/sdk.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/sdk/erc20.ts","../../src/sdk/format.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 hours = Math.floor(totalSeconds / 3600);\n const minutes = Math.floor((totalSeconds % 3600) / 60);\n const seconds = totalSeconds % 60;\n if (hours > 0) return `${hours}h ${minutes}m ${seconds}s`;\n return `${minutes}m ${seconds}s`;\n}\n","import { type 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 tokenAddress?: string | null;\n}\n\nexport interface CreateTaxInfoHostContextInput {\n tokenInfo?: FlapTokenInfo | null;\n taxInfo?: FlapTaxInfo | null;\n vaultInfo?: FlapVaultPortalInfo | null;\n feeMode?: FeeMode | null;\n giftVaultFactory?: string | null;\n hasTaxVaults?: boolean;\n vaultType?: string;\n copyScope?: \"tax\" | \"fee\";\n}\n\nexport interface ResolveRenderSurfaceInput {\n tokenInfo?: FlapTokenInfo | null;\n taxInfo?: FlapTaxInfo | null;\n hasTaxVaults?: boolean;\n isNonTaxFeeToken?: boolean;\n}\n\nexport interface TaxVaultHostSnapshot {\n tokenInfo?: FlapTokenInfo;\n taxInfo?: FlapTaxInfo | null;\n vaultInfo?: FlapVaultPortalInfo | null;\n feeMode: FeeMode;\n renderSurface: VaultRenderSurface;\n vaultType?: string;\n copyScope: \"tax\" | \"fee\";\n marketPhase: TokenMarketPhase;\n isListed: boolean;\n isTaxToken: boolean;\n isSupportedCustomVaultToken: boolean;\n}\n\nexport function getTupleField(data: TupleLike, name: string, index: number) {\n if (!data) return undefined;\n const record = data as Record<string, unknown>;\n const tuple = data as readonly unknown[];\n return record[name] ?? tuple[index];\n}\n\nexport function isValidAddress(value?: string | null): value is Address {\n return Boolean(value && /^0x[a-fA-F0-9]{40}$/.test(value));\n}\n\nexport function normalizeAddress(value?: string | null): Address | undefined {\n return isValidAddress(value) ? (value as Address) : undefined;\n}\n\nexport function isSameAddress(a?: string | null, b?: string | null) {\n return Boolean(a && b && a.toLowerCase() === b.toLowerCase());\n}\n\nfunction toNumber(value: unknown, fallback = 0) {\n if (typeof value === \"bigint\") return Number(value);\n if (typeof value === \"number\") return Number.isFinite(value) ? value : fallback;\n if (typeof value === \"string\" && value.trim()) {\n const parsed = Number(value);\n return Number.isFinite(parsed) ? parsed : fallback;\n }\n return fallback;\n}\n\nfunction toBigInt(value: unknown, fallback = 0n) {\n if (typeof value === \"bigint\") return value;\n if (typeof value === \"number\" && Number.isFinite(value)) return BigInt(Math.trunc(value));\n if (typeof value === \"string\" && value.trim()) {\n try {\n return BigInt(value);\n } catch {\n return fallback;\n }\n }\n return fallback;\n}\n\nfunction toBooleanOrNull(value: unknown) {\n if (typeof value === \"boolean\") return value;\n if (value === null || value === undefined) return null;\n return Boolean(value);\n}\n\nfunction toAddressOrNull(value: unknown): Address | null {\n return typeof value === \"string\" && isValidAddress(value) ? (value as Address) : null;\n}\n\nfunction toStringOrUndefined(value: unknown) {\n return typeof value === \"string\" && value.length > 0 ? value : undefined;\n}\n\nexport function parsePortalTokenInfo(tokenData: TupleLike): FlapTokenInfo | null {\n if (!tokenData) return null;\n\n const status = toNumber(getTupleField(tokenData, \"status\", 0));\n const taxRateRaw = toBigInt(getTupleField(tokenData, \"taxRate\", 12));\n const quoteTokenAddress = toAddressOrNull(getTupleField(tokenData, \"quoteTokenAddress\", 9)) ?? ZERO_ADDRESS;\n\n return {\n exists: status !== 0,\n isTaxToken: taxRateRaw > 0n,\n taxRate: Number(taxRateRaw),\n taxRateRaw,\n quoteTokenAddress,\n status,\n tokenVersion: toNumber(getTupleField(tokenData, \"tokenVersion\", 4)),\n };\n}\n\nexport function parseFeeVaultInfo(vaultInfo: TupleLike): FlapFeeVaultInfo | null {\n if (!vaultInfo) return null;\n\n return {\n addr: toAddressOrNull(getTupleField(vaultInfo, \"addr\", 0)),\n factory: toAddressOrNull(getTupleField(vaultInfo, \"factory\", 1)),\n riskLevel: toNumber(getTupleField(vaultInfo, \"riskLevel\", 2)),\n isOfficialVault: toBooleanOrNull(getTupleField(vaultInfo, \"isOfficialVault\", 3)),\n isVault: toBooleanOrNull(getTupleField(vaultInfo, \"isVault\", 4)),\n isAIConsumer: toBooleanOrNull(getTupleField(vaultInfo, \"isAIConsumer\", 5)),\n };\n}\n\nexport function parseTaxTokenInfo(\n taxInfo: TupleLike,\n taxInfoV2?: TupleLike,\n options: { wrappedNativeTokenAddress?: Address } = {},\n): FlapTaxInfo | null {\n if (!taxInfo) return null;\n\n const quoteToken = toAddressOrNull(getTupleField(taxInfo, \"quoteToken\", 11)) ?? ZERO_ADDRESS;\n const rawDividendToken = toAddressOrNull(getTupleField(taxInfoV2, \"dividendToken\", 11)) ?? quoteToken;\n const dividendToken =\n quoteToken === ZERO_ADDRESS && rawDividendToken === ZERO_ADDRESS && options.wrappedNativeTokenAddress\n ? options.wrappedNativeTokenAddress\n : rawDividendToken;\n\n return {\n marketBps: toNumber(getTupleField(taxInfo, \"marketBps\", 0)),\n deflationBps: toNumber(getTupleField(taxInfo, \"deflationBps\", 1)),\n lpBps: toNumber(getTupleField(taxInfo, \"lpBps\", 2)),\n dividendBps: toNumber(getTupleField(taxInfo, \"dividendBps\", 3)),\n feeRate: toNumber(getTupleField(taxInfo, \"feeRate\", 4)),\n buyTaxRate: taxInfoV2 ? toNumber(getTupleField(taxInfoV2, \"buyTaxRate\", 4)) : undefined,\n sellTaxRate: taxInfoV2 ? toNumber(getTupleField(taxInfoV2, \"sellTaxRate\", 5)) : undefined,\n burntTokenAmount: toBigInt(getTupleField(taxInfo, \"burntTokenAmount\", 5)),\n totalQuoteSentToDividend: toBigInt(getTupleField(taxInfo, \"totalQuoteSentToDividend\", 6)),\n totalQuoteAddedToLiquidity: toBigInt(getTupleField(taxInfo, \"totalQuoteAddedToLiquidity\", 7)),\n totalTokenAddedToLiquidity: toBigInt(getTupleField(taxInfo, \"totalTokenAddedToLiquidity\", 8)),\n totalQuoteSentToMarketing: toBigInt(getTupleField(taxInfo, \"totalQuoteSentToMarketing\", 9)),\n marketingWallet: toAddressOrNull(getTupleField(taxInfo, \"marketingWallet\", 10)) ?? ZERO_ADDRESS,\n dividendToken,\n quoteToken,\n minimumShareBalance: toBigInt(getTupleField(taxInfo, \"minimumShareBalance\", 12)),\n vaultInfo: parseFeeVaultInfo(getTupleField(taxInfoV2, \"vaultInfo\", 14) as TupleLike),\n };\n}\n\nexport function parseVaultPortalInfo(vaultData: TupleLike): FlapVaultPortalInfo | null {\n if (!vaultData) return null;\n\n const found = Boolean(getTupleField(vaultData, \"found\", 0));\n const info = getTupleField(vaultData, \"info\", 1) as TupleLike;\n\n if (!found || !info) return { found: false };\n\n return {\n found: true,\n vault: toAddressOrNull(getTupleField(info, \"vault\", 0)) ?? ZERO_ADDRESS,\n vaultFactory: toAddressOrNull(getTupleField(info, \"vaultFactory\", 1)) ?? ZERO_ADDRESS,\n description: toStringOrUndefined(getTupleField(info, \"description\", 2)),\n isOfficial: Boolean(getTupleField(info, \"isOfficial\", 3)),\n riskLevel: toNumber(getTupleField(info, \"riskLevel\", 4)),\n };\n}\n\nexport function resolveManifestBinding(manifest: Pick<VaultManifest, \"match\">, input: RuntimeMatchInput): ManifestBindingEntry | null {\n const bindings = manifest.match.bindings;\n if (!bindings.length) return null;\n\n const resolveUnique = (candidates: ManifestBindingEntry[]) => {\n if (candidates.length === 1) return candidates[0];\n return null;\n };\n\n if (input.chainId && input.factoryAddress) {\n return resolveUnique(bindings.filter((binding) => binding.chainId === input.chainId && isSameAddress(binding.factoryAddress, input.factoryAddress)));\n }\n\n if (input.chainId) {\n return resolveUnique(bindings.filter((binding) => binding.chainId === input.chainId));\n }\n\n if (input.factoryAddress) {\n return resolveUnique(bindings.filter((binding) => isSameAddress(binding.factoryAddress, input.factoryAddress)));\n }\n\n return null;\n}\n\nexport function isManifestRuntimeMatch(manifest: Pick<VaultManifest, \"match\">, input: RuntimeMatchInput) {\n if (!input.chainId || !input.factoryAddress) return false;\n const matchingBinding = resolveManifestBinding(manifest, input);\n if (!matchingBinding) return false;\n return matchingBinding.chainId === input.chainId && isSameAddress(matchingBinding.factoryAddress, input.factoryAddress);\n}\n\nexport function isVaultBindingMatch(binding: VaultBindingPolicy, input: RuntimeMatchInput) {\n if (!input.chainId || binding.chainId !== input.chainId) return false;\n if (!input.factoryAddress || !isSameAddress(binding.factoryAddress, input.factoryAddress)) return false;\n return true;\n}\n\nexport function resolveVaultBinding(bindings: VaultBindingPolicy[], input: RuntimeMatchInput) {\n return bindings.find((binding) => isVaultBindingMatch(binding, input)) ?? null;\n}\n\nexport function resolveFeeMode(taxInfo: FlapTaxInfo | TupleLike | null | undefined, giftVaultFactory?: string | null): FeeMode {\n if (!taxInfo) return \"unknown\";\n\n const marketBps = toNumber(getTupleField(taxInfo as TupleLike, \"marketBps\", 0));\n const dividendBps = toNumber(getTupleField(taxInfo as TupleLike, \"dividendBps\", 3));\n\n if (dividendBps > 0) return \"holder\";\n if (marketBps <= 0) return \"unknown\";\n\n const parsedVaultInfo =\n \"vaultInfo\" in Object(taxInfo)\n ? (taxInfo as FlapTaxInfo).vaultInfo\n : parseFeeVaultInfo(getTupleField(taxInfo as TupleLike, \"vaultInfo\", 14) as TupleLike);\n\n if (parsedVaultInfo?.isVault === true) {\n return isSameAddress(parsedVaultInfo.factory, giftVaultFactory) ? \"gift\" : \"unknown\";\n }\n\n return \"creator\";\n}\n\nexport function resolveTaxInfoRenderSurface({\n tokenInfo,\n taxInfo,\n hasTaxVaults = false,\n isNonTaxFeeToken = false,\n}: ResolveRenderSurfaceInput): VaultRenderSurface {\n if (!tokenInfo?.exists) return \"unavailable\";\n if (!tokenInfo.isTaxToken) return isNonTaxFeeToken ? \"feeinfo\" : \"unavailable\";\n if (taxInfo?.marketBps === 10000 && hasTaxVaults) return \"vault-taxinfo\";\n return \"standard-taxinfo\";\n}\n\nexport function resolveTokenMarketPhase(tokenInfo?: FlapTokenInfo | null): TokenMarketPhase {\n if (!tokenInfo?.exists) return \"unknown\";\n return tokenInfo.status >= 2 ? \"dex-listed\" : \"internal-market\";\n}\n\nexport function isCustomVaultTaxToken(tokenInfo?: FlapTokenInfo | null) {\n return Boolean(tokenInfo?.exists && tokenInfo.isTaxToken);\n}\n\nexport function isActionAvailableForPhase(stage: ActionAvailabilityStage, marketPhase: TokenMarketPhase = \"unknown\") {\n if (stage === \"read-only\") return false;\n if (stage === \"both\") return true;\n if (marketPhase === \"unknown\") return false;\n return stage === marketPhase;\n}\n\nexport function createTaxInfoHostContext({\n tokenInfo,\n taxInfo,\n vaultInfo,\n feeMode,\n giftVaultFactory,\n hasTaxVaults,\n vaultType,\n copyScope = \"tax\",\n}: CreateTaxInfoHostContextInput): VaultHostContext {\n const resolvedFeeMode = feeMode ?? resolveFeeMode(taxInfo, giftVaultFactory);\n const renderSurface = resolveTaxInfoRenderSurface({\n tokenInfo,\n taxInfo,\n hasTaxVaults: hasTaxVaults ?? Boolean(vaultInfo?.found),\n isNonTaxFeeToken: copyScope === \"fee\",\n });\n const marketPhase = resolveTokenMarketPhase(tokenInfo);\n\n return {\n tokenInfo: tokenInfo ?? undefined,\n taxInfo: taxInfo ?? null,\n vaultInfo: vaultInfo ?? null,\n feeMode: resolvedFeeMode,\n renderSurface,\n vaultType,\n copyScope,\n isListed: tokenInfo ? tokenInfo.status >= 2 : undefined,\n marketPhase,\n };\n}\n\nexport function readTaxVaultHostContext(host?: VaultHostContext | null): TaxVaultHostSnapshot {\n const tokenInfo = host?.tokenInfo;\n const marketPhase = host?.marketPhase ?? resolveTokenMarketPhase(tokenInfo);\n const isListed = host?.isListed ?? Boolean(tokenInfo && tokenInfo.status >= 2);\n const isTaxToken = tokenInfo?.isTaxToken === true;\n\n return {\n tokenInfo,\n taxInfo: host?.taxInfo ?? null,\n vaultInfo: host?.vaultInfo ?? null,\n feeMode: host?.feeMode ?? \"unknown\",\n renderSurface: host?.renderSurface ?? \"unavailable\",\n vaultType: host?.vaultType,\n copyScope: host?.copyScope ?? \"tax\",\n marketPhase,\n isListed,\n isTaxToken,\n isSupportedCustomVaultToken: isCustomVaultTaxToken(tokenInfo),\n };\n}\n","import { resolveManifestBinding } from \"./taxInfo\";\nimport type { Address, CreateVaultRuntimeContextInput, VaultRuntimeContext, VaultRuntimeExtraConfig } from \"./types\";\n\nconst zeroAddress = \"0x0000000000000000000000000000000000000000\" as Address;\n\nexport function explorerForChain(chainId: number) {\n if (chainId === 56) return \"https://bscscan.com\";\n if (chainId === 97) return \"https://testnet.bscscan.com\";\n return undefined;\n}\n\nexport function chainLabelForChain(chainId: number) {\n if (chainId === 56) return \"BNB Chain\";\n if (chainId === 97) return \"BNB Testnet\";\n return `Chain ${chainId}`;\n}\n\nfunction buildRuntimeExtraConfig(input: CreateVaultRuntimeContextInput): VaultRuntimeExtraConfig {\n const hostRuntimeResult = input.hostRuntimeResult;\n const runtimeOverrides = input.runtimeOverrides;\n\n return {\n ...(hostRuntimeResult\n ? {\n hostRuntimeStatus: hostRuntimeResult.status,\n hostRuntimePolicy: hostRuntimeResult.policy,\n hostRuntimeDegradeReason: hostRuntimeResult.degradeReason,\n hostRuntimeWarnings: hostRuntimeResult.warnings,\n }\n : {}),\n ...(hostRuntimeResult?.presentation?.extraConfig ?? {}),\n ...(runtimeOverrides?.extraConfig ?? {}),\n };\n}\n\nexport function createVaultRuntimeContext(input: CreateVaultRuntimeContextInput): VaultRuntimeContext {\n const runtimeOverrides = input.runtimeOverrides;\n const resolvedBinding = resolveManifestBinding(input.manifest, {\n chainId: runtimeOverrides?.chainId ?? input.connectedChainId ?? input.hostRuntimeResult?.addresses.chainId,\n factoryAddress: runtimeOverrides?.factoryAddress ?? input.hostRuntimeResult?.addresses.factoryAddress,\n });\n const effectiveChainId =\n runtimeOverrides?.chainId ?? input.hostRuntimeResult?.addresses.chainId ?? input.connectedChainId ?? resolvedBinding?.chainId ?? input.manifest.match.bindings[0]?.chainId ?? 56;\n\n return {\n chainId: effectiveChainId,\n factoryAddress: runtimeOverrides?.factoryAddress ?? input.hostRuntimeResult?.addresses.factoryAddress ?? resolvedBinding?.factoryAddress ?? zeroAddress,\n tokenAddress: runtimeOverrides?.tokenAddress ?? input.hostRuntimeResult?.addresses.tokenAddress ?? zeroAddress,\n vaultAddress: runtimeOverrides?.vaultAddress ?? input.hostRuntimeResult?.addresses.vaultAddress ?? zeroAddress,\n userAddress: runtimeOverrides?.userAddress,\n tokenSymbol: runtimeOverrides?.tokenSymbol ?? input.hostRuntimeResult?.tokenSymbol,\n tokenName: runtimeOverrides?.tokenName ?? input.hostRuntimeResult?.tokenName,\n tokenImageUrl: runtimeOverrides?.tokenImageUrl ?? input.hostRuntimeResult?.tokenImageUrl,\n explorerBaseUrl: runtimeOverrides?.explorerBaseUrl ?? explorerForChain(effectiveChainId),\n paymentToken: runtimeOverrides?.paymentToken ?? input.hostRuntimeResult?.paymentToken,\n host: runtimeOverrides?.host ?? input.hostRuntimeResult?.host,\n extraConfig: buildRuntimeExtraConfig(input),\n manifest: input.manifest,\n };\n}\n","\"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 SimulateResult,\n TxReceipt,\n VaultManifest,\n VaultRuntimeContext,\n VaultRuntimeContextOverrides,\n} from \"./types\";\nimport { chainLabelForChain, createVaultRuntimeContext } from \"./runtimeContext\";\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}\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\" }: 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 notify = useMemo<FlapNotify>(() => {\n const push = (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 return {\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 }, [dismissMessage]);\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 const endpoint = getPreviewOracleEndpoint(runtimeContext.extraConfig, oracleId);\n if (!endpoint) throw new Error(`Oracle ${oracleId} is not provisioned by the preview runtime.`);\n const url = new URL(endpoint);\n for (const [key, value] of Object.entries(params ?? {})) {\n url.searchParams.set(key, value);\n }\n const response = await fetch(url.toString(), { cache: \"no-store\" });\n if (!response.ok) throw new Error(`Oracle ${oracleId} returned ${response.status}.`);\n return (await response.json()) as T;\n },\n [runtimeContext.extraConfig],\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
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { a as Address, p as HostRuntimePresentationFetcher, v as HostTokenPresentation } from './types-CX7pLmiT.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, P as PaymentToken, S as SimulateResult, T as TokenMarketPhase, w as TokenMetadataSnapshot, x as TokenRuntimeSnapshot, y as TxReceipt, V as VaultComponentProps, z as VaultHostContext, B as VaultManifest, D as VaultRenderSurface, G as VaultRuntimeContext, I as VaultRuntimeContextOverrides, J as VaultRuntimeExtraConfig } from './types-CX7pLmiT.mjs';
|
|
3
|
+
export { T as TaxVaultHostChainConfig, g as getTaxVaultHostChainConfig } from './hostRuntimeConfig-BOEJo2nq.mjs';
|
|
4
|
+
import 'viem';
|
|
5
|
+
|
|
6
|
+
interface ResolveHostPresentationInput {
|
|
7
|
+
chainId: number;
|
|
8
|
+
tokenAddress: Address;
|
|
9
|
+
flapHostOrigin?: string;
|
|
10
|
+
fetchImpl?: typeof fetch;
|
|
11
|
+
}
|
|
12
|
+
interface ResolveHostPresentationBatchInput {
|
|
13
|
+
chainId: number;
|
|
14
|
+
tokenAddresses: Address[];
|
|
15
|
+
flapHostOrigin?: string;
|
|
16
|
+
fetchImpl?: typeof fetch;
|
|
17
|
+
}
|
|
18
|
+
interface LocalHostPresentationFetcherOptions {
|
|
19
|
+
endpoint?: string;
|
|
20
|
+
fetchImpl?: typeof fetch;
|
|
21
|
+
}
|
|
22
|
+
declare function loadFlapHostTokenPresentation(input: ResolveHostPresentationInput): Promise<HostTokenPresentation | null>;
|
|
23
|
+
declare function loadFlapHostTokenPresentationBatch(input: ResolveHostPresentationBatchInput): Promise<Record<string, HostTokenPresentation | null>>;
|
|
24
|
+
declare function createLocalHostPresentationFetcher(options?: LocalHostPresentationFetcherOptions): HostRuntimePresentationFetcher;
|
|
25
|
+
|
|
26
|
+
export { Address, HostRuntimePresentationFetcher, HostTokenPresentation, type LocalHostPresentationFetcherOptions, type ResolveHostPresentationBatchInput, type ResolveHostPresentationInput, createLocalHostPresentationFetcher, loadFlapHostTokenPresentation, loadFlapHostTokenPresentationBatch };
|
package/server.js
ADDED
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
import { isAddress, getAddress } from 'viem';
|
|
2
|
+
|
|
3
|
+
// src/sdk/hostPresentation.ts
|
|
4
|
+
|
|
5
|
+
// src/sdk/hostRuntimeConfig.ts
|
|
6
|
+
var taxVaultHostChains = {
|
|
7
|
+
56: {
|
|
8
|
+
portal: "0xe2ce6ab80874fa9fa2aae65d277dd6b8e65c9de0",
|
|
9
|
+
taxTokenHelperAddress: "0x53841c73217735F37BC1775538b03b23feFD8346",
|
|
10
|
+
vaultPortal: "0x90497450f2a706f1951b5bdda52B4E5d16f34C06",
|
|
11
|
+
wrappedNativeTokenAddress: "0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c",
|
|
12
|
+
giftVaultFactory: "0x025549F52B03cF36f9e1a337c02d3AA7Af66ab32",
|
|
13
|
+
hostChainSlug: "bnb",
|
|
14
|
+
ipfsGateway: "https://gateway.pinata.cloud"
|
|
15
|
+
},
|
|
16
|
+
97: {
|
|
17
|
+
portal: "0x5bEacaF7ABCbB3aB280e80D007FD31fcE26510e9",
|
|
18
|
+
taxTokenHelperAddress: "0xD64441e5FcD02D342B8cf6eBA10Ef6E40d0dA90f",
|
|
19
|
+
vaultPortal: "0x027e3704fC5C16522e9393d04C60A3ac5c0d775f",
|
|
20
|
+
wrappedNativeTokenAddress: "0xae13d989daC2f0dEbFf460aC112a837C89BAa7cd",
|
|
21
|
+
giftVaultFactory: "0xa02DA44D67DB6D692efa7f751b5952bd670d5326",
|
|
22
|
+
hostChainSlug: "bnb-testnet",
|
|
23
|
+
ipfsGateway: "https://gateway.pinata.cloud"
|
|
24
|
+
}
|
|
25
|
+
};
|
|
26
|
+
function getTaxVaultHostChainConfig(chainId) {
|
|
27
|
+
return taxVaultHostChains[chainId];
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
// src/sdk/hostPresentation.ts
|
|
31
|
+
var DEFAULT_FLAP_HOST_ORIGIN = "https://flap.sh";
|
|
32
|
+
var DEFAULT_RUNTIME_PRESENTATION_ENDPOINT = "/api/runtime/token-presentation";
|
|
33
|
+
var DEFAULT_IPFS_GATEWAY = "https://gateway.pinata.cloud";
|
|
34
|
+
var LEGACY_IPFS_GATEWAY_HOSTS = /* @__PURE__ */ new Set(["cf-ipfs.com", "pump.mypinata.cloud", "gateway.pinata.cloud"]);
|
|
35
|
+
function normalizeOrigin(origin) {
|
|
36
|
+
if (!origin) return DEFAULT_FLAP_HOST_ORIGIN;
|
|
37
|
+
return origin.replace(/\/+$/, "");
|
|
38
|
+
}
|
|
39
|
+
function normalizeAddress(address) {
|
|
40
|
+
return isAddress(address) ? getAddress(address) : null;
|
|
41
|
+
}
|
|
42
|
+
function normalizeString(value) {
|
|
43
|
+
return typeof value === "string" && value.trim() ? value.trim() : void 0;
|
|
44
|
+
}
|
|
45
|
+
function resolveHostChainSlug(chainId) {
|
|
46
|
+
return getTaxVaultHostChainConfig(chainId)?.hostChainSlug;
|
|
47
|
+
}
|
|
48
|
+
function resolveIpfsGateway(chainId) {
|
|
49
|
+
return getTaxVaultHostChainConfig(chainId)?.ipfsGateway ?? DEFAULT_IPFS_GATEWAY;
|
|
50
|
+
}
|
|
51
|
+
function rewriteToPublicIpfsGateway(rawUrl, chainId) {
|
|
52
|
+
const gateway = resolveIpfsGateway(chainId);
|
|
53
|
+
const parsed = new URL(rawUrl);
|
|
54
|
+
if (!LEGACY_IPFS_GATEWAY_HOSTS.has(parsed.hostname)) return rawUrl;
|
|
55
|
+
const publicGateway = new URL(gateway);
|
|
56
|
+
parsed.protocol = publicGateway.protocol;
|
|
57
|
+
parsed.host = publicGateway.host;
|
|
58
|
+
return parsed.toString();
|
|
59
|
+
}
|
|
60
|
+
function wrapHostImageUrl(image, chainId) {
|
|
61
|
+
const raw = normalizeString(image);
|
|
62
|
+
if (!raw) return void 0;
|
|
63
|
+
if (raw.startsWith("/")) return raw;
|
|
64
|
+
if (raw.startsWith("https://")) return rewriteToPublicIpfsGateway(raw, chainId);
|
|
65
|
+
if (raw.startsWith("http://")) return raw;
|
|
66
|
+
const gateway = resolveIpfsGateway(chainId).replace(/\/+$/, "");
|
|
67
|
+
if (raw.startsWith("ipfs://")) return `${gateway}/ipfs/${raw.slice("ipfs://".length)}`;
|
|
68
|
+
return `${gateway}/ipfs/${raw}`;
|
|
69
|
+
}
|
|
70
|
+
function buildTokenDetailHref(origin, chainSlug, tokenAddress) {
|
|
71
|
+
return `${origin}/${chainSlug}/${tokenAddress.toLowerCase()}/taxinfo`;
|
|
72
|
+
}
|
|
73
|
+
function buildChainHref(origin, chainSlug) {
|
|
74
|
+
return `${origin}/${chainSlug}`;
|
|
75
|
+
}
|
|
76
|
+
function resolveMetadataItem(payload, tokenAddress) {
|
|
77
|
+
const data = payload?.data;
|
|
78
|
+
if (!data || typeof data !== "object") return null;
|
|
79
|
+
const checksum = getAddress(tokenAddress);
|
|
80
|
+
const lower = tokenAddress.toLowerCase();
|
|
81
|
+
const direct = data[checksum] ?? data[lower];
|
|
82
|
+
if (direct && typeof direct === "object") return direct;
|
|
83
|
+
for (const value of Object.values(data)) {
|
|
84
|
+
if (!value || typeof value !== "object") continue;
|
|
85
|
+
const itemAddress = normalizeString(value.address);
|
|
86
|
+
if (itemAddress && normalizeAddress(itemAddress)?.toLowerCase() === lower) {
|
|
87
|
+
return value;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
return null;
|
|
91
|
+
}
|
|
92
|
+
function toHostPresentation(chainId, tokenAddress, flapHostOrigin, item) {
|
|
93
|
+
if (!item) return null;
|
|
94
|
+
const chainSlug = resolveHostChainSlug(chainId);
|
|
95
|
+
if (!chainSlug) return null;
|
|
96
|
+
const tokenSymbol = normalizeString(item.symbol);
|
|
97
|
+
const tokenName = normalizeString(item.name);
|
|
98
|
+
const tokenImageUrl = wrapHostImageUrl(item.metadata?.image, chainId);
|
|
99
|
+
if (!tokenSymbol && !tokenName && !tokenImageUrl) return null;
|
|
100
|
+
return {
|
|
101
|
+
tokenSymbol,
|
|
102
|
+
tokenName,
|
|
103
|
+
tokenImageUrl,
|
|
104
|
+
tokenDetailHref: buildTokenDetailHref(flapHostOrigin, chainSlug, tokenAddress),
|
|
105
|
+
chainHref: buildChainHref(flapHostOrigin, chainSlug),
|
|
106
|
+
extraConfig: {
|
|
107
|
+
hostPresentationOrigin: flapHostOrigin,
|
|
108
|
+
hostPresentationChain: chainSlug,
|
|
109
|
+
...normalizeString(item.metadata?.description) ? { tokenDescription: normalizeString(item.metadata?.description) } : {}
|
|
110
|
+
}
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
async function loadFlapHostTokenPresentation(input) {
|
|
114
|
+
const chainSlug = resolveHostChainSlug(input.chainId);
|
|
115
|
+
if (!chainSlug) return null;
|
|
116
|
+
const tokenAddress = normalizeAddress(input.tokenAddress);
|
|
117
|
+
if (!tokenAddress) return null;
|
|
118
|
+
const flapHostOrigin = normalizeOrigin(input.flapHostOrigin);
|
|
119
|
+
const fetchImpl = input.fetchImpl ?? fetch;
|
|
120
|
+
const response = await fetchImpl(`${flapHostOrigin}/api/tax-dashboard/metadata`, {
|
|
121
|
+
method: "POST",
|
|
122
|
+
headers: {
|
|
123
|
+
"content-type": "application/json"
|
|
124
|
+
},
|
|
125
|
+
body: JSON.stringify({
|
|
126
|
+
chain: chainSlug,
|
|
127
|
+
addresses: [tokenAddress.toLowerCase()]
|
|
128
|
+
}),
|
|
129
|
+
cache: "no-store"
|
|
130
|
+
});
|
|
131
|
+
if (!response.ok) return null;
|
|
132
|
+
const payload = await response.json();
|
|
133
|
+
return toHostPresentation(input.chainId, tokenAddress, flapHostOrigin, resolveMetadataItem(payload, tokenAddress));
|
|
134
|
+
}
|
|
135
|
+
async function loadFlapHostTokenPresentationBatch(input) {
|
|
136
|
+
const chainSlug = resolveHostChainSlug(input.chainId);
|
|
137
|
+
if (!chainSlug) return {};
|
|
138
|
+
const normalizedAddresses = input.tokenAddresses.map((tokenAddress) => normalizeAddress(tokenAddress)).filter((tokenAddress) => Boolean(tokenAddress));
|
|
139
|
+
if (!normalizedAddresses.length) return {};
|
|
140
|
+
const flapHostOrigin = normalizeOrigin(input.flapHostOrigin);
|
|
141
|
+
const fetchImpl = input.fetchImpl ?? fetch;
|
|
142
|
+
const response = await fetchImpl(`${flapHostOrigin}/api/tax-dashboard/metadata`, {
|
|
143
|
+
method: "POST",
|
|
144
|
+
headers: {
|
|
145
|
+
"content-type": "application/json"
|
|
146
|
+
},
|
|
147
|
+
body: JSON.stringify({
|
|
148
|
+
chain: chainSlug,
|
|
149
|
+
addresses: normalizedAddresses.map((tokenAddress) => tokenAddress.toLowerCase())
|
|
150
|
+
}),
|
|
151
|
+
cache: "no-store"
|
|
152
|
+
});
|
|
153
|
+
if (!response.ok) return {};
|
|
154
|
+
const payload = await response.json();
|
|
155
|
+
return Object.fromEntries(
|
|
156
|
+
normalizedAddresses.map((tokenAddress) => [
|
|
157
|
+
tokenAddress,
|
|
158
|
+
toHostPresentation(input.chainId, tokenAddress, flapHostOrigin, resolveMetadataItem(payload, tokenAddress))
|
|
159
|
+
])
|
|
160
|
+
);
|
|
161
|
+
}
|
|
162
|
+
function parsePresentationPayload(payload) {
|
|
163
|
+
if (!payload || typeof payload !== "object") return null;
|
|
164
|
+
const record = payload;
|
|
165
|
+
const tokenSymbol = normalizeString(record.tokenSymbol);
|
|
166
|
+
const tokenName = normalizeString(record.tokenName);
|
|
167
|
+
const tokenImageUrl = normalizeString(record.tokenImageUrl);
|
|
168
|
+
if (!tokenSymbol && !tokenName && !tokenImageUrl) return null;
|
|
169
|
+
return {
|
|
170
|
+
tokenSymbol,
|
|
171
|
+
tokenName,
|
|
172
|
+
tokenImageUrl,
|
|
173
|
+
tokenDetailHref: normalizeString(record.tokenDetailHref),
|
|
174
|
+
chainHref: normalizeString(record.chainHref),
|
|
175
|
+
extraConfig: record.extraConfig && typeof record.extraConfig === "object" && !Array.isArray(record.extraConfig) ? record.extraConfig : void 0
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
function createLocalHostPresentationFetcher(options = {}) {
|
|
179
|
+
const endpoint = options.endpoint ?? DEFAULT_RUNTIME_PRESENTATION_ENDPOINT;
|
|
180
|
+
const fetchImpl = options.fetchImpl ?? fetch;
|
|
181
|
+
return async ({ chainId, tokenAddress, factoryAddress, vaultAddress }) => {
|
|
182
|
+
const query = new URLSearchParams({
|
|
183
|
+
chainId: String(chainId),
|
|
184
|
+
tokenAddress
|
|
185
|
+
});
|
|
186
|
+
if (factoryAddress) query.set("factoryAddress", factoryAddress);
|
|
187
|
+
if (vaultAddress) query.set("vaultAddress", vaultAddress);
|
|
188
|
+
const response = await fetchImpl(`${endpoint}?${query.toString()}`, {
|
|
189
|
+
method: "GET",
|
|
190
|
+
cache: "no-store"
|
|
191
|
+
});
|
|
192
|
+
if (!response.ok) return null;
|
|
193
|
+
const payload = await response.json();
|
|
194
|
+
return parsePresentationPayload(payload?.data);
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
export { createLocalHostPresentationFetcher, getTaxVaultHostChainConfig, loadFlapHostTokenPresentation, loadFlapHostTokenPresentationBatch };
|
|
199
|
+
//# sourceMappingURL=server.js.map
|
|
200
|
+
//# sourceMappingURL=server.js.map
|
package/server.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/sdk/hostRuntimeConfig.ts","../../src/sdk/hostPresentation.ts"],"names":[],"mappings":"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","file":"server.js","sourcesContent":["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 { getAddress, isAddress } from \"viem\";\nimport { getTaxVaultHostChainConfig } from \"./hostRuntimeConfig\";\nimport type { Address, HostRuntimePresentationFetcher, HostTokenPresentation } from \"./types\";\n\nconst DEFAULT_FLAP_HOST_ORIGIN = \"https://flap.sh\";\nconst DEFAULT_RUNTIME_PRESENTATION_ENDPOINT = \"/api/runtime/token-presentation\";\nconst DEFAULT_IPFS_GATEWAY = \"https://gateway.pinata.cloud\";\nconst LEGACY_IPFS_GATEWAY_HOSTS = new Set([\"cf-ipfs.com\", \"pump.mypinata.cloud\", \"gateway.pinata.cloud\"]);\n\ninterface HostMetadataResponseItem {\n address?: string;\n name?: string;\n symbol?: string;\n metadata?: {\n image?: string;\n description?: string;\n };\n}\n\ninterface HostMetadataResponseBody {\n data?: Record<string, HostMetadataResponseItem> | null;\n}\n\nexport interface ResolveHostPresentationInput {\n chainId: number;\n tokenAddress: Address;\n flapHostOrigin?: string;\n fetchImpl?: typeof fetch;\n}\n\nexport interface ResolveHostPresentationBatchInput {\n chainId: number;\n tokenAddresses: Address[];\n flapHostOrigin?: string;\n fetchImpl?: typeof fetch;\n}\n\nexport interface LocalHostPresentationFetcherOptions {\n endpoint?: string;\n fetchImpl?: typeof fetch;\n}\n\nfunction normalizeOrigin(origin?: string) {\n if (!origin) return DEFAULT_FLAP_HOST_ORIGIN;\n return origin.replace(/\\/+$/, \"\");\n}\n\nfunction normalizeAddress(address: string): Address | null {\n return isAddress(address) ? (getAddress(address) as Address) : null;\n}\n\nfunction normalizeString(value: unknown) {\n return typeof value === \"string\" && value.trim() ? value.trim() : undefined;\n}\n\nfunction resolveHostChainSlug(chainId: number) {\n return getTaxVaultHostChainConfig(chainId)?.hostChainSlug;\n}\n\nfunction resolveIpfsGateway(chainId: number) {\n return getTaxVaultHostChainConfig(chainId)?.ipfsGateway ?? DEFAULT_IPFS_GATEWAY;\n}\n\nfunction rewriteToPublicIpfsGateway(rawUrl: string, chainId: number) {\n const gateway = resolveIpfsGateway(chainId);\n const parsed = new URL(rawUrl);\n if (!LEGACY_IPFS_GATEWAY_HOSTS.has(parsed.hostname)) return rawUrl;\n\n const publicGateway = new URL(gateway);\n parsed.protocol = publicGateway.protocol;\n parsed.host = publicGateway.host;\n return parsed.toString();\n}\n\nfunction wrapHostImageUrl(image: string | undefined, chainId: number) {\n const raw = normalizeString(image);\n if (!raw) return undefined;\n if (raw.startsWith(\"/\")) return raw;\n if (raw.startsWith(\"https://\")) return rewriteToPublicIpfsGateway(raw, chainId);\n if (raw.startsWith(\"http://\")) return raw;\n\n const gateway = resolveIpfsGateway(chainId).replace(/\\/+$/, \"\");\n if (raw.startsWith(\"ipfs://\")) return `${gateway}/ipfs/${raw.slice(\"ipfs://\".length)}`;\n return `${gateway}/ipfs/${raw}`;\n}\n\nfunction buildTokenDetailHref(origin: string, chainSlug: string, tokenAddress: Address) {\n return `${origin}/${chainSlug}/${tokenAddress.toLowerCase()}/taxinfo`;\n}\n\nfunction buildChainHref(origin: string, chainSlug: string) {\n return `${origin}/${chainSlug}`;\n}\n\nfunction resolveMetadataItem(payload: HostMetadataResponseBody | null | undefined, tokenAddress: Address) {\n const data = payload?.data;\n if (!data || typeof data !== \"object\") return null;\n\n const checksum = getAddress(tokenAddress);\n const lower = tokenAddress.toLowerCase();\n const direct = data[checksum] ?? data[lower];\n if (direct && typeof direct === \"object\") return direct;\n\n for (const value of Object.values(data)) {\n if (!value || typeof value !== \"object\") continue;\n const itemAddress = normalizeString((value as HostMetadataResponseItem).address);\n if (itemAddress && normalizeAddress(itemAddress)?.toLowerCase() === lower) {\n return value;\n }\n }\n\n return null;\n}\n\nfunction toHostPresentation(chainId: number, tokenAddress: Address, flapHostOrigin: string, item: HostMetadataResponseItem | null): HostTokenPresentation | null {\n if (!item) return null;\n\n const chainSlug = resolveHostChainSlug(chainId);\n if (!chainSlug) return null;\n\n const tokenSymbol = normalizeString(item.symbol);\n const tokenName = normalizeString(item.name);\n const tokenImageUrl = wrapHostImageUrl(item.metadata?.image, chainId);\n\n if (!tokenSymbol && !tokenName && !tokenImageUrl) return null;\n\n return {\n tokenSymbol,\n tokenName,\n tokenImageUrl,\n tokenDetailHref: buildTokenDetailHref(flapHostOrigin, chainSlug, tokenAddress),\n chainHref: buildChainHref(flapHostOrigin, chainSlug),\n extraConfig: {\n hostPresentationOrigin: flapHostOrigin,\n hostPresentationChain: chainSlug,\n ...(normalizeString(item.metadata?.description) ? { tokenDescription: normalizeString(item.metadata?.description) } : {}),\n },\n };\n}\n\nexport async function loadFlapHostTokenPresentation(input: ResolveHostPresentationInput): Promise<HostTokenPresentation | null> {\n const chainSlug = resolveHostChainSlug(input.chainId);\n if (!chainSlug) return null;\n\n const tokenAddress = normalizeAddress(input.tokenAddress);\n if (!tokenAddress) return null;\n\n const flapHostOrigin = normalizeOrigin(input.flapHostOrigin);\n const fetchImpl = input.fetchImpl ?? fetch;\n const response = await fetchImpl(`${flapHostOrigin}/api/tax-dashboard/metadata`, {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify({\n chain: chainSlug,\n addresses: [tokenAddress.toLowerCase()],\n }),\n cache: \"no-store\",\n });\n\n if (!response.ok) return null;\n\n const payload = (await response.json()) as HostMetadataResponseBody;\n return toHostPresentation(input.chainId, tokenAddress, flapHostOrigin, resolveMetadataItem(payload, tokenAddress));\n}\n\nexport async function loadFlapHostTokenPresentationBatch(input: ResolveHostPresentationBatchInput): Promise<Record<string, HostTokenPresentation | null>> {\n const chainSlug = resolveHostChainSlug(input.chainId);\n if (!chainSlug) return {};\n\n const normalizedAddresses = input.tokenAddresses\n .map((tokenAddress) => normalizeAddress(tokenAddress))\n .filter((tokenAddress): tokenAddress is Address => Boolean(tokenAddress));\n if (!normalizedAddresses.length) return {};\n\n const flapHostOrigin = normalizeOrigin(input.flapHostOrigin);\n const fetchImpl = input.fetchImpl ?? fetch;\n const response = await fetchImpl(`${flapHostOrigin}/api/tax-dashboard/metadata`, {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify({\n chain: chainSlug,\n addresses: normalizedAddresses.map((tokenAddress) => tokenAddress.toLowerCase()),\n }),\n cache: \"no-store\",\n });\n\n if (!response.ok) return {};\n\n const payload = (await response.json()) as HostMetadataResponseBody;\n return Object.fromEntries(\n normalizedAddresses.map((tokenAddress) => [\n tokenAddress,\n toHostPresentation(input.chainId, tokenAddress, flapHostOrigin, resolveMetadataItem(payload, tokenAddress)),\n ]),\n );\n}\n\nfunction parsePresentationPayload(payload: unknown): HostTokenPresentation | null {\n if (!payload || typeof payload !== \"object\") return null;\n const record = payload as Record<string, unknown>;\n const tokenSymbol = normalizeString(record.tokenSymbol);\n const tokenName = normalizeString(record.tokenName);\n const tokenImageUrl = normalizeString(record.tokenImageUrl);\n\n if (!tokenSymbol && !tokenName && !tokenImageUrl) return null;\n\n return {\n tokenSymbol,\n tokenName,\n tokenImageUrl,\n tokenDetailHref: normalizeString(record.tokenDetailHref),\n chainHref: normalizeString(record.chainHref),\n extraConfig: record.extraConfig && typeof record.extraConfig === \"object\" && !Array.isArray(record.extraConfig) ? (record.extraConfig as Record<string, unknown>) : undefined,\n };\n}\n\nexport function createLocalHostPresentationFetcher(options: LocalHostPresentationFetcherOptions = {}): HostRuntimePresentationFetcher {\n const endpoint = options.endpoint ?? DEFAULT_RUNTIME_PRESENTATION_ENDPOINT;\n const fetchImpl = options.fetchImpl ?? fetch;\n\n return async ({ chainId, tokenAddress, factoryAddress, vaultAddress }) => {\n const query = new URLSearchParams({\n chainId: String(chainId),\n tokenAddress,\n });\n if (factoryAddress) query.set(\"factoryAddress\", factoryAddress);\n if (vaultAddress) query.set(\"vaultAddress\", vaultAddress);\n\n const response = await fetchImpl(`${endpoint}?${query.toString()}`, {\n method: \"GET\",\n cache: \"no-store\",\n });\n if (!response.ok) return null;\n\n const payload = (await response.json()) as { data?: unknown } | null;\n return parsePresentationPayload(payload?.data);\n };\n}\n"]}
|
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
import { a as Address, A as ActionAvailabilityStage, T as TokenMarketPhase, h as FlapTokenInfo, z as VaultHostContext, g as FlapTaxInfo, i as FlapVaultPortalInfo, F as FeeMode, D as VaultRenderSurface, B as VaultManifest, d as FlapFeeVaultInfo, M as ManifestBindingEntry } from './types-CX7pLmiT.mjs';
|
|
2
|
+
|
|
3
|
+
declare const standardErc20Abi: readonly [{
|
|
4
|
+
readonly type: "event";
|
|
5
|
+
readonly name: "Approval";
|
|
6
|
+
readonly inputs: readonly [{
|
|
7
|
+
readonly indexed: true;
|
|
8
|
+
readonly name: "owner";
|
|
9
|
+
readonly type: "address";
|
|
10
|
+
}, {
|
|
11
|
+
readonly indexed: true;
|
|
12
|
+
readonly name: "spender";
|
|
13
|
+
readonly type: "address";
|
|
14
|
+
}, {
|
|
15
|
+
readonly indexed: false;
|
|
16
|
+
readonly name: "value";
|
|
17
|
+
readonly type: "uint256";
|
|
18
|
+
}];
|
|
19
|
+
}, {
|
|
20
|
+
readonly type: "event";
|
|
21
|
+
readonly name: "Transfer";
|
|
22
|
+
readonly inputs: readonly [{
|
|
23
|
+
readonly indexed: true;
|
|
24
|
+
readonly name: "from";
|
|
25
|
+
readonly type: "address";
|
|
26
|
+
}, {
|
|
27
|
+
readonly indexed: true;
|
|
28
|
+
readonly name: "to";
|
|
29
|
+
readonly type: "address";
|
|
30
|
+
}, {
|
|
31
|
+
readonly indexed: false;
|
|
32
|
+
readonly name: "value";
|
|
33
|
+
readonly type: "uint256";
|
|
34
|
+
}];
|
|
35
|
+
}, {
|
|
36
|
+
readonly type: "function";
|
|
37
|
+
readonly name: "allowance";
|
|
38
|
+
readonly stateMutability: "view";
|
|
39
|
+
readonly inputs: readonly [{
|
|
40
|
+
readonly name: "owner";
|
|
41
|
+
readonly type: "address";
|
|
42
|
+
}, {
|
|
43
|
+
readonly name: "spender";
|
|
44
|
+
readonly type: "address";
|
|
45
|
+
}];
|
|
46
|
+
readonly outputs: readonly [{
|
|
47
|
+
readonly type: "uint256";
|
|
48
|
+
}];
|
|
49
|
+
}, {
|
|
50
|
+
readonly type: "function";
|
|
51
|
+
readonly name: "approve";
|
|
52
|
+
readonly stateMutability: "nonpayable";
|
|
53
|
+
readonly inputs: readonly [{
|
|
54
|
+
readonly name: "spender";
|
|
55
|
+
readonly type: "address";
|
|
56
|
+
}, {
|
|
57
|
+
readonly name: "amount";
|
|
58
|
+
readonly type: "uint256";
|
|
59
|
+
}];
|
|
60
|
+
readonly outputs: readonly [{
|
|
61
|
+
readonly type: "bool";
|
|
62
|
+
}];
|
|
63
|
+
}, {
|
|
64
|
+
readonly type: "function";
|
|
65
|
+
readonly name: "balanceOf";
|
|
66
|
+
readonly stateMutability: "view";
|
|
67
|
+
readonly inputs: readonly [{
|
|
68
|
+
readonly name: "account";
|
|
69
|
+
readonly type: "address";
|
|
70
|
+
}];
|
|
71
|
+
readonly outputs: readonly [{
|
|
72
|
+
readonly type: "uint256";
|
|
73
|
+
}];
|
|
74
|
+
}, {
|
|
75
|
+
readonly type: "function";
|
|
76
|
+
readonly name: "decimals";
|
|
77
|
+
readonly stateMutability: "view";
|
|
78
|
+
readonly inputs: readonly [];
|
|
79
|
+
readonly outputs: readonly [{
|
|
80
|
+
readonly type: "uint8";
|
|
81
|
+
}];
|
|
82
|
+
}, {
|
|
83
|
+
readonly type: "function";
|
|
84
|
+
readonly name: "name";
|
|
85
|
+
readonly stateMutability: "view";
|
|
86
|
+
readonly inputs: readonly [];
|
|
87
|
+
readonly outputs: readonly [{
|
|
88
|
+
readonly type: "string";
|
|
89
|
+
}];
|
|
90
|
+
}, {
|
|
91
|
+
readonly type: "function";
|
|
92
|
+
readonly name: "symbol";
|
|
93
|
+
readonly stateMutability: "view";
|
|
94
|
+
readonly inputs: readonly [];
|
|
95
|
+
readonly outputs: readonly [{
|
|
96
|
+
readonly type: "string";
|
|
97
|
+
}];
|
|
98
|
+
}, {
|
|
99
|
+
readonly type: "function";
|
|
100
|
+
readonly name: "totalSupply";
|
|
101
|
+
readonly stateMutability: "view";
|
|
102
|
+
readonly inputs: readonly [];
|
|
103
|
+
readonly outputs: readonly [{
|
|
104
|
+
readonly type: "uint256";
|
|
105
|
+
}];
|
|
106
|
+
}, {
|
|
107
|
+
readonly type: "function";
|
|
108
|
+
readonly name: "transfer";
|
|
109
|
+
readonly stateMutability: "nonpayable";
|
|
110
|
+
readonly inputs: readonly [{
|
|
111
|
+
readonly name: "recipient";
|
|
112
|
+
readonly type: "address";
|
|
113
|
+
}, {
|
|
114
|
+
readonly name: "amount";
|
|
115
|
+
readonly type: "uint256";
|
|
116
|
+
}];
|
|
117
|
+
readonly outputs: readonly [{
|
|
118
|
+
readonly type: "bool";
|
|
119
|
+
}];
|
|
120
|
+
}, {
|
|
121
|
+
readonly type: "function";
|
|
122
|
+
readonly name: "transferFrom";
|
|
123
|
+
readonly stateMutability: "nonpayable";
|
|
124
|
+
readonly inputs: readonly [{
|
|
125
|
+
readonly name: "sender";
|
|
126
|
+
readonly type: "address";
|
|
127
|
+
}, {
|
|
128
|
+
readonly name: "recipient";
|
|
129
|
+
readonly type: "address";
|
|
130
|
+
}, {
|
|
131
|
+
readonly name: "amount";
|
|
132
|
+
readonly type: "uint256";
|
|
133
|
+
}];
|
|
134
|
+
readonly outputs: readonly [{
|
|
135
|
+
readonly type: "bool";
|
|
136
|
+
}];
|
|
137
|
+
}];
|
|
138
|
+
|
|
139
|
+
declare function shortenAddress(raw?: string, start?: number, end?: number): string;
|
|
140
|
+
declare function formatTokenAmount(value?: bigint | string | number | null, decimals?: number, precision?: number): string;
|
|
141
|
+
declare function parseTokenAmount(value: string, decimals?: number): bigint;
|
|
142
|
+
declare function formatPercentBps(value?: bigint | number | null, precision?: number): string;
|
|
143
|
+
declare function formatCountdown(targetTimeMs?: number): string;
|
|
144
|
+
|
|
145
|
+
declare const ZERO_ADDRESS: Address;
|
|
146
|
+
type TupleLike = (Record<string, unknown> & readonly unknown[]) | Record<string, unknown> | readonly unknown[] | null | undefined;
|
|
147
|
+
interface VaultBindingPolicy {
|
|
148
|
+
name: string;
|
|
149
|
+
chainId: number;
|
|
150
|
+
factoryAddress: Address;
|
|
151
|
+
vaultAddresses?: Address[];
|
|
152
|
+
extra?: Record<string, unknown>;
|
|
153
|
+
isAiPowered?: boolean;
|
|
154
|
+
}
|
|
155
|
+
interface RuntimeMatchInput {
|
|
156
|
+
chainId?: number;
|
|
157
|
+
factoryAddress?: string | null;
|
|
158
|
+
tokenAddress?: string | null;
|
|
159
|
+
}
|
|
160
|
+
interface CreateTaxInfoHostContextInput {
|
|
161
|
+
tokenInfo?: FlapTokenInfo | null;
|
|
162
|
+
taxInfo?: FlapTaxInfo | null;
|
|
163
|
+
vaultInfo?: FlapVaultPortalInfo | null;
|
|
164
|
+
feeMode?: FeeMode | null;
|
|
165
|
+
giftVaultFactory?: string | null;
|
|
166
|
+
hasTaxVaults?: boolean;
|
|
167
|
+
vaultType?: string;
|
|
168
|
+
copyScope?: "tax" | "fee";
|
|
169
|
+
}
|
|
170
|
+
interface ResolveRenderSurfaceInput {
|
|
171
|
+
tokenInfo?: FlapTokenInfo | null;
|
|
172
|
+
taxInfo?: FlapTaxInfo | null;
|
|
173
|
+
hasTaxVaults?: boolean;
|
|
174
|
+
isNonTaxFeeToken?: boolean;
|
|
175
|
+
}
|
|
176
|
+
interface TaxVaultHostSnapshot {
|
|
177
|
+
tokenInfo?: FlapTokenInfo;
|
|
178
|
+
taxInfo?: FlapTaxInfo | null;
|
|
179
|
+
vaultInfo?: FlapVaultPortalInfo | null;
|
|
180
|
+
feeMode: FeeMode;
|
|
181
|
+
renderSurface: VaultRenderSurface;
|
|
182
|
+
vaultType?: string;
|
|
183
|
+
copyScope: "tax" | "fee";
|
|
184
|
+
marketPhase: TokenMarketPhase;
|
|
185
|
+
isListed: boolean;
|
|
186
|
+
isTaxToken: boolean;
|
|
187
|
+
isSupportedCustomVaultToken: boolean;
|
|
188
|
+
}
|
|
189
|
+
declare function getTupleField(data: TupleLike, name: string, index: number): unknown;
|
|
190
|
+
declare function isValidAddress(value?: string | null): value is Address;
|
|
191
|
+
declare function normalizeAddress(value?: string | null): Address | undefined;
|
|
192
|
+
declare function isSameAddress(a?: string | null, b?: string | null): boolean;
|
|
193
|
+
declare function parsePortalTokenInfo(tokenData: TupleLike): FlapTokenInfo | null;
|
|
194
|
+
declare function parseFeeVaultInfo(vaultInfo: TupleLike): FlapFeeVaultInfo | null;
|
|
195
|
+
declare function parseTaxTokenInfo(taxInfo: TupleLike, taxInfoV2?: TupleLike, options?: {
|
|
196
|
+
wrappedNativeTokenAddress?: Address;
|
|
197
|
+
}): FlapTaxInfo | null;
|
|
198
|
+
declare function parseVaultPortalInfo(vaultData: TupleLike): FlapVaultPortalInfo | null;
|
|
199
|
+
declare function resolveManifestBinding(manifest: Pick<VaultManifest, "match">, input: RuntimeMatchInput): ManifestBindingEntry | null;
|
|
200
|
+
declare function isManifestRuntimeMatch(manifest: Pick<VaultManifest, "match">, input: RuntimeMatchInput): boolean;
|
|
201
|
+
declare function isVaultBindingMatch(binding: VaultBindingPolicy, input: RuntimeMatchInput): boolean;
|
|
202
|
+
declare function resolveVaultBinding(bindings: VaultBindingPolicy[], input: RuntimeMatchInput): VaultBindingPolicy | null;
|
|
203
|
+
declare function resolveFeeMode(taxInfo: FlapTaxInfo | TupleLike | null | undefined, giftVaultFactory?: string | null): FeeMode;
|
|
204
|
+
declare function resolveTaxInfoRenderSurface({ tokenInfo, taxInfo, hasTaxVaults, isNonTaxFeeToken, }: ResolveRenderSurfaceInput): VaultRenderSurface;
|
|
205
|
+
declare function resolveTokenMarketPhase(tokenInfo?: FlapTokenInfo | null): TokenMarketPhase;
|
|
206
|
+
declare function isCustomVaultTaxToken(tokenInfo?: FlapTokenInfo | null): boolean;
|
|
207
|
+
declare function isActionAvailableForPhase(stage: ActionAvailabilityStage, marketPhase?: TokenMarketPhase): boolean;
|
|
208
|
+
declare function createTaxInfoHostContext({ tokenInfo, taxInfo, vaultInfo, feeMode, giftVaultFactory, hasTaxVaults, vaultType, copyScope, }: CreateTaxInfoHostContextInput): VaultHostContext;
|
|
209
|
+
declare function readTaxVaultHostContext(host?: VaultHostContext | null): TaxVaultHostSnapshot;
|
|
210
|
+
|
|
211
|
+
type TxErrorKind = "userRejected" | "walletDisconnected" | "wrongNetwork" | "insufficientFunds" | "simulationFailed" | "reverted" | "unknown";
|
|
212
|
+
type TxErrorMessageMap = Partial<Record<TxErrorKind, string>>;
|
|
213
|
+
declare function getTxErrorKind(error: unknown): TxErrorKind;
|
|
214
|
+
declare function handleTxError(error: unknown, messages?: TxErrorMessageMap): string;
|
|
215
|
+
|
|
216
|
+
export { resolveVaultBinding as A, shortenAddress as B, type CreateTaxInfoHostContextInput as C, standardErc20Abi as D, type ResolveRenderSurfaceInput as R, type TaxVaultHostSnapshot as T, type VaultBindingPolicy as V, ZERO_ADDRESS as Z, type RuntimeMatchInput as a, type TxErrorKind as b, createTaxInfoHostContext as c, formatPercentBps as d, formatTokenAmount as e, formatCountdown as f, getTupleField as g, getTxErrorKind as h, handleTxError as i, isActionAvailableForPhase as j, isCustomVaultTaxToken as k, isManifestRuntimeMatch as l, isSameAddress as m, isValidAddress as n, isVaultBindingMatch as o, normalizeAddress as p, parseFeeVaultInfo as q, parsePortalTokenInfo as r, parseTaxTokenInfo as s, parseTokenAmount as t, parseVaultPortalInfo as u, readTaxVaultHostContext as v, resolveFeeMode as w, resolveManifestBinding as x, resolveTaxInfoRenderSurface as y, resolveTokenMarketPhase as z };
|