@gatewayfm/ups-sdk 0.1.16 → 0.1.17
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{chunk-ULP4VMHK.mjs → chunk-NLBFR2Q2.mjs} +3 -3
- package/dist/chunk-NLBFR2Q2.mjs.map +1 -0
- package/dist/{chunk-7M4ZN7F3.js → chunk-ZV5VOSSJ.js} +3 -3
- package/dist/chunk-ZV5VOSSJ.js.map +1 -0
- package/dist/index.js +4 -4
- package/dist/index.mjs +2 -2
- package/dist/payment/index.js +2 -2
- package/dist/payment/index.mjs +1 -1
- package/package.json +1 -1
- package/dist/chunk-7M4ZN7F3.js.map +0 -1
- package/dist/chunk-ULP4VMHK.mjs.map +0 -1
|
@@ -162,7 +162,7 @@ var PaymentModule = class {
|
|
|
162
162
|
paymentHeader: header,
|
|
163
163
|
paymentRequirements: requirements
|
|
164
164
|
}, { skipAuth: true });
|
|
165
|
-
if (response.success === false || response.errorReason) {
|
|
165
|
+
if (response.success === false || response.success === void 0 && response.errorReason) {
|
|
166
166
|
throw new PaymentError(response.errorReason || "Payment settlement failed");
|
|
167
167
|
}
|
|
168
168
|
return response;
|
|
@@ -177,5 +177,5 @@ var PaymentModule = class {
|
|
|
177
177
|
};
|
|
178
178
|
|
|
179
179
|
export { PaymentModule, PaymentType };
|
|
180
|
-
//# sourceMappingURL=chunk-
|
|
181
|
-
//# sourceMappingURL=chunk-
|
|
180
|
+
//# sourceMappingURL=chunk-NLBFR2Q2.mjs.map
|
|
181
|
+
//# sourceMappingURL=chunk-NLBFR2Q2.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/types/index.ts","../src/payment/index.ts"],"names":["PaymentType"],"mappings":"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","file":"chunk-NLBFR2Q2.mjs","sourcesContent":["export interface UPSConfig {\n baseUrl: string; // API base URL\n network: string; // CAIP-2 format: \"eip155:737998412\"\n chainId?: number; // Optional, parsed from network if not provided\n timeout?: number; // Request timeout (default: 30000)\n retryAttempts?: number; // Retry count (default: 3)\n refreshInterval?: number; // Token refresh interval in ms (default: 60000 = 1 min)\n}\n\n// Authentication\nexport interface AuthState {\n isAuthenticated: boolean;\n token: string | null;\n expiresAt: Date | null;\n address: string | null;\n}\n\nexport interface AuthResult {\n token: string;\n expiresAt: string;\n}\n\n// User (from /auth/connect and /users/me)\nexport interface User {\n id: string;\n walletAddress: string;\n status: string;\n createdAt: string;\n}\n\n// Connect auth result (unified auth flow)\nexport interface ConnectResult {\n user: User;\n token: string;\n expiresAt: string;\n isNewUser: boolean;\n}\n\n// Wallet\nexport type EIP1193Provider = {\n request: (args: { method: string; params?: unknown[] }) => Promise<unknown>;\n on?: (event: string, handler: (...args: unknown[]) => void) => void;\n removeListener?: (event: string, handler: (...args: unknown[]) => void) => void;\n};\n\nexport interface WalletState {\n isConnected: boolean;\n address: string | null;\n chainId: number | null;\n provider: EIP1193Provider | null;\n}\n\nexport interface ConnectedWallet {\n address: string;\n chainId: number;\n provider: EIP1193Provider;\n}\n\n// Account\nexport type AccountStatus = 'pending' | 'kyc_in_progress' | 'active' | 'frozen' | 'closed';\n\nexport interface Account {\n id: string;\n ownerAddress: string;\n walletAddress: string;\n status: AccountStatus;\n kycLevel: number;\n userId?: string;\n createdAt: string;\n updatedAt?: string;\n}\n\nexport interface CreateAccountParams {\n ownerAddress: string;\n salt: string; // 0x-prefixed 32-byte hex\n}\n\nexport interface CreateAccountResponse {\n account: Account;\n txHash: string;\n}\n\n// Payment (x402)\nexport interface PaymentRequirements {\n scheme: string;\n network: string;\n maxAmountRequired: string;\n asset: string;\n payTo: string;\n maxTimeoutSeconds: number;\n resource?: string;\n description?: string;\n\n extra?: PaymentExtra;\n from?: string;\n}\n\nexport enum PaymentType {\n UNSPECIFIED = 'UNSPECIFIED',\n DIRECT = 'DIRECT',\n ESCROW = 'ESCROW',\n INVOICE = 'INVOICE'\n}\n\nexport interface PaymentExtra {\n name?: string;\n version?: string;\n payment_type?: PaymentType; // snake_case from API\n arbiter?: string;\n release_time?: number; // snake_case from API\n payee?: string; // intended recipient for escrow\n invoice_id?: string;\n invoice_payment_type?: 'DIRECT' | 'ESCROW';\n}\n\nexport interface PaymentAuthorization {\n from: string;\n to: string;\n value: string;\n validAfter: number;\n validBefore: number;\n nonce: string; // bytes32 hex\n}\n\nexport interface SignedAuthorization extends PaymentAuthorization {\n signature: string;\n}\n\nexport interface VerifyResponse {\n isValid: boolean;\n invalidReason?: string;\n payer?: string;\n}\n\nexport interface SettleResponse {\n success: boolean;\n errorReason?: string;\n transaction?: string;\n network?: string;\n payer?: string;\n}\n\n// x402 Supported Schemes\nexport interface SupportedScheme {\n x402Version: number;\n scheme: string;\n network: string;\n}\n\nexport interface SupportedSchemesResponse {\n kinds: SupportedScheme[];\n extensions?: string[];\n signers?: Record<string, string[]>;\n}\n\n// EIP-712 Typed Data\nexport interface EIP712Domain {\n name: string;\n version: string;\n chainId: number;\n verifyingContract: string;\n}\n\nexport interface EIP712Type {\n name: string;\n type: string;\n}\n\nexport interface EIP712TypedData {\n domain: EIP712Domain;\n types: Record<string, EIP712Type[]>;\n primaryType: string;\n message: Record<string, unknown>;\n}\n\n// Escrow\nexport interface Escrow {\n escrowId: string;\n payer: string;\n payee: string;\n amount: string;\n arbiter: string;\n releaseTime: number;\n status: EscrowStatus;\n}\n\nexport type EscrowStatus = 'ACTIVE' | 'RELEASED' | 'REFUNDED';\n\nexport interface EscrowActionResponse {\n success: boolean;\n errorReason?: string;\n transaction?: string;\n network?: string;\n}\n\n// Invoices\nexport type InvoiceStatus = 'UNSPECIFIED' | 'PENDING' | 'PARTIALLY_PAID' | 'PAID' | 'CANCELLED' | 'EXPIRED';\n\nexport interface Invoice {\n invoice_id: string;\n merchant: string;\n payer: string;\n amount: string;\n paid_amount: string;\n due_date: number;\n created_at: number;\n payment_type: 'DIRECT' | 'ESCROW';\n status: InvoiceStatus;\n metadata_uri: string;\n}\n\nexport interface CreateInvoiceRequest {\n merchant?: string;\n amount: string;\n payer?: string;\n due_date: number;\n payment_type: 'DIRECT' | 'ESCROW';\n metadata_uri: string;\n}\n\nexport interface InvoiceResponse {\n invoice: Invoice;\n}\n\nexport interface InvoiceListResponse {\n invoices: Invoice[];\n next_page_token: string;\n}\n","import { HttpClient } from '../core/http-client';\nimport { WalletModule } from '../wallet';\nimport {\n PaymentRequirements,\n PaymentAuthorization,\n SignedAuthorization,\n VerifyResponse,\n SettleResponse,\n SupportedSchemesResponse,\n EIP712TypedData,\n Invoice,\n PaymentType\n} from '../types';\nimport { PaymentError } from '../core/errors';\n\nexport class PaymentModule {\n constructor(\n private http: HttpClient,\n private wallet: WalletModule\n ) { }\n\n async pay(request: { requirements: PaymentRequirements; from?: string }): Promise<SettleResponse> {\n const from = request.from || request.requirements.from || this.wallet.getAddress();\n if (!from) throw new PaymentError('No sender address provided');\n\n // Create requirements with `from` set for EIP-1271 Smart Account signature verification\n const requirementsWithFrom: PaymentRequirements = {\n ...request.requirements,\n from, // Critical: backend needs to know which Smart Account is the payer\n };\n\n const auth = this.buildAuthorization(requirementsWithFrom, from);\n const signed = await this.signAuthorization(auth, requirementsWithFrom);\n\n const verification = await this.verify(signed, requirementsWithFrom);\n if (!verification.isValid) {\n throw new PaymentError(`Payment verification failed: ${verification.invalidReason}`);\n }\n\n return this.settle(signed, requirementsWithFrom);\n }\n\n /**\n * Pay an invoice\n * @param invoice The invoice to pay\n * @param params Payment parameters (amount, asset, network)\n */\n async payInvoice(invoice: Invoice, params: {\n amount: string; // Atomic units\n asset: string;\n network: string;\n payTo?: string; // Defaults to invoice.merchant\n from?: string; // Payer Smart Account address\n }): Promise<SettleResponse> {\n const payTo = params.payTo || invoice.merchant;\n if (!payTo) throw new PaymentError('No payee address (merchant) available for invoice');\n\n const requirements: PaymentRequirements = {\n scheme: 'exact',\n network: params.network,\n maxAmountRequired: params.amount,\n asset: params.asset,\n payTo,\n maxTimeoutSeconds: 3600,\n extra: {\n name: 'x402 Payment Token',\n version: '1',\n payment_type: PaymentType.INVOICE,\n invoice_id: invoice.invoice_id,\n invoice_payment_type: invoice.payment_type\n }\n };\n\n return this.pay({\n requirements,\n from: params.from\n });\n }\n\n buildAuthorization(requirements: PaymentRequirements, from: string): PaymentAuthorization {\n const array = new Uint8Array(32);\n crypto.getRandomValues(array);\n const nonce = '0x' + Array.from(array).map(b => b.toString(16).padStart(2, '0')).join('');\n\n const now = Math.floor(Date.now() / 1000);\n\n return {\n from,\n to: requirements.payTo,\n value: requirements.maxAmountRequired,\n validAfter: now - 60, // 60s buffer\n validBefore: now + requirements.maxTimeoutSeconds,\n nonce\n };\n }\n\n async signAuthorization(authorization: PaymentAuthorization, requirements: PaymentRequirements): Promise<SignedAuthorization> {\n let chainId: number;\n const network = requirements.network;\n if (network.startsWith('eip155:')) {\n chainId = parseInt(network.split(':')[1], 10);\n } else {\n chainId = parseInt(network, 10);\n }\n\n if (isNaN(chainId)) throw new PaymentError('Invalid chain ID');\n\n // EIP-712 requires uint256 values as BigInt for proper encoding\n const typedData: EIP712TypedData = {\n domain: {\n name: requirements.extra?.name || \"x402 Payment Token\",\n version: requirements.extra?.version || \"1\",\n chainId,\n verifyingContract: requirements.asset\n },\n types: {\n TransferWithAuthorization: [\n { name: \"from\", type: \"address\" },\n { name: \"to\", type: \"address\" },\n { name: \"value\", type: \"uint256\" },\n { name: \"validAfter\", type: \"uint256\" },\n { name: \"validBefore\", type: \"uint256\" },\n { name: \"nonce\", type: \"bytes32\" }\n ]\n },\n primaryType: \"TransferWithAuthorization\",\n message: {\n from: authorization.from,\n to: authorization.to,\n // CRITICAL: viem requires BigInt for uint256 types\n value: BigInt(authorization.value),\n validAfter: BigInt(authorization.validAfter),\n validBefore: BigInt(authorization.validBefore),\n nonce: authorization.nonce\n }\n };\n\n const signature = await this.wallet.signTypedData(typedData);\n return { ...authorization, signature };\n }\n\n encodePaymentHeader(signed: SignedAuthorization, requirements: PaymentRequirements): string {\n const authorization = {\n from: signed.from,\n to: signed.to,\n value: signed.value,\n nonce: signed.nonce,\n validAfter: signed.validAfter.toString(),\n validBefore: signed.validBefore.toString(),\n };\n\n const accepted = {\n scheme: requirements.scheme,\n network: requirements.network,\n amount: requirements.maxAmountRequired,\n asset: requirements.asset,\n payTo: requirements.payTo,\n maxTimeoutSeconds: requirements.maxTimeoutSeconds,\n };\n\n const paymentPayload = {\n x402Version: 1,\n accepted,\n payload: {\n authorization,\n signature: signed.signature,\n },\n };\n\n const jsonStr = JSON.stringify(paymentPayload);\n const b64Str = btoa(jsonStr);\n return `x402 ${b64Str}`;\n }\n\n async verify(signed: SignedAuthorization, requirements: PaymentRequirements): Promise<VerifyResponse> {\n const header = this.encodePaymentHeader(signed, requirements);\n const response = await this.http.post<VerifyResponse>('/x402/verify', {\n x402Version: 1,\n paymentHeader: header,\n paymentRequirements: requirements\n }, { skipAuth: true });\n\n // Normalize response: if invalidReason is present, consider it invalid\n if (response.invalidReason && response.isValid === undefined) {\n response.isValid = false;\n }\n\n return response;\n }\n\n async settle(signed: SignedAuthorization, requirements: PaymentRequirements): Promise<SettleResponse> {\n const header = this.encodePaymentHeader(signed, requirements);\n const response = await this.http.post<SettleResponse>('/x402/settle', {\n x402Version: 1,\n paymentHeader: header,\n paymentRequirements: requirements\n }, { skipAuth: true });\n\n if (response.success === false || (response.success === undefined && response.errorReason)) {\n throw new PaymentError(response.errorReason || 'Payment settlement failed');\n }\n\n return response;\n }\n\n /**\n * Get supported payment schemes from the facilitator.\n * This endpoint does not require authentication.\n */\n async getSupportedSchemes(): Promise<SupportedSchemesResponse> {\n return this.http.get<SupportedSchemesResponse>('/x402/supported', { skipAuth: true });\n }\n}\n"]}
|
|
@@ -164,7 +164,7 @@ var PaymentModule = class {
|
|
|
164
164
|
paymentHeader: header,
|
|
165
165
|
paymentRequirements: requirements
|
|
166
166
|
}, { skipAuth: true });
|
|
167
|
-
if (response.success === false || response.errorReason) {
|
|
167
|
+
if (response.success === false || response.success === void 0 && response.errorReason) {
|
|
168
168
|
throw new chunkG525R6AV_js.PaymentError(response.errorReason || "Payment settlement failed");
|
|
169
169
|
}
|
|
170
170
|
return response;
|
|
@@ -180,5 +180,5 @@ var PaymentModule = class {
|
|
|
180
180
|
|
|
181
181
|
exports.PaymentModule = PaymentModule;
|
|
182
182
|
exports.PaymentType = PaymentType;
|
|
183
|
-
//# sourceMappingURL=chunk-
|
|
184
|
-
//# sourceMappingURL=chunk-
|
|
183
|
+
//# sourceMappingURL=chunk-ZV5VOSSJ.js.map
|
|
184
|
+
//# sourceMappingURL=chunk-ZV5VOSSJ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/types/index.ts","../src/payment/index.ts"],"names":["PaymentType","PaymentError"],"mappings":"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","file":"chunk-ZV5VOSSJ.js","sourcesContent":["export interface UPSConfig {\n baseUrl: string; // API base URL\n network: string; // CAIP-2 format: \"eip155:737998412\"\n chainId?: number; // Optional, parsed from network if not provided\n timeout?: number; // Request timeout (default: 30000)\n retryAttempts?: number; // Retry count (default: 3)\n refreshInterval?: number; // Token refresh interval in ms (default: 60000 = 1 min)\n}\n\n// Authentication\nexport interface AuthState {\n isAuthenticated: boolean;\n token: string | null;\n expiresAt: Date | null;\n address: string | null;\n}\n\nexport interface AuthResult {\n token: string;\n expiresAt: string;\n}\n\n// User (from /auth/connect and /users/me)\nexport interface User {\n id: string;\n walletAddress: string;\n status: string;\n createdAt: string;\n}\n\n// Connect auth result (unified auth flow)\nexport interface ConnectResult {\n user: User;\n token: string;\n expiresAt: string;\n isNewUser: boolean;\n}\n\n// Wallet\nexport type EIP1193Provider = {\n request: (args: { method: string; params?: unknown[] }) => Promise<unknown>;\n on?: (event: string, handler: (...args: unknown[]) => void) => void;\n removeListener?: (event: string, handler: (...args: unknown[]) => void) => void;\n};\n\nexport interface WalletState {\n isConnected: boolean;\n address: string | null;\n chainId: number | null;\n provider: EIP1193Provider | null;\n}\n\nexport interface ConnectedWallet {\n address: string;\n chainId: number;\n provider: EIP1193Provider;\n}\n\n// Account\nexport type AccountStatus = 'pending' | 'kyc_in_progress' | 'active' | 'frozen' | 'closed';\n\nexport interface Account {\n id: string;\n ownerAddress: string;\n walletAddress: string;\n status: AccountStatus;\n kycLevel: number;\n userId?: string;\n createdAt: string;\n updatedAt?: string;\n}\n\nexport interface CreateAccountParams {\n ownerAddress: string;\n salt: string; // 0x-prefixed 32-byte hex\n}\n\nexport interface CreateAccountResponse {\n account: Account;\n txHash: string;\n}\n\n// Payment (x402)\nexport interface PaymentRequirements {\n scheme: string;\n network: string;\n maxAmountRequired: string;\n asset: string;\n payTo: string;\n maxTimeoutSeconds: number;\n resource?: string;\n description?: string;\n\n extra?: PaymentExtra;\n from?: string;\n}\n\nexport enum PaymentType {\n UNSPECIFIED = 'UNSPECIFIED',\n DIRECT = 'DIRECT',\n ESCROW = 'ESCROW',\n INVOICE = 'INVOICE'\n}\n\nexport interface PaymentExtra {\n name?: string;\n version?: string;\n payment_type?: PaymentType; // snake_case from API\n arbiter?: string;\n release_time?: number; // snake_case from API\n payee?: string; // intended recipient for escrow\n invoice_id?: string;\n invoice_payment_type?: 'DIRECT' | 'ESCROW';\n}\n\nexport interface PaymentAuthorization {\n from: string;\n to: string;\n value: string;\n validAfter: number;\n validBefore: number;\n nonce: string; // bytes32 hex\n}\n\nexport interface SignedAuthorization extends PaymentAuthorization {\n signature: string;\n}\n\nexport interface VerifyResponse {\n isValid: boolean;\n invalidReason?: string;\n payer?: string;\n}\n\nexport interface SettleResponse {\n success: boolean;\n errorReason?: string;\n transaction?: string;\n network?: string;\n payer?: string;\n}\n\n// x402 Supported Schemes\nexport interface SupportedScheme {\n x402Version: number;\n scheme: string;\n network: string;\n}\n\nexport interface SupportedSchemesResponse {\n kinds: SupportedScheme[];\n extensions?: string[];\n signers?: Record<string, string[]>;\n}\n\n// EIP-712 Typed Data\nexport interface EIP712Domain {\n name: string;\n version: string;\n chainId: number;\n verifyingContract: string;\n}\n\nexport interface EIP712Type {\n name: string;\n type: string;\n}\n\nexport interface EIP712TypedData {\n domain: EIP712Domain;\n types: Record<string, EIP712Type[]>;\n primaryType: string;\n message: Record<string, unknown>;\n}\n\n// Escrow\nexport interface Escrow {\n escrowId: string;\n payer: string;\n payee: string;\n amount: string;\n arbiter: string;\n releaseTime: number;\n status: EscrowStatus;\n}\n\nexport type EscrowStatus = 'ACTIVE' | 'RELEASED' | 'REFUNDED';\n\nexport interface EscrowActionResponse {\n success: boolean;\n errorReason?: string;\n transaction?: string;\n network?: string;\n}\n\n// Invoices\nexport type InvoiceStatus = 'UNSPECIFIED' | 'PENDING' | 'PARTIALLY_PAID' | 'PAID' | 'CANCELLED' | 'EXPIRED';\n\nexport interface Invoice {\n invoice_id: string;\n merchant: string;\n payer: string;\n amount: string;\n paid_amount: string;\n due_date: number;\n created_at: number;\n payment_type: 'DIRECT' | 'ESCROW';\n status: InvoiceStatus;\n metadata_uri: string;\n}\n\nexport interface CreateInvoiceRequest {\n merchant?: string;\n amount: string;\n payer?: string;\n due_date: number;\n payment_type: 'DIRECT' | 'ESCROW';\n metadata_uri: string;\n}\n\nexport interface InvoiceResponse {\n invoice: Invoice;\n}\n\nexport interface InvoiceListResponse {\n invoices: Invoice[];\n next_page_token: string;\n}\n","import { HttpClient } from '../core/http-client';\nimport { WalletModule } from '../wallet';\nimport {\n PaymentRequirements,\n PaymentAuthorization,\n SignedAuthorization,\n VerifyResponse,\n SettleResponse,\n SupportedSchemesResponse,\n EIP712TypedData,\n Invoice,\n PaymentType\n} from '../types';\nimport { PaymentError } from '../core/errors';\n\nexport class PaymentModule {\n constructor(\n private http: HttpClient,\n private wallet: WalletModule\n ) { }\n\n async pay(request: { requirements: PaymentRequirements; from?: string }): Promise<SettleResponse> {\n const from = request.from || request.requirements.from || this.wallet.getAddress();\n if (!from) throw new PaymentError('No sender address provided');\n\n // Create requirements with `from` set for EIP-1271 Smart Account signature verification\n const requirementsWithFrom: PaymentRequirements = {\n ...request.requirements,\n from, // Critical: backend needs to know which Smart Account is the payer\n };\n\n const auth = this.buildAuthorization(requirementsWithFrom, from);\n const signed = await this.signAuthorization(auth, requirementsWithFrom);\n\n const verification = await this.verify(signed, requirementsWithFrom);\n if (!verification.isValid) {\n throw new PaymentError(`Payment verification failed: ${verification.invalidReason}`);\n }\n\n return this.settle(signed, requirementsWithFrom);\n }\n\n /**\n * Pay an invoice\n * @param invoice The invoice to pay\n * @param params Payment parameters (amount, asset, network)\n */\n async payInvoice(invoice: Invoice, params: {\n amount: string; // Atomic units\n asset: string;\n network: string;\n payTo?: string; // Defaults to invoice.merchant\n from?: string; // Payer Smart Account address\n }): Promise<SettleResponse> {\n const payTo = params.payTo || invoice.merchant;\n if (!payTo) throw new PaymentError('No payee address (merchant) available for invoice');\n\n const requirements: PaymentRequirements = {\n scheme: 'exact',\n network: params.network,\n maxAmountRequired: params.amount,\n asset: params.asset,\n payTo,\n maxTimeoutSeconds: 3600,\n extra: {\n name: 'x402 Payment Token',\n version: '1',\n payment_type: PaymentType.INVOICE,\n invoice_id: invoice.invoice_id,\n invoice_payment_type: invoice.payment_type\n }\n };\n\n return this.pay({\n requirements,\n from: params.from\n });\n }\n\n buildAuthorization(requirements: PaymentRequirements, from: string): PaymentAuthorization {\n const array = new Uint8Array(32);\n crypto.getRandomValues(array);\n const nonce = '0x' + Array.from(array).map(b => b.toString(16).padStart(2, '0')).join('');\n\n const now = Math.floor(Date.now() / 1000);\n\n return {\n from,\n to: requirements.payTo,\n value: requirements.maxAmountRequired,\n validAfter: now - 60, // 60s buffer\n validBefore: now + requirements.maxTimeoutSeconds,\n nonce\n };\n }\n\n async signAuthorization(authorization: PaymentAuthorization, requirements: PaymentRequirements): Promise<SignedAuthorization> {\n let chainId: number;\n const network = requirements.network;\n if (network.startsWith('eip155:')) {\n chainId = parseInt(network.split(':')[1], 10);\n } else {\n chainId = parseInt(network, 10);\n }\n\n if (isNaN(chainId)) throw new PaymentError('Invalid chain ID');\n\n // EIP-712 requires uint256 values as BigInt for proper encoding\n const typedData: EIP712TypedData = {\n domain: {\n name: requirements.extra?.name || \"x402 Payment Token\",\n version: requirements.extra?.version || \"1\",\n chainId,\n verifyingContract: requirements.asset\n },\n types: {\n TransferWithAuthorization: [\n { name: \"from\", type: \"address\" },\n { name: \"to\", type: \"address\" },\n { name: \"value\", type: \"uint256\" },\n { name: \"validAfter\", type: \"uint256\" },\n { name: \"validBefore\", type: \"uint256\" },\n { name: \"nonce\", type: \"bytes32\" }\n ]\n },\n primaryType: \"TransferWithAuthorization\",\n message: {\n from: authorization.from,\n to: authorization.to,\n // CRITICAL: viem requires BigInt for uint256 types\n value: BigInt(authorization.value),\n validAfter: BigInt(authorization.validAfter),\n validBefore: BigInt(authorization.validBefore),\n nonce: authorization.nonce\n }\n };\n\n const signature = await this.wallet.signTypedData(typedData);\n return { ...authorization, signature };\n }\n\n encodePaymentHeader(signed: SignedAuthorization, requirements: PaymentRequirements): string {\n const authorization = {\n from: signed.from,\n to: signed.to,\n value: signed.value,\n nonce: signed.nonce,\n validAfter: signed.validAfter.toString(),\n validBefore: signed.validBefore.toString(),\n };\n\n const accepted = {\n scheme: requirements.scheme,\n network: requirements.network,\n amount: requirements.maxAmountRequired,\n asset: requirements.asset,\n payTo: requirements.payTo,\n maxTimeoutSeconds: requirements.maxTimeoutSeconds,\n };\n\n const paymentPayload = {\n x402Version: 1,\n accepted,\n payload: {\n authorization,\n signature: signed.signature,\n },\n };\n\n const jsonStr = JSON.stringify(paymentPayload);\n const b64Str = btoa(jsonStr);\n return `x402 ${b64Str}`;\n }\n\n async verify(signed: SignedAuthorization, requirements: PaymentRequirements): Promise<VerifyResponse> {\n const header = this.encodePaymentHeader(signed, requirements);\n const response = await this.http.post<VerifyResponse>('/x402/verify', {\n x402Version: 1,\n paymentHeader: header,\n paymentRequirements: requirements\n }, { skipAuth: true });\n\n // Normalize response: if invalidReason is present, consider it invalid\n if (response.invalidReason && response.isValid === undefined) {\n response.isValid = false;\n }\n\n return response;\n }\n\n async settle(signed: SignedAuthorization, requirements: PaymentRequirements): Promise<SettleResponse> {\n const header = this.encodePaymentHeader(signed, requirements);\n const response = await this.http.post<SettleResponse>('/x402/settle', {\n x402Version: 1,\n paymentHeader: header,\n paymentRequirements: requirements\n }, { skipAuth: true });\n\n if (response.success === false || (response.success === undefined && response.errorReason)) {\n throw new PaymentError(response.errorReason || 'Payment settlement failed');\n }\n\n return response;\n }\n\n /**\n * Get supported payment schemes from the facilitator.\n * This endpoint does not require authentication.\n */\n async getSupportedSchemes(): Promise<SupportedSchemesResponse> {\n return this.http.get<SupportedSchemesResponse>('/x402/supported', { skipAuth: true });\n }\n}\n"]}
|
package/dist/index.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
var chunkXFJ6SPQN_js = require('./chunk-XFJ6SPQN.js');
|
|
4
|
-
var
|
|
4
|
+
var chunkZV5VOSSJ_js = require('./chunk-ZV5VOSSJ.js');
|
|
5
5
|
var chunk6S7HWY3Z_js = require('./chunk-6S7HWY3Z.js');
|
|
6
6
|
var chunkG525R6AV_js = require('./chunk-G525R6AV.js');
|
|
7
7
|
|
|
@@ -418,7 +418,7 @@ var UPSClient = class {
|
|
|
418
418
|
this.auth = new AuthManager(this.http, this.eventBus, config.refreshInterval);
|
|
419
419
|
this.wallet = new chunk6S7HWY3Z_js.WalletModule(this.eventBus);
|
|
420
420
|
this.account = new chunkXFJ6SPQN_js.AccountModule(this.http);
|
|
421
|
-
this.payment = new
|
|
421
|
+
this.payment = new chunkZV5VOSSJ_js.PaymentModule(this.http, this.wallet);
|
|
422
422
|
this.escrow = new EscrowModule(this.http);
|
|
423
423
|
this.invoice = new InvoiceModule(this.http);
|
|
424
424
|
this.user = new UserModule(this.http);
|
|
@@ -484,11 +484,11 @@ Object.defineProperty(exports, "AccountModule", {
|
|
|
484
484
|
});
|
|
485
485
|
Object.defineProperty(exports, "PaymentModule", {
|
|
486
486
|
enumerable: true,
|
|
487
|
-
get: function () { return
|
|
487
|
+
get: function () { return chunkZV5VOSSJ_js.PaymentModule; }
|
|
488
488
|
});
|
|
489
489
|
Object.defineProperty(exports, "PaymentType", {
|
|
490
490
|
enumerable: true,
|
|
491
|
-
get: function () { return
|
|
491
|
+
get: function () { return chunkZV5VOSSJ_js.PaymentType; }
|
|
492
492
|
});
|
|
493
493
|
Object.defineProperty(exports, "WalletModule", {
|
|
494
494
|
enumerable: true,
|
package/dist/index.mjs
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { AccountModule } from './chunk-EONLKSST.mjs';
|
|
2
2
|
export { AccountModule } from './chunk-EONLKSST.mjs';
|
|
3
|
-
import { PaymentModule } from './chunk-
|
|
4
|
-
export { PaymentModule, PaymentType } from './chunk-
|
|
3
|
+
import { PaymentModule } from './chunk-NLBFR2Q2.mjs';
|
|
4
|
+
export { PaymentModule, PaymentType } from './chunk-NLBFR2Q2.mjs';
|
|
5
5
|
import { WalletModule } from './chunk-ZVB256ZP.mjs';
|
|
6
6
|
export { WalletModule } from './chunk-ZVB256ZP.mjs';
|
|
7
7
|
import { AuthError, NetworkError, UPSError, WalletError } from './chunk-BH5YEAE6.mjs';
|
package/dist/payment/index.js
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var chunkZV5VOSSJ_js = require('../chunk-ZV5VOSSJ.js');
|
|
4
4
|
require('../chunk-G525R6AV.js');
|
|
5
5
|
|
|
6
6
|
|
|
7
7
|
|
|
8
8
|
Object.defineProperty(exports, "PaymentModule", {
|
|
9
9
|
enumerable: true,
|
|
10
|
-
get: function () { return
|
|
10
|
+
get: function () { return chunkZV5VOSSJ_js.PaymentModule; }
|
|
11
11
|
});
|
|
12
12
|
//# sourceMappingURL=index.js.map
|
|
13
13
|
//# sourceMappingURL=index.js.map
|
package/dist/payment/index.mjs
CHANGED
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/types/index.ts","../src/payment/index.ts"],"names":["PaymentType","PaymentError"],"mappings":";;;;;AAiGO,IAAK,WAAA,qBAAAA,YAAAA,KAAL;AACH,EAAAA,aAAA,aAAA,CAAA,GAAc,aAAA;AACd,EAAAA,aAAA,QAAA,CAAA,GAAS,QAAA;AACT,EAAAA,aAAA,QAAA,CAAA,GAAS,QAAA;AACT,EAAAA,aAAA,SAAA,CAAA,GAAU,SAAA;AAJF,EAAA,OAAAA,YAAAA;AAAA,CAAA,EAAA,WAAA,IAAA,EAAA;;;AClFL,IAAM,gBAAN,MAAoB;AAAA,EACvB,WAAA,CACY,MACA,MAAA,EACV;AAFU,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AACA,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAAA,EACR;AAAA,EAEJ,MAAM,IAAI,OAAA,EAAwF;AAC9F,IAAA,MAAM,IAAA,GAAO,QAAQ,IAAA,IAAQ,OAAA,CAAQ,aAAa,IAAA,IAAQ,IAAA,CAAK,OAAO,UAAA,EAAW;AACjF,IAAA,IAAI,CAAC,IAAA,EAAM,MAAM,IAAIC,8BAAa,4BAA4B,CAAA;AAG9D,IAAA,MAAM,oBAAA,GAA4C;AAAA,MAC9C,GAAG,OAAA,CAAQ,YAAA;AAAA,MACX;AAAA;AAAA,KACJ;AAEA,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,kBAAA,CAAmB,oBAAA,EAAsB,IAAI,CAAA;AAC/D,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,iBAAA,CAAkB,MAAM,oBAAoB,CAAA;AAEtE,IAAA,MAAM,YAAA,GAAe,MAAM,IAAA,CAAK,MAAA,CAAO,QAAQ,oBAAoB,CAAA;AACnE,IAAA,IAAI,CAAC,aAAa,OAAA,EAAS;AACvB,MAAA,MAAM,IAAIA,6BAAA,CAAa,CAAA,6BAAA,EAAgC,YAAA,CAAa,aAAa,CAAA,CAAE,CAAA;AAAA,IACvF;AAEA,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,MAAA,EAAQ,oBAAoB,CAAA;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,UAAA,CAAW,OAAA,EAAkB,MAAA,EAMP;AACxB,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,KAAA,IAAS,OAAA,CAAQ,QAAA;AACtC,IAAA,IAAI,CAAC,KAAA,EAAO,MAAM,IAAIA,8BAAa,mDAAmD,CAAA;AAEtF,IAAA,MAAM,YAAA,GAAoC;AAAA,MACtC,MAAA,EAAQ,OAAA;AAAA,MACR,SAAS,MAAA,CAAO,OAAA;AAAA,MAChB,mBAAmB,MAAA,CAAO,MAAA;AAAA,MAC1B,OAAO,MAAA,CAAO,KAAA;AAAA,MACd,KAAA;AAAA,MACA,iBAAA,EAAmB,IAAA;AAAA,MACnB,KAAA,EAAO;AAAA,QACH,IAAA,EAAM,oBAAA;AAAA,QACN,OAAA,EAAS,GAAA;AAAA,QACT,YAAA,EAAA,SAAA;AAAA,QACA,YAAY,OAAA,CAAQ,UAAA;AAAA,QACpB,sBAAsB,OAAA,CAAQ;AAAA;AAClC,KACJ;AAEA,IAAA,OAAO,KAAK,GAAA,CAAI;AAAA,MACZ,YAAA;AAAA,MACA,MAAM,MAAA,CAAO;AAAA,KAChB,CAAA;AAAA,EACL;AAAA,EAEA,kBAAA,CAAmB,cAAmC,IAAA,EAAoC;AACtF,IAAA,MAAM,KAAA,GAAQ,IAAI,UAAA,CAAW,EAAE,CAAA;AAC/B,IAAA,MAAA,CAAO,gBAAgB,KAAK,CAAA;AAC5B,IAAA,MAAM,QAAQ,IAAA,GAAO,KAAA,CAAM,KAAK,KAAK,CAAA,CAAE,IAAI,CAAA,CAAA,KAAK,CAAA,CAAE,QAAA,CAAS,EAAE,EAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,CAAA,CAAE,KAAK,EAAE,CAAA;AAExF,IAAA,MAAM,MAAM,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAA,KAAQ,GAAI,CAAA;AAExC,IAAA,OAAO;AAAA,MACH,IAAA;AAAA,MACA,IAAI,YAAA,CAAa,KAAA;AAAA,MACjB,OAAO,YAAA,CAAa,iBAAA;AAAA,MACpB,YAAY,GAAA,GAAM,EAAA;AAAA;AAAA,MAClB,WAAA,EAAa,MAAM,YAAA,CAAa,iBAAA;AAAA,MAChC;AAAA,KACJ;AAAA,EACJ;AAAA,EAEA,MAAM,iBAAA,CAAkB,aAAA,EAAqC,YAAA,EAAiE;AAC1H,IAAA,IAAI,OAAA;AACJ,IAAA,MAAM,UAAU,YAAA,CAAa,OAAA;AAC7B,IAAA,IAAI,OAAA,CAAQ,UAAA,CAAW,SAAS,CAAA,EAAG;AAC/B,MAAA,OAAA,GAAU,SAAS,OAAA,CAAQ,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,GAAG,EAAE,CAAA;AAAA,IAChD,CAAA,MAAO;AACH,MAAA,OAAA,GAAU,QAAA,CAAS,SAAS,EAAE,CAAA;AAAA,IAClC;AAEA,IAAA,IAAI,MAAM,OAAO,CAAA,EAAG,MAAM,IAAIA,8BAAa,kBAAkB,CAAA;AAG7D,IAAA,MAAM,SAAA,GAA6B;AAAA,MAC/B,MAAA,EAAQ;AAAA,QACJ,IAAA,EAAM,YAAA,CAAa,KAAA,EAAO,IAAA,IAAQ,oBAAA;AAAA,QAClC,OAAA,EAAS,YAAA,CAAa,KAAA,EAAO,OAAA,IAAW,GAAA;AAAA,QACxC,OAAA;AAAA,QACA,mBAAmB,YAAA,CAAa;AAAA,OACpC;AAAA,MACA,KAAA,EAAO;AAAA,QACH,yBAAA,EAA2B;AAAA,UACvB,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,SAAA,EAAU;AAAA,UAChC,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,SAAA,EAAU;AAAA,UAC9B,EAAE,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,SAAA,EAAU;AAAA,UACjC,EAAE,IAAA,EAAM,YAAA,EAAc,IAAA,EAAM,SAAA,EAAU;AAAA,UACtC,EAAE,IAAA,EAAM,aAAA,EAAe,IAAA,EAAM,SAAA,EAAU;AAAA,UACvC,EAAE,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,SAAA;AAAU;AACrC,OACJ;AAAA,MACA,WAAA,EAAa,2BAAA;AAAA,MACb,OAAA,EAAS;AAAA,QACL,MAAM,aAAA,CAAc,IAAA;AAAA,QACpB,IAAI,aAAA,CAAc,EAAA;AAAA;AAAA,QAElB,KAAA,EAAO,MAAA,CAAO,aAAA,CAAc,KAAK,CAAA;AAAA,QACjC,UAAA,EAAY,MAAA,CAAO,aAAA,CAAc,UAAU,CAAA;AAAA,QAC3C,WAAA,EAAa,MAAA,CAAO,aAAA,CAAc,WAAW,CAAA;AAAA,QAC7C,OAAO,aAAA,CAAc;AAAA;AACzB,KACJ;AAEA,IAAA,MAAM,SAAA,GAAY,MAAM,IAAA,CAAK,MAAA,CAAO,cAAc,SAAS,CAAA;AAC3D,IAAA,OAAO,EAAE,GAAG,aAAA,EAAe,SAAA,EAAU;AAAA,EACzC;AAAA,EAEA,mBAAA,CAAoB,QAA6B,YAAA,EAA2C;AACxF,IAAA,MAAM,aAAA,GAAgB;AAAA,MAClB,MAAM,MAAA,CAAO,IAAA;AAAA,MACb,IAAI,MAAA,CAAO,EAAA;AAAA,MACX,OAAO,MAAA,CAAO,KAAA;AAAA,MACd,OAAO,MAAA,CAAO,KAAA;AAAA,MACd,UAAA,EAAY,MAAA,CAAO,UAAA,CAAW,QAAA,EAAS;AAAA,MACvC,WAAA,EAAa,MAAA,CAAO,WAAA,CAAY,QAAA;AAAS,KAC7C;AAEA,IAAA,MAAM,QAAA,GAAW;AAAA,MACb,QAAQ,YAAA,CAAa,MAAA;AAAA,MACrB,SAAS,YAAA,CAAa,OAAA;AAAA,MACtB,QAAQ,YAAA,CAAa,iBAAA;AAAA,MACrB,OAAO,YAAA,CAAa,KAAA;AAAA,MACpB,OAAO,YAAA,CAAa,KAAA;AAAA,MACpB,mBAAmB,YAAA,CAAa;AAAA,KACpC;AAEA,IAAA,MAAM,cAAA,GAAiB;AAAA,MACnB,WAAA,EAAa,CAAA;AAAA,MACb,QAAA;AAAA,MACA,OAAA,EAAS;AAAA,QACL,aAAA;AAAA,QACA,WAAW,MAAA,CAAO;AAAA;AACtB,KACJ;AAEA,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,SAAA,CAAU,cAAc,CAAA;AAC7C,IAAA,MAAM,MAAA,GAAS,KAAK,OAAO,CAAA;AAC3B,IAAA,OAAO,QAAQ,MAAM,CAAA,CAAA;AAAA,EACzB;AAAA,EAEA,MAAM,MAAA,CAAO,MAAA,EAA6B,YAAA,EAA4D;AAClG,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,mBAAA,CAAoB,MAAA,EAAQ,YAAY,CAAA;AAC5D,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,KAAqB,cAAA,EAAgB;AAAA,MAClE,WAAA,EAAa,CAAA;AAAA,MACb,aAAA,EAAe,MAAA;AAAA,MACf,mBAAA,EAAqB;AAAA,KACzB,EAAG,EAAE,QAAA,EAAU,IAAA,EAAM,CAAA;AAGrB,IAAA,IAAI,QAAA,CAAS,aAAA,IAAiB,QAAA,CAAS,OAAA,KAAY,MAAA,EAAW;AAC1D,MAAA,QAAA,CAAS,OAAA,GAAU,KAAA;AAAA,IACvB;AAEA,IAAA,OAAO,QAAA;AAAA,EACX;AAAA,EAEA,MAAM,MAAA,CAAO,MAAA,EAA6B,YAAA,EAA4D;AAClG,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,mBAAA,CAAoB,MAAA,EAAQ,YAAY,CAAA;AAC5D,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,KAAqB,cAAA,EAAgB;AAAA,MAClE,WAAA,EAAa,CAAA;AAAA,MACb,aAAA,EAAe,MAAA;AAAA,MACf,mBAAA,EAAqB;AAAA,KACzB,EAAG,EAAE,QAAA,EAAU,IAAA,EAAM,CAAA;AAErB,IAAA,IAAI,QAAA,CAAS,OAAA,KAAY,KAAA,IAAS,QAAA,CAAS,WAAA,EAAa;AACpD,MAAA,MAAM,IAAIA,6BAAA,CAAa,QAAA,CAAS,WAAA,IAAe,2BAA2B,CAAA;AAAA,IAC9E;AAEA,IAAA,OAAO,QAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,mBAAA,GAAyD;AAC3D,IAAA,OAAO,KAAK,IAAA,CAAK,GAAA,CAA8B,mBAAmB,EAAE,QAAA,EAAU,MAAM,CAAA;AAAA,EACxF;AACJ","file":"chunk-7M4ZN7F3.js","sourcesContent":["export interface UPSConfig {\n baseUrl: string; // API base URL\n network: string; // CAIP-2 format: \"eip155:737998412\"\n chainId?: number; // Optional, parsed from network if not provided\n timeout?: number; // Request timeout (default: 30000)\n retryAttempts?: number; // Retry count (default: 3)\n refreshInterval?: number; // Token refresh interval in ms (default: 60000 = 1 min)\n}\n\n// Authentication\nexport interface AuthState {\n isAuthenticated: boolean;\n token: string | null;\n expiresAt: Date | null;\n address: string | null;\n}\n\nexport interface AuthResult {\n token: string;\n expiresAt: string;\n}\n\n// User (from /auth/connect and /users/me)\nexport interface User {\n id: string;\n walletAddress: string;\n status: string;\n createdAt: string;\n}\n\n// Connect auth result (unified auth flow)\nexport interface ConnectResult {\n user: User;\n token: string;\n expiresAt: string;\n isNewUser: boolean;\n}\n\n// Wallet\nexport type EIP1193Provider = {\n request: (args: { method: string; params?: unknown[] }) => Promise<unknown>;\n on?: (event: string, handler: (...args: unknown[]) => void) => void;\n removeListener?: (event: string, handler: (...args: unknown[]) => void) => void;\n};\n\nexport interface WalletState {\n isConnected: boolean;\n address: string | null;\n chainId: number | null;\n provider: EIP1193Provider | null;\n}\n\nexport interface ConnectedWallet {\n address: string;\n chainId: number;\n provider: EIP1193Provider;\n}\n\n// Account\nexport type AccountStatus = 'pending' | 'kyc_in_progress' | 'active' | 'frozen' | 'closed';\n\nexport interface Account {\n id: string;\n ownerAddress: string;\n walletAddress: string;\n status: AccountStatus;\n kycLevel: number;\n userId?: string;\n createdAt: string;\n updatedAt?: string;\n}\n\nexport interface CreateAccountParams {\n ownerAddress: string;\n salt: string; // 0x-prefixed 32-byte hex\n}\n\nexport interface CreateAccountResponse {\n account: Account;\n txHash: string;\n}\n\n// Payment (x402)\nexport interface PaymentRequirements {\n scheme: string;\n network: string;\n maxAmountRequired: string;\n asset: string;\n payTo: string;\n maxTimeoutSeconds: number;\n resource?: string;\n description?: string;\n\n extra?: PaymentExtra;\n from?: string;\n}\n\nexport enum PaymentType {\n UNSPECIFIED = 'UNSPECIFIED',\n DIRECT = 'DIRECT',\n ESCROW = 'ESCROW',\n INVOICE = 'INVOICE'\n}\n\nexport interface PaymentExtra {\n name?: string;\n version?: string;\n payment_type?: PaymentType; // snake_case from API\n arbiter?: string;\n release_time?: number; // snake_case from API\n payee?: string; // intended recipient for escrow\n invoice_id?: string;\n invoice_payment_type?: 'DIRECT' | 'ESCROW';\n}\n\nexport interface PaymentAuthorization {\n from: string;\n to: string;\n value: string;\n validAfter: number;\n validBefore: number;\n nonce: string; // bytes32 hex\n}\n\nexport interface SignedAuthorization extends PaymentAuthorization {\n signature: string;\n}\n\nexport interface VerifyResponse {\n isValid: boolean;\n invalidReason?: string;\n payer?: string;\n}\n\nexport interface SettleResponse {\n success: boolean;\n errorReason?: string;\n transaction?: string;\n network?: string;\n payer?: string;\n}\n\n// x402 Supported Schemes\nexport interface SupportedScheme {\n x402Version: number;\n scheme: string;\n network: string;\n}\n\nexport interface SupportedSchemesResponse {\n kinds: SupportedScheme[];\n extensions?: string[];\n signers?: Record<string, string[]>;\n}\n\n// EIP-712 Typed Data\nexport interface EIP712Domain {\n name: string;\n version: string;\n chainId: number;\n verifyingContract: string;\n}\n\nexport interface EIP712Type {\n name: string;\n type: string;\n}\n\nexport interface EIP712TypedData {\n domain: EIP712Domain;\n types: Record<string, EIP712Type[]>;\n primaryType: string;\n message: Record<string, unknown>;\n}\n\n// Escrow\nexport interface Escrow {\n escrowId: string;\n payer: string;\n payee: string;\n amount: string;\n arbiter: string;\n releaseTime: number;\n status: EscrowStatus;\n}\n\nexport type EscrowStatus = 'ACTIVE' | 'RELEASED' | 'REFUNDED';\n\nexport interface EscrowActionResponse {\n success: boolean;\n errorReason?: string;\n transaction?: string;\n network?: string;\n}\n\n// Invoices\nexport type InvoiceStatus = 'UNSPECIFIED' | 'PENDING' | 'PARTIALLY_PAID' | 'PAID' | 'CANCELLED' | 'EXPIRED';\n\nexport interface Invoice {\n invoice_id: string;\n merchant: string;\n payer: string;\n amount: string;\n paid_amount: string;\n due_date: number;\n created_at: number;\n payment_type: 'DIRECT' | 'ESCROW';\n status: InvoiceStatus;\n metadata_uri: string;\n}\n\nexport interface CreateInvoiceRequest {\n merchant?: string;\n amount: string;\n payer?: string;\n due_date: number;\n payment_type: 'DIRECT' | 'ESCROW';\n metadata_uri: string;\n}\n\nexport interface InvoiceResponse {\n invoice: Invoice;\n}\n\nexport interface InvoiceListResponse {\n invoices: Invoice[];\n next_page_token: string;\n}\n","import { HttpClient } from '../core/http-client';\nimport { WalletModule } from '../wallet';\nimport {\n PaymentRequirements,\n PaymentAuthorization,\n SignedAuthorization,\n VerifyResponse,\n SettleResponse,\n SupportedSchemesResponse,\n EIP712TypedData,\n Invoice,\n PaymentType\n} from '../types';\nimport { PaymentError } from '../core/errors';\n\nexport class PaymentModule {\n constructor(\n private http: HttpClient,\n private wallet: WalletModule\n ) { }\n\n async pay(request: { requirements: PaymentRequirements; from?: string }): Promise<SettleResponse> {\n const from = request.from || request.requirements.from || this.wallet.getAddress();\n if (!from) throw new PaymentError('No sender address provided');\n\n // Create requirements with `from` set for EIP-1271 Smart Account signature verification\n const requirementsWithFrom: PaymentRequirements = {\n ...request.requirements,\n from, // Critical: backend needs to know which Smart Account is the payer\n };\n\n const auth = this.buildAuthorization(requirementsWithFrom, from);\n const signed = await this.signAuthorization(auth, requirementsWithFrom);\n\n const verification = await this.verify(signed, requirementsWithFrom);\n if (!verification.isValid) {\n throw new PaymentError(`Payment verification failed: ${verification.invalidReason}`);\n }\n\n return this.settle(signed, requirementsWithFrom);\n }\n\n /**\n * Pay an invoice\n * @param invoice The invoice to pay\n * @param params Payment parameters (amount, asset, network)\n */\n async payInvoice(invoice: Invoice, params: {\n amount: string; // Atomic units\n asset: string;\n network: string;\n payTo?: string; // Defaults to invoice.merchant\n from?: string; // Payer Smart Account address\n }): Promise<SettleResponse> {\n const payTo = params.payTo || invoice.merchant;\n if (!payTo) throw new PaymentError('No payee address (merchant) available for invoice');\n\n const requirements: PaymentRequirements = {\n scheme: 'exact',\n network: params.network,\n maxAmountRequired: params.amount,\n asset: params.asset,\n payTo,\n maxTimeoutSeconds: 3600,\n extra: {\n name: 'x402 Payment Token',\n version: '1',\n payment_type: PaymentType.INVOICE,\n invoice_id: invoice.invoice_id,\n invoice_payment_type: invoice.payment_type\n }\n };\n\n return this.pay({\n requirements,\n from: params.from\n });\n }\n\n buildAuthorization(requirements: PaymentRequirements, from: string): PaymentAuthorization {\n const array = new Uint8Array(32);\n crypto.getRandomValues(array);\n const nonce = '0x' + Array.from(array).map(b => b.toString(16).padStart(2, '0')).join('');\n\n const now = Math.floor(Date.now() / 1000);\n\n return {\n from,\n to: requirements.payTo,\n value: requirements.maxAmountRequired,\n validAfter: now - 60, // 60s buffer\n validBefore: now + requirements.maxTimeoutSeconds,\n nonce\n };\n }\n\n async signAuthorization(authorization: PaymentAuthorization, requirements: PaymentRequirements): Promise<SignedAuthorization> {\n let chainId: number;\n const network = requirements.network;\n if (network.startsWith('eip155:')) {\n chainId = parseInt(network.split(':')[1], 10);\n } else {\n chainId = parseInt(network, 10);\n }\n\n if (isNaN(chainId)) throw new PaymentError('Invalid chain ID');\n\n // EIP-712 requires uint256 values as BigInt for proper encoding\n const typedData: EIP712TypedData = {\n domain: {\n name: requirements.extra?.name || \"x402 Payment Token\",\n version: requirements.extra?.version || \"1\",\n chainId,\n verifyingContract: requirements.asset\n },\n types: {\n TransferWithAuthorization: [\n { name: \"from\", type: \"address\" },\n { name: \"to\", type: \"address\" },\n { name: \"value\", type: \"uint256\" },\n { name: \"validAfter\", type: \"uint256\" },\n { name: \"validBefore\", type: \"uint256\" },\n { name: \"nonce\", type: \"bytes32\" }\n ]\n },\n primaryType: \"TransferWithAuthorization\",\n message: {\n from: authorization.from,\n to: authorization.to,\n // CRITICAL: viem requires BigInt for uint256 types\n value: BigInt(authorization.value),\n validAfter: BigInt(authorization.validAfter),\n validBefore: BigInt(authorization.validBefore),\n nonce: authorization.nonce\n }\n };\n\n const signature = await this.wallet.signTypedData(typedData);\n return { ...authorization, signature };\n }\n\n encodePaymentHeader(signed: SignedAuthorization, requirements: PaymentRequirements): string {\n const authorization = {\n from: signed.from,\n to: signed.to,\n value: signed.value,\n nonce: signed.nonce,\n validAfter: signed.validAfter.toString(),\n validBefore: signed.validBefore.toString(),\n };\n\n const accepted = {\n scheme: requirements.scheme,\n network: requirements.network,\n amount: requirements.maxAmountRequired,\n asset: requirements.asset,\n payTo: requirements.payTo,\n maxTimeoutSeconds: requirements.maxTimeoutSeconds,\n };\n\n const paymentPayload = {\n x402Version: 1,\n accepted,\n payload: {\n authorization,\n signature: signed.signature,\n },\n };\n\n const jsonStr = JSON.stringify(paymentPayload);\n const b64Str = btoa(jsonStr);\n return `x402 ${b64Str}`;\n }\n\n async verify(signed: SignedAuthorization, requirements: PaymentRequirements): Promise<VerifyResponse> {\n const header = this.encodePaymentHeader(signed, requirements);\n const response = await this.http.post<VerifyResponse>('/x402/verify', {\n x402Version: 1,\n paymentHeader: header,\n paymentRequirements: requirements\n }, { skipAuth: true });\n\n // Normalize response: if invalidReason is present, consider it invalid\n if (response.invalidReason && response.isValid === undefined) {\n response.isValid = false;\n }\n\n return response;\n }\n\n async settle(signed: SignedAuthorization, requirements: PaymentRequirements): Promise<SettleResponse> {\n const header = this.encodePaymentHeader(signed, requirements);\n const response = await this.http.post<SettleResponse>('/x402/settle', {\n x402Version: 1,\n paymentHeader: header,\n paymentRequirements: requirements\n }, { skipAuth: true });\n\n if (response.success === false || response.errorReason) {\n throw new PaymentError(response.errorReason || 'Payment settlement failed');\n }\n\n return response;\n }\n\n /**\n * Get supported payment schemes from the facilitator.\n * This endpoint does not require authentication.\n */\n async getSupportedSchemes(): Promise<SupportedSchemesResponse> {\n return this.http.get<SupportedSchemesResponse>('/x402/supported', { skipAuth: true });\n }\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/types/index.ts","../src/payment/index.ts"],"names":["PaymentType"],"mappings":"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","file":"chunk-ULP4VMHK.mjs","sourcesContent":["export interface UPSConfig {\n baseUrl: string; // API base URL\n network: string; // CAIP-2 format: \"eip155:737998412\"\n chainId?: number; // Optional, parsed from network if not provided\n timeout?: number; // Request timeout (default: 30000)\n retryAttempts?: number; // Retry count (default: 3)\n refreshInterval?: number; // Token refresh interval in ms (default: 60000 = 1 min)\n}\n\n// Authentication\nexport interface AuthState {\n isAuthenticated: boolean;\n token: string | null;\n expiresAt: Date | null;\n address: string | null;\n}\n\nexport interface AuthResult {\n token: string;\n expiresAt: string;\n}\n\n// User (from /auth/connect and /users/me)\nexport interface User {\n id: string;\n walletAddress: string;\n status: string;\n createdAt: string;\n}\n\n// Connect auth result (unified auth flow)\nexport interface ConnectResult {\n user: User;\n token: string;\n expiresAt: string;\n isNewUser: boolean;\n}\n\n// Wallet\nexport type EIP1193Provider = {\n request: (args: { method: string; params?: unknown[] }) => Promise<unknown>;\n on?: (event: string, handler: (...args: unknown[]) => void) => void;\n removeListener?: (event: string, handler: (...args: unknown[]) => void) => void;\n};\n\nexport interface WalletState {\n isConnected: boolean;\n address: string | null;\n chainId: number | null;\n provider: EIP1193Provider | null;\n}\n\nexport interface ConnectedWallet {\n address: string;\n chainId: number;\n provider: EIP1193Provider;\n}\n\n// Account\nexport type AccountStatus = 'pending' | 'kyc_in_progress' | 'active' | 'frozen' | 'closed';\n\nexport interface Account {\n id: string;\n ownerAddress: string;\n walletAddress: string;\n status: AccountStatus;\n kycLevel: number;\n userId?: string;\n createdAt: string;\n updatedAt?: string;\n}\n\nexport interface CreateAccountParams {\n ownerAddress: string;\n salt: string; // 0x-prefixed 32-byte hex\n}\n\nexport interface CreateAccountResponse {\n account: Account;\n txHash: string;\n}\n\n// Payment (x402)\nexport interface PaymentRequirements {\n scheme: string;\n network: string;\n maxAmountRequired: string;\n asset: string;\n payTo: string;\n maxTimeoutSeconds: number;\n resource?: string;\n description?: string;\n\n extra?: PaymentExtra;\n from?: string;\n}\n\nexport enum PaymentType {\n UNSPECIFIED = 'UNSPECIFIED',\n DIRECT = 'DIRECT',\n ESCROW = 'ESCROW',\n INVOICE = 'INVOICE'\n}\n\nexport interface PaymentExtra {\n name?: string;\n version?: string;\n payment_type?: PaymentType; // snake_case from API\n arbiter?: string;\n release_time?: number; // snake_case from API\n payee?: string; // intended recipient for escrow\n invoice_id?: string;\n invoice_payment_type?: 'DIRECT' | 'ESCROW';\n}\n\nexport interface PaymentAuthorization {\n from: string;\n to: string;\n value: string;\n validAfter: number;\n validBefore: number;\n nonce: string; // bytes32 hex\n}\n\nexport interface SignedAuthorization extends PaymentAuthorization {\n signature: string;\n}\n\nexport interface VerifyResponse {\n isValid: boolean;\n invalidReason?: string;\n payer?: string;\n}\n\nexport interface SettleResponse {\n success: boolean;\n errorReason?: string;\n transaction?: string;\n network?: string;\n payer?: string;\n}\n\n// x402 Supported Schemes\nexport interface SupportedScheme {\n x402Version: number;\n scheme: string;\n network: string;\n}\n\nexport interface SupportedSchemesResponse {\n kinds: SupportedScheme[];\n extensions?: string[];\n signers?: Record<string, string[]>;\n}\n\n// EIP-712 Typed Data\nexport interface EIP712Domain {\n name: string;\n version: string;\n chainId: number;\n verifyingContract: string;\n}\n\nexport interface EIP712Type {\n name: string;\n type: string;\n}\n\nexport interface EIP712TypedData {\n domain: EIP712Domain;\n types: Record<string, EIP712Type[]>;\n primaryType: string;\n message: Record<string, unknown>;\n}\n\n// Escrow\nexport interface Escrow {\n escrowId: string;\n payer: string;\n payee: string;\n amount: string;\n arbiter: string;\n releaseTime: number;\n status: EscrowStatus;\n}\n\nexport type EscrowStatus = 'ACTIVE' | 'RELEASED' | 'REFUNDED';\n\nexport interface EscrowActionResponse {\n success: boolean;\n errorReason?: string;\n transaction?: string;\n network?: string;\n}\n\n// Invoices\nexport type InvoiceStatus = 'UNSPECIFIED' | 'PENDING' | 'PARTIALLY_PAID' | 'PAID' | 'CANCELLED' | 'EXPIRED';\n\nexport interface Invoice {\n invoice_id: string;\n merchant: string;\n payer: string;\n amount: string;\n paid_amount: string;\n due_date: number;\n created_at: number;\n payment_type: 'DIRECT' | 'ESCROW';\n status: InvoiceStatus;\n metadata_uri: string;\n}\n\nexport interface CreateInvoiceRequest {\n merchant?: string;\n amount: string;\n payer?: string;\n due_date: number;\n payment_type: 'DIRECT' | 'ESCROW';\n metadata_uri: string;\n}\n\nexport interface InvoiceResponse {\n invoice: Invoice;\n}\n\nexport interface InvoiceListResponse {\n invoices: Invoice[];\n next_page_token: string;\n}\n","import { HttpClient } from '../core/http-client';\nimport { WalletModule } from '../wallet';\nimport {\n PaymentRequirements,\n PaymentAuthorization,\n SignedAuthorization,\n VerifyResponse,\n SettleResponse,\n SupportedSchemesResponse,\n EIP712TypedData,\n Invoice,\n PaymentType\n} from '../types';\nimport { PaymentError } from '../core/errors';\n\nexport class PaymentModule {\n constructor(\n private http: HttpClient,\n private wallet: WalletModule\n ) { }\n\n async pay(request: { requirements: PaymentRequirements; from?: string }): Promise<SettleResponse> {\n const from = request.from || request.requirements.from || this.wallet.getAddress();\n if (!from) throw new PaymentError('No sender address provided');\n\n // Create requirements with `from` set for EIP-1271 Smart Account signature verification\n const requirementsWithFrom: PaymentRequirements = {\n ...request.requirements,\n from, // Critical: backend needs to know which Smart Account is the payer\n };\n\n const auth = this.buildAuthorization(requirementsWithFrom, from);\n const signed = await this.signAuthorization(auth, requirementsWithFrom);\n\n const verification = await this.verify(signed, requirementsWithFrom);\n if (!verification.isValid) {\n throw new PaymentError(`Payment verification failed: ${verification.invalidReason}`);\n }\n\n return this.settle(signed, requirementsWithFrom);\n }\n\n /**\n * Pay an invoice\n * @param invoice The invoice to pay\n * @param params Payment parameters (amount, asset, network)\n */\n async payInvoice(invoice: Invoice, params: {\n amount: string; // Atomic units\n asset: string;\n network: string;\n payTo?: string; // Defaults to invoice.merchant\n from?: string; // Payer Smart Account address\n }): Promise<SettleResponse> {\n const payTo = params.payTo || invoice.merchant;\n if (!payTo) throw new PaymentError('No payee address (merchant) available for invoice');\n\n const requirements: PaymentRequirements = {\n scheme: 'exact',\n network: params.network,\n maxAmountRequired: params.amount,\n asset: params.asset,\n payTo,\n maxTimeoutSeconds: 3600,\n extra: {\n name: 'x402 Payment Token',\n version: '1',\n payment_type: PaymentType.INVOICE,\n invoice_id: invoice.invoice_id,\n invoice_payment_type: invoice.payment_type\n }\n };\n\n return this.pay({\n requirements,\n from: params.from\n });\n }\n\n buildAuthorization(requirements: PaymentRequirements, from: string): PaymentAuthorization {\n const array = new Uint8Array(32);\n crypto.getRandomValues(array);\n const nonce = '0x' + Array.from(array).map(b => b.toString(16).padStart(2, '0')).join('');\n\n const now = Math.floor(Date.now() / 1000);\n\n return {\n from,\n to: requirements.payTo,\n value: requirements.maxAmountRequired,\n validAfter: now - 60, // 60s buffer\n validBefore: now + requirements.maxTimeoutSeconds,\n nonce\n };\n }\n\n async signAuthorization(authorization: PaymentAuthorization, requirements: PaymentRequirements): Promise<SignedAuthorization> {\n let chainId: number;\n const network = requirements.network;\n if (network.startsWith('eip155:')) {\n chainId = parseInt(network.split(':')[1], 10);\n } else {\n chainId = parseInt(network, 10);\n }\n\n if (isNaN(chainId)) throw new PaymentError('Invalid chain ID');\n\n // EIP-712 requires uint256 values as BigInt for proper encoding\n const typedData: EIP712TypedData = {\n domain: {\n name: requirements.extra?.name || \"x402 Payment Token\",\n version: requirements.extra?.version || \"1\",\n chainId,\n verifyingContract: requirements.asset\n },\n types: {\n TransferWithAuthorization: [\n { name: \"from\", type: \"address\" },\n { name: \"to\", type: \"address\" },\n { name: \"value\", type: \"uint256\" },\n { name: \"validAfter\", type: \"uint256\" },\n { name: \"validBefore\", type: \"uint256\" },\n { name: \"nonce\", type: \"bytes32\" }\n ]\n },\n primaryType: \"TransferWithAuthorization\",\n message: {\n from: authorization.from,\n to: authorization.to,\n // CRITICAL: viem requires BigInt for uint256 types\n value: BigInt(authorization.value),\n validAfter: BigInt(authorization.validAfter),\n validBefore: BigInt(authorization.validBefore),\n nonce: authorization.nonce\n }\n };\n\n const signature = await this.wallet.signTypedData(typedData);\n return { ...authorization, signature };\n }\n\n encodePaymentHeader(signed: SignedAuthorization, requirements: PaymentRequirements): string {\n const authorization = {\n from: signed.from,\n to: signed.to,\n value: signed.value,\n nonce: signed.nonce,\n validAfter: signed.validAfter.toString(),\n validBefore: signed.validBefore.toString(),\n };\n\n const accepted = {\n scheme: requirements.scheme,\n network: requirements.network,\n amount: requirements.maxAmountRequired,\n asset: requirements.asset,\n payTo: requirements.payTo,\n maxTimeoutSeconds: requirements.maxTimeoutSeconds,\n };\n\n const paymentPayload = {\n x402Version: 1,\n accepted,\n payload: {\n authorization,\n signature: signed.signature,\n },\n };\n\n const jsonStr = JSON.stringify(paymentPayload);\n const b64Str = btoa(jsonStr);\n return `x402 ${b64Str}`;\n }\n\n async verify(signed: SignedAuthorization, requirements: PaymentRequirements): Promise<VerifyResponse> {\n const header = this.encodePaymentHeader(signed, requirements);\n const response = await this.http.post<VerifyResponse>('/x402/verify', {\n x402Version: 1,\n paymentHeader: header,\n paymentRequirements: requirements\n }, { skipAuth: true });\n\n // Normalize response: if invalidReason is present, consider it invalid\n if (response.invalidReason && response.isValid === undefined) {\n response.isValid = false;\n }\n\n return response;\n }\n\n async settle(signed: SignedAuthorization, requirements: PaymentRequirements): Promise<SettleResponse> {\n const header = this.encodePaymentHeader(signed, requirements);\n const response = await this.http.post<SettleResponse>('/x402/settle', {\n x402Version: 1,\n paymentHeader: header,\n paymentRequirements: requirements\n }, { skipAuth: true });\n\n if (response.success === false || response.errorReason) {\n throw new PaymentError(response.errorReason || 'Payment settlement failed');\n }\n\n return response;\n }\n\n /**\n * Get supported payment schemes from the facilitator.\n * This endpoint does not require authentication.\n */\n async getSupportedSchemes(): Promise<SupportedSchemesResponse> {\n return this.http.get<SupportedSchemesResponse>('/x402/supported', { skipAuth: true });\n }\n}\n"]}
|