Skip to content

Commit

Permalink
Merge pull request #864 from DeFiCh/f/auction_functionnal_tests
Browse files Browse the repository at this point in the history
Additional functional tests for auction batches
  • Loading branch information
prasannavl authored Nov 2, 2021
2 parents cec60e4 + 4283aeb commit ea427cc
Showing 1 changed file with 184 additions and 3 deletions.
187 changes: 184 additions & 3 deletions test/functional/feature_loan_auctions.py
Original file line number Diff line number Diff line change
Expand Up @@ -56,12 +56,12 @@ def run_test(self):

# setup oracle
oracle_address1 = self.nodes[0].getnewaddress("", "legacy")
price_feeds1 = [{"currency": "USD", "token": "DFI"}, {"currency": "USD", "token": "BTC"}, {"currency": "USD", "token": "TSLA"}, {"currency": "USD", "token": "GOOGL"}]
price_feeds1 = [{"currency": "USD", "token": "DFI"}, {"currency": "USD", "token": "BTC"}, {"currency": "USD", "token": "TSLA"}, {"currency": "USD", "token": "GOOGL"}, {"currency": "USD", "token": "TWTR"}, {"currency": "USD", "token": "MSFT"}]
oracle_id1 = self.nodes[0].appointoracle(oracle_address1, price_feeds1, 10)
self.nodes[0].generate(1)

# feed oracle
oracle1_prices = [{"currency": "USD", "tokenAmount": "100@TSLA"}, {"currency": "USD", "tokenAmount": "100@GOOGL"}, {"currency": "USD", "tokenAmount": "100@DFI"}, {"currency": "USD", "tokenAmount": "100@BTC"}]
oracle1_prices = [{"currency": "USD", "tokenAmount": "100@TSLA"}, {"currency": "USD", "tokenAmount": "100@GOOGL"}, {"currency": "USD", "tokenAmount": "100@TWTR"}, {"currency": "USD", "tokenAmount": "100@MSFT"}, {"currency": "USD", "tokenAmount": "100@DFI"}, {"currency": "USD", "tokenAmount": "100@BTC"}]
timestamp = calendar.timegm(time.gmtime())
self.nodes[0].setoracledata(oracle_id1, timestamp, oracle1_prices)
self.nodes[0].generate(6)
Expand All @@ -87,12 +87,26 @@ def run_test(self):
'fixedIntervalPriceId': "GOOGL/USD",
'mintable': True,
'interest': 1})
self.nodes[0].setloantoken({
'symbol': "TWTR",
'name': "Twitter",
'fixedIntervalPriceId': "TWTR/USD",
'mintable': True,
'interest': 1})
self.nodes[0].setloantoken({
'symbol': "MSFT",
'name': "Microsoft",
'fixedIntervalPriceId': "MSFT/USD",
'mintable': True,
'interest': 1})
self.nodes[0].generate(6) # let active price update

idDFI = list(self.nodes[0].gettoken("DFI").keys())[0]
iddUSD = list(self.nodes[0].gettoken("DUSD").keys())[0]
idTSLA = list(self.nodes[0].gettoken("TSLA").keys())[0]
idGOOGL = list(self.nodes[0].gettoken("GOOGL").keys())[0]
idTWTR = list(self.nodes[0].gettoken("TWTR").keys())[0]
idMSFT = list(self.nodes[0].gettoken("MSFT").keys())[0]
poolOwner = self.nodes[0].getnewaddress("", "legacy")

# create pool DUSD-TSLA
Expand All @@ -116,6 +130,26 @@ def run_test(self):
"pairSymbol": "DUSD-GOOGL",
}, [])

# create pool DUSD-TWTR
self.nodes[0].createpoolpair({
"tokenA": iddUSD,
"tokenB": idTWTR,
"commission": Decimal('0.002'),
"status": True,
"ownerAddress": poolOwner,
"pairSymbol": "DUSD-TWTR",
}, [])

# create pool DUSD-MSFT
self.nodes[0].createpoolpair({
"tokenA": iddUSD,
"tokenB": idMSFT,
"commission": Decimal('0.002'),
"status": True,
"ownerAddress": poolOwner,
"pairSymbol": "DUSD-MSFT",
}, [])

# create pool DUSD-DFI
self.nodes[0].createpoolpair({
"tokenA": iddUSD,
Expand All @@ -130,6 +164,8 @@ def run_test(self):
# Mint tokens
self.nodes[0].minttokens("3000@TSLA")
self.nodes[0].minttokens("3000@GOOGL")
self.nodes[0].minttokens("3000@TWTR")
self.nodes[0].minttokens("3000@MSFT")
self.nodes[0].minttokens("6500@DUSD")
self.nodes[0].generate(1)

Expand All @@ -143,6 +179,16 @@ def run_test(self):
account: ["1000@DUSD", "1000@GOOGL"]
}, account, [])

# Add liquidity to DUSD-TWTR
self.nodes[0].addpoolliquidity({
account: ["1000@DUSD", "1000@TWTR"]
}, account, [])

# Add liquidity to DUSD-MSFT
self.nodes[0].addpoolliquidity({
account: ["1000@DUSD", "1000@MSFT"]
}, account, [])

# Add liquidity to DUSD-DFI
self.nodes[0].addpoolliquidity({
account: ["1000@DUSD", "1000@DFI"]
Expand All @@ -152,6 +198,7 @@ def run_test(self):
# Case 1
# Create loan schemes
self.nodes[0].createloanscheme(200, 1, 'LOAN200')
self.nodes[0].createloanscheme(120, 5, 'LOAN120')
self.nodes[0].generate(1)

# Create vault
Expand Down Expand Up @@ -350,7 +397,7 @@ def run_test(self):
vault5 = self.nodes[0].getvault(vaultId5)
assert_equal(len(vault5["batches"]), 4)

# Case 7 Test multi loans
# Case 6 Test two loan token
# Reset prices
oracle1_prices = [{"currency": "USD", "tokenAmount": "100@TSLA"}, {"currency": "USD", "tokenAmount": "100@GOOGL"}, {"currency": "USD", "tokenAmount": "100@DFI"}, {"currency": "USD", "tokenAmount": "100@BTC"}]
timestamp = calendar.timegm(time.gmtime())
Expand Down Expand Up @@ -398,5 +445,139 @@ def run_test(self):
assert_equal(collateralDFI, Decimal('200.00000000'))
assert_equal(collateralBTC, Decimal('200.00000000'))

# Case 7 With max possible oracle deviation. Loantoken value 100 -> 129 && collateral value 100 -> 71
# Loan value should end up greater than collateral value
# Reset prices
oracle1_prices = [{"currency": "USD", "tokenAmount": "100@TSLA"}, {"currency": "USD", "tokenAmount": "100@DFI"}]
timestamp = calendar.timegm(time.gmtime())
self.nodes[0].setoracledata(oracle_id1, timestamp, oracle1_prices)
self.nodes[0].generate(12) # let price update

vaultId7 = self.nodes[0].createvault(account, 'LOAN120')
self.nodes[0].generate(1)

self.nodes[0].deposittovault(vaultId7, account, '100@DFI')
self.nodes[0].generate(1)

# Take TSLA loan
self.nodes[0].takeloan({
'vaultId': vaultId7,
'amounts': "80@TSLA"})
self.nodes[0].generate(1)

oracle1_prices = [{"currency": "USD", "tokenAmount": "129@TSLA"}, {"currency": "USD", "tokenAmount": "71@DFI"}]
timestamp = calendar.timegm(time.gmtime())
self.nodes[0].setoracledata(oracle_id1, timestamp, oracle1_prices)
self.nodes[0].generate(12) # let price update and trigger liquidation of vault
vault7 = self.nodes[0].getvault(vaultId7)

batches = vault7['batches']
assert_equal(len(batches), 1)

loan_amount = batches[0]["loan"].split("@")[0]
loan_value = float(loan_amount) * 129 # TSLA USD value
collateral_amount = batches[0]["collaterals"][0].split("@")[0]
collateral_value = float(collateral_amount) * 71 # DFI USD value
assert(loan_value > collateral_value)

# Case 8 With max possible oracle deviation. Loantoken value 100 -> 129 && collateral value 100 -> 71. Multi tokens
# Reset prices
oracle1_prices = [{"currency": "USD", "tokenAmount": "100@TSLA"}, {"currency": "USD", "tokenAmount": "100@GOOGL"}, {"currency": "USD", "tokenAmount": "100@DFI"}, {"currency": "USD", "tokenAmount": "100@BTC"}]
timestamp = calendar.timegm(time.gmtime())
self.nodes[0].setoracledata(oracle_id1, timestamp, oracle1_prices)
self.nodes[0].generate(12) # let price update

vaultId7 = self.nodes[0].createvault(account, 'LOAN120')
self.nodes[0].generate(1)

self.nodes[0].deposittovault(vaultId7, account, '100@DFI')
self.nodes[0].generate(1)
self.nodes[0].deposittovault(vaultId7, account, '100@BTC')
self.nodes[0].generate(1)

# Take TSLA loan
self.nodes[0].takeloan({
'vaultId': vaultId7,
'amounts': "100@TSLA"})
# Take GOOGL loan
self.nodes[0].takeloan({
'vaultId': vaultId7,
'amounts': "60@GOOGL"})
self.nodes[0].generate(1)

oracle1_prices = [{"currency": "USD", "tokenAmount": "129@TSLA"}, {"currency": "USD", "tokenAmount": "129@GOOGL"}, {"currency": "USD", "tokenAmount": "71@DFI"}, {"currency": "USD", "tokenAmount": "71@BTC"}]
timestamp = calendar.timegm(time.gmtime())
self.nodes[0].setoracledata(oracle_id1, timestamp, oracle1_prices)
self.nodes[0].generate(12) # let price update and trigger liquidation of vault
vault7 = self.nodes[0].getvault(vaultId7)

batches = vault7['batches']
assert_equal(len(batches), 2)
for batch in batches:
assert_equal(len(batch['collaterals']), 2)
loan_amount_TSLA = batches[0]["loan"].split("@")[0]
loan_value_TSLA = float(loan_amount_TSLA) * 129 # TSLA USD value
collateral_amount = float(batches[0]["collaterals"][0].split("@")[0]) + float(batches[0]["collaterals"][1].split("@")[0])
collateral_value = collateral_amount * 71 # collaterals USD value
assert(loan_value_TSLA > collateral_value)

loan_amount_GOOGL = batches[1]["loan"].split("@")[0]
loan_value_GOOGL = float(loan_amount_GOOGL) * 129 # GOOGL USD value
collateral_amount = float(batches[1]["collaterals"][0].split("@")[0]) + float(batches[1]["collaterals"][1].split("@")[0])
collateral_value = float(collateral_amount) * 71 # collaterals USD value
assert(loan_value_GOOGL > collateral_value)

# Case 9 Auction with dust amount
# Reset prices
oracle1_prices = [{"currency": "USD", "tokenAmount": "100@TSLA"}, {"currency": "USD", "tokenAmount": "100@GOOGL"}, {"currency": "USD", "tokenAmount": "100@TWTR"}, {"currency": "USD", "tokenAmount": "100@MSFT"}, {"currency": "USD", "tokenAmount": "100@DFI"}, {"currency": "USD", "tokenAmount": "100@BTC"}]
timestamp = calendar.timegm(time.gmtime())
self.nodes[0].setoracledata(oracle_id1, timestamp, oracle1_prices)
self.nodes[0].generate(12) # let price update

vaultId8 = self.nodes[0].createvault(account, 'LOAN200')
self.nodes[0].generate(1)

self.nodes[0].deposittovault(vaultId8, account, '100@DFI')
self.nodes[0].generate(1)
self.nodes[0].deposittovault(vaultId8, account, '100@BTC')
self.nodes[0].generate(1)

# Take TSLA loan
self.nodes[0].takeloan({
'vaultId': vaultId8,
'amounts': "25@TSLA"})

# Take GOOGL loan
self.nodes[0].takeloan({
'vaultId': vaultId8,
'amounts': "25@GOOGL"})

# Take TWTR loan
self.nodes[0].takeloan({
'vaultId': vaultId8,
'amounts': "25@TWTR"})

# Take MSFT loan
self.nodes[0].takeloan({
'vaultId': vaultId8,
'amounts': "25@MSFT"})
self.nodes[0].generate(1)

vault8 = self.nodes[0].getvault(vaultId8)

oracle1_prices = [{"currency": "USD", "tokenAmount": "300@TSLA"}, {"currency": "USD", "tokenAmount": "300@GOOGL"}, {"currency": "USD", "tokenAmount": "300@TWTR"}, {"currency": "USD", "tokenAmount": "300@MSFT"}, {"currency": "USD", "tokenAmount": "200.0001@DFI"}, {"currency": "USD", "tokenAmount": "200.0001@BTC"}]
timestamp = calendar.timegm(time.gmtime())
self.nodes[0].setoracledata(oracle_id1, timestamp, oracle1_prices)
self.nodes[0].generate(12) # let price update and trigger liquidation of vault

vault8 = self.nodes[0].getvault(vaultId8)
batches = vault8['batches']
assert_equal(len(batches), 8)
batches = sorted(batches, key=lambda k: k['loan'])
assert_equal(batches[0]["loan"], '0.00001251@GOOGL')
assert_equal(batches[1]["loan"], '0.00001251@MSFT')
assert_equal(batches[2]["loan"], '0.00001251@TSLA')
assert_equal(batches[3]["loan"], '0.00001251@TWTR')

if __name__ == '__main__':
AuctionsTest().main()

0 comments on commit ea427cc

Please sign in to comment.