Giter VIP home page Giter VIP logo

soil's Introduction

Synthetic Crude Oil Token


sOil-icon


Tokenized Crude Oil smart contract provides broader access to trading and investment opportunities. It enables fractional trading of crude oil assets, reducing barriers and bypassing bureaucratic restrictions, allowing for more efficient and inclusive participation.

The project is available at https://soil-token.vercel.app/

About

Synthetic Crude Oil Token (sOIL) is not backed by a real-world commodity but rather by other cryptocurrencies, specifically WETH and DAI. DAI was chosen over other stablecoins because of its decentralized nature.

To mint sOIL, users deposit either WETH or DAI. To maintain price stability, sOIL requires 150% over-collateralization. For instance, to mint $100 worth of sOIL, a user must lock $150 worth of WETH or DAI. If the collateral or underlying asset prices fluctuate, causing the collateralization rate to drop below 150%, the position can be liquidated by other users who receive a 10% bonus in the underlying asset.

Liquidation mechanism

The liquidation mechanism ensures that the asset's value closely aligns with its underlying collateral. This is a common practice for stablecoins to keep their value pegged, usually around $1. When a stablecoin is backed by real dollars, the amount in the bank should match the number of tokens minted.

In our case, we aim for the synthetic crude oil token (sOIL) to mirror the value of real crude oil. To achieve this, users must maintain collateral assets exceeding the value of the sOIL they have minted. Due to the volatility of the underlying assets, a 1:1 collateral-to-token ratio would likely result in frequent liquidations. Therefore, over-collateralization is required.

If the health factor of a position drops below a specific threshold—for instance, if the collateral value falls below 150% of the sOIL value (a 1:1.5 ratio)—other users can liquidate that position. In the liquidation process, the minted sOIL is burned, and the liquidator receives the underlying collateral at a 10% discount as a reward. This discount incentivizes liquidators to maintain the system's stability.

Cross-chain data transfer

Since the WTI Crude Oil price is available only on Optimism Sepolia via Chainlink PriceFeeds, Chainlink CCIP is used to access this price on other networks. To update the price on a destination chain, users must call an update function on the source chain (Optimism). The system is designed to be self-regulating, and we believe users will actively update the price on networks where it is not directly available for the following reasons:

  • Incentive for Liquidators: If the Crude Oil price increases or collateral asset price decreases, liquidators are incentivized to update the price to liquidate under-collateralized positions and receive a 10% bonus.
  • Incentive for Users: Conversely, if the Crude Oil price decreases or collateral asset price increases, users are motivated to update the price to improve their health factor, avoid liquidation, and free up extra collateral assets.

Off-chain

Set up

  1. Clone this repository: git clone https://github.com/Zafei-Erin/soil.git
  2. Install dependencies: go to frontend and backend directory and run pnpm install respectively

Instructions

Frontend

  • Go to frontend directory.
  • Copy .env.example file to create .env file. Replace VITE_CONNECT_WALLET_PROJECTID with your own Connect Wallet project id.
  • To start frontend app locally, run pnpm run dev.

Backend

  • Go to backend directory.
  • Copy .env.example file to create .env file. Replace INFURA_API_KEY with your own Infura API key.
  • To start backend app locally, run pnpm run dev.

On-chain

Usage

Requirements

  • git git --version
  • foundry forge --version

Installation

Clone repo

git clone [email protected]:allelementary/synthetic-crude-oil.git

Install requirements with make

make

Run Tests

make test

Deploy Source (OP Sepolia) and Destination (Avalanche Fuji, Polygon Amoy) contracts

  1. Add parameters to .env:

    • PRIVATE_KEY
    • OPTIMISM_SCAN_API_KEY
    • OP_SEPOLIA_RPC_URL
    • FUJI_RPC_URL
    • AMOY_RPC_URL
  2. First Deploy sOIL on destination chains:

make deploy_oil ARGS='--network fuji'

make deploy_oil ARGS='--network amoy'

It would deploy CCIP Receiver.sol and sOilDestination contracts for each chain

  1. Update script/HelperConfig.sol receiver contract addresses:
    function getDestinationChainConfig() public pure returns (DestinationChainConfig memory config) {
        config = DestinationChainConfig({
            avalancheFujiChainSelector: 14767482510784806043,
            polygonAmoyChainSelector: 16281711391670634445,
-           avalancheFujiReceiver: 0xd6a80097825cB7957bD8bdA9676f8aDae35265BC,
-           polygonAmoyReceiver: 0x98243Ace02e8bF668f7a565b5bc6E79BF584a768
+           avalancheFujiReceiver: <deployed receiver address>,
+           polygonAmoyReceiver: <deployed receiver address>
        });
    }
  1. Deploy sOIL on source chain:
make deploy_oil ARGS='--network op_sepolia'

sOIL Contract Addresses

  • Optimism Sepolia: 0x929072C633F56E61391cB183EFbb5f1dA86Dc56a
  • Avalanche Fuji: 0x9774c3ed1dEC3F0829290E0616e2BFb1Cc26A75D
  • Polygon Amoy: 0x0cCe7D1668C3A72E8d5F6f3bDF7Bc6606f03D262

Custom token addresses

For the project custom ERC-20 tokens are used to represent WETH and DAI

Optimism Sepolia

  • WETH: 0x387FD5E4Ea72cF66f8eA453Ed648e64908f64104
  • DAI: 0xaf9B15aA0557cff606a0616d9B76B94887423022

Avalanche Fuji

  • WETH: 0x9991D14b93CD58fE8dD1A5a901608f18664225Ff
  • DAI: 0xC49E3c2b119026500cC442DA8D7c34316a1D3cF1

Polygon Amoy

  • WETH: 0x387FD5E4Ea72cF66f8eA453Ed648e64908f64104
  • DAI: 0xaf9B15aA0557cff606a0616d9B76B94887423022

Mint WETH and DAI tokens

To mint tokens for testing execute following command:

cast send <token-address> "mint(address,uint256)" <wallet-address> <amount-in-wei> --private-key <private_key> --rpc-url <rpc_url>

soil's People

Contributors

zafei-erin avatar allelementary avatar

Stargazers

 avatar

Watchers

 avatar

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.