import {z} from 'zod' export type ApiBabyJubJubPoint = {x: string, y: string}; export type ApiSchnorrPublicKey = {point: ApiBabyJubJubPoint}; export type ApiDepositPermit = {nonce: string, deadline: string, signature: unknown}; export type DepositBalanceRequest = {from_address: string, amount: string, authority: ApiSchnorrPublicKey, permit: ApiDepositPermit}; export type CreateApiV2AccountAccountIdBalancesMintDepositArgs = {account_id: string, mint: string, non_blocking?: boolean | undefined, body: DepositBalanceRequest}; export type CreateApiV2AccountAccountIdBalancesMintDepositOptions = {baseUrl?: string | undefined, accountHmac?: string | undefined, fetch?: typeof fetch | undefined}; export const apiBabyJubJubPoint = z.object({x: z.string(), y: z.string()}); export const apiSchnorrPublicKey = z.object({point: apiBabyJubJubPoint}); export const apiPoseidonCSPRNG = z.object({seed: z.string(), index: z.number().int()}); export const apiSchnorrPublicKeyShare = z.object({x: z.string(), y: z.string()}); export const apiBalanceShare = z.object({mint: z.string(), owner: z.string(), relayer_fee_recipient: z.string(), authority: apiSchnorrPublicKeyShare, relayer_fee_balance: z.string(), protocol_fee_balance: z.string(), amount: z.string()}); export const apiBalance = z.object({mint: z.string(), owner: z.string(), relayer_fee_recipient: z.string(), authority: apiSchnorrPublicKey, relayer_fee_balance: z.string(), protocol_fee_balance: z.string(), amount: z.string(), recovery_stream: apiPoseidonCSPRNG, share_stream: apiPoseidonCSPRNG, public_shares: apiBalanceShare}); export const depositBalanceResponse = z.object({task_id: z.string(), balance: apiBalance, completed: 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 }; /** * POST /v2/account/{account_id}/balances/{mint}/deposit */ export const createApiV2AccountAccountIdBalancesMintDeposit = async (args: CreateApiV2AccountAccountIdBalancesMintDepositArgs, options?: CreateApiV2AccountAccountIdBalancesMintDepositOptions) => { const {baseUrl = "https://api.renegade.fi", fetch: fetchFn = fetch, accountHmac} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('content-type', "application/json") headers.set('accept', "application/json") if (args.non_blocking != null) query.append("non_blocking", String(args.non_blocking)) if (accountHmac !== undefined) headers.set("X-Renegade-Auth", accountHmac) const url = `${baseUrl.replace(/\/+$/, '')}/v2/account/${encodeURIComponent(String(args.account_id))}/balances/${encodeURIComponent(String(args.mint))}/deposit${query.size > 0 ? `?${query}` : ''}` const res = await fetchFn(url, {method: "POST", headers, body: JSON.stringify(args.body)}) if (!res.ok) throw new Error(`Request failed with status ${res.status}`, {cause: {status: res.status, body: await res.text()}}) return validateResponse(depositBalanceResponse, await res.json()) };