Skip to content

Commit

Permalink
Fix changes on HEAD-7ef68b5 (#781)
Browse files Browse the repository at this point in the history
* fix conflicts

* refix vault new resp

* revert getvault precision

* better get/list vault resp type

* fix vault type

* undefined if err

* remove txn loan payback

* remain 7ef68b5

* rm txn loanpack

* rm export on md

* diff get list vault resp

* Remove extra break line

* fix updateloantoken dftx char

Co-authored-by: jingyi2811 <[email protected]>
  • Loading branch information
canonbrother and jingyi2811 authored Oct 28, 2021
1 parent 554cf44 commit 5e89a4b
Show file tree
Hide file tree
Showing 16 changed files with 135 additions and 123 deletions.
73 changes: 35 additions & 38 deletions docs/node/RPC Category/16-loan.md
Original file line number Diff line number Diff line change
Expand Up @@ -358,20 +358,31 @@ interface loan {
getVault (vaultId: string): Promise<VaultDetails>
}

enum VaultState {
UNKNOWN = 'unknown',
ACTIVE = 'active',
IN_LIQUIDATION = 'inliquidation',
FROZEN = 'frozen',
MAY_LIQUIDATE = 'mayliquidate',
FROZEN_IN_LIQUIDATION = 'lockedinliquidation'
}

interface VaultDetails {
vaultId: string
loanSchemeId: string
ownerAddress: string
isUnderLiquidation: boolean
invalidPrice: boolean
state: VaultState
liquidationHeight?: number
liquidationPenalty?: number
batchCount?: number
batches?: AuctionBatchDetails[]
collateralAmounts?: string[]
loanAmounts?: string[]
interestAmounts?: string[]
collateralValue?: BigNumber
loanValue?: BigNumber
interestValue?: BigNumber,
currentRatio?: BigNumber
interestValue?: BigNumber | string // empty string if nothing
currentRatio?: number
}

interface AuctionBatchDetails {
Expand All @@ -381,29 +392,22 @@ interface AuctionBatchDetails {
}
```

## closeVault
## listVaults

Close vault.
List all available vaults.

```ts title="client.loan.closeVault()"
```ts title="client.loan.listVaults()"
interface loan {
closeVault (closeVault: CloseVault, utxos: UTXO[] = []): Promise<string>
listVaults (pagination: VaultPagination = {}, options: ListVaultOptions = {}): Promise<ListVaultDetails[]>
}

interface CloseVault {
interface ListVaultDetails {
vaultId: string
to: string
loanSchemeId: string
ownerAddress: string
isUnderLiquidation: boolean
}
```

## listVaults

List all available vaults.

```ts title="client.loan.listVaults()"
interface loan {
listVaults (pagination: VaultPagination = {}, options: ListVaultOptions = {}): Promise<VaultDetails[]>
}

interface ListVaultOptions {
ownerAddress?: string
Expand All @@ -416,27 +420,20 @@ interface VaultPagination {
including_start?: boolean
limit?: number
}
```

interface VaultDetails {
vaultId: string
loanSchemeId: string
ownerAddress: string
isUnderLiquidation: boolean
invalidPrice: boolean
batches?: AuctionBatchDetails[]
collateralAmounts?: string[]
loanAmounts?: string[]
interestAmounts?: string[]
collateralValue?: BigNumber
loanValue?: BigNumber
interestValue?: BigNumber,
currentRatio?: BigNumber
## closeVault

Close vault.

```ts title="client.loan.closeVault()"
interface loan {
closeVault (closeVault: CloseVault, utxos: UTXO[] = []): Promise<string>
}

interface AuctionBatchDetails {
index: BigNumber
collaterals: string[]
loan: string
interface CloseVault {
vaultId: string
to: string
}
```

Expand Down Expand Up @@ -491,7 +488,7 @@ interface loan {
loanPayback (metadata: LoanPaybackMetadata, utxos: UTXO[] = []): Promise<string>
}

export interface LoanPaybackMetadata {
interface LoanPaybackMetadata {
vaultId: string
amounts: string | string[] // amount@symbol
from: string
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -250,7 +250,7 @@ describe('Loan', () => {

it('should not closeVault for liquidated vault', async () => {
const liqVault = await tGroup.get(0).container.call('getvault', [vaultWithLiquidationId])
expect(liqVault.isUnderLiquidation).toStrictEqual(true)
expect(liqVault.state).toStrictEqual('inliquidation')

const promise = tGroup.get(0).rpc.loan.closeVault({ vaultId: vaultWithLiquidationId, to: await tGroup.get(0).generateAddress() })
await expect(promise).rejects.toThrow('RpcApiError: \'Vault is under liquidation.\', code: -26, method: closevault')
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import { LoanMasterNodeRegTestContainer } from './loan_container'
import BigNumber from 'bignumber.js'
import { Testing } from '@defichain/jellyfish-testing'
import { GenesisKeys } from '@defichain/testcontainers'
import { VaultState } from '../../../src/category/loan'

describe('Loan createVault', () => {
const container = new LoanMasterNodeRegTestContainer()
Expand Down Expand Up @@ -48,8 +49,7 @@ describe('Loan createVault', () => {
vaultId: vaultId,
loanSchemeId: 'scheme',
ownerAddress: ownerAddress,
isUnderLiquidation: false,
invalidPrice: false,
state: VaultState.ACTIVE,
collateralAmounts: [],
loanAmounts: [],
interestAmounts: [],
Expand All @@ -76,8 +76,7 @@ describe('Loan createVault', () => {
vaultId: vaultId,
loanSchemeId: 'default', // Get default loan scheme
ownerAddress: ownerAddress,
isUnderLiquidation: false,
invalidPrice: false,
state: VaultState.ACTIVE,
collateralAmounts: [],
loanAmounts: [],
interestAmounts: [],
Expand Down Expand Up @@ -125,8 +124,7 @@ describe('Loan createVault', () => {
vaultId: vaultId,
loanSchemeId: 'scheme',
ownerAddress: GenesisKeys[0].owner.address,
isUnderLiquidation: false,
invalidPrice: false,
state: VaultState.ACTIVE,
collateralAmounts: [],
loanAmounts: [],
interestAmounts: [],
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -170,7 +170,7 @@ describe('Loan depositToVault', () => {
const vaultBefore = await tGroup.get(0).container.call('getvault', [vaultId])
expect(vaultBefore.loanSchemeId).toStrictEqual('scheme')
expect(vaultBefore.ownerAddress).toStrictEqual(vaultAddress)
expect(vaultBefore.isUnderLiquidation).toStrictEqual(false)
expect(vaultBefore.state).toStrictEqual('active')
expect(vaultBefore.loanAmounts).toStrictEqual([])
expect(vaultBefore.loanValue).toStrictEqual(0)
expect(vaultBefore.currentRatio).toStrictEqual(-1) // empty loan
Expand All @@ -191,7 +191,7 @@ describe('Loan depositToVault', () => {
// check the changes after deposit
expect(vaultAfter.loanSchemeId).toStrictEqual(vaultBefore.loanSchemeId)
expect(vaultAfter.ownerAddress).toStrictEqual(vaultBefore.ownerAddress)
expect(vaultAfter.isUnderLiquidation).toStrictEqual(vaultBefore.isUnderLiquidation)
expect(vaultAfter.state).toStrictEqual(vaultBefore.state)
expect(vaultAfter.loanAmounts).toStrictEqual(vaultBefore.loanAmounts)
expect(vaultAfter.loanValue).toStrictEqual(vaultBefore.loanValue)
expect(vaultAfter.currentRatio).toStrictEqual(vaultBefore.currentRatio)
Expand Down Expand Up @@ -319,7 +319,7 @@ describe('Loan depositToVault', () => {
await tGroup.get(0).generate(6)

const liqVault = await tGroup.get(0).container.call('getvault', [liqVaultId])
expect(liqVault.isUnderLiquidation).toStrictEqual(true)
expect(liqVault.state).toStrictEqual('inliquidation')

const promise = tGroup.get(0).rpc.loan.depositToVault({
vaultId: liqVaultId, from: collateralAddress, amount: '1000@DFI'
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { LoanMasterNodeRegTestContainer } from './loan_container'
import { Testing } from '@defichain/jellyfish-testing'
import BigNumber from 'bignumber.js'
import { VaultState } from '../../../src/category/loan'

describe('Loan getVault', () => {
const container = new LoanMasterNodeRegTestContainer()
Expand Down Expand Up @@ -72,15 +73,14 @@ describe('Loan getVault', () => {
vaultId: vaultId,
loanSchemeId: 'default', // Get default loan scheme
ownerAddress: ownerAddress,
isUnderLiquidation: false,
invalidPrice: false,
state: VaultState.ACTIVE,
collateralAmounts: [],
loanAmounts: [],
interestAmounts: [],
collateralValue: expect.any(BigNumber),
loanValue: expect.any(BigNumber),
interestValue: '',
currentRatio: expect.any(BigNumber)
currentRatio: expect.any(Number)
})
})

Expand All @@ -99,16 +99,15 @@ describe('Loan getVault', () => {
vaultId: vaultId,
loanSchemeId: 'default', // Get default loan scheme
ownerAddress: ownerAddress,
isUnderLiquidation: false,
invalidPrice: false,
state: VaultState.ACTIVE,
collateralAmounts: ['10000.00000000@DFI', '1.00000000@BTC'],
loanAmounts: [],
interestAmounts: [],
// (10000 DFI * DFIUSD Price * DFI collaterization factor 1) + (1BTC * BTCUSD Price * BTC collaterization factor 0.5)
collateralValue: new BigNumber(10000 * 1 * 1).plus(new BigNumber(1 * 10000 * 0.5)),
loanValue: new BigNumber(0),
interestValue: '',
currentRatio: new BigNumber(-1)
currentRatio: -1
})
})

Expand All @@ -130,14 +129,13 @@ describe('Loan getVault', () => {
const interestInfo: any = await testing.rpc.call('getinterest', ['default', 'TSLA'], 'bignumber')

const data = await testing.rpc.loan.getVault(vaultId)
const currentRatioValue: string = data.collateralValue?.dividedBy(data.loanValue as BigNumber).multipliedBy(100).toFixed(0, 4) as string
const currentRatioValue: number = data.collateralValue?.dividedBy(data.loanValue as BigNumber).multipliedBy(100).toNumber() as number

expect(data).toStrictEqual({
vaultId: vaultId,
loanSchemeId: 'default', // Get default loan scheme
ownerAddress: ownerAddress,
isUnderLiquidation: false,
invalidPrice: false,
state: VaultState.ACTIVE,
collateralAmounts: ['10000.00000000@DFI', '1.00000000@BTC'],
// 30 TSLA + total interest
loanAmounts: [new BigNumber(30).plus(interestInfo[0].totalInterest).toFixed(8) + '@TSLA'], // 30.00001140@TSLA
Expand All @@ -148,7 +146,7 @@ describe('Loan getVault', () => {
loanValue: new BigNumber(30).plus(interestInfo[0].totalInterest).multipliedBy(2),
interestValue: new BigNumber(0.0000114),
// lround ((collateral value / loan value) * 100)
currentRatio: `${currentRatioValue}%`
currentRatio: Math.ceil(currentRatioValue)
})
})

Expand All @@ -168,23 +166,25 @@ describe('Loan getVault', () => {

// check vault not under liquidation.
const data = await testing.rpc.loan.getVault(vaultId)
expect(data.isUnderLiquidation).toStrictEqual(false)
expect(data.state).toStrictEqual(VaultState.ACTIVE)

// make vault enter under liquidation state by a price hike of the loan token
const timestamp = Math.floor(new Date().getTime() / 1000)
await testing.rpc.oracle.setOracleData(oracleId, timestamp, { prices: [{ tokenAmount: '1000@TSLA', currency: 'USD' }] })
await testing.generate(12) // Wait for 12 blocks which are equivalent to 2 hours (1 block = 10 minutes) in order to liquidate the vault

// get auction details
const autionDetails: [] = await testing.rpc.call('listauctions', [], 'bignumber')
const autionDetails: [] = await testing.container.call('listauctions')

const vaultDataAfterPriceHike = await testing.rpc.loan.getVault(vaultId)
expect(vaultDataAfterPriceHike).toStrictEqual({
vaultId: vaultId,
liquidationHeight: 168,
liquidationPenalty: 5,
loanSchemeId: 'default', // Get default loan scheme
ownerAddress: ownerAddress,
isUnderLiquidation: true,
invalidPrice: false,
state: VaultState.IN_LIQUIDATION,
batchCount: 2,
batches: autionDetails.filter((auction: {vaultId: string}) => auction.vaultId === vaultId).map((auction: {batches: []}) => auction.batches)[0]
})

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -282,7 +282,7 @@ describe('loanPayback success', () => {
expect(vaultBefore.loanValue).toStrictEqual(80.00009132)
expect(vaultBefore.interestAmounts).toStrictEqual(['0.00004566@TSLA'])
expect(vaultBefore.interestValue).toStrictEqual(0.00009132)
expect(vaultBefore.currentRatio).toStrictEqual('18750%')
expect(vaultBefore.currentRatio).toStrictEqual(18750)

const bobLoanAccBefore = await bob.rpc.account.getAccount(bobloanAddr)
expect(bobLoanAccBefore).toStrictEqual(['45.00000000@TSLA'])
Expand Down Expand Up @@ -318,7 +318,7 @@ describe('loanPayback success', () => {
expect(vaultBefore.interestAmounts).toStrictEqual(['0.00002283@TSLA'])
expect(vaultBefore.loanValue).toStrictEqual(80.00004566) // loanAmount * 2 (::1 TSLA = 2 USD)
expect(vaultBefore.interestValue).toStrictEqual(0.00004566)
expect(vaultBefore.currentRatio).toStrictEqual('18750%') // 15000 / 80.00004566 * 100
expect(vaultBefore.currentRatio).toStrictEqual(18750) // 15000 / 80.00004566 * 100

{
const interests = await bob.rpc.loan.getInterest('scheme')
Expand Down Expand Up @@ -356,7 +356,7 @@ describe('loanPayback success', () => {
expect(vaultAfter.interestAmounts).toStrictEqual(['0.00001541@TSLA'])
expect(vaultAfter.loanValue).toStrictEqual(54.00007648) // 27.00003824 * 2 (::1 TSLA = 2 USD)
expect(vaultAfter.interestValue).toStrictEqual(0.00003082)
expect(vaultAfter.currentRatio).toStrictEqual('27778%') // 15000 / 54.00007648 * 100
expect(vaultAfter.currentRatio).toStrictEqual(27778) // 15000 / 54.00007648 * 100

const burnInfoAfter = await bob.container.call('getburninfo')
expect(burnInfoAfter.paybackburn).toStrictEqual(0.00000457)
Expand All @@ -372,7 +372,7 @@ describe('loanPayback success', () => {
expect(vaultBefore.interestAmounts).toStrictEqual(['0.00002283@TSLA'])
expect(vaultBefore.loanValue).toStrictEqual(80.00004566) // loanAmount * 2 (::1 TSLA = 2 USD)
expect(vaultBefore.interestValue).toStrictEqual(0.00004566)
expect(vaultBefore.currentRatio).toStrictEqual('18750%') // 15000 / 80.0000456 * 100
expect(vaultBefore.currentRatio).toStrictEqual(18750) // 15000 / 80.0000456 * 100

const txid = await alice.rpc.loan.loanPayback({
vaultId: bobVaultId,
Expand All @@ -390,7 +390,7 @@ describe('loanPayback success', () => {
expect(vaultAfter.interestAmounts).toStrictEqual(['0.00001827@TSLA'])
expect(vaultAfter.loanValue).toStrictEqual(64.0000822) // 32.0000411 * 2 (::1 TSLA = 2 USD)
expect(vaultAfter.interestValue).toStrictEqual(0.00003654)
expect(vaultAfter.currentRatio).toStrictEqual('23437%') // 15000 / 64.00016436 * 100
expect(vaultAfter.currentRatio).toStrictEqual(23437) // 15000 / 64.00016436 * 100
})

it('should loanPayback more than one amount', async () => {
Expand Down Expand Up @@ -443,7 +443,7 @@ describe('loanPayback success', () => {
expect(vaultBefore.loanAmounts).toStrictEqual(['40.00004566@TSLA', '15.00000856@AMZN']) // eg: tslaTakeLoanAmt + tslaTotalInterest
expect(vaultBefore.interestAmounts).toStrictEqual(['0.00004566@TSLA', '0.00000856@AMZN'])
expect(vaultBefore.loanValue).toStrictEqual(140.00012556) // (40.00004566 * 2) + (15.00009856 * 4)
expect(vaultBefore.currentRatio).toStrictEqual('10714%') // 15000 / 140.00012556 * 100
expect(vaultBefore.currentRatio).toStrictEqual(10714) // 15000 / 140.00012556 * 100

const txid = await bob.rpc.loan.loanPayback({
vaultId: bobVaultId,
Expand All @@ -458,7 +458,7 @@ describe('loanPayback success', () => {
expect(vaultAfter.interestAmounts).toStrictEqual(['0.00001541@TSLA', '0.00000514@AMZN'])
expect(vaultAfter.loanValue).toStrictEqual(90.00017694)
expect(vaultAfter.interestValue).toStrictEqual(0.00005138)
expect(vaultAfter.currentRatio).toStrictEqual('16667%')
expect(vaultAfter.currentRatio).toStrictEqual(16667)

const loanTokenAccAfter = await bob.container.call('getaccount', [bobloanAddr])
expect(loanTokenAccAfter).toStrictEqual(['27.00000000@TSLA', '9.00000000@AMZN'])
Expand Down Expand Up @@ -496,7 +496,7 @@ describe('loanPayback success', () => {
expect(vaultAfter.interestAmounts).toStrictEqual(['0.00000799@TSLA', '0.00000172@AMZN'])
expect(vaultAfter.loanValue).toStrictEqual(40.0001998)
expect(vaultAfter.interestValue).toStrictEqual(0.00002286)
expect(vaultAfter.currentRatio).toStrictEqual('37500%')
expect(vaultAfter.currentRatio).toStrictEqual(37500)

const loanTokenAccAfter = await bob.container.call('getaccount', [bobloanAddr])
expect(loanTokenAccAfter).toStrictEqual(['14.00000000@TSLA', '3.00000000@AMZN']) // (27 - 13), (9 - 6)
Expand All @@ -512,7 +512,7 @@ describe('loanPayback success', () => {
expect(vaultBefore.interestAmounts).toStrictEqual(['0.00002283@TSLA'])
expect(vaultBefore.loanValue).toStrictEqual(80.00004566) // loanAmount * 2 (::1 TSLA = 2 USD)
expect(vaultBefore.interestValue).toStrictEqual(0.00004566)
expect(vaultBefore.currentRatio).toStrictEqual('18750%') // 15000 / 80.00004566 * 100
expect(vaultBefore.currentRatio).toStrictEqual(18750) // 15000 / 80.00004566 * 100

const utxo = await bob.container.fundAddress(bobloanAddr, 250)

Expand All @@ -529,7 +529,7 @@ describe('loanPayback success', () => {
expect(vaultAfter.interestAmounts).toStrictEqual(['0.00001541@TSLA'])
expect(vaultAfter.loanValue).toStrictEqual(54.00012214) // 27.00006107 * 2 (::1 TSLA = 2 USD)
expect(vaultAfter.interestValue).toStrictEqual(0.00003082)
expect(vaultAfter.currentRatio).toStrictEqual('27778%') // 15000 / 54.00012214 * 100
expect(vaultAfter.currentRatio).toStrictEqual(27778) // 15000 / 54.00012214 * 100

const rawtx = await bob.container.call('getrawtransaction', [txid, true])
expect(rawtx.vin[0].txid).toStrictEqual(utxo.txid)
Expand Down Expand Up @@ -646,7 +646,7 @@ describe('loanPayback failed', () => {
await tGroup.get(0).generate(6)

const liqVault = await bob.container.call('getvault', [bobLiqVaultId])
expect(liqVault.isUnderLiquidation).toStrictEqual(true)
expect(liqVault.state).toStrictEqual('inliquidation')

const promise = bob.rpc.loan.loanPayback({
vaultId: bobLiqVaultId,
Expand Down
Loading

0 comments on commit 5e89a4b

Please sign in to comment.