Validation and matching helpers for x402 v2 payment requirements.
A client's PaymentPayload.accepted value must preserve every core field
advertised by the resource server. Server-declared extra values are matched
as a recursive subset so clients may append scheme-specific metadata without
changing the server's payment terms.
Summary
Functions
Returns whether client extension echoes preserve advertised extension values.
Returns whether a client-selected requirement preserves the server requirement.
Validates the required x402 v2 PaymentRequirements fields.
Types
Functions
Returns whether client extension echoes preserve advertised extension values.
Omitting extensions is accepted for compatibility with the reference SDK. When the client echoes an advertised extension, every server-provided value must be retained.
Examples
iex> advertised = %{"example" => %{"info" => %{"required" => true}}}
iex> echoed = %{"example" => %{"info" => %{"required" => true, "client" => "value"}}}
iex> X402.PaymentRequirements.extensions_match?(advertised, echoed)
true
Returns whether a client-selected requirement preserves the server requirement.
Core fields must be equal. The client may add fields under extra, but it
cannot remove or change values advertised by the server.
Examples
iex> required = %{"scheme" => "exact", "extra" => %{"name" => "USDC"}}
iex> accepted = %{"scheme" => "exact", "extra" => %{"name" => "USDC", "version" => "2"}}
iex> X402.PaymentRequirements.match?(required, accepted)
true
iex> required = %{"scheme" => "exact", "extra" => %{"name" => "USDC"}}
iex> X402.PaymentRequirements.match?(required, %{"scheme" => "exact", "extra" => %{}})
false
@spec validate(term()) :: :ok | {:error, validation_error() | :invalid_payment_requirements}
Validates the required x402 v2 PaymentRequirements fields.
Examples
iex> requirements = %{
...> "scheme" => "exact",
...> "network" => "eip155:84532",
...> "amount" => "10000",
...> "asset" => "0xasset",
...> "payTo" => "0xreceiver",
...> "maxTimeoutSeconds" => 60,
...> "extra" => %{}
...> }
iex> X402.PaymentRequirements.validate(requirements)
:ok
iex> X402.PaymentRequirements.validate(%{})
{:error, {:missing_fields, ["amount", "asset", "extra", "maxTimeoutSeconds", "network", "payTo", "scheme"]}}