{"id":20844327,"url":"https://github.com/bootnodedev/arbitrum-bridge-erc7281-gateway","last_synced_at":"2026-04-19T23:34:47.036Z","repository":{"id":246062456,"uuid":"790285621","full_name":"BootNodeDev/arbitrum-bridge-erc7281-gateway","owner":"BootNodeDev","description":"ERC-7281 CustomGateway for Arbitrum canonical bridge","archived":false,"fork":false,"pushed_at":"2024-07-19T11:59:17.000Z","size":3705,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":8,"default_branch":"main","last_synced_at":"2025-12-28T13:28:19.252Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Solidity","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/BootNodeDev.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2024-04-22T15:49:57.000Z","updated_at":"2024-07-19T11:59:17.000Z","dependencies_parsed_at":"2024-07-10T20:27:16.981Z","dependency_job_id":null,"html_url":"https://github.com/BootNodeDev/arbitrum-bridge-erc7281-gateway","commit_stats":null,"previous_names":["bootnodedev/arbitrum-bridge-erc7281-gateway"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/BootNodeDev/arbitrum-bridge-erc7281-gateway","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/BootNodeDev%2Farbitrum-bridge-erc7281-gateway","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/BootNodeDev%2Farbitrum-bridge-erc7281-gateway/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/BootNodeDev%2Farbitrum-bridge-erc7281-gateway/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/BootNodeDev%2Farbitrum-bridge-erc7281-gateway/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/BootNodeDev","download_url":"https://codeload.github.com/BootNodeDev/arbitrum-bridge-erc7281-gateway/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/BootNodeDev%2Farbitrum-bridge-erc7281-gateway/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32026751,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-18T20:23:30.271Z","status":"online","status_checked_at":"2026-04-19T02:00:07.110Z","response_time":55,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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":[],"created_at":"2024-11-18T02:09:21.230Z","updated_at":"2026-04-19T23:34:47.018Z","avatar_url":"https://github.com/BootNodeDev.png","language":"Solidity","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Arbitrum bridge XERC20\n\nThis repo contains a set of smart contracts meant for enabling XERC20 token bridging through the Arbitrum canonical\nbridge, using two different approaches:\n\n## An ERC20 token on Ethereum with an XERC20 counterpart token on Arbitrum\n\nAn example use case for this approach would be ezETH. ezETH is an\n[ERC20](https://etherscan.io/token/0xbf5495Efe5DB9ce00f80364C8B423567e58d2110) on L1 with an\n[XERC20](https://etherscan.io/address/0x2416092f143378750bb29b79ed961ab195cceea5) representation on both L1 and L2. In\norder for Renzo to enable bridging the ezETH token it would need to:\n\n1. Deploy both `L1LockboxGateway` and `L1LockboxGateway`\n2. Set the previously deployed `L1LockboxGateway` as a `bridge` on the\n   [XERC20 ezETH](https://etherscan.io/address/0x2416092f143378750bb29b79ed961ab195cceea5)\n3. Make a proposal to Arbitrum DAO for registering the\n   [ezETH](https://etherscan.io/token/0xbf5495Efe5DB9ce00f80364C8B423567e58d2110) on Arbitrum's router to be used with\n   the `L1LockboxGateway`, which should include:\n   - Registering the [ezETH](https://etherscan.io/token/0xbf5495Efe5DB9ce00f80364C8B423567e58d2110) on the router\n   - Remove from UI block-list\n   - Add [L2 ezETH](https://arbiscan.io/address/0x2416092f143378750bb29b79ed961ab195cceea5) to\n     [L2ApprovalUtils](https://github.com/OffchainLabs/arbitrum-token-bridge/blob/master/packages/arb-token-bridge-ui/src/util/L2ApprovalUtils.ts)\n\n![ERC20\u003c\u003eXERC20](/docs/Arbitrum2.png)\n\n## An XERC20 token on Ethereum with a XERC20 counterpart token on Arbitrum\n\nThere are a few prerequisites to keep in mind for registering a token in the router associating it to a specific gateway.\n\nFirst of all, the L1 counterpart of the token must conform to the ICustomToken interface. This means that:\n\n- It must have a isArbitrumEnabled method that returns 0xb1\n- It must have a method that makes an external call to L1CustomGateway.registerCustomL2Token specifying the address of\n  the L2 contract, and to L1GatewayRouter.setGateway specifying the address of the custom gateway. These calls should be\n  made only once to configure the gateway.\n\nThese methods are needed to register the token via the gateway contract. If the L1 contract does not include these\nmethods and it is not upgradeable, registration could alternatively be performed in one of these ways:\n\n- As a chain-owner registration via an Arbitrum DAO proposal.\n- By wrapping your L1 token and registering the wrapped version of your token.\n\nThis approach uses an Adapter contract which is used for being able to permissionlessly register a non Arbitrum\ncompatible token on the Arbitrum Router to be used with a Custom Gateway\n\nIn order to be able to use this approach it would be required to:\n\n**UI**\n\n- BootNode's UI PR to be merged (TODO add PR link)\n\n**Some trusted entity**\n\n- Deploy both `L1XERC20Gateway` and `L1XERC20Gateway`\n\n**XERC20 Token Issuer**\n\n1. Deploy an `L1XERC20Adapter` if the XERC20 token\n2. Call the `registerTokenOnL2` function on the deployed `L1XERC20Adapter`\n3. Set the `L1XERC20Gateway` as a `bridge` on the XERC20 token. **WARNING:** Token issuer must ensure the previous step\n   was properly executed before this one.\n4. Make a PR to [Arbitrum's UI repository](https://github.com/OffchainLabs/arbitrum-token-bridge) adding the L2 XERC20\n   token to\n   [L2ApprovalUtils](https://github.com/OffchainLabs/arbitrum-token-bridge/blob/master/packages/arb-token-bridge-ui/src/util/L2ApprovalUtils.ts)\n\n![XERC20\u003c\u003eXERC20](/docs/Arbitrum1.png)\n\n## Audits\n\n- [Macro - July 3rd, 2024](https://0xmacro.com/library/audits/connext-7)\n\n## Deployment Scripts\n\nDeployment script documentation can be found [here](./docs/deployment.md).\n\n## Installing Dependencies\n\nFoundry typically uses git submodules to manage dependencies, but this template uses Node.js packages because\n[submodules don't scale](https://twitter.com/PaulRBerg/status/1736695487057531328).\n\nThis is how to install dependencies:\n\n1. Install the dependency using your preferred package manager, e.g. `bun install dependency-name`\n   - Use this syntax to install from GitHub: `bun install github:username/repo-name`\n2. Add a remapping for the dependency in [remappings.txt](./remappings.txt), e.g.\n   `dependency-name=node_modules/dependency-name`\n\nNote that OpenZeppelin Contracts is pre-installed, so you can follow that as an example.\n\n## Usage\n\nThis is a list of the most frequently needed commands.\n\n### Build\n\nBuild the contracts:\n\n```sh\n$ forge build\n```\n\n### Clean\n\nDelete the build artifacts and cache directories:\n\n```sh\n$ forge clean\n```\n\n### Compile\n\nCompile the contracts:\n\n```sh\n$ forge build\n```\n\n### Coverage\n\nGet a test coverage report:\n\n```sh\n$ forge coverage\n```\n\n### Format\n\nFormat the contracts:\n\n```sh\n$ forge fmt\n```\n\n### Gas Usage\n\nGet a gas report:\n\n```sh\n$ forge test --gas-report\n```\n\n### Lint\n\nLint the contracts:\n\n```sh\n$ bun run lint\n```\n\n### Test\n\nRun the tests:\n\n```sh\n$ forge test\n```\n\nGenerate test coverage and output result to the terminal:\n\n```sh\n$ bun run test:coverage\n```\n\nGenerate test coverage with lcov report (you'll have to open the `./coverage/index.html` file in your browser, to do so\nsimply copy paste the path):\n\n```sh\n$ bun run test:coverage:report\n```\n\n## License\n\nThis project is licensed under MIT.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbootnodedev%2Farbitrum-bridge-erc7281-gateway","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbootnodedev%2Farbitrum-bridge-erc7281-gateway","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbootnodedev%2Farbitrum-bridge-erc7281-gateway/lists"}