diff --git a/docs/developers/getting-started/index.md b/docs/developers/getting-started/index.md new file mode 100644 index 0000000..e0967d1 --- /dev/null +++ b/docs/developers/getting-started/index.md @@ -0,0 +1,12 @@ +--- +title: Getting Started +slug: /developers/getting-started/index +--- + +# Building on UniFi + +UniFi is mostly EVM equivalent, which means that developers can use familiar EVM tools and frameworks, such as Hardhat, Truffle, and Remix, to interact with and develop on UniFi. This compatibility significantly reduces the learning curve, allowing developers to leverage existing skills and knowledge. + +:::info +For exact differences between UniFi and EVM behaviour, see [Opcode reference](../reference/opcodes.md) page. +::: diff --git a/docs/developers/reference/contract-addresses.md b/docs/developers/reference/contract-addresses.md new file mode 100644 index 0000000..4275764 --- /dev/null +++ b/docs/developers/reference/contract-addresses.md @@ -0,0 +1,33 @@ +--- +title: Smart Contract Addresses +slug: /developers/rollup/reference/contract-addresses +--- + +## Testnet + +### L1 Addresses + +| Contract | Address | +|---------------------------|-------------------------------------------------------------------------------------------------------------------------------| +| UniFi L1 | [0x12d30f3584ee969C4131b7d5dCAEe763A378AfD9](https://holesky.etherscan.io/address/0x12d30f3584ee969C4131b7d5dCAEe763A378AfD9) | +| Rollup Address Manager | [0x540B8d82e6E11F0a9438fB19f33c85b2B53B49d8](https://holesky.etherscan.io/address/0x540B8d82e6E11F0a9438fB19f33c85b2B53B49d8) | +| Shared Address Manager | [0x0F3dD9461Ccf086cC32D38eC8673e541Fc86279d](https://holesky.etherscan.io/address/0x0F3dD9461Ccf086cC32D38eC8673e541Fc86279d) | +| Attestation Verifier | [0xCB848506bcB28C86Dd0CCb5905BaBD80CC0277E4](https://holesky.etherscan.io/address/0xCB848506bcB28C86Dd0CCb5905BaBD80CC0277E4) | +| Automata DCAP Attestation | [0x133303659F51d75ED216FD98a0B70CbCD75339b2](https://holesky.etherscan.io/address/0x133303659F51d75ED216FD98a0B70CbCD75339b2) | +| Bridge | [0x81bfCf0f7196C1772279846625F619f691755120](https://holesky.etherscan.io/address/0x81bfCf0f7196C1772279846625F619f691755120) | +| Prover Set | [0x3a4e7187720420FF208AfC4EA2602d3DE2C80E1d](https://holesky.etherscan.io/address/0x3a4e7187720420FF208AfC4EA2602d3DE2C80E1d) | +| Signal Service | [0x60646983250313B750D3657C648823d665305299](https://holesky.etherscan.io/address/0x60646983250313B750D3657C648823d665305299) | +| UniFi Token | [0x4543168F4C5b3EcDdeF36E15DbCD6914e3f585BD](https://holesky.etherscan.io/address/0x4543168F4C5b3EcDdeF36E15DbCD6914e3f585BD) | +| TDXVerifier | [0x7c2B88Bb08467669e6ee3ed604f07aB0D5E78F1a](https://holesky.etherscan.io/address/0x7c2B88Bb08467669e6ee3ed604f07aB0D5E78F1a) | +| GuardianProver | [0xdE0e5FefE21af1C46F63c0Ee6381b512B95085F7](https://holesky.etherscan.io/address/0xdE0e5FefE21af1C46F63c0Ee6381b512B95085F7) | +| GuardianProverMinority | [0x51940246968853F696ab7761eA5Af86c542C0894](https://holesky.etherscan.io/address/0x51940246968853F696ab7761eA5Af86c542C0894) | + +### L2 Addresses + +| Contract | Address | +|-----------------------------|--------------------------------------------| +| UniFi L2 | 0x9A7fe8e9852c684DD03ce9caEa003F5Fc0a3135b | +| Bridge | 0x511a232eaef7aA4633BAc8E406a7886e46492AFC | +| Signal Service | 0x80d0AFe646Ba22e5E557F1dCC209e75b07e1b1BA | +| Rollup Address Manager | 0x91e75542D9da7C52089b71094e327307C51D6deD | +| Shared Address Manager Impl | 0x6a23ea44177735E3700721817A181375A8afdb47 | diff --git a/docs/developers/reference/opcodes.md b/docs/developers/reference/opcodes.md new file mode 100644 index 0000000..e43d8ac --- /dev/null +++ b/docs/developers/reference/opcodes.md @@ -0,0 +1,26 @@ +# Opcodes + +Since UniFi is based on Taiko, it inherits the same opcode behaviour as Taiko. Unless listed below, all opcodes are supported in UniFi and are EVM equivalent. The execution of some Opcodes is not verified by the circuits and its not part of the validity proofs. + +# Unsupported Opcodes + +:::warning +If an unsupported opcode is encountered during execution that is not supported in UniFi, the transaction will revert. +::: +The following opcodes are not supported in UniFi: +| Opcode | Name | Solidity Equivalent | +|--------|-------------|---------------------| +| 49 | BLOBHASH | blobhash(index) | +| 4A | BLOBBASEFEE | block.blobasefee | +| 5C | TLOAD | tload(key) | +| 5D | TSTORE | tstore(key, value) | +| 5E | MCOPY | mcopy() | + +# Modified Opcodes + +| Opcode | Name | Solidity Equivalent | Rollup Behaviour | Ethereum L1 Behaviour | +|--------|-----------|---------------------|----------------------------------------------|--------------------------------------| +| 41 | COINBASE | block.coinbase | Returns the address of the L2 block proposer | Gets the block’s beneficiary address | +| 42 | TIMESTAMP | block.timestamp | Timestamp of the L2 block | Timestamp of the L1 block | +| 43 | NUMBER | block.number | L2 block number | Gets the L1 block number | +| 48 | BASEFEE | block.basefee | Returns the L2 base fee | Returns the base fee | diff --git a/docs/developers/reference/rpc-endpoints.md b/docs/developers/reference/rpc-endpoints.md new file mode 100644 index 0000000..3e96c0d --- /dev/null +++ b/docs/developers/reference/rpc-endpoints.md @@ -0,0 +1,15 @@ +--- +title: Network & RPC Endpoints +slug: /developers/rollup/reference/rpc-endpoints +--- + +## UniFi Testnet + +| Parameter | Value | +|--------------------|--------------------------------------------------------| +| Network Name | `UniFi Testnet` | +| Chain ID | `8787` | +| Currency Symbol | ETH | +| Block Explorer | TODO: | +| Sequencer URL | TODO: | +| Contract Addresses | See [Contract addresses](./contract-addresses.md) page | diff --git a/docs/developers/rollup/smart-contracts/unifi-rollup-smart-contracts-foundry.md b/docs/developers/rollup/smart-contracts/unifi-rollup-smart-contracts-foundry.md new file mode 100644 index 0000000..de384f7 --- /dev/null +++ b/docs/developers/rollup/smart-contracts/unifi-rollup-smart-contracts-foundry.md @@ -0,0 +1,83 @@ +--- +title: Deploy a Smart Contract on UniFi using Foundry +slug: /developers/rollup/smart-contracts/foundry +--- + +## Prerequisite + +Before you begin, ensure you've: + +1. [Set up your wallet and have bridged UniFi tokens successfully](../../../unifi-rollup-move-funds.md). +2. Downloaded and installed Foundry: + + ```bash + curl -L https://foundry.paradigm.xyz | bash + ``` + + Then, open a new terminal, and call `foundryup` to install the latest release. + :::info + Running `foundryup` will automatically install the latest (nightly) versions of the precompiled binaries: forge, cast, anvil, and chisel. For additional options, such as installing a specific version or commit, run `foundryup --help` + ::: + +## Create a Foundry project + +To create a Foundry project, run: + +```bash +forge init unifi-smart-contract-tutorial +``` + +Running `forge init` sets up a sample contract, test, and script for `Counter.sol`. + +Now change into the directory: + +```bash +cd unifi-smart-contract-tutorial +``` + +## Deploy a smart contract + +:::warning +Directly pasting your private key into the command line poses security risks. The examples below are instructional and don't adhere to good security practices. To avoid exposing sensitive information such as wallet private keys, use `.env` files to store private data. Create a `.env` file, then add the file to the `.gitignore` file to prevent committing it. Populate the `.env` file with the private information. +::: + +Deploy your contract using the following syntax: + +```bash +forge create --rpc-url src/Counter.sol:Counter --private-key +``` + +In the command: + +- `rpc_https_endpoint` is a RPC Endpoint for the UniFi network. You can find the endpoints in the [RPC Endpoints Reference](../../reference/rpc-endpoints.md). +- `your_private_key` is your wallet's private key. + +Your output should look similar to: + +```bash +Deployer: YOUR_WALLET_ADDRESS +Deployed to: 0xFCc25885bDcF17A0BF1C0E529100B6420e237Cbe +Transaction hash: 0x734c59643232b61b560da2c750d7ad808267fbc28331ee59102e431ec9559097 +``` + +For more deployment options, see the [forge-create documentation](https://book.getfoundry.sh/reference/forge/forge-create). + +## Verify your smart contract + +Optionally, you can verify your contract on the network. This makes the source code publicly available. + +### Deploy and verify a contract in one go + +To deploy and verify a contract in a single command, run: + +```bash +forge create --rpc-url --private-key src/Counter.sol:Counter --verify --verifier blockscout --verifier-url /api +``` + +In the command: + +- `rpc_https_endpoint` is a RPC Endpoint for the UniFi network. You can find the endpoints in the [RPC Endpoints Reference](../../reference/rpc-endpoints.md). +- `your_private_key` is your wallet's private key. +- `blockscout_homepage_explorer_url` is the URL of the block explorer explorer you're using. You can find the endpoints in the [RPC Endpoints Reference](../../reference/rpc-endpoints.md). + +For more contract verification options, see the [verify-contract documentation](https://book.getfoundry.sh/reference/forge/forge-verify-contract). diff --git a/docs/developers/rollup/smart-contracts/unifi-rollup-smart-contracts-hardhat.md b/docs/developers/rollup/smart-contracts/unifi-rollup-smart-contracts-hardhat.md new file mode 100644 index 0000000..6040ab4 --- /dev/null +++ b/docs/developers/rollup/smart-contracts/unifi-rollup-smart-contracts-hardhat.md @@ -0,0 +1,184 @@ +--- +title: Deploy a Smart Contract using Hardhat +slug: /developers/rollup/smart-contracts/hardhat +--- + +## Prerequisites + +Before you begin, ensure you: + +1. [Set up your wallet and have bridged UniFi tokens successfully](../../../unifi-rollup-move-funds.md). +2. [Set up your Hardhat environment](https://hardhat.org/tutorial/setting-up-the-environment#2.-setting-up-the-environment). + +## Create a Hardhat project + +To create an empty Hardhat project: + +1. Create your project directory: + + ```bash + mkdir unifi-smart-contract-tutorial + cd unifi-smart-contract-tutorial + ``` + +2. Initialize your Node.js project: + + ```bash + npm init + ``` + +3. Install Hardhat: + + ```bash + npm install --save-dev hardhat + ``` + +4. Initialize the Hardhat project: + + ```bash + npx hardhat init + ``` + + In the menu that appears, select **Create a JavaScript project** and press **Enter**. Accept all + the default values in the questionnaire. + +You should now have a sample HardHat project with a `Lock` contract, that locks funds for a set time, and a few smart contract tests. + +:::note + +The default script in `ignition/modules/Lock.js` locks 1 GWEI in the contract upon deployment, you can modify this +value in the script. + +::: + +## Deploy the contract + +The sample project already includes the deployment script. To deploy on UniFi, you'll just need to make +a few modifications to the `hardhat.config.js` file: + +1. Create a `.env` file in the root folder with your wallet's private key and [RPC Endpoint](../../reference/rpc-endpoints.md). + + ``` + PRIVATE_KEY= + RPC_ENDPOINT= + ``` + + :::warning + Please do not commit your private keys into source control. Double check that `.env` is contained in your `.gitignore` + ::: + +2. Download and install `dotenv` + + ``` + npm i -D dotenv + ``` + +3. Add UniFi to your `hardhat.config.js` file. The following example shows how to add a RPC endpoint to the configuration file. + + ```javascript + require("@nomicfoundation/hardhat-toolbox"); + require("dotenv").config(); + const { PRIVATE_KEY, RPC_ENDPOINT } = process.env; + + module.exports = { + solidity: "0.8.27", + networks: { + unifi_testnet: { + url: RPC_ENDPOINT, + accounts: [PRIVATE_KEY], + }, + }, + }; + ``` + +4. Deploy your contract. + + ```bash + npx hardhat ignition deploy ./ignition/modules/Lock.js --network + ``` + +In the command: + +- `` is the name of the network from `hardhat.config.js` you want to deploy on f.e. `unifi_testnet`. + +Your output should look something like this: + +```bash +Deployed Addresses + +LockModule#Lock - 0xA72022A83654E794B8e9FD7217ADF7378f3e985d +``` + +## Verify your smart contract + +Optionally, you can verify your contract on the network. This makes the source code publicly available. + +### Verify an already existing contract contract + +To verify a contract, you need to make a few modifications the project. + +1. In your project directory, install `hardhat-verify` + ```bash + npm install --save-dev @nomicfoundation/hardhat-verify + ``` +2. Add blockscout url and chain id to the .env file + ``` + BLOCKSCOUT_URL= + CHAIN_ID= + ``` +3. Import `hardhat-verify` in your `hardhat.config.js`: + + ```javascript + require("@nomicfoundation/hardhat-verify"); + require("@nomicfoundation/hardhat-toolbox"); + require("dotenv").config(); + const { PRIVATE_KEY, RPC_ENDPOINT, BLOCKSCOUT_URL, CHAIN_ID } = process.env; + + module.exports = { + solidity: "0.8.27", + networks: { + unifi_testnet: { + url: RPC_ENDPOINT, + accounts: [PRIVATE_KEY], + }, + }, + etherscan: { + apiKey: { + unifi_testnet: "empty", + }, + customChains: [ + { + network: "unifi_testnet", + chainId: CHAIN_ID, + urls: { + apiURL: `${BLOCKSCOUT_URL}/api`, + browserURL: BLOCKSCOUT_URL, + }, + }, + ], + }, + sourcify: { + enabled: false, + }, + }; + ``` + +4. Execute the `hardhat verify` command: + + ```bash + npx hardhat verify --network "constructor_argument_1" "constructor_argument_2" ... + ``` + + In our example, the full command should look something like this: + + ```bash + npx hardhat verify --network unifi_testnet 0x545D79cAace91bB8A710Ad2ee4e50B01d87bB6Ff 123456 + ``` + +In the command: + +- `` is the name of the network you want to verify on. +- `` is the address where your contract was deployed. +- `constructor_argument_1`, `constructor_argument_2`, etc., are the arguments passed to your contract's constructor (if any). + +For more contract verification options, refer to the [Hardhat verification documentation](https://hardhat.org/plugins/nomiclabs-hardhat-etherscan.html). diff --git a/docs/unifi-rollup-bridge-ui.md b/docs/unifi-rollup-bridge-ui.md new file mode 100644 index 0000000..4f23970 --- /dev/null +++ b/docs/unifi-rollup-bridge-ui.md @@ -0,0 +1,48 @@ +--- +title: How to use UniFi Bridge +slug: /unifi-based-rollup-bridge-ui +--- + +# Using the UniFi Bridge + +In order to use the UniFi Rollup Bridge, you need to have a compatible wallet and some funds on the L1 network. This guide will help you bridge your funds from the L1 network to the UniFi Rollup network. + +## How to bridge (deposit) ETH to UniFi + +1. Open the UniFi Rollup Bridge UI(TODO: link). +2. Connect your preffered wallet. + ![Connecting the wallet](/img/rollup/connect-wallet.png) +3. Switch your connected network to L1 (Holesky). + + - This can be done manually from the top right corner of the page by clicking on your wallet address. + +4. Select the token and the amount you want to bridge and press continue. + ![Token selection](/img/rollup/select-token.png) +5. Review the transaction details and press confirm. + ![Transaction confirmation](/img/rollup/confirm-transaction.png) + :::info + When bridging ERC20 tokens, you will have an additional transaction to approve the bridge contract to spend your tokens. + ::: +6. Accept the transaction in your wallet. +7. Track the transaction in the Transactions tab. + ![Transaction tab](/img/rollup/transaction-tab.png) +8. After a few minutes, the transaction will be confirmed and the status will change to Claimed. + ![Claimed transaction](/img/rollup/claimed-transaction.png) +9. Once the transaction is confirmed, you can switch to the L2 network (Taiko) and see your bridged funds in your wallet. + +### Claiming Manually (Optional) + +If you want to claim your bridged funds manually, you can do so by following these steps: + +1. Press the Claim button on the transaction. + ![Claim button](/img/rollup/claim-button.png) +2. Review the transaction details and press confirm. + ![Claim transaction](/img/rollup/claim-transaction.png) +3. After transaction confirmation, you will see your bridged funds in your wallet. + +## How to bridge (withdraw) ETH from UniFi + +1. Make sure that you've selected UniFi Testnet as your source chain + ![Token Selection L2](/img/rollup/select-token-l2.png) + +2. The other steps are the same as when depositing ETH. diff --git a/docs/unifi-rollup-intro.md b/docs/unifi-rollup-intro.md index 2958105..c1d679a 100644 --- a/docs/unifi-rollup-intro.md +++ b/docs/unifi-rollup-intro.md @@ -1,7 +1,28 @@ --- -title: UniFi Based Rollup +title: About UniFi slug: /unifi-based-rollup --- -:::caution Under Construction 🚧 -Major innovations incoming - see our [litepaper](https://unifi.puffer.fi/) for more info! -::: \ No newline at end of file + +# About UniFi Rollup + +Puffer's UniFi is an Ethereum Layer 2 (L2) rollup solution designed to address the fragmentation of Ethereum, enhance value within the L1 network, and provide credibly neutral transaction sequencing, all while maintaining an intuitive user experience that supports mass adoption. + +### What is a "Based Rollup"? + +Based rollups derive their transaction sequencing directly from Ethereum validators on the L1 network. This means that L1 validators determine the order of rollup transactions within the blocks they propose. By shifting sequencing responsibilities to L1 validators, UniFi eliminates the need for a centralized sequencer, giving users access to Ethereum's decentralized validator set for a more secure and neutral transaction layer. + +### Key Features of UniFi Rollup + +- **Credibly Neutral Sequencing**: Transactions are sequenced by Ethereum's L1 validators, ensuring reliability and neutrality. +- **Fast Transactions**: Users enjoy 100ms pre-confirmations, enhancing the overall experience. +- **Value Flow Back to Ethereum**: Sequencing fees flow back to block proposers on Ethereum, supporting the sustainability and value of the L1 network. + +### Why Choose UniFi Rollup? + +UniFi aims to drive long-term sustainability and value into Ethereum's base layer by allowing transaction sequencing fees to benefit L1 validators. Users benefit from fast, seamless, and cost-efficient transactions, making it an ideal solution for those seeking scalability without sacrificing decentralization. + +### Get Started with UniFi Rollup + +To begin using UniFi, start by moving your testnet tokens using the [Move Funds to UniFi guide](/unifi-based-rollup-move-funds). + +By leveraging UniFi's Ethereum-based rollup, users can enjoy an efficient, decentralized, and unified experience while contributing to the long-term health of the Ethereum ecosystem. diff --git a/docs/unifi-rollup-move-funds.md b/docs/unifi-rollup-move-funds.md new file mode 100644 index 0000000..aeea66e --- /dev/null +++ b/docs/unifi-rollup-move-funds.md @@ -0,0 +1,39 @@ +--- +title: Move Funds to UniFi +slug: /unifi-based-rollup-move-funds +--- + +# Moving Funds to UniFi + +This guide will help you move your funds from the L1 Testnet to UniFi Rollup. Follow the steps below to get started. + +## 1. Install a Compatible Wallet + +To interact with UniFi Rollup, you need an Ethereum wallet like MetaMask or any other compatible Ethereum wallet. The steps should be similar for other wallets. + +### Installing MetaMask + +[Install MetaMask as a browser extension or mobile app](https://metamask.io/download/) to get started. + +## 2. Add the L2 Testnet to MetaMask + +To connect to the UniFi Helder Testnet, follow these steps: + +1. Open MetaMask and click on the network dropdown. +2. Select **Add network** → **Add a network manually**. +3. Enter the following details: + - **Network Name**: `UniFi Testnet` + - **RPC URL**: TODO: + - **Chain ID**: `8877` + - **Currency Symbol**: `ETH` + - **Block Explorer URL**: TODO: + +## 3. Get L2 Testnet Tokens + +TODO(faucet): + +## Additional Resources + +- [MetaMask Support](https://support.metamask.io) + +By following these steps, you can successfully move your funds to the UniFi Rollup and start interacting with the network. diff --git a/docusaurus.config.js b/docusaurus.config.js index f1f9271..20de9f7 100644 --- a/docusaurus.config.js +++ b/docusaurus.config.js @@ -66,6 +66,18 @@ module.exports = { src: "img/Logo Mark.svg", }, items: [ + { + type: "doc", + docId: "intro", + label: "Users", + position: "left", + }, + { + type: "doc", + docId: "developers/getting-started/index", + label: "Developers", + position: "left", + }, { href: "https://www.puffer.fi/", label: "Puffer.fi", diff --git a/sidebars.js b/sidebars.js index e29f180..7800090 100644 --- a/sidebars.js +++ b/sidebars.js @@ -18,7 +18,7 @@ const sidebars = { // But you can create a sidebar manually - background: [ + docSidebar: [ "intro", { type: "category", @@ -52,7 +52,7 @@ const sidebars = { { type: "category", label: "UniFi Based Rollup", - items: ["unifi-rollup-intro"], + items: ["unifi-rollup-intro", "unifi-rollup-move-funds", "unifi-rollup-bridge-ui"], }, { type: "category", @@ -69,6 +69,65 @@ const sidebars = { label: "Reference", items: ["glossary", "hardforks", "slash", "faq", "cookie-policy", "privacy-policy", "terms-of-service"] } + ], + developersSidebar: [ + { + type: "doc", + label: "Getting started", + id: "developers/getting-started/index", + }, + { + type: "category", + label: "UniFi Based Rollup", + link: { + type: "generated-index", + }, + items:[ + { + type: "category", + label: "Deploy a Smart Contract", + link: { + type: "generated-index", + }, + items: [ + { + type: "doc", + label: "Using Foundry", + id: "developers/rollup/smart-contracts/unifi-rollup-smart-contracts-foundry", + }, + { + type: "doc", + label: "Using Hardhat", + id: "developers/rollup/smart-contracts/unifi-rollup-smart-contracts-hardhat", + } + ] + }, + { + type: "category", + label: "Reference", + link: { + type: "generated-index", + }, + items: [ + { + type: "doc", + label: "Network & RPC Endpoints", + id: "developers/reference/rpc-endpoints", + }, + { + type: "doc", + label: "Smart Contract Addresses", + id: "developers/reference/contract-addresses", + }, + { + type: "doc", + label: "Opcodes", + id: "developers/reference/opcodes", + }, + ] + } + ] + } ] }; diff --git a/static/img/rollup/claim-button.png b/static/img/rollup/claim-button.png new file mode 100644 index 0000000..ed90898 Binary files /dev/null and b/static/img/rollup/claim-button.png differ diff --git a/static/img/rollup/claim-transaction.png b/static/img/rollup/claim-transaction.png new file mode 100644 index 0000000..03bf45e Binary files /dev/null and b/static/img/rollup/claim-transaction.png differ diff --git a/static/img/rollup/claimed-transaction.png b/static/img/rollup/claimed-transaction.png new file mode 100644 index 0000000..65770f9 Binary files /dev/null and b/static/img/rollup/claimed-transaction.png differ diff --git a/static/img/rollup/confirm-transaction.png b/static/img/rollup/confirm-transaction.png new file mode 100644 index 0000000..53dcc43 Binary files /dev/null and b/static/img/rollup/confirm-transaction.png differ diff --git a/static/img/rollup/connect-wallet.png b/static/img/rollup/connect-wallet.png new file mode 100644 index 0000000..3930b4a Binary files /dev/null and b/static/img/rollup/connect-wallet.png differ diff --git a/static/img/rollup/select-token-l2.png b/static/img/rollup/select-token-l2.png new file mode 100644 index 0000000..1bddf16 Binary files /dev/null and b/static/img/rollup/select-token-l2.png differ diff --git a/static/img/rollup/select-token.png b/static/img/rollup/select-token.png new file mode 100644 index 0000000..4662773 Binary files /dev/null and b/static/img/rollup/select-token.png differ diff --git a/static/img/rollup/transaction-tab.png b/static/img/rollup/transaction-tab.png new file mode 100644 index 0000000..4753785 Binary files /dev/null and b/static/img/rollup/transaction-tab.png differ