@sidhujag/sysweb3-keyring 1.0.545 → 1.0.547

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.
Files changed (212) hide show
  1. package/coverage/clover.xml +2875 -0
  2. package/coverage/coverage-final.json +29468 -0
  3. package/coverage/lcov-report/base.css +354 -0
  4. package/coverage/lcov-report/block-navigation.js +85 -0
  5. package/coverage/lcov-report/favicon.png +0 -0
  6. package/coverage/lcov-report/index.html +320 -0
  7. package/coverage/lcov-report/prettify.css +101 -0
  8. package/coverage/lcov-report/prettify.js +1008 -0
  9. package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  10. package/coverage/lcov-report/sorter.js +191 -0
  11. package/coverage/lcov-report/src/index.html +276 -0
  12. package/coverage/lcov-report/src/index.ts.html +114 -0
  13. package/coverage/lcov-report/src/initial-state.ts.html +558 -0
  14. package/coverage/lcov-report/src/keyring-manager.ts.html +6279 -0
  15. package/coverage/lcov-report/src/ledger/bitcoin_client/index.html +178 -0
  16. package/coverage/lcov-report/src/ledger/bitcoin_client/index.ts.html +144 -0
  17. package/coverage/lcov-report/src/ledger/bitcoin_client/lib/appClient.ts.html +1560 -0
  18. package/coverage/lcov-report/src/ledger/bitcoin_client/lib/bip32.ts.html +276 -0
  19. package/coverage/lcov-report/src/ledger/bitcoin_client/lib/buffertools.ts.html +495 -0
  20. package/coverage/lcov-report/src/ledger/bitcoin_client/lib/clientCommands.ts.html +1138 -0
  21. package/coverage/lcov-report/src/ledger/bitcoin_client/lib/index.html +363 -0
  22. package/coverage/lcov-report/src/ledger/bitcoin_client/lib/merkelizedPsbt.ts.html +289 -0
  23. package/coverage/lcov-report/src/ledger/bitcoin_client/lib/merkle.ts.html +486 -0
  24. package/coverage/lcov-report/src/ledger/bitcoin_client/lib/merkleMap.ts.html +240 -0
  25. package/coverage/lcov-report/src/ledger/bitcoin_client/lib/policy.ts.html +342 -0
  26. package/coverage/lcov-report/src/ledger/bitcoin_client/lib/psbtv2.ts.html +2388 -0
  27. package/coverage/lcov-report/src/ledger/bitcoin_client/lib/varint.ts.html +453 -0
  28. package/coverage/lcov-report/src/ledger/consts.ts.html +177 -0
  29. package/coverage/lcov-report/src/ledger/index.html +216 -0
  30. package/coverage/lcov-report/src/ledger/index.ts.html +1371 -0
  31. package/coverage/lcov-report/src/ledger/utils.ts.html +102 -0
  32. package/coverage/lcov-report/src/signers.ts.html +591 -0
  33. package/coverage/lcov-report/src/storage.ts.html +198 -0
  34. package/coverage/lcov-report/src/transactions/ethereum.ts.html +5826 -0
  35. package/coverage/lcov-report/src/transactions/index.html +216 -0
  36. package/coverage/lcov-report/src/transactions/index.ts.html +93 -0
  37. package/coverage/lcov-report/src/transactions/syscoin.ts.html +1521 -0
  38. package/coverage/lcov-report/src/trezor/index.html +176 -0
  39. package/coverage/lcov-report/src/trezor/index.ts.html +2655 -0
  40. package/coverage/lcov-report/src/types.ts.html +1443 -0
  41. package/coverage/lcov-report/src/utils/derivation-paths.ts.html +486 -0
  42. package/coverage/lcov-report/src/utils/index.html +196 -0
  43. package/coverage/lcov-report/src/utils/psbt.ts.html +159 -0
  44. package/coverage/lcov-report/test/helpers/constants.ts.html +627 -0
  45. package/coverage/lcov-report/test/helpers/index.html +176 -0
  46. package/coverage/lcov.info +4832 -0
  47. package/{cjs → dist/cjs}/ledger/bitcoin_client/lib/appClient.js +1 -124
  48. package/dist/cjs/ledger/bitcoin_client/lib/appClient.js.map +1 -0
  49. package/{cjs → dist/cjs}/transactions/ethereum.js +6 -2
  50. package/dist/cjs/transactions/ethereum.js.map +1 -0
  51. package/dist/package.json +50 -0
  52. package/{types → dist/types}/ledger/bitcoin_client/lib/appClient.d.ts +0 -6
  53. package/examples/basic-usage.js +140 -0
  54. package/jest.config.js +32 -0
  55. package/package.json +31 -13
  56. package/readme.md +201 -0
  57. package/src/declare.d.ts +7 -0
  58. package/src/errorUtils.ts +83 -0
  59. package/src/hardware-wallet-manager.ts +655 -0
  60. package/src/index.ts +12 -0
  61. package/src/initial-state.ts +108 -0
  62. package/src/keyring-manager.ts +2698 -0
  63. package/src/ledger/bitcoin_client/index.ts +19 -0
  64. package/src/ledger/bitcoin_client/lib/appClient.ts +405 -0
  65. package/src/ledger/bitcoin_client/lib/bip32.ts +61 -0
  66. package/src/ledger/bitcoin_client/lib/buffertools.ts +134 -0
  67. package/src/ledger/bitcoin_client/lib/clientCommands.ts +356 -0
  68. package/src/ledger/bitcoin_client/lib/constants.ts +12 -0
  69. package/src/ledger/bitcoin_client/lib/merkelizedPsbt.ts +65 -0
  70. package/src/ledger/bitcoin_client/lib/merkle.ts +136 -0
  71. package/src/ledger/bitcoin_client/lib/merkleMap.ts +49 -0
  72. package/src/ledger/bitcoin_client/lib/policy.ts +91 -0
  73. package/src/ledger/bitcoin_client/lib/psbtv2.ts +768 -0
  74. package/src/ledger/bitcoin_client/lib/varint.ts +120 -0
  75. package/src/ledger/consts.ts +3 -0
  76. package/src/ledger/index.ts +685 -0
  77. package/src/ledger/types.ts +74 -0
  78. package/src/network-utils.ts +99 -0
  79. package/src/providers.ts +345 -0
  80. package/src/signers.ts +158 -0
  81. package/src/storage.ts +63 -0
  82. package/src/transactions/__tests__/integration.test.ts +303 -0
  83. package/src/transactions/__tests__/syscoin.test.ts +409 -0
  84. package/src/transactions/ethereum.ts +2503 -0
  85. package/src/transactions/index.ts +2 -0
  86. package/src/transactions/syscoin.ts +542 -0
  87. package/src/trezor/index.ts +1050 -0
  88. package/src/types.ts +366 -0
  89. package/src/utils/derivation-paths.ts +133 -0
  90. package/src/utils/psbt.ts +24 -0
  91. package/src/utils.ts +191 -0
  92. package/test/README.md +158 -0
  93. package/test/__mocks__/ledger-mock.js +20 -0
  94. package/test/__mocks__/trezor-mock.js +75 -0
  95. package/test/cleanup-summary.md +167 -0
  96. package/test/helpers/README.md +78 -0
  97. package/test/helpers/constants.ts +79 -0
  98. package/test/helpers/setup.ts +714 -0
  99. package/test/integration/import-validation.spec.ts +588 -0
  100. package/test/unit/hardware/ledger.spec.ts +869 -0
  101. package/test/unit/hardware/trezor.spec.ts +828 -0
  102. package/test/unit/keyring-manager/account-management.spec.ts +970 -0
  103. package/test/unit/keyring-manager/import-watchonly.spec.ts +181 -0
  104. package/test/unit/keyring-manager/import-wif.spec.ts +126 -0
  105. package/test/unit/keyring-manager/initialization.spec.ts +782 -0
  106. package/test/unit/keyring-manager/key-derivation.spec.ts +996 -0
  107. package/test/unit/keyring-manager/security.spec.ts +505 -0
  108. package/test/unit/keyring-manager/state-management.spec.ts +375 -0
  109. package/test/unit/network/network-management.spec.ts +372 -0
  110. package/test/unit/transactions/ethereum-transactions.spec.ts +382 -0
  111. package/test/unit/transactions/syscoin-transactions.spec.ts +615 -0
  112. package/tsconfig.json +14 -0
  113. package/cjs/ledger/bitcoin_client/lib/appClient.js.map +0 -1
  114. package/cjs/transactions/ethereum.js.map +0 -1
  115. /package/{README.md → dist/README.md} +0 -0
  116. /package/{cjs → dist/cjs}/errorUtils.js +0 -0
  117. /package/{cjs → dist/cjs}/errorUtils.js.map +0 -0
  118. /package/{cjs → dist/cjs}/hardware-wallet-manager.js +0 -0
  119. /package/{cjs → dist/cjs}/hardware-wallet-manager.js.map +0 -0
  120. /package/{cjs → dist/cjs}/index.js +0 -0
  121. /package/{cjs → dist/cjs}/index.js.map +0 -0
  122. /package/{cjs → dist/cjs}/initial-state.js +0 -0
  123. /package/{cjs → dist/cjs}/initial-state.js.map +0 -0
  124. /package/{cjs → dist/cjs}/keyring-manager.js +0 -0
  125. /package/{cjs → dist/cjs}/keyring-manager.js.map +0 -0
  126. /package/{cjs → dist/cjs}/ledger/bitcoin_client/index.js +0 -0
  127. /package/{cjs → dist/cjs}/ledger/bitcoin_client/index.js.map +0 -0
  128. /package/{cjs → dist/cjs}/ledger/bitcoin_client/lib/bip32.js +0 -0
  129. /package/{cjs → dist/cjs}/ledger/bitcoin_client/lib/bip32.js.map +0 -0
  130. /package/{cjs → dist/cjs}/ledger/bitcoin_client/lib/buffertools.js +0 -0
  131. /package/{cjs → dist/cjs}/ledger/bitcoin_client/lib/buffertools.js.map +0 -0
  132. /package/{cjs → dist/cjs}/ledger/bitcoin_client/lib/clientCommands.js +0 -0
  133. /package/{cjs → dist/cjs}/ledger/bitcoin_client/lib/clientCommands.js.map +0 -0
  134. /package/{cjs → dist/cjs}/ledger/bitcoin_client/lib/constants.js +0 -0
  135. /package/{cjs → dist/cjs}/ledger/bitcoin_client/lib/constants.js.map +0 -0
  136. /package/{cjs → dist/cjs}/ledger/bitcoin_client/lib/merkelizedPsbt.js +0 -0
  137. /package/{cjs → dist/cjs}/ledger/bitcoin_client/lib/merkelizedPsbt.js.map +0 -0
  138. /package/{cjs → dist/cjs}/ledger/bitcoin_client/lib/merkle.js +0 -0
  139. /package/{cjs → dist/cjs}/ledger/bitcoin_client/lib/merkle.js.map +0 -0
  140. /package/{cjs → dist/cjs}/ledger/bitcoin_client/lib/merkleMap.js +0 -0
  141. /package/{cjs → dist/cjs}/ledger/bitcoin_client/lib/merkleMap.js.map +0 -0
  142. /package/{cjs → dist/cjs}/ledger/bitcoin_client/lib/policy.js +0 -0
  143. /package/{cjs → dist/cjs}/ledger/bitcoin_client/lib/policy.js.map +0 -0
  144. /package/{cjs → dist/cjs}/ledger/bitcoin_client/lib/psbtv2.js +0 -0
  145. /package/{cjs → dist/cjs}/ledger/bitcoin_client/lib/psbtv2.js.map +0 -0
  146. /package/{cjs → dist/cjs}/ledger/bitcoin_client/lib/varint.js +0 -0
  147. /package/{cjs → dist/cjs}/ledger/bitcoin_client/lib/varint.js.map +0 -0
  148. /package/{cjs → dist/cjs}/ledger/consts.js +0 -0
  149. /package/{cjs → dist/cjs}/ledger/consts.js.map +0 -0
  150. /package/{cjs → dist/cjs}/ledger/index.js +0 -0
  151. /package/{cjs → dist/cjs}/ledger/index.js.map +0 -0
  152. /package/{cjs → dist/cjs}/ledger/types.js +0 -0
  153. /package/{cjs → dist/cjs}/ledger/types.js.map +0 -0
  154. /package/{cjs → dist/cjs}/network-utils.js +0 -0
  155. /package/{cjs → dist/cjs}/network-utils.js.map +0 -0
  156. /package/{cjs → dist/cjs}/providers.js +0 -0
  157. /package/{cjs → dist/cjs}/providers.js.map +0 -0
  158. /package/{cjs → dist/cjs}/signers.js +0 -0
  159. /package/{cjs → dist/cjs}/signers.js.map +0 -0
  160. /package/{cjs → dist/cjs}/storage.js +0 -0
  161. /package/{cjs → dist/cjs}/storage.js.map +0 -0
  162. /package/{cjs → dist/cjs}/transactions/__tests__/integration.test.js +0 -0
  163. /package/{cjs → dist/cjs}/transactions/__tests__/integration.test.js.map +0 -0
  164. /package/{cjs → dist/cjs}/transactions/__tests__/syscoin.test.js +0 -0
  165. /package/{cjs → dist/cjs}/transactions/__tests__/syscoin.test.js.map +0 -0
  166. /package/{cjs → dist/cjs}/transactions/index.js +0 -0
  167. /package/{cjs → dist/cjs}/transactions/index.js.map +0 -0
  168. /package/{cjs → dist/cjs}/transactions/syscoin.js +0 -0
  169. /package/{cjs → dist/cjs}/transactions/syscoin.js.map +0 -0
  170. /package/{cjs → dist/cjs}/trezor/index.js +0 -0
  171. /package/{cjs → dist/cjs}/trezor/index.js.map +0 -0
  172. /package/{cjs → dist/cjs}/types.js +0 -0
  173. /package/{cjs → dist/cjs}/types.js.map +0 -0
  174. /package/{cjs → dist/cjs}/utils/derivation-paths.js +0 -0
  175. /package/{cjs → dist/cjs}/utils/derivation-paths.js.map +0 -0
  176. /package/{cjs → dist/cjs}/utils/psbt.js +0 -0
  177. /package/{cjs → dist/cjs}/utils/psbt.js.map +0 -0
  178. /package/{cjs → dist/cjs}/utils.js +0 -0
  179. /package/{cjs → dist/cjs}/utils.js.map +0 -0
  180. /package/{types → dist/types}/errorUtils.d.ts +0 -0
  181. /package/{types → dist/types}/hardware-wallet-manager.d.ts +0 -0
  182. /package/{types → dist/types}/index.d.ts +0 -0
  183. /package/{types → dist/types}/initial-state.d.ts +0 -0
  184. /package/{types → dist/types}/keyring-manager.d.ts +0 -0
  185. /package/{types → dist/types}/ledger/bitcoin_client/index.d.ts +0 -0
  186. /package/{types → dist/types}/ledger/bitcoin_client/lib/bip32.d.ts +0 -0
  187. /package/{types → dist/types}/ledger/bitcoin_client/lib/buffertools.d.ts +0 -0
  188. /package/{types → dist/types}/ledger/bitcoin_client/lib/clientCommands.d.ts +0 -0
  189. /package/{types → dist/types}/ledger/bitcoin_client/lib/constants.d.ts +0 -0
  190. /package/{types → dist/types}/ledger/bitcoin_client/lib/merkelizedPsbt.d.ts +0 -0
  191. /package/{types → dist/types}/ledger/bitcoin_client/lib/merkle.d.ts +0 -0
  192. /package/{types → dist/types}/ledger/bitcoin_client/lib/merkleMap.d.ts +0 -0
  193. /package/{types → dist/types}/ledger/bitcoin_client/lib/policy.d.ts +0 -0
  194. /package/{types → dist/types}/ledger/bitcoin_client/lib/psbtv2.d.ts +0 -0
  195. /package/{types → dist/types}/ledger/bitcoin_client/lib/varint.d.ts +0 -0
  196. /package/{types → dist/types}/ledger/consts.d.ts +0 -0
  197. /package/{types → dist/types}/ledger/index.d.ts +0 -0
  198. /package/{types → dist/types}/ledger/types.d.ts +0 -0
  199. /package/{types → dist/types}/network-utils.d.ts +0 -0
  200. /package/{types → dist/types}/providers.d.ts +0 -0
  201. /package/{types → dist/types}/signers.d.ts +0 -0
  202. /package/{types → dist/types}/storage.d.ts +0 -0
  203. /package/{types → dist/types}/transactions/__tests__/integration.test.d.ts +0 -0
  204. /package/{types → dist/types}/transactions/__tests__/syscoin.test.d.ts +0 -0
  205. /package/{types → dist/types}/transactions/ethereum.d.ts +0 -0
  206. /package/{types → dist/types}/transactions/index.d.ts +0 -0
  207. /package/{types → dist/types}/transactions/syscoin.d.ts +0 -0
  208. /package/{types → dist/types}/trezor/index.d.ts +0 -0
  209. /package/{types → dist/types}/types.d.ts +0 -0
  210. /package/{types → dist/types}/utils/derivation-paths.d.ts +0 -0
  211. /package/{types → dist/types}/utils/psbt.d.ts +0 -0
  212. /package/{types → dist/types}/utils.d.ts +0 -0
@@ -0,0 +1,74 @@
1
+ import { SignTypedDataVersion } from '@metamask/eth-sig-util';
2
+
3
+ export interface IUTXOMethods {
4
+ getUtxoAddress: ({
5
+ coin,
6
+ index,
7
+ slip44,
8
+ }: {
9
+ coin: string;
10
+ index: number;
11
+ slip44: number;
12
+ }) => Promise<string>;
13
+ getXpub: ({
14
+ index,
15
+ coin,
16
+ slip44,
17
+ }: {
18
+ coin: string;
19
+ index: number;
20
+ slip44: number;
21
+ }) => Promise<string>;
22
+ verifyUtxoAddress: (
23
+ accountIndex: number,
24
+ currency: string,
25
+ slip44: number
26
+ ) => Promise<string>;
27
+ }
28
+
29
+ interface MessageTypeProperty {
30
+ name: string;
31
+ type: string;
32
+ }
33
+ export interface MessageTypes {
34
+ [additionalProperties: string]: MessageTypeProperty[];
35
+ EIP712Domain: MessageTypeProperty[];
36
+ }
37
+
38
+ export interface IEvmMethods {
39
+ getEvmAddressAndPubKey: ({
40
+ accountIndex,
41
+ }: {
42
+ accountIndex: number;
43
+ }) => Promise<{
44
+ address: string;
45
+ publicKey: string;
46
+ }>;
47
+ signEVMTransaction: ({
48
+ rawTx,
49
+ accountIndex,
50
+ }: {
51
+ accountIndex: number;
52
+ rawTx: string;
53
+ }) => Promise<{
54
+ r: string;
55
+ s: string;
56
+ v: string;
57
+ }>;
58
+ signPersonalMessage: ({
59
+ message,
60
+ accountIndex,
61
+ }: {
62
+ accountIndex: number;
63
+ message: string;
64
+ }) => Promise<string>;
65
+ signTypedData: ({
66
+ version,
67
+ data,
68
+ accountIndex,
69
+ }: {
70
+ accountIndex: number;
71
+ data: any;
72
+ version: SignTypedDataVersion;
73
+ }) => Promise<string>;
74
+ }
@@ -0,0 +1,99 @@
1
+ import {
2
+ INetwork,
3
+ INetworkType,
4
+ coins as utxoCoins,
5
+ } from '@sidhujag/sysweb3-network';
6
+
7
+ /**
8
+ * Generate default UTXO networks from coins.ts data
9
+ * This ensures consistency and avoids hardcoded duplicates
10
+ */
11
+ export function getDefaultUTXONetworks(): { [chainId: number]: INetwork } {
12
+ const defaultNetworks: { [chainId: number]: INetwork } = {};
13
+
14
+ // Filter coins that should be default networks
15
+ const defaultCoins = utxoCoins.filter((coin) => {
16
+ // Include Syscoin mainnet and testnet as defaults
17
+ return (
18
+ (coin.coinShortcut === 'SYS' && coin.slip44 === 57) || // Syscoin Mainnet
19
+ (coin.coinShortcut === 'tSYS' && coin.slip44 === 1) || // Syscoin Testnet
20
+ (coin.coinShortcut === 'BTC' && coin.slip44 === 0) // Bitcoin Mainnet only
21
+ );
22
+ });
23
+
24
+ defaultCoins.forEach((coin) => {
25
+ if (
26
+ !coin.blockchainLink ||
27
+ !coin.blockchainLink.url ||
28
+ coin.blockchainLink.url.length === 0
29
+ ) {
30
+ return; // Skip coins without valid blockbook URLs
31
+ }
32
+
33
+ // Use primary blockbook URL
34
+ const primaryUrl = Array.isArray(coin.blockchainLink.url)
35
+ ? coin.blockchainLink.url[0]
36
+ : coin.blockchainLink.url;
37
+
38
+ const chainId = (coin as any).chainId || coin.slip44;
39
+
40
+ const network: INetwork = {
41
+ chainId,
42
+ url: primaryUrl,
43
+ label: coin.name || coin.coinLabel || `${coin.coinShortcut} Network`,
44
+ default: coin.coinShortcut === 'SYS',
45
+ currency: coin.coinShortcut?.toLowerCase() || 'unknown',
46
+ slip44: coin.slip44,
47
+ kind: INetworkType.Syscoin,
48
+ };
49
+
50
+ defaultNetworks[chainId] = network;
51
+ });
52
+
53
+ return defaultNetworks;
54
+ }
55
+
56
+ /**
57
+ * Get specific default UTXO networks for backwards compatibility
58
+ */
59
+ export function getSyscoinUTXOMainnetNetwork(): INetwork {
60
+ const networks = getDefaultUTXONetworks();
61
+ // Find Syscoin mainnet (slip44: 57)
62
+ const syscoinMainnet = Object.values(networks).find(
63
+ (network) => network.slip44 === 57 && network.currency === 'sys'
64
+ );
65
+
66
+ if (!syscoinMainnet) {
67
+ throw new Error('Syscoin UTXO Mainnet network not found in coins.ts');
68
+ }
69
+
70
+ return syscoinMainnet;
71
+ }
72
+
73
+ export function getSyscoinUTXOTestnetNetwork(): INetwork {
74
+ const networks = getDefaultUTXONetworks();
75
+ // Find Syscoin testnet (slip44: 1, currency: tsys)
76
+ const syscoinTestnet = Object.values(networks).find(
77
+ (network) => network.slip44 === 1 && network.currency === 'tsys'
78
+ );
79
+
80
+ if (!syscoinTestnet) {
81
+ throw new Error('Syscoin UTXO Testnet network not found in coins.ts');
82
+ }
83
+
84
+ return syscoinTestnet;
85
+ }
86
+
87
+ export function getBitcoinMainnetNetwork(): INetwork {
88
+ const networks = getDefaultUTXONetworks();
89
+ // Find Bitcoin mainnet (slip44: 0, currency: btc)
90
+ const bitcoinMainnet = Object.values(networks).find(
91
+ (network) => network.slip44 === 0 && network.currency === 'btc'
92
+ );
93
+
94
+ if (!bitcoinMainnet) {
95
+ throw new Error('Bitcoin Mainnet network not found in coins.ts');
96
+ }
97
+
98
+ return bitcoinMainnet;
99
+ }
@@ -0,0 +1,345 @@
1
+ import { BigNumber } from '@ethersproject/bignumber';
2
+ import { Logger } from '@ethersproject/logger';
3
+ import { Networkish } from '@ethersproject/networks';
4
+ import { shallowCopy } from '@ethersproject/properties';
5
+ import { JsonRpcProvider } from '@ethersproject/providers';
6
+
7
+ import { handleStatusCodeError } from './errorUtils';
8
+ import { checkError } from './utils';
9
+
10
+ const logger = new Logger('sysweb3-keyring/providers');
11
+
12
+ // Type definition for zksync-ethers Provider to avoid direct import
13
+ type ZkSyncProvider = any;
14
+
15
+ class BaseProvider extends JsonRpcProvider {
16
+ private isPossibleGetChainId = true;
17
+ private cooldownTime = 120 * 1000;
18
+ private rateLimit = 30;
19
+ private requestCount = 0;
20
+ private lastRequestTime = 0;
21
+ private currentChainId = '';
22
+ private currentId = 1;
23
+ public isInCooldown = false;
24
+ public errorMessage: any = '';
25
+ public serverHasAnError = false;
26
+ signal: AbortSignal;
27
+ _pendingBatchAggregator: NodeJS.Timer | null;
28
+ _pendingBatch: Array<{
29
+ reject: (error: Error) => void;
30
+ request: { id: number; jsonrpc: '2.0'; method: string; params: Array<any> };
31
+ resolve: (result: any) => void;
32
+ }> | null;
33
+
34
+ constructor(
35
+ signal: AbortSignal,
36
+ url?: string | { url: string },
37
+ network?: Networkish
38
+ ) {
39
+ super(url, network);
40
+ this.signal = signal;
41
+ this._pendingBatchAggregator = null;
42
+ this._pendingBatch = null;
43
+
44
+ this.bindMethods();
45
+ }
46
+
47
+ private bindMethods() {
48
+ const proto = Object.getPrototypeOf(this);
49
+ for (const key of Object.getOwnPropertyNames(proto)) {
50
+ if (typeof this[key] === 'function' && key !== 'constructor') {
51
+ this[key] = this[key].bind(this);
52
+ }
53
+ }
54
+ }
55
+
56
+ private throttledRequest = <T>(requestFn: () => Promise<T>): Promise<T> => {
57
+ if (!this.canMakeRequest()) {
58
+ return this.cooldown();
59
+ }
60
+ // Execute request immediately without timeout delay
61
+ return requestFn().catch((error) => {
62
+ if (error.name === 'AbortError') {
63
+ console.log('Aborted request', error);
64
+ return Promise.reject(error);
65
+ }
66
+ throw error;
67
+ });
68
+ };
69
+ private canMakeRequest = () => {
70
+ const now = Date.now();
71
+ let elapsedTime = 0;
72
+ if (this.lastRequestTime > 0) {
73
+ elapsedTime = now - this.lastRequestTime;
74
+ }
75
+ if (elapsedTime <= this.cooldownTime && this.serverHasAnError) {
76
+ this.isInCooldown = true;
77
+ return false;
78
+ }
79
+
80
+ if (elapsedTime >= this.cooldownTime && this.serverHasAnError) {
81
+ this.requestCount = 0;
82
+ this.serverHasAnError = false;
83
+ this.isInCooldown = true;
84
+ return false; //One last blocked request before cooldown ends
85
+ }
86
+
87
+ if (this.requestCount < this.rateLimit || !this.serverHasAnError) {
88
+ this.requestCount++;
89
+ if (elapsedTime > 1000) {
90
+ //Uncomment the console.log to see the request per second
91
+ // console.log(
92
+ // `Request/sec to Provider(${this.connection.url}): ${this.requestCount}`
93
+ // );
94
+ this.requestCount = 1;
95
+ this.lastRequestTime = now;
96
+ } else if (this.lastRequestTime === 0) {
97
+ this.lastRequestTime = now;
98
+ }
99
+ this.isInCooldown = false;
100
+ return true;
101
+ }
102
+ };
103
+
104
+ private cooldown = async () => {
105
+ const now = Date.now();
106
+ const elapsedTime = now - this.lastRequestTime;
107
+ console.error(
108
+ 'Cant make request, rpc cooldown is active for the next: ',
109
+ (this.cooldownTime - elapsedTime) / 1000,
110
+ ' seconds'
111
+ );
112
+ throw {
113
+ message: `Cant make request, rpc cooldown is active for the next: ${
114
+ (this.cooldownTime - elapsedTime) / 1000
115
+ } seconds`,
116
+ };
117
+ };
118
+
119
+ async perform(method: string, params: any): Promise<any> {
120
+ // Legacy networks do not like the type field being passed along (which
121
+ // is fair), so we delete type if it is 0 and a non-EIP-1559 network
122
+ if (method === 'call' || method === 'estimateGas') {
123
+ const tx = params.transaction;
124
+ if (tx && tx.type != null && BigNumber.from(tx.type).isZero()) {
125
+ // If there are no EIP-1559 properties, it might be non-EIP-1559
126
+ if (tx.maxFeePerGas == null && tx.maxPriorityFeePerGas == null) {
127
+ const feeData = await this.getFeeData();
128
+ if (
129
+ feeData.maxFeePerGas == null &&
130
+ feeData.maxPriorityFeePerGas == null
131
+ ) {
132
+ // Network doesn't know about EIP-1559 (and hence type)
133
+ params = shallowCopy(params);
134
+ params.transaction = shallowCopy(tx);
135
+ delete params.transaction.type;
136
+ }
137
+ }
138
+ }
139
+ }
140
+
141
+ const args = this.prepareRequest(method, params);
142
+
143
+ if (args == null) {
144
+ logger.throwError(
145
+ method + ' not implemented',
146
+ Logger.errors.NOT_IMPLEMENTED,
147
+ { operation: method }
148
+ );
149
+ }
150
+ try {
151
+ return await this.send(args[0], args[1]);
152
+ } catch (error) {
153
+ return checkError(method, error, params);
154
+ }
155
+ }
156
+
157
+ override send = async (method: string, params: any[]) => {
158
+ if (!this.isPossibleGetChainId && method === 'eth_chainId') {
159
+ return this.currentChainId;
160
+ }
161
+
162
+ const headers = {
163
+ 'Content-Type': 'application/json',
164
+ };
165
+
166
+ const options: RequestInit = {
167
+ method: 'POST',
168
+ headers,
169
+ body: JSON.stringify({
170
+ jsonrpc: '2.0',
171
+ method,
172
+ params,
173
+ id: this.currentId,
174
+ }),
175
+ signal: this.signal,
176
+ };
177
+
178
+ const result = await this.throttledRequest(() =>
179
+ fetch(this.connection.url, options)
180
+ .then(async (response) => {
181
+ if (!response.ok) {
182
+ let errorBody = {
183
+ error: undefined,
184
+ message: undefined,
185
+ };
186
+ try {
187
+ errorBody = await response.json();
188
+ } catch (error) {
189
+ console.warn('No body in request', error);
190
+ }
191
+ this.errorMessage =
192
+ errorBody.error ||
193
+ errorBody.message ||
194
+ 'No message from Provider';
195
+ handleStatusCodeError(response.status, this.errorMessage);
196
+ }
197
+ switch (response.status) {
198
+ case 200:
199
+ return response.json();
200
+ default:
201
+ throw {
202
+ message: `Unexpected HTTP status code: ${response.status}`,
203
+ };
204
+ }
205
+ })
206
+ .then((json) => {
207
+ if (json.error) {
208
+ if (json.error.message.includes('insufficient funds')) {
209
+ console.error({
210
+ errorMessage: json.error.message,
211
+ });
212
+ this.errorMessage = json.error.message;
213
+ throw new Error(json.error.message);
214
+ }
215
+ this.errorMessage = json.error.message;
216
+ console.log({ requestData: { method, params }, error: json.error });
217
+ console.error({
218
+ errorMessage: json.error.message,
219
+ });
220
+ throw new Error(json.error.message);
221
+ }
222
+ if (method === 'eth_chainId') {
223
+ this.currentChainId = json.result;
224
+ this.isPossibleGetChainId = false;
225
+ }
226
+ this.currentId++;
227
+ this.serverHasAnError = false;
228
+ return json.result;
229
+ })
230
+ );
231
+ return result;
232
+ };
233
+
234
+ async sendBatch(method: string, params: Array<any[]>): Promise<any[]> {
235
+ // Create batch request array
236
+ const requests = params.map((param, index) => ({
237
+ jsonrpc: '2.0',
238
+ id: this.currentId + index,
239
+ method,
240
+ params: param,
241
+ }));
242
+
243
+ this.currentId += requests.length;
244
+
245
+ const headers = {
246
+ 'Content-Type': 'application/json',
247
+ };
248
+
249
+ const options: RequestInit = {
250
+ method: 'POST',
251
+ headers,
252
+ body: JSON.stringify(requests),
253
+ signal: this.signal,
254
+ };
255
+
256
+ const results = await this.throttledRequest(() =>
257
+ fetch(this.connection.url, options)
258
+ .then(async (response) => {
259
+ if (!response.ok) {
260
+ let errorBody = {
261
+ error: undefined,
262
+ message: undefined,
263
+ };
264
+ try {
265
+ errorBody = await response.json();
266
+ } catch (error) {
267
+ console.warn('No body in request', error);
268
+ }
269
+ this.errorMessage =
270
+ errorBody.error ||
271
+ errorBody.message ||
272
+ 'No message from Provider';
273
+ handleStatusCodeError(response.status, this.errorMessage);
274
+ }
275
+ return response.json();
276
+ })
277
+ .then((jsonArray) => {
278
+ // Sort results by ID to ensure correct order
279
+ const sortedResults = jsonArray.sort((a: any, b: any) => a.id - b.id);
280
+
281
+ // Extract results or throw errors
282
+ return sortedResults.map((json: any) => {
283
+ if (json.error) {
284
+ this.errorMessage = json.error.message;
285
+ console.error({
286
+ errorMessage: json.error.message,
287
+ });
288
+ throw new Error(json.error.message);
289
+ }
290
+ return json.result;
291
+ });
292
+ })
293
+ );
294
+
295
+ return results;
296
+ }
297
+ }
298
+
299
+ export class CustomJsonRpcProvider extends BaseProvider {
300
+ constructor(
301
+ signal: AbortSignal,
302
+ url?: string | { url: string },
303
+ network?: Networkish
304
+ ) {
305
+ super(signal, url, network);
306
+ }
307
+ }
308
+
309
+ // CustomL2JsonRpcProvider extends BaseProvider to provide all standard provider methods
310
+ export class CustomL2JsonRpcProvider extends BaseProvider {
311
+ private zkSyncProvider: ZkSyncProvider | null = null;
312
+
313
+ constructor(
314
+ signal: AbortSignal,
315
+ url?: string | { url: string },
316
+ network?: Networkish
317
+ ) {
318
+ super(signal, url, network);
319
+ }
320
+
321
+ // Lazy initialization of zkSync provider
322
+ private async initializeZkSyncProvider(): Promise<void> {
323
+ if (!this.zkSyncProvider) {
324
+ // Dynamic import creates a separate chunk for zksync-ethers
325
+ // webpack magic comment for chunk naming
326
+ const { Provider } = await import(
327
+ /* webpackChunkName: "zksync-provider" */ 'zksync-ethers'
328
+ );
329
+ this.zkSyncProvider = new Provider(this.connection.url, this.network);
330
+ }
331
+ }
332
+
333
+ // Override perform to handle zkSync-specific methods
334
+ async perform(method: string, params: any): Promise<any> {
335
+ // For zkSync-specific methods, ensure zkSync provider is initialized
336
+ if (method.startsWith('zks_') || method === 'eth_estimateGas') {
337
+ await this.initializeZkSyncProvider();
338
+ if (this.zkSyncProvider && this.zkSyncProvider.perform) {
339
+ return this.zkSyncProvider.perform(method, params);
340
+ }
341
+ }
342
+ // For all other methods, use the base provider
343
+ return super.perform(method, params);
344
+ }
345
+ }
package/src/signers.ts ADDED
@@ -0,0 +1,158 @@
1
+ import { BitcoinNetwork, IPubTypes, INetwork } from '@sidhujag/sysweb3-network';
2
+ import { BIP32Interface } from 'bip32';
3
+ import { Psbt } from 'bitcoinjs-lib';
4
+ import * as syscoinjs from 'syscoinjs-lib';
5
+
6
+ export const getSyscoinSigners = ({
7
+ mnemonic,
8
+ rpc,
9
+ }: ISyscoinSignerParams): { hd: SyscoinHDSigner; main: any } => {
10
+ const { url, slip44, currency } = rpc.formattedNetwork;
11
+ let config: BitcoinNetwork | null = null;
12
+ let pubTypes: IPubTypes | null = null;
13
+ let networks: { mainnet: BitcoinNetwork; testnet: BitcoinNetwork } | null =
14
+ null;
15
+ let isTestnet = false;
16
+
17
+ // Determine if this is a testnet based on slip44 and currency
18
+ isTestnet =
19
+ slip44 === 1 || Boolean(currency && currency.toLowerCase().startsWith('t'));
20
+
21
+ if (rpc.networkConfig) {
22
+ const { networkConfig } = rpc;
23
+ const { networks: _networkConfig, types } = networkConfig;
24
+
25
+ config = isTestnet ? _networkConfig.testnet : _networkConfig.mainnet;
26
+ networks = _networkConfig;
27
+ pubTypes = types.zPubType;
28
+ }
29
+
30
+ // @ts-ignore
31
+ const hd: SyscoinHDSigner = new syscoinjs.utils.HDSigner(
32
+ mnemonic,
33
+ null,
34
+ isTestnet, // Use proper testnet flag
35
+ networks,
36
+ slip44,
37
+ pubTypes,
38
+ 84
39
+ );
40
+
41
+ const main: any = new syscoinjs.SyscoinJSLib(hd, url, config);
42
+
43
+ return {
44
+ hd,
45
+ main,
46
+ };
47
+ };
48
+
49
+ export type SyscoinHdAccount = {
50
+ network: BitcoinNetwork;
51
+ networks: {
52
+ mainnet: BitcoinNetwork;
53
+ testnet: BitcoinNetwork;
54
+ };
55
+ pubTypes: IPubTypes;
56
+ zprv: string;
57
+ };
58
+
59
+ export type ISyscoinSignerParams = {
60
+ mnemonic: string;
61
+ rpc: {
62
+ formattedNetwork: INetwork;
63
+ networkConfig?: {
64
+ networks: { mainnet: BitcoinNetwork; testnet: BitcoinNetwork };
65
+ types: { xPubType: IPubTypes; zPubType: IPubTypes };
66
+ };
67
+ };
68
+ };
69
+
70
+ export type IMainSignerParams = {
71
+ hd: SyscoinHDSigner;
72
+ network?: BitcoinNetwork;
73
+ url: string;
74
+ };
75
+
76
+ export interface SyscoinHDSigner {
77
+ Signer: {
78
+ SLIP44: number;
79
+ accountIndex: number;
80
+ accounts: any;
81
+ blockbookURL: string;
82
+ changeIndex: number;
83
+ network: BitcoinNetwork;
84
+ networks: { mainnet: BitcoinNetwork; testnet: BitcoinNetwork };
85
+ password: string | null;
86
+ pubTypes: IPubTypes;
87
+ receivingIndex: number;
88
+ setIndexFlag: number;
89
+ };
90
+ backup: () => void;
91
+ blockbookURL: string;
92
+ // Already async
93
+ createAccount: (bipNum?: number, zprv?: string) => number;
94
+ createAccountAtIndex: (
95
+ index: number,
96
+ bipNum?: number,
97
+ zprv?: string
98
+ ) => number;
99
+ createAddress: (
100
+ addressIndex: number,
101
+ isChange: boolean,
102
+ bipNum?: number
103
+ ) => string;
104
+ createKeypair: (addressIndex: number, isChange: boolean) => BIP32Interface;
105
+ deriveAccount: (index: number, bipNum?: number) => string;
106
+ deriveKeypair: (keypath: string) => BIP32Interface;
107
+ derivePubKey: (keypath: string) => string;
108
+ // Updated signature
109
+ getAccountXpub: () => string;
110
+ getAddressFromKeypair: (keypair: BIP32Interface) => string;
111
+ getAddressFromPubKey: (pubkey: string) => string;
112
+ getHDPath: (
113
+ addressIndex: number,
114
+ isChange: boolean,
115
+ bipNum?: number
116
+ ) => string; // Already async
117
+ getNewReceivingAddress: (
118
+ skipIncrement?: boolean,
119
+ bipNum?: number
120
+ ) => Promise<string>;
121
+ // Added new property for import method tracking
122
+ node: {
123
+ seed: Buffer;
124
+ coinType: number;
125
+ pubTypes: IPubTypes;
126
+ network: BitcoinNetwork;
127
+ };
128
+ setAccountIndex: (accountIndex: number) => void;
129
+ getRootNode: () => BIP32Interface;
130
+ // Updated to reflect the enhanced property name
131
+ importMethod: string;
132
+ signPSBT: ({
133
+ psbt,
134
+ isTrezor,
135
+ isLedger,
136
+ }: {
137
+ psbt: any;
138
+ isTrezor?: boolean;
139
+ isLedger?: boolean;
140
+ }) => Promise<any>;
141
+ getNewChangeAddress: (
142
+ skipIncrement?: boolean,
143
+ bipNum?: number
144
+ ) => Promise<string>;
145
+ restore: (password: string, bipNum?: number) => boolean;
146
+ mnemonicOrZprv: string;
147
+ setLatestIndexesFromXPubTokens: (tokens: any) => void;
148
+ // Made async
149
+ sign: (psbt: Psbt) => Promise<Psbt>;
150
+ // Made async
151
+ getMasterFingerprint: () => Buffer;
152
+ }
153
+
154
+ export type SyscoinMainSigner = {
155
+ Signer: SyscoinHDSigner;
156
+ blockbookURL: string;
157
+ network: BitcoinNetwork;
158
+ };