hedge-web3 0.1.46 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (71) hide show
  1. package/declarations/Constants.d.ts +2 -1
  2. package/declarations/idl/vault.d.ts +109 -35
  3. package/declarations/instructions/claimLiquidationPoolPosition.d.ts +1 -1
  4. package/declarations/instructions/claimStakingPoolPosition.d.ts +1 -1
  5. package/declarations/instructions/closeLiquidationPoolPosition.d.ts +1 -1
  6. package/declarations/instructions/createStakingPool.d.ts +1 -1
  7. package/declarations/instructions/createVault.d.ts +1 -1
  8. package/declarations/instructions/depositLiquidationPool.d.ts +1 -1
  9. package/declarations/instructions/depositStakingPool.d.ts +1 -1
  10. package/declarations/instructions/depositVault.d.ts +1 -1
  11. package/declarations/instructions/initHedgeFoundation.d.ts +1 -1
  12. package/declarations/instructions/liquidateVault.d.ts +1 -1
  13. package/declarations/instructions/loanVault.d.ts +1 -1
  14. package/declarations/instructions/redeemVault.d.ts +1 -1
  15. package/declarations/instructions/refreshOraclePrice.d.ts +3 -3
  16. package/declarations/instructions/repayVault.d.ts +1 -1
  17. package/declarations/instructions/setHalted.d.ts +1 -1
  18. package/declarations/instructions/updateVaultType.d.ts +4 -1
  19. package/declarations/instructions/withdrawStakingPool.d.ts +1 -1
  20. package/declarations/instructions/withdrawVault.d.ts +1 -1
  21. package/declarations/state/VaultAccount.d.ts +4 -3
  22. package/declarations/utils/getLinkedListAccounts.d.ts +1 -1
  23. package/lib/Constants.js +3 -2
  24. package/lib/idl/vault.js +109 -35
  25. package/lib/instructions/claimLiquidationPoolPosition.js +5 -1
  26. package/lib/instructions/claimStakingPoolPosition.js +5 -1
  27. package/lib/instructions/closeLiquidationPoolPosition.js +5 -1
  28. package/lib/instructions/createStakingPool.js +5 -2
  29. package/lib/instructions/createVault.js +5 -1
  30. package/lib/instructions/depositLiquidationPool.js +5 -1
  31. package/lib/instructions/depositStakingPool.js +5 -1
  32. package/lib/instructions/depositVault.js +5 -1
  33. package/lib/instructions/initHedgeFoundation.js +5 -1
  34. package/lib/instructions/initHedgeFoundationTokens.js +5 -1
  35. package/lib/instructions/liquidateVault.js +5 -1
  36. package/lib/instructions/loanVault.js +5 -3
  37. package/lib/instructions/redeemVault.js +5 -1
  38. package/lib/instructions/refreshOraclePrice.js +6 -1
  39. package/lib/instructions/repayVault.js +5 -1
  40. package/lib/instructions/setHalted.js +5 -1
  41. package/lib/instructions/updateVaultType.js +9 -2
  42. package/lib/instructions/withdrawStakingPool.js +5 -1
  43. package/lib/instructions/withdrawVault.js +5 -1
  44. package/lib/state/VaultAccount.js +11 -9
  45. package/lib/utils/getLinkedListAccounts.js +48 -48
  46. package/package.json +1 -1
  47. package/src/Constants.ts +2 -1
  48. package/src/idl/vault.ts +218 -70
  49. package/src/instructions/claimLiquidationPoolPosition.ts +3 -2
  50. package/src/instructions/claimStakingPoolPosition.ts +3 -2
  51. package/src/instructions/closeLiquidationPoolPosition.ts +3 -2
  52. package/src/instructions/createStakingPool.ts +3 -3
  53. package/src/instructions/createVault.ts +3 -2
  54. package/src/instructions/depositLiquidationPool.ts +3 -2
  55. package/src/instructions/depositStakingPool.ts +3 -2
  56. package/src/instructions/depositVault.ts +3 -3
  57. package/src/instructions/initHedgeFoundation.ts +3 -2
  58. package/src/instructions/initHedgeFoundationTokens.ts +2 -1
  59. package/src/instructions/liquidateVault.ts +5 -3
  60. package/src/instructions/loanVault.ts +3 -4
  61. package/src/instructions/redeemVault.ts +3 -2
  62. package/src/instructions/refreshOraclePrice.ts +7 -4
  63. package/src/instructions/repayVault.ts +3 -2
  64. package/src/instructions/setHalted.ts +3 -2
  65. package/src/instructions/updateVaultType.ts +10 -2
  66. package/src/instructions/withdrawStakingPool.ts +3 -2
  67. package/src/instructions/withdrawVault.ts +3 -2
  68. package/src/state/VaultAccount.ts +17 -12
  69. package/src/state/VaultType.ts +62 -0
  70. package/src/utils/getLinkedListAccounts.ts +54 -49
  71. package/src/utils/sendAndConfirmWithDebug.ts +27 -0
@@ -19,7 +19,8 @@ import {
19
19
  getUshMintPublicKey,
20
20
  getVaultSystemStatePublicKey,
21
21
  } from '../Constants'
22
- import { Vault } from 'idl/vault'
22
+ import sendAndConfirmWithDebug from '../utils/sendAndConfirmWithDebug'
23
+ import { Vault } from '../idl/vault'
23
24
 
24
25
  export async function initHedgeFoundation(program: Program<Vault>, provider: Provider, payer: Signer): Promise<PublicKey> {
25
26
  const poolEra = Keypair.generate()
@@ -27,7 +28,7 @@ export async function initHedgeFoundation(program: Program<Vault>, provider: Pro
27
28
  await initHedgeFoundationInstruction(program, poolEra.publicKey, payer.publicKey)
28
29
  )
29
30
 
30
- await sendAndConfirmTransaction(provider.connection, transaction, [payer, poolEra]).catch(parseAnchorErrors)
31
+ await sendAndConfirmWithDebug(provider.connection, transaction, [payer, poolEra]).catch(parseAnchorErrors)
31
32
  return payer.publicKey
32
33
  }
33
34
 
@@ -19,12 +19,13 @@ import {
19
19
  getUshMintPublicKey,
20
20
  getVaultSystemStatePublicKey,
21
21
  } from '../Constants'
22
+ import sendAndConfirmWithDebug from '../utils/sendAndConfirmWithDebug'
22
23
 
23
24
  export async function initHedgeFoundationTokens(program: Program, provider: Provider, payer: Signer): Promise<PublicKey> {
24
25
  const poolEra = Keypair.generate()
25
26
  const transaction = new Transaction().add(await initHedgeFoundationTokensInstruction(program, payer.publicKey))
26
27
 
27
- await sendAndConfirmTransaction(provider.connection, transaction, [payer]).catch(parseAnchorErrors)
28
+ await sendAndConfirmWithDebug(provider.connection, transaction, [payer]).catch(parseAnchorErrors)
28
29
  return payer.publicKey
29
30
  }
30
31
 
@@ -1,6 +1,7 @@
1
- import { BN, Program, Provider } from '@project-serum/anchor'
1
+ import { BN, Program, Provider, translateAddress } from '@project-serum/anchor'
2
2
  import { ASSOCIATED_TOKEN_PROGRAM_ID, TOKEN_PROGRAM_ID, getOrCreateAssociatedTokenAccount } from '@solana/spl-token'
3
3
  import {
4
+ Connection,
4
5
  Keypair,
5
6
  PublicKey,
6
7
  sendAndConfirmTransaction,
@@ -20,7 +21,8 @@ import {
20
21
  getUshMintPublicKey,
21
22
  getVaultSystemStatePublicKey,
22
23
  } from '../Constants'
23
- import { Vault } from 'idl/vault'
24
+ import sendAndConfirmWithDebug from '../utils/sendAndConfirmWithDebug'
25
+ import { Vault } from '../idl/vault'
24
26
 
25
27
  export async function liquidateVault(
26
28
  program: Program<Vault>,
@@ -122,7 +124,7 @@ export async function liquidateVault(
122
124
  overrideTime
123
125
  )
124
126
  )
125
- await sendAndConfirmTransaction(provider.connection, transaction, [payer, history, newEra])
127
+ await sendAndConfirmWithDebug(provider.connection, transaction, [payer, history, newEra])
126
128
  return vaultPublicKey
127
129
  }
128
130
 
@@ -19,12 +19,11 @@ import {
19
19
  getVaultSystemStatePublicKey,
20
20
  HEDGE_PROGRAM_PUBLICKEY,
21
21
  } from '../Constants'
22
- import { Vault } from 'idl/vault'
22
+ import sendAndConfirmWithDebug from '../utils/sendAndConfirmWithDebug'
23
+ import { Vault } from '../idl/vault'
23
24
  import { parseAnchorErrors } from '../utils/Errors'
24
25
  import { VaultAccount } from '../state/VaultAccount'
25
26
 
26
- const fs = require('fs');
27
-
28
27
  export async function loanVault(
29
28
  program: Program<Vault>,
30
29
  provider: Provider,
@@ -87,7 +86,7 @@ export async function loanVault(
87
86
  overrideTime
88
87
  )
89
88
  )
90
- await sendAndConfirmTransaction(provider.connection, transaction, [payer, history]).catch(parseAnchorErrors)
89
+ await sendAndConfirmWithDebug(provider.connection, transaction, [payer, history])
91
90
  return vaultPublicKey
92
91
  }
93
92
 
@@ -19,7 +19,8 @@ import {
19
19
  getUshMintPublicKey,
20
20
  getVaultSystemStatePublicKey,
21
21
  } from '../Constants'
22
- import { Vault } from 'idl/vault'
22
+ import sendAndConfirmWithDebug from '../utils/sendAndConfirmWithDebug'
23
+ import { Vault } from '../idl/vault'
23
24
 
24
25
  export async function redeemVault(
25
26
  program: Program<Vault>,
@@ -94,7 +95,7 @@ export async function redeemVault(
94
95
  transactionOverrideTime
95
96
  )
96
97
  )
97
- await sendAndConfirmTransaction(provider.connection, transaction, [payer, history])
98
+ await sendAndConfirmWithDebug(provider.connection, transaction, [payer, history])
98
99
  return vaultPublicKey
99
100
  }
100
101
 
@@ -7,9 +7,11 @@ import {
7
7
  SystemProgram,
8
8
  Transaction,
9
9
  TransactionInstruction,
10
+ TransactionSignature,
10
11
  } from '@solana/web3.js'
11
- import { Vault } from 'idl/vault'
12
- import { HEDGE_PROGRAM_PUBLICKEY } from '../Constants'
12
+ import sendAndConfirmWithDebug from '../utils/sendAndConfirmWithDebug'
13
+ import { Vault } from '../idl/vault'
14
+ import { HEDGE_PROGRAM_PUBLICKEY, CHAINLINK_PROGRAM_ID } from '../Constants'
13
15
 
14
16
  export async function refreshOraclePrice(
15
17
  program: Program<Vault>,
@@ -19,11 +21,11 @@ export async function refreshOraclePrice(
19
21
  network: Cluster,
20
22
  overridePrice?: number,
21
23
  overrideTime?: number
22
- ): Promise<string> {
24
+ ): Promise<TransactionSignature | void> {
23
25
  const transaction = new Transaction().add(
24
26
  await refreshOraclePriceInstruction(program, collateralType, network, overridePrice, overrideTime)
25
27
  )
26
- return await sendAndConfirmTransaction(provider.connection, transaction, [payer])
28
+ return await sendAndConfirmWithDebug(provider.connection, transaction, [payer])
27
29
  }
28
30
 
29
31
  export async function refreshOraclePriceInstruction(
@@ -55,6 +57,7 @@ export async function refreshOraclePriceInstruction(
55
57
  oraclePyth: pythAccounts[network],
56
58
  oracleSwitchboard: switchboardAccounts[network],
57
59
  systemProgram: SystemProgram.programId,
60
+ chainlinkProgram: CHAINLINK_PROGRAM_ID,
58
61
  })
59
62
  .instruction()
60
63
  }
@@ -18,7 +18,8 @@ import {
18
18
  getUshMintPublicKey,
19
19
  getVaultSystemStatePublicKey,
20
20
  } from '../Constants'
21
- import { Vault } from 'idl/vault'
21
+ import sendAndConfirmWithDebug from '../utils/sendAndConfirmWithDebug'
22
+ import { Vault } from '../idl/vault'
22
23
 
23
24
  export async function repayVault(
24
25
  program: Program<Vault>,
@@ -75,7 +76,7 @@ export async function repayVault(
75
76
  overrideTime
76
77
  )
77
78
  )
78
- await sendAndConfirmTransaction(provider.connection, transaction, [payer, history])
79
+ await sendAndConfirmWithDebug(provider.connection, transaction, [payer, history])
79
80
  return vaultPublicKey
80
81
  }
81
82
 
@@ -22,7 +22,8 @@ import {
22
22
  } from '../Constants'
23
23
 
24
24
  import { parseAnchorErrors } from '../utils/Errors'
25
- import { Vault } from 'idl/vault'
25
+ import sendAndConfirmWithDebug from '../utils/sendAndConfirmWithDebug'
26
+ import { Vault } from '../idl/vault'
26
27
 
27
28
  export async function setHalted(
28
29
  program: Program<Vault>,
@@ -36,7 +37,7 @@ export async function setHalted(
36
37
  await setHaltedInstruction(program, vaultSystemStatePublicKey, payer.publicKey, halted)
37
38
  )
38
39
 
39
- await sendAndConfirmTransaction(provider.connection, transaction, [payer]).catch(parseAnchorErrors)
40
+ await sendAndConfirmWithDebug(provider.connection, transaction, [payer]).catch(parseAnchorErrors)
40
41
  return vaultSystemStatePublicKey
41
42
  }
42
43
 
@@ -21,7 +21,8 @@ import {
21
21
 
22
22
  import { v4 as uuidv4 } from 'uuid'
23
23
  import { parseAnchorErrors } from '../utils/Errors'
24
- import { Vault } from 'idl/vault'
24
+ import sendAndConfirmWithDebug from '../utils/sendAndConfirmWithDebug'
25
+ import { Vault } from '../idl/vault'
25
26
 
26
27
  export interface VaultTypeConfig {
27
28
  maxDebtExtended?: BN
@@ -32,6 +33,10 @@ export interface VaultTypeConfig {
32
33
  oraclePyth?: PublicKey
33
34
  oracleSwitchboard?: PublicKey
34
35
 
36
+ priorityPyth?: number,
37
+ priorityChainlink?: number,
38
+ prioritySwitchboard?: number,
39
+
35
40
  deprecated?: boolean
36
41
  }
37
42
 
@@ -55,7 +60,7 @@ export async function updateVaultType(
55
60
  )
56
61
  )
57
62
 
58
- await sendAndConfirmTransaction(provider.connection, transaction, [payer])
63
+ await sendAndConfirmWithDebug(provider.connection, transaction, [payer])
59
64
  return vaultSystemStatePublicKey
60
65
  }
61
66
 
@@ -75,6 +80,9 @@ export async function updateVaultTypeStatusInstruction(
75
80
  oraclePyth: vaultTypeConfig.oraclePyth ?? null,
76
81
  oracleSwitchboard: vaultTypeConfig.oracleSwitchboard ?? null,
77
82
  deprecated: vaultTypeConfig.deprecated ?? null,
83
+ priorityPyth: vaultTypeConfig.priorityPyth ?? null,
84
+ priorityChainlink: vaultTypeConfig.priorityChainlink ?? null,
85
+ prioritySwitchboard: vaultTypeConfig.prioritySwitchboard ?? null,
78
86
  }
79
87
 
80
88
  return await program.methods
@@ -18,7 +18,8 @@ import {
18
18
  getUshMintPublicKey,
19
19
  getVaultSystemStatePublicKey,
20
20
  } from '../Constants'
21
- import { Vault } from 'idl/vault'
21
+ import sendAndConfirmWithDebug from '../utils/sendAndConfirmWithDebug'
22
+ import { Vault } from '../idl/vault'
22
23
 
23
24
  export async function withdrawStakingPool(
24
25
  program: Program<Vault>,
@@ -38,7 +39,7 @@ export async function withdrawStakingPool(
38
39
  overrideStartTime
39
40
  )
40
41
  )
41
- await sendAndConfirmTransaction(provider.connection, transaction, [payer]).catch(parseAnchorErrors)
42
+ await sendAndConfirmWithDebug(provider.connection, transaction, [payer]).catch(parseAnchorErrors)
42
43
  return poolPosition.publicKey
43
44
  }
44
45
 
@@ -19,7 +19,8 @@ import {
19
19
  getHedgeMintPublicKey,
20
20
  } from '../Constants'
21
21
  import { getLinkedListAccounts } from '../utils/getLinkedListAccounts'
22
- import { Vault } from 'idl/vault'
22
+ import sendAndConfirmWithDebug from '../utils/sendAndConfirmWithDebug'
23
+ import { Vault } from '../idl/vault'
23
24
 
24
25
  export async function withdrawVault(
25
26
  program: Program<Vault>,
@@ -98,7 +99,7 @@ export async function withdrawVault(
98
99
  overrideTime
99
100
  )
100
101
  )
101
- await sendAndConfirmTransaction(provider.connection, transaction, [payer, history])
102
+ await sendAndConfirmWithDebug(provider.connection, transaction, [payer, history])
102
103
  return vaultPublicKey
103
104
  }
104
105
 
@@ -3,6 +3,8 @@ import Decimal from 'decimal.js'
3
3
  import { DecimalFromU128 } from '../HedgeDecimal'
4
4
 
5
5
  import * as borsh from '@project-serum/borsh'
6
+ import BN from 'bn.js'
7
+ import VaultType from './VaultType'
6
8
 
7
9
  /**
8
10
  * A class that represents an on-chian vault.
@@ -32,7 +34,7 @@ export class VaultAccount {
32
34
  /** Collateral redistribution snapshot' */
33
35
  collateralAccumulatorSnapshotBytes = new Decimal(0)
34
36
 
35
- /** The vault type eg '2-SOL-150-0' */
37
+ /** The vault type eg '2-SOL-150-0-----' */
36
38
  vaultTypeName: string
37
39
 
38
40
  /** Current State of the vault ("Open", "Closed", "Liquidated") */
@@ -105,11 +107,17 @@ export class VaultAccount {
105
107
  .substring(this.publicKey.toString().length - 6)}`
106
108
  }
107
109
 
108
- public addDebt(newNormalizedDebt: Decimal, vaultTypeCompoundedInterest: Decimal) {
109
- const denormalizedNewDebt = newNormalizedDebt.div(vaultTypeCompoundedInterest)
110
+ public addDebt(additionalDebt: Decimal, vaultTypeAccount: VaultType) {
111
+ let loanFee = new Decimal(0)
112
+ if (additionalDebt.isPositive()){
113
+ loanFee = vaultTypeAccount.loanInitFee.mul(additionalDebt)
114
+ }
115
+
116
+ const totalNormalizedLoan = additionalDebt.add(loanFee)
117
+ const denormalizedNewDebt = totalNormalizedLoan.div(new Decimal(vaultTypeAccount.cumulativeRate.toString()))
110
118
  this.denormalizedDebt = denormalizedNewDebt.add(new Decimal(this.denormalizedDebt)).floor().toNumber()
111
- // this.denormalizedDebt = parseFloat(this.denormalizedDebt.toFixed(0))
112
119
  }
120
+
113
121
  public addDeposit(depositAmount: number) {
114
122
  this.deposited += depositAmount
115
123
  }
@@ -125,22 +133,19 @@ export class VaultAccount {
125
133
  this.vaultStatus = 'liquidated'
126
134
  }
127
135
 
128
- public updateDebtAndCollateral(vaultTypeAccountData: any) {
129
- const debtProductCurrent = DecimalFromU128(vaultTypeAccountData.debtRedistributionProduct)
130
-
131
- const collateralAccumulatorCurrent = DecimalFromU128(vaultTypeAccountData.collateralRedistributionAccumulator)
136
+ public updateDebtAndCollateral(vaultTypeAccountData: VaultType) {
132
137
 
133
- this.denormalizedDebt = debtProductCurrent
138
+ this.denormalizedDebt = vaultTypeAccountData.debtRedistributionProduct
134
139
  .div(this.debtProductSnapshotBytes)
135
140
  .mul(new Decimal(this.denormalizedDebt))
136
141
  .toNumber()
137
142
 
138
143
  const extraCollateralDeposited =
139
- this.denormalizedDebt * collateralAccumulatorCurrent.sub(this.collateralAccumulatorSnapshotBytes).toNumber()
144
+ this.denormalizedDebt * vaultTypeAccountData.collateralRedistributionAccumulator.sub(this.collateralAccumulatorSnapshotBytes).toNumber()
140
145
  this.deposited += extraCollateralDeposited
141
146
 
142
- this.collateralAccumulatorSnapshotBytes = collateralAccumulatorCurrent
143
- this.debtProductSnapshotBytes = debtProductCurrent
147
+ this.collateralAccumulatorSnapshotBytes = vaultTypeAccountData.collateralRedistributionAccumulator
148
+ this.debtProductSnapshotBytes = vaultTypeAccountData.debtRedistributionProduct
144
149
  }
145
150
 
146
151
  public toString(highlight: PublicKey): string {
@@ -0,0 +1,62 @@
1
+ import { PublicKey } from '@solana/web3.js'
2
+ import Decimal from 'decimal.js'
3
+ import { DecimalFromU128 } from '../HedgeDecimal'
4
+
5
+
6
+ export default class VaultType {
7
+ publicKey?: PublicKey
8
+
9
+ // On Chain Data
10
+ name: string
11
+ collateralMint: PublicKey
12
+ collateralIndex: number
13
+ recentPrice: Decimal
14
+ priceLastUpdatedTimestamp: Decimal
15
+ collateralHeld: Decimal
16
+ denormalizedDebtExtended: Decimal
17
+ debtRedistributionProduct: Decimal
18
+ collateralRedistributionAccumulator: Decimal
19
+ minCollateralRatio: Decimal
20
+ loanInitFee: Decimal
21
+ minDebtPerVault: Decimal
22
+ maxDebtExtended: Decimal
23
+ canBeRedeemed: boolean
24
+ cumulativeRate: Decimal
25
+ cumulativeRateLastUpdated: Decimal
26
+ interestRatePerSecond: Decimal
27
+ firstVaultToRedeem: PublicKey
28
+
29
+ constructor(config: any, publicKey?: PublicKey) {
30
+ this.publicKey = publicKey
31
+ this.name = config.collateralType
32
+ this.loanInitFee = DecimalFromU128(config.loanInitFee)
33
+ this.minCollateralRatio = DecimalFromU128(config.minCollateralRatio)
34
+ this.interestRatePerSecond = DecimalFromU128(config.interestRatePerSecond)
35
+ this.minDebtPerVault = DecimalFromU128(config.minDebtPerVault)
36
+ this.maxDebtExtended = DecimalFromU128(config.maxDebtExtended)
37
+ this.canBeRedeemed = config.canBeRedeemed
38
+ this.collateralMint = config.collateralMint
39
+ this.firstVaultToRedeem = config.firstVaultToRedeem
40
+
41
+ this.recentPrice = DecimalFromU128(config.recentPrice?.toString())
42
+ this.priceLastUpdatedTimestamp = new Decimal(
43
+ config.priceLastUpdatedTimestamp.toString()
44
+ )
45
+ this.collateralHeld = new Decimal(config.collateralHeld.toString())
46
+ this.denormalizedDebtExtended = new Decimal(
47
+ config.denormalizedDebtExtended.toString()
48
+ )
49
+ this.debtRedistributionProduct = DecimalFromU128(
50
+ config.debtRedistributionProduct.toString()
51
+ )
52
+ this.collateralRedistributionAccumulator = DecimalFromU128(
53
+ config.collateralRedistributionAccumulator.toString()
54
+ )
55
+ this.cumulativeRate = DecimalFromU128(config.cumulativeRate.toString())
56
+ this.cumulativeRateLastUpdated = new Decimal(
57
+ config.cumulativeRateLastUpdated.toString()
58
+ )
59
+ this.collateralIndex = config.collateralIndex.toNumber()
60
+
61
+ }
62
+ }
@@ -6,10 +6,11 @@ import { getVaultSystemStatePublicKey, getVaultTypeOracleAccountPublicKey, HEDGE
6
6
  import { DecimalFromU128 } from '../HedgeDecimal'
7
7
  import { VaultAccount } from '../state/VaultAccount'
8
8
  import Decimal from 'decimal.js'
9
- import { Vault } from 'idl/vault'
9
+ import { Vault } from '../idl/vault'
10
10
 
11
11
  import * as borsh from '@project-serum/borsh'
12
12
  import base58 from 'bs58'
13
+ import VaultType from '../state/VaultType'
13
14
 
14
15
  export async function getLinkedListAccounts(
15
16
  program: Program<Vault>,
@@ -22,8 +23,10 @@ export async function getLinkedListAccounts(
22
23
  liquidate: boolean,
23
24
  cachedVaults?: VaultAccount[]
24
25
  ): Promise<[PublicKey, PublicKey, PublicKey, VaultAccount[]]> {
25
- // console.log('Getting getLinkedListAccounts')
26
- const vaultTypeAccount = await program.account.vaultType.fetch(vaultTypeAccountPublicKey)
26
+ const vaultTypeRaw = await program.account.vaultType.fetch(vaultTypeAccountPublicKey)
27
+ const vaultType = new VaultType(vaultTypeRaw, vaultTypeAccountPublicKey)
28
+
29
+ const DEBUG = false
27
30
 
28
31
  // Default for null is the vault itself, so set them all to this vault
29
32
  let oldSmallerPublicKey = vaultPublicKey
@@ -31,7 +34,7 @@ export async function getLinkedListAccounts(
31
34
  let newLargerPublicKey = vaultPublicKey
32
35
 
33
36
  const thisVaultData = await program.account.vault.fetch(vaultPublicKey)
34
- const accountInfo = await program.provider.connection.getAccountInfo(vaultPublicKey)
37
+ // const accountInfo = await program.provider.connection.getAccountInfo(vaultPublicKey)
35
38
  const thisVault = new VaultAccount(thisVaultData, vaultPublicKey)
36
39
 
37
40
  // Load all the vaults
@@ -39,30 +42,16 @@ export async function getLinkedListAccounts(
39
42
  if (cachedVaults) {
40
43
  vaults = cachedVaults
41
44
  } else {
42
- // let allVaults = cachedVaults
43
- // ? cachedVaults
44
- // : (await program.account.vault
45
- // .all([
46
- // {
47
- // memcmp: { bytes: vaultTypeAccount.collateralType, offset: 8 + 32 + 8 },
48
- // },
49
- // ])
50
- // .catch((error) => {
51
- // console.log('error', error)
52
- // })) || []
53
-
54
- // // Load them into our account objects
55
- // vaults = allVaults.map((vault) => {
56
- // return new VaultAccount(vault.account, vault.publicKey)
57
- // })
58
- vaults = await getMiniVaults(program, vaultTypeAccount.vaultTypeName)
45
+ vaults = await getMiniVaults(program, vaultTypeAccountPublicKey)
59
46
  }
60
47
 
61
- // console.log('Vault count found:', vaults.length)
62
- // console.log('First Vault', vaults[0])
48
+ if (DEBUG) {
49
+ console.log('Vault count found:', vaults.length)
50
+ console.log('First Vault', vaults[0])
51
+ }
63
52
 
64
53
  // Filter out the accounts that are not open
65
- // TODO filter on vault status. Or we enable people to "close out" empty vaults
54
+ // TODO filter on vault status. Or we enable people to "close out" empty vaults
66
55
  // vaults = _.filter(vaults, (vault) => {
67
56
  // return vault.vaultStatus === 'open'
68
57
  // })
@@ -88,11 +77,15 @@ export async function getLinkedListAccounts(
88
77
  oldSmallerPublicKey = vaults[indexBefore - 1].publicKey
89
78
  }
90
79
 
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
- // }))
80
+ if (DEBUG) {
81
+ // Pretty print the list again
82
+ console.log('Sorted open vaults. Index Before: ', indexBefore)
83
+ console.log(
84
+ vaults.map((vault) => {
85
+ return vault.toString(vaultPublicKey)
86
+ })
87
+ )
88
+ }
96
89
 
97
90
  // Pretty print all the vaults before the operation
98
91
  // console.log('Sorted open vaults BEFORE at index:', indexBefore)
@@ -125,9 +118,8 @@ export async function getLinkedListAccounts(
125
118
  // Now that we know it's def in the list, iterate the list and update
126
119
  // this vault with the operation we're going to apply
127
120
  const newNormalizedDebt = new Decimal(loanAmount)
128
- const vaultTypeCompoundedInterest = DecimalFromU128(vaultTypeAccount.cumulativeRate.toString())
129
- vaults[indexBefore].updateDebtAndCollateral(vaultTypeAccount)
130
- vaults[indexBefore].addDebt(newNormalizedDebt, vaultTypeCompoundedInterest)
121
+ vaults[indexBefore].updateDebtAndCollateral(vaultType)
122
+ vaults[indexBefore].addDebt(newNormalizedDebt, vaultType)
131
123
  vaults[indexBefore].addDeposit(depositAmount)
132
124
 
133
125
  if (liquidate) {
@@ -152,16 +144,20 @@ export async function getLinkedListAccounts(
152
144
  }
153
145
  })
154
146
 
155
- // New list with vault
156
- // console.log('New list with vault now at index:', indexAfter)
157
- // console.log(
158
- // vaults.map((vault) => {
159
- // return vault.toString(vaultPublicKey)
160
- // })
161
- // )
147
+ if (DEBUG) {
148
+ // New list with vault
149
+ console.log('New list with vault now at index:', indexAfter)
150
+ console.log(
151
+ vaults.map((vault) => {
152
+ return vault.toString(vaultPublicKey)
153
+ })
154
+ )
155
+ }
162
156
 
163
- // Print where it moved from / to
164
- // console.log('Index After', indexAfter)
157
+ if (DEBUG) {
158
+ // Print where it moved from / to
159
+ console.log('Index After', indexAfter)
160
+ }
165
161
 
166
162
  // Save references to the new left and right
167
163
  if (indexAfter > 0) {
@@ -171,10 +167,12 @@ export async function getLinkedListAccounts(
171
167
  newLargerPublicKey = vaults[indexAfter + 1].publicKey
172
168
  }
173
169
 
174
- // Print out the new left/right
175
- // console.log('oldSmallerPublicKey', oldSmallerPublicKey.toString())
176
- // console.log('newSmallerPublicKey', newSmallerPublicKey.toString())
177
- // console.log('newLargerPublicKey', newLargerPublicKey.toString())
170
+ if (DEBUG) {
171
+ // Print out the new left/right
172
+ console.log('oldSmallerPublicKey', oldSmallerPublicKey.toString())
173
+ console.log('newSmallerPublicKey', newSmallerPublicKey.toString())
174
+ console.log('newLargerPublicKey', newLargerPublicKey.toString())
175
+ }
178
176
 
179
177
  return [oldSmallerPublicKey, newSmallerPublicKey, newLargerPublicKey, vaults]
180
178
  }
@@ -190,20 +188,27 @@ function sortVaults(a: VaultAccount, b: VaultAccount) {
190
188
  return aRatio - bRatio
191
189
  }
192
190
 
193
- async function getMiniVaults(program: Program<Vault>, vaultTypeName: string ) {
191
+ async function getMiniVaults(program: Program<Vault>, vaultTypePublicKey: PublicKey) {
194
192
  const filters = [
195
193
  // Filter for Vault Accounts
196
194
  {
197
195
  // @ts-ignore
198
196
  memcmp: program.account.vault.coder.accounts.memcmp(program.account.vault._idlAccount.name),
199
197
  },
200
- // Filter for Vaults with this collateral type
198
+ // Filter for Vaults that are open
201
199
  {
202
200
  memcmp: {
203
- bytes: base58.encode(VaultAccount.getBufferForString(vaultTypeName)),
201
+ bytes: base58.encode(Buffer.from([1])),
204
202
  offset: 8 + 32 + 24,
205
203
  },
206
204
  },
205
+ // Filter for Vaults with this collateral type
206
+ {
207
+ memcmp: {
208
+ bytes: vaultTypePublicKey.toString(),
209
+ offset: 8 + 32 + 24 + 1,
210
+ },
211
+ },
207
212
  ]
208
213
  const allAccounts = await program.provider.connection.getProgramAccounts(HEDGE_PROGRAM_PUBLICKEY, {
209
214
  filters: filters,
@@ -215,7 +220,7 @@ async function getMiniVaults(program: Program<Vault>, vaultTypeName: string ) {
215
220
  },
216
221
  })
217
222
 
218
- return allAccounts.map(vaultData=>{
223
+ return allAccounts.map((vaultData) => {
219
224
  return VaultAccount.FromMiniSlice(vaultData.account.data, vaultData.pubkey)
220
225
  })
221
226
  }
@@ -0,0 +1,27 @@
1
+ import { Connection, Keypair, Signer, Transaction, TransactionSignature } from '@solana/web3.js'
2
+
3
+ export default async function sendAndConfirmWithDebug(
4
+ connection: Connection,
5
+ transaction: Transaction,
6
+ signers: Signer[]
7
+ ): Promise<TransactionSignature | void> {
8
+ return connection
9
+ .sendTransaction(transaction, signers)
10
+ .then((signature) => {
11
+ return connection
12
+ .confirmTransaction(signature)
13
+ .then((signatureContext) => {
14
+ return signature
15
+ })
16
+ .catch((error) => {
17
+ console.log('There was an error confirming the transaction', error)
18
+ console.trace()
19
+ throw error
20
+ })
21
+ })
22
+ .catch((error) => {
23
+ console.log('There was an error sending the transaction', error)
24
+ console.trace()
25
+ throw error
26
+ })
27
+ }