@exponent-labs/exponent-sdk 0.0.9 → 0.1.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 (50) hide show
  1. package/build/addressLookupTableUtil.js +3 -2
  2. package/build/addressLookupTableUtil.js.map +1 -1
  3. package/build/events.d.ts +3 -3
  4. package/build/events.js +49 -47
  5. package/build/events.js.map +1 -1
  6. package/build/flavors.d.ts +3 -3
  7. package/build/flavors.js +34 -38
  8. package/build/flavors.js.map +1 -1
  9. package/build/index.js +7 -17
  10. package/build/index.js.map +1 -1
  11. package/build/lpPosition.d.ts +6 -5
  12. package/build/lpPosition.js +37 -19
  13. package/build/lpPosition.js.map +1 -1
  14. package/build/market.d.ts +34 -34
  15. package/build/market.js +207 -203
  16. package/build/market.js.map +1 -1
  17. package/build/syPosition.d.ts +2 -2
  18. package/build/syPosition.js +21 -17
  19. package/build/syPosition.js.map +1 -1
  20. package/build/tokenUtil.d.ts +2 -2
  21. package/build/tokenUtil.js +7 -6
  22. package/build/tokenUtil.js.map +1 -1
  23. package/build/utils/altUtil.d.ts +3 -3
  24. package/build/utils/altUtil.js +18 -11
  25. package/build/utils/altUtil.js.map +1 -1
  26. package/build/utils/binSolver.js +2 -1
  27. package/build/utils/binSolver.js.map +1 -1
  28. package/build/utils/binSolver.test.js +6 -5
  29. package/build/utils/binSolver.test.js.map +1 -1
  30. package/build/utils/index.js +4 -3
  31. package/build/utils/index.js.map +1 -1
  32. package/build/vault.d.ts +12 -11
  33. package/build/vault.js +69 -68
  34. package/build/vault.js.map +1 -1
  35. package/build/ytPosition.d.ts +9 -8
  36. package/build/ytPosition.js +42 -34
  37. package/build/ytPosition.js.map +1 -1
  38. package/package.json +22 -22
  39. package/src/addressLookupTableUtil.ts +2 -1
  40. package/src/events.ts +60 -45
  41. package/src/flavors.ts +33 -39
  42. package/src/lpPosition.ts +49 -21
  43. package/src/market.ts +307 -229
  44. package/src/syPosition.ts +38 -26
  45. package/src/tokenUtil.ts +7 -5
  46. package/src/utils/altUtil.ts +17 -12
  47. package/src/utils/binSolver.test.ts +2 -0
  48. package/src/utils/index.ts +2 -0
  49. package/src/vault.ts +108 -91
  50. package/src/ytPosition.ts +57 -37
package/src/ytPosition.ts CHANGED
@@ -1,15 +1,17 @@
1
1
  import { AnchorProvider, BN, Program, web3 } from "@coral-xyz/anchor"
2
- import { ExponentCore, IDL } from "@exponent-labs/exponent-idl"
3
- import { Environment } from "./environment"
2
+ import { TOKEN_PROGRAM_ID, getAssociatedTokenAddressSync } from "@solana/spl-token"
3
+
4
4
  import { ExponentFetcher, YieldTokenTracker, YtPosition as YtPositionState } from "@exponent-labs/exponent-fetcher"
5
- import { Vault } from "./vault"
6
- import { getAssociatedTokenAddressSync, TOKEN_PROGRAM_ID } from "@solana/spl-token"
7
- import { InstructionAccounts } from "./utils"
5
+ import { ExponentCore, IDL } from "@exponent-labs/exponent-idl"
8
6
  import { ExponentPDA } from "@exponent-labs/exponent-pda"
9
- import { MyWallet } from "./market"
10
7
  import { VaultJson } from "@exponent-labs/exponent-types"
11
- import { PreciseNumber } from "@exponent-labs/precise-number"
12
8
  import { ClaimAmount } from "@exponent-labs/marginfi-sy-sdk"
9
+ import { PreciseNumber } from "@exponent-labs/precise-number"
10
+
11
+ import { Environment } from "./environment"
12
+ import { MyWallet } from "./market"
13
+ import { InstructionAccounts } from "./utils"
14
+ import { Vault } from "./vault"
13
15
 
14
16
  export class YtPosition {
15
17
  public coreProgram: Program<ExponentCore>
@@ -27,11 +29,11 @@ export class YtPosition {
27
29
  /** Loads the YT position by address, and loads Vault, too
28
30
  * DEPRECATED - use loadByOwner instead - loading the vault is expensive
29
31
  */
30
- static async load(env: Environment, connection: web3.Connection, address: web3.PublicKey) {
32
+ static async load(env: Environment, connection: web3.Connection, address: web3.PublicKey, vault?: Vault) {
31
33
  const fetcher = new ExponentFetcher({ connection })
32
- const x = await fetcher.fetchYtPosition(address)
33
- const vault = await Vault.load(env, connection, x.vault)
34
- return new YtPosition(env, connection, address, x, vault)
34
+ const ytPositionState = await fetcher.fetchYtPosition(address)
35
+ const loadedVault = vault ?? (await Vault.load(env, connection, ytPositionState.vault))
36
+ return new YtPosition(env, connection, address, ytPositionState, loadedVault)
35
37
  }
36
38
 
37
39
  /** Loads the YT position by owner, but require a loaded Vault */
@@ -39,12 +41,28 @@ export class YtPosition {
39
41
  const pda = new ExponentPDA(env.coreProgramId)
40
42
  const address = pda.yieldPosition({ vault: vault.selfAddress, owner })
41
43
  const fetcher = new ExponentFetcher({ connection })
42
- const x = await fetcher.fetchYtPosition(address)
43
- return new YtPosition(env, connection, address, x, vault)
44
+ const ytPositionState = await fetcher.fetchYtPosition(address)
45
+ return new YtPosition(env, connection, address, ytPositionState, vault)
44
46
  }
45
47
 
46
- async reload(conn = this.connection) {
47
- const x = await YtPosition.load(this.env, conn, this.selfAddress)
48
+ static async loadAllByOwner(
49
+ env: Environment,
50
+ connection: web3.Connection,
51
+ owner: web3.PublicKey,
52
+ vaults: (Vault | web3.PublicKey)[],
53
+ ) {
54
+ const pda = new ExponentPDA(env.coreProgramId)
55
+ const addresses = vaults.map((v) =>
56
+ pda.yieldPosition({
57
+ vault: v instanceof web3.PublicKey ? v : v.selfAddress,
58
+ owner,
59
+ }),
60
+ )
61
+ return Promise.all(addresses.map((addr) => YtPosition.load(env, connection, addr)))
62
+ }
63
+
64
+ async reload(connection = this.connection) {
65
+ const x = await YtPosition.load(this.env, connection, this.selfAddress)
48
66
  this.state = x.state
49
67
  return x
50
68
  }
@@ -72,16 +90,17 @@ export class YtPosition {
72
90
  */
73
91
  getClaimableInterest(currentIndex: number): number {
74
92
  const interestDelta = 1 / this.state.interest.lastSeenIndex - 1 / currentIndex
75
- let toCollectSy = Math.floor(
93
+
94
+ const toCollectSy = Math.floor(
76
95
  Number(this.state.ytBalance.toString()) * interestDelta + Number(this.state.interest.staged),
77
96
  )
78
97
 
79
98
  // Ensure toCollectSy is not negative
80
- toCollectSy = Math.max(0, toCollectSy)
99
+ const toCollectSySafe = Math.max(0, toCollectSy)
81
100
 
82
- const feeSy = Math.floor((toCollectSy * this.vault.state.interestBpsFee + 9999) / 10000)
83
- const userSy = Math.max(0, toCollectSy - feeSy)
84
- let baseAmount = Math.floor(userSy * currentIndex)
101
+ const feeSy = Math.floor((toCollectSySafe * this.vault.state.interestBpsFee + 9999) / 10000)
102
+ const userSy = Math.max(0, toCollectSySafe - feeSy)
103
+ const baseAmount = Math.floor(userSy * currentIndex)
85
104
 
86
105
  // Ensure final amount is non-negative
87
106
  return Math.max(0, baseAmount > 0 ? baseAmount - 1 : baseAmount)
@@ -134,7 +153,7 @@ export class YtPosition {
134
153
  vault: this.vault.selfAddress,
135
154
  payer,
136
155
  syProgram: this.vault.state.syProgram,
137
- yieldPosition: this.vault.state.yieldPositonAddress,
156
+ yieldPosition: this.vault.state.yieldPositonAddress, // Misspelled word
138
157
  systemProgram: web3.SystemProgram.programId,
139
158
  userYieldPosition: this.selfAddress,
140
159
  eventAuthority: this.vault.eventAuthority,
@@ -170,7 +189,7 @@ export class YtPosition {
170
189
  ixCollectEmission({
171
190
  owner,
172
191
  emissionIndex,
173
- emissionDst,
192
+ emissionDst: emissionDstParam,
174
193
  amount,
175
194
  }: {
176
195
  owner: web3.PublicKey
@@ -180,7 +199,8 @@ export class YtPosition {
180
199
  }) {
181
200
  const emission = this.vault.state.emissions[emissionIndex]
182
201
  const emissionSy = this.vault.flavor.emissions[emissionIndex]
183
- emissionDst = emissionDst || getAssociatedTokenAddressSync(emissionSy.mint, owner, true, emissionSy.tokenProgram)
202
+ const emissionDst =
203
+ emissionDstParam || getAssociatedTokenAddressSync(emissionSy.mint, owner, true, emissionSy.tokenProgram)
184
204
  const claimAmount: ClaimAmount = amount !== undefined ? { some: { 0: new BN(amount.toString()) } } : { all: {} }
185
205
 
186
206
  return this.coreProgram.methods
@@ -203,8 +223,8 @@ export class YtPosition {
203
223
  .instruction()
204
224
  }
205
225
 
206
- depositYtAccounts({ ytSrc }: { ytSrc?: web3.PublicKey }): InstructionAccounts<DepositYtAccounts> {
207
- ytSrc = ytSrc || getAssociatedTokenAddressSync(this.vault.mintYt, this.owner, true, TOKEN_PROGRAM_ID)
226
+ depositYtAccounts({ ytSrc: ytSrcParam }: { ytSrc?: web3.PublicKey }): InstructionAccounts<DepositYtAccounts> {
227
+ const ytSrc = ytSrcParam || getAssociatedTokenAddressSync(this.vault.mintYt, this.owner, true, TOKEN_PROGRAM_ID)
208
228
  return {
209
229
  mainAccounts: {
210
230
  depositor: this.owner,
@@ -224,8 +244,8 @@ export class YtPosition {
224
244
  }
225
245
  }
226
246
 
227
- withdrawYtAccounts({ ytDst }: { ytDst?: web3.PublicKey }): InstructionAccounts<WithdrawYtAccounts> {
228
- ytDst = ytDst || getAssociatedTokenAddressSync(this.vault.mintYt, this.owner, true, TOKEN_PROGRAM_ID)
247
+ withdrawYtAccounts({ ytDst: ytDstParam }: { ytDst?: web3.PublicKey }): InstructionAccounts<WithdrawYtAccounts> {
248
+ const ytDst = ytDstParam || getAssociatedTokenAddressSync(this.vault.mintYt, this.owner, true, TOKEN_PROGRAM_ID)
229
249
  return {
230
250
  mainAccounts: {
231
251
  owner: this.owner,
@@ -261,21 +281,21 @@ export type YieldTokenTrackerJson = {
261
281
  staged: string
262
282
  }
263
283
 
264
- function ytPositionToJson(x: YtPosition): YtPositionJson {
284
+ function ytPositionToJson(ytPosition: YtPosition): YtPositionJson {
265
285
  return {
266
- owner: x.owner.toBase58(),
267
- ytBalance: x.ytBalance.toString(),
268
- interest: yieldTokenTrackerToJson(x.state.interest),
269
- emissions: x.state.emissions.map(yieldTokenTrackerToJson),
270
- claimableInterest: x.getClaimableInterest(x.vault.currentSyExchangeRate),
271
- vault: x.vault.toJson(),
286
+ owner: ytPosition.owner.toBase58(),
287
+ ytBalance: ytPosition.ytBalance.toString(),
288
+ interest: yieldTokenTrackerToJson(ytPosition.state.interest),
289
+ emissions: ytPosition.state.emissions.map(yieldTokenTrackerToJson),
290
+ claimableInterest: ytPosition.getClaimableInterest(ytPosition.vault.currentSyExchangeRate),
291
+ vault: ytPosition.vault.toJson(),
272
292
  }
273
293
  }
274
294
 
275
- function yieldTokenTrackerToJson(x: YieldTokenTracker): YieldTokenTrackerJson {
295
+ function yieldTokenTrackerToJson(yieldTokenTracker: YieldTokenTracker): YieldTokenTrackerJson {
276
296
  return {
277
- lastSeenIndex: x.lastSeenIndex,
278
- staged: x.staged.toString(),
297
+ lastSeenIndex: yieldTokenTracker.lastSeenIndex,
298
+ staged: yieldTokenTracker.staged.toString(),
279
299
  }
280
300
  }
281
301