# Scroll.io⚡️Деплоим смарт-контракт + токен + актив в UniSwap/SyncSwap

By [一川drive](https://paragraph.com/@yichuandrive) · 2023-04-10

---

1️⃣ Что такое Scroll? 🧐
------------------------

> [**Scroll**](https://twitter.com/Scroll_ZKP) - это **zk**\-**Rollup** решение, созданное для масштабирования сети **Ethereum** с целью предоставления пользователям практически мгновенных и экономически эффективных транзакций при сохранении высоких свойств безопасности, предлагаемых сетью **Ethereum**. **Scroll создает полностью совместимый с EVM** _(Ethereum Virtual Machine)_ **zk-Rollup.**
> 
> **Scroll** недавно привлекла [**$50 млн**](https://www.theblock.co/post/217340/ethereum-scaling-scroll-50-million-funding-round-1-8-billion-valuation) в ходе недавнего раунда финансирования, при оценке в **1.8$ миллиарда.**
> 
> _Следовательно_ **_Scroll_** _является одним из тех проектов, который может стрельнуть в этом году. Да-да, скажите Вы, это тестнет и могут не насыпать. Ноо! Развернув два контракта в их сети, мы можем сильно увеличить свои шансы на дроп, так как, большинстве кроме свапов и депозитов не делает:) Так что погнали_ 🚴‍♂️

2️⃣ Подготовка ✍️
-----------------

Для начала нам нужно добавить сеть - **Scroll Alpha testnet**. 👉 **Жмакаем** [**СЮДА**](https://scroll.io/alpha).

![](https://storage.googleapis.com/papyrus_images/02f5a3c1bbd57def0e21a4b5524f58281abd9c015bfb3f2e286cdeef0ce9cd58.png)

*   Клацаем по кнопке `Add to Metamask`, чтобы добавить **Scroll Alpha testnet** к нам в кошель
    
*   Можно добавить и **Goerli** **Testnet** (_на случай если у вас нет ее_)
    
*   Переходим на сайты с кранами🚰, чтоб получить немного **Goerli** **ETH**:
    
    *   [**Кран 1**](https://goerlifaucet.com/)
        
    *   [**Кран 2**](https://faucet.quicknode.com/ethereum/goerli)
        
    *   [**Кран 3**](https://faucet.paradigm.xyz/)
        
    *   [**Кран 4**](https://ethfaucet.vercel.app/)
        
    *   [**Кран 5**](https://goerli-faucet.pk910.de/)
        

Теперь нам нужно перегнать наш тестовый **ETH** в сеть **Scroll Alpha testnet.** 👉 **Клацаем** [**ЗДЕСЬ**](https://scroll.io/alpha/bridge)**.**

![](https://storage.googleapis.com/papyrus_images/581f4eff290a90a501543c01e219603a54e7476531a88be79d69ec77529d1684.png)

*   Перегоняем чутка тестового **ETH** из **Goerli** **Testnet** _(занимает около 10 минут)_
    

3️⃣ Деплоим смарт-контракт 👨🏻‍🏭
----------------------------------

Деплоить **смарт**\-**контракт** будем через наш любимый **миксер** (_remix_). 👉 **Тыкаем** [**ЗДЕСЬ**](https://remix.ethereum.org/#lang=en&optimize=false&runs=200&evmVersion=null&version=soljson-v0.8.18+commit.87f61d96.js).

![](https://storage.googleapis.com/papyrus_images/8a3aba3cd903be31034b4c12365e7f61c62ff879ed8dac458dc6a0ed206e7153.png)

*   Создаем новый файл
    
*   Называем его как угодно (_я назвал Scroll contract by drive_)
    
*   Копируем и вставляем код, указанный ниже
    
        // SPDX-License-Identifier: MIT
        pragma solidity ^0.8.4;
        contract FunctionTypes{
            uint256 public number = 5;
            
            constructor() payable {}
        
            // 函数类型
            // function (<parameter types>) {internal|external} [pure|view|payable] [returns (<return types>)]
            // 默认function
            function add() external{
                number = number + 1;
            }
        
            // pure: 纯纯牛马
            function addPure(uint256 _number) external pure returns(uint256 new_number){
                new_number = _number+1;
            }
            
            // view: 看客
            function addView() external view returns(uint256 new_number) {
                new_number = number + 1;
            }
        
            // internal: 内部
            function minus() internal {
                number = number - 1;
            }
        
            // 合约内的函数可以调用内部函数
            function minusCall() external {
                minus();
            }
        
            // payable: 递钱，能给合约支付eth的函数
            function minusPayable() external payable returns(uint256 balance) {
                minus();    
                balance = address(this).balance;
            }
        }
        
    

![](https://storage.googleapis.com/papyrus_images/a8f5e75366b4e441187917ddaf54e72e28de09ad7d900c1fe101cd0a75911a35.png)

🔰 **_Выглядит всё это примерно так :)_**

*   Сверяем наш код
    
*   Клацаем на ♻️
    
*   Выбираем версию `0.8.7+commit.e28d00a7`
    
*   Жмакаем по синей кнопке, чтоб скомпилировать наш смарт-контракт
    

🔰 **_Далее деплоим наш смарт-контракт следующим образом._**

![](https://storage.googleapis.com/papyrus_images/5695411227b4d9bd534e552e42b24d3ef6130b011a0b53c18a0f5fe0d2805bc8.png)

*   Клацаем на значок Эфира
    
*   Выбираем **Metamask** в `Environment`
    
*   Клацаем на `Deploy`
    
*   Подтверждаем нашу транзу в **Metamask**
    

**Поздравляю, смарт-контракт развернут** 😎 (_0x9Cd2509303B80f3047f9cc8F8EE6E0F6df257600_)

4️⃣ Деплоим свой токен ⚙️
-------------------------

![](https://storage.googleapis.com/papyrus_images/984054cb995819188bfb370fe2162c85861d64148ead7f8b81ae02c96ade1601.png)

*   Переходим в графу с файлами
    
*   Создаем новый файл _(он же будущий токен)_
    
*   Придумываем название нашему токену _(мой - DRVE)_
    
*   Жмакаем на `Enter`
    
*   Далее копируем и вставляем код ниже 👇👇👇
    

    // SPDX-License-Identifier: MIT
    // WTF Solidity by 0xAA
    
    pragma solidity ^0.8.4;
    
    interface IERC20 {
        /**
         * @dev 释放条件：当 `value` 单位的货币从账户 (`from`) 转账到另一账户 (`to`)时.
         */
        event Transfer(address indexed from, address indexed to, uint256 value);
    
        /**
         * @dev 释放条件：当 `value` 单位的货币从账户 (`owner`) 授权给另一账户 (`spender`)时.
         */
        event Approval(address indexed owner, address indexed spender, uint256 value);
    
        /**
         * @dev 返回代币总供给.
         */
        function totalSupply() external view returns (uint256);
    
        /**
         * @dev 返回账户`account`所持有的代币数.
         */
        function balanceOf(address account) external view returns (uint256);
    
        /**
         * @dev 转账 `amount` 单位代币，从调用者账户到另一账户 `to`.
         *
         * 如果成功，返回 `true`.
         *
         * 释放 {Transfer} 事件.
         */
        function transfer(address to, uint256 amount) external returns (bool);
    
        /**
         * @dev 返回`owner`账户授权给`spender`账户的额度，默认为0。
         *
         * 当{approve} 或 {transferFrom} 被调用时，`allowance`会改变.
         */
        function allowance(address owner, address spender) external view returns (uint256);
    
        /**
         * @dev 调用者账户给`spender`账户授权 `amount`数量代币。
         *
         * 如果成功，返回 `true`.
         *
         * 释放 {Approval} 事件.
         */
        function approve(address spender, uint256 amount) external returns (bool);
    
        /**
         * @dev 通过授权机制，从`from`账户向`to`账户转账`amount`数量代币。转账的部分会从调用者的`allowance`中扣除。
         *
         * 如果成功，返回 `true`.
         *
         * 释放 {Transfer} 事件.
         */
        function transferFrom(
            address from,
            address to,
            uint256 amount
        ) external returns (bool);
    }
    
    contract ERC20 is IERC20 {
    
        mapping(address => uint256) public override balanceOf;
    
        mapping(address => mapping(address => uint256)) public override allowance;
    
        uint256 public override totalSupply;   // 代币总供给
    
        string public name;   // 名称
        string public symbol;  // 符号
        
        uint8 public decimals = 18; // 小数位数
        address public owner;
    
        // @dev 在合约部署的时候实现合约名称和符号
        constructor(string memory name_, string memory symbol_){
            name = name_;
            symbol = symbol_;
            owner = msg.sender;
        }
    
        // @dev 实现`transfer`函数，代币转账逻辑
        function transfer(address recipient, uint amount) external override returns (bool) {
            balanceOf[msg.sender] -= amount;
            balanceOf[recipient] += amount;
            emit Transfer(msg.sender, recipient, amount);
            return true;
        }
    
        // @dev 实现 `approve` 函数, 代币授权逻辑
        function approve(address spender, uint amount) external override returns (bool) {
            allowance[msg.sender][spender] = amount;
            emit Approval(msg.sender, spender, amount);
            return true;
        }
    
        // @dev 实现`transferFrom`函数，代币授权转账逻辑
        function transferFrom(
            address sender,
            address recipient,
            uint amount
        ) external override returns (bool) {
            allowance[sender][msg.sender] -= amount;
            balanceOf[sender] -= amount;
            balanceOf[recipient] += amount;
            emit Transfer(sender, recipient, amount);
            return true;
        }
    
        // @dev 铸造代币，从 `0` 地址转账给 调用者地址
        function mint(uint amount) external {
            require(owner == msg.sender);
            balanceOf[msg.sender] += amount;
            totalSupply += amount;
            emit Transfer(address(0), msg.sender, amount);
        }
    
        // @dev 销毁代币，从 调用者地址 转账给  `0` 地址
        function burn(uint amount) external {
            balanceOf[msg.sender] -= amount;
            totalSupply -= amount;
            emit Transfer(msg.sender, address(0), amount);
        }
    
    }
    

**_Должно выглядеть как-то так :)_** 👇

![](https://storage.googleapis.com/papyrus_images/7dfcdf4c3fb1972828e433a1019fe8f33706dd24e899ac7b6fb4fdb66268ac86.png)

**_P.S. В желтом прямоугольнике, где я выделил, не забываем указать название нашего токена и символ_** 🤓

*   Нажимаем **CTRL+S** / **CMND+C** (_или на зеленый треугольник_), чтобы скомпилировать контракт на токен
    

**_Теперь развертываем контракт нашего токена_**

![](https://storage.googleapis.com/papyrus_images/76959b5daa758d394664ea08f7bdad9280596e280936e08c963591e09c8c1bc1.png)

*   Клацаем на значок Эфира
    
*   Выбираем **Metamask** в `Environment`
    
*   Клацаем на `Deploy`
    
*   Подтверждаем нашу транзу в **Metamask**
    

**_Далее минтим наши токены_**

![](https://storage.googleapis.com/papyrus_images/a11e849f127055c8042bd219c2c41bd2ec298d1c9b39d9677df4efbb3d882f6a.png)

*   Жмакаем по стрелочке, чтобы развернуть инфу о токене
    
*   В графе `mint` опять жмакаем по стрелочке
    
*   Указываем сумму `18000000000000000000000000`, и нажимаем на `mint`
    

Ура, Поздравляю Вас. Вы только что создали свой собственный токен в сети **Scroll** **Alpha**. Теперь можно повзаимодействовать с ним. 😋 💪

Контракт моего $**DRVE** токена = _0xA5242FB95a28671e5Fb372cc3F7E9094aA637F05_

5️⃣ Играемся с токеном на UniSwap 🦄
------------------------------------

Перед тем как свапать наш токен на **ETH**, нужно добавить его в пул ликвидности. Переходим на **Uniswap**. 👉 **Тык** [**СюДоЙ**](https://uniswap-v3.scroll.io/#/add/ETH).

![](https://storage.googleapis.com/papyrus_images/c8f9bcb6d691052619884dfa8165a3b57bec8db29eb5fc71daa772071b497574.png)

*   Заходим в пул, выбирай **ETH** в качестве первого актива
    
*   В качестве второго актива выбирай наш токен. Нужно скопировать контракт нашего токена, и вставить в поисковую строку _(0xA5242FB95a28671e5Fb372cc3F7E9094aA637F05)_
    

![](https://storage.googleapis.com/papyrus_images/5081e98ca98292185d299c2614434decfd30679e311f403e75d7050ba7f56ba5.png)

*   Указываем Текущую цену своего токена (_$DRV_) за **ETH**. У меня цена _1 $DRV = 0.0001 ETH_
    
*   Выставляем Уровень комсы = 0,05%
    
*   Выставляем диапазон, в котором будем ловить сливки
    
*   Указываем сумму, которую будем вносить в пул
    
*   Нажимаем 👉 Одобрить наш токен 👉 затем добавить в пул ликву
    

![](https://storage.googleapis.com/papyrus_images/7b2faafb2e5365d83c40bc6a97124c1e1abf2613bfceae833bc578e49ec852db.png)

Теперь переходим к **Свапам**. **Тыц** [**СЮДА**](https://uniswap-v3.scroll.io/#/swap).

![](https://storage.googleapis.com/papyrus_images/18fff90ab328fb1eb3b611a200bca197bd7f3261eb9e9f043e7f1df838e9149a.png)

*   Делаем много свапов в обе стороны
    
*   $DRV 👉 $ETH / $ETH 👉 $DRV
    

**_Иии, напоследок, заходим обратно в наш пул и клеймим комсы, которую мы заработали на своих же свапах._**

![](https://storage.googleapis.com/papyrus_images/3079f75880031f7bfc56b814aeb5e02c483aa88352089a4217741e48cc98d7d5.png)

6️⃣ SyncSwap
------------

Здесь работаем по такому же принципу. Заходим на **SyncSwap**. 👉 **Жмакаем** [**СюДоЙ**](https://syncswap.xyz/).

**_P.S. Перечислю действия, которые нужно сделать_** 👇

![](https://storage.googleapis.com/papyrus_images/7d1f39a1f620e5f40454487dab6f7dde502db3d76996965acf63cad87d0035fe.png)

*   Делаем депозит в пул с нашим токеном, который мы создали
    
*   Делаем множество свапов
    
*   Помимо свапов на наш токен, есть возможность свапать на USDC/USDT и тд.
    
*   Проделываем как можно больше взаимодействий с платформой
    

Не забываем вступить в **Discord** **SyncSwap** 👉 [**ЗДЕСЬ**](https://discord.gg/syncswap).

### На этом пожалуй всё. Надеюсь материал будет Вам полезен! 💪 Если гайд пришелся по душе, поддержи подпиской и коллектом 😊

🐦 **Мой** **Twitter**: [**@yichuan\_drive**](https://twitter.com/yichuan_drive)

🌐 **Мой** **Link3**: [**yichuan**](https://link3.to/yichuan)

---

*Originally published on [一川drive](https://paragraph.com/@yichuandrive/scroll-io-uniswap-syncswap)*
