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.
- package/dist/Erc20Staking.d.ts +367 -0
- package/dist/Erc20Staking.js +1 -0
- package/dist/EthStaking.d.ts +1 -1
- package/dist/EthStaking.js +1 -1
- package/dist/abis/Erc20Staking.json +1013 -0
- package/dist/contracts/Erc20Staking.d.ts +534 -0
- package/dist/contracts/Erc20Staking.js +1 -0
- package/dist/contracts.json +5 -2
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -1
- package/dist/types.d.ts +80 -0
- package/package.json +1 -1
@@ -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})}};
|
package/dist/EthStaking.d.ts
CHANGED
@@ -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
|
}
|
package/dist/EthStaking.js
CHANGED
@@ -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
|
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})}};
|