importorg.openlibx402.core.models.PaymentRequest// Parse from JSONvalrequest=PaymentRequest.fromJson(jsonString)// Access fieldsvalamount=request.maxAmountRequiredvalpaymentAddress=request.paymentAddressvalexpiresAt=request.expiresAt// Check expirationvalexpired=request.isExpired()// Convert to JSONvaljson=request.toJson()// Convert to Mapvalmap=request.toMap()// Copy with changes (immutable)valupdated=request.copy(maxAmountRequired="0.20")
importorg.openlibx402.core.models.PaymentAuthorization// Create authorizationvalauth=PaymentAuthorization(paymentId=paymentId,actualAmount=actualAmount,paymentAddress=paymentAddress,assetAddress=assetAddress,network=network,timestamp=Clock.System.now(),signature=signature,publicKey=publicKey,transactionHash=transactionHash)// Convert to header value (base64-encoded JSON)valheaderValue=auth.toHeaderValue()// Parse from headervalparsed=PaymentAuthorization.fromHeader(headerValue)// Parse from JSONvalfromJson=PaymentAuthorization.fromJson(jsonString)
// Get error infovalinfo=X402Error.getInfo("PAYMENT_REQUIRED")valmessage=info?.messagevalretryable=info?.retryvaluserAction=info?.userAction// Check if retryablevalcanRetry=X402Error.isRetryable("INSUFFICIENT_FUNDS")// false// Get all codesvalallCodes=X402Error.getAllCodes()
All operations are coroutine-safe:
- Models are immutable data classes
- SolanaPaymentProcessor uses structured concurrency
- All suspend functions use appropriate dispatchers
importkotlinx.serialization.json.Json// Serializevaljson=Json.encodeToString(PaymentRequest.serializer(),request)// Deserializevalrequest=Json.decodeFromString(PaymentRequest.serializer(),json)// Or use convenience methodsvalrequest=PaymentRequest.fromJson(json)valjson=request.toJson()
// Check if payment is affordablefunPaymentRequest.isAffordable(balance:Double):Boolean=balance>=maxAmountRequired.toDouble()// Get payment amount in smallest unitsfunPaymentRequest.getAmountLamports():Long=(maxAmountRequired.toDouble()*1_000_000_000).toLong()