DeFi & LoanShark - Polygon Week 3
Tags: blockchain, webdev, beginners
Published: 2022-07-03 21:06:44

Part of [Polygon Fellowship 2022](https://polygon.technology/polygon-fellowship/).

gm

Decentralized Finance (DeFi) has been the most interesting topic in blockchain not just for me but for many folks, simply because it provides a new way of dealing with finances that we never saw before.

In this post, I'll share what I created in the DeFi space as part of my fellowship and a brief about my research into some interesting topics.

## Borrowing Dapp
The base for this project was [an assignment in Polygon Academy](https://academy.polygon.technology/module-6-warrior-challenge/midterm-assignment-2). The assignment merely gives us the statement:

> Build a borrowing dapp that let's a user submit Ether to a smart contract as collateral and receive stablecoin as a loan. Have this be a web interface with text field input and a button to submit. Get creative!

As you can see, there is a very basic problem statement given, which leaves us with a lot of room for creativity!

So let's think of a smart contract that loans a certain stablecoin at a fixed ratio in return for Ether/Matic. Then when the user has to repay, a small `fee` will be taken from the Ether that will be returned to the user.
This ratio and fee can be updated by the owner.

What I also thought is, why not let the stablecoin be changed? But then, the existing loans should have been repaid.
So, we can introduce another functionality that is whether the loan contract is `active` or not. If it is not active, borrowing won't take place but user's can repay their stablecoin to get back the ether.

I am calling this contract **LoanShark**. If you have played GTA Vice City you will be very familiar with this 🙂

For my smart contract example, I have chosen to create my own ERC20 token called SharkUSDC/sUSDC.
I thought of creating my own stablecoin for this exercise, but decided against it for now. I think it would be a good future prospect, so definitely check out my upcoming posts!

Also, since you can use any ERC20 token, you can set an actual stablecoin for loans and then transfer the coins to the contract and it will be operational.
With this approach, the drawback in my current iteration of code is that since the supply is not in our control, anyone can repay a lot of stablecoin to get ether since a mapping is not there. This can be an upgrade soon.

### Challenges
There were a lot of issues to deal with on the Smart Contract side of things.

First of all, there was a problem with multiplication when I was calculating the amount for borrow/repay. Multiplying two `uint256` variables results in 10<sup>18</sup> being multiplied twice. This cost me a lot of time to figure out. To solve it I just divided the final result once by 10<sup>18</sup>.

The second issue is something I haven't been able to resolve yet. I tried verifying my contract by using [Hardhat's Verify Task](https://hardhat.org/plugins/nomiclabs-hardhat-etherscan#tasks) which always works. It worked for my ERC20 token but didn't work for my LoanShark contract.
LoanShark takes three things in its constructor:
1. Stablecoin address
2. Ratio
3. Fee
Address is passed as a string, and fee is passed as 0. All good, they all work. But then ratio cannot be zero. And to pass it as "1" for One-to-One ETH-Stablecoin mapping, I have to multiply it with 10<sup>18</sup> so that it is stored correctly. 

This didn't work on the command line. Can't pass this large of a value. 

Then I came across [a hardhat article](https://hardhat.org/plugins/nomiclabs-hardhat-etherscan#complex-arguments) that describes how we can pass complex arguments for verification.
We can pass arguments by exporting it from an `arguments.js` file.

An Example is my own `arguments.js`:
```js
const { parseEther } = require("ethers/lib/utils");

module.exports = [
    "0x1AfE5e07f6c6f092494DA8423708c412939B6906",
    parseEther('1'),
    0
]
```

Unfortunately, for whatever reason, this was passed to Etherscan but did not get verified. 😞

I'll update if this issue is resolved, but this is heartbreaking. I need to see the green tick of my verified contract on etherscan. ✅

**UPDATE**: It got verified! The fix was to convert the BigNumber returned from `parseEther` to a string with the `toString` method of BigNumber. Passing the value as a string myself didn't work, but this did.
You can access the verified contract at: https://goerli.etherscan.io/address/0x2162Ba3A993BC8442CEE02340693D1818bbB6826

### Links
Check out the site at http://loanshark2.surge.sh.
Devfolio project: https://devfolio.co/projects/loanshark-cd70

## Uniswapper
In my post about Week 2, I mentioned that I had been working on **Uniswapper**, my contract that handles swapping by using Uniswap's contracts. I fiddled with it a bit more in the Add Liquidity part and got it to work perfectly as I wanted:
Deposit just ETH and it will split evenly and add liquidity.

A problem before which I didn't think would happen is leftover tokens. I read and understood that in some uniswap functions if you provided say more ETH than necessary for the transaction, it will refund that ETH back to the user. But here the user is the Smart Contract and not the actual user, so we need to refund both the ETH and the Tokens in case this happens.

## Chainlink
In the DeFi world, everything runs around the price of assets. Oracles (plural, not the company) are used to get price data on-chain or off-chain. 
A widely-used protocol is the Oracle Chainlink which brings off-chain data to the blockchain. So you can actually compare prices with real-world values like fiat currencies USD/EUR and actual listed stocks.

You can use Oracle's `latestAnswer` variable in their `PriceConsumerV3` contracts by calling it from the frontend or from your Solidity Smart Contracts.  
There have a great tutorial [here](https://docs.chain.link/docs/get-the-latest-price/) if you want a quickstart.

My implementation is here: https://github.com/neelansh15/Chainlink-Price-Consumer

## Research Topic
We had to research on an assigned web3 project. My assigned project is [Polymarket](https://polymarket.com/), a decentralized betting and information platform. I might create a separate post for that, so stay tuned!

gn