hedge-web3 0.1.44 → 0.1.50
Sign up to get free protection for your applications and to get access to all the features.
- package/declarations/Constants.d.ts +1 -1
- package/declarations/idl/vault.d.ts +5 -26
- package/declarations/instructions/liquidateVault.d.ts +1 -1
- package/declarations/state/VaultAccount.d.ts +5 -7
- package/lib/Constants.js +1 -1
- package/lib/idl/vault.js +5 -26
- package/lib/instructions/createStakingPool.js +0 -1
- package/lib/instructions/depositVault.js +7 -7
- package/lib/instructions/liquidateVault.js +7 -5
- package/lib/instructions/loanVault.js +6 -7
- package/lib/instructions/redeemVault.js +5 -4
- package/lib/instructions/refreshOraclePrice.js +2 -2
- package/lib/instructions/repayVault.js +5 -4
- package/lib/instructions/withdrawVault.js +5 -4
- package/lib/state/VaultAccount.js +26 -20
- package/lib/utils/getLinkedListAccounts.js +22 -19
- package/package.json +1 -1
- package/src/Constants.ts +1 -1
- package/src/idl/vault.ts +10 -52
- package/src/instructions/createStakingPool.ts +0 -1
- package/src/instructions/depositVault.ts +8 -8
- package/src/instructions/liquidateVault.ts +7 -5
- package/src/instructions/loanVault.ts +8 -11
- package/src/instructions/redeemVault.ts +5 -4
- package/src/instructions/refreshOraclePrice.ts +2 -2
- package/src/instructions/repayVault.ts +5 -4
- package/src/instructions/withdrawVault.ts +5 -4
- package/src/state/VaultAccount.ts +25 -25
- package/src/utils/getLinkedListAccounts.ts +24 -20
@@ -18,10 +18,10 @@ export class VaultAccount {
|
|
18
18
|
pdaSalt: string
|
19
19
|
|
20
20
|
/** The deposited collateral of the vault (in SOL Lamports). */
|
21
|
-
deposited
|
21
|
+
deposited = new Decimal(0)
|
22
22
|
|
23
23
|
/** The outstanding debt of the vault (in USH Lamports). Denormalized to time 0. */
|
24
|
-
denormalizedDebt
|
24
|
+
denormalizedDebt = new Decimal(0)
|
25
25
|
|
26
26
|
/** The ordered number of when this vault was created. */
|
27
27
|
vaultNumber: number
|
@@ -32,8 +32,8 @@ export class VaultAccount {
|
|
32
32
|
/** Collateral redistribution snapshot' */
|
33
33
|
collateralAccumulatorSnapshotBytes = new Decimal(0)
|
34
34
|
|
35
|
-
/** The vault type eg '
|
36
|
-
|
35
|
+
/** The vault type eg 'SOL-150' */
|
36
|
+
collateralType: string
|
37
37
|
|
38
38
|
/** Current State of the vault ("Open", "Closed", "Liquidated") */
|
39
39
|
vaultStatus = ''
|
@@ -41,29 +41,29 @@ export class VaultAccount {
|
|
41
41
|
/** The public key of the next vault to redeem. */
|
42
42
|
nextVaultToRedeem: PublicKey
|
43
43
|
|
44
|
-
/** The public key of the vault type. */
|
45
|
-
vaultType: PublicKey
|
46
|
-
|
47
44
|
constructor(vault: any, publicKey: PublicKey) {
|
48
45
|
this.publicKey = publicKey
|
49
46
|
this.vaultOwner = vault.vaultOwner
|
50
47
|
this.vaultNumber = vault.vaultNumber?.toNumber()
|
51
48
|
this.pdaSalt = vault.pdaSalt
|
52
|
-
|
53
|
-
|
49
|
+
if (vault.deposited){
|
50
|
+
this.deposited = new Decimal(vault.deposited.toString())
|
51
|
+
}
|
52
|
+
if (vault.denormalizedDebt){
|
53
|
+
this.denormalizedDebt = new Decimal(vault.denormalizedDebt.toString())
|
54
|
+
}
|
54
55
|
if (vault.debtProductSnapshotBytes) {
|
55
56
|
this.debtProductSnapshotBytes = DecimalFromU128(vault.debtProductSnapshotBytes.toString())
|
56
57
|
}
|
57
58
|
if (vault.collateralAccumulatorSnapshotBytes) {
|
58
59
|
this.collateralAccumulatorSnapshotBytes = DecimalFromU128(vault.collateralAccumulatorSnapshotBytes.toString())
|
59
60
|
}
|
60
|
-
this.
|
61
|
+
this.collateralType = vault.collateralType
|
61
62
|
this.nextVaultToRedeem = vault.nextVaultToRedeem
|
62
63
|
|
63
64
|
if (vault.vaultStatus) {
|
64
65
|
this.vaultStatus = Object.keys(vault.vaultStatus)[0]
|
65
66
|
}
|
66
|
-
this.vaultType = vault.vaultType
|
67
67
|
}
|
68
68
|
|
69
69
|
/**
|
@@ -82,7 +82,7 @@ export class VaultAccount {
|
|
82
82
|
* @returns collateral value in SOL
|
83
83
|
*/
|
84
84
|
public inSol(): number {
|
85
|
-
return this.deposited
|
85
|
+
return this.deposited.div(LAMPORTS_PER_SOL).toNumber()
|
86
86
|
}
|
87
87
|
|
88
88
|
/**
|
@@ -91,7 +91,7 @@ export class VaultAccount {
|
|
91
91
|
* @returns debt value in USH
|
92
92
|
*/
|
93
93
|
public inUsd(): number {
|
94
|
-
return this.denormalizedDebt
|
94
|
+
return this.denormalizedDebt.div(LAMPORTS_PER_SOL).toNumber()
|
95
95
|
}
|
96
96
|
|
97
97
|
/**
|
@@ -107,37 +107,37 @@ export class VaultAccount {
|
|
107
107
|
|
108
108
|
public addDebt(newNormalizedDebt: Decimal, vaultTypeCompoundedInterest: Decimal) {
|
109
109
|
const denormalizedNewDebt = newNormalizedDebt.div(vaultTypeCompoundedInterest)
|
110
|
-
this.denormalizedDebt = denormalizedNewDebt.add(new Decimal(this.denormalizedDebt)).floor()
|
110
|
+
this.denormalizedDebt = denormalizedNewDebt.add(new Decimal(this.denormalizedDebt)).floor()
|
111
111
|
// this.denormalizedDebt = parseFloat(this.denormalizedDebt.toFixed(0))
|
112
112
|
}
|
113
113
|
public addDeposit(depositAmount: number) {
|
114
|
-
this.deposited
|
114
|
+
this.deposited = this.deposited.add(depositAmount)
|
115
115
|
}
|
116
116
|
|
117
117
|
public redeem() {
|
118
118
|
// TODO - Calculate actual redeem amount and adust correctly
|
119
|
-
this.denormalizedDebt = 0
|
119
|
+
this.denormalizedDebt = new Decimal(0)
|
120
120
|
this.vaultStatus = 'initialized'
|
121
121
|
}
|
122
122
|
public liquidate() {
|
123
123
|
// TODO - Calculate actual liquidate amount and adust correctly
|
124
|
-
this.denormalizedDebt = 0
|
124
|
+
this.denormalizedDebt = new Decimal(0)
|
125
125
|
this.vaultStatus = 'liquidated'
|
126
126
|
}
|
127
127
|
|
128
|
-
public updateDebtAndCollateral(
|
129
|
-
const debtProductCurrent = DecimalFromU128(
|
128
|
+
public updateDebtAndCollateral(vaultTypeAccuntData: any) {
|
129
|
+
const debtProductCurrent = DecimalFromU128(vaultTypeAccuntData.debtRedistributionProduct)
|
130
130
|
|
131
|
-
const collateralAccumulatorCurrent = DecimalFromU128(
|
131
|
+
const collateralAccumulatorCurrent = DecimalFromU128(vaultTypeAccuntData.collateralRedistributionAccumulator)
|
132
132
|
|
133
133
|
this.denormalizedDebt = debtProductCurrent
|
134
134
|
.div(this.debtProductSnapshotBytes)
|
135
135
|
.mul(new Decimal(this.denormalizedDebt))
|
136
|
-
.toNumber()
|
137
136
|
|
138
137
|
const extraCollateralDeposited =
|
139
|
-
this.denormalizedDebt
|
140
|
-
|
138
|
+
this.denormalizedDebt.mul(collateralAccumulatorCurrent.sub(this.collateralAccumulatorSnapshotBytes))
|
139
|
+
|
140
|
+
this.deposited = this.deposited.add(extraCollateralDeposited)
|
141
141
|
|
142
142
|
this.collateralAccumulatorSnapshotBytes = collateralAccumulatorCurrent
|
143
143
|
this.debtProductSnapshotBytes = debtProductCurrent
|
@@ -149,7 +149,7 @@ export class VaultAccount {
|
|
149
149
|
arrow = ' <----!!'
|
150
150
|
}
|
151
151
|
let collateralRatio = 'Infinite'
|
152
|
-
if (this.denormalizedDebt
|
152
|
+
if (this.denormalizedDebt.greaterThan(0)) {
|
153
153
|
collateralRatio = new Decimal(this.deposited).div(new Decimal(this.denormalizedDebt)).toString()
|
154
154
|
}
|
155
155
|
|
@@ -160,7 +160,7 @@ export class VaultAccount {
|
|
160
160
|
|
161
161
|
return `Vault(${this.vaultNumber}): ${this.publicKey.toString().substring(0, 6)}. Debt: ${
|
162
162
|
this.denormalizedDebt
|
163
|
-
} Collat: ${this.deposited} Ratio: ${collateralRatio} ${arrow} `
|
163
|
+
} Collat: ${this.deposited} Ratio: ${collateralRatio} NextVault: ${nextVault} ${arrow} `
|
164
164
|
}
|
165
165
|
/**
|
166
166
|
* Creates a VaultAccount from a slice of data
|
@@ -22,7 +22,7 @@ export async function getLinkedListAccounts(
|
|
22
22
|
liquidate: boolean,
|
23
23
|
cachedVaults?: VaultAccount[]
|
24
24
|
): Promise<[PublicKey, PublicKey, PublicKey, VaultAccount[]]> {
|
25
|
-
|
25
|
+
console.log('Getting getLinkedListAccounts')
|
26
26
|
const vaultTypeAccount = await program.account.vaultType.fetch(vaultTypeAccountPublicKey)
|
27
27
|
|
28
28
|
// Default for null is the vault itself, so set them all to this vault
|
@@ -31,7 +31,6 @@ export async function getLinkedListAccounts(
|
|
31
31
|
let newLargerPublicKey = vaultPublicKey
|
32
32
|
|
33
33
|
const thisVaultData = await program.account.vault.fetch(vaultPublicKey)
|
34
|
-
const accountInfo = await program.provider.connection.getAccountInfo(vaultPublicKey)
|
35
34
|
const thisVault = new VaultAccount(thisVaultData, vaultPublicKey)
|
36
35
|
|
37
36
|
// Load all the vaults
|
@@ -55,11 +54,11 @@ export async function getLinkedListAccounts(
|
|
55
54
|
// vaults = allVaults.map((vault) => {
|
56
55
|
// return new VaultAccount(vault.account, vault.publicKey)
|
57
56
|
// })
|
58
|
-
vaults = await getMiniVaults(program, vaultTypeAccount.
|
57
|
+
vaults = await getMiniVaults(program, vaultTypeAccount.collateralType)
|
59
58
|
}
|
60
59
|
|
61
|
-
|
62
|
-
|
60
|
+
console.log('Vault count found:', vaults.length)
|
61
|
+
console.log('First Vault', vaults[0])
|
63
62
|
|
64
63
|
// Filter out the accounts that are not open
|
65
64
|
// TODO filter on vault status. Or we enable people to "close out" empty vaults
|
@@ -69,7 +68,7 @@ export async function getLinkedListAccounts(
|
|
69
68
|
|
70
69
|
// Remove any vaults with no debt or collateral
|
71
70
|
vaults = _.filter(vaults, (vault) => {
|
72
|
-
return vault.denormalizedDebt
|
71
|
+
return vault.denormalizedDebt.greaterThan(0) && vault.deposited.greaterThan(0)
|
73
72
|
})
|
74
73
|
|
75
74
|
// Sort them
|
@@ -88,12 +87,6 @@ export async function getLinkedListAccounts(
|
|
88
87
|
oldSmallerPublicKey = vaults[indexBefore - 1].publicKey
|
89
88
|
}
|
90
89
|
|
91
|
-
// Pretty print the list again
|
92
|
-
// console.log('Sorted open vaults. Index Before: ', indexBefore)
|
93
|
-
// console.log(vaults.map((vault) => {
|
94
|
-
// return vault.toString(vaultPublicKey)
|
95
|
-
// }))
|
96
|
-
|
97
90
|
// Pretty print all the vaults before the operation
|
98
91
|
// console.log('Sorted open vaults BEFORE at index:', indexBefore)
|
99
92
|
// let correctOrderBefore = true
|
@@ -137,13 +130,19 @@ export async function getLinkedListAccounts(
|
|
137
130
|
vaults[indexBefore].redeem()
|
138
131
|
}
|
139
132
|
|
140
|
-
if (vaults[indexBefore].denormalizedDebt
|
133
|
+
if (vaults[indexBefore].denormalizedDebt.isZero()) {
|
141
134
|
vaults.splice(indexBefore, 1)
|
142
135
|
}
|
143
136
|
|
144
137
|
// Sort it again since we've changed one vault
|
145
138
|
vaults = vaults.sort(sortVaults)
|
146
139
|
|
140
|
+
// Pretty print the list again
|
141
|
+
// console.log('Sorted open vaults with new debt added at index: ', indexAfter)
|
142
|
+
// console.log(vaults.map((vault) => {
|
143
|
+
// return vault.toString(vaultPublicKey)
|
144
|
+
// }))
|
145
|
+
|
147
146
|
// Search for the vaults new position
|
148
147
|
let indexAfter = -1
|
149
148
|
vaults.forEach((vault, index) => {
|
@@ -161,7 +160,8 @@ export async function getLinkedListAccounts(
|
|
161
160
|
// )
|
162
161
|
|
163
162
|
// Print where it moved from / to
|
164
|
-
|
163
|
+
console.log('Index Before', indexBefore)
|
164
|
+
console.log('Index After', indexAfter)
|
165
165
|
|
166
166
|
// Save references to the new left and right
|
167
167
|
if (indexAfter > 0) {
|
@@ -182,15 +182,19 @@ export async function getLinkedListAccounts(
|
|
182
182
|
// Sort function we can use to sort the vaults
|
183
183
|
// Sorted by collateral ratio. If two are the same, newer vault first
|
184
184
|
function sortVaults(a: VaultAccount, b: VaultAccount) {
|
185
|
-
const aRatio = a.deposited
|
186
|
-
const bRatio = b.deposited
|
187
|
-
if (aRatio
|
185
|
+
const aRatio = a.deposited.floor().div(a.denormalizedDebt.floor())
|
186
|
+
const bRatio = b.deposited.floor().div(b.denormalizedDebt.floor())
|
187
|
+
if (aRatio.equals(bRatio)) {
|
188
188
|
return b.vaultNumber - a.vaultNumber
|
189
189
|
}
|
190
|
-
|
190
|
+
if (aRatio.greaterThan(bRatio)){
|
191
|
+
return 1
|
192
|
+
}
|
193
|
+
|
194
|
+
return -1
|
191
195
|
}
|
192
196
|
|
193
|
-
async function getMiniVaults(program: Program<Vault>,
|
197
|
+
async function getMiniVaults(program: Program<Vault>, collateralType: string) {
|
194
198
|
const filters = [
|
195
199
|
// Filter for Vault Accounts
|
196
200
|
{
|
@@ -200,7 +204,7 @@ async function getMiniVaults(program: Program<Vault>, vaultTypeName: string ) {
|
|
200
204
|
// Filter for Vaults with this collateral type
|
201
205
|
{
|
202
206
|
memcmp: {
|
203
|
-
bytes: base58.encode(VaultAccount.getBufferForString(
|
207
|
+
bytes: base58.encode(VaultAccount.getBufferForString(collateralType)),
|
204
208
|
offset: 8 + 32 + 24,
|
205
209
|
},
|
206
210
|
},
|