import {z} from 'zod' export type Network = 'Sepolia' | 'PolygonAmoy' | 'BaseSepolia' | 'ArbitrumSepolia' | 'ArbitrumSepoliaUk' | 'EtherlinkTestnet' | 'Ethereum' | 'Polygon' | 'Base' | 'Arbitrum' | 'ArbitrumUk' | 'Etherlink' | 'Anvil' | 'Starknet' | 'StarknetSepolia' | 'Stellar' | 'StellarTestnet' | 'Solana' | 'SolanaDevnet'; export type EvmAddressEncoded = string; export type StarknetAddressEncoded = string; export type StellarAccountAddressEncoded = string; export type StellarContractAddressEncoded = string; export type SolanaAddress = string; export type GetApiWhitelistsNetworkTokenAddressWalletAddressArgs = {network: Network, tokenAddress: EvmAddressEncoded | StarknetAddressEncoded | StellarAccountAddressEncoded | StellarContractAddressEncoded | SolanaAddress, walletAddress: EvmAddressEncoded | StarknetAddressEncoded | StellarAccountAddressEncoded | StellarContractAddressEncoded | SolanaAddress}; export type GetApiWhitelistsNetworkTokenAddressWalletAddressOptions = {baseUrl?: string | undefined, fetch?: typeof fetch | undefined}; export const getApiWhitelistsNetworkTokenAddressWalletAddressResponse = z.object({isWhitelisted: z.boolean()}); export const validateResponse = async ( schema: { readonly '~standard': { readonly validate: (value: unknown) => ({ readonly value: Output; readonly issues?: undefined } | { readonly issues: ReadonlyArray<{ readonly message: string; readonly path?: ReadonlyArray | undefined }> }) | Promise<{ readonly value: Output; readonly issues?: undefined } | { readonly issues: ReadonlyArray<{ readonly message: string; readonly path?: ReadonlyArray | undefined }> }> } }, value: unknown ): Promise => { const result = await schema['~standard'].validate(value) if (result.issues !== undefined) { const detail = result.issues .map(({ message, path }) => path?.length ? `${path.map((segment) => String(typeof segment === 'object' ? segment.key : segment)).join('.')}: ${message}` : message ) .join('; ') throw new Error(`Response does not match the schema: ${detail}`, { cause: { issues: result.issues } }) } return result.value }; /** * Whether a wallet is whitelisted to hold the given Spiko token on the given network. Whitelisting is granted per network and applies to every Spiko token deployed on it. Returns 404 when the token address is not a Spiko token on that network. * * GET /whitelists/{network}/{tokenAddress}/{walletAddress} */ export const getApiWhitelistsNetworkTokenAddressWalletAddress = async (args: GetApiWhitelistsNetworkTokenAddressWalletAddressArgs, options?: GetApiWhitelistsNetworkTokenAddressWalletAddressOptions) => { const {baseUrl = "https://public-api.spiko.io/v0", fetch: fetchFn = fetch} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('accept', "application/json") const url = `${baseUrl.replace(/\/+$/, '')}/whitelists/${encodeURIComponent(String(args.network))}/${encodeURIComponent(String(args.tokenAddress))}/${encodeURIComponent(String(args.walletAddress))}${query.size > 0 ? `?${query}` : ''}` const res = await fetchFn(url, {method: "GET", headers}) if (!res.ok) throw new Error(`Request failed with status ${res.status}`, {cause: {status: res.status, body: await res.text()}}) return validateResponse(getApiWhitelistsNetworkTokenAddressWalletAddressResponse, await res.json()) };