{"id":15290551,"url":"https://github.com/opengsn/gsn","last_synced_at":"2026-02-14T10:02:17.640Z","repository":{"id":37010868,"uuid":"161199275","full_name":"opengsn/gsn","owner":"opengsn","description":"GSN v3.0.0-beta.10 - Ethereum Gas Station Network","archived":false,"fork":false,"pushed_at":"2024-10-04T23:35:50.000Z","size":11832,"stargazers_count":598,"open_issues_count":25,"forks_count":214,"subscribers_count":15,"default_branch":"master","last_synced_at":"2025-10-26T07:53:50.223Z","etag":null,"topics":["dapp","defi","ethereum","solidity","web3"],"latest_commit_sha":null,"homepage":"https://opengsn.org/","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/opengsn.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":"audits/Least-Authority-Ethereum-Foundation-GSN-Final-Audit-Report-v2.pdf","citation":null,"codeowners":".github/CODEOWNERS","security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2018-12-10T15:55:37.000Z","updated_at":"2025-10-22T16:28:14.000Z","dependencies_parsed_at":"2024-12-05T11:17:39.327Z","dependency_job_id":null,"html_url":"https://github.com/opengsn/gsn","commit_stats":{"total_commits":874,"total_committers":34,"mean_commits":"25.705882352941178","dds":0.6613272311212814,"last_synced_commit":"da4222b76e3ae1968608dc5c5d80074dcac7c4be"},"previous_names":["tabookey/tabookey-gasless","openeth-dev/gsn","tabookey-dev/tabookey-gasless"],"tags_count":61,"template":false,"template_full_name":null,"purl":"pkg:github/opengsn/gsn","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/opengsn%2Fgsn","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/opengsn%2Fgsn/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/opengsn%2Fgsn/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/opengsn%2Fgsn/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/opengsn","download_url":"https://codeload.github.com/opengsn/gsn/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/opengsn%2Fgsn/sbom","scorecard":{"id":709349,"data":{"date":"2025-08-11","repo":{"name":"github.com/opengsn/gsn","commit":"da4222b76e3ae1968608dc5c5d80074dcac7c4be"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":1.3,"checks":[{"name":"Code-Review","score":1,"reason":"Found 4/29 approved changesets -- score normalized to 1","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Token-Permissions","score":-1,"reason":"No tokens found","details":null,"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Dangerous-Workflow","score":-1,"reason":"no workflows found","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"License","score":0,"reason":"license file not detected","details":["Warn: project does not have a license file"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'master'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: containerImage not pinned by hash: dockers/jsrelay/Dockerfile:1: pin your Docker image by updating node:13-buster-slim to node:13-buster-slim@sha256:0238695c42f60824c1abc6ca3553d4aee5a6dd9547f34ced31c7b93819b7849b","Info:   0 out of   1 containerImage dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 25 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Vulnerabilities","score":0,"reason":"67 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GHSA-968p-4wvh-cqc8","Warn: Project is vulnerable to: GHSA-67hx-6x53-jw92","Warn: Project is vulnerable to: GHSA-h5c3-5r3r-rr8q","Warn: Project is vulnerable to: GHSA-rmvr-2pp2-xj38","Warn: Project is vulnerable to: GHSA-xx4v-prfh-6cgc","Warn: Project is vulnerable to: GHSA-fg47-3c2x-m2wr","Warn: Project is vulnerable to: GHSA-88g8-f5mf-f5rj","Warn: Project is vulnerable to: GHSA-9c22-pwxw-p6hx","Warn: Project is vulnerable to: GHSA-7grf-83vw-6f5x","Warn: Project is vulnerable to: GHSA-mx2q-35m2-x2rh","Warn: Project is vulnerable to: GHSA-9vx6-7xxf-x967","Warn: Project is vulnerable to: GHSA-wf5p-g6vw-rhxx","Warn: Project is vulnerable to: GHSA-jr5f-v2jv-69x6","Warn: Project is vulnerable to: GHSA-8hc4-vh64-cxmj","Warn: Project is vulnerable to: GHSA-xq7p-g2vc-g82p","Warn: Project is vulnerable to: GHSA-qwcr-r2fm-qrc7","Warn: Project is vulnerable to: GHSA-v6h2-p8h4-qcjw","Warn: Project is vulnerable to: GHSA-grv7-fg5c-xmjg","Warn: Project is vulnerable to: GHSA-pxg6-pf52-xh8x","Warn: Project is vulnerable to: GHSA-3xgq-45jj-v275","Warn: Project is vulnerable to: GHSA-ghr5-ch3p-vcr6","Warn: Project is vulnerable to: GHSA-434g-2637-qmqr","Warn: Project is vulnerable to: GHSA-49q7-c7j4-3p7m","Warn: Project is vulnerable to: GHSA-977x-g7h5-7qgw","Warn: Project is vulnerable to: GHSA-f7q4-pwc6-w24p","Warn: Project is vulnerable to: GHSA-fc9h-whq2-v747","Warn: Project is vulnerable to: GHSA-vjh7-7g9h-fjfh","Warn: Project is vulnerable to: GHSA-4gmj-3p3h-gm8h","Warn: Project is vulnerable to: GHSA-rv95-896h-c2vc","Warn: Project is vulnerable to: GHSA-qw6h-vgh9-j6wx","Warn: Project is vulnerable to: GHSA-jchw-25xp-jwwc","Warn: Project is vulnerable to: GHSA-cxjh-pqwp-8mfp","Warn: Project is vulnerable to: GHSA-fjxv-7rqg-78g4","Warn: Project is vulnerable to: GHSA-4q6p-r6v2-jvc5","Warn: Project is vulnerable to: GHSA-78xj-cgh5-2h22","Warn: Project is vulnerable to: GHSA-2p57-rm9w-gvfp","Warn: Project is vulnerable to: GHSA-952p-6rrq-rcjv","Warn: Project is vulnerable to: GHSA-f8q6-p94x-37v3","Warn: Project is vulnerable to: GHSA-vh95-rmgr-6w4m","Warn: Project is vulnerable to: GHSA-xvch-5gv4-984h","Warn: Project is vulnerable to: GHSA-mwcw-c2x4-8c55","Warn: Project is vulnerable to: GHSA-76c9-3jph-rj3q","Warn: Project is vulnerable to: GHSA-9wv6-86v2-598j","Warn: Project is vulnerable to: GHSA-rhx6-c78j-4q9w","Warn: Project is vulnerable to: GHSA-h7cp-r72f-jxh6","Warn: Project is vulnerable to: GHSA-v62p-rq8g-8h59","Warn: Project is vulnerable to: GHSA-7fh5-64p2-3v2j","Warn: Project is vulnerable to: GHSA-p8p7-x288-28g6","Warn: Project is vulnerable to: GHSA-584q-6j8j-r5pm","Warn: Project is vulnerable to: GHSA-c2qf-rxjj-qqgw","Warn: Project is vulnerable to: GHSA-m6fv-jmcg-4jfg","Warn: Project is vulnerable to: GHSA-76p7-773f-r4q5","Warn: Project is vulnerable to: GHSA-cm22-4g7w-348p","Warn: Project is vulnerable to: GHSA-f5x3-32g6-xq36","Warn: Project is vulnerable to: GHSA-52f5-9888-hmc6","Warn: Project is vulnerable to: GHSA-72xf-g2v4-qvf3","Warn: Project is vulnerable to: GHSA-wqq4-5wpv-mx2g","Warn: Project is vulnerable to: GHSA-3787-6prv-h9w3","Warn: Project is vulnerable to: GHSA-9qxr-qj54-h672","Warn: Project is vulnerable to: GHSA-m4v8-wqvr-p9f7","Warn: Project is vulnerable to: GHSA-c76h-2ccp-4975","Warn: Project is vulnerable to: GHSA-cxrh-j4jr-qwg3","Warn: Project is vulnerable to: GHSA-2g4c-8fpm-c46v","Warn: Project is vulnerable to: GHSA-4vvj-4cpr-p986","Warn: Project is vulnerable to: GHSA-3h5v-q93c-6h6q","Warn: Project is vulnerable to: GHSA-p9pc-299p-vxgp","Warn: Project is vulnerable to: GHSA-m95q-7qp3-xv42"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-22T07:40:58.539Z","repository_id":37010868,"created_at":"2025-08-22T07:40:58.539Z","updated_at":"2025-08-22T07:40:58.539Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29442326,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-14T07:24:13.446Z","status":"ssl_error","status_checked_at":"2026-02-14T07:23:58.969Z","response_time":53,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["dapp","defi","ethereum","solidity","web3"],"created_at":"2024-09-30T16:08:35.934Z","updated_at":"2026-02-14T10:02:17.613Z","avatar_url":"https://github.com/opengsn.png","language":"TypeScript","funding_links":[],"categories":["TypeScript"],"sub_categories":[],"readme":"\u003cimg src=\"./logo.svg\"\u003e\n\n\u003cdiv\u003e\n  \u003cimg src=\"https://raw.githubusercontent.com/devicons/devicon/master/icons/typescript/typescript-original.svg\" width=\"40\" height=\"40\"/\u003e\u0026nbsp;\n  \u003cimg src=\"https://raw.githubusercontent.com/devicons/devicon/master/icons/solidity/solidity-original.svg\" width=\"40\" height=\"40\"/\u003e\u0026nbsp;\n  \u003cimg src=\"https://raw.githubusercontent.com/devicons/devicon/master/icons/docker/docker-original-wordmark.svg\" width=\"40\" height=\"40\"/\u003e\u0026nbsp;\n  \u003cimg src=\"https://raw.githubusercontent.com/devicons/devicon/master/icons/nodejs/nodejs-plain-wordmark.svg\" width=\"40\" height=\"40\"/\u003e\u0026nbsp;\n  \u003cimg src=\"https://raw.githubusercontent.com/devicons/devicon/master/icons/webpack/webpack-original-wordmark.svg\" width=\"40\" height=\"40\"/\u003e\u0026nbsp;\n\u003c/div\u003e\n\n[![](https://circleci.com/gh/opengsn/gsn.svg?style=shield)](https://app.circleci.com/pipelines/github/opengsn/gsn?branch=master)\n![GitHub package.json version (subfolder of monorepo)](https://img.shields.io/github/package-json/v/opengsn/gsn?filename=packages%2Fprovider%2Fpackage.json)\n\n[![](https://img.shields.io/bundlephobia/min/@opengsn/provider)](https://bundlephobia.com/package/@opengsn/provider)\n[![](https://img.shields.io/bundlephobia/minzip/@opengsn/provider)](https://bundlephobia.com/package/@opengsn/provider)\n# The Ethereum Gas Stations Network\n\n[![Join our Discord server!](https://invidget.switchblade.xyz/b5Jk9kWcPG)](http://discord.gg/b5Jk9kWcPG)\n\n## What is GSN?\n[GSN](https://opengsn.org/) is a distributed network of transaction relayers that allows decentralized\napplications (daps) to abstract away the process of paying the transaction gas fees to minimize friction during\nnew user onboarding and to improve the user experience. With GSN, gasless clients can interact with Ethereum contracts\nwithout users needing to own or spend ETH for transaction fees.\n\n\u003cdiv id=\"header\" align=\"center\"\u003e\n  \u003cimg src=\"https://media.giphy.com/media/SreAp5WMZHfhK/giphy.gif\" width=\"450\"/\u003e\n\u003c/div\u003e\n\n## Architecture Overview\nThe GSN has a reasonably simple architecture. You should have a basic understanding of what components the GSN project\nconsists of before you can integrate it into your Dapp.\n\nThe GSN consists of three major components working together: Relay Server, Relay Provider, and GSN Smart Contracts.\nThe Dapp that wants to integrate the GSN has two smart contracts to support the alternative gas payment logic:\nPaymaster and Relay Recipient.\n\n#### Relay Server\nThe Relay Server is a Node.js server that accepts Relay Requests and broadcasts them as transactions to the blockchain.\nIt controls a Relay Worker account key and pays for transaction gas out-of-pocket. It is the GSN Smart Contract's job\nto make sure the Relay Server is getting its money back at the end of the transaction.\n\n#### Relay Provider\nThe Relay Provider is a Node Module written in TypeScript that can wrap your Ethereum provider (Web3.js, Ethers.js,\nMetaMask, WalletConnect, etc.) and route all outgoing transactions through the GSN.\n\n#### GSN Smart Contracts\nAll contracts that form the core of the GSN are supposed to be singletons on each network.\nNote: Deploying your own GSN contracts is possible, but that creates a separate GSN network.\n\n##### RelayHub\nThe RelayHub is the main contract in the GSN. It connects users running clients, relay servers, and paymasters so that\nparticipants don't need to know or trust each other.\n\n##### Forwarder\nThe Forwarder contract verifies the sender's signature and nonce.\nThe Recipient contracts only rely on a small trusted forwarder contract for their security.\n\n#### Paymaster and Recipient\nAs sending a transaction on the Ethereum network costs the Relay Server some real money, it has to be compensated.\nIn the most basic scenario, it is the Dapp developers who will have to subsidize their users' transactions.\nIn such a case, a decentralized application using GSN has to implement a contract called Paymaster.\nThis contract keeps an amount of Ether as its own balance in the RelayHub and is charged for the transaction afterward.\n\nThe target contract to which the original transaction was made is called Recipient.\nIt has to inherit from the `ERC2771Recipient` base contract in order to support being called through the GSN.\n\n## Installation and Usage\n\nIn order to install the GSN client library\n```bash\nyarn add @opengsn/provider\n```\n\nUsing it within your application:\n```JavaScript\nconst { RelayProvider } = require('@opengsn/provider')\n\n// Create a new RelayProvider instance in the place where you normally initialize your Web3.js/Ethers.js provider:\nasync function getProvider() {\n  const config = {\n    paymasterAddress,\n    loggerConfiguration: {\n      logLevel: 'debug'\n    }\n  }\n  // to create a Web3.js Provider object:\n  const gsnProvider = await RelayProvider.newWeb3Provider({ provider: window.ethereum, config })\n  // to create a pair of Ethers.js Provider and Signer:\n  const { gsnProvider, gsnSigner } = await RelayProvider.newEthersV5Provider({ provider: new JsonRpcProvider(url), config})\n}\n```\n\u003e **_NOTE:_**   You can pass `window.ethereum`, Web3.js Provider, Ethers.js Signer or Provider (both v5 or v6), in the `provider` parameter.\u003cbr/\u003e\n\u003e Use `newEthersV5Provider` or `newEthersV6Provider` instead of `newWeb3Provider` to create a pair of Ethers.js Provider and Signer.\u003cbr/\u003e\n\u003e You can also connect a single `ERC2771Recipient` contract like this: ``` const gsnContract = await connectContractToGSN(contract, config) ```\n\nAdding `ERC2771Recipient` to your target smart contract:\n```solidity\nimport \"@opengsn/contracts/src/ERC2771Recipient\";\n\ncontract MyContract is ERC2771Recipient {\n    constructor(address forwarder) {\n        _setTrustedForwarder(forwarder);\n    }\n\n    /* the rest of your contract code */\n}\n```\n## Developing a Paymaster contract\nThe GSN cannot predict the exact logic your project needs to implement to decide whether you want to pay for\nthe transaction or not. We provide some sample Paymaster, but the Paymaster is a part of your application and\nthe samples provided by the GSN team may or may not fit your use case.\n\nHere are some of our sample Paymasters:\n\n### [AcceptEverythingPaymaster](https://github.com/opengsn/gsn/blob/master/packages/paymasters/contracts/AcceptEverythingPaymaster.sol)\nThis is only a viable approach for testing and will be immediately drained on a real network.\n\n### [WhitelistPaymaster](https://github.com/opengsn/gsn/blob/master/packages/paymasters/contracts/WhitelistPaymaster.sol)\nThis Paymaster allows you to specify an array of senders, targets, and methods that will be subsidized by it.\n\n### [Token + Permit + Uniswap Paymaster](https://github.com/opengsn/gsn/blob/19ca9a91255986cf45d330f8b1c313c8d4ebd020/packages/paymasters/contracts/PermitERC20UniswapV3Paymaster.sol)\nThere is no single approach to making transactions be paid for in ERC-20 tokens.\nThis Paymaster uses a combination of the ERC-2612 `permit` method and a Uniswap v3 to charge users with tokens.\u003cbr\u003e\n\n## Running a Relay Server\nEveryone is allowed to join the GSN and act as a Relay Server and it is a fairly simple process.\nWe provide a `docker-compose` script to do so and the tutorial explaining how to join with a simple cloud\nvirtual machine instance can be found here:\u003cbr\u003e\nhttps://docs.opengsn.org/relay-server/tutorial.html\n\n## Active deployments\nA full list of the networks with active GSN deployments can be found here:\n\nFor GSN v3:\u003cbr\u003e\nhttps://docs.opengsn.org/networks/addresses.html\n\nFor GSN v2:\u003cbr\u003e\nhttps://docs-v2.opengsn.org/networks/addresses.html\n\nAlso, you can see registered relays and deployments on dashboard pages.\n\nFor GSN v2:\u003cbr\u003e\nhttps://relays-v2.opengsn.org/\n\nFor GSN v3:\u003cbr\u003e\nhttps://relays.opengsn.org/\n\n## FAQ\nA full list of FAQs can be found here:\u003cbr\u003e\nhttps://docs.opengsn.org/faq/general.html\n\n#### Should dapp developers run their own relay server?\nRunning a relay server is highly recommended for most use cases.\nIt will usually save money for dapps to run their own relays.\nThis way they can avoid having to pay an extra transaction fee to a third party.\nOnly if the dapp's preferred relay server is unavailable, the clients will seamlessly fall back to another\nrelayer in the network. This protects against network failures and denial of service attacks.\nIf a preferred relayer is not configured, all transactions will be routed through third-party relay servers.\n\n#### We already have our smart contracts deployed. Can we add support for the GSN without redeploying?\nGenerally speaking, integration with the GSN requires a small modification to the target smart contract to become a\nfunctional Relay Recipient. However, if your smart contracts support a different meta-transactions mechanism, they might\nbe able to piggyback on the GSN without a need to modify your code.\n\n#### Can users who have no Ether transfer ERC-20 tokens with GSN?\nOnly ERC-20 tokens that also support the ERC-2612 `permit` method can be used gaslessly. The basic ERC-20 standard does not\ninclude any support for meta-transactions and requires at least a single call to `approve` method to be paid by the sender.\n\n## Resources\n\n* [GSN documentation](https://docs.opengsn.org/)\n* [GSN Discord Server](http://discord.gg/b5Jk9kWcPG)\n\n### On GitHub\n\n* [GSN + Ethers + React + Vite - minimal viable sample](https://github.com/opengsn/react-vite-ethers-gsn-demo)\n* [GSN example integration](https://github.com/opengsn/workshop)\n\n## Live demo\n\nMake a transaction and capture the flag on-chain without paying for gas. [Try it now!](https://ctf-react.opengsn.org/)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fopengsn%2Fgsn","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fopengsn%2Fgsn","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fopengsn%2Fgsn/lists"}