UNPKG

@bit-gpt/h402

Version:

BitGPT's 402 open protocol for blockchain-native payments

107 lines 4.31 kB
import { z } from "zod"; import { NetworkSchema } from "../shared/index.js"; import { ExactEvmPayloadSchema } from "./evmPayload.js"; import { ExactSolanaPayloadSchema } from "./solanaPayload.js"; // Constants const MixedAddressRegex = /^0x[a-fA-F0-9]{40}|[A-Za-z0-9][A-Za-z0-9-]{0,34}[A-Za-z0-9]$/; // Enums export const schemes = ["exact"]; export const h402Versions = [1]; export const ErrorReasons = [ "insufficient_funds", "invalid_exact_evm_payload_authorization_valid_after", "invalid_exact_evm_payload_authorization_valid_before", "invalid_exact_evm_payload_authorization_value", "invalid_exact_evm_payload_signature", "invalid_exact_evm_payload_recipient_mismatch", "invalid_exact_solana_payload_authorization_valid_after", "invalid_exact_solana_payload_authorization_valid_before", "invalid_exact_solana_payload_authorization_value", "invalid_exact_solana_payload_signature", "invalid_exact_solana_payload_recipient_mismatch", "invalid_network", "invalid_payload", "invalid_payment_requirements", "invalid_scheme", "unsupported_scheme", "invalid_h402_version", "invalid_transaction_state", "unexpected_verify_error", "unexpected_settle_error", ]; // h402PaymentRequirements const NamespaceSchema = z.enum(["evm", "solana"]); const AmountFormatSchema = z.enum(["humanReadable", "smallestUnit"]); // Helper function to validate bigint or number const BigintOrNumberSchema = z.union([z.bigint(), z.number()]); // Base Payment Requirements Schema export const BasePaymentRequirementsSchema = z.object({ namespace: NamespaceSchema, tokenAddress: z.string(), tokenDecimals: z.number().int().optional(), tokenSymbol: z.string().optional(), amountRequired: BigintOrNumberSchema, amountRequiredFormat: AmountFormatSchema, payToAddress: z.string(), networkId: z.string(), description: z.string().optional(), resource: z.string().url().optional(), scheme: z.enum(schemes), mimeType: z.string().optional(), outputSchema: z.any().optional(), estimatedProcessingTime: z.number().int().optional(), extra: z.any().optional(), maxAmountRequired: BigintOrNumberSchema.optional(), requiredDeadlineSeconds: z.number().int().optional(), }); // Enriched Payment Requirements Schema export const EnrichedPaymentRequirementsSchema = BasePaymentRequirementsSchema.extend({ tokenDecimals: z.number().int(), // Required after enrichment tokenSymbol: z.string(), // Required after enrichment }); // Main export schema export const PaymentRequirementsSchema = BasePaymentRequirementsSchema; // h402PaymentPayload export function createPaymentPayloadSchema(payloadSchema) { return z.object({ h402Version: z.number().refine((val) => h402Versions.includes(val)), scheme: z.enum(schemes), payload: payloadSchema, namespace: NamespaceSchema, networkId: z.string(), resource: z.string().url().optional(), }); } export const EvmPaymentPayloadSchema = createPaymentPayloadSchema(ExactEvmPayloadSchema); export const SolanaPaymentPayloadSchema = createPaymentPayloadSchema(ExactSolanaPayloadSchema); // h402VerifyResponse export const VerifyResponseSchema = z.object({ isValid: z.boolean(), invalidReason: z.enum(ErrorReasons).optional(), payer: z.string().regex(MixedAddressRegex).optional(), // errorMessage: z.string().optional(), txHash: z.string().regex(MixedAddressRegex).optional(), type: z.enum(["payload", "transaction"]).optional(), }); // h402SettleResponse export const SettleResponseSchema = z.object({ success: z.boolean(), transaction: z.string().regex(MixedAddressRegex), namespace: NamespaceSchema.optional(), errorReason: z.enum(ErrorReasons).optional(), payer: z.string().regex(MixedAddressRegex).optional(), // error: z.string().optional(), }); // h402SupportedPaymentKind export const SupportedPaymentKindSchema = z.object({ h402Version: z.number().refine((val) => h402Versions.includes(val)), scheme: z.enum(schemes), network: NetworkSchema, }); // h402SupportedPaymentKindsResponse export const SupportedPaymentKindsResponseSchema = z.object({ kinds: z.array(SupportedPaymentKindSchema), }); //# sourceMappingURL=h402Specs.js.map