hedge-web3 0.2.7 → 0.2.10
Sign up to get free protection for your applications and to get access to all the features.
- package/declarations/Constants.d.ts +47 -0
- package/declarations/idl/pyth.d.ts +80 -0
- package/declarations/instructions/createVault.d.ts +3 -2
- package/declarations/instructions/depositLiquidationPool.d.ts +4 -3
- package/declarations/instructions/depositStakingPool.d.ts +3 -2
- package/declarations/instructions/depositVault.d.ts +3 -2
- package/declarations/instructions/loanVault.d.ts +3 -2
- package/declarations/instructions/redeemVault.d.ts +3 -2
- package/declarations/instructions/repayVault.d.ts +3 -2
- package/declarations/instructions/withdrawVault.d.ts +3 -2
- package/declarations/state/VaultAccount.d.ts +33 -10
- package/declarations/utils/getLinkedListAccounts.d.ts +17 -2
- package/lib/Constants.js +47 -0
- package/lib/idl/pyth.js +82 -0
- package/lib/instructions/createVault.js +2 -2
- package/lib/instructions/depositLiquidationPool.js +2 -2
- package/lib/instructions/depositStakingPool.js +2 -2
- package/lib/instructions/depositVault.js +3 -3
- package/lib/instructions/liquidateVault.js +1 -1
- package/lib/instructions/loanVault.js +3 -3
- package/lib/instructions/redeemVault.js +3 -3
- package/lib/instructions/refreshOraclePrice.js +6 -5
- package/lib/instructions/repayVault.js +3 -3
- package/lib/instructions/withdrawVault.js +3 -3
- package/lib/state/VaultAccount.js +69 -30
- package/lib/utils/getLinkedListAccounts.js +26 -10
- package/package.json +1 -1
- package/src/Constants.ts +50 -4
- package/src/idl/pyth.ts +159 -0
- package/src/instructions/createVault.ts +3 -3
- package/src/instructions/depositLiquidationPool.ts +4 -4
- package/src/instructions/depositStakingPool.ts +3 -3
- package/src/instructions/depositVault.ts +7 -6
- package/src/instructions/liquidateVault.ts +4 -3
- package/src/instructions/loanVault.ts +7 -6
- package/src/instructions/redeemVault.ts +7 -6
- package/src/instructions/refreshOraclePrice.ts +6 -5
- package/src/instructions/repayVault.ts +7 -6
- package/src/instructions/withdrawVault.ts +7 -6
- package/src/state/VaultAccount.ts +79 -36
- package/src/utils/getLinkedListAccounts.ts +31 -13
@@ -93,7 +93,7 @@ export async function createVault(
|
|
93
93
|
vaultTypeAccountInfo.collateralMint,
|
94
94
|
history.publicKey,
|
95
95
|
ushMintPublickey,
|
96
|
-
depositAmount,
|
96
|
+
new BN(depositAmount),
|
97
97
|
overrideTime
|
98
98
|
)
|
99
99
|
)
|
@@ -187,7 +187,7 @@ export async function buildCreateVaultTransaction(
|
|
187
187
|
vaultTypeAccountInfo.collateralMint,
|
188
188
|
history.publicKey,
|
189
189
|
ushMintPublickey,
|
190
|
-
depositAmount,
|
190
|
+
new BN(depositAmount),
|
191
191
|
overrideTime
|
192
192
|
)
|
193
193
|
)
|
@@ -221,7 +221,7 @@ export async function createVaultInstruction(
|
|
221
221
|
collateralMint: PublicKey,
|
222
222
|
historyPublicKey: PublicKey,
|
223
223
|
ushMintPublickey: PublicKey,
|
224
|
-
depositAmount:
|
224
|
+
depositAmount: BN,
|
225
225
|
overrideTime?: number
|
226
226
|
): Promise<TransactionInstruction> {
|
227
227
|
const vaultSystemStatePublicKey = await getVaultSystemStatePublicKey()
|
@@ -24,7 +24,7 @@ export async function depositLiquidationPool(
|
|
24
24
|
program: Program<Vault>,
|
25
25
|
provider: Provider,
|
26
26
|
payer: Signer,
|
27
|
-
depositAmount:
|
27
|
+
depositAmount: BN,
|
28
28
|
overrideStartTime?: number
|
29
29
|
): Promise<PublicKey> {
|
30
30
|
const ushMintPublickey = await getUshMintPublicKey()
|
@@ -42,7 +42,7 @@ export async function depositLiquidationPool(
|
|
42
42
|
payer.publicKey,
|
43
43
|
payerUshAccount.address,
|
44
44
|
poolPosition.publicKey,
|
45
|
-
depositAmount,
|
45
|
+
new BN(depositAmount),
|
46
46
|
overrideStartTime
|
47
47
|
)
|
48
48
|
)
|
@@ -55,7 +55,7 @@ export async function depositLiquidationPoolInstruction(
|
|
55
55
|
payerPublicKey: PublicKey,
|
56
56
|
payerUshAccount: PublicKey,
|
57
57
|
poolPositionPublicKey: PublicKey,
|
58
|
-
depositAmount:
|
58
|
+
depositAmount: BN,
|
59
59
|
overrideStartTime?: number
|
60
60
|
): Promise<TransactionInstruction> {
|
61
61
|
const liquidationPoolStatePublicKey = await getLiquidationPoolStatePublicKey()
|
@@ -68,7 +68,7 @@ export async function depositLiquidationPoolInstruction(
|
|
68
68
|
|
69
69
|
return await program.methods
|
70
70
|
.depositLiquidationPool(
|
71
|
-
|
71
|
+
depositAmount,
|
72
72
|
new BN(overrideStartTime ?? Math.floor(Date.now() / 1000)) // override current time
|
73
73
|
)
|
74
74
|
.accounts({
|
@@ -30,7 +30,7 @@ export async function depositStakingPool(
|
|
30
30
|
payer.publicKey,
|
31
31
|
poolPosition.publicKey,
|
32
32
|
mintPublicKey,
|
33
|
-
depositAmount,
|
33
|
+
new BN(depositAmount),
|
34
34
|
overrideStartTime
|
35
35
|
)
|
36
36
|
)
|
@@ -43,7 +43,7 @@ export async function depositStakingPoolInstruction(
|
|
43
43
|
payerPublicKey: PublicKey,
|
44
44
|
poolPositionPublicKey: PublicKey,
|
45
45
|
stakedTokenMintPublicKey: PublicKey,
|
46
|
-
depositAmount:
|
46
|
+
depositAmount: BN,
|
47
47
|
overrideStartTime?: number
|
48
48
|
): Promise<TransactionInstruction> {
|
49
49
|
const [poolPublickey] = await getPoolPublicKeyForMint(stakedTokenMintPublicKey)
|
@@ -53,7 +53,7 @@ export async function depositStakingPoolInstruction(
|
|
53
53
|
|
54
54
|
return await program.methods
|
55
55
|
.depositStakingPool(
|
56
|
-
|
56
|
+
depositAmount,
|
57
57
|
new BN(overrideStartTime ?? Math.floor(Date.now() / 1000)) // override current time
|
58
58
|
)
|
59
59
|
.accounts({
|
@@ -67,11 +67,12 @@ export async function depositVault(
|
|
67
67
|
const signers = [payer, history]
|
68
68
|
const [oldSmallerPublicKey, newSmallerPublicKey, newLargerPublicKey] = await getLinkedListAccounts(
|
69
69
|
program,
|
70
|
-
provider,
|
71
70
|
vaultAccount.vaultType,
|
72
71
|
vaultPublicKey,
|
73
|
-
depositAmount,
|
74
|
-
0,
|
72
|
+
new BN(depositAmount),
|
73
|
+
new BN(0),
|
74
|
+
new BN(0),
|
75
|
+
new BN(0),
|
75
76
|
false,
|
76
77
|
false
|
77
78
|
)
|
@@ -111,7 +112,7 @@ export async function depositVault(
|
|
111
112
|
oldSmallerPublicKey,
|
112
113
|
newSmallerPublicKey,
|
113
114
|
newLargerPublicKey,
|
114
|
-
depositAmount,
|
115
|
+
new BN(depositAmount),
|
115
116
|
overrideTime
|
116
117
|
)
|
117
118
|
)
|
@@ -146,12 +147,12 @@ export async function depositVaultInstruction(
|
|
146
147
|
oldSmallerPublicKey: PublicKey,
|
147
148
|
newSmallerPublicKey: PublicKey,
|
148
149
|
newLargerPublicKey: PublicKey,
|
149
|
-
depositAmount:
|
150
|
+
depositAmount: BN,
|
150
151
|
overrideTime?: number
|
151
152
|
): Promise<TransactionInstruction> {
|
152
153
|
return await program.methods
|
153
154
|
.depositVault(
|
154
|
-
|
155
|
+
depositAmount,
|
155
156
|
new BN(overrideTime ?? Math.floor(Date.now() / 1000)) // override override time
|
156
157
|
)
|
157
158
|
.accounts({
|
@@ -87,11 +87,12 @@ export async function liquidateVault(
|
|
87
87
|
|
88
88
|
const [oldSmallerPublicKey, newSmallerPublicKey, newLargerPublicKey] = await getLinkedListAccounts(
|
89
89
|
program,
|
90
|
-
provider,
|
91
90
|
vaultAccount.vaultType,
|
92
91
|
vaultPublicKey,
|
93
|
-
0,
|
94
|
-
0,
|
92
|
+
new BN(0),
|
93
|
+
new BN(0),
|
94
|
+
new BN(0),
|
95
|
+
new BN(0),
|
95
96
|
false,
|
96
97
|
true
|
97
98
|
)
|
@@ -59,11 +59,12 @@ export async function loanVault(
|
|
59
59
|
)
|
60
60
|
const [oldSmallerPublicKey, newSmallerPublicKey, newLargerPublicKey] = await getLinkedListAccounts(
|
61
61
|
program,
|
62
|
-
provider,
|
63
62
|
vaultAccount.vaultType,
|
64
63
|
vaultPublicKey,
|
65
|
-
0,
|
66
|
-
|
64
|
+
new BN(0),
|
65
|
+
new BN(0),
|
66
|
+
new BN(loanAmount),
|
67
|
+
new BN(0),
|
67
68
|
false,
|
68
69
|
false
|
69
70
|
)
|
@@ -82,7 +83,7 @@ export async function loanVault(
|
|
82
83
|
oldSmallerPublicKey,
|
83
84
|
newSmallerPublicKey,
|
84
85
|
newLargerPublicKey,
|
85
|
-
loanAmount,
|
86
|
+
new BN(loanAmount),
|
86
87
|
overrideTime
|
87
88
|
)
|
88
89
|
)
|
@@ -102,7 +103,7 @@ export async function loanVaultInstruction(
|
|
102
103
|
oldSmallerPublicKey: PublicKey,
|
103
104
|
newSmallerPublicKey: PublicKey,
|
104
105
|
newLargerPublicKey: PublicKey,
|
105
|
-
loanAmount:
|
106
|
+
loanAmount: BN,
|
106
107
|
overrideTime?: number
|
107
108
|
): Promise<TransactionInstruction> {
|
108
109
|
const vaultSystemStatePublicKey = await getVaultSystemStatePublicKey()
|
@@ -116,7 +117,7 @@ export async function loanVaultInstruction(
|
|
116
117
|
|
117
118
|
return await program.methods
|
118
119
|
.loanVault(
|
119
|
-
|
120
|
+
loanAmount,
|
120
121
|
new BN(overrideTime ?? Math.floor(Date.now() / 1000)) // override override time
|
121
122
|
)
|
122
123
|
.accounts({
|
@@ -67,11 +67,12 @@ export async function redeemVault(
|
|
67
67
|
|
68
68
|
const [oldSmallerPublicKey, newSmallerPublicKey, newLargerPublicKey] = await getLinkedListAccounts(
|
69
69
|
program,
|
70
|
-
provider,
|
71
70
|
vaultAccount.vaultType,
|
72
71
|
vaultPublicKey,
|
73
|
-
0,
|
74
|
-
0,
|
72
|
+
new BN(0),
|
73
|
+
new BN(0),
|
74
|
+
new BN(0),
|
75
|
+
new BN(0),
|
75
76
|
true,
|
76
77
|
false
|
77
78
|
)
|
@@ -91,7 +92,7 @@ export async function redeemVault(
|
|
91
92
|
oldSmallerPublicKey,
|
92
93
|
newSmallerPublicKey,
|
93
94
|
newLargerPublicKey,
|
94
|
-
redeemAmount,
|
95
|
+
new BN(redeemAmount),
|
95
96
|
transactionOverrideTime
|
96
97
|
)
|
97
98
|
)
|
@@ -112,7 +113,7 @@ export async function redeemVaultInstruction(
|
|
112
113
|
oldSmallerPublicKey: PublicKey,
|
113
114
|
newSmallerPublicKey: PublicKey,
|
114
115
|
newLargerPublicKey: PublicKey,
|
115
|
-
redeemAmount:
|
116
|
+
redeemAmount: BN,
|
116
117
|
transactionOverrideTime?: number
|
117
118
|
): Promise<TransactionInstruction> {
|
118
119
|
const vaultSystemStatePublicKey = await getVaultSystemStatePublicKey()
|
@@ -125,7 +126,7 @@ export async function redeemVaultInstruction(
|
|
125
126
|
)
|
126
127
|
return await program.methods
|
127
128
|
.redeemVault(
|
128
|
-
|
129
|
+
redeemAmount,
|
129
130
|
new BN(transactionOverrideTime ?? Date.now() / 1000) // override start time
|
130
131
|
)
|
131
132
|
.accounts({
|
@@ -44,6 +44,7 @@ export async function refreshOraclePriceInstruction(
|
|
44
44
|
[enc.encode(collateralType), enc.encode('State')],
|
45
45
|
HEDGE_PROGRAM_PUBLICKEY
|
46
46
|
)
|
47
|
+
const oracleInfo = await program.account.oracleInfoForCollateralType.fetch(oracleInfoAccount)
|
47
48
|
|
48
49
|
return await program.methods
|
49
50
|
.refreshOraclePrice(
|
@@ -53,9 +54,9 @@ export async function refreshOraclePriceInstruction(
|
|
53
54
|
.accounts({
|
54
55
|
oracleInfoAccount: oracleInfoAccount,
|
55
56
|
vaultTypeAccount: vaultTypeAccount,
|
56
|
-
oracleChainlink:
|
57
|
-
oraclePyth:
|
58
|
-
oracleSwitchboard:
|
57
|
+
oracleChainlink: oracleInfo.oracleChainlink,
|
58
|
+
oraclePyth: oracleInfo.oraclePyth,
|
59
|
+
oracleSwitchboard: oracleInfo.oracleSwitchboard,
|
59
60
|
systemProgram: SystemProgram.programId,
|
60
61
|
chainlinkProgram: CHAINLINK_PROGRAM_ID,
|
61
62
|
})
|
@@ -75,12 +76,12 @@ const pythAccounts = {
|
|
75
76
|
}
|
76
77
|
const chainlinkAccounts = {
|
77
78
|
Testing: SystemProgram.programId,
|
78
|
-
Devnet: new PublicKey('
|
79
|
+
Devnet: new PublicKey('HgTtcbcmp5BeThax5AU8vg4VwK79qAvAKKFMs8txMLW6'),
|
79
80
|
MainnetBeta: SystemProgram.programId, // CHAINLINK NOT ON MAINNET YET
|
80
81
|
}
|
81
82
|
const switchboardAccounts = {
|
82
83
|
Testing: SystemProgram.programId,
|
83
84
|
// Devnet: new PublicKey('GvDMxPzN1sCj7L26YDK2HnMRXEQmQ2aemov8YBtPS7vR'),
|
84
|
-
Devnet: new PublicKey('
|
85
|
+
Devnet: new PublicKey('GvDMxPzN1sCj7L26YDK2HnMRXEQmQ2aemov8YBtPS7vR'),
|
85
86
|
MainnetBeta: SystemProgram.programId, // Switchboard V2 NOT ON MAINNET YET
|
86
87
|
}
|
@@ -49,11 +49,12 @@ export async function repayVault(
|
|
49
49
|
|
50
50
|
const [oldSmallerPublicKey, newSmallerPublicKey, newLargerPublicKey] = await getLinkedListAccounts(
|
51
51
|
program,
|
52
|
-
provider,
|
53
52
|
vaultAccount.vaultType,
|
54
53
|
vaultPublicKey,
|
55
|
-
0,
|
56
|
-
|
54
|
+
new BN(0),
|
55
|
+
new BN(0),
|
56
|
+
new BN(0),
|
57
|
+
new BN(Math.abs(repayAmount)),
|
57
58
|
false,
|
58
59
|
false
|
59
60
|
)
|
@@ -72,7 +73,7 @@ export async function repayVault(
|
|
72
73
|
oldSmallerPublicKey,
|
73
74
|
newSmallerPublicKey,
|
74
75
|
newLargerPublicKey,
|
75
|
-
repayAmount,
|
76
|
+
new BN(repayAmount),
|
76
77
|
overrideTime
|
77
78
|
)
|
78
79
|
)
|
@@ -92,7 +93,7 @@ export async function repayVaultInstruction(
|
|
92
93
|
oldSmallerPublicKey: PublicKey,
|
93
94
|
newSmallerPublicKey: PublicKey,
|
94
95
|
newLargerPublicKey: PublicKey,
|
95
|
-
repayAmount:
|
96
|
+
repayAmount: BN,
|
96
97
|
overrideTime?: number
|
97
98
|
): Promise<TransactionInstruction> {
|
98
99
|
const vaultSystemStatePublicKey = await getVaultSystemStatePublicKey()
|
@@ -106,7 +107,7 @@ export async function repayVaultInstruction(
|
|
106
107
|
|
107
108
|
return await program.methods
|
108
109
|
.repayVault(
|
109
|
-
|
110
|
+
repayAmount,
|
110
111
|
new BN(overrideTime ?? Math.floor(Date.now() / 1000)) // override override time
|
111
112
|
)
|
112
113
|
.accounts({
|
@@ -69,11 +69,12 @@ export async function withdrawVault(
|
|
69
69
|
|
70
70
|
const [oldSmallerPublicKey, newSmallerPublicKey, newLargerPublicKey] = await getLinkedListAccounts(
|
71
71
|
program,
|
72
|
-
provider,
|
73
72
|
vaultAccount.vaultType,
|
74
73
|
vaultPublicKey,
|
75
|
-
|
76
|
-
|
74
|
+
new BN(0),
|
75
|
+
new BN(Math.abs(withdrawAmount)),
|
76
|
+
new BN(0),
|
77
|
+
new BN(0),
|
77
78
|
false,
|
78
79
|
false
|
79
80
|
)
|
@@ -95,7 +96,7 @@ export async function withdrawVault(
|
|
95
96
|
oldSmallerPublicKey,
|
96
97
|
newSmallerPublicKey,
|
97
98
|
newLargerPublicKey,
|
98
|
-
withdrawAmount,
|
99
|
+
new BN(withdrawAmount),
|
99
100
|
overrideTime
|
100
101
|
)
|
101
102
|
)
|
@@ -119,12 +120,12 @@ export async function withdrawVaultInstruction(
|
|
119
120
|
oldSmallerPublicKey: PublicKey,
|
120
121
|
newSmallerPublicKey: PublicKey,
|
121
122
|
newLargerPublicKey: PublicKey,
|
122
|
-
withdrawAmount:
|
123
|
+
withdrawAmount: BN,
|
123
124
|
overrideTime?: number
|
124
125
|
): Promise<TransactionInstruction> {
|
125
126
|
return await program.methods
|
126
127
|
.withdrawVault(
|
127
|
-
|
128
|
+
withdrawAmount,
|
128
129
|
new BN(overrideTime ?? Math.floor(Date.now() / 1000)) // override override time
|
129
130
|
)
|
130
131
|
.accounts({
|
@@ -20,10 +20,10 @@ export class VaultAccount {
|
|
20
20
|
pdaSalt: string
|
21
21
|
|
22
22
|
/** The deposited collateral of the vault (in SOL Lamports). */
|
23
|
-
deposited
|
23
|
+
deposited = new BN(0)
|
24
24
|
|
25
25
|
/** The outstanding debt of the vault (in USH Lamports). Denormalized to time 0. */
|
26
|
-
denormalizedDebt
|
26
|
+
denormalizedDebt = new BN(0)
|
27
27
|
|
28
28
|
/** The ordered number of when this vault was created. */
|
29
29
|
vaultNumber = 0
|
@@ -50,8 +50,10 @@ export class VaultAccount {
|
|
50
50
|
this.publicKey = publicKey
|
51
51
|
this.vaultOwner = vault.vaultOwner
|
52
52
|
this.pdaSalt = vault.pdaSalt
|
53
|
-
|
54
|
-
this.
|
53
|
+
|
54
|
+
this.deposited = vault.deposited
|
55
|
+
this.denormalizedDebt = vault.denormalizedDebt
|
56
|
+
|
55
57
|
if (vault.vaultNumber) {
|
56
58
|
this.vaultNumber = vault.vaultNumber.toNumber()
|
57
59
|
}
|
@@ -80,14 +82,15 @@ export class VaultAccount {
|
|
80
82
|
return publicKey && publicKey.toString() === this.vaultOwner.toString()
|
81
83
|
}
|
82
84
|
|
83
|
-
/**
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
public inSol(): number {
|
89
|
-
|
90
|
-
|
85
|
+
// /**
|
86
|
+
// * Get the collateral value in SOL
|
87
|
+
// *
|
88
|
+
// * @returns collateral value in SOL
|
89
|
+
// */
|
90
|
+
// public inSol(): number {
|
91
|
+
// This should not be LAMPORTS_PER_SOL. Should be collateral units like Ray
|
92
|
+
// return new Decimal(this.deposited.toString()).div(LAMPORTS_PER_SOL).toNumber()
|
93
|
+
// }
|
91
94
|
|
92
95
|
/**
|
93
96
|
* Get the debt value in USH
|
@@ -95,7 +98,7 @@ export class VaultAccount {
|
|
95
98
|
* @returns debt value in USH
|
96
99
|
*/
|
97
100
|
public inUsd(): number {
|
98
|
-
return this.denormalizedDebt
|
101
|
+
return new Decimal(this.denormalizedDebt.toString()).div(LAMPORTS_PER_SOL).toNumber()
|
99
102
|
}
|
100
103
|
|
101
104
|
/**
|
@@ -109,42 +112,82 @@ export class VaultAccount {
|
|
109
112
|
.substring(this.publicKey.toString().length - 6)}`
|
110
113
|
}
|
111
114
|
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
115
|
+
/**
|
116
|
+
* Add additional debt to the vault.
|
117
|
+
*
|
118
|
+
* @param {BN} additionalDebt - Additional normalized debt to add in (USH) lamports.
|
119
|
+
* @param {VaultType} vaultTypeAccount - Vault's vaultType
|
120
|
+
*
|
121
|
+
*/
|
122
|
+
public addDebt(additionalDebt: BN, vaultTypeAccount: VaultType) {
|
123
|
+
const additionalDebtAsDecimal = new Decimal(additionalDebt.toString())
|
124
|
+
// Calculate the fee on the loan
|
125
|
+
const loanFee = vaultTypeAccount.loanInitFee.mul(additionalDebtAsDecimal)
|
117
126
|
|
118
|
-
|
119
|
-
const
|
120
|
-
|
127
|
+
// TODO: There's a chance this needs to be .Floor()
|
128
|
+
const totalNormalizedLoan = additionalDebtAsDecimal.add(loanFee)
|
129
|
+
|
130
|
+
const denormalizedNewDebt = new BN(totalNormalizedLoan.div(vaultTypeAccount.cumulativeRate).floor().toString())
|
131
|
+
this.denormalizedDebt = this.denormalizedDebt.add(denormalizedNewDebt)
|
121
132
|
}
|
122
133
|
|
123
|
-
|
124
|
-
|
134
|
+
/**
|
135
|
+
* Repay debt on a vault
|
136
|
+
*
|
137
|
+
* @param {BN} repayAmount - Normalized debt to repay in (USH) lamports.
|
138
|
+
* @param {VaultType} vaultTypeAccount - Vault's vaultType
|
139
|
+
*
|
140
|
+
*/
|
141
|
+
public repayDebt(repayAmount: BN, vaultTypeAccount: VaultType) {
|
142
|
+
const denormalizedRepayment = new Decimal(repayAmount.toString()).div(vaultTypeAccount.cumulativeRate).floor()
|
143
|
+
|
144
|
+
this.denormalizedDebt = this.denormalizedDebt.sub(new BN(denormalizedRepayment.toString()))
|
145
|
+
}
|
146
|
+
|
147
|
+
/**
|
148
|
+
* Deposit Collateral
|
149
|
+
*
|
150
|
+
* @param {BN} depositAmount - Amount to deposit in (CollateralMint) lamports
|
151
|
+
*
|
152
|
+
*/
|
153
|
+
public depositCollateral(depositAmount: BN) {
|
154
|
+
this.deposited = this.deposited.add(depositAmount)
|
155
|
+
}
|
156
|
+
/**
|
157
|
+
* Withdraw Collateral
|
158
|
+
*
|
159
|
+
* @param {BN} withdrawAmount - Amount to withdraw in (CollateralMint) lamports
|
160
|
+
*
|
161
|
+
*/
|
162
|
+
public withdrawCollateral(withdrawAmount: BN) {
|
163
|
+
this.deposited = this.deposited.sub(withdrawAmount)
|
125
164
|
}
|
126
165
|
|
127
166
|
public redeem() {
|
128
167
|
// TODO - Calculate actual redeem amount and adust correctly
|
129
|
-
this.denormalizedDebt = 0
|
168
|
+
this.denormalizedDebt = new BN(0)
|
130
169
|
this.vaultStatus = 'initialized'
|
131
170
|
}
|
132
171
|
public liquidate() {
|
133
172
|
// TODO - Calculate actual liquidate amount and adust correctly
|
134
|
-
this.denormalizedDebt = 0
|
173
|
+
this.denormalizedDebt = new BN(0)
|
135
174
|
this.vaultStatus = 'liquidated'
|
136
175
|
}
|
137
176
|
|
138
177
|
public updateDebtAndCollateral(vaultTypeAccountData: VaultType) {
|
139
|
-
|
140
|
-
|
178
|
+
this.denormalizedDebt = new BN(
|
179
|
+
vaultTypeAccountData.debtRedistributionProduct
|
141
180
|
.div(this.debtProductSnapshotBytes)
|
142
|
-
.mul(new Decimal(this.denormalizedDebt))
|
143
|
-
.
|
181
|
+
.mul(new Decimal(this.denormalizedDebt.toString()))
|
182
|
+
.floor()
|
183
|
+
.toString()
|
184
|
+
)
|
144
185
|
|
145
186
|
const extraCollateralDeposited =
|
146
|
-
this.denormalizedDebt
|
147
|
-
|
187
|
+
new Decimal(this.denormalizedDebt.toString()).mul(
|
188
|
+
vaultTypeAccountData.collateralRedistributionAccumulator.sub(this.collateralAccumulatorSnapshotBytes).toNumber()
|
189
|
+
).floor()
|
190
|
+
this.deposited = this.deposited.add(new BN(extraCollateralDeposited.toString()))
|
148
191
|
|
149
192
|
this.collateralAccumulatorSnapshotBytes = vaultTypeAccountData.collateralRedistributionAccumulator
|
150
193
|
this.debtProductSnapshotBytes = vaultTypeAccountData.debtRedistributionProduct
|
@@ -156,8 +199,8 @@ export class VaultAccount {
|
|
156
199
|
arrow = ' <----!!'
|
157
200
|
}
|
158
201
|
let collateralRatio = 'Infinite'
|
159
|
-
if (this.denormalizedDebt
|
160
|
-
collateralRatio = new Decimal(this.deposited).div(new Decimal(this.denormalizedDebt)).toString()
|
202
|
+
if (this.denormalizedDebt.gt(new BN(0))) {
|
203
|
+
collateralRatio = new Decimal(this.deposited.toString()).div(new Decimal(this.denormalizedDebt.toString())).toString()
|
161
204
|
}
|
162
205
|
|
163
206
|
let nextVault = 'None'
|
@@ -165,9 +208,9 @@ export class VaultAccount {
|
|
165
208
|
nextVault = this.nextVaultToRedeem.toString().substring(0, 6)
|
166
209
|
}
|
167
210
|
|
168
|
-
return `${this.publicKey.toString().substring(0, 6)}. Debt: ${
|
169
|
-
this.
|
170
|
-
}
|
211
|
+
return `${this.publicKey.toString().substring(0, 6)}. Debt: ${this.denormalizedDebt} Collat: ${
|
212
|
+
this.deposited
|
213
|
+
} Ratio: ${collateralRatio} ${arrow} `
|
171
214
|
}
|
172
215
|
/**
|
173
216
|
* Creates a VaultAccount from a slice of data
|
@@ -1,4 +1,4 @@
|
|
1
|
-
import { Program, Provider } from '@project-serum/anchor'
|
1
|
+
import { Program, Provider, BN } from '@project-serum/anchor'
|
2
2
|
import { PublicKey, Signer } from '@solana/web3.js'
|
3
3
|
import _ from 'underscore'
|
4
4
|
import { getVaultSystemStatePublicKey, getVaultTypeOracleAccountPublicKey, HEDGE_PROGRAM_PUBLICKEY } from '../Constants'
|
@@ -12,13 +12,28 @@ import * as borsh from '@project-serum/borsh'
|
|
12
12
|
import base58 from 'bs58'
|
13
13
|
import VaultType from '../state/VaultType'
|
14
14
|
|
15
|
+
/**
|
16
|
+
* Get the accounts the left and right for re-inserting in the linked list
|
17
|
+
*
|
18
|
+
* @param {Program<Vault>} program - Anchor program <Vault ILD>
|
19
|
+
* @param {PublicKey} vaultTypeAccountPublicKey - Vault Type Account PublicKey
|
20
|
+
* @param {PublicKey} vaultPublicKey - Vault Account PublicKey
|
21
|
+
* @param {BN} depositAmount - Amount that will be deposited into vault with instruction
|
22
|
+
* @param {BN} withdrawAmount - Amount that will be withdrawn from vault with instruction
|
23
|
+
* @param {BN} loanAmount - Amount that will be deposited into vault with transaction (sans fees)
|
24
|
+
* @param {BN} repayAmount - Amount that will be repaid into vault with transaction
|
25
|
+
* @param {boolean} redeem - True if vault is going to be redeemed fully
|
26
|
+
* @param {boolean} liquidate - True if vault is going to be liquidated fully
|
27
|
+
* @param {VaultAccount[]} cachedVaults - Optional list of cached vaults. Saves a request to the on-chain data.
|
28
|
+
*/
|
15
29
|
export async function getLinkedListAccounts(
|
16
30
|
program: Program<Vault>,
|
17
|
-
provider: Provider,
|
18
31
|
vaultTypeAccountPublicKey: PublicKey,
|
19
32
|
vaultPublicKey: PublicKey,
|
20
|
-
depositAmount:
|
21
|
-
|
33
|
+
depositAmount: BN,
|
34
|
+
withdrawAmount: BN,
|
35
|
+
loanAmount: BN,
|
36
|
+
repayAmount: BN,
|
22
37
|
redeem: boolean,
|
23
38
|
liquidate: boolean,
|
24
39
|
cachedVaults?: VaultAccount[]
|
@@ -58,7 +73,7 @@ export async function getLinkedListAccounts(
|
|
58
73
|
|
59
74
|
// Remove any vaults with no debt or collateral
|
60
75
|
vaults = _.filter(vaults, (vault) => {
|
61
|
-
return vault.denormalizedDebt
|
76
|
+
return vault.denormalizedDebt.gt(new BN(0)) && vault.deposited.gt(new BN(0))
|
62
77
|
})
|
63
78
|
|
64
79
|
// Sort them
|
@@ -117,10 +132,13 @@ export async function getLinkedListAccounts(
|
|
117
132
|
|
118
133
|
// Now that we know it's def in the list, iterate the list and update
|
119
134
|
// this vault with the operation we're going to apply
|
120
|
-
const newNormalizedDebt = new Decimal(loanAmount)
|
121
135
|
vaults[indexBefore].updateDebtAndCollateral(vaultType)
|
122
|
-
|
123
|
-
vaults[indexBefore].
|
136
|
+
|
137
|
+
vaults[indexBefore].addDebt(loanAmount, vaultType)
|
138
|
+
vaults[indexBefore].repayDebt(repayAmount, vaultType)
|
139
|
+
|
140
|
+
vaults[indexBefore].depositCollateral(depositAmount)
|
141
|
+
vaults[indexBefore].withdrawCollateral(withdrawAmount)
|
124
142
|
|
125
143
|
if (liquidate) {
|
126
144
|
vaults[indexBefore].liquidate()
|
@@ -129,7 +147,7 @@ export async function getLinkedListAccounts(
|
|
129
147
|
vaults[indexBefore].redeem()
|
130
148
|
}
|
131
149
|
|
132
|
-
if (vaults[indexBefore].denormalizedDebt
|
150
|
+
if (vaults[indexBefore].denormalizedDebt.isZero()) {
|
133
151
|
vaults.splice(indexBefore, 1)
|
134
152
|
}
|
135
153
|
|
@@ -180,12 +198,12 @@ export async function getLinkedListAccounts(
|
|
180
198
|
// Sort function we can use to sort the vaults
|
181
199
|
// Sorted by collateral ratio. If two are the same, newer vault first
|
182
200
|
function sortVaults(a: VaultAccount, b: VaultAccount) {
|
183
|
-
const aRatio = a.deposited
|
184
|
-
const bRatio = b.deposited
|
185
|
-
if (aRatio
|
201
|
+
const aRatio = new Decimal(a.deposited.toString()).div(new Decimal(a.denormalizedDebt.toString()))
|
202
|
+
const bRatio = new Decimal(b.deposited.toString()).div(new Decimal(b.denormalizedDebt.toString()))
|
203
|
+
if (aRatio.equals(bRatio)) {
|
186
204
|
return a.publicKey.toString() > b.publicKey.toString() ? 1 : -1
|
187
205
|
}
|
188
|
-
return aRatio -
|
206
|
+
return aRatio.greaterThan(bRatio) ? 1 : -1
|
189
207
|
}
|
190
208
|
|
191
209
|
async function getMiniVaults(program: Program<Vault>, vaultTypePublicKey: PublicKey) {
|