@bit-gpt/h402
Version:
BitGPT's 402 open protocol for blockchain-native payments
107 lines • 4.31 kB
JavaScript
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