Skip to content

Conversation

@phdargen
Copy link
Contributor

Description

Implements interaction with x402

  • Adds x402ActionProvider
  • Adds fetch_payment_info action to check payment info
  • Adds paid_request action to access x402 protected route

Tests

Prompt: fetch  https://www.x402.org/protected payment info

-------------------
{
  "paymentRequired": true,
  "url": "https://www.x402.org/protected",
  "status": 402,
  "data": {
    "x402Version": 1,
    "error": "X-PAYMENT header is required",
    "accepts": [
      {
        "scheme": "exact",
        "network": "base-sepolia",
        "maxAmountRequired": "10000",
        "resource": "https://www.x402.org/protected",
        "description": "Access to protected content",
        "mimeType": "application/json",
        "payTo": "0x209693Bc6afc0C5328bA36FaF03C514EF312287C",
        "maxTimeoutSeconds": 300,
        "asset": "0x036CbD53842c5426634e7929541eC2318f3dCF7e",
        "extra": {
          "name": "USDC",
          "version": "2"
        }
      }
    ]
  }
}
-------------------
To access the protected content at [https://www.x402.org/protected](https://www.x402.org/protected), a payment is required. Here are the details:

- **Payment Required**: Yes
- **Status Code**: 402
- **Payment Description**: Access to protected content
- **Asset**: USDC (0x036CbD53842c5426634e7929541eC2318f3dCF7e)
- **Pay To**: 0x209693Bc6afc0C5328bA36FaF03C514EF312287C
- **Max Amount Required**: 10000 (which corresponds to 0.01 USDC)
- **Timeout**: 300 seconds
- **MIME Type**: application/json

If you want to proceed with the payment, please let me know!
-------------------

Prompt: access it

-------------------
{
  "success": true,
  "url": "https://www.x402.org/protected",
  "method": "GET",
  "status": 200,
  "data": "<!DOCTYPE html><html lang=\"en\"><head><meta charSet=\"utf-8\"/><meta name=\"viewport\" content=\"width=device-width, initial-scale=1\"/><link rel=\"preload\" href=\"/_next/static/media/569ce4b8f30dc480-s.p.woff2\" as=\"font\" crossorigin=\"\" type=\"font/woff2\"/><link rel=\"preload\" href=\"/_next/static/media/93f479601ee12b01-s.p.woff2\" as=\"font\" crossorigin=\"\" type=\"font/woff2\"/><link rel=\"stylesheet\" href=\"/_next/static/css/ff6ba5ad5624b2c7.css?dpl=dpl_BkiKXuefPRuSYTQMydXCB8yvBzn4\" data-precedence=\"next\"/><link rel=\"preload\" as=\"script\" fetchPriority=\"low\" href=\"/_next/static/chunks/webpack-023d5a2887e82199.js?dpl=dpl_BkiKXuefPRuSYTQMydXCB8yvBzn4\"/><script src=\"/_next/static/chunks/55f4bfdc-5e6b00c211ea7f60.js?dpl=dpl_BkiKXuefPRuSYTQMydXCB8yvBzn4\" async=\"\"></script><script src=\"/_next/static/chunks/677-4a0fca260a6b777c.js?dpl=dpl_BkiKXuefPRuSYTQMydXCB8yvBzn4\" async=\"\"></script><script src=\"/_next/static/chunks/main-app-88fcd48998bae2f3.js?dpl=dpl_BkiKXuefPRuSYTQMydXCB8yvBzn4\" async=\"\"></script><meta name=\"next-size-adjust\" content=\"\"/><link rel=\"icon\" href=\"/favicon.ico\" sizes=\"any\"/><link rel=\"icon\" type=\"image/png\" href=\"/favicon-96x96.png\" sizes=\"96x96\"/><link rel=\"icon\" type=\"image/svg+xml\" href=\"/favicon.svg\"/><link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"/apple-touch-icon.png\"/><meta name=\"apple-mobile-web-app-title\" content=\"x402\"/><link rel=\"manifest\" href=\"/site.webmanifest\"/><title>x402.org</title><meta name=\"description\" content=\"A chain-agnostic protocol for web payments\"/><link rel=\"icon\" href=\"/favicon.ico\" type=\"image/x-icon\" sizes=\"48x48\"/><script>document.querySelectorAll('body link[rel=\"icon\"], body link[rel=\"apple-touch-icon\"]').forEach(el => document.head.appendChild(el))</script><script src=\"/_next/static/chunks/polyfills-42372ed130431b0a.js?dpl=dpl_BkiKXuefPRuSYTQMydXCB8yvBzn4\" noModule=\"\"></script></head><body class=\"__variable_5cfdac __variable_9a8899 antialiased\"><div class=\"min-h-screen flex items-center justify-center\"><div class=\"max-w-2xl mx-auto p-8\"><h1 class=\"text-4xl font-bold mb-4\">Protected Content</h1><p class=\"text-lg\">Your payment was successful! Enjoy this banger song.</p><iframe width=\"100%\" height=\"300\" scrolling=\"no\" frameBorder=\"no\" allow=\"autoplay\" src=\"https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/2044190296&amp;color=%23ff5500&amp;auto_play=true&amp;hide_related=false&amp;show_comments=true&amp;show_user=true&amp;show_reposts=false&amp;show_teaser=true&amp;visual=true\"></iframe><div style=\"font-size:10px;color:#cccccc;line-break:anywhere;word-break:normal;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;font-family:Interstate,Lucida Grande,Lucida Sans Unicode,Lucida Sans,Garuda,Verdana,Tahoma,sans-serif;font-weight:100\"><a href=\"https://soundcloud.com/dan-kim-675678711\" title=\"danXkim\" target=\"_blank\" style=\"color:#cccccc;text-decoration:none\">danXkim</a> · <a href=\"https://soundcloud.com/dan-kim-675678711/x402\" title=\"x402 (DJ Reppel Remix)\" target=\"_blank\" style=\"color:#cccccc;text-decoration:none\">x402 (DJ Reppel Remix)</a></div></div></div><!--$--><!--/$--><!--$--><!--/$--><script src=\"/_next/static/chunks/webpack-023d5a2887e82199.js?dpl=dpl_BkiKXuefPRuSYTQMydXCB8yvBzn4\" async=\"\"></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,\"1:\\\"$Sreact.fragment\\\"\\n2:I[9550,[],\\\"\\\"]\\n3:I[3860,[],\\\"\\\"]\\n4:I[2118,[],\\\"MetadataBoundary\\\"]\\n6:I[2118,[],\\\"OutletBoundary\\\"]\\n9:I[6070,[],\\\"AsyncMetadataOutlet\\\"]\\nb:I[2118,[],\\\"ViewportBoundary\\\"]\\nd:I[3673,[],\\\"\\\"]\\n:HL[\\\"/_next/static/media/569ce4b8f30dc480-s.p.woff2\\\",\\\"font\\\",{\\\"crossOrigin\\\":\\\"\\\",\\\"type\\\":\\\"font/woff2\\\"}]\\n:HL[\\\"/_next/static/media/93f479601ee12b01-s.p.woff2\\\",\\\"font\\\",{\\\"crossOrigin\\\":\\\"\\\",\\\"type\\\":\\\"font/woff2\\\"}]\\n:HL[\\\"/_next/static/css/ff6ba5ad5624b2c7.css?dpl=dpl_BkiKXuefPRuSYTQMydXCB8yvBzn4\\\",\\\"style\\\"]\\n\"])</script><script>self.__next_f.push([1,\"0:{\\\"P\\\":null,\\\"b\\\":\\\"VYSeejnGwThasTBkO0bWG\\\",\\\"p\\\":\\\"\\\",\\\"c\\\":[\\\"\\\",\\\"protected\\\"],\\\"i\\\":false,\\\"f\\\":[[[\\\"\\\",{\\\"children\\\":[\\\"protected\\\",{\\\"children\\\":[\\\"__PAGE__\\\",{}]}]},\\\"$undefined\\\",\\\"$undefined\\\",true],[\\\"\\\",[\\\"$\\\",\\\"$1\\\",\\\"c\\\",{\\\"children\\\":[[[\\\"$\\\",\\\"link\\\",\\\"0\\\",{\\\"rel\\\":\\\"stylesheet\\\",\\\"href\\\":\\\"/_next/static/css/ff6ba5ad5624b2c7.css?dpl=dpl_BkiKXuefPRuSYTQMydXCB8yvBzn4\\\",\\\"precedence\\\":\\\"next\\\",\\\"crossOrigin\\\":\\\"$undefined\\\",\\\"nonce\\\":\\\"$undefined\\\"}]],[\\\"$\\\",\\\"html\\\",null,{\\\"lang\\\":\\\"en\\\",\\\"children\\\":[[\\\"$\\\",\\\"head\\\",null,{\\\"children\\\":[[\\\"$\\\",\\\"link\\\",null,{\\\"rel\\\":\\\"icon\\\",\\\"href\\\":\\\"/favicon.ico\\\",\\\"sizes\\\":\\\"any\\\"}],[\\\"$\\\",\\\"link\\\",null,{\\\"rel\\\":\\\"icon\\\",\\\"type\\\":\\\"image/png\\\",\\\"href\\\":\\\"/favicon-96x96.png\\\",\\\"sizes\\\":\\\"96x96\\\"}],[\\\"$\\\",\\\"link\\\",null,{\\\"rel\\\":\\\"icon\\\",\\\"type\\\":\\\"image/svg+xml\\\",\\\"href\\\":\\\"/favicon.svg\\\"}],[\\\"$\\\",\\\"link\\\",null,{\\\"rel\\\":\\\"apple-touch-icon\\\",\\\"sizes\\\":\\\"180x180\\\",\\\"href\\\":\\\"/apple-touch-icon.png\\\"}],[\\\"$\\\",\\\"meta\\\",null,{\\\"name\\\":\\\"apple-mobile-web-app-title\\\",\\\"content\\\":\\\"x402\\\"}],[\\\"$\\\",\\\"link\\\",null,{\\\"rel\\\":\\\"manifest\\\",\\\"href\\\":\\\"/site.webmanifest\\\"}]]}],[\\\"$\\\",\\\"body\\\",null,{\\\"className\\\":\\\"__variable_5cfdac __variable_9a8899 antialiased\\\",\\\"children\\\":[\\\"$\\\",\\\"$L2\\\",null,{\\\"parallelRouterKey\\\":\\\"children\\\",\\\"error\\\":\\\"$undefined\\\",\\\"errorStyles\\\":\\\"$undefined\\\",\\\"errorScripts\\\":\\\"$undefined\\\",\\\"template\\\":[\\\"$\\\",\\\"$L3\\\",null,{}],\\\"templateStyles\\\":\\\"$undefined\\\",\\\"templateScripts\\\":\\\"$undefined\\\",\\\"notFound\\\":[[[\\\"$\\\",\\\"title\\\",null,{\\\"children\\\":\\\"404: This page could not be found.\\\"}],[\\\"$\\\",\\\"div\\\",null,{\\\"style\\\":{\\\"fontFamily\\\":\\\"system-ui,\\\\\\\"Segoe UI\\\\\\\",Roboto,Helvetica,Arial,sans-serif,\\\\\\\"Apple Color Emoji\\\\\\\",\\\\\\\"Segoe UI Emoji\\\\\\\"\\\",\\\"height\\\":\\\"100vh\\\",\\\"textAlign\\\":\\\"center\\\",\\\"display\\\":\\\"flex\\\",\\\"flexDirection\\\":\\\"column\\\",\\\"alignItems\\\":\\\"center\\\",\\\"justifyContent\\\":\\\"center\\\"},\\\"children\\\":[\\\"$\\\",\\\"div\\\",null,{\\\"children\\\":[[\\\"$\\\",\\\"style\\\",null,{\\\"dangerouslySetInnerHTML\\\":{\\\"__html\\\":\\\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\\\"}}],[\\\"$\\\",\\\"h1\\\",null,{\\\"className\\\":\\\"next-error-h1\\\",\\\"style\\\":{\\\"display\\\":\\\"inline-block\\\",\\\"margin\\\":\\\"0 20px 0 0\\\",\\\"padding\\\":\\\"0 23px 0 0\\\",\\\"fontSize\\\":24,\\\"fontWeight\\\":500,\\\"verticalAlign\\\":\\\"top\\\",\\\"lineHeight\\\":\\\"49px\\\"},\\\"children\\\":404}],[\\\"$\\\",\\\"div\\\",null,{\\\"style\\\":{\\\"display\\\":\\\"inline-block\\\"},\\\"children\\\":[\\\"$\\\",\\\"h2\\\",null,{\\\"style\\\":{\\\"fontSize\\\":14,\\\"fontWeight\\\":400,\\\"lineHeight\\\":\\\"49px\\\",\\\"margin\\\":0},\\\"children\\\":\\\"This page could not be found.\\\"}]}]]}]}]],[]],\\\"forbidden\\\":\\\"$undefined\\\",\\\"unauthorized\\\":\\\"$undefined\\\"}]}]]}]]}],{\\\"children\\\":[\\\"protected\\\",[\\\"$\\\",\\\"$1\\\",\\\"c\\\",{\\\"children\\\":[null,[\\\"$\\\",\\\"$L2\\\",null,{\\\"parallelRouterKey\\\":\\\"children\\\",\\\"error\\\":\\\"$undefined\\\",\\\"errorStyles\\\":\\\"$undefined\\\",\\\"errorScripts\\\":\\\"$undefined\\\",\\\"template\\\":[\\\"$\\\",\\\"$L3\\\",null,{}],\\\"templateStyles\\\":\\\"$undefined\\\",\\\"templateScripts\\\":\\\"$undefined\\\",\\\"notFound\\\":\\\"$undefined\\\",\\\"forbidden\\\":\\\"$undefined\\\",\\\"unauthorized\\\":\\\"$undefined\\\"}]]}],{\\\"children\\\":[\\\"__PAGE__\\\",[\\\"$\\\",\\\"$1\\\",\\\"c\\\",{\\\"children\\\":[[\\\"$\\\",\\\"div\\\",null,{\\\"className\\\":\\\"min-h-screen flex items-center justify-center\\\",\\\"children\\\":[\\\"$\\\",\\\"div\\\",null,{\\\"className\\\":\\\"max-w-2xl mx-auto p-8\\\",\\\"children\\\":[[\\\"$\\\",\\\"h1\\\",null,{\\\"className\\\":\\\"text-4xl font-bold mb-4\\\",\\\"children\\\":\\\"Protected Content\\\"}],[\\\"$\\\",\\\"p\\\",null,{\\\"className\\\":\\\"text-lg\\\",\\\"children\\\":\\\"Your payment was successful! Enjoy this banger song.\\\"}],[\\\"$\\\",\\\"iframe\\\",null,{\\\"width\\\":\\\"100%\\\",\\\"height\\\":\\\"300\\\",\\\"scrolling\\\":\\\"no\\\",\\\"frameBorder\\\":\\\"no\\\",\\\"allow\\\":\\\"autoplay\\\",\\\"src\\\":\\\"https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/2044190296\\u0026color=%23ff5500\\u0026auto_play=true\\u0026hide_related=false\\u0026show_comments=true\\u0026show_user=true\\u0026show_reposts=false\\u0026show_teaser=true\\u0026visual=true\\\"}],[\\\"$\\\",\\\"div\\\",null,{\\\"style\\\":{\\\"fontSize\\\":\\\"10px\\\",\\\"color\\\":\\\"#cccccc\\\",\\\"lineBreak\\\":\\\"anywhere\\\",\\\"wordBreak\\\":\\\"normal\\\",\\\"overflow\\\":\\\"hidden\\\",\\\"whiteSpace\\\":\\\"nowrap\\\",\\\"textOverflow\\\":\\\"ellipsis\\\",\\\"fontFamily\\\":\\\"Interstate,Lucida Grande,Lucida Sans Unicode,Lucida Sans,Garuda,Verdana,Tahoma,sans-serif\\\",\\\"fontWeight\\\":\\\"100\\\"},\\\"children\\\":[[\\\"$\\\",\\\"a\\\",null,{\\\"href\\\":\\\"https://soundcloud.com/dan-kim-675678711\\\",\\\"title\\\":\\\"danXkim\\\",\\\"target\\\":\\\"_blank\\\",\\\"style\\\":{\\\"color\\\":\\\"#cccccc\\\",\\\"textDecoration\\\":\\\"none\\\"},\\\"children\\\":\\\"danXkim\\\"}],\\\" · \\\",[\\\"$\\\",\\\"a\\\",null,{\\\"href\\\":\\\"https://soundcloud.com/dan-kim-675678711/x402\\\",\\\"title\\\":\\\"x402 (DJ Reppel Remix)\\\",\\\"target\\\":\\\"_blank\\\",\\\"style\\\":{\\\"color\\\":\\\"#cccccc\\\",\\\"textDecoration\\\":\\\"none\\\"},\\\"children\\\":\\\"x402 (DJ Reppel Remix)\\\"}]]}]]}]}],[\\\"$\\\",\\\"$L4\\\",null,{\\\"children\\\":\\\"$L5\\\"}],null,[\\\"$\\\",\\\"$L6\\\",null,{\\\"children\\\":[\\\"$L7\\\",\\\"$L8\\\",[\\\"$\\\",\\\"$L9\\\",null,{\\\"promise\\\":\\\"$@a\\\"}]]}]]}],{},null,false]},null,false]},null,false],[\\\"$\\\",\\\"$1\\\",\\\"h\\\",{\\\"children\\\":[null,[\\\"$\\\",\\\"$1\\\",\\\"JWFh8uKucauHDnUP2-TE-\\\",{\\\"children\\\":[[\\\"$\\\",\\\"$Lb\\\",null,{\\\"children\\\":\\\"$Lc\\\"}],[\\\"$\\\",\\\"meta\\\",null,{\\\"name\\\":\\\"next-size-adjust\\\",\\\"content\\\":\\\"\\\"}]]}],null]}],false]],\\\"m\\\":\\\"$undefined\\\",\\\"G\\\":[\\\"$d\\\",\\\"$undefined\\\"],\\\"s\\\":false,\\\"S\\\":true}\\n\"])</script><script>self.__next_f.push([1,\"e:\\\"$Sreact.suspense\\\"\\nf:I[6070,[],\\\"AsyncMetadata\\\"]\\n5:[\\\"$\\\",\\\"$e\\\",null,{\\\"fallback\\\":null,\\\"children\\\":[\\\"$\\\",\\\"$Lf\\\",null,{\\\"promise\\\":\\\"$@10\\\"}]}]\\n\"])</script><script>self.__next_f.push([1,\"8:null\\n\"])</script><script>self.__next_f.push([1,\"c:[[\\\"$\\\",\\\"meta\\\",\\\"0\\\",{\\\"charSet\\\":\\\"utf-8\\\"}],[\\\"$\\\",\\\"meta\\\",\\\"1\\\",{\\\"name\\\":\\\"viewport\\\",\\\"content\\\":\\\"width=device-width, initial-scale=1\\\"}]]\\n7:null\\n\"])</script><script>self.__next_f.push([1,\"10:{\\\"metadata\\\":[[\\\"$\\\",\\\"title\\\",\\\"0\\\",{\\\"children\\\":\\\"x402.org\\\"}],[\\\"$\\\",\\\"meta\\\",\\\"1\\\",{\\\"name\\\":\\\"description\\\",\\\"content\\\":\\\"A chain-agnostic protocol for web payments\\\"}],[\\\"$\\\",\\\"link\\\",\\\"2\\\",{\\\"rel\\\":\\\"icon\\\",\\\"href\\\":\\\"/favicon.ico\\\",\\\"type\\\":\\\"image/x-icon\\\",\\\"sizes\\\":\\\"48x48\\\"}]],\\\"error\\\":null,\\\"digest\\\":\\\"$undefined\\\"}\\na:{\\\"metadata\\\":\\\"$10:metadata\\\",\\\"error\\\":null,\\\"digest\\\":\\\"$undefined\\\"}\\n\"])</script></body></html>",
  "paymentResponse": {
    "success": true,
    "transaction": "0xcbc385789d3744b52af5106c32809534f64adcbe097e050ec03d6b53fed5d305",
    "network": "base-sepolia",
    "payer": "0xa8c1a5D3C372C65c04f91f87a43F549619A9483f"
  }
}

Checklist

A couple of things to include in your PR for completeness:

  • Added documentation to all relevant README.md files
  • Added a changelog entry

@phdargen phdargen requested a review from murrlincoln as a code owner June 10, 2025 21:20
@cb-heimdall
Copy link

cb-heimdall commented Jun 10, 2025

✅ Heimdall Review Status

Requirement Status More Info
Reviews 1/1
Denominator calculation
Show calculation
1 if user is bot 0
1 if user is external 0
2 if repo is sensitive 0
From .codeflow.yml 1
Additional review requirements
Show calculation
Max 0
0
From CODEOWNERS 0
Global minimum 0
Max 1
1
1 if commit is unverified 0
Sum 1

@github-actions github-actions bot added documentation Improvements or additions to documentation action provider New action provider typescript labels Jun 10, 2025
Copy link
Contributor

@CarsonRoscoe CarsonRoscoe left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM! Appreciate the integration

@CarsonRoscoe CarsonRoscoe merged commit ff04ce9 into coinbase:main Jun 13, 2025
24 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

action provider New action provider documentation Improvements or additions to documentation typescript

Development

Successfully merging this pull request may close these issues.

3 participants