@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.
- package/README.md +111 -0
- package/dist/accounts/index.d.ts +3 -0
- package/dist/accounts/index.d.ts.map +1 -0
- package/dist/accounts/index.js +8 -0
- package/dist/accounts/index.js.map +1 -0
- package/dist/accounts/pool.d.ts +41 -0
- package/dist/accounts/pool.d.ts.map +1 -0
- package/dist/accounts/pool.js +201 -0
- package/dist/accounts/pool.js.map +1 -0
- package/dist/accounts/position.d.ts +29 -0
- package/dist/accounts/position.d.ts.map +1 -0
- package/dist/accounts/position.js +163 -0
- package/dist/accounts/position.js.map +1 -0
- package/dist/generated/idl/elemental_vault_v2.json +1400 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +17 -0
- package/dist/index.js.map +1 -0
- package/dist/programs/elemental.d.ts +59 -0
- package/dist/programs/elemental.d.ts.map +1 -0
- package/dist/programs/elemental.js +374 -0
- package/dist/programs/elemental.js.map +1 -0
- package/dist/programs/index.d.ts +2 -0
- package/dist/programs/index.d.ts.map +1 -0
- package/dist/programs/index.js +7 -0
- package/dist/programs/index.js.map +1 -0
- package/dist/types.d.ts +62 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +27 -0
- package/dist/types.js.map +1 -0
- package/package.json +44 -0
- package/src/accounts/index.ts +2 -0
- package/src/accounts/pool.ts +227 -0
- package/src/accounts/position.ts +196 -0
- package/src/generated/idl/elemental_vault_v2.json +1400 -0
- package/src/index.ts +13 -0
- package/src/programs/elemental.ts +583 -0
- package/src/programs/index.ts +1 -0
- 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 @@
|
|
|
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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"}
|