Mechanisms

mechanisms/evm/upto/facilitator

github.com/x402-foundation/x402/go/v2/mechanisms/evm/upto/facilitator

import "github.com/x402-foundation/x402/go/v2/mechanisms/evm/upto/facilitator"

Constants

Upto-specific error constants.

Source: mechanisms/evm/upto/facilitator/errors.go:7

const (
	ErrUptoInvalidScheme            = "invalid_upto_evm_scheme"
	ErrUptoNetworkMismatch          = "invalid_upto_evm_network_mismatch"
	ErrUptoInvalidPayload           = "invalid_upto_evm_payload"
	ErrUptoSettlementExceedsAmount  = "invalid_upto_evm_payload_settlement_exceeds_amount"
	ErrUptoAmountExceedsPermitted   = "upto_amount_exceeds_permitted"
	ErrUptoUnauthorizedFacilitator  = "upto_unauthorized_facilitator"
	ErrUptoFacilitatorMismatch      = "upto_facilitator_mismatch"
	ErrUptoVerificationFailed       = "invalid_upto_evm_verification_failed"
	ErrUptoFailedToGetNetworkConfig = "invalid_upto_evm_failed_to_get_network_config"
	ErrUptoFailedToGetReceipt       = "invalid_upto_evm_failed_to_get_receipt"
	ErrUptoTransactionFailed        = "invalid_upto_evm_transaction_failed"

	// Shared Permit2 error constants - canonical values live in evm.ErrPermit2*
	ErrPermit2InvalidSpender      = evm.ErrPermit2InvalidSpender
	ErrPermit2RecipientMismatch   = evm.ErrPermit2RecipientMismatch
	ErrPermit2DeadlineExpired     = evm.ErrPermit2DeadlineExpired
	ErrPermit2NotYetValid         = evm.ErrPermit2NotYetValid
	ErrPermit2AmountMismatch      = evm.ErrPermit2AmountMismatch
	ErrPermit2TokenMismatch       = evm.ErrPermit2TokenMismatch
	ErrPermit2InvalidSignature    = evm.ErrPermit2InvalidSignature
	ErrPermit2InvalidAmount       = evm.ErrPermit2InvalidAmount
	ErrPermit2InvalidDestination  = evm.ErrPermit2InvalidDestination
	ErrPermit2InvalidOwner        = evm.ErrPermit2InvalidOwner
	ErrPermit2PaymentTooEarly     = evm.ErrPermit2PaymentTooEarly
	ErrPermit2InvalidNonce        = evm.ErrPermit2InvalidNonce
	ErrPermit2612AmountMismatch   = evm.ErrPermit2612AmountMismatch
	ErrPermit2SimulationFailed    = evm.ErrPermit2SimulationFailed
	ErrPermit2InsufficientBalance = evm.ErrPermit2InsufficientBalance
	ErrPermit2ProxyNotDeployed    = evm.ErrPermit2ProxyNotDeployed
	ErrPermit2AllowanceRequired   = evm.ErrPermit2AllowanceRequired

	ErrErc20ApprovalInsufficientEth = evm.ErrErc20ApprovalInsufficientEth
	ErrErc20ApprovalBroadcastFailed = evm.ErrErc20ApprovalBroadcastFailed

	ErrInvalidSignatureFormat = "invalid_upto_evm_signature_format"
	ErrInvalidRequiredAmount  = "invalid_upto_evm_required_amount"
)

Functions

func BuildUptoPermit2SettleArgs(permit2Payload *evm.UptoPermit2Payload, settlementAmount *big.Int) (*UptoPermit2SettleArgs, error)

Source: mechanisms/evm/upto/facilitator/permit2_helpers.go:44

BuildUptoPermit2SettleArgs converts a raw UptoPermit2Payload into typed contract-call arguments.

func CheckUptoPermit2Prerequisites( ctx context.Context, signer evm.FacilitatorEvmSigner, tokenAddress string, payer string, amountRequired string, ) *x402.VerifyResponse

Source: mechanisms/evm/upto/facilitator/permit2_helpers.go:277

CheckUptoPermit2Prerequisites checks proxy deployment, payer token balance and payer ETH balance for gas.

func DiagnoseUptoPermit2SimulationFailure( ctx context.Context, signer evm.FacilitatorEvmSigner, tokenAddress string, permit2Payload *evm.UptoPermit2Payload, amountRequired string, ) *x402.VerifyResponse

Source: mechanisms/evm/upto/facilitator/permit2_helpers.go:234

DiagnoseUptoPermit2SimulationFailure runs a multicall diagnostic to return the most specific error reason after an upto simulation failure.

func NewUptoEvmScheme(signer evm.FacilitatorEvmSigner, config *UptoEvmSchemeConfig) *UptoEvmScheme

Source: mechanisms/evm/upto/facilitator/scheme.go:24

func SettleUptoPermit2( ctx context.Context, signer evm.FacilitatorEvmSigner, payload types.PaymentPayload, requirements types.PaymentRequirements, permit2Payload *evm.UptoPermit2Payload, facilCtx *x402.FacilitatorContext, simulateInSettle bool, ) (*x402.SettleResponse, error)

Source: mechanisms/evm/upto/facilitator/permit2.go:193

SettleUptoPermit2 settles an upto Permit2 payment by calling x402UptoPermit2Proxy.settle(). simulateInSettle controls whether to run an eth_call simulation as part of pre-settle verification.

func SimulateUptoPermit2Settle( ctx context.Context, signer evm.FacilitatorEvmSigner, permit2Payload *evm.UptoPermit2Payload, settlementAmount *big.Int, ) (bool, error)

Source: mechanisms/evm/upto/facilitator/permit2_helpers.go:118

SimulateUptoPermit2Settle runs settle() via eth_call (ReadContract) on the upto proxy.

func SimulateUptoPermit2SettleWithPermit( ctx context.Context, signer evm.FacilitatorEvmSigner, permit2Payload *evm.UptoPermit2Payload, settlementAmount *big.Int, eip2612Signature, eip2612Amount, eip2612DeadlineStr string, ) (bool, error)

Source: mechanisms/evm/upto/facilitator/permit2_helpers.go:147

SimulateUptoPermit2SettleWithPermit runs settleWithPermit() via eth_call on the upto proxy.

func VerifyUptoPermit2( ctx context.Context, signer evm.FacilitatorEvmSigner, payload types.PaymentPayload, requirements types.PaymentRequirements, permit2Payload *evm.UptoPermit2Payload, facilCtx *x402.FacilitatorContext, simulate bool, ) (*x402.VerifyResponse, error)

Source: mechanisms/evm/upto/facilitator/permit2.go:21

VerifyUptoPermit2 verifies an upto Permit2 payment payload against the given requirements. simulate controls whether to run an eth_call simulation as part of verification.

Types

type EIP2612PermitData

Source: mechanisms/evm/upto/facilitator/permit2_helpers.go:14

EIP2612PermitData holds the parsed EIP-2612 permit fields for settleWithPermit() calls.

type EIP2612PermitData struct {
	Value    *big.Int
	Deadline *big.Int
	R        [32]byte
	S        [32]byte
	V        uint8
}
Fields
  • Value *big.Int
  • Deadline *big.Int
  • R [32]byte
  • S [32]byte
  • V uint8

type UptoEvmScheme

Source: mechanisms/evm/upto/facilitator/scheme.go:19

UptoEvmScheme implements the SchemeNetworkFacilitator interface for EVM upto payments (V2). Only supports Permit2 (no EIP-3009 path).

type UptoEvmScheme struct {
	// contains filtered or unexported fields
}

func CaipFamily() string

Source: mechanisms/evm/upto/facilitator/scheme.go:40

CaipFamily returns the CAIP family pattern this facilitator supports

func GetExtra(_ x402.Network) map[string]interface{}

Source: mechanisms/evm/upto/facilitator/scheme.go:46

GetExtra returns mechanism-specific extra data for the supported kinds endpoint. For upto, returns the facilitatorAddress so clients include it in their signed witness.

func GetSigners(_ x402.Network) []string

Source: mechanisms/evm/upto/facilitator/scheme.go:57

GetSigners returns signer addresses used by this facilitator.

func Scheme) Scheme() string

Source: mechanisms/evm/upto/facilitator/scheme.go:35

func Settle( ctx context.Context, payload types.PaymentPayload, requirements types.PaymentRequirements, fctx *x402.FacilitatorContext, ) (*x402.SettleResponse, error)

Source: mechanisms/evm/upto/facilitator/scheme.go:81

Settle settles a V2 upto payment on-chain.

func Verify( ctx context.Context, payload types.PaymentPayload, requirements types.PaymentRequirements, fctx *x402.FacilitatorContext, ) (*x402.VerifyResponse, error)

Source: mechanisms/evm/upto/facilitator/scheme.go:62

Verify verifies a V2 upto payment payload against requirements.

type UptoEvmSchemeConfig

Source: mechanisms/evm/upto/facilitator/scheme.go:13

type UptoEvmSchemeConfig struct {
	SimulateInSettle bool
}
Fields
  • SimulateInSettle bool

type UptoPermit2SettleArgs

Source: mechanisms/evm/upto/facilitator/permit2_helpers.go:24

UptoPermit2SettleArgs holds the parsed and typed arguments for upto settle()/settleWithPermit(). Differs from exact: witness includes Facilitator, and settle takes a separate Amount.

type UptoPermit2SettleArgs struct {
	Permit struct {
		Permitted struct {
			Token  common.Address
			Amount *big.Int
		}
		Nonce    *big.Int
		Deadline *big.Int
	}
	SettlementAmount *big.Int
	Owner            common.Address
	Witness          struct {
		To          common.Address
		Facilitator common.Address
		ValidAfter  *big.Int
	}
	Signature []byte
}
Fields
  • Permit struct { Permitted struct { Token common.Address Amount *big.Int } Nonce *big.Int Deadline *big.Int }
  • SettlementAmount *big.Int
  • Owner common.Address
  • Witness struct { To common.Address Facilitator common.Address ValidAfter *big.Int }
  • Signature []byte