{"id":19460167,"url":"https://github.com/offchainlabs/nft-bridge-workshop-demo","last_synced_at":"2025-09-16T17:11:13.443Z","repository":{"id":67046467,"uuid":"537483997","full_name":"OffchainLabs/nft-bridge-workshop-demo","owner":"OffchainLabs","description":null,"archived":false,"fork":false,"pushed_at":"2022-10-13T15:20:40.000Z","size":173,"stargazers_count":14,"open_issues_count":0,"forks_count":6,"subscribers_count":5,"default_branch":"devcon-workshop-starter","last_synced_at":"2025-07-27T08:46:23.950Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"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/OffchainLabs.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"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}},"created_at":"2022-09-16T14:05:29.000Z","updated_at":"2024-11-05T18:13:30.000Z","dependencies_parsed_at":"2023-04-12T06:47:43.575Z","dependency_job_id":null,"html_url":"https://github.com/OffchainLabs/nft-bridge-workshop-demo","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/OffchainLabs/nft-bridge-workshop-demo","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/OffchainLabs%2Fnft-bridge-workshop-demo","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/OffchainLabs%2Fnft-bridge-workshop-demo/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/OffchainLabs%2Fnft-bridge-workshop-demo/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/OffchainLabs%2Fnft-bridge-workshop-demo/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/OffchainLabs","download_url":"https://codeload.github.com/OffchainLabs/nft-bridge-workshop-demo/tar.gz/refs/heads/devcon-workshop-starter","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/OffchainLabs%2Fnft-bridge-workshop-demo/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":275456795,"owners_count":25468226,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-09-16T02:00:10.229Z","response_time":65,"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-10T17:35:49.310Z","updated_at":"2025-09-16T17:11:13.411Z","avatar_url":"https://github.com/OffchainLabs.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"## Ethereum / Arbitrum NFT Bridge Workshop!\n\n\u003e DISCLAIMER: For workshop / demo / testnet purposes only; has not been audited, don't use this on mainnet, etc. \n\nToday we'll be building an ERC-721 bridge!\n\n\n#### Arbitrum\nArbitrum is a layer 2 Optimistic Rollup chain that runs on top of Ethereum. It suppots arbitrary asynchronous contract calls:\n\nL1 to L2:\n\n``` sol\n    function createRetryableTicket(\n        address to,\n        uint256 l2CallValue,\n        uint256 maxSubmissionCost,\n        address excessFeeRefundAddress,\n        address callValueRefundAddress,\n        uint256 gasLimit,\n        uint256 maxFeePerGas,\n        bytes calldata data\n    ) external payable returns (uint256);\n```\n\n\nL2 To L1:\n``` solidity\n\n\ninterface ArbSys {\n\n    function sendTxToL1(address destination, bytes calldata data)\n        external\n        payable\n        returns (uint256);\n\n}\n\n```\n\nWe will use these arbitrary cross-chain message affordances to build our bridge; we'll be using Goerli / Arbitrum Goerli Rollup Testnet.\n\n\n### Minimum Viable NFT Bridge\n\nThe NFT bridge will have similar architecture to Arbitrum [\"Custom ERC20 Bridge.\"](\nhttps://developer.arbitrum.io/asset-bridging#the-arbitrum-generic-custom-gateway)\n\n2 \"Gateway\" contracts – one at L1 and one at L2 — are responsible for mapping L1 ERC721s to their L2 ERC721s counterparts, and for enabling deposits and withdrawals.\n\n\n#### Flow\n1. ERC721 is deployted on L1 with affordance to register its L2 token address to L1 gateway.\n1. ERC721 is deployed on L2 with affordance for L2 gateway to mint/burn.\n1. **X chain message**: L1 ERC721 registers its L2 address on L1 and L2 via retryable ticket.\n1. **X chain message** Deposit to L2 via retryable ticket (escrow token in L1 gateway and mint L2 token at L2).\n1. **X chain message** Withdraw via ArbSys/Outbox (burn token at L2 and transfer from escrow at L1.)\n\n\n### Setup / Commands\n1. `git clone` this repo\n1. `yarn install`\n1. Add env variables (i.e., to a .env file):\n\n    ```\n    TESTNET_PRIVKEY=xyzxyz\n    GOERLI_RPC=https://goerli.infura.io/v3/infura_key\n    ```\n1. Complete function bodies in contracts (i.e., do all the `\"// DO!\"` things)\n1. Deploy contracts:\n    ```bash\n    yarn hardhat deploy-all\n    ```bash\n1. Test out a register / deposit:\n    ```\n    yarn hardhat register-and-deposit\n    ```\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Foffchainlabs%2Fnft-bridge-workshop-demo","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Foffchainlabs%2Fnft-bridge-workshop-demo","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Foffchainlabs%2Fnft-bridge-workshop-demo/lists"}