aiia-vault-sdk 1.1.8 → 1.1.10

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.
@@ -11,21 +11,20 @@ export declare namespace TradingVault {
11
11
  };
12
12
  }
13
13
  export interface TradingVaultInterface extends Interface {
14
- getFunction(nameOrSignature: "BASE_WEIGHT" | "DEFAULT_ADMIN_ROLE" | "EXPO" | "EXPO_100" | "OPERATOR_ROLE" | "PRICE_SETTER_ROLE" | "addReward" | "approve" | "balanceOf" | "borrowCurrency" | "claimERC20" | "createPosition" | "createPositionForUser" | "currency" | "getApproved" | "getRewardConfigsLength" | "getRoleAdmin" | "grantOperatorRole" | "grantPriceSetterRole" | "grantRole" | "hasRole" | "initialize" | "isApprovedForAll" | "isReduceEnabled" | "name" | "owner" | "ownerOf" | "positions" | "price" | "reducePosition" | "reducePositions" | "renounceOwnership" | "renounceRole" | "repayCurrency" | "revokeRole" | "rewardConfigs" | "rewardToken" | "safeTransferFrom(address,address,uint256)" | "safeTransferFrom(address,address,uint256,bytes)" | "setApprovalForAll" | "setCurrency" | "setPrice" | "setReduceEnabled" | "setRewardToken" | "setTreasury" | "supportsInterface" | "symbol" | "tokenURI" | "totalAmount" | "totalBorrowed" | "totalRewardsAdded" | "totalRewardsHarvested" | "transferFrom" | "transferOwnership" | "treasury" | "updateRewardConfigs"): FunctionFragment;
14
+ getFunction(nameOrSignature: "BASE_WEIGHT" | "DEFAULT_ADMIN_ROLE" | "EXPO" | "OPERATOR_ROLE" | "PERCENTAGE_BASE" | "PRICE_SETTER_ROLE" | "addReward" | "approve" | "balanceOf" | "borrowCurrency" | "claimERC20" | "createPosition" | "currency" | "getApproved" | "getRewardConfigsLength" | "getRoleAdmin" | "grantOperatorRole" | "grantPriceSetterRole" | "grantRole" | "hasRole" | "initialize" | "isApprovedForAll" | "isReduceEnabled" | "name" | "owner" | "ownerOf" | "positions" | "price" | "reducePosition" | "reducePositions" | "renounceOwnership" | "renounceRole" | "repayCurrency" | "revokeRole" | "rewardConfigs" | "rewardToken" | "safeTransferFrom(address,address,uint256)" | "safeTransferFrom(address,address,uint256,bytes)" | "setApprovalForAll" | "setCurrency" | "setPrice" | "setReduceEnabled" | "setRewardToken" | "setTreasury" | "supportsInterface" | "symbol" | "tokenURI" | "totalAmount" | "totalBorrowed" | "totalRewardsAdded" | "totalRewardsHarvested" | "transferFrom" | "transferOwnership" | "treasury" | "updateRewardConfigs"): FunctionFragment;
15
15
  getEvent(nameOrSignatureOrTopic: "Approval" | "ApprovalForAll" | "CurrencyBorrowed" | "CurrencyRepaid" | "CurrencyUpdated" | "Initialized" | "OwnershipTransferred" | "PositionCreated" | "PositionReduced" | "PriceUpdated" | "ReduceEnabledUpdated" | "RewardConfigsUpdated" | "RewardTokenUpdated" | "RoleAdminChanged" | "RoleGranted" | "RoleRevoked" | "TotalAmountUpdated" | "TotalRewardsHarvestedUpdated" | "TotalRewardsUpdated" | "Transfer" | "TreasuryUpdated"): EventFragment;
16
16
  encodeFunctionData(functionFragment: "BASE_WEIGHT", values?: undefined): string;
17
17
  encodeFunctionData(functionFragment: "DEFAULT_ADMIN_ROLE", values?: undefined): string;
18
18
  encodeFunctionData(functionFragment: "EXPO", values?: undefined): string;
19
- encodeFunctionData(functionFragment: "EXPO_100", values?: undefined): string;
20
19
  encodeFunctionData(functionFragment: "OPERATOR_ROLE", values?: undefined): string;
20
+ encodeFunctionData(functionFragment: "PERCENTAGE_BASE", values?: undefined): string;
21
21
  encodeFunctionData(functionFragment: "PRICE_SETTER_ROLE", values?: undefined): string;
22
22
  encodeFunctionData(functionFragment: "addReward", values: [BigNumberish]): string;
23
23
  encodeFunctionData(functionFragment: "approve", values: [AddressLike, BigNumberish]): string;
24
24
  encodeFunctionData(functionFragment: "balanceOf", values: [AddressLike]): string;
25
25
  encodeFunctionData(functionFragment: "borrowCurrency", values: [BigNumberish]): string;
26
26
  encodeFunctionData(functionFragment: "claimERC20", values: [AddressLike, BigNumberish]): string;
27
- encodeFunctionData(functionFragment: "createPosition", values: [BigNumberish]): string;
28
- encodeFunctionData(functionFragment: "createPositionForUser", values: [AddressLike, BigNumberish]): string;
27
+ encodeFunctionData(functionFragment: "createPosition", values: [BigNumberish, AddressLike]): string;
29
28
  encodeFunctionData(functionFragment: "currency", values?: undefined): string;
30
29
  encodeFunctionData(functionFragment: "getApproved", values: [BigNumberish]): string;
31
30
  encodeFunctionData(functionFragment: "getRewardConfigsLength", values?: undefined): string;
@@ -34,7 +33,7 @@ export interface TradingVaultInterface extends Interface {
34
33
  encodeFunctionData(functionFragment: "grantPriceSetterRole", values: [AddressLike]): string;
35
34
  encodeFunctionData(functionFragment: "grantRole", values: [BytesLike, AddressLike]): string;
36
35
  encodeFunctionData(functionFragment: "hasRole", values: [BytesLike, AddressLike]): string;
37
- encodeFunctionData(functionFragment: "initialize", values: [AddressLike, AddressLike]): string;
36
+ encodeFunctionData(functionFragment: "initialize", values: [AddressLike, AddressLike, AddressLike, AddressLike]): string;
38
37
  encodeFunctionData(functionFragment: "isApprovedForAll", values: [AddressLike, AddressLike]): string;
39
38
  encodeFunctionData(functionFragment: "isReduceEnabled", values?: undefined): string;
40
39
  encodeFunctionData(functionFragment: "name", values?: undefined): string;
@@ -72,8 +71,8 @@ export interface TradingVaultInterface extends Interface {
72
71
  decodeFunctionResult(functionFragment: "BASE_WEIGHT", data: BytesLike): Result;
73
72
  decodeFunctionResult(functionFragment: "DEFAULT_ADMIN_ROLE", data: BytesLike): Result;
74
73
  decodeFunctionResult(functionFragment: "EXPO", data: BytesLike): Result;
75
- decodeFunctionResult(functionFragment: "EXPO_100", data: BytesLike): Result;
76
74
  decodeFunctionResult(functionFragment: "OPERATOR_ROLE", data: BytesLike): Result;
75
+ decodeFunctionResult(functionFragment: "PERCENTAGE_BASE", data: BytesLike): Result;
77
76
  decodeFunctionResult(functionFragment: "PRICE_SETTER_ROLE", data: BytesLike): Result;
78
77
  decodeFunctionResult(functionFragment: "addReward", data: BytesLike): Result;
79
78
  decodeFunctionResult(functionFragment: "approve", data: BytesLike): Result;
@@ -81,7 +80,6 @@ export interface TradingVaultInterface extends Interface {
81
80
  decodeFunctionResult(functionFragment: "borrowCurrency", data: BytesLike): Result;
82
81
  decodeFunctionResult(functionFragment: "claimERC20", data: BytesLike): Result;
83
82
  decodeFunctionResult(functionFragment: "createPosition", data: BytesLike): Result;
84
- decodeFunctionResult(functionFragment: "createPositionForUser", data: BytesLike): Result;
85
83
  decodeFunctionResult(functionFragment: "currency", data: BytesLike): Result;
86
84
  decodeFunctionResult(functionFragment: "getApproved", data: BytesLike): Result;
87
85
  decodeFunctionResult(functionFragment: "getRewardConfigsLength", data: BytesLike): Result;
@@ -229,14 +227,16 @@ export declare namespace PositionCreatedEvent {
229
227
  tokenId: BigNumberish,
230
228
  entryPrice: BigNumberish,
231
229
  amount: BigNumberish,
232
- openedAt: BigNumberish
230
+ openedAt: BigNumberish,
231
+ currency: AddressLike
233
232
  ];
234
233
  type OutputTuple = [
235
234
  user: string,
236
235
  tokenId: bigint,
237
236
  entryPrice: bigint,
238
237
  amount: bigint,
239
- openedAt: bigint
238
+ openedAt: bigint,
239
+ currency: string
240
240
  ];
241
241
  interface OutputObject {
242
242
  user: string;
@@ -244,6 +244,7 @@ export declare namespace PositionCreatedEvent {
244
244
  entryPrice: bigint;
245
245
  amount: bigint;
246
246
  openedAt: bigint;
247
+ currency: string;
247
248
  }
248
249
  type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
249
250
  type Filter = TypedDeferredTopicFilter<Event>;
@@ -263,7 +264,8 @@ export declare namespace PositionReducedEvent {
263
264
  lossAmount: BigNumberish,
264
265
  price: BigNumberish,
265
266
  rewardedAmount: BigNumberish,
266
- loss: BigNumberish
267
+ loss: BigNumberish,
268
+ currency: AddressLike
267
269
  ];
268
270
  type OutputTuple = [
269
271
  user: string,
@@ -277,7 +279,8 @@ export declare namespace PositionReducedEvent {
277
279
  lossAmount: bigint,
278
280
  price: bigint,
279
281
  rewardedAmount: bigint,
280
- loss: bigint
282
+ loss: bigint,
283
+ currency: string
281
284
  ];
282
285
  interface OutputObject {
283
286
  user: string;
@@ -292,6 +295,7 @@ export declare namespace PositionReducedEvent {
292
295
  price: bigint;
293
296
  rewardedAmount: bigint;
294
297
  loss: bigint;
298
+ currency: string;
295
299
  }
296
300
  type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
297
301
  type Filter = TypedDeferredTopicFilter<Event>;
@@ -490,8 +494,8 @@ export interface TradingVault extends BaseContract {
490
494
  BASE_WEIGHT: TypedContractMethod<[], [bigint], "view">;
491
495
  DEFAULT_ADMIN_ROLE: TypedContractMethod<[], [string], "view">;
492
496
  EXPO: TypedContractMethod<[], [bigint], "view">;
493
- EXPO_100: TypedContractMethod<[], [bigint], "view">;
494
497
  OPERATOR_ROLE: TypedContractMethod<[], [string], "view">;
498
+ PERCENTAGE_BASE: TypedContractMethod<[], [bigint], "view">;
495
499
  PRICE_SETTER_ROLE: TypedContractMethod<[], [string], "view">;
496
500
  addReward: TypedContractMethod<[
497
501
  _rewardAmount: BigNumberish
@@ -517,13 +521,8 @@ export interface TradingVault extends BaseContract {
517
521
  void
518
522
  ], "nonpayable">;
519
523
  createPosition: TypedContractMethod<[
520
- _amount: BigNumberish
521
- ], [
522
- bigint
523
- ], "nonpayable">;
524
- createPositionForUser: TypedContractMethod<[
525
- _user: AddressLike,
526
- _amount: BigNumberish
524
+ _amount: BigNumberish,
525
+ _recipient: AddressLike
527
526
  ], [
528
527
  bigint
529
528
  ], "nonpayable">;
@@ -555,7 +554,9 @@ export interface TradingVault extends BaseContract {
555
554
  ], "view">;
556
555
  initialize: TypedContractMethod<[
557
556
  _currency: AddressLike,
558
- _rewardToken: AddressLike
557
+ _rewardToken: AddressLike,
558
+ _treasury: AddressLike,
559
+ _owner: AddressLike
559
560
  ], [
560
561
  void
561
562
  ], "nonpayable">;
@@ -580,7 +581,8 @@ export interface TradingVault extends BaseContract {
580
581
  bigint,
581
582
  bigint,
582
583
  bigint,
583
- bigint
584
+ bigint,
585
+ string
584
586
  ] & {
585
587
  entryPrice: bigint;
586
588
  outPrice: bigint;
@@ -590,6 +592,7 @@ export interface TradingVault extends BaseContract {
590
592
  closedAt: bigint;
591
593
  rewardedAmount: bigint;
592
594
  lossAmount: bigint;
595
+ token: string;
593
596
  }
594
597
  ], "view">;
595
598
  price: TypedContractMethod<[], [bigint], "view">;
@@ -711,8 +714,8 @@ export interface TradingVault extends BaseContract {
711
714
  getFunction(nameOrSignature: "BASE_WEIGHT"): TypedContractMethod<[], [bigint], "view">;
712
715
  getFunction(nameOrSignature: "DEFAULT_ADMIN_ROLE"): TypedContractMethod<[], [string], "view">;
713
716
  getFunction(nameOrSignature: "EXPO"): TypedContractMethod<[], [bigint], "view">;
714
- getFunction(nameOrSignature: "EXPO_100"): TypedContractMethod<[], [bigint], "view">;
715
717
  getFunction(nameOrSignature: "OPERATOR_ROLE"): TypedContractMethod<[], [string], "view">;
718
+ getFunction(nameOrSignature: "PERCENTAGE_BASE"): TypedContractMethod<[], [bigint], "view">;
716
719
  getFunction(nameOrSignature: "PRICE_SETTER_ROLE"): TypedContractMethod<[], [string], "view">;
717
720
  getFunction(nameOrSignature: "addReward"): TypedContractMethod<[_rewardAmount: BigNumberish], [void], "nonpayable">;
718
721
  getFunction(nameOrSignature: "approve"): TypedContractMethod<[
@@ -729,10 +732,9 @@ export interface TradingVault extends BaseContract {
729
732
  ], [
730
733
  void
731
734
  ], "nonpayable">;
732
- getFunction(nameOrSignature: "createPosition"): TypedContractMethod<[_amount: BigNumberish], [bigint], "nonpayable">;
733
- getFunction(nameOrSignature: "createPositionForUser"): TypedContractMethod<[
734
- _user: AddressLike,
735
- _amount: BigNumberish
735
+ getFunction(nameOrSignature: "createPosition"): TypedContractMethod<[
736
+ _amount: BigNumberish,
737
+ _recipient: AddressLike
736
738
  ], [
737
739
  bigint
738
740
  ], "nonpayable">;
@@ -756,7 +758,9 @@ export interface TradingVault extends BaseContract {
756
758
  ], "view">;
757
759
  getFunction(nameOrSignature: "initialize"): TypedContractMethod<[
758
760
  _currency: AddressLike,
759
- _rewardToken: AddressLike
761
+ _rewardToken: AddressLike,
762
+ _treasury: AddressLike,
763
+ _owner: AddressLike
760
764
  ], [
761
765
  void
762
766
  ], "nonpayable">;
@@ -781,7 +785,8 @@ export interface TradingVault extends BaseContract {
781
785
  bigint,
782
786
  bigint,
783
787
  bigint,
784
- bigint
788
+ bigint,
789
+ string
785
790
  ] & {
786
791
  entryPrice: bigint;
787
792
  outPrice: bigint;
@@ -791,6 +796,7 @@ export interface TradingVault extends BaseContract {
791
796
  closedAt: bigint;
792
797
  rewardedAmount: bigint;
793
798
  lossAmount: bigint;
799
+ token: string;
794
800
  }
795
801
  ], "view">;
796
802
  getFunction(nameOrSignature: "price"): TypedContractMethod<[], [bigint], "view">;
@@ -912,9 +918,9 @@ export interface TradingVault extends BaseContract {
912
918
  Initialized: TypedContractEvent<InitializedEvent.InputTuple, InitializedEvent.OutputTuple, InitializedEvent.OutputObject>;
913
919
  "OwnershipTransferred(address,address)": TypedContractEvent<OwnershipTransferredEvent.InputTuple, OwnershipTransferredEvent.OutputTuple, OwnershipTransferredEvent.OutputObject>;
914
920
  OwnershipTransferred: TypedContractEvent<OwnershipTransferredEvent.InputTuple, OwnershipTransferredEvent.OutputTuple, OwnershipTransferredEvent.OutputObject>;
915
- "PositionCreated(address,uint256,uint256,uint256,uint256)": TypedContractEvent<PositionCreatedEvent.InputTuple, PositionCreatedEvent.OutputTuple, PositionCreatedEvent.OutputObject>;
921
+ "PositionCreated(address,uint256,uint256,uint256,uint256,address)": TypedContractEvent<PositionCreatedEvent.InputTuple, PositionCreatedEvent.OutputTuple, PositionCreatedEvent.OutputObject>;
916
922
  PositionCreated: TypedContractEvent<PositionCreatedEvent.InputTuple, PositionCreatedEvent.OutputTuple, PositionCreatedEvent.OutputObject>;
917
- "PositionReduced(address,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)": TypedContractEvent<PositionReducedEvent.InputTuple, PositionReducedEvent.OutputTuple, PositionReducedEvent.OutputObject>;
923
+ "PositionReduced(address,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,address)": TypedContractEvent<PositionReducedEvent.InputTuple, PositionReducedEvent.OutputTuple, PositionReducedEvent.OutputObject>;
918
924
  PositionReduced: TypedContractEvent<PositionReducedEvent.InputTuple, PositionReducedEvent.OutputTuple, PositionReducedEvent.OutputObject>;
919
925
  "PriceUpdated(uint256,uint256,uint256)": TypedContractEvent<PriceUpdatedEvent.InputTuple, PriceUpdatedEvent.OutputTuple, PriceUpdatedEvent.OutputObject>;
920
926
  PriceUpdated: TypedContractEvent<PriceUpdatedEvent.InputTuple, PriceUpdatedEvent.OutputTuple, PriceUpdatedEvent.OutputObject>;
@@ -21,8 +21,10 @@
21
21
  "Currency": "0xDB2e50234a3BE8aA4200C96712F190cf712cd8ec",
22
22
  "Reward": "0xa5Ef2328aa2F6F231D15cdcF48503974D0938eD4",
23
23
  "SeedRoundFundraiser": "0xbd520dbcb8e0b062D10d7879D27C20d214a262F6",
24
- "SeedRoundFundraiser-implemented": "0x40f56F138439fD5bB10741f5527A9DA05461636E",
24
+ "SeedRoundFundraiser-implemented": "0x06324cBa213fEaed28Dd3A0d7B32f17885f839D2",
25
25
  "WETH": "0x08a2d38807B1D345b6c1642f8030a29DC2Cc7223",
26
- "SeedRoundFundraiser-implemented-old": "0xbd687508aBEb3DDd983323dD98145A9D1ebE3223"
26
+ "SeedRoundFundraiser-implemented-old": "0x40f56F138439fD5bB10741f5527A9DA05461636E",
27
+ "TradingVault": "0xeCB23467123c1CA6F9D97Ae5B2faCF9eCb1F6464",
28
+ "TradingVault-implemented": "0xEe8D777729B5D8239FF18E77B04cf47a73FfE516"
27
29
  }
28
30
  }
package/dist/utils.d.ts CHANGED
@@ -93,3 +93,9 @@ export declare const signAndSendTransaction: (tx: ethers.ContractTransaction, wa
93
93
  attempts: number;
94
94
  };
95
95
  }>;
96
+ /**
97
+ * Extract network name from RPC URL
98
+ * @param rpcUrl The RPC URL to parse
99
+ * @returns Standardized network name
100
+ */
101
+ export declare const getNetworkFromRpc: (rpcUrl: string) => string;
package/dist/utils.js CHANGED
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),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.sleep=exports.LOG_PREFIXES=void 0;const e=require("ethers");exports.LOG_PREFIXES={INFO:"[STREAM-INFO]",BLOCK:"[STREAM-BLOCK]",EVENT:"[STREAM-EVENT]",ERROR:"[STREAM-ERROR]",SAVE:"[STREAM-SAVE]",DEBUG:"[STREAM-DEBUG]"};exports.sleep=async e=>new Promise((t=>setTimeout(t,e)));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,r=10)=>{let o=0,s=1e3;for(;o<r;)try{const n=await e.getTransactionReceipt(t);if(!n){if(o++,o===r)return{hash:t,status:null,confirmations:0,isCompleted:!1,attempts:o};await(0,exports.sleep)(s),s*=2;continue}const a=Number(await n.confirmations()||0);return{hash:n.hash,status:1===n.status,confirmations:a,isCompleted:!0,attempts:o+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,r)=>{const o=new e.ethers.Contract(t,["function decimals() view returns (uint8)"],r);return Number(await o.decimals())};exports.getTokenSymbol=async(t,r)=>{const o=new e.ethers.Contract(t,["function symbol() view returns (string)"],r);return await o.symbol()};exports.getTokenAllowance=async(t,r,o,s)=>{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)"],s);return await n.allowance(r,o)};exports.buildApproveERC20Tx=async(t,r,o,s)=>{const n=new e.ethers.Contract(t,["function approve(address spender, uint256 amount) returns (bool)"],s);return await n.approve.populateTransaction(r,o)};exports.getRewardWeight=(e,t)=>{let r=0;const o=[...t].sort(((e,t)=>e.duration-t.duration));for(const t of o)e>=t.duration&&(r=t.weight);return r};exports.resolveContractAddress=(e,t,r,o)=>{if(o)return o;const s=e.toLowerCase();if(["testnet","sepolia","goerli"].some((e=>s.includes(e)))){if(s.includes("sepolia.base"))return r?.["base-sepolia"]?.[t];if(s.includes("sepolia"))return r?.sepolia?.[t];if(s.includes("goerli"))return r?.goerli?.[t];throw new Error("Unsupported testnet network")}return r?.mainnet?.[t]};exports.getAllEvents=async(e,t,r,o,s)=>{const n=[];e.interface.forEachEvent((e=>{n.push(e.name)}));const a=n.map((async t=>{const n=r(),a=n.filters[t]();return(await n.queryFilter(a,o,s)).map((r=>{const o=e.interface.parseLog({topics:r.topics,data:r.data});return{eventName:t,blockNumber:r.blockNumber,transactionHash:r.transactionHash,args:o?.args.toObject(),timestamp:null}}))})),c=(await Promise.all(a)).flat();c.sort(((e,t)=>e.blockNumber-t.blockNumber));const i=[...new Set(c.map((e=>e.blockNumber)))].map((e=>t().getBlock(e))),l=await Promise.all(i),f=new Map(l.map((e=>[e.number,e.timestamp])));return c.map((e=>({eventName:e.eventName,blockNumber:e.blockNumber,transactionHash:e.transactionHash,args:Object.fromEntries(Object.entries(e.args||{}).filter((([e])=>isNaN(Number(e))))),timestamp:f.get(e.blockNumber)??null})))};exports.streamEvents=async({getProvider:e,getAllEvents:t,formatEvent:r,onEvent:o,saveLatestBlock:s,fromBlock:n,batchSize:a=1e3,sleepTime:c=5e3})=>{const i="1"===process.env.DEBUG_STREAM_EVENTS;let l=n;for(i&&(console.log(`${exports.LOG_PREFIXES.INFO} StreamEvents Debug Mode Enabled`),console.log(`${exports.LOG_PREFIXES.INFO} Initial fromBlock: ${l}`),console.log(`${exports.LOG_PREFIXES.INFO} Batch size: ${a}`),console.log(`${exports.LOG_PREFIXES.INFO} Sleep time: ${c}ms`));;)try{const n=await e().getBlockNumber();i&&console.log(`${exports.LOG_PREFIXES.BLOCK} Latest block: ${n}`);const f=Math.min(l+a,n);if(i&&console.log(`${exports.LOG_PREFIXES.BLOCK} Processing blocks from ${l} to ${f}`),l>=n){i&&console.log(`${exports.LOG_PREFIXES.DEBUG} Caught up to latest block, waiting ${c}ms...`),await(0,exports.sleep)(c);continue}const E=await t(l,f);if(i&&E.length>0){const e=E.reduce(((e,t)=>{const r=t.eventName||"Unknown";return e[r]=(e[r]||0)+1,e}),{});console.log(`${exports.LOG_PREFIXES.EVENT} Found ${E.length} events:`),Object.entries(e).forEach((([e,t])=>{console.log(`${exports.LOG_PREFIXES.EVENT} - ${e}: ${t}`)}))}for(const e of E)i&&console.log(`${exports.LOG_PREFIXES.EVENT} Processing: ${e.eventName||"Event"}`),await o(r(e));await s(f),i&&console.log(`${exports.LOG_PREFIXES.SAVE} Saved latest block: ${f}`),l=f+1}catch(e){i?(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,r,{onSubmit:o,onFinally:s,onError:n}={},a)=>{try{const n={...e};let a;if("object"==typeof t&&null!==t&&"sendTransaction"in t){const e=t.connect(r());a=(await e.sendTransaction(n)).hash}else a=await t(n);o&&await o(a);const c=await(0,exports.getTransactionStatus)(r(),a);if(null===c.status)throw new Error("Transaction may not be minted on-chain yet or has failed. Please check the blockchain explorer.");if(!1===c.status)throw new Error("Transaction failed. Please check the blockchain explorer for details.");return s&&await s({...c,txHash:a}),{transaction:{hash:a},status:c}}catch(e){if(a&&e)try{if("CALL_EXCEPTION"===e.code&&e.data){const t=e.data;for(const r of Object.values(a.interface.fragments).filter((e=>"error"===e.type)))if("name"in r){const o=a.interface.getError(r.name);if(o&&o.selector){if(o.selector===t){const t=r.name,o=e.errorArgs||[],s=new Error(`Transaction failed with custom error: ${t}(${o.join(", ")})`);throw Object.assign(s,e),n&&await n(s),s}}}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}};
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.sleep=exports.LOG_PREFIXES=void 0;const e=require("ethers");exports.LOG_PREFIXES={INFO:"[STREAM-INFO]",BLOCK:"[STREAM-BLOCK]",EVENT:"[STREAM-EVENT]",ERROR:"[STREAM-ERROR]",SAVE:"[STREAM-SAVE]",DEBUG:"[STREAM-DEBUG]"};exports.sleep=async e=>new Promise((t=>setTimeout(t,e)));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 r=0,s=1e3;for(;r<o;)try{const a=await e.getTransactionReceipt(t);if(!a){if(r++,r===o)return{hash:t,status:null,confirmations:0,isCompleted:!1,attempts:r};await(0,exports.sleep)(s),s*=2;continue}const n=Number(await a.confirmations()||0);return{hash:a.hash,status:1===a.status,confirmations:n,isCompleted:!0,attempts:r+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 r=new e.ethers.Contract(t,["function decimals() view returns (uint8)"],o);return Number(await r.decimals())};exports.getTokenSymbol=async(t,o)=>{const r=new e.ethers.Contract(t,["function symbol() view returns (string)"],o);return await r.symbol()};exports.getTokenAllowance=async(t,o,r,s)=>{if(t===e.ethers.ZeroAddress||t.toLowerCase()===e.ethers.ZeroAddress)return BigInt("0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");const a=new e.ethers.Contract(t,["function allowance(address owner, address spender) view returns (uint256)"],s);return await a.allowance(o,r)};exports.buildApproveERC20Tx=async(t,o,r,s)=>{const a=new e.ethers.Contract(t,["function approve(address spender, uint256 amount) returns (bool)"],s);return await a.approve.populateTransaction(o,r)};exports.getRewardWeight=(e,t)=>{let o=0;const r=[...t].sort(((e,t)=>e.duration-t.duration));for(const t of r)e>=t.duration&&(o=t.weight);return o};exports.resolveContractAddress=(e,t,o,r)=>{if(r)return r;const s=(0,exports.getNetworkFromRpc)(e);return o?.[s]?.[t]};exports.getAllEvents=async(e,t,o,r,s)=>{const a=[];e.interface.forEachEvent((e=>{a.push(e.name)}));const n=a.map((async t=>{const a=o(),n=a.filters[t]();return(await a.queryFilter(n,r,s)).map((o=>{const r=e.interface.parseLog({topics:o.topics,data:o.data});return{eventName:t,blockNumber:o.blockNumber,transactionHash:o.transactionHash,args:r?.args.toObject(),timestamp:null}}))})),i=(await Promise.all(n)).flat();i.sort(((e,t)=>e.blockNumber-t.blockNumber));const c=[...new Set(i.map((e=>e.blockNumber)))].map((e=>t().getBlock(e))),l=await Promise.all(c),m=new Map(l.map((e=>[e.number,e.timestamp])));return 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:m.get(e.blockNumber)??null})))};exports.streamEvents=async({getProvider:e,getAllEvents:t,formatEvent:o,onEvent:r,saveLatestBlock:s,fromBlock:a,batchSize:n=1e3,sleepTime:i=5e3})=>{const c="1"===process.env.DEBUG_STREAM_EVENTS;let l=a;for(c&&(console.log(`${exports.LOG_PREFIXES.INFO} StreamEvents Debug Mode Enabled`),console.log(`${exports.LOG_PREFIXES.INFO} Initial fromBlock: ${l}`),console.log(`${exports.LOG_PREFIXES.INFO} Batch size: ${n}`),console.log(`${exports.LOG_PREFIXES.INFO} Sleep time: ${i}ms`));;)try{const a=await e().getBlockNumber();c&&console.log(`${exports.LOG_PREFIXES.BLOCK} Latest block: ${a}`);const m=Math.min(l+n,a);if(c&&console.log(`${exports.LOG_PREFIXES.BLOCK} Processing blocks from ${l} to ${m}`),l>=a){c&&console.log(`${exports.LOG_PREFIXES.DEBUG} Caught up to latest block, waiting ${i}ms...`),await(0,exports.sleep)(i);continue}const p=await t(l,m);if(c&&p.length>0){const e=p.reduce(((e,t)=>{const o=t.eventName||"Unknown";return e[o]=(e[o]||0)+1,e}),{});console.log(`${exports.LOG_PREFIXES.EVENT} Found ${p.length} events:`),Object.entries(e).forEach((([e,t])=>{console.log(`${exports.LOG_PREFIXES.EVENT} - ${e}: ${t}`)}))}for(const e of p)c&&console.log(`${exports.LOG_PREFIXES.EVENT} Processing: ${e.eventName||"Event"}`),await r(o(e));await s(m),c&&console.log(`${exports.LOG_PREFIXES.SAVE} Saved latest block: ${m}`),l=m+1}catch(e){c?(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:r,onFinally:s,onError:a}={},n)=>{try{const a={...e};let n;if("object"==typeof t&&null!==t&&"sendTransaction"in t){const e=t.connect(o());n=(await e.sendTransaction(a)).hash}else n=await t(a);r&&await r(n);const i=await(0,exports.getTransactionStatus)(o(),n);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 s&&await s({...i,txHash:n}),{transaction:{hash:n},status:i}}catch(e){if(n&&e)try{if("CALL_EXCEPTION"===e.code&&e.data){const t=e.data;for(const o of Object.values(n.interface.fragments).filter((e=>"error"===e.type)))if("name"in o){const r=n.interface.getError(o.name);if(r&&r.selector){if(r.selector===t){const t=o.name,r=e.errorArgs||[],s=new Error(`Transaction failed with custom error: ${t}(${r.join(", ")})`);throw Object.assign(s,e),a&&await a(s),s}}}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 a&&await a(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 r=[[/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 r)if(e.test(t))return o;for(const[e,t]of r)if(e.test(o))return t;throw new Error("Failed to get network from RPC URL")};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});const e=require("chai"),t=require("./utils");describe("getNetworkFromRpc",(function(){const o=console.warn;before((function(){console.warn=function(){}})),after((function(){console.warn=o})),it("should correctly identify the network from the provided inputs",(function(){(0,e.expect)((0,t.getNetworkFromRpc)("https://sepolia.base.org")).to.equal("base-sepolia"),(0,e.expect)((0,t.getNetworkFromRpc)("https://eth-mainnet.g.alchemy.com/v2/api-key")).to.equal("ethereum")})),describe("Base networks",(function(){it("should identify Base Sepolia network",(function(){(0,e.expect)((0,t.getNetworkFromRpc)("https://base-sepolia.example.com")).to.equal("base-sepolia"),(0,e.expect)((0,t.getNetworkFromRpc)("wss://base-sepolia.infura.io")).to.equal("base-sepolia"),(0,e.expect)((0,t.getNetworkFromRpc)("https://sepolia.base.org")).to.equal("base-sepolia"),(0,e.expect)((0,t.getNetworkFromRpc)("https://blue-smart-energy.base-sepolia.quiknode.pro/f1b6c1400045b2f7ee93224247607cbd81e54c10")).to.equal("base-sepolia")})),it("should identify Base Goerli network",(function(){(0,e.expect)((0,t.getNetworkFromRpc)("https://base-goerli.example.com")).to.equal("base-goerli"),(0,e.expect)((0,t.getNetworkFromRpc)("wss://base-goerli.infura.io")).to.equal("base-goerli"),(0,e.expect)((0,t.getNetworkFromRpc)("https://goerli.base.org")).to.equal("base-goerli")})),it("should identify Base Mainnet network",(function(){(0,e.expect)((0,t.getNetworkFromRpc)("https://base-mainnet.example.com")).to.equal("base"),(0,e.expect)((0,t.getNetworkFromRpc)("https://base.infura.io")).to.equal("base"),(0,e.expect)((0,t.getNetworkFromRpc)("wss://base.g.alchemy.com")).to.equal("base"),(0,e.expect)((0,t.getNetworkFromRpc)("https://radial-cold-vineyard.base-mainnet.quiknode.pro/29590a4143d60614a7cd0a9f3b5e39179430373e")).to.equal("base")}))})),describe("Ethereum networks",(function(){it("should identify Ethereum Sepolia network",(function(){(0,e.expect)((0,t.getNetworkFromRpc)("https://eth-sepolia.g.alchemy.com")).to.equal("sepolia"),(0,e.expect)((0,t.getNetworkFromRpc)("https://sepolia.infura.io")).to.equal("sepolia"),(0,e.expect)((0,t.getNetworkFromRpc)("wss://sepolia.example.com")).to.equal("sepolia")})),it("should identify Ethereum Goerli network",(function(){(0,e.expect)((0,t.getNetworkFromRpc)("https://eth-goerli.g.alchemy.com")).to.equal("goerli"),(0,e.expect)((0,t.getNetworkFromRpc)("https://goerli.infura.io")).to.equal("goerli"),(0,e.expect)((0,t.getNetworkFromRpc)("wss://goerli.example.com")).to.equal("goerli")})),it("should identify Ethereum Mainnet network",(function(){(0,e.expect)((0,t.getNetworkFromRpc)("https://eth-mainnet.g.alchemy.com")).to.equal("ethereum"),(0,e.expect)((0,t.getNetworkFromRpc)("https://mainnet.infura.io")).to.equal("ethereum"),(0,e.expect)((0,t.getNetworkFromRpc)("wss://ethereum.example.com")).to.equal("ethereum"),(0,e.expect)((0,t.getNetworkFromRpc)("https://eth.rpc.blxrbdn.com")).to.equal("ethereum")}))})),describe("Polygon networks",(function(){it("should identify Polygon Mumbai network",(function(){(0,e.expect)((0,t.getNetworkFromRpc)("https://polygon-mumbai.g.alchemy.com")).to.equal("polygon-mumbai"),(0,e.expect)((0,t.getNetworkFromRpc)("https://rpc-mumbai.polygon.technology")).to.equal("polygon-mumbai")})),it("should identify Polygon Amoy network",(function(){(0,e.expect)((0,t.getNetworkFromRpc)("https://polygon-amoy.g.alchemy.com")).to.equal("polygon-amoy"),(0,e.expect)((0,t.getNetworkFromRpc)("https://rpc-amoy.polygon.technology")).to.equal("polygon-amoy")})),it("should identify Polygon zkEVM network",(function(){(0,e.expect)((0,t.getNetworkFromRpc)("https://polygon-zkevm.example.com")).to.equal("polygon-zkevm"),(0,e.expect)((0,t.getNetworkFromRpc)("https://zkevm-rpc.polygon.technology")).to.equal("polygon-zkevm")})),it("should identify Polygon Mainnet network",(function(){(0,e.expect)((0,t.getNetworkFromRpc)("https://polygon-rpc.com")).to.equal("polygon"),(0,e.expect)((0,t.getNetworkFromRpc)("https://rpc.polygon.technology")).to.equal("polygon")}))})),describe("Arbitrum networks",(function(){it("should identify Arbitrum Sepolia network",(function(){(0,e.expect)((0,t.getNetworkFromRpc)("https://arbitrum-sepolia.infura.io")).to.equal("arbitrum-sepolia"),(0,e.expect)((0,t.getNetworkFromRpc)("https://sepolia-rollup.arbitrum.io/rpc")).to.equal("arbitrum-sepolia")})),it("should identify Arbitrum Goerli network",(function(){(0,e.expect)((0,t.getNetworkFromRpc)("https://arbitrum-goerli.infura.io")).to.equal("arbitrum-goerli"),(0,e.expect)((0,t.getNetworkFromRpc)("https://goerli-rollup.arbitrum.io/rpc")).to.equal("arbitrum-goerli")})),it("should identify Arbitrum Nova network",(function(){(0,e.expect)((0,t.getNetworkFromRpc)("https://arbitrum-nova.infura.io")).to.equal("arbitrum-nova"),(0,e.expect)((0,t.getNetworkFromRpc)("https://nova.arbitrum.io/rpc")).to.equal("arbitrum-nova")})),it("should identify Arbitrum One network",(function(){(0,e.expect)((0,t.getNetworkFromRpc)("https://arbitrum.infura.io")).to.equal("arbitrum"),(0,e.expect)((0,t.getNetworkFromRpc)("https://arb1.arbitrum.io/rpc")).to.equal("arbitrum")}))})),describe("Optimism networks",(function(){it("should identify Optimism Sepolia network",(function(){(0,e.expect)((0,t.getNetworkFromRpc)("https://optimism-sepolia.infura.io")).to.equal("optimism-sepolia"),(0,e.expect)((0,t.getNetworkFromRpc)("https://sepolia.optimism.io")).to.equal("optimism-sepolia")})),it("should identify Optimism Goerli network",(function(){(0,e.expect)((0,t.getNetworkFromRpc)("https://optimism-goerli.infura.io")).to.equal("optimism-goerli"),(0,e.expect)((0,t.getNetworkFromRpc)("https://goerli.optimism.io")).to.equal("optimism-goerli")})),it("should identify Optimism Mainnet network",(function(){(0,e.expect)((0,t.getNetworkFromRpc)("https://optimism.infura.io")).to.equal("optimism"),(0,e.expect)((0,t.getNetworkFromRpc)("https://mainnet.optimism.io")).to.equal("optimism")}))})),describe("Avalanche networks",(function(){it("should identify Avalanche Fuji network",(function(){(0,e.expect)((0,t.getNetworkFromRpc)("https://avalanche-fuji.infura.io")).to.equal("avalanche-fuji"),(0,e.expect)((0,t.getNetworkFromRpc)("https://api.avax-test.network/ext/bc/C/rpc")).to.equal("avalanche-fuji")})),it("should identify Avalanche Mainnet network",(function(){(0,e.expect)((0,t.getNetworkFromRpc)("https://avalanche.infura.io")).to.equal("avalanche"),(0,e.expect)((0,t.getNetworkFromRpc)("https://api.avax.network/ext/bc/C/rpc")).to.equal("avalanche")}))})),describe("Binance Smart Chain networks",(function(){it("should identify BSC Testnet network",(function(){(0,e.expect)((0,t.getNetworkFromRpc)("https://bsc-testnet.infura.io")).to.equal("bsc-testnet"),(0,e.expect)((0,t.getNetworkFromRpc)("https://data-seed-prebsc-1-s1.binance.org:8545")).to.equal("bsc-testnet")})),it("should identify BSC Mainnet network",(function(){(0,e.expect)((0,t.getNetworkFromRpc)("https://bsc.infura.io")).to.equal("bsc"),(0,e.expect)((0,t.getNetworkFromRpc)("https://bsc-dataseed.binance.org")).to.equal("bsc"),(0,e.expect)((0,t.getNetworkFromRpc)("https://binance.nodereal.io")).to.equal("bsc")}))})),describe("URL formats",(function(){it("should handle URLs with authentication",(function(){(0,e.expect)((0,t.getNetworkFromRpc)("https://user:pass@ethereum.infura.io")).to.equal("ethereum"),(0,e.expect)((0,t.getNetworkFromRpc)("user:pass@polygon.infura.io")).to.equal("polygon")})),it("should handle URLs without protocol",(function(){(0,e.expect)((0,t.getNetworkFromRpc)("ethereum.infura.io")).to.equal("ethereum"),(0,e.expect)((0,t.getNetworkFromRpc)("polygon.infura.io")).to.equal("polygon")})),it("should handle invalid URLs gracefully",(function(){(0,e.expect)((0,t.getNetworkFromRpc)("ethereum:invalid-url")).to.equal("ethereum")}))})),describe("Error handling",(function(){it("should throw an error for unrecognized networks",(function(){(0,e.expect)((()=>(0,t.getNetworkFromRpc)("unknown-network.example.com"))).to.throw("Failed to get network from RPC URL"),(0,e.expect)((()=>(0,t.getNetworkFromRpc)("https://random-url.com"))).to.throw("Failed to get network from RPC URL")}))}))}));
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "aiia-vault-sdk",
3
- "version": "1.1.8",
3
+ "version": "1.1.10",
4
4
  "description": "SDK for AIIA Vault Contract",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",