# How To Deploy Contract on Fuel Network 

By [Moei](https://paragraph.com/@0xmoei-2) · 2023-02-02

---

آموزش دیپلوی اسمارت کانترکت روی تست نت شبکه فیول
------------------------------------------------

دیپلوی اسمارت کانترکت نیاز به سیستم خاصی نداره و فقط محیط کدنویسی لینوکس میخواد

**آموزش راه‌اندازی محیط کدنویسی رو از این** [**توییت**](https://twitter.com/0xMoei/status/1601976573170622464) **ببینید**

مراحل دیپلوی اسمارت کانترکت
---------------------------

1\. Install dependecies
-----------------------

### 1.1 Install Rust

    curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
    

    source "$HOME/.cargo/env"
    

    rustup update stable
    

    rustup default stable
    

2\. Install Fuelup toolchain
----------------------------

### 2.1 Install Fuelup

    curl --proto '=https' --tlsv1.2 -sSf https://fuellabs.github.io/fuelup/fuelup-init.sh | sh
    

Press `Y`

    export PATH="$HOME/.fuelup/bin:$PATH"
    

    source /root/.bashrc
    

مهم: هر زمان دستوراتی که با **عبارات زیر** شروع میشن کار نکردند از **دستور بالا** استفاده کنید مشکل حل میشه

`Fuelup` / `forc`

    fuelup self update
    

### 2.2 Install beta-2 testnet

    fuelup default beta-2
    

### 2.3 Check Fuelup version

    fuelup --version
    

### 2.4 Set Beta-2 Testnet

    fuelup default beta-2
    

**مهم:** هر زمان از ترمینال خارج شدید و بعدا دستوراتی که با **عبارات زیر** شروع میشن کار نکردند، **دستور بالا** رو دوباره بزنید

`fuelup` or `forc`

3\. Write the Contract
----------------------

### 3.1 Create project

**پوشه پروژه رو بسازید و واردش شید**

    mkdir fuel-project
    

    cd fuel-project
    

### 3.2 Config contract

    forc new counter-contract
    

    nano counter-contract/src/main.sw
    

**با دستور بالا منوی ادیت فایل کانفیگ کانترکت رو باز می‌کنید که هرچی توش هست رو پاک کنید و کدهای زیر رو توش کپی کنید**

    contract;
    storage {
    counter: u64 = 0,
    }
    abi Counter {
    #[storage(read, write)]
    fn increment();
    #[storage(read)]
    fn count() -> u64;
    }
    impl Counter for Contract {
    #[storage(read)]
    fn count() -> u64 {
    storage.counter
    }
    #[storage(read, write)]
    fn increment() {
        storage.counter = storage.counter + 1;
    }
    }
    

**بعد از کپی**

Press `Ctrl + X`

Press `Y`

Press `Enter`

### 3.3 Build Contract

مطمئن باشید داخل دیرکتوری پروژه‌ای که ساختید باشید یعنی

`fuel-project`

    cd counter-contract
    

4\. Create wallet
-----------------

### 4.1 Initialize Wallet

**یکی از 2 دستور زیر رو انتخاب کنید**

ساخت ولت جدید:

    forc-wallet init
    

`Set Password`

`Save 12 Words Recover Phrase`

ریکاوری ولت قدیمی:

    forc-wallet import
    

با زدن دستور بالا ازتون کلمات بازیابی ولتتون رو میخواد

`Enter 12 Words Recovery Phrase`

`Set Password`

### 4.2 Create wallet

    forc-wallet new
    

`Enter Your Password`

با این دستور آدرس ولتتون رو با فرمت زیر دریافت میکنید

`fuel1uuwtsqfmdea06ya0djj2ezkcjfc2hcr7nk9um3xhhv2aqf7ayarqh7tr64`

### 4.3 Get Faucet Tokens

از این [لینک](https://faucet-beta-2.fuel.network/) توکن تستی دریافت کنید

5\. Deploy Contract
-------------------

### 5.1 Create Deploy Transaction

    forc deploy --url node-beta-2.fuel.network/graphql --gas-price 1
    

Enter `Your Wallet Address`

Save `Contract id` آدرس کانترکت رو برای مرحله **تراکنش روی کانترکت** نیاز داریم سیو داشته باشید

Save `Transcation id` هش تراکنش رو برای مرحله بعد نیاز دارید

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

### 5.2 Open new Terminal

یه ترمینال جدید باز کنید تا با دستور بعدی، تراکنش دیپلوی رو امضا یا ساین کنیم

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

**در ترمینال جدید، دستورات بعدی ممکنه کار نکنن یا خطا بدن که پیدا نمیشه، که طبق نکته مرحله 2.1 عمل کنید یعنی دستور زیر رو قبلش در ترمینال جدید بزنید**

    source /root/.bashrc
    

### 5.3 Sign the Transaction

    forc-wallet sign Transaction_id 0
    

هش تراکنش مرحله 5.1 رو با **عبارت زیر** در **دستور بالا** جاگذاری کنید Transaction\_id

`Enter Password`

`Copy Signature` یه **کد امضا** بهتون میده که باید کپی کنید و برگردید به **ترمینال اصلی** و وارد کنید

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

بعد از اینکه **کد امضا** رو وارد کردید کانترکت شما روی شبکه دیپلوی میشه

![در صورتی که کانترکت با موفقیت دیپلوی بشه](https://storage.googleapis.com/papyrus_images/aa0ea993aa408d7e76a372dcbc09d55d6203e44fa448d854644705ee4a3c73ec.png)

در صورتی که کانترکت با موفقیت دیپلوی بشه

### 5.4 Explore Transaction

برای سرچ تراکنشتون میتونید به هش تراکنش مرحله 5.1 عبارت زیر رو اضافه کنید و در [اکسپلورر](https://fuellabs.github.io/block-explorer-v2/) سرچش کنید `0x` برای مثالTransaction ID: `0x276f1bcb12b343d4bdb934aae8f017aef86be7e48fdcd3efb34d1d57b9256d45`

ای

Interact with Contract
----------------------

در این قسمت یک **سایت** یا **دپ** برای کانترکتمون میسازیم که بتونیم روی کانترکت تراکنش ثبت کنیم

1\. Install Nodejs
------------------

### 1.1 Check Nodejs

ورژن جاوا اسکریپت رو چک کنید که ببینید روی سیستم دارید

    node --version
    

### 1.2 Install NodeJS

در صورت نیاز به نصب این پارت رو پیش برید

**Delete old files**

    sudo apt-get remove nodejs
    

`Press Y`

    sudo apt-get purge nodejs
    

    sudo apt-get autoremove
    

`Press Y`

**Install Nodejs 18**

    sudo apt install -y curl
    

    curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash -
    

    sudo apt install -y nodejs
    

**Check Nodejs Version**

    node --version
    

2\. Create Dapp (Frontend)
--------------------------

### 2.1 Install Frontend

اطمینان حاصل کنید داخل **پوشه فیول-پراژکت** هستید

    cd $home && cd fuel-project
    

    npx create-react-app frontend --template typescript
    

پس از نصب، شما یک پوشه کلی پروژه به نام **فیول-پراجکت** دارید که داخلش پوشه **کانترکت** و **فرانتند** وجود داره برای چک کردنش دستور زیر:

    ls
    

### 2.2 Install Frontend Packages

    cd frontend
    

    npm install fuels@0.24.2 --save
    

*   added 79 packages, and audited 1528 packages in 4s
    

    npm install fuelchain@0.24.2 typechain-target-fuels@0.24.2 --save-dev
    

*   added 33 packages, and audited 1526 packages in 2s
    

    npx fuelchain --target=fuels --out-dir=./src/contracts ../counter-contract/out/debug/*-abi.json
    

*   Successfully generated 4 typings!
    

2\. Create a wallet(Again)
--------------------------

چون شبکه در فاز اولیه است هنوز قابلیت اتصال ولت فراهم نشده؛ برای همین باید ولت دومی رو روی لینوکس بسازیم و از طریق اون با کانترکت تراکنش داشته باشیم

### 2.1 Config New Wallet

اطمینان حاصل کنید داخل پوشه فرانتند باشید

    nano createWallet.js
    

با دستور بالا یک فایل ساخته و منوی ادیتش باز میشه که **کدهای زیر** رو داخلش کپی کنید

    const { Wallet } = require("fuels");
    
    const wallet = Wallet.generate();
    
    console.log("address", wallet.address.toString());
    console.log("private key", wallet.privateKey);
    

**بعد از کپی**

Press `Ctrl + X`

Press `Y`

Press `Enter`

### 2.2 Generate New Wallet

    node createWallet.js
    

**Save** `Address` **&** `Private key`

### 2.3 Get Faucet

از این [لینک](https://faucet-beta-2.fuel.network/) فاست بگیرید یا مقداری از ولت اصلی ارسال کنید

3\. Config Dapp
---------------

### 3.1 Edit App.tsx

اطمینان حاصل کنید داخل پوشه فرانتند باشید

    nano src/App.tsx
    

با دستور بالا منوی ادیت فایل باز میشه که کدهای توش رو کامل دیلیت کنید و کدهای زیر رو با جاگذاری آدرس های جلوی عبارات زیر توش وارد کنید

`CONTRACT_ID = آدرس کانترکت`

`WALLET_SECRET = کلید خصوصی ولت دوم`

برای جاگذاری میتونید کدهارو داخل **نوت پد** کپی و اصلاح کنید

    import React, { useEffect, useState } from "react";
    import { Wallet } from "fuels";
    import "./App.css";
    // Import the contract factory -- you can find the name in index.ts.
    // You can also do command + space and the compiler will suggest the correct name.
    import { CounterContractAbi__factory } from "./contracts";
    
    // The address of the contract deployed the Fuel testnet
    const CONTRACT_ID =
      "0x3edb96c23766b8504caaff042994efa18460e7ba27f60191394a6bcf5be8d7d8";
    
    //the private key from createWallet.js
    const WALLET_SECRET =
      "0xc4a69e0cc4ce1e0b45d25899b3cedced332d193c8a5c706187ffd50aa7591ce6";
    
    // Create a Wallet from given secretKey in this case
    // The one we configured at the chainConfig.json
    const wallet = Wallet.fromPrivateKey(
      WALLET_SECRET,
      "https://node-beta-2.fuel.network/graphql"
    );
    
    // Connects out Contract instance to the deployed contract
    // address using the given wallet.
    const contract = CounterContractAbi__factory.connect(CONTRACT_ID, wallet);
    
    function App() {
      const [counter, setCounter] = useState(0);
      const [loading, setLoading] = useState(false);
    
      useEffect(() => {
        async function main() {
          // Executes the counter function to query the current contract state
          // the `.get()` is read-only, because of this it don't expand coins.
          const { value } = await contract.functions.count().get();
          setCounter(Number(value));
        }
        main();
      }, []);
    
      async function increment() {
        // a loading state
        setLoading(true);
        // Creates a transactions to call the increment function
        // because it creates a TX and updates the contract state this requires the wallet to have enough coins to cover the costs and also to sign the Transaction
        try {
          await contract.functions.increment().txParams({ gasPrice: 1 }).call();
          const { value } = await contract.functions.count().get();
          setCounter(Number(value));
        } finally {
          setLoading(false);
        }
      }
      
      return (
        <div className="App">
          <header className="App-header">
            <p>Counter: {counter}</p>
            <button disabled={loading} onClick={increment}>
              {loading ? "Incrementing..." : "Increment"}
            </button>
          </header>
        </div>
      );
    }
    export default App;
    

4\. Run your project (Dapp)
---------------------------

اطمینان حاصل کنید داخل پوشه فرانتند باشید

    npm run build
    

*   Compiled successfully!
    

    npm start
    

*   Compiled successfully!
    

اگر پورتتون تداخل داشت ازتون میخواد که روی یه پورت دیگه بالا بیارید که تایید کنید که با دستور زیر پورت جدید که خودش میگه مثلا 3001 رو باز کنید:

    ufw allow 3001/tcp
    

5\. Interact With Dapp
----------------------

برای دیدن سایتتون طبق عبارات زیر آدرس سایت رو توی بروزر سرچ کنید

Local System: `http://localhost:3001` اگر روی سیستم خانگی کانفیگ کردید

VPS: `http://ip:3001` اگر روی سرور مجازی کانفیگ کردید آی پیشو با آی پی عبارت بالا عوض ک

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

برای تراکنش نیاز به ولت ندارید و فقط:

Click `Increment`

تبریک میگم شما اپلیکیشن غیرمتمرکز خودتون رو روی شبکه فیول بالا آوردید :))

**با آرزوی سلامتی و موفقیت برای همه شما عزیزان**

---

*Originally published on [Moei](https://paragraph.com/@0xmoei-2/how-to-deploy-contract-on-fuel-network)*
