{"id":13834570,"url":"https://github.com/naszam/ants-review","last_synced_at":"2025-04-30T16:26:41.075Z","repository":{"id":43932209,"uuid":"258342275","full_name":"naszam/ants-review","owner":"naszam","description":":1st_place_medal: @ETHTurin | KERNEL Genesis Block :seedling: Team @gitcoinco  :ant:","archived":false,"fork":false,"pushed_at":"2022-08-27T17:33:22.000Z","size":9217,"stargazers_count":32,"open_issues_count":0,"forks_count":5,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-04-19T06:57:06.088Z","etag":null,"topics":["ants-review","bounties","erc-20","ethereum","ipfs","peer-reviews","science"],"latest_commit_sha":null,"homepage":"https://ants-review.on.fleek.co","language":"JavaScript","has_issues":false,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/naszam.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2020-04-23T22:08:45.000Z","updated_at":"2024-08-31T08:59:21.000Z","dependencies_parsed_at":"2022-09-19T07:00:58.467Z","dependency_job_id":null,"html_url":"https://github.com/naszam/ants-review","commit_stats":null,"previous_names":[],"tags_count":3,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/naszam%2Fants-review","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/naszam%2Fants-review/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/naszam%2Fants-review/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/naszam%2Fants-review/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/naszam","download_url":"https://codeload.github.com/naszam/ants-review/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":251741324,"owners_count":21636226,"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","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":["ants-review","bounties","erc-20","ethereum","ipfs","peer-reviews","science"],"created_at":"2024-08-04T14:00:43.129Z","updated_at":"2025-04-30T16:26:41.052Z","avatar_url":"https://github.com/naszam.png","language":"JavaScript","funding_links":[],"categories":["Channels"],"sub_categories":[],"readme":"[![#ubuntu 18.04](https://img.shields.io/badge/ubuntu-v18.04-orange?style=plastic)](https://ubuntu.com/download/desktop)\n[![#npm 12.16.3](https://img.shields.io/badge/npm-v12.16.3-blue?style=plastic)](https://github.com/nvm-sh/nvm#installation-and-update)\n[![#built_with_Truffle](https://img.shields.io/badge/built%20with-Truffle-blueviolet?style=plastic)](https://www.trufflesuite.com/)\n[![built-with openzeppelin](https://img.shields.io/badge/built%20with-OpenZeppelin-3677FF?style=plastic)](https://docs.openzeppelin.com/)\n[![#solc v0.6.12](https://img.shields.io/badge/solc-v0.6.12-brown?style=plastic)](https://github.com/ethereum/solidity/releases/tag/v0.6.12)\n[![#testnet kovan](https://img.shields.io/badge/testnet-Kovan-purple?style=plastic\u0026logo=Ethereum)](#project-mvp-deployed-on-kovan)\n[![#testnet rinkeby](https://img.shields.io/badge/testnet-Rinkeby-yellow?style=plastic\u0026logo=Ethereum)](https://rinkeby.etherscan.io/address/0x6956dF88120c44fb446761947cD4B83b553F229F)\n\n\n[![ETH Turin 2020](https://img.shields.io/badge/%CE%9E-ETH%20Turin%202020-F64060.svg)](https://ethlocal.co/ethturin/hacks)\n[![DOI](https://zenodo.org/badge/258342275.svg)](https://zenodo.org/badge/latestdoi/258342275)  \n\n\u003cimg src=\"ants_review_logo.png\" width=\"30%\"\u003e\n\n# Ants-Review\n\u003e A Protocol for Open Anonymous Scientific Peer-Reviews on Ethereum  \n\u003e :1st_place_medal: 1st Place at [ETHTurin Hackathon](https://ethlocal.co/ethturin/hacks)\n\nThe Project implements a Bounty-like protocol called Ants-Review to allow issuers to issue an AntReview, a bounty for peer-review in scientific publication, linked to requirements stored on ipfs which peer-reviewers can fufill by submitting the ipfs hash which contains evidence of their fufillment.  \nAfter the submission of successful peer-reviews, they will be approved by an approver and payed in ANTS.  \n\nProject (MVP) feautures:\n- ERC20 token, name: Ants-Review, symbol: ANTS.\n- ANTS Faucet on Kovan.\n- IPFS Hash Timestamped on Ethereum via PoE (Proof of Existence).\n- Storing on IPFS.\n- UI Deployed on IPFS via Fleek.\n\nFuture integrations \u0026 features:\n\n- OpenGSN for Meta Transactions.\n- zkANTS, allowing private ANTS transactions on Ethereum using ZK-SNARKs via AZTEC Protocol.\n- De-Fi services like Dai, Chai, MakerDAO DSR, ...\n- ENS, allowing human-readable Ethereum addresses\n- Quadratic Funding Gitcoin-like for Ants-Review.\n- Upgradability, to allow the logic to be extended and improved.\n- ...\n\n![Demo MVP](mvp.gif)\n\n## Mentors\n- Mark Beylin, [@mbeylin](https://github.com/mbeylin)\n- Andy Tudhope, [@andytudhope](https://github.com/andytudhope)\n\n[White Paper](https://zenodo.org/record/3828087#.Xr8XVXVKg5k)  \n[Presentation](https://zenodo.org/record/3828067#.Xr8Pv3VKg5k)  \n[Demo (PoC)](https://youtu.be/uMqksNytsMY)  \n[Pich Deck](https://www.beautiful.ai/player/-MEwnYOfba26O3Zg0WX9)  \n[FDAPP 2020](https://www.youtube.com/watch?v=x_1Pqh6a3U4\u0026feature=youtu.be\u0026t=12281)\n\n## Sections\n* [Building Blocks](#building-blocks)\n* [Setup](#setup)\n* [Deploy](#deploy)\n* [Using the DApp](#using-the-dapp)\n* [Front-end](#front-end)\n* [Interacting with the PoC](#interacting-with-the-poc)\n* [About](#about)\n\nBuilding Blocks\n===============\n\n![Smart Contracts Flow-Chart](AntsReview.png)\n\n### [AntsReview](./contracts/AntsReview.sol)\n\u003e AntsReview a bounty-like system for scientific peer-reviews rewarded in ANTS\n\nAntReview implements a bounty for scientific peer-reviews called AntReview where there are several key types of users:\n\n  - AntReview **Issuers** are addresses, added by the owner of the contract, that can issue an AntReview via the function *issueAntReview()*.\n  - AntReview **Approvers** are addresses added by Issuers when they issue an AntReview or with the function *addApprover()*.\n  - AntReview **Contributors** are any address which has made a contribution of ANTS to a given AntReview.\n  - AntReview **Peer-Reviewers** are addresses, added by the owner of the contract, that can fulfill an AntReview via the function *fulfillAntReview()*.\n  - AntReview **Submitters** are peer-reviers that submit a peer-review that can update their review via the function *updateReview()*.\n\nThere are several core actions in the lifecycle of an AntReview, which can be performed by certain users:\n\n  - **issueAntReview()** called by any Issuers to issu an AntReview, specifying the paper and requirements IPFS hash as well as issuers, approver and the deadline.\n  - **changeAntReview()** called by any *Issuers* specified in an AntReview that can update the details of the AntReview.\n  - **addApprover()** called by any *issuers* specified in an AntReview that can add an Approver.\n  - **removeApprover()** called by any *issuers* specified in an AntReview that can remove an Approver.\n  - **contribute()** called by any address that can send some ANTS to the AntReview of interest.\n  - **refund()** called by any *Contributors* that can get a refund once the deadline is elapsed with no peer-reviews accepted.\n  - **fulfillAntReview()** called by any *Peer-Reviewer* that can fulfill an AntReview, specyfing the IPFS hash of the peer-review.\n  - **updateAntReview()** called by any *Submitters* to update a specific Peer-Review, by specifying the new IPFS hash of the updated peer-review.\n  - **acceptAntReview()** called by any *Approver* to accept a peer-review for a specific AntReview and paying an amount of ANTS as reward.\n  - **withdrawReview()** called by any *issuers* specified in an AntReview that can withdraw an amount from the AntReview once the deadline is elapsed to get the residual balance.\n\n### [AntsReviewRoles](./contracts/AntsReviewRoles.sol)\n\u003e AntsReviewRoles Access Management for Default Admin, Issuer, Peer-Reviewer and Pauser Role\n\nAntsReviewRoles inherits AccessControl module by OpenZeppelin, allowing the owner of the contract to be set as Default Admin and Pauser and to add Issuers and Peer-Reviewers via **addIssuer()** and **addPeerReviewer()** and to remove these roles via **removeIssuer()**, **removePeerReviewer()** functions.\n\n### [ANTS](./contracts/ANTS.sol)\n\u003e ANTS Ants-Review's native token\n\nANTS is the ERC20 token used by the Ants-Review Protocol.  \nIt allows the owner of the contract, set as Default Admin, Minter and Pauser to add and remove a Minter via **addMinter()**, **removeMinter()** functions.\nThe minter is able create new ANTS tokens via **mint()** and the holder to burn them via the **burn()** function.  \n\nDuring deployment the contract sets the following ERC20 metadata:\n- name: \"Ants-Review\"\n- symbol: \"ANTS\"  \n\n### [AntsFaucet](./contracts/AntsFaucet.sol)\n\u003e AntsFaucet ANTS Faucet\n\nAntsFaucet implements an ANTS Faucet to be used on Kovan to test the Ants-Review Protocol.  \nAnyone can get 10 ANTS by calling the **withdraw()** function.\n\nSetup\n=====\n\nClone this GitHub repository.\n\n## Steps to compile and deploy\n\n  - Local dependencies:\n    - Truffle\n    - Ganache CLI\n    - OpenZeppelin Library v3.0\n    - Truffle HD Wallet Provider\n    - Truffle Flattener\n    ```sh\n    $ npm i\n    ```\n - Global dependencies:\n    - Truffle (recommended):\n    ```\n    npm install -g truffle\n    ```\n    - Ganache CLI (recommended):\n    ```\n    npm install -g ganache-cli\n    ```\n    - Slither (optional):\n    ```sh\n    $ git clone https://github.com/crytic/slither.git \u0026\u0026 cd slither\n    $ sudo python3 setup.py install\n    ```\n    - MythX CLI (optional):\n    ```sh\n    $ git clone git://github.com/dmuhs/mythx-cli\n    $ sudo python setup.py install\n    ```\n## Running the project with local test network (ganache-cli)\n\n   - Start ganache-cli with the following command (global dependency):\n     ```sh\n     $ ganache-cli\n     ```\n   - Compile the smart contract using Truffle with the following command (global dependency):\n     ```sh\n     $ truffle compile\n     ```\n   - Deploy the smart contracts using Truffle \u0026 Ganache with the following command (global dependency):\n     ```sh\n     $ truffle migrate\n     ```\n   - Test the smart contracts using Mocha \u0026 OpenZeppelin Test Environment with the following command:\n     ```sh\n     $ npm test\n     ```\n   - Analyze the smart contracts using Slither with the following command (optional):\n      ```sh\n      $ slither .\n      ```\n   - Analyze the smart contracts using MythX CLI with the following command (optional):\n     ```sh\n     $ mythx analyze    \n     ```\nDeploy\n======\n## Deploying on Kovan's Testnet\n  - Get an Ethereum Account on Metamask.\n  - On the landing page, click “Get Chrome Extension.”\n  - Create a .secret file cointaining the menomic.\n  - Get some test ether from a [Kovan's faucet](https://faucet.kovan.network/).\n  - Signup [Infura](https://infura.io/).\n  - Create new project.\n  - Copy the kovan URL into truffle-config.js.\n  - Uncomment the following lines in truffle-config.js:\n    ```\n    // const HDWalletProvider = require(\"@truffle/hdwallet-provider\");\n    // const infuraKey = '...';\n    // const infuraURL = 'https://rinkeby.infura.io/...';\n\n    // const fs = require('fs');\n    // const mnemonic = fs.readFileSync(\".secret\").toString().trim();\n    ```\n  - Install Truffle HD Wallet Provider:\n    ```sh\n    $ npm install @truffle/hdwallet-provider\n    ```\n  - Deploy the smart contract using Truffle \u0026 Infura with the following command:\n    ```sh\n    $ truffle migrate --network kovan\n    ```\n ## Project (PoC) deployed on Rinkeby\n [AntsReview.sol](https://rinkeby.etherscan.io/address/0x6956dF88120c44fb446761947cD4B83b553F229F)  \n\n ## Project (MVP) deployed on Kovan  \n [AntsReview.sol](https://kovan.etherscan.io/address/0x85be8F04482cBB920550d5469E4dEdD6e1788121)  \n [ANTS.sol](https://kovan.etherscan.io/address/0x7395e83BC988F3f2A9413920D510eC7D47610D08)  \n [AntsFaucet.sol](https://kovan.etherscan.io/address/0xA7ea29C2994700f39801740bd0cf580f96997Dbd)\n\n Using the DApp\n ==============\n  - Install [Ganache GUI](https://www.trufflesuite.com/ganache).\n  - Change Ganache GUI port to 8545.\n  - Import Ganache GUI mnemonic into MetaMask.\n  - Connect MetaMask to Ganache GUI, adding a custom RPC specifing the Ganache GUI's RPC server URL.\n  - Deploy the smart contracts to Ganache GUI:\n    ```sh\n    $ truffle migrate\n    ```\n  - Move to client directory on the project:\n    ```sh\n    $ cd client\n    ```\n  - Install dependencies:\n    ```sh\n    $ yarn install\n    ```\n  - Start the Local Web Server:\n    ```sh\n    $ npm run start\n    ```  \n\nFront-end\n=========\n- [PoC-UI](https://antsreview-poc.on.fleek.co)\n- [MVP-UI](https://ants-review.on.fleek.co/)\n\nInteracting with the PoC:\n=========================\n\n  - The User (Author) can issue a new AntReview, specifying:\n    - IPFS Hash of requirements (e.g. QmaozNR7DZHQK1ZcU9p7QdrshMvXqWK6gpu5rmrkPdT3L4);\n    - Timestamp of the deadline ([timestamp generator](https://www.unixtimestamp.com/));\n    - Ether value of the AntReview reward (e.g. 1 ETH);\n  - Switch Account on MetaMask (Peer-Reviewer) and Refresh the DApp.\n  - Fulfill the AntReview by specifying the AntReview Id and the IPFS Hash of the peer-review.\n  - Switch Account on MetaMask to the Issuer (Author) and Refresh the DApp.\n  - Accept the Fulfillment (Peer-Review) by specifying the AntReview Id and Peer-Review Id.\n  - The Peer-Reviewer Account will get the reward for the AntReview.\n  - Switch Account on MetaMask to the Issuer (Author) and Refresh the DApp.\n  - Cancel AntReview by specifying the AntReview Id (to be used after the deadline, if the AntReview has not received any fulfillments)\n  - The Issuer will get back the reward of the AntReview Id specified.\n  - Done.  \n\nAbout\n=====\n## Inspiration \u0026 References\n\n[![Awesome AntsReview](https://img.shields.io/badge/Awesome-AntsReview-orange)](https://github.com/naszam/awesome-antsreview/blob/master/README.md#references)\n\n- [Standard Bounties](https://github.com/Bounties-Network/StandardBounties/blob/master/contracts/StandardBounties.sol)\n- [Discover](https://github.com/dap-ps/discover/blob/master/contracts/Discover.sol)\n\n## Authors\nProject created by Team MetaBounty for ETHTurin 2020 Hackathon.  \n*Research, Design* by [Bianca Trovò](https://www.linkedin.com/in/bianca-m-trovo/)  \n*Smart Contracts and Architecture* by [Nazzareno Massari](http://nazzarenomassari.com)  \n*UI/UX* by [Mitrasish Mukherjee](https://www.linkedin.com/in/mmitrasish/)  \n*Pixel Art* by [Marcelo Colmenero](https://www.instagram.com/isometricpixelart/?hl=en)  \n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnaszam%2Fants-review","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fnaszam%2Fants-review","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnaszam%2Fants-review/lists"}