Skip to content

Added x402 action provider #753

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
Open

Added x402 action provider #753

wants to merge 1 commit into from

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

🟡 Heimdall Review Status

Requirement Status More Info
Reviews 🟡 0/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
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.

2 participants