/farming

Primary LanguageJavaScriptMIT LicenseMIT

1inch network

Farming contracts

Build Status Coverage Status

About

This repository offers 2 ways to have farming (incentives). Highly recommend to use second option for pools/share/utility tokens by deriving them from ERC20Farmable smart contract. If it's too late you should consider first option as well:

  1. FarmingPool.sol offers smart contract where you can stake/deposit specific tokens to get continiously distributed rewards.
  2. ERC20Farmable.sol allows derived tokens to have farming without necessarity to stake/deposit token into pool. Moreover it allows to have multiple farmings simultaneously and setup new farms permissionlessly.

Installation

!!! NOTICE: WAIT UNTILL FULLY AUDITED !!!

$ npm install @1inch/farming

or

$ yarn add @1inch/farming

Usage

!!! NOTICE: WAIT UNTILL FULLY AUDITED !!!

Once installed, you can use the contracts in the library by importing them. Just use ERC20Farmable instead of ERC20 to derive from:

pragma solidity ^0.8.0;

import "@1inch/farming/contracts/ERC20Farmable.sol";

contract MyAmazingPool is ERC20Farmable {
    constructor() ERC20("MyCollectible", "MCO") {
    }
}

Optimizations

  • Storage access:
    • 1 storage slot for farming params, updated only on farming restarting:

      uint40 public finished;
      uint40 public duration;
      uint176 public reward;
    • 1 storage slot for farming state, updated only on changing number of farming tokens:

      uint40 public farmedPerTokenUpdated;
      uint216 public farmedPerTokenStored;
    • 1 storage slot per each farmer, updated on deposits/withdrawals (kudos to @snjax):

      mapping(address => int256) public userCorrection;
  • Compact address array is used for storing farms per user/wallet. Array length is stored in high bits of the first array item: