Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(jellyfish-api-core): DFI Payback of all dTokens #1190

Merged
merged 35 commits into from
Mar 30, 2022
Merged
Show file tree
Hide file tree
Changes from 26 commits
Commits
Show all changes
35 commits
Select commit Hold shift + click to select a range
6e857af
Jellyfish minor updates for DFI Payback of all dTokens #1111
chanakasameera Mar 8, 2022
09a8d5a
Added setGov test cases with loan_payback and loan_payback_fee_pct keys
chanakasameera Mar 8, 2022
f30a7c0
Merge branch 'main' into chanakasameera/dfi_payback_dtokens
chanakasameera Mar 10, 2022
e0a0634
Added paybackloan api extention and a testcase
chanakasameera Mar 10, 2022
5e7fcea
Added paybackloan a new testcase
chanakasameera Mar 11, 2022
6fe686f
Updated fortcanningroadheight
chanakasameera Mar 11, 2022
c1309e3
Updated fortcanningroadheight
chanakasameera Mar 11, 2022
b93ff17
Updated fortcanningroadheight
chanakasameera Mar 11, 2022
bbc6bb5
Added dusd loan payback using dusd test
chanakasameera Mar 11, 2022
b871e9c
Fixed failing gov tests.
surangap Mar 11, 2022
ce6d1df
Merge branch 'main' into chanakasameera/dfi_payback_dtokens
surangap Mar 11, 2022
7a6ea0f
Updated account.md with new paybackfees and paybacktokens
chanakasameera Mar 14, 2022
cbade54
Merge branch 'main' into chanakasameera/dfi_payback_dtokens
chanakasameera Mar 14, 2022
01eee3c
Merge branch 'main' into chanakasameera/dfi_payback_dtokens
chanakasameera Mar 15, 2022
c78ba5a
Updated PaybackLoanMetadata properly and test updates
chanakasameera Mar 15, 2022
a67f94d
Merge branch 'main' into chanakasameera/dfi_payback_dtokens
chanakasameera Mar 15, 2022
640b5d2
Updates for review comments - part 1 (Now burn info is checked)
chanakasameera Mar 20, 2022
7c5783a
Merge branch 'main' into chanakasameera/dfi_payback_dtokens
chanakasameera Mar 20, 2022
5e5fa96
Updates for review comments - part 2 (burn info check, new test cases…
chanakasameera Mar 22, 2022
9671b81
Merge branch 'main' into chanakasameera/dfi_payback_dtokens
chanakasameera Mar 22, 2022
7aaf41a
Merge branch 'main' into chanakasameera/dfi_payback_dtokens
chanakasameera Mar 23, 2022
72ef4e9
Updates for review comments - part 3 (payback multiple loans at once,…
chanakasameera Mar 23, 2022
e586606
Minor fixes for CI test fails and interest calculation
chanakasameera Mar 23, 2022
17f5893
Updates for review comments - part 4 (Payback checking before hardfor…
chanakasameera Mar 23, 2022
c44bb62
Merge branch 'main' into chanakasameera/dfi_payback_dtokens
chanakasameera Mar 24, 2022
931ef79
Updates for review comments - part 5 (Now Tsla tokens are not minted)
chanakasameera Mar 24, 2022
d48902e
Added dftx interface for Payback Loan V2
chanakasameera Mar 29, 2022
327481e
Updated loan.md with payback loan v2
chanakasameera Mar 29, 2022
813c17c
Merge branch 'main' into chanakasameera/dfi_payback_dtokens
chanakasameera Mar 29, 2022
30cf16d
Ain image from https://github.com/DeFiCh/ain/actions/runs/2020075855
chanakasameera Mar 29, 2022
e4dc73d
Update for dftx loan payback v2
chanakasameera Mar 29, 2022
be35fe7
Added tests for dftx loan payback v2
chanakasameera Mar 29, 2022
f506d19
Merge branch 'main' into chanakasameera/dfi_payback_dtokens
chanakasameera Mar 29, 2022
53d226d
Comments update about PaybackLoanV2
chanakasameera Mar 29, 2022
dd15230
Comments update about TokenPayback.dToken
chanakasameera Mar 29, 2022
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion apps/rich-list-api/docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -41,4 +41,5 @@ services:
-eunospayaheight=7
-fortcanningheight=8
-fortcanningmuseumheight=9
-fortcanninghillheight=10
-fortcanninghillheight=10
-fortcanningroadheight=11
8 changes: 8 additions & 0 deletions docs/node/CATEGORIES/08-account.md
Original file line number Diff line number Diff line change
Expand Up @@ -455,5 +455,13 @@ interface BurnInfo {
* Amount of tokens that are paid back; formatted as AMOUNT@SYMBOL
*/
dfipaybacktokens: string[]
/**
* Amount of paybacks
*/
paybackfees: string[]
/**
* Amount of tokens that are paid back
*/
paybacktokens: string[]
}
```
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,8 @@ it('should getBurnInfo', async () => {
auctionburn: new BigNumber(0),
emissionburn: new BigNumber('6274'),
paybackburn: new BigNumber(0),
paybackfees: [],
paybacktokens: [],
dexfeetokens: [],
dfipaybackfee: new BigNumber(0),
dfipaybacktokens: []
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ export class GovernanceMasterNodeRegTestContainer extends MasterNodeRegTestConta
.filter(cmd => cmd !== '-fortcanningheight=8')
.filter(cmd => cmd !== '-fortcanningmuseumheight=9')
.filter(cmd => cmd !== '-fortcanninghillheight=10')
.filter(cmd => cmd !== '-fortcanningroadheight=11')

return [
...cmd,
Expand Down

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -780,7 +780,7 @@ describe('takeloan failed', () => {
amounts: '1000@TSLA'
})
await expect(promise).rejects.toThrow(RpcApiError)
await expect(promise).rejects.toThrow('At least 50% of the minimum required collateral must be in DFI when taking a loan.')
await expect(promise).rejects.toThrow('At least 50% of the minimum required collateral must be in DFI or DUSD when taking a loan.')

{
// revert DFI value changes
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import { RpcApiError } from '@defichain/jellyfish-api-core'
import { GenesisKeys, MasterNodeRegTestContainer } from '@defichain/testcontainers'
import { createPoolPair, createToken } from '@defichain/testing'
import { ContainerAdapterClient } from '../../container_adapter_client'
import { Testing } from '@defichain/jellyfish-testing'

describe('Masternode', () => {
const container = new MasterNodeRegTestContainer()
Expand Down Expand Up @@ -69,3 +70,71 @@ describe('Masternode', () => {
await expect(promise).rejects.toThrow('LP_DAILY_DFI_REWARD: Cannot be set manually after Eunos hard fork')
})
})

describe('Masternode setGov ATTRIBUTES', () => {
const container = new MasterNodeRegTestContainer()
const testing = Testing.create(container)
const attributeKey = 'ATTRIBUTES'
let key: string

beforeAll(async () => {
await testing.container.start()
await testing.container.waitForWalletCoinbaseMaturity()

// setup loan token
await testing.rpc.loan.setLoanToken({
symbol: 'DUSD',
fixedIntervalPriceId: 'DUSD/USD'
})
await testing.generate(1)

const address = await container.call('getnewaddress')
const metadata = {
symbol: 'BTC',
name: 'BTC Token',
isDAT: true,
mintable: true,
tradeable: true,
collateralAddress: address
}
await testing.rpc.token.createToken(metadata)
await testing.generate(1)

const dusdInfo = await testing.rpc.token.getToken('DUSD')
const dusdId = Object.keys(dusdInfo)[0]
key = `v0/token/${dusdId}`
})

afterAll(async () => {
await testing.container.stop()
})

it('should setGov with loan_payback and loan_payback_fee_pct', async () => {
const key0 = `${key}/loan_payback/1`
const key1 = `${key}/loan_payback/2`
const key2 = `${key}/loan_payback_fee_pct/1`
await testing.rpc.masternode.setGov({ [attributeKey]: { [key0]: 'true', [key1]: 'true', [key2]: '0.25' } })
await testing.container.generate(1)

const govAfter = await testing.rpc.masternode.getGov(attributeKey)
expect(govAfter.ATTRIBUTES[key0].toString()).toStrictEqual('true')
expect(govAfter.ATTRIBUTES[key1].toString()).toStrictEqual('true')
expect(govAfter.ATTRIBUTES[key2].toString()).toStrictEqual('0.25')
})

it('should setGov dfi keys with loan_payback and loan_payback_fee_pct', async () => {
const key0 = `${key}/loan_payback/0`
const key1 = `${key}/loan_payback_fee_pct/0`
await testing.rpc.masternode.setGov({ [attributeKey]: { [key0]: 'false', [key1]: '0.35' } })
await testing.container.generate(1)

const govAfter = await testing.rpc.masternode.getGov(attributeKey)
expect(govAfter.ATTRIBUTES[key0]).toBeUndefined()
expect(govAfter.ATTRIBUTES[key1]).toBeUndefined()

const key2 = `${key}/payback_dfi`
const key3 = `${key}/payback_dfi_fee_pct`
expect(govAfter.ATTRIBUTES[key2].toString()).toStrictEqual('false')
expect(govAfter.ATTRIBUTES[key3].toString()).toStrictEqual('0.35')
})
})
8 changes: 8 additions & 0 deletions packages/jellyfish-api-core/src/category/account.ts
Original file line number Diff line number Diff line change
Expand Up @@ -541,4 +541,12 @@ export interface BurnInfo {
* Amount of tokens that are paid back; formatted as AMOUNT@SYMBOL
*/
dfipaybacktokens: string[]
/**
* Amount of paybacks
*/
paybackfees: string[]
/**
* Amount of tokens that are paid back
*/
paybacktokens: string[]
}
18 changes: 16 additions & 2 deletions packages/jellyfish-api-core/src/category/loan.ts
Original file line number Diff line number Diff line change
Expand Up @@ -357,16 +357,19 @@ export class Loan {
/**
* Return loan in a desired amount.
*
* @param {PaybackLoanMetadata} metadata
* @param {PaybackLoanMetadata | PaybackLoanMetadataV2} metadata
* @param {string} metadata.vaultId Vault id
* @param {string| string[]} metadata.amounts In "amount@symbol" format
surangap marked this conversation as resolved.
Show resolved Hide resolved
* @param {string} metadata.from Address from transfer tokens
* @param {TokenPaybackAmount[]} metadata.loans
surangap marked this conversation as resolved.
Show resolved Hide resolved
* @param {string | string[]} metadata.loans[0].amounts In "amount@symbol" format to be spent
* @param {string} metadata.loans[0].dToken Token to be paid
* @param {UTXO[]} [utxos = []] Specific UTXOs to spend
* @param {string} utxos.txid Transaction Id
* @param {number} utxos.vout Output number
* @return {Promise<string>} txid
*/
async paybackLoan (metadata: PaybackLoanMetadata, utxos: UTXO[] = []): Promise<string> {
async paybackLoan (metadata: PaybackLoanMetadata | PaybackLoanMetadataV2, utxos: UTXO[] = []): Promise<string> {
chanakasameera marked this conversation as resolved.
Show resolved Hide resolved
return await this.client.call('paybackloan', [metadata, utxos], 'number')
}

Expand Down Expand Up @@ -605,6 +608,17 @@ export interface PaybackLoanMetadata {
from: string
}

export interface TokenPaybackAmount {
dToken: string
amounts: string | string[] // amount@symbol
}

export interface PaybackLoanMetadataV2 {
vaultId: string
from: string
loans: TokenPaybackAmount[]
}

export interface VaultPagination {
start?: string
including_start?: boolean
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1255,7 +1255,7 @@ describe('paybackLoan for dusd using dfi', () => {
}, script)
let promise = sendTransaction(testing.container, txn)

await expect(promise).rejects.toThrow('DeFiDRpcError: \'PaybackLoanTx: Payback of DUSD loans with DFI not currently active (code 16)\', code: -26')
await expect(promise).rejects.toThrow('DeFiDRpcError: \'PaybackLoanTx: Payback of loan via DFI token is not currently active (code 16)\', code: -26')

await testing.rpc.masternode.setGov({ [attributeKey]: { [key]: 'false' } })
await testing.container.generate(1)
Expand All @@ -1274,7 +1274,7 @@ describe('paybackLoan for dusd using dfi', () => {
}, script)
promise = sendTransaction(testing.container, txn)

await expect(promise).rejects.toThrow('DeFiDRpcError: \'PaybackLoanTx: Payback of DUSD loans with DFI not currently active (code 16)\', code: -26')
await expect(promise).rejects.toThrow('DeFiDRpcError: \'PaybackLoanTx: Payback of loan via DFI token is not currently active (code 16)\', code: -26')
})

it('should not be able to payback TSLA loan using DFI', async () => {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -618,7 +618,7 @@ describe('loans.takeLoan failed', () => {

const promise = sendTransaction(bob.container, txn)
await expect(promise).rejects.toThrow(DeFiDRpcError)
await expect(promise).rejects.toThrow('At least 50% of the minimum required collateral must be in DFI when taking a loan.')
await expect(promise).rejects.toThrow('At least 50% of the minimum required collateral must be in DFI or DUSD when taking a loan.')

{
// revert DFI value changes
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -332,7 +332,7 @@ describe('loans.withdrawFromVault', () => {

const promise = sendTransaction(tGroup.get(0).container, txn)
await expect(promise).rejects.toThrow(DeFiDRpcError)
await expect(promise).rejects.toThrow('WithdrawFromVaultTx: At least 50% of the minimum required collateral must be in DFI (code 16)')
await expect(promise).rejects.toThrow('WithdrawFromVaultTx: At least 50% of the minimum required collateral must be in DFI or DUSD (code 16)')
})

it('should not withdraw from liquidated vault', async () => {
Expand Down
2 changes: 1 addition & 1 deletion packages/testcontainers/src/containers/DeFiDContainer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ export abstract class DeFiDContainer extends DockerContainer {
if (process?.env?.DEFICHAIN_DOCKER_IMAGE !== undefined) {
return process.env.DEFICHAIN_DOCKER_IMAGE
}
return 'defi/defichain:2.6.2'
return 'defi/defichain:master-2a236bb79'
}

public static readonly DefaultStartOptions = {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,8 @@ export class RegTestContainer extends DeFiDContainer {
'-eunospayaheight=7',
'-fortcanningheight=8',
'-fortcanningmuseumheight=9',
'-fortcanninghillheight=10'
'-fortcanninghillheight=10',
'-fortcanningroadheight=11'
]

if (opts.startFlags != null && opts.startFlags.length > 0) {
Expand Down