aiia-vault-sdk 1.3.3 → 1.4.1

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.
@@ -0,0 +1,367 @@
1
+ import { ethers } from "ethers";
2
+ import { ParsedErc20StakingEvent, ParsedErc20StakingEventRaw, RawErc20StakingEventTypes } from "./types";
3
+ import { type SendTransactionMutateAsync } from "@wagmi/core/query";
4
+ import { Config } from "@wagmi/core/dist/types/createConfig";
5
+ export declare class Erc20StakingSDK {
6
+ name: string;
7
+ private contract;
8
+ private providers;
9
+ private contractAddress;
10
+ private tokenContract;
11
+ private tokenAddress;
12
+ private tokenDecimals;
13
+ private isBootstrapped;
14
+ constructor(rpcUrls: string | string[], contractAddress?: string, tokenAddress?: string);
15
+ private loadTokenAddress;
16
+ private getRandomProvider;
17
+ private getContractWithRandomProvider;
18
+ bootstrap(): Promise<void>;
19
+ signAndSendTransaction(tx: ethers.ContractTransaction, wallet: ethers.Wallet | SendTransactionMutateAsync<Config, any>, callbacks?: {
20
+ onSubmit?: (tx: string) => void | Promise<void>;
21
+ onFinally?: (status: {
22
+ status: boolean | null;
23
+ confirmations: number;
24
+ txHash: string;
25
+ isCompleted: boolean;
26
+ attempts: number;
27
+ }) => void | Promise<void>;
28
+ onError?: (error: Error) => void | Promise<void>;
29
+ }): Promise<{
30
+ transaction: {
31
+ hash: string;
32
+ };
33
+ status: {
34
+ status: boolean | null;
35
+ confirmations: number;
36
+ isCompleted: boolean;
37
+ attempts: number;
38
+ };
39
+ }>;
40
+ /**
41
+ * Get token decimals
42
+ * @returns Number of token decimals
43
+ */
44
+ getTokenDecimals(): number;
45
+ /**
46
+ * Get token address
47
+ * @returns Address of the staking token
48
+ */
49
+ getTokenAddress(): Promise<string>;
50
+ /**
51
+ * Format token amount from human-readable to raw (with decimals)
52
+ * @param amount Amount in human-readable format
53
+ * @returns Amount in raw format with proper decimals
54
+ */
55
+ formatTokenAmount(amount: number): Promise<bigint>;
56
+ /**
57
+ * Parse token amount from raw to human-readable
58
+ * @param amount Amount in raw format with decimals
59
+ * @returns Amount in human-readable format
60
+ */
61
+ parseTokenAmount(amount: bigint): number;
62
+ /**
63
+ * Get token balance of an address
64
+ * @param address Address to check balance for
65
+ * @returns Balance in raw format (with decimals)
66
+ */
67
+ getTokenBalanceRaw(address: string): Promise<bigint>;
68
+ /**
69
+ * Get token balance of an address in human-readable format
70
+ * @param address Address to check balance for
71
+ * @returns Balance in human-readable format
72
+ */
73
+ getTokenBalance(address: string): Promise<number>;
74
+ /**
75
+ * Get token allowance for the staking contract
76
+ * @param owner Address of the token owner
77
+ * @returns Allowance in raw format (with decimals)
78
+ */
79
+ getTokenAllowanceRaw(owner: string): Promise<bigint>;
80
+ /**
81
+ * Get token allowance for the staking contract in human-readable format
82
+ * @param owner Address of the token owner
83
+ * @returns Allowance in human-readable format
84
+ */
85
+ getTokenAllowance(owner: string): Promise<number>;
86
+ /**
87
+ * Build a transaction to approve token spending
88
+ * @param amount Amount to approve in human-readable format
89
+ * @returns Populated transaction
90
+ */
91
+ buildApproveTokenTx(amount: number): Promise<ethers.ContractTransaction>;
92
+ /**
93
+ * Build a transaction to approve unlimited token spending
94
+ * @returns Populated transaction
95
+ */
96
+ buildApproveUnlimitedTokenTx(): Promise<ethers.ContractTransaction>;
97
+ /**
98
+ * Builds a transaction to stake tokens to the contract
99
+ * @param amount Amount of tokens to stake in raw format (with decimals)
100
+ * @returns Populated transaction
101
+ */
102
+ buildStakeTxRaw(amount: bigint): Promise<ethers.ContractTransaction>;
103
+ /**
104
+ * Builds a transaction to stake tokens to the contract
105
+ * @param amount Amount of tokens to stake in human-readable format
106
+ * @returns Populated transaction
107
+ */
108
+ buildStakeTx(amount: number): Promise<ethers.ContractTransaction>;
109
+ /**
110
+ * Builds a transaction to unstake tokens
111
+ * @param amount Amount to unstake in raw format (with decimals)
112
+ * @returns Populated transaction
113
+ */
114
+ buildUnstakeTxRaw(amount: bigint): Promise<ethers.ContractTransaction>;
115
+ /**
116
+ * Builds a transaction to unstake tokens
117
+ * @param amount Amount to unstake in human-readable format
118
+ * @returns Populated transaction
119
+ */
120
+ buildUnstakeTx(amount: number): Promise<ethers.ContractTransaction>;
121
+ /**
122
+ * Builds a transaction to harvest rewards
123
+ * @param amount Reward amount to harvest in raw format (with decimals)
124
+ * @param nonce Unique nonce to prevent replay attacks
125
+ * @param deadline Timestamp after which signature is invalid
126
+ * @param signature Signature from authorized signer
127
+ * @returns Populated transaction
128
+ */
129
+ buildHarvestRewardTxRaw(amount: bigint, nonce: bigint, deadline: bigint, signature: string): Promise<ethers.ContractTransaction>;
130
+ /**
131
+ * Builds a transaction to harvest rewards
132
+ * @param amount Reward amount to harvest in human-readable format
133
+ * @param nonce Unique nonce to prevent replay attacks
134
+ * @param deadline Timestamp after which signature is invalid
135
+ * @param signature Signature from authorized signer
136
+ * @returns Populated transaction
137
+ */
138
+ buildHarvestRewardTx(amount: number, nonce: number, deadline: number, signature: string): Promise<ethers.ContractTransaction>;
139
+ /**
140
+ * Builds a transaction to unstake and harvest in one transaction
141
+ * @param unstakeAmount Unstake amount in raw format (with decimals)
142
+ * @param rewardAmount Reward amount in raw format (with decimals)
143
+ * @param nonce Unique nonce to prevent replay attacks
144
+ * @param deadline Timestamp after which signature is invalid
145
+ * @param signature Signature from authorized signer
146
+ * @returns Populated transaction
147
+ */
148
+ buildUnstakeAndHarvestTxRaw(unstakeAmount: bigint, rewardAmount: bigint, nonce: bigint, deadline: bigint, signature: string): Promise<ethers.ContractTransaction>;
149
+ /**
150
+ * Builds a transaction to unstake and harvest in one transaction
151
+ * @param unstakeAmount Unstake amount in human-readable format
152
+ * @param rewardAmount Reward amount in human-readable format
153
+ * @param nonce Unique nonce to prevent replay attacks
154
+ * @param deadline Timestamp after which signature is invalid
155
+ * @param signature Signature from authorized signer
156
+ * @returns Populated transaction
157
+ */
158
+ buildUnstakeAndHarvestTx(unstakeAmount: number, rewardAmount: number, nonce: number, deadline: number, signature: string): Promise<ethers.ContractTransaction>;
159
+ /**
160
+ * Builds a transaction to add rewards to the contract
161
+ * @param amount Amount to add in raw format (with decimals)
162
+ * @returns Populated transaction
163
+ */
164
+ buildAddRewardsTxRaw(amount: bigint): Promise<ethers.ContractTransaction>;
165
+ /**
166
+ * Builds a transaction to add rewards to the contract
167
+ * @param amount Amount to add in human-readable format
168
+ * @returns Populated transaction
169
+ */
170
+ buildAddRewardsTx(amount: number): Promise<ethers.ContractTransaction>;
171
+ /**
172
+ * Builds a transaction to update the maximum reward amount
173
+ * @param newMaxReward New maximum reward amount in raw format (with decimals)
174
+ * @returns Populated transaction
175
+ */
176
+ buildUpdateMaxRewardAmountTxRaw(newMaxReward: bigint): Promise<ethers.ContractTransaction>;
177
+ /**
178
+ * Builds a transaction to update the maximum reward amount
179
+ * @param newMaxReward New maximum reward amount in human-readable format
180
+ * @returns Populated transaction
181
+ */
182
+ buildUpdateMaxRewardAmountTx(newMaxReward: number): Promise<ethers.ContractTransaction>;
183
+ /**
184
+ * Builds a transaction to set the minimum stake amount
185
+ * @param newMinStake New minimum stake amount in raw format (with decimals)
186
+ * @returns Populated transaction
187
+ */
188
+ buildSetMinStakeAmountTxRaw(newMinStake: bigint): Promise<ethers.ContractTransaction>;
189
+ /**
190
+ * Builds a transaction to set the minimum stake amount
191
+ * @param newMinStake New minimum stake amount in human-readable format
192
+ * @returns Populated transaction
193
+ */
194
+ buildSetMinStakeAmountTx(newMinStake: number): Promise<ethers.ContractTransaction>;
195
+ /**
196
+ * Builds a transaction to update the staking token
197
+ * @param newToken New ERC20 token address
198
+ * @returns Populated transaction
199
+ */
200
+ buildUpdateStakingTokenTx(newToken: string): Promise<ethers.ContractTransaction>;
201
+ /**
202
+ * Builds a transaction to add a new signer
203
+ * @param signer Address of the new signer
204
+ * @returns Populated transaction
205
+ */
206
+ buildAddSignerTx(signer: string): Promise<ethers.ContractTransaction>;
207
+ /**
208
+ * Builds a transaction to remove a signer
209
+ * @param signer Address of the signer to remove
210
+ * @returns Populated transaction
211
+ */
212
+ buildRemoveSignerTx(signer: string): Promise<ethers.ContractTransaction>;
213
+ /**
214
+ * Builds a transaction to pause the contract
215
+ * @returns Populated transaction
216
+ */
217
+ buildPauseTx(): Promise<ethers.ContractTransaction>;
218
+ /**
219
+ * Builds a transaction to unpause the contract
220
+ * @returns Populated transaction
221
+ */
222
+ buildUnpauseTx(): Promise<ethers.ContractTransaction>;
223
+ /**
224
+ * Builds a transaction to emergency withdraw all tokens
225
+ * @param recipient Address to receive the funds
226
+ * @returns Populated transaction
227
+ */
228
+ buildEmergencyWithdrawTx(recipient: string): Promise<ethers.ContractTransaction>;
229
+ /**
230
+ * Gets total staked tokens in the contract in raw format (with decimals)
231
+ * @returns Total staked amount as bigint
232
+ */
233
+ getTotalStakedRaw(): Promise<bigint>;
234
+ /**
235
+ * Gets total staked tokens in the contract in human-readable format
236
+ * @returns Total staked amount as number
237
+ */
238
+ getTotalStaked(): Promise<number>;
239
+ /**
240
+ * Gets total rewards distributed in raw format (with decimals)
241
+ * @returns Total rewards as bigint
242
+ */
243
+ getTotalRewardsRaw(): Promise<bigint>;
244
+ /**
245
+ * Gets total rewards distributed in human-readable format
246
+ * @returns Total rewards as number
247
+ */
248
+ getTotalRewards(): Promise<number>;
249
+ /**
250
+ * Gets maximum reward amount allowed in a single harvest in raw format (with decimals)
251
+ * @returns Maximum reward amount as bigint
252
+ */
253
+ getMaxRewardAmountRaw(): Promise<bigint>;
254
+ /**
255
+ * Gets maximum reward amount allowed in a single harvest in human-readable format
256
+ * @returns Maximum reward amount as number
257
+ */
258
+ getMaxRewardAmount(): Promise<number>;
259
+ /**
260
+ * Gets minimum stake amount in raw format (with decimals)
261
+ * @returns Minimum stake amount as bigint
262
+ */
263
+ getMinStakeAmountRaw(): Promise<bigint>;
264
+ /**
265
+ * Gets minimum stake amount in human-readable format
266
+ * @returns Minimum stake amount as number
267
+ */
268
+ getMinStakeAmount(): Promise<number>;
269
+ /**
270
+ * Gets user's stake and total harvested rewards in raw format (with decimals)
271
+ * @param user Address of the user
272
+ * @returns Object containing stake and harvested rewards as bigint
273
+ */
274
+ getUserInfoRaw(user: string): Promise<{
275
+ stake: bigint;
276
+ harvested: bigint;
277
+ }>;
278
+ /**
279
+ * Gets user's stake and total harvested rewards in human-readable format
280
+ * @param user Address of the user
281
+ * @returns Object containing stake and harvested rewards as number
282
+ */
283
+ getUserInfo(user: string): Promise<{
284
+ stake: number;
285
+ harvested: number;
286
+ }>;
287
+ /**
288
+ * Gets user's stake in raw format (with decimals)
289
+ * @param user Address of the user
290
+ * @returns User's stake as bigint
291
+ */
292
+ getUserStakeRaw(user: string): Promise<bigint>;
293
+ /**
294
+ * Gets user's stake in human-readable format
295
+ * @param user Address of the user
296
+ * @returns User's stake as number
297
+ */
298
+ getUserStake(user: string): Promise<number>;
299
+ /**
300
+ * Gets user's total rewards harvested in raw format (with decimals)
301
+ * @param user Address of the user
302
+ * @returns User's total rewards harvested as bigint
303
+ */
304
+ getUserTotalRewardsHarvestedRaw(user: string): Promise<bigint>;
305
+ /**
306
+ * Gets user's total rewards harvested in human-readable format
307
+ * @param user Address of the user
308
+ * @returns User's total rewards harvested as number
309
+ */
310
+ getUserTotalRewardsHarvested(user: string): Promise<number>;
311
+ /**
312
+ * Checks if the contract is paused
313
+ * @returns Boolean indicating if contract is paused
314
+ */
315
+ isPaused(): Promise<boolean>;
316
+ /**
317
+ * Gets the OPERATOR_ROLE hash
318
+ * @returns The OPERATOR_ROLE hash
319
+ */
320
+ getOperatorRoleHash(): Promise<string>;
321
+ /**
322
+ * Gets the SIGNER_ROLE hash
323
+ * @returns The SIGNER_ROLE hash
324
+ */
325
+ getSignerRoleHash(): Promise<string>;
326
+ /**
327
+ * Gets the DEFAULT_ADMIN_ROLE hash
328
+ * @returns The DEFAULT_ADMIN_ROLE hash
329
+ */
330
+ getAdminRoleHash(): Promise<string>;
331
+ /**
332
+ * Checks if an address has the operator role
333
+ * @param address Address to check
334
+ * @returns Boolean indicating if the address has operator role
335
+ */
336
+ hasOperatorRole(address: string): Promise<boolean>;
337
+ /**
338
+ * Checks if an address has the signer role
339
+ * @param address Address to check
340
+ * @returns Boolean indicating if the address has signer role
341
+ */
342
+ hasSignerRole(address: string): Promise<boolean>;
343
+ /**
344
+ * Checks if an address has the admin role
345
+ * @param address Address to check
346
+ * @returns Boolean indicating if the address has admin role
347
+ */
348
+ hasAdminRole(address: string): Promise<boolean>;
349
+ /**
350
+ * Creates a signature for harvesting rewards
351
+ * @param contractAddress Address of the Erc20Staking contract
352
+ * @param userAddress Address of the user harvesting rewards
353
+ * @param amount Reward amount in human-readable format
354
+ * @param nonce Unique nonce to prevent replay attacks
355
+ * @param deadline Timestamp after which signature is invalid
356
+ * @param signerPrivateKey Private key of the authorized signer
357
+ * @returns Signature and message hash
358
+ */
359
+ createRewardSignature(contractAddress: string, userAddress: string, amount: number, nonce: number, deadline: number, signerPrivateKey: string): Promise<{
360
+ signature: string;
361
+ messageHash: string;
362
+ }>;
363
+ getContractAddress(): string;
364
+ getAllEvents(fromBlock: number, toBlock: number, whitelistEvents?: Array<keyof RawErc20StakingEventTypes>): Promise<ParsedErc20StakingEventRaw[]>;
365
+ streamEvents(fromBlock: number, onEvent: (event: ParsedErc20StakingEvent) => Promise<void>, saveLatestBlock: (blockNumber: number) => Promise<void>, batchSize?: number, sleepTime?: number, blockGap?: number, shouldContinue?: () => Promise<boolean> | boolean): Promise<void>;
366
+ formatEventArgs: (event: ParsedErc20StakingEventRaw) => ParsedErc20StakingEvent;
367
+ }
@@ -0,0 +1 @@
1
+ "use strict";var t=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.Erc20StakingSDK=void 0;const e=require("ethers"),a=t(require("./abis/Erc20Staking.json")),s=t(require("./contracts.json")),n=require("./utils");exports.Erc20StakingSDK=class{constructor(t,r,o){this.name="Erc20Staking",this.tokenAddress=e.ethers.ZeroAddress,this.tokenDecimals=18,this.isBootstrapped=!1,this.formatEventArgs=t=>{const{eventName:e,args:a}=t;switch(e){case"Staked":case"Unstaked":return{...t,args:{...a,user:a.user.toLowerCase(),amount:this.parseTokenAmount(a.amount),timestamp:Number(a.timestamp)}};case"RewardHarvested":return{...t,args:{...a,user:a.user.toLowerCase(),amount:this.parseTokenAmount(a.amount),timestamp:Number(a.timestamp),signatureHash:a.signatureHash}};case"SignerUpdated":return{...t,args:{...a,newSigner:a.newSigner.toLowerCase()}};case"MinStakeUpdated":return{...t,args:{...a,oldAmount:this.parseTokenAmount(a.oldAmount),newAmount:this.parseTokenAmount(a.newAmount)}};case"TokenUpdated":return{...t,args:{...a,newToken:a.newToken.toLowerCase()}};default:return t}};const i=Array.isArray(t)?t:[t];this.providers=i.map((t=>new e.ethers.JsonRpcProvider(t,void 0,{staticNetwork:!0})));const d=(0,n.getRandomProvider)(this.providers);this.contractAddress=(0,n.resolveContractAddress)(i[0],this.name,s.default,r),this.contract=new e.ethers.Contract(this.contractAddress,a.default.abi,d),o?this.tokenAddress=o:this.loadTokenAddress()}async loadTokenAddress(){try{this.tokenAddress=await this.contract.stakingToken(),this.tokenContract=new e.ethers.Contract(this.tokenAddress,["function decimals() view returns (uint8)","function symbol() view returns (string)","function balanceOf(address owner) view returns (uint256)","function allowance(address owner, address spender) view returns (uint256)","function approve(address spender, uint256 amount) returns (bool)"],this.getRandomProvider());try{this.tokenDecimals=await this.tokenContract.decimals()}catch(t){console.warn("Could not load token decimals, defaulting to 18")}}catch(t){console.error("Could not load token address from contract")}}getRandomProvider(){return(0,n.getRandomProvider)(this.providers)}getContractWithRandomProvider(){return new e.ethers.Contract(this.contractAddress,a.default.abi,this.getRandomProvider())}async bootstrap(){if(this.isBootstrapped)return;const t=await Promise.all(this.providers.map(((t,e)=>(0,n.checkRpcHealth)(t,e))));if(this.providers=this.providers.filter(((e,a)=>t[a])),0===this.providers.length)throw new Error("No active RPC providers available");this.tokenAddress===e.ethers.ZeroAddress&&await this.loadTokenAddress(),this.isBootstrapped=!0}async signAndSendTransaction(t,e,a={}){return(0,n.signAndSendTransaction)(t,e,(()=>this.getRandomProvider()),a,this.contract)}getTokenDecimals(){return this.tokenAddress&&this.tokenAddress!==e.ethers.ZeroAddress||this.loadTokenAddress(),this.tokenDecimals}async getTokenAddress(){return this.tokenAddress&&this.tokenAddress!==e.ethers.ZeroAddress||await this.loadTokenAddress(),this.tokenAddress}async formatTokenAmount(t){const a=await this.getTokenDecimals();return e.ethers.parseUnits(t.toString(),a)}parseTokenAmount(t){const a=this.getTokenDecimals();return Number(e.ethers.formatUnits(t,a))}async getTokenBalanceRaw(t){return this.tokenAddress&&this.tokenAddress!==e.ethers.ZeroAddress||await this.loadTokenAddress(),await this.tokenContract.balanceOf(t)}async getTokenBalance(t){const e=await this.getTokenBalanceRaw(t);return this.parseTokenAmount(e)}async getTokenAllowanceRaw(t){return this.tokenAddress&&this.tokenAddress!==e.ethers.ZeroAddress||await this.loadTokenAddress(),await this.tokenContract.allowance(t,this.contractAddress)}async getTokenAllowance(t){const e=await this.getTokenAllowanceRaw(t);return this.parseTokenAmount(e)}async buildApproveTokenTx(t){const e=await this.formatTokenAmount(t);return(0,n.buildApproveERC20Tx)(this.tokenAddress,this.contractAddress,e,this.getRandomProvider())}async buildApproveUnlimitedTokenTx(){return await this.buildApproveTokenTx(1e6)}async buildStakeTxRaw(t){return await this.contract.stake.populateTransaction(t)}async buildStakeTx(t){const e=await this.formatTokenAmount(t);return await this.buildStakeTxRaw(e)}async buildUnstakeTxRaw(t){return await this.contract.unstake.populateTransaction(t)}async buildUnstakeTx(t){const e=await this.formatTokenAmount(t);return await this.buildUnstakeTxRaw(e)}async buildHarvestRewardTxRaw(t,e,a,s){return await this.contract.harvestReward.populateTransaction(t,e,a,s)}async buildHarvestRewardTx(t,e,a,s){const n=await this.formatTokenAmount(t);return await this.buildHarvestRewardTxRaw(n,BigInt(e),BigInt(a),s)}async buildUnstakeAndHarvestTxRaw(t,e,a,s,n){return await this.contract.unstakeAndHarvest.populateTransaction(t,e,a,s,n)}async buildUnstakeAndHarvestTx(t,e,a,s,n){const r=await this.formatTokenAmount(t),o=await this.formatTokenAmount(e);return await this.buildUnstakeAndHarvestTxRaw(r,o,BigInt(a),BigInt(s),n)}async buildAddRewardsTxRaw(t){return await this.contract.addRewards.populateTransaction(t)}async buildAddRewardsTx(t){const e=await this.formatTokenAmount(t);return await this.buildAddRewardsTxRaw(e)}async buildUpdateMaxRewardAmountTxRaw(t){return await this.contract.updateMaxRewardAmount.populateTransaction(t)}async buildUpdateMaxRewardAmountTx(t){const e=await this.formatTokenAmount(t);return await this.buildUpdateMaxRewardAmountTxRaw(e)}async buildSetMinStakeAmountTxRaw(t){return await this.contract.setMinStakeAmount.populateTransaction(t)}async buildSetMinStakeAmountTx(t){const e=await this.formatTokenAmount(t);return await this.buildSetMinStakeAmountTxRaw(e)}async buildUpdateStakingTokenTx(t){return await this.contract.updateStakingToken.populateTransaction(t)}async buildAddSignerTx(t){return await this.contract.addSigner.populateTransaction(t)}async buildRemoveSignerTx(t){return await this.contract.removeSigner.populateTransaction(t)}async buildPauseTx(){return await this.contract.pause.populateTransaction()}async buildUnpauseTx(){return await this.contract.unpause.populateTransaction()}async buildEmergencyWithdrawTx(t){return await this.contract.emergencyWithdraw.populateTransaction(t)}async getTotalStakedRaw(){return await this.contract.totalStaked()}async getTotalStaked(){const t=await this.getTotalStakedRaw();return this.parseTokenAmount(t)}async getTotalRewardsRaw(){return await this.contract.totalRewards()}async getTotalRewards(){const t=await this.getTotalRewardsRaw();return this.parseTokenAmount(t)}async getMaxRewardAmountRaw(){return await this.contract.maxRewardAmount()}async getMaxRewardAmount(){const t=await this.getMaxRewardAmountRaw();return this.parseTokenAmount(t)}async getMinStakeAmountRaw(){return await this.contract.minStakeAmount()}async getMinStakeAmount(){const t=await this.getMinStakeAmountRaw();return this.parseTokenAmount(t)}async getUserInfoRaw(t){const[e,a]=await this.contract.getUserInfo(t);return{stake:e,harvested:a}}async getUserInfo(t){const{stake:e,harvested:a}=await this.getUserInfoRaw(t);return{stake:await this.parseTokenAmount(e),harvested:await this.parseTokenAmount(a)}}async getUserStakeRaw(t){return await this.contract.userStakes(t)}async getUserStake(t){const e=await this.getUserStakeRaw(t);return this.parseTokenAmount(e)}async getUserTotalRewardsHarvestedRaw(t){return await this.contract.userTotalRewardsHarvested(t)}async getUserTotalRewardsHarvested(t){const e=await this.getUserTotalRewardsHarvestedRaw(t);return this.parseTokenAmount(e)}async isPaused(){return await this.contract.paused()}async getOperatorRoleHash(){return await this.contract.OPERATOR_ROLE()}async getSignerRoleHash(){return await this.contract.SIGNER_ROLE()}async getAdminRoleHash(){return await this.contract.DEFAULT_ADMIN_ROLE()}async hasOperatorRole(t){const e=await this.contract.OPERATOR_ROLE();return await this.contract.hasRole(e,t)}async hasSignerRole(t){const e=await this.contract.SIGNER_ROLE();return await this.contract.hasRole(e,t)}async hasAdminRole(t){const e=await this.contract.DEFAULT_ADMIN_ROLE();return await this.contract.hasRole(e,t)}async createRewardSignature(t,a,s,n,r,o){const i=await this.formatTokenAmount(s),d=e.ethers.solidityPackedKeccak256(["address","address","uint256","uint256","uint256"],[t,a,i,n,r]),c=new e.ethers.Wallet(o);return{signature:await c.signMessage(e.ethers.getBytes(d)),messageHash:d.toString()}}getContractAddress(){return this.contractAddress}async getAllEvents(t,e,a){return await this.bootstrap(),(0,n.getAllEvents)(this.contract,(()=>this.getRandomProvider()),(()=>this.getContractWithRandomProvider()),t,e,a)}async streamEvents(t,e,a,s=1e3,r=5e3,o=0,i){const d=["Staked","Unstaked","RewardHarvested"];return await this.bootstrap(),(0,n.streamEvents)({getProvider:()=>this.getRandomProvider(),getAllEvents:(t,e)=>this.getAllEvents(t,e,d),formatEvent:t=>this.formatEventArgs(t),onEvent:e,saveLatestBlock:a,fromBlock:t,batchSize:s,sleepTime:r,blockGap:o,shouldContinue:i})}};
@@ -295,6 +295,6 @@ export declare class EthStakingSDK {
295
295
  }>;
296
296
  getContractAddress(): string;
297
297
  getAllEvents(fromBlock: number, toBlock: number, whitelistEvents?: Array<keyof RawEthStakingEventTypes>): Promise<ParsedEthStakingEventRaw[]>;
298
- streamEvents(fromBlock: number, onEvent: (event: ParsedEthStakingEvent) => Promise<void>, saveLatestBlock: (blockNumber: number) => Promise<void>, batchSize?: number, sleepTime?: number, blockGap?: number): Promise<void>;
298
+ streamEvents(fromBlock: number, onEvent: (event: ParsedEthStakingEvent) => Promise<void>, saveLatestBlock: (blockNumber: number) => Promise<void>, batchSize?: number, sleepTime?: number, blockGap?: number, shouldContinue?: () => Promise<boolean> | boolean): Promise<void>;
299
299
  formatEventArgs: (event: ParsedEthStakingEventRaw) => ParsedEthStakingEvent;
300
300
  }
@@ -1 +1 @@
1
- "use strict";var t=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.EthStakingSDK=void 0;const e=require("ethers"),a=t(require("./abis/EthStaking.json")),r=t(require("./contracts.json")),s=require("./utils");exports.EthStakingSDK=class{constructor(t,n){this.name="EthStaking",this.isBootstrapped=!1,this.formatEventArgs=t=>{const{eventName:a,args:r}=t;switch(a){case"Staked":case"Unstaked":return{...t,args:{...r,user:r.user.toLowerCase(),amount:Number(e.ethers.formatEther(r.amount)),timestamp:Number(r.timestamp)}};case"RewardHarvested":return{...t,args:{...r,user:r.user.toLowerCase(),amount:Number(e.ethers.formatEther(r.amount)),timestamp:Number(r.timestamp),signatureHash:r.signatureHash}};case"SignerUpdated":return{...t,args:{...r,newSigner:r.newSigner.toLowerCase()}};case"MinStakeUpdated":return{...t,args:{...r,oldAmount:Number(e.ethers.formatEther(r.oldAmount)),newAmount:Number(e.ethers.formatEther(r.newAmount))}};default:return t}};const i=Array.isArray(t)?t:[t];this.providers=i.map((t=>new e.ethers.JsonRpcProvider(t,void 0,{staticNetwork:!0})));const o=(0,s.getRandomProvider)(this.providers);this.contractAddress=(0,s.resolveContractAddress)(i[0],this.name,r.default,n),this.contract=new e.ethers.Contract(this.contractAddress,a.default.abi,o)}getRandomProvider(){return(0,s.getRandomProvider)(this.providers)}getContractWithRandomProvider(){return new e.ethers.Contract(this.contractAddress,a.default.abi,this.getRandomProvider())}async bootstrap(){if(this.isBootstrapped)return;const t=await Promise.all(this.providers.map(((t,e)=>(0,s.checkRpcHealth)(t,e))));if(this.providers=this.providers.filter(((e,a)=>t[a])),0===this.providers.length)throw new Error("No active RPC providers available");this.isBootstrapped=!0}async signAndSendTransaction(t,e,a={}){return(0,s.signAndSendTransaction)(t,e,(()=>this.getRandomProvider()),a,this.contract)}async buildStakeTxRaw(t){return await this.contract.stake.populateTransaction({value:t})}async buildStakeTx(t){return await this.buildStakeTxRaw(e.ethers.parseEther(t.toString()))}async buildUnstakeTxRaw(t){return await this.contract.unstake.populateTransaction(t)}async buildUnstakeTx(t){return await this.buildUnstakeTxRaw(e.ethers.parseEther(t.toString()))}async buildHarvestRewardTxRaw(t,e,a,r){return await this.contract.harvestReward.populateTransaction(t,e,a,r)}async buildHarvestRewardTx(t,a,r,s){return await this.buildHarvestRewardTxRaw(e.ethers.parseEther(t.toString()),BigInt(a),BigInt(r),s)}async buildUnstakeAndHarvestTxRaw(t,e,a,r,s){return await this.contract.unstakeAndHarvest.populateTransaction(t,e,a,r,s)}async buildUnstakeAndHarvestTx(t,a,r,s,n){return await this.buildUnstakeAndHarvestTxRaw(e.ethers.parseEther(t.toString()),e.ethers.parseEther(a.toString()),BigInt(r),BigInt(s),n)}async buildAddRewardsTxRaw(t){return await this.contract.addRewards.populateTransaction({value:t})}async buildAddRewardsTx(t){return await this.buildAddRewardsTxRaw(e.ethers.parseEther(t.toString()))}async buildUpdateMaxRewardAmountTxRaw(t){return await this.contract.updateMaxRewardAmount.populateTransaction(t)}async buildUpdateMaxRewardAmountTx(t){return await this.buildUpdateMaxRewardAmountTxRaw(e.ethers.parseEther(t.toString()))}async buildSetMinStakeAmountTxRaw(t){return await this.contract.setMinStakeAmount.populateTransaction(t)}async buildSetMinStakeAmountTx(t){return await this.buildSetMinStakeAmountTxRaw(e.ethers.parseEther(t.toString()))}async buildAddSignerTx(t){return await this.contract.addSigner.populateTransaction(t)}async buildRemoveSignerTx(t){return await this.contract.removeSigner.populateTransaction(t)}async buildPauseTx(){return await this.contract.pause.populateTransaction()}async buildUnpauseTx(){return await this.contract.unpause.populateTransaction()}async buildEmergencyUnstakeTx(t){return await this.contract.emergencyUnstake.populateTransaction(t)}async getTotalStakedRaw(){return await this.contract.totalStaked()}async getTotalStaked(){const t=await this.getTotalStakedRaw();return Number(e.ethers.formatEther(t))}async getTotalRewardsRaw(){return await this.contract.totalRewards()}async getTotalRewards(){const t=await this.getTotalRewardsRaw();return Number(e.ethers.formatEther(t))}async getMaxRewardAmountRaw(){return await this.contract.maxRewardAmount()}async getMaxRewardAmount(){const t=await this.getMaxRewardAmountRaw();return Number(e.ethers.formatEther(t))}async getMinStakeAmountRaw(){return await this.contract.minStakeAmount()}async getMinStakeAmount(){const t=await this.getMinStakeAmountRaw();return Number(e.ethers.formatEther(t))}async getUserInfoRaw(t){const[e,a]=await this.contract.getUserInfo(t);return{stake:e,harvested:a}}async getUserInfo(t){const{stake:a,harvested:r}=await this.getUserInfoRaw(t);return{stake:Number(e.ethers.formatEther(a)),harvested:Number(e.ethers.formatEther(r))}}async getUserStakeRaw(t){return await this.contract.userStakes(t)}async getUserStake(t){const a=await this.getUserStakeRaw(t);return Number(e.ethers.formatEther(a))}async getUserTotalRewardsHarvestedRaw(t){return await this.contract.userTotalRewardsHarvested(t)}async getUserTotalRewardsHarvested(t){const a=await this.getUserTotalRewardsHarvestedRaw(t);return Number(e.ethers.formatEther(a))}async isPaused(){return await this.contract.paused()}async getOperatorRoleHash(){return await this.contract.OPERATOR_ROLE()}async getSignerRoleHash(){return await this.contract.SIGNER_ROLE()}async getAdminRoleHash(){return await this.contract.DEFAULT_ADMIN_ROLE()}async hasOperatorRole(t){const e=await this.contract.OPERATOR_ROLE();return await this.contract.hasRole(e,t)}async hasSignerRole(t){const e=await this.contract.SIGNER_ROLE();return await this.contract.hasRole(e,t)}async hasAdminRole(t){const e=await this.contract.DEFAULT_ADMIN_ROLE();return await this.contract.hasRole(e,t)}async createRewardSignature(t,a,r,s,n,i){const o=e.ethers.parseEther(r.toString()),c=e.ethers.solidityPackedKeccak256(["address","address","uint256","uint256","uint256"],[t,a,o,s,n]),u=new e.ethers.Wallet(i);return{signature:await u.signMessage(e.ethers.getBytes(c)),messageHash:c.toString()}}getContractAddress(){return this.contractAddress}async getAllEvents(t,e,a){return await this.bootstrap(),(0,s.getAllEvents)(this.contract,(()=>this.getRandomProvider()),(()=>this.getContractWithRandomProvider()),t,e,a)}async streamEvents(t,e,a,r=1e3,n=5e3,i=0){const o=["Staked","Unstaked","RewardHarvested","SignerUpdated","MinStakeUpdated"];return await this.bootstrap(),(0,s.streamEvents)({getProvider:()=>this.getRandomProvider(),getAllEvents:(t,e)=>this.getAllEvents(t,e,o),formatEvent:t=>this.formatEventArgs(t),onEvent:e,saveLatestBlock:a,fromBlock:t,batchSize:r,sleepTime:n,blockGap:i})}};
1
+ "use strict";var t=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.EthStakingSDK=void 0;const e=require("ethers"),a=t(require("./abis/EthStaking.json")),r=t(require("./contracts.json")),s=require("./utils");exports.EthStakingSDK=class{constructor(t,n){this.name="EthStaking",this.isBootstrapped=!1,this.formatEventArgs=t=>{const{eventName:a,args:r}=t;switch(a){case"Staked":case"Unstaked":return{...t,args:{...r,user:r.user.toLowerCase(),amount:Number(e.ethers.formatEther(r.amount)),timestamp:Number(r.timestamp)}};case"RewardHarvested":return{...t,args:{...r,user:r.user.toLowerCase(),amount:Number(e.ethers.formatEther(r.amount)),timestamp:Number(r.timestamp),signatureHash:r.signatureHash}};case"SignerUpdated":return{...t,args:{...r,newSigner:r.newSigner.toLowerCase()}};case"MinStakeUpdated":return{...t,args:{...r,oldAmount:Number(e.ethers.formatEther(r.oldAmount)),newAmount:Number(e.ethers.formatEther(r.newAmount))}};default:return t}};const i=Array.isArray(t)?t:[t];this.providers=i.map((t=>new e.ethers.JsonRpcProvider(t,void 0,{staticNetwork:!0})));const o=(0,s.getRandomProvider)(this.providers);this.contractAddress=(0,s.resolveContractAddress)(i[0],this.name,r.default,n),this.contract=new e.ethers.Contract(this.contractAddress,a.default.abi,o)}getRandomProvider(){return(0,s.getRandomProvider)(this.providers)}getContractWithRandomProvider(){return new e.ethers.Contract(this.contractAddress,a.default.abi,this.getRandomProvider())}async bootstrap(){if(this.isBootstrapped)return;const t=await Promise.all(this.providers.map(((t,e)=>(0,s.checkRpcHealth)(t,e))));if(this.providers=this.providers.filter(((e,a)=>t[a])),0===this.providers.length)throw new Error("No active RPC providers available");this.isBootstrapped=!0}async signAndSendTransaction(t,e,a={}){return(0,s.signAndSendTransaction)(t,e,(()=>this.getRandomProvider()),a,this.contract)}async buildStakeTxRaw(t){return await this.contract.stake.populateTransaction({value:t})}async buildStakeTx(t){return await this.buildStakeTxRaw(e.ethers.parseEther(t.toString()))}async buildUnstakeTxRaw(t){return await this.contract.unstake.populateTransaction(t)}async buildUnstakeTx(t){return await this.buildUnstakeTxRaw(e.ethers.parseEther(t.toString()))}async buildHarvestRewardTxRaw(t,e,a,r){return await this.contract.harvestReward.populateTransaction(t,e,a,r)}async buildHarvestRewardTx(t,a,r,s){return await this.buildHarvestRewardTxRaw(e.ethers.parseEther(t.toString()),BigInt(a),BigInt(r),s)}async buildUnstakeAndHarvestTxRaw(t,e,a,r,s){return await this.contract.unstakeAndHarvest.populateTransaction(t,e,a,r,s)}async buildUnstakeAndHarvestTx(t,a,r,s,n){return await this.buildUnstakeAndHarvestTxRaw(e.ethers.parseEther(t.toString()),e.ethers.parseEther(a.toString()),BigInt(r),BigInt(s),n)}async buildAddRewardsTxRaw(t){return await this.contract.addRewards.populateTransaction({value:t})}async buildAddRewardsTx(t){return await this.buildAddRewardsTxRaw(e.ethers.parseEther(t.toString()))}async buildUpdateMaxRewardAmountTxRaw(t){return await this.contract.updateMaxRewardAmount.populateTransaction(t)}async buildUpdateMaxRewardAmountTx(t){return await this.buildUpdateMaxRewardAmountTxRaw(e.ethers.parseEther(t.toString()))}async buildSetMinStakeAmountTxRaw(t){return await this.contract.setMinStakeAmount.populateTransaction(t)}async buildSetMinStakeAmountTx(t){return await this.buildSetMinStakeAmountTxRaw(e.ethers.parseEther(t.toString()))}async buildAddSignerTx(t){return await this.contract.addSigner.populateTransaction(t)}async buildRemoveSignerTx(t){return await this.contract.removeSigner.populateTransaction(t)}async buildPauseTx(){return await this.contract.pause.populateTransaction()}async buildUnpauseTx(){return await this.contract.unpause.populateTransaction()}async buildEmergencyUnstakeTx(t){return await this.contract.emergencyUnstake.populateTransaction(t)}async getTotalStakedRaw(){return await this.contract.totalStaked()}async getTotalStaked(){const t=await this.getTotalStakedRaw();return Number(e.ethers.formatEther(t))}async getTotalRewardsRaw(){return await this.contract.totalRewards()}async getTotalRewards(){const t=await this.getTotalRewardsRaw();return Number(e.ethers.formatEther(t))}async getMaxRewardAmountRaw(){return await this.contract.maxRewardAmount()}async getMaxRewardAmount(){const t=await this.getMaxRewardAmountRaw();return Number(e.ethers.formatEther(t))}async getMinStakeAmountRaw(){return await this.contract.minStakeAmount()}async getMinStakeAmount(){const t=await this.getMinStakeAmountRaw();return Number(e.ethers.formatEther(t))}async getUserInfoRaw(t){const[e,a]=await this.contract.getUserInfo(t);return{stake:e,harvested:a}}async getUserInfo(t){const{stake:a,harvested:r}=await this.getUserInfoRaw(t);return{stake:Number(e.ethers.formatEther(a)),harvested:Number(e.ethers.formatEther(r))}}async getUserStakeRaw(t){return await this.contract.userStakes(t)}async getUserStake(t){const a=await this.getUserStakeRaw(t);return Number(e.ethers.formatEther(a))}async getUserTotalRewardsHarvestedRaw(t){return await this.contract.userTotalRewardsHarvested(t)}async getUserTotalRewardsHarvested(t){const a=await this.getUserTotalRewardsHarvestedRaw(t);return Number(e.ethers.formatEther(a))}async isPaused(){return await this.contract.paused()}async getOperatorRoleHash(){return await this.contract.OPERATOR_ROLE()}async getSignerRoleHash(){return await this.contract.SIGNER_ROLE()}async getAdminRoleHash(){return await this.contract.DEFAULT_ADMIN_ROLE()}async hasOperatorRole(t){const e=await this.contract.OPERATOR_ROLE();return await this.contract.hasRole(e,t)}async hasSignerRole(t){const e=await this.contract.SIGNER_ROLE();return await this.contract.hasRole(e,t)}async hasAdminRole(t){const e=await this.contract.DEFAULT_ADMIN_ROLE();return await this.contract.hasRole(e,t)}async createRewardSignature(t,a,r,s,n,i){const o=e.ethers.parseEther(r.toString()),c=e.ethers.solidityPackedKeccak256(["address","address","uint256","uint256","uint256"],[t,a,o,s,n]),u=new e.ethers.Wallet(i);return{signature:await u.signMessage(e.ethers.getBytes(c)),messageHash:c.toString()}}getContractAddress(){return this.contractAddress}async getAllEvents(t,e,a){return await this.bootstrap(),(0,s.getAllEvents)(this.contract,(()=>this.getRandomProvider()),(()=>this.getContractWithRandomProvider()),t,e,a)}async streamEvents(t,e,a,r=1e3,n=5e3,i=0,o){const c=["Staked","Unstaked","RewardHarvested","SignerUpdated","MinStakeUpdated"];return await this.bootstrap(),(0,s.streamEvents)({getProvider:()=>this.getRandomProvider(),getAllEvents:(t,e)=>this.getAllEvents(t,e,c),formatEvent:t=>this.formatEventArgs(t),onEvent:e,saveLatestBlock:a,fromBlock:t,batchSize:r,sleepTime:n,blockGap:i,shouldContinue:o})}};