forked from stakewithus/defi-by-example
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtest-compound-erc20-borrow.js
130 lines (112 loc) · 5.11 KB
/
test-compound-erc20-borrow.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
const { time } = require("@openzeppelin/test-helpers")
const assert = require("assert")
const BN = require("bn.js")
const { sendEther, pow } = require("./util")
const { DAI, DAI_WHALE, CDAI, WBTC, WBTC_WHALE, CWBTC } = require("./config")
const { web3 } = require("@openzeppelin/test-helpers/src/setup")
const IERC20 = artifacts.require("IERC20")
const CErc20 = artifacts.require("CErc20")
const TestCompoundErc20 = artifacts.require("TestCompoundErc20")
contract("TestCompoundErc20", (accounts) => {
const WHALE = WBTC_WHALE
const TOKEN = WBTC
const C_TOKEN = CWBTC
const TOKEN_TO_BORROW = DAI
const C_TOKEN_TO_BORROW = CDAI
const REPAY_WHALE = DAI_WHALE // used to repay interest on borrow
const SUPPLY_DECIMALS = 8
const SUPPLY_AMOUNT = pow(10, SUPPLY_DECIMALS).mul(new BN(1))
const BORROW_DECIMALS = 18
const BORROW_INTEREST = pow(10, BORROW_DECIMALS).mul(new BN(1000))
let testCompound
let token
let cToken
let tokenToBorrow
let cTokenToBorrow
beforeEach(async () => {
await sendEther(web3, accounts[0], WHALE, 1)
testCompound = await TestCompoundErc20.new(TOKEN, C_TOKEN)
token = await IERC20.at(TOKEN)
cToken = await CErc20.at(C_TOKEN)
tokenToBorrow = await IERC20.at(TOKEN_TO_BORROW)
cTokenToBorrow = await CErc20.at(C_TOKEN_TO_BORROW)
const supplyBal = await token.balanceOf(WHALE)
console.log(`suuply whale balance: ${supplyBal.div(pow(10, SUPPLY_DECIMALS))}`)
assert(supplyBal.gte(SUPPLY_AMOUNT), "bal < supply")
const borrowBal = await tokenToBorrow.balanceOf(REPAY_WHALE)
console.log(`repay whale balance: ${borrowBal.div(pow(10, BORROW_DECIMALS))}`)
assert(borrowBal.gte(BORROW_INTEREST), "bal < borrow interest")
})
const snapshot = async (testCompound, tokenToBorrow) => {
const { liquidity } = await testCompound.getAccountLiquidity()
const colFactor = await testCompound.getCollateralFactor()
const supplied = await testCompound.balanceOfUnderlying.call()
const price = await testCompound.getPriceFeed(C_TOKEN_TO_BORROW)
const maxBorrow = liquidity.div(price)
const borrowedBalance = await testCompound.getBorrowedBalance.call(C_TOKEN_TO_BORROW)
const tokenToBorrowBal = await tokenToBorrow.balanceOf(testCompound.address)
const borrowRate = await testCompound.getBorrowRatePerBlock.call(C_TOKEN_TO_BORROW)
return {
colFactor: colFactor.div(pow(10, 18 - 2)) / 100,
supplied: supplied.div(pow(10, SUPPLY_DECIMALS - 2)) / 100,
price: price.div(pow(10, 18 - 2)) / 100,
liquidity: liquidity.div(pow(10, 18)),
maxBorrow,
borrowedBalance: borrowedBalance.div(pow(10, BORROW_DECIMALS - 2)) / 100,
tokenToBorrowBal: tokenToBorrowBal.div(pow(10, BORROW_DECIMALS - 2)) / 100,
borrowRate,
}
}
it("should supply, borrow and repay", async () => {
// used for debugging
let tx
let snap
// supply
await token.approve(testCompound.address, SUPPLY_AMOUNT, { from: WHALE })
tx = await testCompound.supply(SUPPLY_AMOUNT, {
from: WHALE,
})
// borrow
snap = await snapshot(testCompound, tokenToBorrow)
console.log(`--- borrow (before) ---`)
console.log(`col factor: ${snap.colFactor} %`)
console.log(`supplied: ${snap.supplied}`)
console.log(`liquidity: $ ${snap.liquidity}`)
console.log(`price: $ ${snap.price}`)
console.log(`max borrow: ${snap.maxBorrow}`)
console.log(`borrowed balance (compound): ${snap.borrowedBalance}`)
console.log(`borrowed balance (erc20): ${snap.tokenToBorrowBal}`)
console.log(`borrow rate: ${snap.borrowRate}`)
tx = await testCompound.borrow(C_TOKEN_TO_BORROW, BORROW_DECIMALS, { from: WHALE })
// for (const log of tx.logs) {
// console.log(log.event, log.args.message, log.args.val.toString())
// }
snap = await snapshot(testCompound, tokenToBorrow)
console.log(`--- borrow (after) ---`)
console.log(`liquidity: $ ${snap.liquidity}`)
console.log(`max borrow: ${snap.maxBorrow}`)
console.log(`borrowed balance (compound): ${snap.borrowedBalance}`)
console.log(`borrowed balance (erc20): ${snap.tokenToBorrowBal}`)
// accrue interest on borrow
const block = await web3.eth.getBlockNumber()
await time.advanceBlockTo(block + 100)
snap = await snapshot(testCompound, tokenToBorrow)
console.log(`--- after some blocks... ---`)
console.log(`liquidity: $ ${snap.liquidity}`)
console.log(`max borrow: ${snap.maxBorrow}`)
console.log(`borrowed balance (compound): ${snap.borrowedBalance}`)
console.log(`borrowed balance (erc20): ${snap.tokenToBorrowBal}`)
// repay
await tokenToBorrow.transfer(testCompound.address, BORROW_INTEREST, { from: REPAY_WHALE })
const MAX_UINT = pow(2, 256).sub(new BN(1))
tx = await testCompound.repay(TOKEN_TO_BORROW, C_TOKEN_TO_BORROW, MAX_UINT, {
from: REPAY_WHALE,
})
snap = await snapshot(testCompound, tokenToBorrow)
console.log(`--- repay ---`)
console.log(`liquidity: $ ${snap.liquidity}`)
console.log(`max borrow: ${snap.maxBorrow}`)
console.log(`borrowed balance (compound): ${snap.borrowedBalance}`)
console.log(`borrowed balance (erc20): ${snap.tokenToBorrowBal}`)
})
})