@wireio/stake 2.2.1 → 2.3.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 CHANGED
@@ -1,275 +1,217 @@
1
- # @wireio/stake — LIQ Staking SDK
2
-
3
- TypeScript SDK for interacting with the **Liquidity Staking System (LIQ)** on **Wire Network**.
4
-
5
- - **Today:** Solana (Wire testnet) implementation
6
- - **Next:** Ethereum (shared interface, coming soon)
7
- - **Later:** Sui and additional chains (all conforming to the same `IStakingClient` interface)
8
-
9
- ---
10
-
11
- ## Features
12
-
13
- - 🔑 Unified **Staker** facade across multiple chains
14
- - 💸 **Deposit** (stake) funds on supported networks
15
- - 🧾 **Register** untracked liquid stake tokens (correct & register flow on Solana)
16
- - 📊 **Portfolio** helper (native / actual / tracked balances)
17
- - 🧱 Low-level Solana clients:
18
- - `DepositClient` builds & submits deposit transactions
19
- - `DistributionClient` – balance reconciliation & registration (updateUser)
20
- - `ValidatorLeaderboardClient` Interact with the validator leaderboard program
21
- - 🧩 Clean, typed program access via `SolanaProgramService`
22
-
23
- ---
1
+ # @wireio/stake — Outpost & LIQ Staking SDK
2
+
3
+ TypeScript / JavaScript SDK for the **Outpost** and **Liquidity Staking (LIQ)** protocol on the **Wire Network**.
4
+ It gives dApps a single façade (`Staker`) over Solana and EVM implementations, while still exposing
5
+ chain‑specific power features (Outpost, pretokens, SquadsX, validator tools, etc.).
6
+
7
+ ## What this SDK does
8
+ - One `Staker` that selects the right chain client by `chainId`.
9
+ - Deposit / withdraw native → LIQ tokens (SOL→liqSOL, ETH→liqETH).
10
+ - Stake / unstake LIQ into yield pools (Solana Outpost; Ethereum staking manager).
11
+ - Pre-launch WIRE pretokens purchase helpers.
12
+ - Rich `getPortfolio` view (native, liq, staked, $WIRE, yield, extras).
13
+ - Gas / fee helpers (`getDepositFee`, `getDepositBuffer`, `getSystemAPY`).
14
+ - Solana extras: balance correction + registration, Outpost state, multisig (SquadsX) flows.
15
+ - Ethereum extras: withdrawal receipts, validator deposit/lock, tranche snapshots.
16
+
17
+ ## SquadsX (Solana multisig) at a glance
18
+ - Pass `extras.squadsX` when constructing a Solana `StakerConfig`:
19
+ ```ts
20
+ const cfg: StakerConfig = {
21
+ provider: solAdapter,
22
+ network: solNetwork,
23
+ pubKey: new WirePubKey(KeyType.ED, solAdapter.publicKey!.toBytes()),
24
+ extras: { squadsX: { multisigPDA: '<base58>', vaultIndex: 0 } },
25
+ };
26
+ ```
27
+ - When present, every write call (`deposit`, `withdraw`, `stake`, `unstake`, `buy`) is wrapped as a Squads vault transaction via `sendSquadsIxs`, producing a proposal that you approve/execute in Squads.
28
+ - The Hub staking service persists the PDAs in `localStorage` (`hub_squadsx_multisigpda`, `hub_squadsx_vaultindex`) and reinitializes the `Staker` with Squads enabled; copy that pattern for multisig-first apps.
29
+
30
+ ## Mental model
31
+ - **Facade first:** Use `Staker` everywhere; it routes to the right chain client and keeps the API identical.
32
+ - **Base units only:** All amounts are lamports/wei (no floats internally).
33
+ - **Read-only vs write:** If you omit `provider`/`pubKey`, clients spin up in **read-only** mode—perfect for tranche snapshots, APY, and portfolio lookups against public RPCs. Add a signer (`provider` + `pubKey`) to unlock writes (deposit/withdraw/stake/unstake/buy/register). The Hub service uses read-only configs to prefill dashboards before wallets connect, then re-initializes with signer configs once a wallet is present.
34
+ - **State views:** `getPortfolio()` is the fastest way to know “native, liq, staked, $WIRE, yield” plus handy PDAs/addresses.
35
+ - **Snapshots:** `getTrancheSnapshot(chainId)` powers price ladders, liquidity/utilization charts, and native USD hints.
36
+
37
+ ## Supported networks (today)
38
+ - **Solana**: `SolChainID.Mainnet`, `SolChainID.Devnet`.
39
+ - **EVM**: `EvmChainID.Ethereum`, `EvmChainID.Hoodi` (testnet).
40
+
41
+ The unified interface is chain-id driven: `new Staker(configs, selectedChainId)` builds per-chain clients behind the scenes, and `staker.setChain(chainId)` swaps the active client. Adding future chains (e.g., Sui) only requires implementing `IStakingClient` and wiring its `chainId` into the router—no API changes for consuming apps.
24
42
 
25
43
  ## Installation
26
-
27
- The package is published on npm.
28
-
29
44
  ```bash
30
45
  npm install @wireio/stake
31
46
  ```
47
+ Peer requirement: `@wireio/core >=0.1.0 <0.4.0`.
32
48
 
33
- ---
34
-
35
- ## Getting Started
36
-
37
- ### 1) Construct a `Staker`
38
-
39
- Create the staker with one or more chain configs (only Solana client is active today):
49
+ ## Quick start: pick a chain, then call through `client`
40
50
 
41
51
  ```ts
42
- import { Staker, StakerConfig } from '@wireio/stake';
52
+ import { Staker, StakerConfig, SolChainID, EvmChainID } from '@wireio/stake';
43
53
  import { PublicKey as WirePubKey, KeyType } from '@wireio/core';
44
54
  import { BaseSignerWalletAdapter } from '@solana/wallet-adapter-base';
55
+ import { ethers } from 'ethers';
45
56
 
46
- // Example: Solana (Wire testnet)
47
- const adapter: BaseSignerWalletAdapter = /* your connected wallet adapter */;
48
- const network = {
49
- chainId: 13371337, // your Wire testnet chain ID
50
- name: 'Wire Testnet',
51
- rpcUrls: ['https://...http', 'wss://...ws'],
52
- nativeCurrency: { symbol: 'SOL', decimals: 9 }
57
+ // ---- Solana example (wallet adapter) ----
58
+ const solAdapter: BaseSignerWalletAdapter = /* connected wallet */;
59
+ const solCfg: StakerConfig = {
60
+ provider: solAdapter,
61
+ network: {
62
+ chainId: SolChainID.Devnet,
63
+ name: 'Wire Solana Devnet',
64
+ rpcUrls: ['https://...', 'wss://...'],
65
+ nativeCurrency: { symbol: 'SOL', decimals: 9 },
66
+ },
67
+ pubKey: new WirePubKey(KeyType.ED, solAdapter.publicKey!.toBytes()),
68
+ extras: { squadsX: { multisigPDA: '<base58>', vaultIndex: 0 } }, // optional
53
69
  };
54
70
 
55
- const cfg: StakerConfig = {
56
- provider: adapter,
57
- network,
58
- pubKey: new WirePubKey(KeyType.ED, adapter.publicKey!.toBytes()),
71
+ // ---- Ethereum example (browser provider) ----
72
+ const ethProvider = new ethers.providers.Web3Provider(window.ethereum);
73
+ const ethCfg: StakerConfig = {
74
+ provider: ethProvider,
75
+ network: {
76
+ chainId: EvmChainID.Ethereum,
77
+ name: 'Ethereum',
78
+ rpcUrls: ['https://...'],
79
+ nativeCurrency: { symbol: 'ETH', decimals: 18 },
80
+ },
59
81
  };
60
82
 
61
- const staker = new Staker(cfg /* or [cfg1, cfg2, ...] */, network.chainId);
83
+ const staker = new Staker([solCfg, ethCfg], SolChainID.Devnet); // default active chain
84
+ const client = staker.client; // typed staking client for the selected chain
62
85
  ```
63
86
 
64
- > **Note:** If you pass multiple networks, `Staker` can switch between them via `staker.setChain(chainId)`.
65
-
66
- ### 2) Get the active client &amp; portfolio
67
-
87
+ ### Common calls
88
+ Amounts are always **base units** (lamports / wei).
68
89
  ```ts
69
- const client = staker.client; // current chain’s client (or undefined if not configured)
70
- if (!client) throw new Error('Chain not configured');
71
-
72
- const portfolio = await client.getPortfolio();
73
- /**
74
- * portfolio.native.amount // wallet SOL in lamports
75
- * portfolio.actual.amount // liqSOL in ATA
76
- * portfolio.tracked.amount // tracked on distribution program
77
- */
90
+ await client?.deposit(1_000_000_000n); // stake 1 SOL -> liqSOL (or 1e9 wei -> liqETH)
91
+ await client?.withdraw(500_000_000n); // liq -> native withdraw request
92
+ await client?.stake(200_000_000n); // stake liq into yield pool (Sol Outpost / ETH manager)
93
+ await client?.unstake(100_000_000n); // reverse stake (where supported)
94
+ await client?.buy(50_000_000n); // purchase WIRE pretokens with liq
95
+ const portfolio = await client?.getPortfolio(); // unified balance snapshot
78
96
  ```
79
97
 
80
- ### 3) Deposit
81
-
82
- Amounts must be passed in the chain’s **smallest unit** (lamports on Solana, wei on EVM).
83
-
98
+ ### Solana flow (what happens)
99
+ - `deposit(lamports)`: builds ix via `DepositClient`, optionally wraps in SquadsX vault tx, sends and confirms.
100
+ - `withdraw(lamports)`: burns liqSOL and mints a withdrawal NFT receipt (payout later via operators).
101
+ - `stake/unstake`: interacts with Outpost (`synd`/`desynd`) to move liqSOL into/out of yield pool.
102
+ - `buy(lamports)`: purchase $WIRE pretokens using liqSOL (Token-2022).
103
+ - Multisig: if `extras.squadsX` is set, write calls become Squads proposals (`sendSquadsIxs`).
104
+ - Portfolio extras include key PDAs (vault, reserve pool, user ATA) plus Outpost index/shares math.
105
+
106
+ ### Ethereum flow (what happens)
107
+ - `deposit(amountWei)`: via `ConvertClient.performDeposit`; returns tx hash.
108
+ - `withdraw(amountWei)`: burns liqETH and enqueues withdrawal; receipts are NFTs.
109
+ - `getPendingWithdraws()` / `claimWithdraw(tokenId)`: manage withdrawal queue.
110
+ - `stake(amountWei)`: stakes liqETH; `unstakePrelaunch(tokenId, recipient)` handles prelaunch path.
111
+ - `buy(amountWei)`: pretokens via `PretokenClient.purchasePretokensWithLiqETH`.
112
+ - `validatorDeposit()`: validator bond/lock helper.
113
+ - Portfolio includes native/liq/staked/$WIRE and yield (index/shares) when contracts expose them.
114
+
115
+ ## Solana specifics
116
+ - **Clients composed under the hood**: `DepositClient`, `DistributionClient`, `OutpostClient`,
117
+ `TokenClient`, `ValidatorLeaderboardClient`, `SolanaProgramService`.
118
+ - **SquadsX multisig**: provide `extras.squadsX` to have deposits / stakes wrapped as vault
119
+ transactions (`sendSquadsIxs`).
120
+ - **Outpost / Yield**: `getPortfolio()` returns `yield` (index-scale math) and `staked` amounts; `wire`
121
+ reports pretokens (1e8 scale).
122
+ - **Helpers**: `getDepositBuffer`, `getDepositFee`, `getSystemAPY`, tranche snapshots via
123
+ `getTrancheSnapshot(chainId)`.
124
+
125
+ ## Ethereum specifics
126
+ - Uses `ethers` provider/signer; falls back to JSON RPC for read-only.
127
+ - Modules used: `ConvertClient` (deposit/withdraw), `StakeClient`, `PretokenClient`, `OPPClient`,
128
+ `ReceiptClient` (withdrawal NFTs), `ValidatorClient`.
129
+ - Additional endpoints:
130
+ - `getPendingWithdraws()` → pending withdrawal receipts.
131
+ - `claimWithdraw(tokenId)` → claim queued withdrawal by NFT id.
132
+ - `unstakePrelaunch(tokenId, recipient)` → prelaunch unstake path.
133
+ - `validatorDeposit()` → validator bond/lock flow.
134
+ - `getTrancheSnapshot(chainId)` → pretoken ladder view with price/supply growth.
135
+ - `getOPPMessages(address?)` and `getEthStats()` for operator/pay-rate data.
136
+
137
+ ## Portfolio shape (all chains)
84
138
  ```ts
85
- // Human smallest unit (e.g., 0.5 SOL → 0.5 * 10^9)
86
- const human = 0.5;
87
- const smallest = Math.round(human * Math.pow(10, client.network.nativeCurrency.decimals));
88
-
89
- const sig = await client.deposit(smallest);
90
- console.log('Deposit tx:', sig);
91
- ```
92
-
93
- ### 4) Register (Correct &amp; Register on Solana)
94
-
95
- Registers any **untracked** liqSOL (if your actual token balance &gt; tracked) and, if necessary,
96
- first corrects other users with positive tracked deltas to free available balance.
97
-
98
- ```ts
99
- const sig = await client.register();
100
- console.log('Register tx:', sig);
139
+ type Portfolio = {
140
+ native: { amount: bigint; symbol: string; decimals: number };
141
+ liq: { amount: bigint; symbol: string; decimals: number; ata?: PublicKey };
142
+ staked: { amount: bigint; symbol: string; decimals: number };
143
+ wire: { amount: bigint; symbol: string; decimals: number };
144
+ yield?: { currentIndex: bigint; indexScale: bigint; totalShares: bigint;
145
+ userShares: bigint; estimatedClaim?: bigint; estimatedYield?: bigint };
146
+ extras?: Record<string, any>;
147
+ chainID: number;
148
+ };
101
149
  ```
102
150
 
103
- ---
104
-
105
- ## Solana-specific Clients (low-level)
106
-
107
- You typically don’t need these directly if you use `Staker`, but they’re available.
108
-
109
- ### `DepositClient`
110
-
111
- - `buildDepositTx(user: PublicKey, amount: number)` → `{ transaction, ephemeralStakePubkey }`
112
- - `deposit(user: PublicKey, amount: number)` → confirmed signature
113
-
114
- ### `DistributionClient`
115
-
116
- - `getDistributionState()`, `getUserRecord(user)`
117
- - `getActualBalance(user)`, `getTrackedBalance(user)`
118
- - `updateUser(targetUser)` – register/correct a user
119
- - `buildCorrectRegisterTx({ amount?, preloadCandidates? })` – build a tx that:
120
- - if your mismatch &lt; 0 → just **correct self**
121
- - else → **free available** by updating top candidates, then **register self**
122
-
123
- ---
124
-
125
- ## Core Types
151
+ ## Error handling
152
+ - All write methods throw on failure; wrap with `try/catch`.
153
+ - Solana transaction failures include logs; Ethereum methods surface tx hashes for inspection.
154
+ - Passing `provider` is required for writes; read-only is supported for many getters.
126
155
 
156
+ ## Using from a service (pattern)
157
+ Your `staking.service.ts` can simply forward to the selected `client`. The Wire Hub webapp
158
+ (`wire-hub-webapp/src/app/_services/staking.service.ts`) does this and adds read-only Outpost
159
+ clients, tranche/APY polling, SquadsX, and retryable portfolio refresh. Typical shape:
127
160
  ```ts
128
- import { BaseSignerWalletAdapter } from '@solana/wallet-adapter-base';
129
- import { PublicKey as SolPubKey } from '@solana/web3.js';
130
- import { ExternalNetwork, PublicKey } from '@wireio/core';
131
- import { ethers } from 'ethers';
132
-
133
- export interface IStakingClient {
134
- pubKey: PublicKey;
135
- network: ExternalNetwork;
136
-
137
- /** Amount is in the chain's smallest unit (lamports/wei, etc.) */
138
- deposit(amount: number): Promise<string>;
139
-
140
- /** Register any untracked LIQ staked tokens */
141
- register(): Promise<string>;
142
-
143
- /** Fetch the portfolio for the LIQ stake user */
144
- getPortfolio(): Promise<Portfolio>;
145
- }
146
-
147
- export type StakerConfig = {
148
- network: ExternalNetwork;
149
- provider: BaseSignerWalletAdapter | ethers.providers.Web3Provider;
150
- pubKey: PublicKey;
151
- }
152
-
153
- export interface Portfolio {
154
- /** Native SOL balance on chain */
155
- native: BalanceView;
156
- /** Actual liquid SOL balance from ATA */
157
- actual: BalanceView;
158
- /** Tracked liquid SOL balance from distribution program */
159
- tracked: BalanceView;
160
- /** Extra PDAs and account addresses */
161
- extras?: Record&lt;string, any&gt;;
161
+ export class StakingService {
162
+ constructor(private staker: Staker) {}
163
+ deposit(amount: bigint) { return this.staker.client?.deposit(amount); }
164
+ withdraw(amount: bigint) { return this.staker.client?.withdraw(amount); }
165
+ stake(amount: bigint) { return this.staker.client?.stake(amount); }
166
+ unstake(amount: bigint) { return this.staker.client?.unstake(amount); }
167
+ buy(amount: bigint) { return this.staker.client?.buy(amount); }
168
+ portfolio() { return this.staker.client?.getPortfolio(); }
169
+ stats(chainId: number) { return this.staker.client?.getTrancheSnapshot(chainId); }
162
170
  }
163
-
164
- export type BalanceView = {
165
- amount: bigint; // raw on-chain integer value
166
- decimals: number; // number of decimal places
167
- symbol?: string; // optional token symbol identifier
168
- ata?: SolPubKey; // associated token account address
169
- };
170
171
  ```
171
-
172
- ---
173
-
174
- ## Multi-chain Notes &amp; Roadmap
175
-
176
- - **Ethereum** client is planned (will implement `IStakingClient` with the same methods).
177
- - **Sui** (and other chains) to follow the same interface for a unified developer experience.
178
- - Your app can rely on the `Staker` facade today and gain new chains later without API changes.
179
-
180
- ---
181
-
182
- ## Error Handling
183
-
184
- - All public methods throw on failure. Wrap calls with `try/catch` and surface errors to your users.
185
- - For Solana, failed transactions carry logs; some SDK methods surface logs in thrown errors.
186
-
187
- ---
188
-
189
- ## Development
190
-
191
- Requires:
192
-
193
- - **Node.js** (LTS recommended)
194
- - **npm**
195
- - **Make** (optional, for convenience targets)
196
-
197
- Common tasks:
198
-
172
+ Switch chains at runtime with `staker.setChain(chainId)`.
173
+
174
+ Hub-specific extras you can reuse:
175
+ - Read-only bootstrap: configs with only `network` to fetch tranche snapshots/APY before a wallet connects.
176
+ - APY helpers: `getSystemAPY()` per chain; normalize number/string/bigint shapes.
177
+ - Deposit buffer: `getDepositBuffer({ balanceOverrideLamports })` to compute max-spendable.
178
+ - SquadsX multisig: store `multisigPDA` + `vaultIndex` (localStorage keys `hub_squadsx_multisigpda`, `hub_squadsx_vaultindex`) and pass via `extras.squadsX` so write calls become Squads proposals.
179
+ - ETH prelaunch/receipts: `getPendingWithdraws`, `claimWithdraw(tokenId)`, `unstakePrelaunch(tokenId, recipient)`, `fetchPrelaunchReceipts`.
180
+ - Tranche ladders: cache `getTrancheSnapshot(chainId)` per chain for dashboards (liquidity/utilization/arb spread).
181
+
182
+ ## Portfolio fields (returned by `getPortfolio`)
183
+ - `native`: wallet balance in base units; symbol/decimals from network.
184
+ - `liq`: liquid staking token balance (Token-2022 ATA on Sol; ERC-20 on EVM).
185
+ - `staked`: liq staked into Outpost (Sol) or staking manager (ETH).
186
+ - `wire`: pretoken balance (1e8 scale).
187
+ - `yield`: `currentIndex`, `indexScale`, `totalShares`, `userShares`, `estimatedClaim`, `estimatedYield`.
188
+ - `extras`: PDAs, price/index hints useful for UIs and debugging.
189
+ - `chainID`: the chain the snapshot came from.
190
+
191
+ ## Tranche snapshot fields (via `getTrancheSnapshot`)
192
+ - `currentTranche`, `currentPriceUsd` (1e8), `currentTrancheSupply`, `initialTrancheSupply`.
193
+ - `ladder`: nearby rows `{ id, capacity, sold, remaining, priceUsd }` (1e8 scale).
194
+ - `currentIndex`, `totalShares`, `totalPretokensSold`, `supplyGrowthBps`, `priceGrowthCents`.
195
+ - `nativePriceUsd` if available (SDK backfills from market data when the chain doesn’t provide it).
196
+
197
+ ## Building, testing, docs
199
198
  ```bash
200
- # Install deps
201
- npm ci
202
-
203
- # Build
204
- npm run prepare
205
- ```
206
-
207
- ---
208
-
209
- ## Testnet Deployment 11/19/25
210
- ```
211
- RPC URL: https://sol.gitgo.app/
212
- Deploying cluster: http://solana-genesis:8899
213
- Upgrade authority: ./wallets/deploymentWallet/universalDeploymentWallet.json
214
- Deploying program "liq_sol_token"...
215
- Program path: /app/program/target/deploy/liq_sol_token.so...
216
- Program Id: FsRiJLqerifBSpZjzdWxSyJ3sQmJ3ScFwHv4VRi9ghVT
217
-
218
- Signature: 26JPXjiNXBzPk7p8PQx8y1bQog1baWCjyRqWYyQKNxEpK9reAHpeNwcw9Sh7dAyaAhyuosQueE4XrnTZibXdwx99
219
-
220
- Deploying program "validator_leaderboard"...
221
- Program path: /app/program/target/deploy/validator_leaderboard.so...
222
- Program Id: 9SW7GqRTzEc5KjSnXXTqvojcyCvzHjn8J4xdBeS91Gbq
223
-
224
- Signature: 5nobXLXnnMD9MmPjcJ5xbmawV4wDXxCYEBR2CwoBkvEQ4iLAVQCpzZWw7Pgb7eGwk6bu88VvpC2occCJh2EYajfJ
225
-
226
- Deploying program "liqsol_core"...
227
- Program path: /app/program/target/deploy/liqsol_core.so...
228
- Program Id: 8zBGapo9WvnGskgXyKmgNgLACimELqJzAPEHyShWg5Dj
229
-
230
- Signature: 2wakzKzaxkRLC4nMw3t8pCSL4PfG32EoSKZXo6og8mAgVq54twWUhqG5JLAQejvsqGgEBaZ7zwWj9tvsijt8vwbi
231
-
232
- Deploy success
233
- 🪙 Initializing token mint...
234
- 🚀 Initializing Liquid SOL Token...
235
-
236
- 📍 Mint Authority PDA: 3XwUD4Sy6Aua1ceC8yEHTWk16vMmmWAdFMfJpzwvwveD
237
- 🪙 Deterministic Mint Address: Empuao5KEK7zq3rFz8Q8fVSmNwhbkrqkNctdfZKdY9b2
238
- 🔗 Network: http://solana-genesis:8899
239
- 👤 Payer: Ebar1nLiEpHEFH4DmYasqJHMm3fn6g1jJY3WBfwc6GsD
240
- 📝 Token Name: Liquid Staked SOL
241
- 🏷️ Token Symbol: liqSOL
242
-
243
- 🏦 Receiver ATA: 3B9dtsRGYvB1aVQYR8yHfzbbECgohHkH7U67v6gPJ1HQ
244
- 🔄 Sending mint creation transaction...
245
- ✅ Liquid SOL Token mint created! Transaction: 5fgNuuNorhBcvjp28AQhHK1jkSG6fRCPBbxsHbEnB3CyuRYPRTGybH2gjLhGdb7kD8CUohibUzd1wnPLUDUauret
246
-
247
- 📊 Created Mint Information:
248
- Mint Address: Empuao5KEK7zq3rFz8Q8fVSmNwhbkrqkNctdfZKdY9b2
249
- Mint Authority: 3XwUD4Sy6Aua1ceC8yEHTWk16vMmmWAdFMfJpzwvwveD
250
- Token Name: Liquid Staked SOL
251
- Token Symbol: liqSOL
252
- Decimals: 9
253
- Receiver ATA: 3B9dtsRGYvB1aVQYR8yHfzbbECgohHkH7U67v6gPJ1HQ
254
-
255
- 🎉 Liquid SOL Token is ready to use!
256
- Mint Address: Empuao5KEK7zq3rFz8Q8fVSmNwhbkrqkNctdfZKdY9b2
257
- Program ID: FsRiJLqerifBSpZjzdWxSyJ3sQmJ3ScFwHv4VRi9ghVT
258
- Mint Authority PDA: 3XwUD4Sy6Aua1ceC8yEHTWk16vMmmWAdFMfJpzwvwveD
259
- ▶ Initializing Distribution Program...
260
- Distribution Program: 8zBGapo9WvnGskgXyKmgNgLACimELqJzAPEHyShWg5Dj
261
- Wallet: Ebar1nLiEpHEFH4DmYasqJHMm3fn6g1jJY3WBfwc6GsD
262
- LiqSOL Mint: Empuao5KEK7zq3rFz8Q8fVSmNwhbkrqkNctdfZKdY9b2
263
- Distribution State PDA: BHMC9S1J8jy7nitVt4CHGeRHVK8kh9jpm4xKhf4cJWgn
199
+ npm ci # install
200
+ npm run prepare # build to lib/ via rollup
201
+ npm test # full test suite (make targets exist for sol/eth split)
202
+ npm run docs # generate typedoc to docs/ (gh-pages ready)
264
203
  ```
265
204
 
266
- ## Autodocs
267
-
268
- - **API Docs:** <https://Wire-Network.github.io/sdk-stake/>
269
- - **Coverage:** coming soon
270
-
271
- ---
205
+ ## Project structure (src/)
206
+ - `staker.ts` – chain router / façade.
207
+ - `types.ts` shared interfaces (IStakingClient, Portfolio, tranche snapshots).
208
+ - `networks/solana/*` clients, IDL wiring, constants, utils.
209
+ - `networks/ethereum/*` – contract service, clients, tranche math.
210
+ - `assets/` – IDLs, ABIs, artifacts.
272
211
 
273
- ## License
212
+ ## Versioning & license
213
+ - License: **FSL-1.1-Apache-2.0** (see `LICENSE.md`).
274
214
 
275
- MIT – see [LICENSE](./LICENSE).
215
+ ## Links
216
+ - API reference: <https://Wire-Network.github.io/sdk-stake/>
217
+ - Source: <https://github.com/Wire-Network/sdk-stake>