@reyaxyz/common 0.77.0 → 0.79.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -6,5 +6,5 @@
6
6
 
7
7
  | Statements | Branches | Functions | Lines |
8
8
  | --------------------------- | ----------------------- | ------------------------- | ----------------- |
9
- | ![Statements](https://img.shields.io/badge/statements-16.5%25-red.svg?style=flat) | ![Branches](https://img.shields.io/badge/branches-17.24%25-red.svg?style=flat) | ![Functions](https://img.shields.io/badge/functions-11.11%25-red.svg?style=flat) | ![Lines](https://img.shields.io/badge/lines-17.14%25-red.svg?style=flat) |
9
+ | ![Statements](https://img.shields.io/badge/statements-16.31%25-red.svg?style=flat) | ![Branches](https://img.shields.io/badge/branches-16.8%25-red.svg?style=flat) | ![Functions](https://img.shields.io/badge/functions-11%25-red.svg?style=flat) | ![Lines](https://img.shields.io/badge/lines-16.95%25-red.svg?style=flat) |
10
10
 
@@ -5,7 +5,7 @@ export declare function getReyaNetworkFromMoneyInOutChainId(moneyInOutChainId: M
5
5
  export declare function getMoneyInOutNetworksFromReyaChainId(reyaChainId: ReyaChainId): MoneyInOutChainId[];
6
6
  export declare const chainIdToExplorerURL: Record<number, string>;
7
7
  export declare const ChainRpcUrls: {
8
- [key in MoneyInOutChainId]: string;
8
+ [key in MoneyInOutChainId]: string[];
9
9
  };
10
10
  export declare const AlchemyChainRpcUrls: {
11
11
  [key in MoneyInOutChainId]: string;
@@ -1 +1 @@
1
- {"version":3,"file":"network.d.ts","sourceRoot":"/","sources":["utils/network.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAE1D,wBAAgB,cAAc,CAAC,GAAG,EAAE,YAAY,GAAG,MAAM,GAAG,WAAW,CAKtE;AAED,wBAAgB,qBAAqB,CACnC,GAAG,EAAE,YAAY,GAAG,MAAM,GACzB,iBAAiB,EAAE,CAkBrB;AAED,wBAAgB,mCAAmC,CACjD,iBAAiB,EAAE,iBAAiB,GACnC,WAAW,CAWb;AAED,wBAAgB,oCAAoC,CAClD,WAAW,EAAE,WAAW,GACvB,iBAAiB,EAAE,CAWrB;AAED,eAAO,MAAM,oBAAoB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAWvD,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE;KAAG,GAAG,IAAI,iBAAiB,GAAG,MAAM;CAY9D,CAAC;AAEF,eAAO,MAAM,mBAAmB,EAAE;KAAG,GAAG,IAAI,iBAAiB,GAAG,MAAM;CAYrE,CAAC"}
1
+ {"version":3,"file":"network.d.ts","sourceRoot":"/","sources":["utils/network.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAE1D,wBAAgB,cAAc,CAAC,GAAG,EAAE,YAAY,GAAG,MAAM,GAAG,WAAW,CAKtE;AAED,wBAAgB,qBAAqB,CACnC,GAAG,EAAE,YAAY,GAAG,MAAM,GACzB,iBAAiB,EAAE,CAkBrB;AAED,wBAAgB,mCAAmC,CACjD,iBAAiB,EAAE,iBAAiB,GACnC,WAAW,CAWb;AAED,wBAAgB,oCAAoC,CAClD,WAAW,EAAE,WAAW,GACvB,iBAAiB,EAAE,CAWrB;AAED,eAAO,MAAM,oBAAoB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAWvD,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE;KAAG,GAAG,IAAI,iBAAiB,GAAG,MAAM,EAAE;CAoChE,CAAC;AAEF,eAAO,MAAM,mBAAmB,EAAE;KAAG,GAAG,IAAI,iBAAiB,GAAG,MAAM;CAYrE,CAAC"}
@@ -15,8 +15,14 @@ export type GetERC20BalanceArgs = {
15
15
  walletAddress: string;
16
16
  subject: Signer | Provider;
17
17
  };
18
+ export type GetERC20BalanceBatchArgs = {
19
+ tokenAddress: string;
20
+ walletAddress: string;
21
+ chain: MoneyInOutChainId;
22
+ };
18
23
  export type GetBalancesForBridgeArgs = {
19
24
  walletAddress: string;
20
25
  };
21
26
  export declare const getERC20Balance: ({ tokenAddress, walletAddress, subject, }: GetERC20BalanceArgs) => Promise<number>;
27
+ export declare const getERC20BalanceBatch: ({ tokenAddress, walletAddress, chain, }: GetERC20BalanceBatchArgs) => Promise<number>;
22
28
  //# sourceMappingURL=token.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"token.d.ts","sourceRoot":"/","sources":["utils/token.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAE1C,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAG1C,OAAO,EACL,OAAO,EACP,uBAAuB,EACvB,iBAAiB,EACjB,WAAW,EACX,SAAS,EACT,SAAS,EACV,MAAM,UAAU,CAAC;AAClB,eAAO,MAAM,OAAO,kBAAmB,MAAM,aACzB,MAAM,WAKzB,CAAC;AAEF,eAAO,MAAM,KAAK,kBAAmB,MAAM,aAAY,MAAM,KAAK,MAiBjE,CAAC;AAEF,eAAO,MAAM,qBAAqB,iBAClB,MAAM,WACX,MAAM,GAAG,QAAQ,KACzB,QAWF,CAAC;AAEF,eAAO,MAAM,gBAAgB,QAAS,MAAM,KAAG,OAE9C,CAAC;AAEF,eAAO,MAAM,qBAAqB,sBACb,OAAO,GAAG,MAAM,YACzB,WAAW,GAAG,iBAAiB,KACxC,SA+BF,CAAC;AAEF,eAAO,MAAM,kBAAkB,cAClB,SAAS,WACX,WAAW,GAAG,iBAAiB,KACvC,SAYF,CAAC;AAEF,eAAO,MAAM,oBAAoB,YACtB,WAAW,GAAG,iBAAiB,KACvC,SAAS,EAEX,CAAC;AAEF,eAAO,MAAM,0BAA0B,YAC5B,WAAW,GAAG,iBAAiB,KACvC,SAYF,CAAC;AAEF,eAAO,MAAM,iBAAiB,8DAK3B,uBAAuB,KAAG,QAAQ,MAAM,CAW1C,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,MAAM,GAAG,QAAQ,CAAC;CAC5B,CAAC;AAEF,MAAM,MAAM,wBAAwB,GAAG;IACrC,aAAa,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF,eAAO,MAAM,eAAe,8CAIzB,mBAAmB,KAAG,QAAQ,MAAM,CAUtC,CAAC"}
1
+ {"version":3,"file":"token.d.ts","sourceRoot":"/","sources":["utils/token.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAE1C,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAG1C,OAAO,EACL,OAAO,EACP,uBAAuB,EACvB,iBAAiB,EACjB,WAAW,EACX,SAAS,EACT,SAAS,EACV,MAAM,UAAU,CAAC;AAElB,eAAO,MAAM,OAAO,kBAAmB,MAAM,aACzB,MAAM,WAKzB,CAAC;AAEF,eAAO,MAAM,KAAK,kBAAmB,MAAM,aAAY,MAAM,KAAK,MAiBjE,CAAC;AAEF,eAAO,MAAM,qBAAqB,iBAClB,MAAM,WACX,MAAM,GAAG,QAAQ,KACzB,QAWF,CAAC;AAEF,eAAO,MAAM,gBAAgB,QAAS,MAAM,KAAG,OAE9C,CAAC;AAEF,eAAO,MAAM,qBAAqB,sBACb,OAAO,GAAG,MAAM,YACzB,WAAW,GAAG,iBAAiB,KACxC,SA+BF,CAAC;AAEF,eAAO,MAAM,kBAAkB,cAClB,SAAS,WACX,WAAW,GAAG,iBAAiB,KACvC,SAYF,CAAC;AAEF,eAAO,MAAM,oBAAoB,YACtB,WAAW,GAAG,iBAAiB,KACvC,SAAS,EAEX,CAAC;AAEF,eAAO,MAAM,0BAA0B,YAC5B,WAAW,GAAG,iBAAiB,KACvC,SAYF,CAAC;AAEF,eAAO,MAAM,iBAAiB,8DAK3B,uBAAuB,KAAG,QAAQ,MAAM,CAW1C,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,MAAM,GAAG,QAAQ,CAAC;CAC5B,CAAC;AAEF,MAAM,MAAM,wBAAwB,GAAG;IACrC,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,iBAAiB,CAAC;CAC1B,CAAC;AAEF,MAAM,MAAM,wBAAwB,GAAG;IACrC,aAAa,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF,eAAO,MAAM,eAAe,8CAIzB,mBAAmB,KAAG,QAAQ,MAAM,CAUtC,CAAC;AAEF,eAAO,MAAM,oBAAoB,4CAI9B,wBAAwB,KAAG,QAAQ,MAAM,CAuB3C,CAAC"}
@@ -62,15 +62,39 @@ exports.chainIdToExplorerURL = (_a = {},
62
62
  _a[types_1.ReyaChainId.reyaCronos] = 'https://reya-cronos.blockscout.com',
63
63
  _a);
64
64
  exports.ChainRpcUrls = (_b = {},
65
- _b[types_1.MoneyInOutChainId.ethereumMainnet] = 'https://mainnet.gateway.tenderly.co',
66
- _b[types_1.MoneyInOutChainId.opMainnet] = 'https://mainnet.optimism.io',
67
- _b[types_1.MoneyInOutChainId.polygonMainnet] = 'https://polygon-rpc.com/',
68
- _b[types_1.MoneyInOutChainId.arbitrumOne] = 'https://arb1.arbitrum.io/rpc',
65
+ _b[types_1.MoneyInOutChainId.ethereumMainnet] = [
66
+ 'https://mainnet.gateway.tenderly.co',
67
+ 'https://eth.llamarpc.com',
68
+ ],
69
+ _b[types_1.MoneyInOutChainId.opMainnet] = [
70
+ 'https://mainnet.optimism.io',
71
+ 'https://optimism.llamarpc.com',
72
+ ],
73
+ _b[types_1.MoneyInOutChainId.polygonMainnet] = [
74
+ 'https://polygon-rpc.com',
75
+ 'https://gateway.tenderly.co/public/polygon',
76
+ ],
77
+ _b[types_1.MoneyInOutChainId.arbitrumOne] = [
78
+ 'https://arb1.arbitrum.io/rpc',
79
+ 'https://arbitrum.llamarpc.com',
80
+ ],
69
81
  // Add the rest of the mainnet URLs above
70
- _b[types_1.MoneyInOutChainId.polygonMumbai] = 'https://rpc.ankr.com/polygon_mumbai',
71
- _b[types_1.MoneyInOutChainId.arbitrumSepolia] = 'https://sepolia-rollup.arbitrum.io/rpc',
72
- _b[types_1.MoneyInOutChainId.opSepolia] = 'https://sepolia.optimism.io',
73
- _b[types_1.MoneyInOutChainId.ethereumSepolia] = 'https://sepolia.gateway.tenderly.co',
82
+ _b[types_1.MoneyInOutChainId.polygonMumbai] = [
83
+ 'https://polygon-mumbai.gateway.tenderly.co',
84
+ 'https://polygon-mumbai-bor-rpc.publicnode.com',
85
+ ],
86
+ _b[types_1.MoneyInOutChainId.arbitrumSepolia] = [
87
+ 'https://sepolia-rollup.arbitrum.io/rpc',
88
+ 'https://endpoints.omniatech.io/v1/arbitrum/sepolia/public',
89
+ ],
90
+ _b[types_1.MoneyInOutChainId.opSepolia] = [
91
+ 'https://sepolia.optimism.io',
92
+ 'https://optimism-sepolia.blockpi.network/v1/rpc/public',
93
+ ],
94
+ _b[types_1.MoneyInOutChainId.ethereumSepolia] = [
95
+ 'https://sepolia.gateway.tenderly.co',
96
+ 'https://ethereum-sepolia.blockpi.network/v1/rpc/public',
97
+ ],
74
98
  _b);
75
99
  exports.AlchemyChainRpcUrls = (_c = {},
76
100
  // mainnet
@@ -1 +1 @@
1
- {"version":3,"file":"network.js","sourceRoot":"/","sources":["utils/network.ts"],"names":[],"mappings":"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","sourcesContent":["import { MoneyInOutChainId, ReyaChainId } from '../types';\n\nexport function getReyaNetwork(env: 'production' | 'test'): ReyaChainId {\n if (env === 'production') return ReyaChainId.reyaNetwork;\n if (env === 'test') return ReyaChainId.reyaCronos;\n\n throw new Error('Unknown env for getReyaNetwork');\n}\n\nexport function getMoneyInOutNetworks(\n env: 'production' | 'test',\n): MoneyInOutChainId[] {\n if (env === 'production')\n return [\n MoneyInOutChainId.ethereumMainnet,\n MoneyInOutChainId.opMainnet,\n MoneyInOutChainId.polygonMainnet,\n MoneyInOutChainId.arbitrumOne,\n ];\n\n if (env === 'test')\n return [\n MoneyInOutChainId.ethereumSepolia,\n MoneyInOutChainId.opSepolia,\n MoneyInOutChainId.arbitrumSepolia,\n MoneyInOutChainId.polygonMumbai,\n ];\n\n throw new Error('Unknown env for getMoneyInOutNetworks');\n}\n\nexport function getReyaNetworkFromMoneyInOutChainId(\n moneyInOutChainId: MoneyInOutChainId,\n): ReyaChainId {\n if (getMoneyInOutNetworks('production').includes(moneyInOutChainId)) {\n return getReyaNetwork('production');\n }\n if (getMoneyInOutNetworks('test').includes(moneyInOutChainId)) {\n return getReyaNetwork('test');\n }\n\n throw new Error(\n 'Unknown money in out network in getReyaNetworkFromMoneyInOutChainId',\n );\n}\n\nexport function getMoneyInOutNetworksFromReyaChainId(\n reyaChainId: ReyaChainId,\n): MoneyInOutChainId[] {\n if (getReyaNetwork('production') === reyaChainId) {\n return getMoneyInOutNetworks('production');\n }\n if (getReyaNetwork('test') === reyaChainId) {\n return getMoneyInOutNetworks('test');\n }\n\n throw new Error(\n 'Unknown money in out network in getMoneyInOutNetworksFromReyaChainId',\n );\n}\n\nexport const chainIdToExplorerURL: Record<number, string> = {\n [MoneyInOutChainId.ethereumMainnet]: 'https://etherscan.io',\n [MoneyInOutChainId.opMainnet]: 'https://optimistic.etherscan.io',\n [MoneyInOutChainId.polygonMainnet]: 'https://polygonscan.com',\n [MoneyInOutChainId.arbitrumOne]: 'https://arbiscan.io',\n [MoneyInOutChainId.polygonMumbai]: 'https://mumbai.polygonscan.com',\n [MoneyInOutChainId.arbitrumSepolia]: 'https://sepolia.arbiscan.io',\n [MoneyInOutChainId.opSepolia]: 'https://sepolia-optimism.etherscan.io',\n [MoneyInOutChainId.ethereumSepolia]: 'https://sepolia.etherscan.io',\n [ReyaChainId.reyaNetwork]: 'https://explorer.reya.network',\n [ReyaChainId.reyaCronos]: 'https://reya-cronos.blockscout.com',\n};\n\nexport const ChainRpcUrls: { [key in MoneyInOutChainId]: string } = {\n [MoneyInOutChainId.ethereumMainnet]: 'https://mainnet.gateway.tenderly.co',\n [MoneyInOutChainId.opMainnet]: 'https://mainnet.optimism.io',\n [MoneyInOutChainId.polygonMainnet]: 'https://polygon-rpc.com/',\n [MoneyInOutChainId.arbitrumOne]: 'https://arb1.arbitrum.io/rpc',\n // Add the rest of the mainnet URLs above\n\n [MoneyInOutChainId.polygonMumbai]: 'https://rpc.ankr.com/polygon_mumbai',\n [MoneyInOutChainId.arbitrumSepolia]: 'https://sepolia-rollup.arbitrum.io/rpc',\n [MoneyInOutChainId.opSepolia]: 'https://sepolia.optimism.io',\n [MoneyInOutChainId.ethereumSepolia]: 'https://sepolia.gateway.tenderly.co',\n // Add the rest of the testnet URLs above\n};\n\nexport const AlchemyChainRpcUrls: { [key in MoneyInOutChainId]: string } = {\n // mainnet\n [MoneyInOutChainId.ethereumMainnet]: 'https://eth-mainnet.g.alchemy.com/v2',\n [MoneyInOutChainId.opMainnet]: 'https://opt-mainnet.g.alchemy.com/v2',\n [MoneyInOutChainId.polygonMainnet]:\n 'https://polygon-mainnet.g.alchemy.com/v2',\n [MoneyInOutChainId.arbitrumOne]: 'https://arb-mainnet.g.alchemy.com/v2',\n // testnet\n [MoneyInOutChainId.polygonMumbai]: 'https://polygon-mumbai.g.alchemy.com/v2',\n [MoneyInOutChainId.arbitrumSepolia]: 'https://arb-sepolia.g.alchemy.com/v2',\n [MoneyInOutChainId.opSepolia]: 'https://opt-sepolia.g.alchemy.com/v2',\n [MoneyInOutChainId.ethereumSepolia]: 'https://eth-sepolia.g.alchemy.com/v2',\n};\n"]}
1
+ {"version":3,"file":"network.js","sourceRoot":"/","sources":["utils/network.ts"],"names":[],"mappings":"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","sourcesContent":["import { MoneyInOutChainId, ReyaChainId } from '../types';\n\nexport function getReyaNetwork(env: 'production' | 'test'): ReyaChainId {\n if (env === 'production') return ReyaChainId.reyaNetwork;\n if (env === 'test') return ReyaChainId.reyaCronos;\n\n throw new Error('Unknown env for getReyaNetwork');\n}\n\nexport function getMoneyInOutNetworks(\n env: 'production' | 'test',\n): MoneyInOutChainId[] {\n if (env === 'production')\n return [\n MoneyInOutChainId.ethereumMainnet,\n MoneyInOutChainId.opMainnet,\n MoneyInOutChainId.polygonMainnet,\n MoneyInOutChainId.arbitrumOne,\n ];\n\n if (env === 'test')\n return [\n MoneyInOutChainId.ethereumSepolia,\n MoneyInOutChainId.opSepolia,\n MoneyInOutChainId.arbitrumSepolia,\n MoneyInOutChainId.polygonMumbai,\n ];\n\n throw new Error('Unknown env for getMoneyInOutNetworks');\n}\n\nexport function getReyaNetworkFromMoneyInOutChainId(\n moneyInOutChainId: MoneyInOutChainId,\n): ReyaChainId {\n if (getMoneyInOutNetworks('production').includes(moneyInOutChainId)) {\n return getReyaNetwork('production');\n }\n if (getMoneyInOutNetworks('test').includes(moneyInOutChainId)) {\n return getReyaNetwork('test');\n }\n\n throw new Error(\n 'Unknown money in out network in getReyaNetworkFromMoneyInOutChainId',\n );\n}\n\nexport function getMoneyInOutNetworksFromReyaChainId(\n reyaChainId: ReyaChainId,\n): MoneyInOutChainId[] {\n if (getReyaNetwork('production') === reyaChainId) {\n return getMoneyInOutNetworks('production');\n }\n if (getReyaNetwork('test') === reyaChainId) {\n return getMoneyInOutNetworks('test');\n }\n\n throw new Error(\n 'Unknown money in out network in getMoneyInOutNetworksFromReyaChainId',\n );\n}\n\nexport const chainIdToExplorerURL: Record<number, string> = {\n [MoneyInOutChainId.ethereumMainnet]: 'https://etherscan.io',\n [MoneyInOutChainId.opMainnet]: 'https://optimistic.etherscan.io',\n [MoneyInOutChainId.polygonMainnet]: 'https://polygonscan.com',\n [MoneyInOutChainId.arbitrumOne]: 'https://arbiscan.io',\n [MoneyInOutChainId.polygonMumbai]: 'https://mumbai.polygonscan.com',\n [MoneyInOutChainId.arbitrumSepolia]: 'https://sepolia.arbiscan.io',\n [MoneyInOutChainId.opSepolia]: 'https://sepolia-optimism.etherscan.io',\n [MoneyInOutChainId.ethereumSepolia]: 'https://sepolia.etherscan.io',\n [ReyaChainId.reyaNetwork]: 'https://explorer.reya.network',\n [ReyaChainId.reyaCronos]: 'https://reya-cronos.blockscout.com',\n};\n\nexport const ChainRpcUrls: { [key in MoneyInOutChainId]: string[] } = {\n [MoneyInOutChainId.ethereumMainnet]: [\n 'https://mainnet.gateway.tenderly.co',\n 'https://eth.llamarpc.com',\n ],\n [MoneyInOutChainId.opMainnet]: [\n 'https://mainnet.optimism.io',\n 'https://optimism.llamarpc.com',\n ],\n [MoneyInOutChainId.polygonMainnet]: [\n 'https://polygon-rpc.com',\n 'https://gateway.tenderly.co/public/polygon',\n ],\n [MoneyInOutChainId.arbitrumOne]: [\n 'https://arb1.arbitrum.io/rpc',\n 'https://arbitrum.llamarpc.com',\n ],\n // Add the rest of the mainnet URLs above\n\n [MoneyInOutChainId.polygonMumbai]: [\n 'https://polygon-mumbai.gateway.tenderly.co',\n 'https://polygon-mumbai-bor-rpc.publicnode.com',\n ],\n [MoneyInOutChainId.arbitrumSepolia]: [\n 'https://sepolia-rollup.arbitrum.io/rpc',\n 'https://endpoints.omniatech.io/v1/arbitrum/sepolia/public',\n ],\n [MoneyInOutChainId.opSepolia]: [\n 'https://sepolia.optimism.io',\n 'https://optimism-sepolia.blockpi.network/v1/rpc/public',\n ],\n [MoneyInOutChainId.ethereumSepolia]: [\n 'https://sepolia.gateway.tenderly.co',\n 'https://ethereum-sepolia.blockpi.network/v1/rpc/public',\n ],\n // Add the rest of the testnet URLs above\n};\n\nexport const AlchemyChainRpcUrls: { [key in MoneyInOutChainId]: string } = {\n // mainnet\n [MoneyInOutChainId.ethereumMainnet]: 'https://eth-mainnet.g.alchemy.com/v2',\n [MoneyInOutChainId.opMainnet]: 'https://opt-mainnet.g.alchemy.com/v2',\n [MoneyInOutChainId.polygonMainnet]:\n 'https://polygon-mainnet.g.alchemy.com/v2',\n [MoneyInOutChainId.arbitrumOne]: 'https://arb-mainnet.g.alchemy.com/v2',\n // testnet\n [MoneyInOutChainId.polygonMumbai]: 'https://polygon-mumbai.g.alchemy.com/v2',\n [MoneyInOutChainId.arbitrumSepolia]: 'https://arb-sepolia.g.alchemy.com/v2',\n [MoneyInOutChainId.opSepolia]: 'https://opt-sepolia.g.alchemy.com/v2',\n [MoneyInOutChainId.ethereumSepolia]: 'https://eth-sepolia.g.alchemy.com/v2',\n};\n"]}
@@ -36,11 +36,12 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
36
36
  }
37
37
  };
38
38
  Object.defineProperty(exports, "__esModule", { value: true });
39
- exports.getERC20Balance = exports.getERC20Allowance = exports.getRUSDUnderlyingTokenInfo = exports.getTokenInfosByChain = exports.getTokenInfoByName = exports.getTokenInfoByAddress = exports.convertToAddress = exports.getERC20TokenContract = exports.scale = exports.descale = void 0;
39
+ exports.getERC20BalanceBatch = exports.getERC20Balance = exports.getERC20Allowance = exports.getRUSDUnderlyingTokenInfo = exports.getTokenInfosByChain = exports.getTokenInfoByName = exports.getTokenInfoByAddress = exports.convertToAddress = exports.getERC20TokenContract = exports.scale = exports.descale = void 0;
40
40
  var ethers_1 = require("ethers");
41
41
  var ethers_2 = require("ethers");
42
42
  var token_info_1 = require("./token-info");
43
43
  var retry_1 = require("./retry");
44
+ var network_1 = require("./network");
44
45
  var descale = function (tokenDecimals) {
45
46
  var f = function (value) {
46
47
  return Number(ethers_1.ethers.formatUnits(value.toString(), tokenDecimals));
@@ -167,4 +168,45 @@ var getERC20Balance = function (_a) {
167
168
  });
168
169
  };
169
170
  exports.getERC20Balance = getERC20Balance;
171
+ var getERC20BalanceBatch = function (_a) {
172
+ var tokenAddress = _a.tokenAddress, walletAddress = _a.walletAddress, chain = _a.chain;
173
+ return __awaiter(void 0, void 0, void 0, function () {
174
+ var rpcUrls, lastError, _i, rpcUrls_1, url, provider, token, currentBalance, tokenInfo, error_1;
175
+ return __generator(this, function (_b) {
176
+ switch (_b.label) {
177
+ case 0:
178
+ rpcUrls = network_1.ChainRpcUrls[chain];
179
+ if (!rpcUrls || rpcUrls.length === 0) {
180
+ throw new Error('No RPC URLs configured for the chain: ' + chain);
181
+ }
182
+ lastError = null;
183
+ _i = 0, rpcUrls_1 = rpcUrls;
184
+ _b.label = 1;
185
+ case 1:
186
+ if (!(_i < rpcUrls_1.length)) return [3 /*break*/, 6];
187
+ url = rpcUrls_1[_i];
188
+ _b.label = 2;
189
+ case 2:
190
+ _b.trys.push([2, 4, , 5]);
191
+ provider = new ethers_1.ethers.JsonRpcProvider(url);
192
+ token = (0, exports.getERC20TokenContract)(tokenAddress, provider);
193
+ return [4 /*yield*/, token.balanceOf(walletAddress)];
194
+ case 3:
195
+ currentBalance = _b.sent();
196
+ tokenInfo = (0, exports.getTokenInfoByAddress)((0, exports.convertToAddress)(tokenAddress));
197
+ return [2 /*return*/, (0, exports.descale)(tokenInfo.decimals)(currentBalance)];
198
+ case 4:
199
+ error_1 = _b.sent();
200
+ console.error("Failed to fetch from ".concat(url, ":"), error_1);
201
+ lastError = error_1;
202
+ return [3 /*break*/, 5];
203
+ case 5:
204
+ _i++;
205
+ return [3 /*break*/, 1];
206
+ case 6: throw new Error('All RPC URLs failed; last error: ' + lastError);
207
+ }
208
+ });
209
+ });
210
+ };
211
+ exports.getERC20BalanceBatch = getERC20BalanceBatch;
170
212
  //# sourceMappingURL=token.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"token.js","sourceRoot":"/","sources":["utils/token.ts"],"names":[],"mappings":"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","sourcesContent":["import { ethers, Provider } from 'ethers';\n\nimport { Contract, Signer } from 'ethers';\nimport { TOKEN_INFO } from './token-info';\nimport { exponentialBackoff } from './retry';\nimport {\n Address,\n GetERC20AllowanceParams,\n MoneyInOutChainId,\n ReyaChainId,\n TokenInfo,\n TokenName,\n} from '../types';\nexport const descale = (tokenDecimals: number) => {\n const f = (value: bigint) => {\n return Number(ethers.formatUnits(value.toString(), tokenDecimals));\n };\n\n return f;\n};\n\nexport const scale = (tokenDecimals: number): ((value: number) => bigint) => {\n return (value: number): bigint => {\n // Convert the number to a string\n const valueStr = value.toString();\n // Split the string into whole and fractional parts\n // eslint-disable-next-line prefer-const\n let [whole, fractional = ''] = valueStr.split('.');\n // Ensure the fractional part is the correct length, padding with zeros if necessary\n fractional = fractional\n .padEnd(tokenDecimals, '0')\n .substring(0, tokenDecimals);\n // Concatenate the whole part with the correctly length-limited fractional part\n const scaledValueStr = whole + fractional;\n // Convert the concatenated string to a BigInt, assuming it represents a value in wei (or equivalent smallest unit)\n // This is safe as we're not losing precision - just scaling the number to its smallest unit representation\n return BigInt(scaledValueStr);\n };\n};\n\nexport const getERC20TokenContract = (\n tokenAddress: string,\n subject: Signer | Provider,\n): Contract => {\n const abi: string[] = [\n `function approve(address, uint256) external returns (bool)`,\n `function balanceOf(address) external view returns (uint256)`,\n `function allowance(address,address) external view returns (uint256)`,\n `function approve(address,uint256) external returns (bool)`,\n ];\n\n const contract = new Contract(tokenAddress, abi, subject);\n\n return contract;\n};\n\nexport const convertToAddress = (str: string): Address => {\n return str.toLowerCase() as Address;\n};\n\nexport const getTokenInfoByAddress = (\n tokenAddressParam: Address | string,\n chainId?: ReyaChainId | MoneyInOutChainId,\n): TokenInfo => {\n const tokenAddress =\n typeof tokenAddressParam === 'string'\n ? convertToAddress(tokenAddressParam)\n : tokenAddressParam;\n\n if (chainId) {\n const tokenInfo = TOKEN_INFO[chainId].find(\n (tokenInfo) => tokenInfo.address === tokenAddress,\n );\n if (!tokenInfo) {\n throw new Error(\n `getTokenInfoByAddress: no token info found [chainId ${chainId}, token address ${tokenAddress}]`,\n );\n }\n return tokenInfo;\n } else {\n for (const chainId in TOKEN_INFO) {\n const tokenInfos =\n TOKEN_INFO[chainId as unknown as keyof typeof TOKEN_INFO];\n const tokenInfo = tokenInfos.find(\n (tokenInfo) => tokenInfo.address === tokenAddress,\n );\n if (tokenInfo) {\n return tokenInfo;\n }\n }\n throw new Error(\n `getTokenInfoByAddress: no token info found [token address ${tokenAddress}]`,\n );\n }\n};\n\nexport const getTokenInfoByName = (\n tokenName: TokenName,\n chainId: ReyaChainId | MoneyInOutChainId,\n): TokenInfo => {\n const tokenInfo = TOKEN_INFO[chainId].find(\n (tokenInfo) => tokenInfo.name === tokenName,\n );\n\n if (!tokenInfo) {\n throw new Error(\n `getTokenInfoByName: no token info found [chain id ${chainId}, token name ${tokenName}]`,\n );\n }\n\n return tokenInfo;\n};\n\nexport const getTokenInfosByChain = (\n chainId: ReyaChainId | MoneyInOutChainId,\n): TokenInfo[] => {\n return TOKEN_INFO[chainId];\n};\n\nexport const getRUSDUnderlyingTokenInfo = (\n chainId: ReyaChainId | MoneyInOutChainId,\n): TokenInfo => {\n const tokenInfo = TOKEN_INFO[chainId].find(\n (tokenInfo) => tokenInfo.isRUSDUnderlying === true,\n );\n\n if (!tokenInfo) {\n throw new Error(\n `getRUSDUnderlyingTokenInfo: no token info found [chain id ${chainId}]`,\n );\n }\n\n return tokenInfo;\n};\n\nexport const getERC20Allowance = async ({\n walletAddress,\n tokenAddress,\n spenderAddress,\n subject,\n}: GetERC20AllowanceParams): Promise<number> => {\n const tokenContract = getERC20TokenContract(tokenAddress, subject);\n const tokenInfo = getTokenInfoByAddress(tokenAddress);\n\n const allowance = await exponentialBackoff(() =>\n tokenContract.allowance(walletAddress, spenderAddress),\n );\n\n return BigInt(allowance) > scale(tokenInfo.decimals)(Number.MAX_SAFE_INTEGER)\n ? Number.MAX_SAFE_INTEGER\n : descale(tokenInfo.decimals)(allowance);\n};\n\nexport type GetERC20BalanceArgs = {\n tokenAddress: string;\n walletAddress: string;\n subject: Signer | Provider;\n};\n\nexport type GetBalancesForBridgeArgs = {\n walletAddress: string;\n};\n\nexport const getERC20Balance = async ({\n tokenAddress,\n walletAddress,\n subject,\n}: GetERC20BalanceArgs): Promise<number> => {\n const token = getERC20TokenContract(tokenAddress, subject);\n\n const tokenInfo = getTokenInfoByAddress(convertToAddress(tokenAddress));\n\n const currentBalance = await exponentialBackoff(() =>\n token.balanceOf(walletAddress),\n );\n\n return descale(tokenInfo.decimals)(currentBalance);\n};\n"]}
1
+ {"version":3,"file":"token.js","sourceRoot":"/","sources":["utils/token.ts"],"names":[],"mappings":"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","sourcesContent":["import { ethers, Provider } from 'ethers';\n\nimport { Contract, Signer } from 'ethers';\nimport { TOKEN_INFO } from './token-info';\nimport { exponentialBackoff } from './retry';\nimport {\n Address,\n GetERC20AllowanceParams,\n MoneyInOutChainId,\n ReyaChainId,\n TokenInfo,\n TokenName,\n} from '../types';\nimport { ChainRpcUrls } from './network';\nexport const descale = (tokenDecimals: number) => {\n const f = (value: bigint) => {\n return Number(ethers.formatUnits(value.toString(), tokenDecimals));\n };\n\n return f;\n};\n\nexport const scale = (tokenDecimals: number): ((value: number) => bigint) => {\n return (value: number): bigint => {\n // Convert the number to a string\n const valueStr = value.toString();\n // Split the string into whole and fractional parts\n // eslint-disable-next-line prefer-const\n let [whole, fractional = ''] = valueStr.split('.');\n // Ensure the fractional part is the correct length, padding with zeros if necessary\n fractional = fractional\n .padEnd(tokenDecimals, '0')\n .substring(0, tokenDecimals);\n // Concatenate the whole part with the correctly length-limited fractional part\n const scaledValueStr = whole + fractional;\n // Convert the concatenated string to a BigInt, assuming it represents a value in wei (or equivalent smallest unit)\n // This is safe as we're not losing precision - just scaling the number to its smallest unit representation\n return BigInt(scaledValueStr);\n };\n};\n\nexport const getERC20TokenContract = (\n tokenAddress: string,\n subject: Signer | Provider,\n): Contract => {\n const abi: string[] = [\n `function approve(address, uint256) external returns (bool)`,\n `function balanceOf(address) external view returns (uint256)`,\n `function allowance(address,address) external view returns (uint256)`,\n `function approve(address,uint256) external returns (bool)`,\n ];\n\n const contract = new Contract(tokenAddress, abi, subject);\n\n return contract;\n};\n\nexport const convertToAddress = (str: string): Address => {\n return str.toLowerCase() as Address;\n};\n\nexport const getTokenInfoByAddress = (\n tokenAddressParam: Address | string,\n chainId?: ReyaChainId | MoneyInOutChainId,\n): TokenInfo => {\n const tokenAddress =\n typeof tokenAddressParam === 'string'\n ? convertToAddress(tokenAddressParam)\n : tokenAddressParam;\n\n if (chainId) {\n const tokenInfo = TOKEN_INFO[chainId].find(\n (tokenInfo) => tokenInfo.address === tokenAddress,\n );\n if (!tokenInfo) {\n throw new Error(\n `getTokenInfoByAddress: no token info found [chainId ${chainId}, token address ${tokenAddress}]`,\n );\n }\n return tokenInfo;\n } else {\n for (const chainId in TOKEN_INFO) {\n const tokenInfos =\n TOKEN_INFO[chainId as unknown as keyof typeof TOKEN_INFO];\n const tokenInfo = tokenInfos.find(\n (tokenInfo) => tokenInfo.address === tokenAddress,\n );\n if (tokenInfo) {\n return tokenInfo;\n }\n }\n throw new Error(\n `getTokenInfoByAddress: no token info found [token address ${tokenAddress}]`,\n );\n }\n};\n\nexport const getTokenInfoByName = (\n tokenName: TokenName,\n chainId: ReyaChainId | MoneyInOutChainId,\n): TokenInfo => {\n const tokenInfo = TOKEN_INFO[chainId].find(\n (tokenInfo) => tokenInfo.name === tokenName,\n );\n\n if (!tokenInfo) {\n throw new Error(\n `getTokenInfoByName: no token info found [chain id ${chainId}, token name ${tokenName}]`,\n );\n }\n\n return tokenInfo;\n};\n\nexport const getTokenInfosByChain = (\n chainId: ReyaChainId | MoneyInOutChainId,\n): TokenInfo[] => {\n return TOKEN_INFO[chainId];\n};\n\nexport const getRUSDUnderlyingTokenInfo = (\n chainId: ReyaChainId | MoneyInOutChainId,\n): TokenInfo => {\n const tokenInfo = TOKEN_INFO[chainId].find(\n (tokenInfo) => tokenInfo.isRUSDUnderlying === true,\n );\n\n if (!tokenInfo) {\n throw new Error(\n `getRUSDUnderlyingTokenInfo: no token info found [chain id ${chainId}]`,\n );\n }\n\n return tokenInfo;\n};\n\nexport const getERC20Allowance = async ({\n walletAddress,\n tokenAddress,\n spenderAddress,\n subject,\n}: GetERC20AllowanceParams): Promise<number> => {\n const tokenContract = getERC20TokenContract(tokenAddress, subject);\n const tokenInfo = getTokenInfoByAddress(tokenAddress);\n\n const allowance = await exponentialBackoff(() =>\n tokenContract.allowance(walletAddress, spenderAddress),\n );\n\n return BigInt(allowance) > scale(tokenInfo.decimals)(Number.MAX_SAFE_INTEGER)\n ? Number.MAX_SAFE_INTEGER\n : descale(tokenInfo.decimals)(allowance);\n};\n\nexport type GetERC20BalanceArgs = {\n tokenAddress: string;\n walletAddress: string;\n subject: Signer | Provider;\n};\n\nexport type GetERC20BalanceBatchArgs = {\n tokenAddress: string;\n walletAddress: string;\n chain: MoneyInOutChainId;\n};\n\nexport type GetBalancesForBridgeArgs = {\n walletAddress: string;\n};\n\nexport const getERC20Balance = async ({\n tokenAddress,\n walletAddress,\n subject,\n}: GetERC20BalanceArgs): Promise<number> => {\n const token = getERC20TokenContract(tokenAddress, subject);\n\n const tokenInfo = getTokenInfoByAddress(convertToAddress(tokenAddress));\n\n const currentBalance = await exponentialBackoff(() =>\n token.balanceOf(walletAddress),\n );\n\n return descale(tokenInfo.decimals)(currentBalance);\n};\n\nexport const getERC20BalanceBatch = async ({\n tokenAddress,\n walletAddress,\n chain,\n}: GetERC20BalanceBatchArgs): Promise<number> => {\n const rpcUrls = ChainRpcUrls[chain];\n if (!rpcUrls || rpcUrls.length === 0) {\n throw new Error('No RPC URLs configured for the chain: ' + chain);\n }\n\n let lastError = null;\n\n for (const url of rpcUrls) {\n try {\n const provider = new ethers.JsonRpcProvider(url);\n const token = getERC20TokenContract(tokenAddress, provider);\n const currentBalance = await token.balanceOf(walletAddress);\n\n const tokenInfo = getTokenInfoByAddress(convertToAddress(tokenAddress));\n return descale(tokenInfo.decimals)(currentBalance);\n } catch (error) {\n console.error(`Failed to fetch from ${url}:`, error);\n lastError = error;\n }\n }\n\n throw new Error('All RPC URLs failed; last error: ' + lastError);\n};\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@reyaxyz/common",
3
- "version": "0.77.0",
3
+ "version": "0.79.0",
4
4
  "publishConfig": {
5
5
  "access": "public",
6
6
  "registry": "https://registry.npmjs.org"
@@ -41,6 +41,6 @@
41
41
  "test:coverage": "npx jest test --coverage",
42
42
  "generate:coverage-badges": "npx istanbul-badges-readme --silent"
43
43
  },
44
- "packageManager": "pnpm@8.10.4",
45
- "gitHead": "65155ffba41042349cbe4aa43c904ea11c40bdec"
44
+ "packageManager": "pnpm@9.0.1",
45
+ "gitHead": "9ab576f5f2f329ae044cb5d49e388aab2a5fdf30"
46
46
  }
@@ -72,17 +72,41 @@ export const chainIdToExplorerURL: Record<number, string> = {
72
72
  [ReyaChainId.reyaCronos]: 'https://reya-cronos.blockscout.com',
73
73
  };
74
74
 
75
- export const ChainRpcUrls: { [key in MoneyInOutChainId]: string } = {
76
- [MoneyInOutChainId.ethereumMainnet]: 'https://mainnet.gateway.tenderly.co',
77
- [MoneyInOutChainId.opMainnet]: 'https://mainnet.optimism.io',
78
- [MoneyInOutChainId.polygonMainnet]: 'https://polygon-rpc.com/',
79
- [MoneyInOutChainId.arbitrumOne]: 'https://arb1.arbitrum.io/rpc',
75
+ export const ChainRpcUrls: { [key in MoneyInOutChainId]: string[] } = {
76
+ [MoneyInOutChainId.ethereumMainnet]: [
77
+ 'https://mainnet.gateway.tenderly.co',
78
+ 'https://eth.llamarpc.com',
79
+ ],
80
+ [MoneyInOutChainId.opMainnet]: [
81
+ 'https://mainnet.optimism.io',
82
+ 'https://optimism.llamarpc.com',
83
+ ],
84
+ [MoneyInOutChainId.polygonMainnet]: [
85
+ 'https://polygon-rpc.com',
86
+ 'https://gateway.tenderly.co/public/polygon',
87
+ ],
88
+ [MoneyInOutChainId.arbitrumOne]: [
89
+ 'https://arb1.arbitrum.io/rpc',
90
+ 'https://arbitrum.llamarpc.com',
91
+ ],
80
92
  // Add the rest of the mainnet URLs above
81
93
 
82
- [MoneyInOutChainId.polygonMumbai]: 'https://rpc.ankr.com/polygon_mumbai',
83
- [MoneyInOutChainId.arbitrumSepolia]: 'https://sepolia-rollup.arbitrum.io/rpc',
84
- [MoneyInOutChainId.opSepolia]: 'https://sepolia.optimism.io',
85
- [MoneyInOutChainId.ethereumSepolia]: 'https://sepolia.gateway.tenderly.co',
94
+ [MoneyInOutChainId.polygonMumbai]: [
95
+ 'https://polygon-mumbai.gateway.tenderly.co',
96
+ 'https://polygon-mumbai-bor-rpc.publicnode.com',
97
+ ],
98
+ [MoneyInOutChainId.arbitrumSepolia]: [
99
+ 'https://sepolia-rollup.arbitrum.io/rpc',
100
+ 'https://endpoints.omniatech.io/v1/arbitrum/sepolia/public',
101
+ ],
102
+ [MoneyInOutChainId.opSepolia]: [
103
+ 'https://sepolia.optimism.io',
104
+ 'https://optimism-sepolia.blockpi.network/v1/rpc/public',
105
+ ],
106
+ [MoneyInOutChainId.ethereumSepolia]: [
107
+ 'https://sepolia.gateway.tenderly.co',
108
+ 'https://ethereum-sepolia.blockpi.network/v1/rpc/public',
109
+ ],
86
110
  // Add the rest of the testnet URLs above
87
111
  };
88
112
 
@@ -11,6 +11,7 @@ import {
11
11
  TokenInfo,
12
12
  TokenName,
13
13
  } from '../types';
14
+ import { ChainRpcUrls } from './network';
14
15
  export const descale = (tokenDecimals: number) => {
15
16
  const f = (value: bigint) => {
16
17
  return Number(ethers.formatUnits(value.toString(), tokenDecimals));
@@ -157,6 +158,12 @@ export type GetERC20BalanceArgs = {
157
158
  subject: Signer | Provider;
158
159
  };
159
160
 
161
+ export type GetERC20BalanceBatchArgs = {
162
+ tokenAddress: string;
163
+ walletAddress: string;
164
+ chain: MoneyInOutChainId;
165
+ };
166
+
160
167
  export type GetBalancesForBridgeArgs = {
161
168
  walletAddress: string;
162
169
  };
@@ -176,3 +183,32 @@ export const getERC20Balance = async ({
176
183
 
177
184
  return descale(tokenInfo.decimals)(currentBalance);
178
185
  };
186
+
187
+ export const getERC20BalanceBatch = async ({
188
+ tokenAddress,
189
+ walletAddress,
190
+ chain,
191
+ }: GetERC20BalanceBatchArgs): Promise<number> => {
192
+ const rpcUrls = ChainRpcUrls[chain];
193
+ if (!rpcUrls || rpcUrls.length === 0) {
194
+ throw new Error('No RPC URLs configured for the chain: ' + chain);
195
+ }
196
+
197
+ let lastError = null;
198
+
199
+ for (const url of rpcUrls) {
200
+ try {
201
+ const provider = new ethers.JsonRpcProvider(url);
202
+ const token = getERC20TokenContract(tokenAddress, provider);
203
+ const currentBalance = await token.balanceOf(walletAddress);
204
+
205
+ const tokenInfo = getTokenInfoByAddress(convertToAddress(tokenAddress));
206
+ return descale(tokenInfo.decimals)(currentBalance);
207
+ } catch (error) {
208
+ console.error(`Failed to fetch from ${url}:`, error);
209
+ lastError = error;
210
+ }
211
+ }
212
+
213
+ throw new Error('All RPC URLs failed; last error: ' + lastError);
214
+ };