diff --git a/python/examples/adk-demo/server/agents/adk_merchant_agent.py b/python/examples/adk-demo/server/agents/adk_merchant_agent.py index 8851af4..958cda7 100644 --- a/python/examples/adk-demo/server/agents/adk_merchant_agent.py +++ b/python/examples/adk-demo/server/agents/adk_merchant_agent.py @@ -61,7 +61,7 @@ def get_product_details_and_request_payment(self, product_name: str) -> dict: price = self._get_product_price(product_name) requirements = PaymentRequirements( scheme="exact", - network="base-sepolia", + network="eip155:84532", # Base Sepolia testnet asset="0x036CbD53842c5426634e7929541eC2318f3dCF7e", pay_to=self._wallet_address, max_amount_required=price, diff --git a/python/x402_a2a/README.md b/python/x402_a2a/README.md index 83ac7d8..b5ad3bf 100644 --- a/python/x402_a2a/README.md +++ b/python/x402_a2a/README.md @@ -142,7 +142,7 @@ class x402ServerConfig(BaseModel): """Configuration for how a server expects to be paid""" price: Union[str, int, TokenAmount] # Payment price (Money or TokenAmount) pay_to_address: str # Ethereum address to receive payment - network: str = "base" # Blockchain network + network: str = "eip155:8453" # Blockchain network (CAIP-2 format, Base mainnet) description: str = "Payment required..." # Human-readable description mime_type: str = "application/json" # Expected response type max_timeout_seconds: int = 600 # Payment validity timeout @@ -383,7 +383,7 @@ def create_payment_requirements( price: Union[str, int, TokenAmount], # Price can be Money or TokenAmount pay_to_address: str, resource: str, - network: str = "base", + network: str = "eip155:8453", description: str = "", mime_type: str = "application/json", scheme: str = "exact", @@ -808,7 +808,7 @@ async def handle_payment_request(task: Task, price: str, resource: str): price=price, # Can be "$1.00", 1.00, or TokenAmount pay_to_address="0x...", # Merchant's address resource=resource, - network="base", + network="eip155:8453", description="Service payment" ) @@ -837,7 +837,7 @@ async def handle_payment_submission(task: Task, payment_requirements: PaymentReq if not verify_response.is_valid: task = utils.record_payment_failure( task, "verification_failed", - SettleResponse(success=False, network="base", error_reason=verify_response.invalid_reason) + SettleResponse(success=False, network="eip155:8453", error_reason=verify_response.invalid_reason) ) return task @@ -851,7 +851,7 @@ async def handle_payment_submission(task: Task, payment_requirements: PaymentReq settle_response_result = SettleResponse( success=settle_response.success, transaction=settle_response.transaction, - network=settle_response.network or "base", + network=settle_response.network or "eip155:8453", payer=settle_response.payer, error_reason=settle_response.error_reason ) diff --git a/python/x402_a2a/core/helpers.py b/python/x402_a2a/core/helpers.py index e4c2d37..66fd12c 100644 --- a/python/x402_a2a/core/helpers.py +++ b/python/x402_a2a/core/helpers.py @@ -24,7 +24,7 @@ def require_payment( price: Union[str, int, TokenAmount], pay_to_address: str, resource: Optional[str] = None, - network: str = "base", + network: str = "eip155:8453", description: str = "Payment required for this service", message: Optional[str] = None, ) -> x402PaymentRequiredException: @@ -34,9 +34,10 @@ def require_payment( Args: price: Payment amount (e.g., "$1.00", 1.00, TokenAmount) - pay_to_address: Ethereum address to receive payment + pay_to_address: Address to receive payment (format depends on network) resource: Resource identifier (auto-generated if None) - network: Blockchain network (default: "base") + network: Blockchain network in CAIP-2 format (default: "eip155:8453" for Base). + Examples: "eip155:1" (Ethereum), "bip122:000000000019d6689c085ae165831e93" (Bitcoin) description: Human-readable description message: Exception message (default: uses description) @@ -98,16 +99,16 @@ def paid_service( price: Union[str, int, TokenAmount], pay_to_address: str, resource: Optional[str] = None, - network: str = "base", + network: str = "eip155:8453", description: str = "Payment required for this service", ): """Decorator to automatically require payment for a function or method. Args: price: Payment amount (e.g., "$1.00", 1.00, TokenAmount) - pay_to_address: Ethereum address to receive payment + pay_to_address: Address to receive payment (format depends on network) resource: Resource identifier (auto-generated from function name if None) - network: Blockchain network (default: "base") + network: Blockchain network in CAIP-2 format (default: "eip155:8453" for Base) description: Human-readable description Example: @@ -149,16 +150,16 @@ def create_tiered_payment_options( pay_to_address: str, resource: str, tiers: Optional[List[dict]] = None, - network: str = "base", + network: str = "eip155:8453", ) -> List[PaymentRequirements]: """Create multiple payment options with different tiers/features. Args: base_price: Base payment amount - pay_to_address: Ethereum address to receive payment + pay_to_address: Address to receive payment (format depends on network) resource: Base resource identifier tiers: List of tier definitions with 'multiplier', 'suffix', 'description' - network: Blockchain network (default: "base") + network: Blockchain network in CAIP-2 format (default: "eip155:8453" for Base) Returns: List of PaymentRequirements for different service tiers @@ -246,7 +247,7 @@ def smart_paid_service( price: Union[str, int, TokenAmount], pay_to_address: str, resource: Optional[str] = None, - network: str = "base", + network: str = "eip155:8453", description: str = "Payment required for this service", ): """Smart decorator that only requires payment if not already paid. @@ -256,9 +257,9 @@ def smart_paid_service( Args: price: Payment amount (e.g., "$1.00", 1.00, TokenAmount) - pay_to_address: Ethereum address to receive payment + pay_to_address: Address to receive payment (format depends on network) resource: Resource identifier (auto-generated from function name if None) - network: Blockchain network (default: "base") + network: Blockchain network in CAIP-2 format (default: "eip155:8453" for Base) description: Human-readable description Example: diff --git a/python/x402_a2a/core/merchant.py b/python/x402_a2a/core/merchant.py index a41af5f..8eae022 100644 --- a/python/x402_a2a/core/merchant.py +++ b/python/x402_a2a/core/merchant.py @@ -23,7 +23,7 @@ def create_payment_requirements( price: Price, pay_to_address: str, resource: str, - network: str = "base", + network: str = "eip155:8453", description: str = "", mime_type: str = "application/json", scheme: str = "exact", @@ -37,10 +37,13 @@ def create_payment_requirements( price: Payment price. Can be: - Money: USD amount as string/int (e.g., "$3.10", 0.10, "0.001") - defaults to USDC - TokenAmount: Custom token amount with asset information - pay_to_address: Ethereum address to receive the payment + pay_to_address: Address to receive the payment (format depends on network) resource: Resource identifier (e.g., "/generate-image") - network: Blockchain network (default: "base") - description: Human-readable description + network: Blockchain network in CAIP-2 format (default: "eip155:8453" for Base) + Examples: + - EVM chains: "eip155:1" (Ethereum), "eip155:8453" (Base), "eip155:137" (Polygon) + - Bitcoin: "bip122:000000000019d6689c085ae165831e93" (mainnet) + - Solana: "solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp" (mainnet) description: Human-readable description mime_type: Expected response content type scheme: Payment scheme (default: "exact") max_timeout_seconds: Payment validity timeout diff --git a/python/x402_a2a/executors/client.py b/python/x402_a2a/executors/client.py index 5283dde..73bd3a6 100644 --- a/python/x402_a2a/executors/client.py +++ b/python/x402_a2a/executors/client.py @@ -102,7 +102,7 @@ async def _auto_pay(self, task, event_queue: EventQueue): from ..types import SettleResponse, x402ErrorCode failure_response = SettleResponse( - success=False, network="base", error_reason=f"Payment failed: {e}" + success=False, network="eip155:8453", error_reason=f"Payment failed: {e}" ) task = self.utils.record_payment_failure( task, x402ErrorCode.INVALID_SIGNATURE, failure_response diff --git a/python/x402_a2a/executors/server.py b/python/x402_a2a/executors/server.py index 7197f32..124fa11 100644 --- a/python/x402_a2a/executors/server.py +++ b/python/x402_a2a/executors/server.py @@ -362,7 +362,7 @@ async def _fail_payment( ): """Handle payment failure.""" failure_response = SettleResponse( - success=False, network="base", error_reason=error_reason + success=False, network="eip155:8453", error_reason=error_reason ) task = self.utils.record_payment_failure(task, error_code, failure_response) diff --git a/python/x402_a2a/types/config.py b/python/x402_a2a/types/config.py index 2282d00..5491e33 100644 --- a/python/x402_a2a/types/config.py +++ b/python/x402_a2a/types/config.py @@ -37,7 +37,7 @@ class x402ServerConfig(BaseModel): price: Union[str, int, TokenAmount] pay_to_address: str - network: str = "base" + network: str = "eip155:8453" # Base network in CAIP-2 format description: str = "Payment required..." mime_type: str = "application/json" max_timeout_seconds: int = 600 diff --git a/python/x402_a2a/types/errors.py b/python/x402_a2a/types/errors.py index d079762..0b08187 100644 --- a/python/x402_a2a/types/errors.py +++ b/python/x402_a2a/types/errors.py @@ -112,7 +112,7 @@ def for_service( price: Union[str, int, TokenAmount], pay_to_address: str, resource: str, - network: str = "base", + network: str = "eip155:8453", description: str = "Payment required for this service", message: Optional[str] = None, ) -> "x402PaymentRequiredException": @@ -122,9 +122,9 @@ def for_service( Args: price: Payment amount (e.g., "$1.00", 1.00, TokenAmount) - pay_to_address: Ethereum address to receive payment + pay_to_address: Address to receive payment (format depends on network) resource: Resource identifier (e.g., "/api/generate") - network: Blockchain network (default: "base") + network: Blockchain network in CAIP-2 format (default: "eip155:8453" for Base) description: Human-readable description message: Exception message (default: uses description) diff --git a/spec/v0.1/spec.md b/spec/v0.1/spec.md index 4502107..c54fa33 100644 --- a/spec/v0.1/spec.md +++ b/spec/v0.1/spec.md @@ -118,7 +118,7 @@ When a Client Agent requests a service, the Merchant Agent determines that payme "x402Version": 1, "accepts": [{ "scheme": "exact", - "network": "base", + "network": "eip155:8453", "resource": "https://api.example.com/generate-image", "description": "Generate an image", "mimeType": "application/json", @@ -202,7 +202,7 @@ The Agent **MUST** include ALL payment receipts created in the lifetime of a Tas "x402.payment.receipts": [{ "success": true, "transaction": "0xabc123...", - "network": "base", + "network": "eip155:8453", "payer": "0xpayerAddress" }] } @@ -338,7 +338,7 @@ The management of Task states at payment failure is at the discretion of the Mer "x402.payment.receipts": [{ "success": false, "errorReason": "Payment authorization was submitted after its 'validBefore' timestamp.", - "network": "base", + "network": "eip155:8453", "transaction": "" }] }