@elmntl/vaults-v2 1.0.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 (39) hide show
  1. package/README.md +111 -0
  2. package/dist/accounts/index.d.ts +3 -0
  3. package/dist/accounts/index.d.ts.map +1 -0
  4. package/dist/accounts/index.js +8 -0
  5. package/dist/accounts/index.js.map +1 -0
  6. package/dist/accounts/pool.d.ts +41 -0
  7. package/dist/accounts/pool.d.ts.map +1 -0
  8. package/dist/accounts/pool.js +201 -0
  9. package/dist/accounts/pool.js.map +1 -0
  10. package/dist/accounts/position.d.ts +29 -0
  11. package/dist/accounts/position.d.ts.map +1 -0
  12. package/dist/accounts/position.js +163 -0
  13. package/dist/accounts/position.js.map +1 -0
  14. package/dist/generated/idl/elemental_vault_v2.json +1400 -0
  15. package/dist/index.d.ts +4 -0
  16. package/dist/index.d.ts.map +1 -0
  17. package/dist/index.js +17 -0
  18. package/dist/index.js.map +1 -0
  19. package/dist/programs/elemental.d.ts +59 -0
  20. package/dist/programs/elemental.d.ts.map +1 -0
  21. package/dist/programs/elemental.js +374 -0
  22. package/dist/programs/elemental.js.map +1 -0
  23. package/dist/programs/index.d.ts +2 -0
  24. package/dist/programs/index.d.ts.map +1 -0
  25. package/dist/programs/index.js +7 -0
  26. package/dist/programs/index.js.map +1 -0
  27. package/dist/types.d.ts +62 -0
  28. package/dist/types.d.ts.map +1 -0
  29. package/dist/types.js +27 -0
  30. package/dist/types.js.map +1 -0
  31. package/package.json +44 -0
  32. package/src/accounts/index.ts +2 -0
  33. package/src/accounts/pool.ts +227 -0
  34. package/src/accounts/position.ts +196 -0
  35. package/src/generated/idl/elemental_vault_v2.json +1400 -0
  36. package/src/index.ts +13 -0
  37. package/src/programs/elemental.ts +583 -0
  38. package/src/programs/index.ts +1 -0
  39. package/src/types.ts +77 -0
package/README.md ADDED
@@ -0,0 +1,111 @@
1
+ # @elmntl/vaults-v2
2
+
3
+ SDK for Elemental Vault V2 (ELE6) - Multi-mint vault with swap adapters on Solana.
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ npm install @elmntl/vaults-v2
9
+ # or
10
+ pnpm add @elmntl/vaults-v2
11
+ ```
12
+
13
+ ## Usage
14
+
15
+ ```typescript
16
+ import { Connection, PublicKey } from "@solana/web3.js";
17
+ import { AnchorProvider, Wallet } from "@coral-xyz/anchor";
18
+ import { ElementalV2Context, Pool, Position } from "@elmntl/vaults-v2";
19
+
20
+ // Initialize
21
+ const connection = new Connection("https://api.mainnet-beta.solana.com");
22
+ const provider = new AnchorProvider(connection, wallet, {});
23
+ const ctx = new ElementalV2Context(provider);
24
+
25
+ // Load pool
26
+ const poolAddress = new PublicKey("7cXYCSLPQqJDLeUQMYgJ2crM7KiCs9g7z71qvGVjS7F8");
27
+ const pool = await ctx.loadPool(poolAddress);
28
+
29
+ console.log(`APR: ${pool.aprPercent}%`);
30
+ console.log(`TVL: ${pool.currentSupply}`);
31
+ console.log(`Max Supply: ${pool.maxSupply}`);
32
+
33
+ // Load user position
34
+ const position = await ctx.loadPosition(pool);
35
+
36
+ console.log(`Status: ${position.status}`);
37
+ console.log(`Deposited: ${position.amount}`);
38
+ console.log(`Claimable: ${position.claimableAmount}`);
39
+
40
+ // Deposit
41
+ const depositTx = await ctx.deposit(position, "100"); // 100 tokens
42
+
43
+ // Deactivate (request withdrawal)
44
+ const deactivateTx = await ctx.deactivate(position, "50"); // 50 tokens
45
+
46
+ // Withdraw (after cooldown)
47
+ const withdrawTx = await ctx.withdraw(position);
48
+ ```
49
+
50
+ ## API Reference
51
+
52
+ ### ElementalV2Context
53
+
54
+ Main entry point for interacting with the Elemental V2 vault program.
55
+
56
+ #### Pool Operations
57
+
58
+ - `loadPool(address: PublicKey): Promise<Pool>` - Load a single pool
59
+ - `loadPools(addresses: PublicKey[]): Promise<Pool[]>` - Load multiple pools
60
+
61
+ #### Position Operations
62
+
63
+ - `loadPosition(pool: Pool, owner?: PublicKey): Promise<Position>` - Load user position
64
+ - `loadPositions(pools: Pool[], owner?: PublicKey): Promise<Position[]>` - Load multiple positions
65
+
66
+ #### Actions
67
+
68
+ - `deposit(position, amount, minOutput?)` - Deposit tokens into the vault
69
+ - `deactivate(position, amount)` - Request withdrawal (starts cooldown)
70
+ - `claim(position)` - Claim accumulated rewards
71
+ - `withdraw(position)` - Withdraw tokens (after cooldown)
72
+ - `fundFaucet(pool, amount)` - Fund the withdrawal faucet (admin)
73
+ - `updateEpoch(pool)` - Advance the epoch
74
+ - `updateConfig(pool, params)` - Update pool configuration (admin)
75
+
76
+ ### Pool
77
+
78
+ Wrapper for pool account data with helper methods.
79
+
80
+ #### Properties
81
+
82
+ - `address` - Pool public key
83
+ - `aprPercent` - APR as percentage string (e.g., "10.00")
84
+ - `currentSupply` - Current TVL (human-readable)
85
+ - `maxSupply` - Maximum supply cap
86
+ - `epochIndex` - Current epoch number
87
+ - `epochDuration` - Epoch duration in milliseconds
88
+ - `nextEpochDate` - Date of next epoch
89
+ - `adapterType` - Swap adapter type (Direct, OnRe, Jupiter, External)
90
+
91
+ ### Position
92
+
93
+ Wrapper for position account data.
94
+
95
+ #### Properties
96
+
97
+ - `status` - Position status: "inactive", "queued", "farming", "unstaking", "unstaked", "claiming", "claimed"
98
+ - `amount` - Currently staked amount
99
+ - `claimableAmount` - Rewards available to claim
100
+ - `withdrawableAmount` - Amount ready to withdraw
101
+ - `unstakingAmount` - Amount in cooldown
102
+ - `canDeposit`, `canUnstake`, `canWithdraw`, `canClaim` - Action availability
103
+
104
+ ## Program
105
+
106
+ - **Program ID**: `ELE6rYCZUaegWxVhWM4ef9pXZBAgGUVaVKkTbDvX6BMU`
107
+ - **Network**: Solana Mainnet
108
+
109
+ ## License
110
+
111
+ MIT
@@ -0,0 +1,3 @@
1
+ export { Pool } from "./pool";
2
+ export { Position } from "./position";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/accounts/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAC9B,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Position = exports.Pool = void 0;
4
+ var pool_1 = require("./pool");
5
+ Object.defineProperty(exports, "Pool", { enumerable: true, get: function () { return pool_1.Pool; } });
6
+ var position_1 = require("./position");
7
+ Object.defineProperty(exports, "Position", { enumerable: true, get: function () { return position_1.Position; } });
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/accounts/index.ts"],"names":[],"mappings":";;;AAAA,+BAA8B;AAArB,4FAAA,IAAI,OAAA;AACb,uCAAsC;AAA7B,oGAAA,QAAQ,OAAA"}
@@ -0,0 +1,41 @@
1
+ import { PublicKey, Connection } from "@solana/web3.js";
2
+ import { PoolData, SwapAdapter } from "../types";
3
+ export declare class Pool {
4
+ readonly address: PublicKey;
5
+ private _data?;
6
+ constructor(address: PublicKey, data?: PoolData);
7
+ get data(): PoolData;
8
+ get authorityAddress(): PublicKey;
9
+ get adminAddress(): PublicKey;
10
+ get pendingAdminAddress(): PublicKey | null;
11
+ get depositMintAddress(): PublicKey;
12
+ get vaultMintAddress(): PublicKey;
13
+ get liquidityHolderAddress(): PublicKey;
14
+ get liquidityFaucetAddress(): PublicKey;
15
+ get adapterType(): SwapAdapter;
16
+ get isOnReAdapter(): boolean;
17
+ get onReOfferAddress(): PublicKey | null;
18
+ get maxSupply(): string;
19
+ get currentSupply(): string;
20
+ get nextSupply(): string;
21
+ get maxDepositAmount(): string;
22
+ get minDepositAmount(): string;
23
+ get apr(): string;
24
+ get aprPercent(): string;
25
+ get deactivatingAmountN0(): string;
26
+ get claimingAmountN0(): string;
27
+ get deactivatingAmountN1(): string;
28
+ get claimingAmountN1(): string;
29
+ get pendingAmount(): string;
30
+ get epochDuration(): number;
31
+ get epochDurationSeconds(): number;
32
+ get epochIndex(): number;
33
+ get epochStartDate(): Date;
34
+ get nextEpochDate(): Date;
35
+ get secondsUntilNextEpoch(): number;
36
+ get isEpochReady(): boolean;
37
+ getFaucetBalance(connection: Connection): Promise<string>;
38
+ getHolderBalance(connection: Connection): Promise<string>;
39
+ getPendingFaucetAmount(connection: Connection): Promise<string>;
40
+ }
41
+ //# sourceMappingURL=pool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pool.d.ts","sourceRoot":"","sources":["../../src/accounts/pool.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAExD,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAiC,MAAM,UAAU,CAAC;AAGhF,qBAAa,IAAI;IACf,SAAgB,OAAO,EAAE,SAAS,CAAC;IACnC,OAAO,CAAC,KAAK,CAAC,CAAW;gBAEb,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,EAAE,QAAQ;IAK/C,IAAI,IAAI,IAAI,QAAQ,CAGnB;IAGD,IAAI,gBAAgB,IAAI,SAAS,CAKhC;IAED,IAAI,YAAY,IAAI,SAAS,CAE5B;IAED,IAAI,mBAAmB,IAAI,SAAS,GAAG,IAAI,CAE1C;IAGD,IAAI,kBAAkB,IAAI,SAAS,CAElC;IAED,IAAI,gBAAgB,IAAI,SAAS,CAEhC;IAED,IAAI,sBAAsB,IAAI,SAAS,CAEtC;IAGD,IAAI,sBAAsB,IAAI,SAAS,CAOtC;IAGD,IAAI,WAAW,IAAI,WAAW,CAO7B;IAED,IAAI,aAAa,IAAI,OAAO,CAE3B;IAGD,IAAI,gBAAgB,IAAI,SAAS,GAAG,IAAI,CAIvC;IAGD,IAAI,SAAS,IAAI,MAAM,CAItB;IAED,IAAI,aAAa,IAAI,MAAM,CAI1B;IAED,IAAI,UAAU,IAAI,MAAM,CAIvB;IAED,IAAI,gBAAgB,IAAI,MAAM,CAI7B;IAED,IAAI,gBAAgB,IAAI,MAAM,CAI7B;IAGD,IAAI,GAAG,IAAI,MAAM,CAIhB;IAGD,IAAI,UAAU,IAAI,MAAM,CAKvB;IAED,IAAI,oBAAoB,IAAI,MAAM,CAIjC;IAED,IAAI,gBAAgB,IAAI,MAAM,CAI7B;IAED,IAAI,oBAAoB,IAAI,MAAM,CAIjC;IAED,IAAI,gBAAgB,IAAI,MAAM,CAI7B;IAED,IAAI,aAAa,IAAI,MAAM,CAI1B;IAGD,IAAI,aAAa,IAAI,MAAM,CAE1B;IAED,IAAI,oBAAoB,IAAI,MAAM,CAEjC;IAED,IAAI,UAAU,IAAI,MAAM,CAEvB;IAED,IAAI,cAAc,IAAI,IAAI,CAEzB;IAED,IAAI,aAAa,IAAI,IAAI,CAExB;IAED,IAAI,qBAAqB,IAAI,MAAM,CAIlC;IAED,IAAI,YAAY,IAAI,OAAO,CAE1B;IAGK,gBAAgB,CAAC,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC;IAYzD,gBAAgB,CAAC,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC;IAYzD,sBAAsB,CAAC,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC;CAatE"}
@@ -0,0 +1,201 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.Pool = void 0;
7
+ const decimal_js_1 = __importDefault(require("decimal.js"));
8
+ const bn_js_1 = __importDefault(require("bn.js"));
9
+ const web3_js_1 = require("@solana/web3.js");
10
+ const types_1 = require("../types");
11
+ const programs_1 = require("../programs");
12
+ class Pool {
13
+ constructor(address, data) {
14
+ this.address = address;
15
+ this._data = data;
16
+ }
17
+ get data() {
18
+ if (!this._data)
19
+ throw new Error("Pool account is not loaded");
20
+ return this._data;
21
+ }
22
+ // PDA for pool authority
23
+ get authorityAddress() {
24
+ return web3_js_1.PublicKey.findProgramAddressSync([Buffer.from("pool_authority"), this.address.toBuffer()], programs_1.VAULT_PROGRAM_ID)[0];
25
+ }
26
+ get adminAddress() {
27
+ return this.data.admin;
28
+ }
29
+ get pendingAdminAddress() {
30
+ return this.data.pendingAdmin;
31
+ }
32
+ // V2: Separate deposit and vault mints
33
+ get depositMintAddress() {
34
+ return this.data.depositMint;
35
+ }
36
+ get vaultMintAddress() {
37
+ return this.data.vaultMint;
38
+ }
39
+ get liquidityHolderAddress() {
40
+ return this.data.liquidityHolder;
41
+ }
42
+ // Get faucet address (may be separate from holder)
43
+ get liquidityFaucetAddress() {
44
+ const configuredFaucet = types_1.POOL_FAUCET_CONFIG[this.address.toBase58()];
45
+ if (configuredFaucet) {
46
+ return new web3_js_1.PublicKey(configuredFaucet);
47
+ }
48
+ // Default: use holder as faucet (same account)
49
+ return this.liquidityHolderAddress;
50
+ }
51
+ // Adapter type
52
+ get adapterType() {
53
+ const adapter = this.data.adapterConfig.adapter;
54
+ if ("direct" in adapter)
55
+ return types_1.SwapAdapter.Direct;
56
+ if ("onRe" in adapter)
57
+ return types_1.SwapAdapter.OnRe;
58
+ if ("jupiter" in adapter)
59
+ return types_1.SwapAdapter.Jupiter;
60
+ if ("external" in adapter)
61
+ return types_1.SwapAdapter.External;
62
+ return types_1.SwapAdapter.Direct;
63
+ }
64
+ get isOnReAdapter() {
65
+ return this.adapterType === types_1.SwapAdapter.OnRe;
66
+ }
67
+ // OnRe offer PDA (stored in adapter data)
68
+ get onReOfferAddress() {
69
+ if (!this.isOnReAdapter)
70
+ return null;
71
+ const data = this.data.adapterConfig.data.slice(0, 32);
72
+ return new web3_js_1.PublicKey(Buffer.from(data));
73
+ }
74
+ // Amounts (human-readable)
75
+ get maxSupply() {
76
+ return new decimal_js_1.default(this.data.maxSupply.toString())
77
+ .div(new decimal_js_1.default(this.data.perTokenAmount.toString()))
78
+ .toFixed();
79
+ }
80
+ get currentSupply() {
81
+ return new decimal_js_1.default(this.data.currentSupply.toString())
82
+ .div(new decimal_js_1.default(this.data.perTokenAmount.toString()))
83
+ .toFixed();
84
+ }
85
+ get nextSupply() {
86
+ return new decimal_js_1.default(this.data.nextSupply.toString())
87
+ .div(new decimal_js_1.default(this.data.perTokenAmount.toString()))
88
+ .toFixed();
89
+ }
90
+ get maxDepositAmount() {
91
+ return new decimal_js_1.default(this.data.maxDepositAmount.toString())
92
+ .div(new decimal_js_1.default(this.data.perTokenAmount.toString()))
93
+ .toFixed();
94
+ }
95
+ get minDepositAmount() {
96
+ return new decimal_js_1.default(this.data.minDepositAmount.toString())
97
+ .div(new decimal_js_1.default(this.data.perTokenAmount.toString()))
98
+ .toFixed();
99
+ }
100
+ // APR as decimal string (e.g., "0.10" for 10%)
101
+ get apr() {
102
+ return new decimal_js_1.default(this.data.rewardAnnualRate.toString())
103
+ .div(types_1.FIXED_ONE.toString())
104
+ .toFixed();
105
+ }
106
+ // APR as percentage (e.g., "10" for 10%)
107
+ get aprPercent() {
108
+ return new decimal_js_1.default(this.data.rewardAnnualRate.toString())
109
+ .div(types_1.FIXED_ONE.toString())
110
+ .mul(100)
111
+ .toFixed(2);
112
+ }
113
+ get deactivatingAmountN0() {
114
+ return new decimal_js_1.default(this.data.deactivatingAmountN0.toString())
115
+ .div(new decimal_js_1.default(this.data.perTokenAmount.toString()))
116
+ .toFixed();
117
+ }
118
+ get claimingAmountN0() {
119
+ return new decimal_js_1.default(this.data.claimingAmountN0.toString())
120
+ .div(new decimal_js_1.default(this.data.perTokenAmount.toString()))
121
+ .toFixed();
122
+ }
123
+ get deactivatingAmountN1() {
124
+ return new decimal_js_1.default(this.data.deactivatingAmountN1.toString())
125
+ .div(new decimal_js_1.default(this.data.perTokenAmount.toString()))
126
+ .toFixed();
127
+ }
128
+ get claimingAmountN1() {
129
+ return new decimal_js_1.default(this.data.claimingAmountN1.toString())
130
+ .div(new decimal_js_1.default(this.data.perTokenAmount.toString()))
131
+ .toFixed();
132
+ }
133
+ get pendingAmount() {
134
+ return new decimal_js_1.default(this.data.pendingAmount.toString())
135
+ .div(new decimal_js_1.default(this.data.perTokenAmount.toString()))
136
+ .toFixed();
137
+ }
138
+ // Epoch info
139
+ get epochDuration() {
140
+ return this.data.epochDuration * 1000; // milliseconds
141
+ }
142
+ get epochDurationSeconds() {
143
+ return this.data.epochDuration;
144
+ }
145
+ get epochIndex() {
146
+ return this.data.epochIndex;
147
+ }
148
+ get epochStartDate() {
149
+ return new Date(this.data.epochStartTime * 1000);
150
+ }
151
+ get nextEpochDate() {
152
+ return new Date((this.data.epochStartTime + this.data.epochDuration) * 1000);
153
+ }
154
+ get secondsUntilNextEpoch() {
155
+ const now = Math.floor(Date.now() / 1000);
156
+ const nextEpoch = this.data.epochStartTime + this.data.epochDuration;
157
+ return Math.max(0, nextEpoch - now);
158
+ }
159
+ get isEpochReady() {
160
+ return this.secondsUntilNextEpoch === 0;
161
+ }
162
+ // Get faucet balance (for withdrawals)
163
+ async getFaucetBalance(connection) {
164
+ try {
165
+ const balance = await connection.getTokenAccountBalance(this.liquidityFaucetAddress);
166
+ return new decimal_js_1.default(balance.value.amount)
167
+ .div(new decimal_js_1.default(this.data.perTokenAmount.toString()))
168
+ .toFixed();
169
+ }
170
+ catch {
171
+ return "0";
172
+ }
173
+ }
174
+ // Get holder balance (deposits accumulate here)
175
+ async getHolderBalance(connection) {
176
+ try {
177
+ const balance = await connection.getTokenAccountBalance(this.liquidityHolderAddress);
178
+ return new decimal_js_1.default(balance.value.amount)
179
+ .div(new decimal_js_1.default(this.data.perTokenAmount.toString()))
180
+ .toFixed();
181
+ }
182
+ catch {
183
+ return "0";
184
+ }
185
+ }
186
+ // Calculate pending faucet amount needed
187
+ async getPendingFaucetAmount(connection) {
188
+ const balance = await connection.getTokenAccountBalance(this.liquidityFaucetAddress);
189
+ const pendingTotal = this.data.pendingAmount
190
+ .add(this.data.deactivatingAmountN1)
191
+ .add(this.data.claimingAmountN1);
192
+ const shortage = pendingTotal.sub(new bn_js_1.default(balance.value.amount));
193
+ if (shortage.lten(0))
194
+ return "0";
195
+ return new decimal_js_1.default(shortage.toString())
196
+ .div(new decimal_js_1.default(this.data.perTokenAmount.toString()))
197
+ .toFixed();
198
+ }
199
+ }
200
+ exports.Pool = Pool;
201
+ //# sourceMappingURL=pool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pool.js","sourceRoot":"","sources":["../../src/accounts/pool.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ import { PublicKey } from "@solana/web3.js";
2
+ import { PositionData, PositionStatus } from "../types";
3
+ import { Pool } from "./pool";
4
+ export declare class Position {
5
+ readonly pool: Pool;
6
+ readonly address: PublicKey;
7
+ readonly data: PositionData;
8
+ constructor(pool: Pool, address: PublicKey, data: PositionData);
9
+ get owner(): PublicKey;
10
+ get amount(): string;
11
+ get units(): number;
12
+ get maxDepositAmount(): string;
13
+ get claimableAmount(): string;
14
+ get claimedAmount(): string;
15
+ get withdrawableAmount(): string;
16
+ get unstakingAmount(): string;
17
+ get deactivatingAmount(): string;
18
+ get claimingAmount(): string;
19
+ get lastUpdatedEpochIndex(): number;
20
+ get exists(): boolean;
21
+ get status(): PositionStatus;
22
+ get nextDate(): Date;
23
+ get epochsUntilWithdraw(): number;
24
+ get canDeposit(): boolean;
25
+ get canUnstake(): boolean;
26
+ get canWithdraw(): boolean;
27
+ get canClaim(): boolean;
28
+ }
29
+ //# sourceMappingURL=position.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"position.d.ts","sourceRoot":"","sources":["../../src/accounts/position.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,cAAc,EAAa,MAAM,UAAU,CAAC;AACnE,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAE9B,qBAAa,QAAQ;IACnB,SAAgB,IAAI,EAAE,IAAI,CAAC;IAC3B,SAAgB,OAAO,EAAE,SAAS,CAAC;IACnC,SAAgB,IAAI,EAAE,YAAY,CAAC;gBAEvB,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,YAAY;IAM9D,IAAI,KAAK,IAAI,SAAS,CAErB;IAGD,IAAI,MAAM,IAAI,MAAM,CAInB;IAGD,IAAI,KAAK,IAAI,MAAM,CAElB;IAGD,IAAI,gBAAgB,IAAI,MAAM,CAM7B;IAGD,IAAI,eAAe,IAAI,MAAM,CAe5B;IAGD,IAAI,aAAa,IAAI,MAAM,CAI1B;IAGD,IAAI,kBAAkB,IAAI,MAAM,CAQ/B;IAGD,IAAI,eAAe,IAAI,MAAM,CAM5B;IAED,IAAI,kBAAkB,IAAI,MAAM,CAI/B;IAED,IAAI,cAAc,IAAI,MAAM,CAI3B;IAED,IAAI,qBAAqB,IAAI,MAAM,CAElC;IAGD,IAAI,MAAM,IAAI,OAAO,CAEpB;IAGD,IAAI,MAAM,IAAI,cAAc,CAuB3B;IAGD,IAAI,QAAQ,IAAI,IAAI,CA2BnB;IAGD,IAAI,mBAAmB,IAAI,MAAM,CAQhC;IAGD,IAAI,UAAU,IAAI,OAAO,CAMxB;IAED,IAAI,UAAU,IAAI,OAAO,CAExB;IAED,IAAI,WAAW,IAAI,OAAO,CAEzB;IAED,IAAI,QAAQ,IAAI,OAAO,CAEtB;CACF"}
@@ -0,0 +1,163 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.Position = void 0;
7
+ const decimal_js_1 = __importDefault(require("decimal.js"));
8
+ const types_1 = require("../types");
9
+ class Position {
10
+ constructor(pool, address, data) {
11
+ this.pool = pool;
12
+ this.address = address;
13
+ this.data = data;
14
+ }
15
+ get owner() {
16
+ return this.data.owner;
17
+ }
18
+ // Amount currently farming (human-readable)
19
+ get amount() {
20
+ return new decimal_js_1.default(this.data.amount.toString())
21
+ .div(new decimal_js_1.default(this.pool.data.perTokenAmount.toString()))
22
+ .toFixed();
23
+ }
24
+ // Amount in units (multiples of minDepositAmount)
25
+ get units() {
26
+ return this.data.amount.div(this.pool.data.minDepositAmount).toNumber();
27
+ }
28
+ // Max additional deposit allowed
29
+ get maxDepositAmount() {
30
+ const remaining = this.pool.data.maxDepositAmount.sub(this.data.amount);
31
+ if (remaining.lten(0))
32
+ return "0";
33
+ return new decimal_js_1.default(remaining.toString())
34
+ .div(new decimal_js_1.default(this.pool.data.perTokenAmount.toString()))
35
+ .toFixed();
36
+ }
37
+ // Claimable rewards (human-readable)
38
+ get claimableAmount() {
39
+ // reward_per_token * amount / FIXED_ONE - reward_before_deposit + reward_earned - reward_claimed
40
+ const currentReward = this.data.amount
41
+ .mul(this.pool.data.rewardPerToken)
42
+ .div(types_1.FIXED_ONE);
43
+ const claimable = currentReward
44
+ .sub(this.data.rewardBeforeDeposit)
45
+ .add(this.data.rewardEarned)
46
+ .sub(this.data.rewardClaimed);
47
+ if (claimable.lten(0))
48
+ return "0";
49
+ return new decimal_js_1.default(claimable.toString())
50
+ .div(new decimal_js_1.default(this.pool.data.perTokenAmount.toString()))
51
+ .toFixed();
52
+ }
53
+ // Already claimed rewards
54
+ get claimedAmount() {
55
+ return new decimal_js_1.default(this.data.rewardClaimed.toString())
56
+ .div(new decimal_js_1.default(this.pool.data.perTokenAmount.toString()))
57
+ .toFixed();
58
+ }
59
+ // Amount ready to withdraw (after cooldown)
60
+ get withdrawableAmount() {
61
+ if (this.data.lastUpdatedEpochIndex + 1 < this.pool.epochIndex) {
62
+ const total = this.data.deactivatingAmount.add(this.data.claimingAmount);
63
+ return new decimal_js_1.default(total.toString())
64
+ .div(new decimal_js_1.default(this.pool.data.perTokenAmount.toString()))
65
+ .toFixed();
66
+ }
67
+ return "0";
68
+ }
69
+ // Amount in the process of unstaking (not yet withdrawable)
70
+ get unstakingAmount() {
71
+ return new decimal_js_1.default(this.data.deactivatingAmount.add(this.data.claimingAmount).toString())
72
+ .div(new decimal_js_1.default(this.pool.data.perTokenAmount.toString()))
73
+ .toFixed();
74
+ }
75
+ get deactivatingAmount() {
76
+ return new decimal_js_1.default(this.data.deactivatingAmount.toString())
77
+ .div(new decimal_js_1.default(this.pool.data.perTokenAmount.toString()))
78
+ .toFixed();
79
+ }
80
+ get claimingAmount() {
81
+ return new decimal_js_1.default(this.data.claimingAmount.toString())
82
+ .div(new decimal_js_1.default(this.pool.data.perTokenAmount.toString()))
83
+ .toFixed();
84
+ }
85
+ get lastUpdatedEpochIndex() {
86
+ return this.data.lastUpdatedEpochIndex;
87
+ }
88
+ // Check if position exists on-chain
89
+ get exists() {
90
+ return this.data.lastUpdatedEpochIndex >= 0;
91
+ }
92
+ // Position status
93
+ get status() {
94
+ if (this.data.deactivatingAmount.gtn(0)) {
95
+ if (this.data.lastUpdatedEpochIndex + 1 < this.pool.epochIndex) {
96
+ return "unstaked";
97
+ }
98
+ return "unstaking";
99
+ }
100
+ if (this.data.claimingAmount.gtn(0)) {
101
+ if (this.data.lastUpdatedEpochIndex + 1 < this.pool.epochIndex) {
102
+ return "claimed";
103
+ }
104
+ return "claiming";
105
+ }
106
+ if (this.data.amount.gtn(0)) {
107
+ if (this.data.lastUpdatedEpochIndex === this.pool.epochIndex) {
108
+ return "queued";
109
+ }
110
+ return "farming";
111
+ }
112
+ return "inactive";
113
+ }
114
+ // Next important date (when status will change)
115
+ get nextDate() {
116
+ switch (this.status) {
117
+ case "queued":
118
+ // Yield starts accruing from (n+1)th epoch
119
+ return new Date(this.pool.epochStartDate.getTime() + this.pool.epochDuration);
120
+ case "farming":
121
+ return new Date(this.pool.epochStartDate.getTime() +
122
+ (this.data.lastUpdatedEpochIndex + 1 - this.pool.epochIndex) *
123
+ this.pool.epochDuration);
124
+ case "claiming":
125
+ case "claimed":
126
+ case "unstaking":
127
+ case "unstaked":
128
+ // Assets unlocked from (n+2)th epoch
129
+ return new Date(this.pool.epochStartDate.getTime() +
130
+ (this.data.lastUpdatedEpochIndex + 2 - this.pool.epochIndex) *
131
+ this.pool.epochDuration);
132
+ default:
133
+ return new Date();
134
+ }
135
+ }
136
+ // Epochs remaining until withdrawal
137
+ get epochsUntilWithdraw() {
138
+ if (this.status === "unstaked" || this.status === "claimed") {
139
+ return 0;
140
+ }
141
+ if (this.status === "unstaking" || this.status === "claiming") {
142
+ return Math.max(0, this.data.lastUpdatedEpochIndex + 2 - this.pool.epochIndex);
143
+ }
144
+ return -1; // Not unstaking
145
+ }
146
+ // Can perform actions?
147
+ get canDeposit() {
148
+ return (this.status === "inactive" ||
149
+ this.status === "queued" ||
150
+ this.status === "farming");
151
+ }
152
+ get canUnstake() {
153
+ return this.status === "farming" && this.data.amount.gtn(0);
154
+ }
155
+ get canWithdraw() {
156
+ return this.status === "unstaked" || this.status === "claimed";
157
+ }
158
+ get canClaim() {
159
+ return new decimal_js_1.default(this.claimableAmount).gt(0);
160
+ }
161
+ }
162
+ exports.Position = Position;
163
+ //# sourceMappingURL=position.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"position.js","sourceRoot":"","sources":["../../src/accounts/position.ts"],"names":[],"mappings":"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"}