Git Product home page Git Product logo

arkaswapr's Introduction

ArkaSwapr

Un protocole pour récompenser l'attention des utilisateurs qui visitent des sites web.

La stack technique repose côté backend sur la suite hardhat.

Côté frontend, on utilise Next.js en TS, avec wagmi/ethers.js comme client ethereum et Chakra UI. L'app Next a été créée via npx create next-app --typescript.

Vidéo de démonstration

image

Table des matières


Démo sur Sepolia

https://arka-swapr.vercel.app/

Smart contracts sur Sepolia

# Auparavant, changer dans scripts/deploytArka.ts l'adresse de ChainLink ! En local, on veut celui de mainnet. 
❯ npx hardhat run scripts/deployArka.ts --network sepolia
Oracle deployed to 0x8b8D5e6D236831EE48f7CfCc68AF1A9D7648F339
ArkaERC20 deployed to 0x5Ccd9eDb23ABCE0ef87E0B17BB378bcAc9DF8B48
ArkaMaster deployed to 0x5BBD3AB995f4D37B0cEBB59e0b22e336576fABc9

Vérification etherscan

❯ npx hardhat verify --network sepolia {arkaMaster.address}
 "{arkaERC20.address}" "{oracle.address}"

Nothing to compile
No need to generate any newer typings.
Successfully submitted source code for contract
contracts/ArkaMaster.sol:ArkaMaster at 0x5BBD3AB995f4D37B0cEBB59e0b22e336576fABc9
for verification on the block explorer. Waiting for verification result...

Successfully verified contract ArkaMaster on Etherscan.
https://sepolia.etherscan.io/address/0x5BBD3AB995f4D37B0cEBB59e0b22e336576fABc9#code

Tests

❯ npx hardhat test
❯ REPORT_GAS=true npx hardhat test # avec rapport sur le coût en gas
❯ npx hardhat coverage # lancer le rapport de couverture de tests

Résulat des tests au 8 avril 2023

❯ REPORT_GAS=true npx hardhat test

  ArkaERC20
    ✔ sets correctly the address of ArkaMaster, test storage (1857ms)
    ✔ sets incorrectly the arkaMaster's address but he is not owner, test revert
    ✔ has the right initial supply, test storage

  ArkaMaster
    Oracle tests
      ✔ gets a non 0 result for EHT USD price, test integration chain link (436ms)
    ArkaMaster.proposeResource
      ✔ proposes correctly a resource, test storage
      ✔ proposes correctly a resource, test event
      ✔ proposes incorrectly a resource with a lower price than asked, test revert
    ArkaMaster.interact
      ✔ interacts correctly with a resource, test storage
      ✔ interacts correctly with a resource, test event (47ms)
      ✔ interacts correctly with a resource, test mint
      ✔ interacts incorrectly with a resource because already have interaction, test require
    ArkaMaster.startNewContract
      ✔ starts correctly a contract, test storage (154ms)
      ✔ starts correctly a contract, test event
      ✔ starts incorrectly a contract bc previous stake exists, test require
      ✔ starts incorrectly a contract bc amount is 0, test require
      ✔ starts incorrectly a contract bc amount is 0, test require
    ArkaMaster.endNewContract
      ✔ ends correctly a contract, test storage (64ms)
      ✔ ends correctly a contract, test storage on currentStake reference
      ✔ ends correctly a contract, test event
      ✔ ends incorrectly a contract bc a current is already here, test require
      ✔ ends incorrectly a contract bc the current stake is not finished, test require

  ArkaStaking
    ArkaStaking.deposit
      ✔ deposits incorrectly with zero ARKA, test storage (580ms)
      ✔ deposits correctly, test storage
      ✔ deposits correctly, test event
    ArkaStaking.withdraw
      ✔ withdraw correctly, test storage
      ✔ withdraw correctly, test event


  26 passing (3s)

·-----------------------------------|----------------------------|-------------|-----------------------------·
|       Solc version: 0.8.18        ·  Optimizer enabled: false  ·  Runs: 200  ·  Block limit: 30000000 gas  │
····································|····························|·············|······························
|  Methods                                                                                                   │
················|···················|··············|·············|·············|···············|··············
|  Contract     ·  Method           ·  Min         ·  Max        ·  Avg        ·  # calls      ·  usd (avg)  │
················|···················|··············|·············|·············|···············|··············
|  ArkaERC20    ·  approve          ·           -  ·          -  ·      46898  ·            4  ·          -  │
················|···················|··············|·············|·············|···············|··············
|  ArkaERC20    ·  setArkaMaster    ·           -  ·          -  ·      46382  ·            3  ·          -  │
················|···················|··············|·············|·············|···············|··············
|  ArkaMaster   ·  endCurrentStake  ·           -  ·          -  ·      47744  ·            4  ·          -  │
················|···················|··············|·············|·············|···············|··············
|  ArkaMaster   ·  interact         ·       67454  ·      84542  ·      81694  ·            6  ·          -  │
················|···················|··············|·············|·············|···············|··············
|  ArkaMaster   ·  proposeResource  ·      135244  ·     152260  ·     148236  ·           13  ·          -  │
················|···················|··············|·············|·············|···············|··············
|  ArkaMaster   ·  startNewStake    ·           -  ·          -  ·    1247041  ·            9  ·          -  │
················|···················|··············|·············|·············|···············|··············
|  ArkaStaking  ·  deposit          ·           -  ·          -  ·     120780  ·            5  ·          -  │
················|···················|··············|·············|·············|···············|··············
|  ArkaStaking  ·  withdraw         ·           -  ·          -  ·     116216  ·            3  ·          -  │
················|···················|··············|·············|·············|···············|··············
|  Deployments                      ·                                          ·  % of limit   ·             │
····································|··············|·············|·············|···············|··············
|  ArkaERC20                        ·           -  ·          -  ·    1724897  ·        5.7 %  ·          -  │
····································|··············|·············|·············|···············|··············
|  ArkaMaster                       ·     3683201  ·    3683213  ·    3683206  ·       12.3 %  ·          -  │
····································|··············|·············|·············|···············|··············
|  ChainlinkEthUsd                  ·           -  ·          -  ·     216906  ·        0.7 %  ·          -  │
·-----------------------------------|--------------|-------------|-------------|---------------|-------------·
  

Couverture des tests au 8 avril 2023

❯ npx hardhat coverage

|File                  |  % Stmts | % Branch |  % Funcs |  % Lines |Uncovered Lines |
|----------------------|----------|----------|----------|----------|----------------|
| contracts/           |    88.89 |       66 |     91.3 |    91.43 |                |
|  ArkaERC20.sol       |      100 |       75 |      100 |      100 |                |
|  ArkaMaster.sol      |    94.74 |       85 |    88.89 |       96 |            102 |
|  ArkaStaking.sol     |    80.95 |       50 |    88.89 |    86.84 |... 187,188,191 |
|  ChainlinkEthUsd.sol |      100 |      100 |      100 |      100 |                |
|----------------------|----------|----------|----------|----------|----------------|
|All files             |    88.89 |       66 |     91.3 |    91.43 |                |
|----------------------|----------|----------|----------|----------|----------------|

Workflow en développement

npx hardhat node
cd backend
npx hardhat run scripts/deployArka --network localhost # récupérer l'adresse du contrat (et éventuellement, copier l'ABI si changement)
cd ../frontend

# modifier adresse du contrat + abi dans frontend/src/contracts/ArkaMaster.ts/

yarn dev # va lancer `yarn wagmi generate` préalablement (cf. package.json)

Mémo CLI hardhat

npx hardhat help # aide 
npx hardhat test # lancer les tests en local
REPORT_GAS=true npx hardhat test  # lancer les tests avec résumé sur le coût en gas
npx hardhat node # Lancer un client Ethereum en local. Possibilité de forker le mainnet (cf. hardhat.config.ts)
npx hardhat run scripts/deploy.ts # Lancer un script de déploiement qui va déployer des smart contracts
npx hardhat run scripts/deploy.ts --network sepolia # Déploiement sur sepolia

PS: si on ne met pas l'option --network, il va lancer le script sur une instance de hardhat node en mémoire, donc pas accessible ensuite en Remix p. ex. Donc toujours mettre renseigner cette option.

Générer les types et les hooks de Wagmi

On utilise la génération de hooks custom en Wagmi. De ce fait, plutôt qu'avoir à utiliser un useContractRead pour le contrat ArkaMaster et la fonction startStake, on a a disposition un hook useArkaMasterStartNewStake avec l'abi, l'adresse, le nom, le provider (et le signer pour les fonctions write) de la fonction, déjà chargés.

Aller dans le fichier wagmi.config.ts

export default defineConfig({
  out: "src/generated.ts",
  contracts: [
    {
      name: "Storage",
      abi: StoreContractAbi,
      address: StoreContractAddress,
    },
    // Ajouter ses contrats, avec leur abi et leur adresses.
  ],
  plugins: [react()],
})

Lancer ensuite: yarn wagmi generate.

Un exemple existe pour la contrat Storage. Ici, on a a ajouté un nom (Storage), ainsi qu'un abi et une address, qu'on a stocké dans un fichier.

On a également ajouté le plugin react, qui va créer les hooks nécessaire pour lire et écrire dans ce contrat (et les autres qui viendront s'ajouter plus tard dans le fichier).

FAQ

Quel est le chain id de Hardhat ?

Le chainId de HardHat est 31337.

Comment voir le nombre d'ARKA possédés ?

Copier l'adresse du contrat ArkaERC20. Aller dans MetaMask, actifs > importer des jetons et copier l'adresse du contrat.

Hardhat demande à ajouter des librairies supplémentaires et ethers n'est pas reconnu dans les imports.

Ces librairies ne sont pas nécessaires car elles sont importées via @nomicfoundation/hardhat-toolbox normalement. Cela arrive quand on mélange l'utilisation de npx avec yarn.

Solution

  • Toujours utiliser npx pour la partie backend.
  • Toujours utiliser yarn pour la partie frontend.

Problème dans les logs d'ethers. Nonce pas cohérent.

C'est un problème du wallet. Aller dans MetaMask > Paramètres avancés > Réinitialiser le compte.

Problème de nonce trop élevé lors de l'appel d'un contrat

C'est un problème de MetaMask avec un noeud Ethereum local. Il faut aller dans Paramètres avancées > Effacer les données d'activité et de nonce, pour chacun des accounts qui posent problème.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.