aiia-vault-sdk 1.4.5 → 1.4.7
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.js +1 -1
- package/dist/utils.d.ts +1 -1
- package/dist/utils.js +1 -1
- package/package.json +1 -1
package/dist/Erc20Staking.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.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}getTokenAddressSync(){return this.tokenAddress}async formatTokenAmount(t){const a=await this.getTokenDecimals();return e.ethers.parseUnits(t.toFixed(a),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})}};
|
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=Number(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}getTokenAddressSync(){return this.tokenAddress}async formatTokenAmount(t){const a=await this.getTokenDecimals();return e.ethers.parseUnits(t.toFixed(a),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/utils.d.ts
CHANGED
@@ -78,7 +78,7 @@ export declare const getAllEvents: <TEventRaw extends BaseEventRaw, TContract ex
|
|
78
78
|
export declare const streamEvents: <TRawEvent, TFormattedEvent>({ getProvider, getAllEvents, formatEvent, onEvent, saveLatestBlock, fromBlock, batchSize, sleepTime, whitelistEvents, shouldContinue, blockGap, }: {
|
79
79
|
getProvider: () => ethers.Provider;
|
80
80
|
getAllEvents: (fromBlock: number, toBlock: number, whitelistEvents?: string[]) => Promise<TRawEvent[]>;
|
81
|
-
formatEvent: (event: TRawEvent) => TFormattedEvent;
|
81
|
+
formatEvent: (event: TRawEvent) => Promise<TFormattedEvent> | TFormattedEvent;
|
82
82
|
onEvent: (event: TFormattedEvent) => Promise<void>;
|
83
83
|
saveLatestBlock: (blockNumber: number) => Promise<void>;
|
84
84
|
fromBlock: number;
|
package/dist/utils.js
CHANGED
@@ -1 +1 @@
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.getNetworkFromRpc=exports.signAndSendTransaction=exports.streamEvents=exports.getAllEvents=exports.resolveContractAddress=exports.getRewardWeight=exports.buildApproveERC20Tx=exports.getTokenAllowance=exports.getTokenSymbol=exports.getTokenDecimals=exports.getTransactionStatus=exports.checkRpcHealth=exports.getRandomProvider=exports.processBatches=exports.chunks=exports.sleep=exports.LOG_PREFIXES=void 0;const e=require("ethers");exports.LOG_PREFIXES={INFO:"[36m[STREAM-INFO][0m",BLOCK:"[33m[STREAM-BLOCK][0m",EVENT:"[32m[STREAM-EVENT][0m",ERROR:"[31m[STREAM-ERROR][0m",SAVE:"[35m[STREAM-SAVE][0m",DEBUG:"[34m[STREAM-DEBUG][0m"};exports.sleep=async e=>new Promise((t=>setTimeout(t,e)));exports.chunks=(e,t)=>{const o=[];for(let s=0;s<e.length;s+=t)o.push(e.slice(s,s+t));return o};exports.processBatches=async(e,t,o=3,s=500)=>{let r=[];const n=(0,exports.chunks)(e,o);for(let e=0;e<n.length;e++){const o=await t(n[e]);r=[...r,...o],e<n.length-1&&await(0,exports.sleep)(s)}return r};exports.getRandomProvider=e=>e[Math.floor(Math.random()*e.length)];exports.checkRpcHealth=async(e,t=0)=>{try{const t=new Promise(((e,t)=>{setTimeout((()=>t(new Error("RPC request timeout"))),5e3)}));return await Promise.race([e.getBlockNumber(),t]),!0}catch(e){return console.error(`${exports.LOG_PREFIXES.ERROR} RPC health check failed:`,e,t),!1}};exports.getTransactionStatus=async(e,t,o=10)=>{let s=0,r=1e3;for(;s<o;)try{const n=await e.getTransactionReceipt(t);if(!n){if(s++,s===o)return{hash:t,status:null,confirmations:0,isCompleted:!1,attempts:s};await(0,exports.sleep)(r),r*=2;continue}const a=Number(await n.confirmations()||0);return{hash:n.hash,status:1===n.status,confirmations:a,isCompleted:!0,attempts:s+1}}catch(e){throw new Error(`Failed to get transaction status: ${e.message}`)}throw new Error("Failed to get transaction status after maximum retries")};exports.getTokenDecimals=async(t,o)=>{const s=new e.ethers.Contract(t,["function decimals() view returns (uint8)"],o);return Number(await s.decimals())};exports.getTokenSymbol=async(t,o)=>{const s=new e.ethers.Contract(t,["function symbol() view returns (string)"],o);return await s.symbol()};exports.getTokenAllowance=async(t,o,s,r)=>{if(t===e.ethers.ZeroAddress||t.toLowerCase()===e.ethers.ZeroAddress)return BigInt("0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");const n=new e.ethers.Contract(t,["function allowance(address owner, address spender) view returns (uint256)"],r);return await n.allowance(o,s)};exports.buildApproveERC20Tx=async(t,o,s,r)=>{const n=new e.ethers.Contract(t,["function approve(address spender, uint256 amount) returns (bool)"],r);return await n.approve.populateTransaction(o,s)};exports.getRewardWeight=(e,t)=>{let o=0;const s=[...t].sort(((e,t)=>e.duration-t.duration));for(const t of s)e>=t.duration&&(o=t.weight);return o};exports.resolveContractAddress=(e,t,o,s)=>{if(s)return s;const r=(0,exports.getNetworkFromRpc)(e);return o?.[r]?.[t]};exports.getAllEvents=async(e,t,o,s,r,n)=>{let a=[];e.interface.forEachEvent((e=>{a.push(e.name)})),n&&n.length>0&&(a=a.filter((e=>n.includes(e))));const i=await(0,exports.processBatches)(a,(async t=>{const n=t.map((async t=>{const n=o(),a=n.filters[t]();return(await n.queryFilter(a,s,r)).map((o=>{const s=e.interface.parseLog({topics:o.topics,data:o.data});return{eventName:t,blockNumber:o.blockNumber,transactionHash:o.transactionHash,args:s?.args.toObject(),timestamp:null,sender:null}}))}));return(await Promise.all(n)).flat()}));i.sort(((e,t)=>e.blockNumber-t.blockNumber));const c=[...new Set(i.map((e=>e.blockNumber)))],l=new Map;await(0,exports.processBatches)(c,(async e=>{const o=e.map((e=>t().getBlock(e)));return(await Promise.all(o)).forEach((e=>{e&&l.set(e.number,e.timestamp)})),[]}));const p=[...new Set(i.map((e=>e.transactionHash)))],m=new Map;return await(0,exports.processBatches)(p,(async e=>{const o=e.map((async e=>{const o=t(),s=await o.getTransaction(e);return{hash:e,from:s?.from||null}}));return(await Promise.all(o)).forEach((e=>{e&&m.set(e.hash,e.from)})),[]})),i.map((e=>({eventName:e.eventName,blockNumber:e.blockNumber,transactionHash:e.transactionHash,args:Object.fromEntries(Object.entries(e.args||{}).filter((([e])=>isNaN(Number(e))))),timestamp:l.get(e.blockNumber)??null,sender:m.get(e.transactionHash)??null})))};exports.streamEvents=async({getProvider:e,getAllEvents:t,formatEvent:o,onEvent:s,saveLatestBlock:r,fromBlock:n,batchSize:a=1e3,sleepTime:i=5e3,whitelistEvents:c,shouldContinue:l,blockGap:p=0})=>{const m="1"===process.env.DEBUG_STREAM_EVENTS;let f=n,u=0,E=Date.now();const g=()=>{u++;const e=Date.now();e-E>=1e4&&(console.log(`${exports.LOG_PREFIXES.INFO} RPC Requests in last 10s: ${u}`),u=0,E=e)},h=()=>{const t=e();if(!t.__requestTracking){if("send"in t){const e=t.send.bind(t);t.send=async(t,o)=>(g(),e(t,o))}else if("_send"in t){const e=t._send.bind(t);t._send=async(t,o)=>(g(),e(t,o))}else{const e=t.getBlockNumber.bind(t);t.getBlockNumber=async()=>(g(),e());const o=t.getBlock.bind(t);t.getBlock=async e=>(g(),o(e));const s=t.getTransactionReceipt.bind(t);t.getTransactionReceipt=async e=>(g(),s(e))}t.__requestTracking=!0}return t},b=async(e,o,s)=>(g(),await t(e,o,s));for(m&&(console.log(`${exports.LOG_PREFIXES.INFO} StreamEvents Debug Mode Enabled`),console.log(`${exports.LOG_PREFIXES.INFO} Initial fromBlock: ${f}`),console.log(`${exports.LOG_PREFIXES.INFO} Batch size: ${a}`),console.log(`${exports.LOG_PREFIXES.INFO} Sleep time: ${i}ms`),console.log(`${exports.LOG_PREFIXES.INFO} Block gap: ${p}`),console.log(`${exports.LOG_PREFIXES.INFO} RPC request tracking enabled (10s intervals)`),c&&c.length>0&&console.log(`${exports.LOG_PREFIXES.INFO} Whitelist events: ${c.join(", ")}`),l&&console.log(`${exports.LOG_PREFIXES.INFO} Stream will check continuation condition`));;)try{if(l){if(!await Promise.resolve(l()))return void(m&&console.log(`${exports.LOG_PREFIXES.INFO} Stream stopped by shouldContinue function`))}const e=await h().getBlockNumber();m&&console.log(`${exports.LOG_PREFIXES.BLOCK} Latest block: ${e}`);const t=Math.max(e-p,0),n=Math.min(f+a,t);if(m&&console.log(`${exports.LOG_PREFIXES.BLOCK} Processing blocks from ${f} to ${n} (safe latest block: ${t})`),f>=t){m&&console.log(`${exports.LOG_PREFIXES.DEBUG} Caught up to latest block, waiting ${i}ms...`),await(0,exports.sleep)(i);continue}const u=await b(f,n,c);if(m&&u.length>0){const e=u.reduce(((e,t)=>{const o=t.eventName||"Unknown";return e[o]=(e[o]||0)+1,e}),{});console.log(`${exports.LOG_PREFIXES.EVENT} Found ${u.length} events:`),Object.entries(e).forEach((([e,t])=>{console.log(`${exports.LOG_PREFIXES.EVENT} - ${e}: ${t}`)}))}for(const e of u)m&&console.log(`${exports.LOG_PREFIXES.EVENT} Processing: ${e.eventName||"Event"}`),await s(o(e));await r(n),m&&console.log(`${exports.LOG_PREFIXES.SAVE} Saved latest block: ${n}`),f=n+1}catch(e){m?(console.error(`${exports.LOG_PREFIXES.ERROR} Error in streamEvents:`,e),console.error(`${exports.LOG_PREFIXES.ERROR} Stack trace:`,e instanceof Error?e.stack:"")):console.error(`${exports.LOG_PREFIXES.ERROR} Error in streamEvents:`,e),await(0,exports.sleep)(1e3)}};exports.signAndSendTransaction=async(e,t,o,{onSubmit:s,onFinally:r,onError:n}={},a)=>{try{const n={...e};let a;if("object"==typeof t&&null!==t&&"sendTransaction"in t){const e=t.connect(o());a=(await e.sendTransaction(n)).hash}else a=await t(n);s&&await s(a);const i=await(0,exports.getTransactionStatus)(o(),a);if(null===i.status)throw new Error("Transaction may not be minted on-chain yet or has failed. Please check the blockchain explorer.");if(!1===i.status)throw new Error("Transaction failed. Please check the blockchain explorer for details.");return r&&await r({...i,txHash:a}),{transaction:{hash:a},status:i}}catch(e){if(a&&e)try{if("CALL_EXCEPTION"===e.code&&e.data){const t=e.data;for(const o of Object.values(a.interface.fragments).filter((e=>"error"===e.type)))if("name"in o){const s=a.interface.getError(o.name);if(s&&s.selector){if(s.selector===t){const t=o.name,s=e.errorArgs||[],r=new Error(`Transaction failed with custom error: ${t}(${s.join(", ")})`);throw Object.assign(r,e),n&&await n(r),r}}}console.log(`${exports.LOG_PREFIXES.DEBUG} Unknown custom error with selector: ${t}`)}}catch(e){console.error(`${exports.LOG_PREFIXES.ERROR} Error decoding transaction error:`,e)}throw n&&await n(e instanceof Error?e:new Error(String(e))),e}};exports.getNetworkFromRpc=e=>{const t=e.toLowerCase();let o=t;try{if(t.includes("://")){o=new URL(t).hostname}else t.includes("@")&&(o=t.split("@")[1].split("/")[0])}catch(e){console.warn(`${exports.LOG_PREFIXES.ERROR} Failed to parse RPC URL: ${t}`)}const s=[[/sepolia\.base|base-sepolia/,"base-sepolia"],[/goerli\.base|base-goerli/,"base-goerli"],[/base-mainnet/,"base"],[/polygon-mumbai|mumbai\.polygon/,"polygon-mumbai"],[/polygon-amoy|amoy\.polygon/,"polygon-amoy"],[/polygon-zkevm|zkevm|zkevm[-.]polygon/,"polygon-zkevm"],[/arbitrum.*sepolia|sepolia.*arbitrum/,"arbitrum-sepolia"],[/arbitrum.*goerli|goerli.*arbitrum/,"arbitrum-goerli"],[/arbitrum-nova|nova[-.]arbitrum/,"arbitrum-nova"],[/optimism-sepolia|sepolia[-.]optimism/,"optimism-sepolia"],[/optimism-goerli|goerli[-.]optimism/,"optimism-goerli"],[/avalanche-fuji|fuji[-.]avalanche|avax-test/,"avalanche-fuji"],[/bsc-testnet|testnet[-.]bsc|data-seed-prebsc/,"bsc-testnet"],[/base(?![-.]sepolia|[-.]goerli)/,"base"],[/polygon(?![-.]mumbai|[-.]amoy)/,"polygon"],[/arbitrum(?![-.]nova)/,"arbitrum"],[/optimism(?![-.]sepolia|[-.]goerli)/,"optimism"],[/avalanche|avax(?![-.]test|[-.]fuji)/,"avalanche"],[/bsc|binance(?![-.]testnet)/,"bsc"],[/eth-sepolia|sepolia(?![-.]base|[-.]arbitrum|[-.]optimism)/,"sepolia"],[/eth-goerli|goerli(?![-.]base|[-.]arbitrum|[-.]optimism)/,"goerli"],[/eth-mainnet|ethereum|eth\.rpc/,"ethereum"],[/mainnet/,"ethereum"]];for(const[e,o]of s)if(e.test(t))return o;for(const[e,t]of s)if(e.test(o))return t;throw new Error("Failed to get network from RPC URL")};
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.getNetworkFromRpc=exports.signAndSendTransaction=exports.streamEvents=exports.getAllEvents=exports.resolveContractAddress=exports.getRewardWeight=exports.buildApproveERC20Tx=exports.getTokenAllowance=exports.getTokenSymbol=exports.getTokenDecimals=exports.getTransactionStatus=exports.checkRpcHealth=exports.getRandomProvider=exports.processBatches=exports.chunks=exports.sleep=exports.LOG_PREFIXES=void 0;const e=require("ethers");exports.LOG_PREFIXES={INFO:"[36m[STREAM-INFO][0m",BLOCK:"[33m[STREAM-BLOCK][0m",EVENT:"[32m[STREAM-EVENT][0m",ERROR:"[31m[STREAM-ERROR][0m",SAVE:"[35m[STREAM-SAVE][0m",DEBUG:"[34m[STREAM-DEBUG][0m"};exports.sleep=async e=>new Promise((t=>setTimeout(t,e)));exports.chunks=(e,t)=>{const o=[];for(let s=0;s<e.length;s+=t)o.push(e.slice(s,s+t));return o};exports.processBatches=async(e,t,o=3,s=500)=>{let r=[];const n=(0,exports.chunks)(e,o);for(let e=0;e<n.length;e++){const o=await t(n[e]);r=[...r,...o],e<n.length-1&&await(0,exports.sleep)(s)}return r};exports.getRandomProvider=e=>e[Math.floor(Math.random()*e.length)];exports.checkRpcHealth=async(e,t=0)=>{try{const t=new Promise(((e,t)=>{setTimeout((()=>t(new Error("RPC request timeout"))),5e3)}));return await Promise.race([e.getBlockNumber(),t]),!0}catch(e){return console.error(`${exports.LOG_PREFIXES.ERROR} RPC health check failed:`,e,t),!1}};exports.getTransactionStatus=async(e,t,o=10)=>{let s=0,r=1e3;for(;s<o;)try{const n=await e.getTransactionReceipt(t);if(!n){if(s++,s===o)return{hash:t,status:null,confirmations:0,isCompleted:!1,attempts:s};await(0,exports.sleep)(r),r*=2;continue}const a=Number(await n.confirmations()||0);return{hash:n.hash,status:1===n.status,confirmations:a,isCompleted:!0,attempts:s+1}}catch(e){throw new Error(`Failed to get transaction status: ${e.message}`)}throw new Error("Failed to get transaction status after maximum retries")};exports.getTokenDecimals=async(t,o)=>{const s=new e.ethers.Contract(t,["function decimals() view returns (uint8)"],o);return Number(await s.decimals())};exports.getTokenSymbol=async(t,o)=>{const s=new e.ethers.Contract(t,["function symbol() view returns (string)"],o);return await s.symbol()};exports.getTokenAllowance=async(t,o,s,r)=>{if(t===e.ethers.ZeroAddress||t.toLowerCase()===e.ethers.ZeroAddress)return BigInt("0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");const n=new e.ethers.Contract(t,["function allowance(address owner, address spender) view returns (uint256)"],r);return await n.allowance(o,s)};exports.buildApproveERC20Tx=async(t,o,s,r)=>{const n=new e.ethers.Contract(t,["function approve(address spender, uint256 amount) returns (bool)"],r);return await n.approve.populateTransaction(o,s)};exports.getRewardWeight=(e,t)=>{let o=0;const s=[...t].sort(((e,t)=>e.duration-t.duration));for(const t of s)e>=t.duration&&(o=t.weight);return o};exports.resolveContractAddress=(e,t,o,s)=>{if(s)return s;const r=(0,exports.getNetworkFromRpc)(e);return o?.[r]?.[t]};exports.getAllEvents=async(e,t,o,s,r,n)=>{let a=[];e.interface.forEachEvent((e=>{a.push(e.name)})),n&&n.length>0&&(a=a.filter((e=>n.includes(e))));const i=await(0,exports.processBatches)(a,(async t=>{const n=t.map((async t=>{const n=o(),a=n.filters[t]();return(await n.queryFilter(a,s,r)).map((o=>{const s=e.interface.parseLog({topics:o.topics,data:o.data});return{eventName:t,blockNumber:o.blockNumber,transactionHash:o.transactionHash,args:s?.args.toObject(),timestamp:null,sender:null}}))}));return(await Promise.all(n)).flat()}));i.sort(((e,t)=>e.blockNumber-t.blockNumber));const c=[...new Set(i.map((e=>e.blockNumber)))],l=new Map;await(0,exports.processBatches)(c,(async e=>{const o=e.map((e=>t().getBlock(e)));return(await Promise.all(o)).forEach((e=>{e&&l.set(e.number,e.timestamp)})),[]}));const p=[...new Set(i.map((e=>e.transactionHash)))],m=new Map;return await(0,exports.processBatches)(p,(async e=>{const o=e.map((async e=>{const o=t(),s=await o.getTransaction(e);return{hash:e,from:s?.from||null}}));return(await Promise.all(o)).forEach((e=>{e&&m.set(e.hash,e.from)})),[]})),i.map((e=>({eventName:e.eventName,blockNumber:e.blockNumber,transactionHash:e.transactionHash,args:Object.fromEntries(Object.entries(e.args||{}).filter((([e])=>isNaN(Number(e))))),timestamp:l.get(e.blockNumber)??null,sender:m.get(e.transactionHash)??null})))};exports.streamEvents=async({getProvider:e,getAllEvents:t,formatEvent:o,onEvent:s,saveLatestBlock:r,fromBlock:n,batchSize:a=1e3,sleepTime:i=5e3,whitelistEvents:c,shouldContinue:l,blockGap:p=0})=>{const m="1"===process.env.DEBUG_STREAM_EVENTS;let f=n,u=0,E=Date.now();const g=()=>{u++;const e=Date.now();e-E>=1e4&&(console.log(`${exports.LOG_PREFIXES.INFO} RPC Requests in last 10s: ${u}`),u=0,E=e)},h=()=>{const t=e();if(!t.__requestTracking){if("send"in t){const e=t.send.bind(t);t.send=async(t,o)=>(g(),e(t,o))}else if("_send"in t){const e=t._send.bind(t);t._send=async(t,o)=>(g(),e(t,o))}else{const e=t.getBlockNumber.bind(t);t.getBlockNumber=async()=>(g(),e());const o=t.getBlock.bind(t);t.getBlock=async e=>(g(),o(e));const s=t.getTransactionReceipt.bind(t);t.getTransactionReceipt=async e=>(g(),s(e))}t.__requestTracking=!0}return t},b=async(e,o,s)=>(g(),await t(e,o,s));for(m&&(console.log(`${exports.LOG_PREFIXES.INFO} StreamEvents Debug Mode Enabled`),console.log(`${exports.LOG_PREFIXES.INFO} Initial fromBlock: ${f}`),console.log(`${exports.LOG_PREFIXES.INFO} Batch size: ${a}`),console.log(`${exports.LOG_PREFIXES.INFO} Sleep time: ${i}ms`),console.log(`${exports.LOG_PREFIXES.INFO} Block gap: ${p}`),console.log(`${exports.LOG_PREFIXES.INFO} RPC request tracking enabled (10s intervals)`),c&&c.length>0&&console.log(`${exports.LOG_PREFIXES.INFO} Whitelist events: ${c.join(", ")}`),l&&console.log(`${exports.LOG_PREFIXES.INFO} Stream will check continuation condition`));;)try{if(l){if(!await Promise.resolve(l()))return void(m&&console.log(`${exports.LOG_PREFIXES.INFO} Stream stopped by shouldContinue function`))}const e=await h().getBlockNumber();m&&console.log(`${exports.LOG_PREFIXES.BLOCK} Latest block: ${e}`);const t=Math.max(e-p,0),n=Math.min(f+a,t);if(m&&console.log(`${exports.LOG_PREFIXES.BLOCK} Processing blocks from ${f} to ${n} (safe latest block: ${t})`),f>=t){m&&console.log(`${exports.LOG_PREFIXES.DEBUG} Caught up to latest block, waiting ${i}ms...`),await(0,exports.sleep)(i);continue}const u=await b(f,n,c);if(m&&u.length>0){const e=u.reduce(((e,t)=>{const o=t.eventName||"Unknown";return e[o]=(e[o]||0)+1,e}),{});console.log(`${exports.LOG_PREFIXES.EVENT} Found ${u.length} events:`),Object.entries(e).forEach((([e,t])=>{console.log(`${exports.LOG_PREFIXES.EVENT} - ${e}: ${t}`)}))}for(const e of u)m&&console.log(`${exports.LOG_PREFIXES.EVENT} Processing: ${e.eventName||"Event"}`),await s(await o(e));await r(n),m&&console.log(`${exports.LOG_PREFIXES.SAVE} Saved latest block: ${n}`),f=n+1}catch(e){m?(console.error(`${exports.LOG_PREFIXES.ERROR} Error in streamEvents:`,e),console.error(`${exports.LOG_PREFIXES.ERROR} Stack trace:`,e instanceof Error?e.stack:"")):console.error(`${exports.LOG_PREFIXES.ERROR} Error in streamEvents:`,e),await(0,exports.sleep)(1e3)}};exports.signAndSendTransaction=async(e,t,o,{onSubmit:s,onFinally:r,onError:n}={},a)=>{try{const n={...e};let a;if("object"==typeof t&&null!==t&&"sendTransaction"in t){const e=t.connect(o());a=(await e.sendTransaction(n)).hash}else a=await t(n);s&&await s(a);const i=await(0,exports.getTransactionStatus)(o(),a);if(null===i.status)throw new Error("Transaction may not be minted on-chain yet or has failed. Please check the blockchain explorer.");if(!1===i.status)throw new Error("Transaction failed. Please check the blockchain explorer for details.");return r&&await r({...i,txHash:a}),{transaction:{hash:a},status:i}}catch(e){if(a&&e)try{if("CALL_EXCEPTION"===e.code&&e.data){const t=e.data;for(const o of Object.values(a.interface.fragments).filter((e=>"error"===e.type)))if("name"in o){const s=a.interface.getError(o.name);if(s&&s.selector){if(s.selector===t){const t=o.name,s=e.errorArgs||[],r=new Error(`Transaction failed with custom error: ${t}(${s.join(", ")})`);throw Object.assign(r,e),n&&await n(r),r}}}console.log(`${exports.LOG_PREFIXES.DEBUG} Unknown custom error with selector: ${t}`)}}catch(e){console.error(`${exports.LOG_PREFIXES.ERROR} Error decoding transaction error:`,e)}throw n&&await n(e instanceof Error?e:new Error(String(e))),e}};exports.getNetworkFromRpc=e=>{const t=e.toLowerCase();let o=t;try{if(t.includes("://")){o=new URL(t).hostname}else t.includes("@")&&(o=t.split("@")[1].split("/")[0])}catch(e){console.warn(`${exports.LOG_PREFIXES.ERROR} Failed to parse RPC URL: ${t}`)}const s=[[/sepolia\.base|base-sepolia/,"base-sepolia"],[/goerli\.base|base-goerli/,"base-goerli"],[/base-mainnet/,"base"],[/polygon-mumbai|mumbai\.polygon/,"polygon-mumbai"],[/polygon-amoy|amoy\.polygon/,"polygon-amoy"],[/polygon-zkevm|zkevm|zkevm[-.]polygon/,"polygon-zkevm"],[/arbitrum.*sepolia|sepolia.*arbitrum/,"arbitrum-sepolia"],[/arbitrum.*goerli|goerli.*arbitrum/,"arbitrum-goerli"],[/arbitrum-nova|nova[-.]arbitrum/,"arbitrum-nova"],[/optimism-sepolia|sepolia[-.]optimism/,"optimism-sepolia"],[/optimism-goerli|goerli[-.]optimism/,"optimism-goerli"],[/avalanche-fuji|fuji[-.]avalanche|avax-test/,"avalanche-fuji"],[/bsc-testnet|testnet[-.]bsc|data-seed-prebsc/,"bsc-testnet"],[/base(?![-.]sepolia|[-.]goerli)/,"base"],[/polygon(?![-.]mumbai|[-.]amoy)/,"polygon"],[/arbitrum(?![-.]nova)/,"arbitrum"],[/optimism(?![-.]sepolia|[-.]goerli)/,"optimism"],[/avalanche|avax(?![-.]test|[-.]fuji)/,"avalanche"],[/bsc|binance(?![-.]testnet)/,"bsc"],[/eth-sepolia|sepolia(?![-.]base|[-.]arbitrum|[-.]optimism)/,"sepolia"],[/eth-goerli|goerli(?![-.]base|[-.]arbitrum|[-.]optimism)/,"goerli"],[/eth-mainnet|ethereum|eth\.rpc/,"ethereum"],[/mainnet/,"ethereum"]];for(const[e,o]of s)if(e.test(t))return o;for(const[e,t]of s)if(e.test(o))return t;throw new Error("Failed to get network from RPC URL")};
|