Files
wikideck/shared/monero-withdrawal.ts

71 lines
3.2 KiB
TypeScript
Executable File

import { z } from 'zod';
import { parseAtomicXmr } from './xmr-amount.ts';
const uuid = z.string().uuid();
const hex = z.string().regex(/^[a-f0-9]{64}$/);
const atomic = z.string().max(22).refine(value => { try { parseAtomicXmr(value); return true; } catch { return false; } });
const positiveAtomic = atomic.refine(value => BigInt(value) > 0n);
export const mainnetWithdrawalRequestSchema = z.object({
version: z.literal(1),
network: z.literal('wikideck-randomx-mainnet-1'),
chainId: hex,
custodianId: uuid,
beneficiary: hex,
publicKey: z.string().min(1).max(256),
requestId: uuid,
destination: z.string().length(95),
amountAtomicXmr: positiveAtomic,
maxFeeAtomicXmr: atomic,
expiresAt: z.number().int().nonnegative().safe(),
signature: z.string().min(1).max(256),
}).strict();
export type MainnetWithdrawalRequest = z.infer<typeof mainnetWithdrawalRequestSchema>;
export type MainnetWithdrawalRequestUnsigned = Omit<MainnetWithdrawalRequest, 'signature'>;
export const mainnetWithdrawalCancellationSchema = z.object({
version: z.literal(1),
network: z.literal('wikideck-randomx-mainnet-1'),
chainId: hex,
custodianId: uuid,
beneficiary: hex,
publicKey: z.string().min(1).max(256),
cancellationId: uuid,
withdrawalRequestId: uuid,
expiresAt: z.number().int().nonnegative().safe(),
signature: z.string().min(1).max(256),
}).strict();
export type MainnetWithdrawalCancellation = z.infer<typeof mainnetWithdrawalCancellationSchema>;
export type MainnetWithdrawalCancellationUnsigned = Omit<MainnetWithdrawalCancellation, 'signature'>;
export function mainnetWithdrawalMessage(request: MainnetWithdrawalRequestUnsigned): string {
return JSON.stringify(['wikideck-mainnet-withdrawal-request-v1', request.version, request.network,
request.chainId, request.custodianId, request.beneficiary, request.publicKey, request.requestId,
request.destination, request.amountAtomicXmr, request.maxFeeAtomicXmr, request.expiresAt]);
}
export function mainnetWithdrawalCancellationMessage(request: MainnetWithdrawalCancellationUnsigned): string {
return JSON.stringify(['wikideck-mainnet-withdrawal-cancel-v1', request.version, request.network,
request.chainId, request.custodianId, request.beneficiary, request.publicKey, request.cancellationId,
request.withdrawalRequestId, request.expiresAt]);
}
export const mainnetCustodyBalanceRequestSchema = z.object({
version: z.literal(1),
network: z.literal('wikideck-randomx-mainnet-1'),
chainId: hex,
custodianId: uuid,
beneficiary: hex,
publicKey: z.string().min(1).max(256),
nonce: uuid,
expiresAt: z.number().int().nonnegative().safe(),
signature: z.string().min(1).max(256),
}).strict();
export type MainnetCustodyBalanceRequest = z.infer<typeof mainnetCustodyBalanceRequestSchema>;
export type MainnetCustodyBalanceRequestUnsigned = Omit<MainnetCustodyBalanceRequest, 'signature'>;
export function mainnetCustodyBalanceMessage(request: MainnetCustodyBalanceRequestUnsigned): string {
return JSON.stringify(['wikideck-mainnet-custody-balance-v1', request.version, request.network,
request.chainId, request.custodianId, request.beneficiary, request.publicKey, request.nonce, request.expiresAt]);
}