@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.
- package/build/addressLookupTableUtil.js +3 -2
- package/build/addressLookupTableUtil.js.map +1 -1
- package/build/events.d.ts +3 -3
- package/build/events.js +49 -47
- package/build/events.js.map +1 -1
- package/build/flavors.d.ts +3 -3
- package/build/flavors.js +34 -38
- package/build/flavors.js.map +1 -1
- package/build/index.js +7 -17
- package/build/index.js.map +1 -1
- package/build/lpPosition.d.ts +6 -5
- package/build/lpPosition.js +37 -19
- package/build/lpPosition.js.map +1 -1
- package/build/market.d.ts +34 -34
- package/build/market.js +207 -203
- package/build/market.js.map +1 -1
- package/build/syPosition.d.ts +2 -2
- package/build/syPosition.js +21 -17
- package/build/syPosition.js.map +1 -1
- package/build/tokenUtil.d.ts +2 -2
- package/build/tokenUtil.js +7 -6
- package/build/tokenUtil.js.map +1 -1
- package/build/utils/altUtil.d.ts +3 -3
- package/build/utils/altUtil.js +18 -11
- package/build/utils/altUtil.js.map +1 -1
- package/build/utils/binSolver.js +2 -1
- package/build/utils/binSolver.js.map +1 -1
- package/build/utils/binSolver.test.js +6 -5
- package/build/utils/binSolver.test.js.map +1 -1
- package/build/utils/index.js +4 -3
- package/build/utils/index.js.map +1 -1
- package/build/vault.d.ts +12 -11
- package/build/vault.js +69 -68
- package/build/vault.js.map +1 -1
- package/build/ytPosition.d.ts +9 -8
- package/build/ytPosition.js +42 -34
- package/build/ytPosition.js.map +1 -1
- package/package.json +22 -22
- package/src/addressLookupTableUtil.ts +2 -1
- package/src/events.ts +60 -45
- package/src/flavors.ts +33 -39
- package/src/lpPosition.ts +49 -21
- package/src/market.ts +307 -229
- package/src/syPosition.ts +38 -26
- package/src/tokenUtil.ts +7 -5
- package/src/utils/altUtil.ts +17 -12
- package/src/utils/binSolver.test.ts +2 -0
- package/src/utils/index.ts +2 -0
- package/src/vault.ts +108 -91
- 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 {
|
|
3
|
-
|
|
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 {
|
|
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
|
|
33
|
-
const
|
|
34
|
-
return new YtPosition(env, connection, address,
|
|
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
|
|
43
|
-
return new YtPosition(env, connection, address,
|
|
44
|
+
const ytPositionState = await fetcher.fetchYtPosition(address)
|
|
45
|
+
return new YtPosition(env, connection, address, ytPositionState, vault)
|
|
44
46
|
}
|
|
45
47
|
|
|
46
|
-
async
|
|
47
|
-
|
|
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
|
-
|
|
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
|
-
|
|
99
|
+
const toCollectSySafe = Math.max(0, toCollectSy)
|
|
81
100
|
|
|
82
|
-
const feeSy = Math.floor((
|
|
83
|
-
const userSy = Math.max(0,
|
|
84
|
-
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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(
|
|
284
|
+
function ytPositionToJson(ytPosition: YtPosition): YtPositionJson {
|
|
265
285
|
return {
|
|
266
|
-
owner:
|
|
267
|
-
ytBalance:
|
|
268
|
-
interest: yieldTokenTrackerToJson(
|
|
269
|
-
emissions:
|
|
270
|
-
claimableInterest:
|
|
271
|
-
vault:
|
|
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(
|
|
295
|
+
function yieldTokenTrackerToJson(yieldTokenTracker: YieldTokenTracker): YieldTokenTrackerJson {
|
|
276
296
|
return {
|
|
277
|
-
lastSeenIndex:
|
|
278
|
-
staged:
|
|
297
|
+
lastSeenIndex: yieldTokenTracker.lastSeenIndex,
|
|
298
|
+
staged: yieldTokenTracker.staged.toString(),
|
|
279
299
|
}
|
|
280
300
|
}
|
|
281
301
|
|