import * as Mppx from 'mppx' import * as Mpp from '../Mpp.js' import * as Policy from './Policy.js' import * as ScreenManager from './ScreenManager.js' /** Maps an MPPX failure to the public relay error contract. */ export function map(cause: unknown): Mpp.RelayError { const message = cause instanceof Error ? cause.message : undefined switch (true) { case cause instanceof ScreenManager.RejectedError: return error(Mpp.relayErrorCode.screenRejected, 'Address screening rejected the payment.') case cause instanceof Policy.UnsupportedChainError: case cause instanceof Mppx.Errors.PaymentMethodUnsupportedError: return error(Mpp.relayErrorCode.unsupported, message) case cause instanceof Policy.PolicyDeniedError: return error(Mpp.relayErrorCode.policyDenied, message) case cause instanceof Mppx.Errors.PaymentExpiredError: return error(Mpp.relayErrorCode.expired, message) case cause instanceof Mppx.Errors.InsufficientBalanceError: case cause instanceof Mppx.Errors.PaymentInsufficientError: return error(Mpp.relayErrorCode.insufficientFunds, message) case cause instanceof Mppx.Errors.InvalidChallengeError: case cause instanceof Mppx.Errors.VerificationFailedError: return error( /\balready (?:been )?used\b/i.test(message ?? '') ? Mpp.relayErrorCode.alreadyUsed : Mpp.relayErrorCode.invalidPayment, message, ) case cause instanceof Mppx.Errors.InvalidPayloadError: case cause instanceof Mppx.Errors.InvalidSignatureError: case cause instanceof Mppx.Errors.MalformedCredentialError: return error(Mpp.relayErrorCode.invalidPayment, message) case message?.toLowerCase().includes('simulation'): return error(Mpp.relayErrorCode.simulationFailed, message) case message?.toLowerCase().includes('broadcast'): return error(Mpp.relayErrorCode.broadcastFailed, message) default: return error(Mpp.relayErrorCode.unknown, message) } } function error(code: Mpp.RelayErrorCode, message: string | undefined): Mpp.RelayError { return message === undefined ? { code } : { code, message } }