hedge-web3 0.1.46 → 0.2.0

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.
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
+ }