hedge-web3 0.1.44 → 0.1.50
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|
},
|