@cityofzion/bs-ethereum 1.0.3 → 1.1.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.
@@ -1,3 +1,3 @@
1
1
  {
2
- "nonCachedDurationMs": 2456.2693220000074
2
+ "nonCachedDurationMs": 2691.443166000012
3
3
  }
@@ -2,27 +2,29 @@
2
2
  "files": {
3
3
  "packages/bs-ethereum/.eslintignore": "3ee402c88b68258919e4f4b4eef4f25e5d078d90",
4
4
  "packages/bs-ethereum/.eslintrc.cjs": "5ec0bf6332ec01b3e02beb532bb47025c4c1bf7b",
5
- "packages/bs-ethereum/CHANGELOG.json": "52f7565b9455ae693f0b870741ce9ac69ac8ece3",
6
- "packages/bs-ethereum/CHANGELOG.md": "1a2e1ab64b099b95532c397fd44a19ec709a5931",
5
+ "packages/bs-ethereum/CHANGELOG.json": "325dd368ceaddc016034aa87f89fd72ca69d24e7",
6
+ "packages/bs-ethereum/CHANGELOG.md": "3d678f8216c91d6607c00062fecae2068e8e8cac",
7
7
  "packages/bs-ethereum/jest.config.ts": "d944475db93cbe41a9339187fd94b9962e411c43",
8
8
  "packages/bs-ethereum/jest.setup.ts": "9a1976a32050616d4d2ee95b1aa21041bc4daca3",
9
- "packages/bs-ethereum/package.json": "1adbf3bd6afb0f62ab98f33bf7e38089707f92e7",
10
- "packages/bs-ethereum/src/BSEthereum.ts": "21e03098208f6764ca8848cc344a6268ff16262c",
9
+ "packages/bs-ethereum/package.json": "b28c67e06e88b76dabe2a59950a87fc702802784",
10
+ "packages/bs-ethereum/src/BSEthereum.ts": "851c8cb3d04e982b1f6084af3c0c6332e94dfb1b",
11
11
  "packages/bs-ethereum/src/BitqueryBDSEthereum.ts": "47f24d0f3a94aa0eb761e1c2e96f6aeb9c51f82b",
12
12
  "packages/bs-ethereum/src/BitqueryEDSEthereum.ts": "a1232bf1d1683d7fe0e752577f3eb489cfce734f",
13
13
  "packages/bs-ethereum/src/GhostMarketNDSEthereum.ts": "c97f7fd9323b4089a8f2ed4178dbc14a0d17c61c",
14
+ "packages/bs-ethereum/src/LedgerServiceEthereum.ts": "4817179fe41406c77c24d7635c9fe01c8718ab51",
14
15
  "packages/bs-ethereum/src/RpcBDSEthereum.ts": "6cbca256420b09cef7182cbc485eb4799ff9b614",
15
- "packages/bs-ethereum/src/__tests__/BDSEthereum.spec.ts": "b5d64fe975c82fb604f15717ede1707d016d1f9d",
16
- "packages/bs-ethereum/src/__tests__/BSEthereum.spec.ts": "4d123a45f1431ad00db142522423359122b692b7",
16
+ "packages/bs-ethereum/src/__tests__/BSEthereum.spec.ts": "755cb6c64843453d236c67b8e2837fe288fc8ecb",
17
+ "packages/bs-ethereum/src/__tests__/BitqueryBDSEthereum.spec.ts": "38f866d185089ff5a638dda6a7a7a82e6b75416c",
17
18
  "packages/bs-ethereum/src/__tests__/BitqueryEDSEthereum.spec.ts": "a0994e0ad66408b281ec96a5f72b30b5e14a68ce",
18
19
  "packages/bs-ethereum/src/__tests__/GhostMarketNDSEthereum.spec.ts": "4b10ef2b59437c9ea06695ab4844d5b131f65738",
20
+ "packages/bs-ethereum/src/__tests__/RpcBDSEthereum.spec.ts": "c76ab3af8b91ca9e1ae86face31933ca4f21ca1f",
19
21
  "packages/bs-ethereum/src/assets/tokens/common.json": "96597dd06475ee6068b484510f27ffad27b52ebd",
20
- "packages/bs-ethereum/src/constants.ts": "03fa0c2e94d53e42f1b81e66f736807364b60f16",
22
+ "packages/bs-ethereum/src/constants.ts": "e216fc9b3e2f2333af4f42bca7cc2e6a461e2036",
21
23
  "packages/bs-ethereum/src/graphql.ts": "2e759e198a9a37205ed115c41165eda18df66539",
22
24
  "packages/bs-ethereum/src/index.ts": "69ca9c23acdd0afd70f7eaa0a840b07b62bdb07a",
23
25
  "packages/bs-ethereum/tsconfig.build.json": "4dc23fb9c4c5e4d19a9bc3947a47c523f4bd967c",
24
26
  "packages/bs-ethereum/tsconfig.json": "93e09769572b58e642d4990e9552c70a8b85e142",
25
- "packages/bs-ethereum/.rush/temp/shrinkwrap-deps.json": "cda9694df674cec18dc881c0c30b2477414a7ec3"
27
+ "packages/bs-ethereum/.rush/temp/shrinkwrap-deps.json": "38753d194619dc40349a5bf0ecc2a3216d091fda"
26
28
  },
27
29
  "arguments": "tsc --project tsconfig.build.json "
28
30
  }
@@ -1,5 +1,5 @@
1
1
  {
2
- "../../packages/bs-ethereum": "../../packages/bs-ethereum:uAc2JAYIPkjnCoCyaZdN2x5vR7tZe3agYxqwKsuvbU0=:",
2
+ "../../packages/bs-ethereum": "../../packages/bs-ethereum:+YmJRJAu00IWum0fJUk+lJdPbFbwx8Aw/RDvXUKL2gI=:",
3
3
  "/@0no-co/graphql.web@1.0.4(graphql@16.8.1)": "sha512-W3ezhHGfO0MS1PtGloaTpg0PbaT8aZSmmaerL7idtU5F7oCI+uu25k+MsMS31BVFlp4aMkHSrNRxiD72IlK8TA==",
4
4
  "/@aashutoshrathi/word-wrap@1.2.6": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==",
5
5
  "/@ampproject/remapping@2.2.1": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==",
@@ -100,6 +100,19 @@
100
100
  "/@jridgewell/sourcemap-codec@1.4.15": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==",
101
101
  "/@jridgewell/trace-mapping@0.3.22": "sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw==",
102
102
  "/@jridgewell/trace-mapping@0.3.9": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==",
103
+ "/@ledgerhq/cryptoassets@12.0.0": "sha512-e6PwYGNCyw2ZFEiHZXJPgI3tkl3Iq58Nt32hpW3mccQqTIJYsWmsn4gvBlkgx+ts5EB6IT2TypTo8B6FXQqMGg==",
104
+ "/@ledgerhq/devices@8.2.2": "sha512-SKahGA4p0mZ3ovypOJ2wa5mUvUkArE3HBrwWKYf+cRs+t/Licp3OJfhj+DHIxP3AfyH2xR6CFFWECYHeKwGsDQ==",
105
+ "/@ledgerhq/domain-service@1.1.19": "sha512-BsJwMYV6cfdVeo9mQeax7Z5iDqBYCkaLvDtSNyZ54rQPojMcUPLTGPB53tk1zuSeyrfs5z2Hbahp3jNtBzWX0A==",
106
+ "/@ledgerhq/errors@6.16.3": "sha512-3w7/SJVXOPa9mpzyll7VKoKnGwDD3BzWgN1Nom8byR40DiQvOKjHX+kKQausCedTHVNBn9euzPCNsftZ9+mxfw==",
107
+ "/@ledgerhq/evm-tools@1.0.17": "sha512-WGHb7OaxD5VllRnMEsAi2/5fZEvM5LbaWcuLSIF5plrb3UIv5EGJfDyz2UlCYpMwtrx4GScyhwy0MvyIYmSnmQ==",
108
+ "/@ledgerhq/hw-app-eth@6.35.7": "sha512-cwBB4xuCfFGatNpF8eVMfCDxD9wbEH3n4Sh5mOR0HoKC3A0Xc2iCDQN8PzqNe2jlctveI8u2+JCeYGWyhFOrew==",
109
+ "/@ledgerhq/hw-transport-mocker@6.28.5": "sha512-NrOoonR5pIQgzCC9HhKaomUtMCDoz42wWP4bjB2v8vh9KKYXQG9T4R5A+I+KGUqYVSCgyI1YW0RM7V2ZhuWdCA==",
110
+ "/@ledgerhq/hw-transport-node-hid-noevents@6.29.5": "sha512-KzLJtH4gzt8AROQm2x9GSPrlqH+Mf7e/UlgQI3ldLcZFJQIaXZUCVjn4EyhMMTwggqjLvczEQNDwZ0zvEiXWuA==",
111
+ "/@ledgerhq/hw-transport-node-hid@6.28.5": "sha512-vH5fu0SiM27gE5UqRwO4aySS2qu1tiCYMf4/XkkYafac4FLwqMIg03RyU7Wp+SQ3srMeXjSCsLbijF1kPSyTKQ==",
112
+ "/@ledgerhq/hw-transport@6.30.5": "sha512-JMl//7BgPBvWxrWyMu82jj6JEYtsQyOyhYtonWNgtxn6KUZWht3gU4gxmLpeIRr+DiS7e50mW7m3GA+EudZmmA==",
113
+ "/@ledgerhq/live-env@2.0.0": "sha512-m6n6/nxG9xd+NUyUsidZkxcjckyovI0L5yAzKpbtRuUx7LQxK+ZGjkUqmdoI1z9erOnmZLfhnAsQqHpPFLle+Q==",
114
+ "/@ledgerhq/logs@6.12.0": "sha512-ExDoj1QV5eC6TEbMdLUMMk9cfvNKhhv5gXol4SmULRVCx/3iyCPhJ74nsb3S0Vb+/f+XujBEj3vQn5+cwS0fNA==",
115
+ "/@ledgerhq/types-live@6.45.0": "sha512-UKcPVtI53wVOGOrcVkHwPMTNo0ajULlxs4dUmmair2al/yBFi4kosKGPw4i2T43J9rbGnKA+KVuS5G4b0dueXA==",
103
116
  "/@nodelib/fs.scandir@2.1.5": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
104
117
  "/@nodelib/fs.stat@2.0.5": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
105
118
  "/@nodelib/fs.walk@1.2.8": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
@@ -124,6 +137,7 @@
124
137
  "/@types/node@20.2.6": "sha512-GQBWUtGoefMEOx/vu+emHEHU5aw6JdDoEtZhoBrHFPZbA/YNRFfN996XbBASEWdvmLSLyv9FKYppYGyZjCaq/g==",
125
138
  "/@types/semver@7.5.6": "sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==",
126
139
  "/@types/stack-utils@2.0.3": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==",
140
+ "/@types/w3c-web-usb@1.0.10": "sha512-CHgUI5kTc/QLMP8hODUHhge0D4vx+9UiAwIGiT0sTy/B2XpdX1U5rJt6JSISgr6ikRT7vxV9EVAFeYZqUnl1gQ==",
127
141
  "/@types/yargs-parser@21.0.3": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==",
128
142
  "/@types/yargs@17.0.32": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==",
129
143
  "/@typescript-eslint/eslint-plugin@6.20.0(@typescript-eslint/parser@6.20.0)(eslint@8.56.0)(typescript@4.9.5)": "sha512-fTwGQUnjhoYHeSF6m5pWNkzmDDdsKELYrOBxhjMrofPqCkoC2k3B2wvGHFxa1CTIqkEn88nlW1HVMztjo2K8Hg==",
@@ -152,13 +166,20 @@
152
166
  "/argparse@2.0.1": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
153
167
  "/array-union@2.1.0": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
154
168
  "/asynckit@0.4.0": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==",
169
+ "/axios@1.5.1": "sha512-Q28iYCWzNHjAm+yEAot5QaAMxhMghWLFVf7rRdwhUI+c2jix2DUXjAHXVi+s1ibs3mjPO/cCgbA++3BjD0vP/A==",
170
+ "/axios@1.6.8": "sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==",
155
171
  "/babel-jest@29.7.0(@babel/core@7.23.9)": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==",
156
172
  "/babel-plugin-istanbul@6.1.1": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==",
157
173
  "/babel-plugin-jest-hoist@29.6.3": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==",
158
174
  "/babel-preset-current-node-syntax@1.0.1(@babel/core@7.23.9)": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==",
159
175
  "/babel-preset-jest@29.6.3(@babel/core@7.23.9)": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==",
160
176
  "/balanced-match@1.0.2": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
177
+ "/base-x@3.0.9": "sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==",
178
+ "/base64-js@1.5.1": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
161
179
  "/bech32@1.1.4": "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==",
180
+ "/bignumber.js@9.1.2": "sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==",
181
+ "/bindings@1.5.0": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==",
182
+ "/bl@4.1.0": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==",
162
183
  "/bn.js@4.12.0": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==",
163
184
  "/bn.js@5.2.1": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==",
164
185
  "/brace-expansion@1.1.11": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
@@ -167,8 +188,11 @@
167
188
  "/brorand@1.1.0": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==",
168
189
  "/browserslist@4.22.3": "sha512-UAp55yfwNv0klWNapjs/ktHoguxuQNGnOzxYmfnXIS+8AsRDZkSDxg7R1AX3GKzn078SBI5dzwzj/Yx0Or0e3A==",
169
190
  "/bs-logger@0.2.6": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==",
191
+ "/bs58@4.0.1": "sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==",
192
+ "/bs58check@2.1.2": "sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==",
170
193
  "/bser@2.1.1": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==",
171
194
  "/buffer-from@1.1.2": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
195
+ "/buffer@5.7.1": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
172
196
  "/callsites@3.1.0": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
173
197
  "/camelcase@5.3.1": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
174
198
  "/camelcase@6.3.0": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==",
@@ -176,7 +200,9 @@
176
200
  "/chalk@2.4.2": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
177
201
  "/chalk@4.1.2": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
178
202
  "/char-regex@1.0.2": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==",
203
+ "/chownr@1.1.4": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==",
179
204
  "/ci-info@3.9.0": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==",
205
+ "/cipher-base@1.0.4": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==",
180
206
  "/cjs-module-lexer@1.2.3": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==",
181
207
  "/cliui@8.0.1": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==",
182
208
  "/co@4.6.0": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==",
@@ -188,26 +214,33 @@
188
214
  "/combined-stream@1.0.8": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
189
215
  "/concat-map@0.0.1": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
190
216
  "/convert-source-map@2.0.0": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==",
217
+ "/create-hash@1.2.0": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==",
191
218
  "/create-jest@29.7.0(@types/node@20.2.6)(ts-node@10.9.1)": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==",
192
219
  "/create-require@1.1.1": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==",
193
220
  "/cross-spawn@7.0.3": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
221
+ "/crypto-js@4.2.0": "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==",
194
222
  "/dayjs@1.11.10": "sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==",
195
223
  "/debug@4.3.4": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
196
224
  "/decode-uri-component@0.2.2": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==",
225
+ "/decompress-response@6.0.0": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==",
197
226
  "/dedent@1.5.1": "sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg==",
227
+ "/deep-extend@0.6.0": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==",
198
228
  "/deep-is@0.1.4": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
199
229
  "/deepmerge@4.3.1": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==",
200
230
  "/delayed-stream@1.0.0": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
231
+ "/detect-libc@2.0.3": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==",
201
232
  "/detect-newline@3.1.0": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==",
202
233
  "/diff-sequences@29.6.3": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==",
203
234
  "/diff@4.0.2": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==",
204
235
  "/dir-glob@3.0.1": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
205
236
  "/doctrine@3.0.0": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
206
237
  "/dotenv@16.3.1": "sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==",
238
+ "/eip55@2.1.1": "sha512-WcagVAmNu2Ww2cDUfzuWVntYwFxbvZ5MvIyLZpMjTTkjD6sCvkGOiS86jTppzu9/gWsc8isLHAeMBWK02OnZmA==",
207
239
  "/electron-to-chromium@1.4.654": "sha512-hjfFa+Vj4WGLRVTlCQa+IivBkpcp+boGxMQfusOC/me5Y5NfU4wX7wyw+K9p8Cw4tl0BVIZGH2n7y/jMc3w4pg==",
208
240
  "/elliptic@6.5.4": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==",
209
241
  "/emittery@0.13.1": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==",
210
242
  "/emoji-regex@8.0.0": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
243
+ "/end-of-stream@1.4.4": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
211
244
  "/error-ex@1.3.2": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
212
245
  "/escalade@3.1.1": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
213
246
  "/escape-string-regexp@1.0.5": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
@@ -223,8 +256,10 @@
223
256
  "/estraverse@5.3.0": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
224
257
  "/esutils@2.0.3": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
225
258
  "/ethers@5.7.2": "sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==",
259
+ "/events@3.3.0": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==",
226
260
  "/execa@5.1.1": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==",
227
261
  "/exit@0.1.2": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==",
262
+ "/expand-template@2.0.3": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==",
228
263
  "/expect@29.7.0": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==",
229
264
  "/fast-deep-equal@3.1.3": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
230
265
  "/fast-glob@3.3.2": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==",
@@ -233,13 +268,18 @@
233
268
  "/fastq@1.17.0": "sha512-zGygtijUMT7jnk3h26kUms3BkSDp4IfIKjmnqI2tvx6nuBfiF1UqOxbnLfzdv+apBy+53oaImsKtMw/xYbW+1w==",
234
269
  "/fb-watchman@2.0.2": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==",
235
270
  "/file-entry-cache@6.0.1": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
271
+ "/file-uri-to-path@1.0.0": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==",
236
272
  "/fill-range@7.0.1": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
237
273
  "/filter-obj@1.1.0": "sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ==",
238
274
  "/find-up@4.1.0": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
239
275
  "/find-up@5.0.0": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
240
276
  "/flat-cache@3.2.0": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==",
241
277
  "/flatted@3.2.9": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==",
278
+ "/follow-redirects@1.15.5": "sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==",
279
+ "/follow-redirects@1.15.6": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==",
242
280
  "/form-data@3.0.1": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==",
281
+ "/form-data@4.0.0": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
282
+ "/fs-constants@1.0.0": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==",
243
283
  "/fs.realpath@1.0.0": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
244
284
  "/fsevents@2.3.3": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
245
285
  "/function-bind@1.1.2": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
@@ -247,6 +287,7 @@
247
287
  "/get-caller-file@2.0.5": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
248
288
  "/get-package-type@0.1.0": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==",
249
289
  "/get-stream@6.0.1": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
290
+ "/github-from-package@0.0.0": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==",
250
291
  "/glob-parent@5.1.2": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
251
292
  "/glob-parent@6.0.2": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
252
293
  "/glob@7.2.3": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
@@ -258,17 +299,21 @@
258
299
  "/graphql@16.8.1": "sha512-59LZHPdGZVh695Ud9lRzPBVTtlX9ZCV150Er2W43ro37wVof0ctenSaskPPjN7lVTIN8mSZt8PHUNKZuNQUuxw==",
259
300
  "/has-flag@3.0.0": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
260
301
  "/has-flag@4.0.0": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
302
+ "/hash-base@3.1.0": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==",
261
303
  "/hash.js@1.1.7": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==",
262
304
  "/hasown@2.0.0": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==",
263
305
  "/hmac-drbg@1.0.1": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==",
264
306
  "/html-escaper@2.0.2": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==",
265
307
  "/human-signals@2.1.0": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==",
308
+ "/ieee754@1.2.1": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
266
309
  "/ignore@5.3.1": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==",
267
310
  "/import-fresh@3.3.0": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
268
311
  "/import-local@3.1.0": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==",
269
312
  "/imurmurhash@0.1.4": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
270
313
  "/inflight@1.0.6": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
271
314
  "/inherits@2.0.4": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
315
+ "/ini@1.3.8": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
316
+ "/invariant@2.2.4": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==",
272
317
  "/is-arrayish@0.2.1": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==",
273
318
  "/is-core-module@2.13.1": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==",
274
319
  "/is-extglob@2.1.1": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
@@ -321,6 +366,7 @@
321
366
  "/json-schema-traverse@0.4.1": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
322
367
  "/json-stable-stringify-without-jsonify@1.0.1": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
323
368
  "/json5@2.2.3": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
369
+ "/keccak@3.0.4": "sha512-3vKuW0jV8J3XNTzvfyicFR5qvxrSAGl7KIhvgOu5cmWwM7tZRj3fMbj/pfIf4be7aznbc+prBWGjywox/g2Y6Q==",
324
370
  "/keyv@4.5.4": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==",
325
371
  "/kleur@3.0.3": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==",
326
372
  "/leven@3.1.0": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==",
@@ -330,24 +376,37 @@
330
376
  "/locate-path@6.0.0": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
331
377
  "/lodash.memoize@4.1.2": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==",
332
378
  "/lodash.merge@4.6.2": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
379
+ "/lodash@4.17.21": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
380
+ "/loose-envify@1.4.0": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
333
381
  "/lru-cache@5.1.1": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
334
382
  "/lru-cache@6.0.0": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
335
383
  "/make-dir@4.0.0": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==",
336
384
  "/make-error@1.3.6": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==",
337
385
  "/makeerror@1.0.12": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==",
386
+ "/md5.js@1.3.5": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==",
338
387
  "/merge-stream@2.0.0": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
339
388
  "/merge2@1.4.1": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
340
389
  "/micromatch@4.0.5": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==",
341
390
  "/mime-db@1.52.0": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
342
391
  "/mime-types@2.1.35": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
343
392
  "/mimic-fn@2.1.0": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
393
+ "/mimic-response@3.1.0": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==",
344
394
  "/minimalistic-assert@1.0.1": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==",
345
395
  "/minimalistic-crypto-utils@1.0.1": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==",
346
396
  "/minimatch@3.1.2": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
347
397
  "/minimatch@9.0.3": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==",
398
+ "/minimist@1.2.8": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
399
+ "/mkdirp-classic@0.5.3": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==",
348
400
  "/ms@2.1.2": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
401
+ "/napi-build-utils@1.0.2": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==",
349
402
  "/natural-compare@1.4.0": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
403
+ "/node-abi@3.57.0": "sha512-Dp+A9JWxRaKuHP35H77I4kCKesDy5HUDEmScia2FyncMTOXASMyg251F5PhFoDA5uqBrDDffiLpbqnrZmNXW+g==",
404
+ "/node-addon-api@2.0.2": "sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==",
405
+ "/node-addon-api@3.2.1": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==",
406
+ "/node-addon-api@6.1.0": "sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==",
350
407
  "/node-fetch@2.6.4": "sha512-aD1fO+xtLiSCc9vuD+sYMxpIuQyhHscGSkBEo2o5LTV/3bTEAYvdUii29n8LlO5uLCmWdGP7uVUVXFo5SRdkLA==",
408
+ "/node-gyp-build@4.8.0": "sha512-u6fs2AEUljNho3EYTJNBfImO5QTo/J/1Etd+NVdCj7qWKUSN/bSLkZwhDv7I+w/MSC6qJ4cknepkAYykDdK8og==",
409
+ "/node-hid@2.2.0": "sha512-vj48zh9j555DZzUhMc8tk/qw6xPFrDyPBH1ST1Z/hWaA/juBJw7IuSxPeOgpzNFNU36mGYj+THioRMt1xOdm/g==",
351
410
  "/node-int64@0.4.0": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==",
352
411
  "/node-releases@2.0.14": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==",
353
412
  "/normalize-path@3.0.0": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
@@ -371,14 +430,21 @@
371
430
  "/picomatch@2.3.1": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
372
431
  "/pirates@4.0.6": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==",
373
432
  "/pkg-dir@4.2.0": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==",
433
+ "/prebuild-install@7.1.2": "sha512-UnNke3IQb6sgarcZIDU3gbMeTp/9SSU1DAIkil7PrqG1vZlBtY5msYccSKSHDqa3hNg436IXK+SNImReuA1wEQ==",
374
434
  "/prelude-ls@1.2.1": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
375
435
  "/pretty-format@29.7.0": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==",
376
436
  "/prompts@2.4.2": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==",
437
+ "/proxy-from-env@1.1.0": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==",
438
+ "/pump@3.0.0": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
377
439
  "/punycode@2.3.1": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
378
440
  "/pure-rand@6.0.4": "sha512-LA0Y9kxMYv47GIPJy6MI84fqTd2HmYZI83W/kM/SkKfDlajnZYfmXFTxkbY+xSBPkLJxltMa9hIkmdc29eguMA==",
379
441
  "/query-string@7.1.3": "sha512-hh2WYhq4fi8+b+/2Kg9CEge4fDPvHS534aOOvOZeQ3+Vf2mCFsaFBYj0i+iXcAq6I9Vzp5fjMFBlONvayDC1qg==",
380
442
  "/queue-microtask@1.2.3": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
443
+ "/rc@1.2.8": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==",
444
+ "/react-dom@18.2.0(react@18.2.0)": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==",
381
445
  "/react-is@18.2.0": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==",
446
+ "/react@18.2.0": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==",
447
+ "/readable-stream@3.6.2": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
382
448
  "/require-directory@2.1.1": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
383
449
  "/resolve-cwd@3.0.0": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==",
384
450
  "/resolve-from@4.0.0": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
@@ -387,13 +453,20 @@
387
453
  "/resolve@1.22.8": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==",
388
454
  "/reusify@1.0.4": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
389
455
  "/rimraf@3.0.2": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
456
+ "/ripemd160@2.0.2": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==",
390
457
  "/run-parallel@1.2.0": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
458
+ "/rxjs@7.8.1": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==",
459
+ "/safe-buffer@5.2.1": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
460
+ "/scheduler@0.23.0": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==",
391
461
  "/scrypt-js@3.0.1": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==",
392
462
  "/semver@6.3.1": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
393
463
  "/semver@7.5.4": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
464
+ "/sha.js@2.4.11": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==",
394
465
  "/shebang-command@2.0.0": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
395
466
  "/shebang-regex@3.0.0": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
396
467
  "/signal-exit@3.0.7": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
468
+ "/simple-concat@1.0.1": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==",
469
+ "/simple-get@4.0.1": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==",
397
470
  "/sisteransi@1.0.5": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==",
398
471
  "/slash@3.0.0": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
399
472
  "/source-map-support@0.5.13": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==",
@@ -404,14 +477,18 @@
404
477
  "/strict-uri-encode@2.0.0": "sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ==",
405
478
  "/string-length@4.0.2": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==",
406
479
  "/string-width@4.2.3": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
480
+ "/string_decoder@1.3.0": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
407
481
  "/strip-ansi@6.0.1": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
408
482
  "/strip-bom@4.0.0": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==",
409
483
  "/strip-final-newline@2.0.0": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==",
484
+ "/strip-json-comments@2.0.1": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==",
410
485
  "/strip-json-comments@3.1.1": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
411
486
  "/supports-color@5.5.0": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
412
487
  "/supports-color@7.2.0": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
413
488
  "/supports-color@8.1.1": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
414
489
  "/supports-preserve-symlinks-flag@1.0.0": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
490
+ "/tar-fs@2.1.1": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==",
491
+ "/tar-stream@2.2.0": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==",
415
492
  "/test-exclude@6.0.0": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==",
416
493
  "/text-table@0.2.0": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==",
417
494
  "/tmpl@1.0.5": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==",
@@ -421,6 +498,8 @@
421
498
  "/ts-api-utils@1.0.3(typescript@4.9.5)": "sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==",
422
499
  "/ts-jest@29.1.1(@babel/core@7.23.9)(jest@29.6.2)(typescript@4.9.5)": "sha512-D6xjnnbP17cC85nliwGiL+tpoKN0StpgE0TeOjXQTU6MVCfsB4v7aW05CgQ/1OywGb0x/oy9hHFnN+sczTiRaA==",
423
500
  "/ts-node@10.9.1(@types/node@20.2.6)(typescript@4.9.5)": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==",
501
+ "/tslib@2.6.2": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==",
502
+ "/tunnel-agent@0.6.0": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==",
424
503
  "/type-check@0.4.0": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
425
504
  "/type-detect@4.0.8": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==",
426
505
  "/type-fest@0.20.2": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
@@ -428,6 +507,9 @@
428
507
  "/typescript@4.9.5": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==",
429
508
  "/update-browserslist-db@1.0.13(browserslist@4.22.3)": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==",
430
509
  "/uri-js@4.4.1": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
510
+ "/usb@2.9.0": "sha512-G0I/fPgfHUzWH8xo2KkDxTTFruUWfppgSFJ+bQxz/kVY2x15EQ/XDB7dqD1G432G4gBG4jYQuF3U7j/orSs5nw==",
511
+ "/util-deprecate@1.0.2": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
512
+ "/utility-types@3.11.0": "sha512-6Z7Ma2aVEWisaL6TvBCy7P8rm2LQoPv6dJ7ecIaIixHcwfbJ0x7mWdbcwlIM5IGQxPZSFYeqRCqlOOeKoJYMkw==",
431
513
  "/v8-compile-cache-lib@3.0.1": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==",
432
514
  "/v8-to-istanbul@9.2.0": "sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA==",
433
515
  "/walker@1.0.8": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==",
package/CHANGELOG.json CHANGED
@@ -1,6 +1,40 @@
1
1
  {
2
2
  "name": "@cityofzion/bs-ethereum",
3
3
  "entries": [
4
+ {
5
+ "version": "1.1.0",
6
+ "tag": "@cityofzion/bs-ethereum_v1.1.0",
7
+ "date": "Thu, 04 Apr 2024 19:52:20 GMT",
8
+ "comments": {
9
+ "minor": [
10
+ {
11
+ "comment": "Add ledger support"
12
+ }
13
+ ],
14
+ "patch": [
15
+ {
16
+ "comment": "Change Goerli to Sepolia and call RPC using testnet instead of Bitquery"
17
+ }
18
+ ],
19
+ "dependency": [
20
+ {
21
+ "comment": "Updating dependency \"@cityofzion/blockchain-service\" to `0.10.0`"
22
+ }
23
+ ]
24
+ }
25
+ },
26
+ {
27
+ "version": "1.0.4",
28
+ "tag": "@cityofzion/bs-ethereum_v1.0.4",
29
+ "date": "Mon, 04 Mar 2024 21:53:09 GMT",
30
+ "comments": {
31
+ "patch": [
32
+ {
33
+ "comment": "fix wrong calculated fee"
34
+ }
35
+ ]
36
+ }
37
+ },
4
38
  {
5
39
  "version": "1.0.3",
6
40
  "tag": "@cityofzion/bs-ethereum_v1.0.3",
package/CHANGELOG.md CHANGED
@@ -1,6 +1,24 @@
1
1
  # Change Log - @cityofzion/bs-ethereum
2
2
 
3
- This log was last generated on Wed, 28 Feb 2024 17:43:01 GMT and should not be manually modified.
3
+ This log was last generated on Thu, 04 Apr 2024 19:52:20 GMT and should not be manually modified.
4
+
5
+ ## 1.1.0
6
+ Thu, 04 Apr 2024 19:52:20 GMT
7
+
8
+ ### Minor changes
9
+
10
+ - Add ledger support
11
+
12
+ ### Patches
13
+
14
+ - Change Goerli to Sepolia and call RPC using testnet instead of Bitquery
15
+
16
+ ## 1.0.4
17
+ Mon, 04 Mar 2024 21:53:09 GMT
18
+
19
+ ### Patches
20
+
21
+ - fix wrong calculated fee
4
22
 
5
23
  ## 1.0.3
6
24
  Wed, 28 Feb 2024 17:43:01 GMT
@@ -1,11 +1,13 @@
1
- import { Account, AccountWithDerivationPath, BSCalculableFee, BSWithNameService, BSWithNft, BlockchainDataService, BlockchainService, ExchangeDataService, Network, NftDataService, PartialBy, Token, TransferParam } from '@cityofzion/blockchain-service';
2
- export declare class BSEthereum<BSCustomName extends string = string> implements BlockchainService, BSWithNft, BSWithNameService, BSCalculableFee {
1
+ import { Account, AccountWithDerivationPath, BSCalculableFee, BSWithLedger, BSWithNameService, BSWithNft, BlockchainDataService, BlockchainService, ExchangeDataService, Network, NftDataService, PartialBy, Token, TransferParam } from '@cityofzion/blockchain-service';
2
+ import { LedgerServiceEthereum } from './LedgerServiceEthereum';
3
+ export declare class BSEthereum<BSCustomName extends string = string> implements BlockchainService, BSWithNft, BSWithNameService, BSCalculableFee, BSWithLedger {
3
4
  readonly blockchainName: BSCustomName;
4
5
  readonly feeToken: Token;
5
6
  readonly derivationPath: string;
6
7
  private readonly bitqueryApiKey;
7
8
  blockchainDataService: BlockchainDataService;
8
9
  exchangeDataService: ExchangeDataService;
10
+ ledgerService: LedgerServiceEthereum;
9
11
  tokens: Token[];
10
12
  nftDataService: NftDataService;
11
13
  network: Network;
@@ -17,9 +19,10 @@ export declare class BSEthereum<BSCustomName extends string = string> implements
17
19
  validateNameServiceDomainFormat(domainName: string): boolean;
18
20
  generateAccountFromMnemonic(mnemonic: string[] | string, index: number): AccountWithDerivationPath;
19
21
  generateAccountFromKey(key: string): Account;
22
+ generateAccountFromPublicKey(publicKey: string): Account;
20
23
  decrypt(json: string, password: string): Promise<Account>;
21
24
  encrypt(key: string, password: string): Promise<string>;
22
- transfer({ senderAccount, intent }: TransferParam): Promise<string>;
23
- calculateTransferFee({ senderAccount, intent }: TransferParam): Promise<string>;
25
+ transfer(param: TransferParam): Promise<string>;
26
+ calculateTransferFee({ intent }: TransferParam): Promise<string>;
24
27
  resolveNameServiceDomain(domainName: string): Promise<string>;
25
28
  }
@@ -42,8 +42,10 @@ const BitqueryEDSEthereum_1 = require("./BitqueryEDSEthereum");
42
42
  const GhostMarketNDSEthereum_1 = require("./GhostMarketNDSEthereum");
43
43
  const RpcBDSEthereum_1 = require("./RpcBDSEthereum");
44
44
  const BitqueryBDSEthereum_1 = require("./BitqueryBDSEthereum");
45
+ const LedgerServiceEthereum_1 = require("./LedgerServiceEthereum");
45
46
  class BSEthereum {
46
47
  constructor(blockchainName, network, bitqueryApiKey) {
48
+ this.ledgerService = new LedgerServiceEthereum_1.LedgerServiceEthereum();
47
49
  this.blockchainName = blockchainName;
48
50
  this.derivationPath = constants_1.DERIVATION_PATH;
49
51
  this.tokens = constants_1.TOKENS[network.type];
@@ -58,7 +60,7 @@ class BSEthereum {
58
60
  url: (_a = param.url) !== null && _a !== void 0 ? _a : constants_1.DEFAULT_URL_BY_NETWORK_TYPE[param.type],
59
61
  };
60
62
  this.network = network;
61
- if (network.type === 'custom') {
63
+ if (network.type !== 'mainnet') {
62
64
  this.blockchainDataService = new RpcBDSEthereum_1.RpcBDSEthereum(network);
63
65
  }
64
66
  else {
@@ -109,6 +111,14 @@ class BSEthereum {
109
111
  type: 'privateKey',
110
112
  };
111
113
  }
114
+ generateAccountFromPublicKey(publicKey) {
115
+ const address = ethers_1.ethers.utils.computeAddress(publicKey);
116
+ return {
117
+ address,
118
+ key: publicKey,
119
+ type: 'publicKey',
120
+ };
121
+ }
112
122
  decrypt(json, password) {
113
123
  return __awaiter(this, void 0, void 0, function* () {
114
124
  const wallet = yield ethers_1.ethers.Wallet.fromEncryptedJson(json, password);
@@ -125,48 +135,56 @@ class BSEthereum {
125
135
  return wallet.encrypt(password);
126
136
  });
127
137
  }
128
- transfer({ senderAccount, intent }) {
138
+ transfer(param) {
129
139
  var _a;
130
140
  return __awaiter(this, void 0, void 0, function* () {
131
141
  const provider = new ethers_1.ethers.providers.JsonRpcProvider(this.network.url);
132
- const wallet = new ethers_1.ethers.Wallet(senderAccount.key, provider);
133
- let transaction;
134
- const decimals = (_a = intent.tokenDecimals) !== null && _a !== void 0 ? _a : 18;
135
- const amount = ethersBigNumber.parseFixed(intent.amount, decimals);
136
- const isNative = constants_1.NATIVE_ASSETS.some(asset => asset.hash === intent.tokenHash);
137
- if (!isNative) {
138
- const contract = new ethers_1.ethers.Contract(intent.tokenHash, ['function transfer(address to, uint amount) returns (bool)'], wallet);
139
- transaction = yield contract.transfer(intent.receiverAddress, amount);
142
+ const signTransactionFunction = param.isLedger
143
+ ? yield this.ledgerService.getSignTransactionFunction(param.ledgerTransport)
144
+ : new ethers_1.ethers.Wallet(param.senderAccount.key, provider).signTransaction;
145
+ const decimals = (_a = param.intent.tokenDecimals) !== null && _a !== void 0 ? _a : 18;
146
+ const amount = ethersBigNumber.parseFixed(param.intent.amount, decimals);
147
+ let transactionParams;
148
+ const isNative = constants_1.NATIVE_ASSETS.some(asset => asset.hash === param.intent.tokenHash);
149
+ if (isNative) {
150
+ transactionParams = {
151
+ to: param.intent.receiverAddress,
152
+ value: amount,
153
+ };
140
154
  }
141
155
  else {
142
- transaction = yield wallet.sendTransaction({
143
- to: intent.receiverAddress,
144
- value: amount,
145
- });
156
+ const contract = new ethers_1.ethers.Contract(param.intent.tokenHash, [
157
+ 'function transfer(address to, uint amount) returns (bool)',
158
+ ]);
159
+ transactionParams = yield contract.populateTransaction.transfer(param.intent.receiverAddress, amount);
146
160
  }
147
- return transaction.hash;
161
+ const voidSigner = new ethers_1.ethers.VoidSigner(param.senderAccount.address, provider);
162
+ const transaction = yield voidSigner.populateTransaction(transactionParams);
163
+ const signedTransaction = yield signTransactionFunction(transaction);
164
+ const transactionResponse = yield provider.sendTransaction(signedTransaction);
165
+ return transactionResponse.hash;
148
166
  });
149
167
  }
150
- calculateTransferFee({ senderAccount, intent }) {
168
+ calculateTransferFee({ intent }) {
151
169
  var _a;
152
170
  return __awaiter(this, void 0, void 0, function* () {
153
171
  const provider = new ethers_1.ethers.providers.JsonRpcProvider(this.network.url);
154
- const wallet = new ethers_1.ethers.Wallet(senderAccount.key, provider);
172
+ const gasPrice = yield provider.getGasPrice();
155
173
  let estimated;
156
174
  const isNative = constants_1.NATIVE_ASSETS.some(asset => asset.hash === intent.tokenHash);
157
175
  const decimals = (_a = intent.tokenDecimals) !== null && _a !== void 0 ? _a : 18;
158
176
  const amount = ethersBigNumber.parseFixed(intent.amount, decimals);
159
177
  if (!isNative) {
160
- const contract = new ethers_1.ethers.Contract(intent.tokenHash, ['function transfer(address to, uint amount) returns (bool)'], wallet);
178
+ const contract = new ethers_1.ethers.Contract(intent.tokenHash, ['function transfer(address to, uint amount) returns (bool)'], provider);
161
179
  estimated = yield contract.estimateGas.transfer(intent.receiverAddress, amount);
162
180
  }
163
181
  else {
164
- estimated = yield wallet.estimateGas({
182
+ estimated = yield provider.estimateGas({
165
183
  to: intent.receiverAddress,
166
184
  value: amount,
167
185
  });
168
186
  }
169
- return ethers_1.ethers.utils.formatEther(estimated);
187
+ return ethers_1.ethers.utils.formatEther(gasPrice.mul(estimated));
170
188
  });
171
189
  }
172
190
  resolveNameServiceDomain(domainName) {
@@ -0,0 +1,9 @@
1
+ import { LedgerService } from '@cityofzion/blockchain-service';
2
+ import Transport from '@ledgerhq/hw-transport';
3
+ import { ethers } from 'ethers';
4
+ export declare class LedgerServiceEthereum implements LedgerService {
5
+ private readonly defaultPath;
6
+ getAddress(transport: Transport): Promise<string>;
7
+ getPublicKey(transport: Transport): Promise<string>;
8
+ getSignTransactionFunction(transport: Transport): Promise<(transaction: ethers.providers.TransactionRequest) => Promise<string>>;
9
+ }
@@ -0,0 +1,73 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
26
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
27
+ return new (P || (P = Promise))(function (resolve, reject) {
28
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
29
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
30
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
31
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
32
+ });
33
+ };
34
+ Object.defineProperty(exports, "__esModule", { value: true });
35
+ exports.LedgerServiceEthereum = void 0;
36
+ const hw_app_eth_1 = __importStar(require("@ledgerhq/hw-app-eth"));
37
+ const ethers_1 = require("ethers");
38
+ class LedgerServiceEthereum {
39
+ constructor() {
40
+ this.defaultPath = "44'/60'/0'/0/0";
41
+ }
42
+ getAddress(transport) {
43
+ return __awaiter(this, void 0, void 0, function* () {
44
+ const ledgerApp = new hw_app_eth_1.default(transport);
45
+ const { address } = yield ledgerApp.getAddress(this.defaultPath);
46
+ return address;
47
+ });
48
+ }
49
+ getPublicKey(transport) {
50
+ return __awaiter(this, void 0, void 0, function* () {
51
+ const ledgerApp = new hw_app_eth_1.default(transport);
52
+ const { publicKey } = yield ledgerApp.getAddress(this.defaultPath);
53
+ return '0x' + publicKey;
54
+ });
55
+ }
56
+ getSignTransactionFunction(transport) {
57
+ return __awaiter(this, void 0, void 0, function* () {
58
+ return (transaction) => __awaiter(this, void 0, void 0, function* () {
59
+ const ledgerApp = new hw_app_eth_1.default(transport);
60
+ const unsignedTransaction = Object.assign(Object.assign({}, transaction), { nonce: transaction.nonce ? ethers_1.ethers.BigNumber.from(transaction.nonce).toNumber() : undefined });
61
+ const serializedUnsignedTransaction = ethers_1.ethers.utils.serializeTransaction(unsignedTransaction).substring(2);
62
+ const resolution = yield hw_app_eth_1.ledgerService.resolveTransaction(serializedUnsignedTransaction, {}, {});
63
+ const signature = yield ledgerApp.signTransaction(this.defaultPath, serializedUnsignedTransaction, resolution);
64
+ return ethers_1.ethers.utils.serializeTransaction(unsignedTransaction, {
65
+ v: ethers_1.ethers.BigNumber.from('0x' + signature.v).toNumber(),
66
+ r: '0x' + signature.r,
67
+ s: '0x' + signature.s,
68
+ });
69
+ });
70
+ });
71
+ }
72
+ }
73
+ exports.LedgerServiceEthereum = LedgerServiceEthereum;
package/dist/constants.js CHANGED
@@ -13,7 +13,7 @@ exports.TOKENS = {
13
13
  exports.NATIVE_ASSETS = common_json_1.default;
14
14
  exports.DEFAULT_URL_BY_NETWORK_TYPE = {
15
15
  mainnet: 'https://ethereum-mainnet-rpc.allthatnode.com',
16
- testnet: 'https://ethereum-goerli.publicnode.com',
16
+ testnet: 'https://ethereum-sepolia-rpc.publicnode.com',
17
17
  custom: 'http://127.0.0.1:8545',
18
18
  };
19
19
  exports.BITQUERY_URL = 'https://graphql.bitquery.io';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cityofzion/bs-ethereum",
3
- "version": "1.0.3",
3
+ "version": "1.1.0",
4
4
  "main": "dist/index.js",
5
5
  "types": "dist/index.d.ts",
6
6
  "repository": "https://github.com/CityOfZion/blockchain-services",
@@ -16,7 +16,10 @@
16
16
  "@ethersproject/json-wallets": "5.7.0",
17
17
  "@ethersproject/bytes": "5.7.0",
18
18
  "@ethersproject/bignumber": "5.7.0",
19
- "@cityofzion/blockchain-service": "0.9.1"
19
+ "@ledgerhq/hw-transport-node-hid": "~6.28.5",
20
+ "@ledgerhq/hw-transport": "~6.30.5",
21
+ "@ledgerhq/hw-app-eth": "~6.35.7",
22
+ "@cityofzion/blockchain-service": "0.10.0"
20
23
  },
21
24
  "devDependencies": {
22
25
  "@types/jest": "29.5.3",
package/src/BSEthereum.ts CHANGED
@@ -2,6 +2,7 @@ import {
2
2
  Account,
3
3
  AccountWithDerivationPath,
4
4
  BSCalculableFee,
5
+ BSWithLedger,
5
6
  BSWithNameService,
6
7
  BSWithNft,
7
8
  BlockchainDataService,
@@ -22,9 +23,9 @@ import { BitqueryEDSEthereum } from './BitqueryEDSEthereum'
22
23
  import { GhostMarketNDSEthereum } from './GhostMarketNDSEthereum'
23
24
  import { RpcBDSEthereum } from './RpcBDSEthereum'
24
25
  import { BitqueryBDSEthereum } from './BitqueryBDSEthereum'
25
-
26
+ import { LedgerServiceEthereum } from './LedgerServiceEthereum'
26
27
  export class BSEthereum<BSCustomName extends string = string>
27
- implements BlockchainService, BSWithNft, BSWithNameService, BSCalculableFee
28
+ implements BlockchainService, BSWithNft, BSWithNameService, BSCalculableFee, BSWithLedger
28
29
  {
29
30
  readonly blockchainName: BSCustomName
30
31
  readonly feeToken: Token
@@ -33,6 +34,7 @@ export class BSEthereum<BSCustomName extends string = string>
33
34
 
34
35
  blockchainDataService!: BlockchainDataService
35
36
  exchangeDataService!: ExchangeDataService
37
+ ledgerService: LedgerServiceEthereum = new LedgerServiceEthereum()
36
38
  tokens: Token[]
37
39
  nftDataService!: NftDataService
38
40
  network!: Network
@@ -54,7 +56,7 @@ export class BSEthereum<BSCustomName extends string = string>
54
56
  }
55
57
  this.network = network
56
58
 
57
- if (network.type === 'custom') {
59
+ if (network.type !== 'mainnet') {
58
60
  this.blockchainDataService = new RpcBDSEthereum(network)
59
61
  } else {
60
62
  this.blockchainDataService = new BitqueryBDSEthereum(network, this.bitqueryApiKey)
@@ -104,6 +106,7 @@ export class BSEthereum<BSCustomName extends string = string>
104
106
 
105
107
  generateAccountFromKey(key: string): Account {
106
108
  const wallet = new ethers.Wallet(key)
109
+
107
110
  return {
108
111
  address: wallet.address,
109
112
  key,
@@ -111,6 +114,15 @@ export class BSEthereum<BSCustomName extends string = string>
111
114
  }
112
115
  }
113
116
 
117
+ generateAccountFromPublicKey(publicKey: string): Account {
118
+ const address = ethers.utils.computeAddress(publicKey)
119
+ return {
120
+ address,
121
+ key: publicKey,
122
+ type: 'publicKey',
123
+ }
124
+ }
125
+
114
126
  async decrypt(json: string, password: string): Promise<Account> {
115
127
  const wallet = await ethers.Wallet.fromEncryptedJson(json, password)
116
128
  return {
@@ -125,35 +137,43 @@ export class BSEthereum<BSCustomName extends string = string>
125
137
  return wallet.encrypt(password)
126
138
  }
127
139
 
128
- async transfer({ senderAccount, intent }: TransferParam): Promise<string> {
140
+ async transfer(param: TransferParam): Promise<string> {
129
141
  const provider = new ethers.providers.JsonRpcProvider(this.network.url)
130
- const wallet = new ethers.Wallet(senderAccount.key, provider)
131
142
 
132
- let transaction: ethers.providers.TransactionResponse
133
- const decimals = intent.tokenDecimals ?? 18
134
- const amount = ethersBigNumber.parseFixed(intent.amount, decimals)
143
+ const signTransactionFunction = param.isLedger
144
+ ? await this.ledgerService.getSignTransactionFunction(param.ledgerTransport)
145
+ : new ethers.Wallet(param.senderAccount.key, provider).signTransaction
135
146
 
136
- const isNative = NATIVE_ASSETS.some(asset => asset.hash === intent.tokenHash)
137
- if (!isNative) {
138
- const contract = new ethers.Contract(
139
- intent.tokenHash,
140
- ['function transfer(address to, uint amount) returns (bool)'],
141
- wallet
142
- )
143
- transaction = await contract.transfer(intent.receiverAddress, amount)
144
- } else {
145
- transaction = await wallet.sendTransaction({
146
- to: intent.receiverAddress,
147
+ const decimals = param.intent.tokenDecimals ?? 18
148
+ const amount = ethersBigNumber.parseFixed(param.intent.amount, decimals)
149
+
150
+ let transactionParams: ethers.utils.Deferrable<ethers.providers.TransactionRequest>
151
+
152
+ const isNative = NATIVE_ASSETS.some(asset => asset.hash === param.intent.tokenHash)
153
+ if (isNative) {
154
+ transactionParams = {
155
+ to: param.intent.receiverAddress,
147
156
  value: amount,
148
- })
157
+ }
158
+ } else {
159
+ const contract = new ethers.Contract(param.intent.tokenHash, [
160
+ 'function transfer(address to, uint amount) returns (bool)',
161
+ ])
162
+ transactionParams = await contract.populateTransaction.transfer(param.intent.receiverAddress, amount)
149
163
  }
150
164
 
151
- return transaction.hash
165
+ const voidSigner = new ethers.VoidSigner(param.senderAccount.address, provider)
166
+ const transaction = await voidSigner.populateTransaction(transactionParams)
167
+
168
+ const signedTransaction = await signTransactionFunction(transaction)
169
+ const transactionResponse = await provider.sendTransaction(signedTransaction)
170
+ return transactionResponse.hash
152
171
  }
153
172
 
154
- async calculateTransferFee({ senderAccount, intent }: TransferParam): Promise<string> {
173
+ async calculateTransferFee({ intent }: TransferParam): Promise<string> {
155
174
  const provider = new ethers.providers.JsonRpcProvider(this.network.url)
156
- const wallet = new ethers.Wallet(senderAccount.key, provider)
175
+
176
+ const gasPrice = await provider.getGasPrice()
157
177
 
158
178
  let estimated: ethers.BigNumber
159
179
 
@@ -165,18 +185,18 @@ export class BSEthereum<BSCustomName extends string = string>
165
185
  const contract = new ethers.Contract(
166
186
  intent.tokenHash,
167
187
  ['function transfer(address to, uint amount) returns (bool)'],
168
- wallet
188
+ provider
169
189
  )
170
190
 
171
191
  estimated = await contract.estimateGas.transfer(intent.receiverAddress, amount)
172
192
  } else {
173
- estimated = await wallet.estimateGas({
193
+ estimated = await provider.estimateGas({
174
194
  to: intent.receiverAddress,
175
195
  value: amount,
176
196
  })
177
197
  }
178
198
 
179
- return ethers.utils.formatEther(estimated)
199
+ return ethers.utils.formatEther(gasPrice.mul(estimated))
180
200
  }
181
201
 
182
202
  async resolveNameServiceDomain(domainName: string): Promise<string> {
@@ -0,0 +1,44 @@
1
+ import { LedgerService } from '@cityofzion/blockchain-service'
2
+ import Transport from '@ledgerhq/hw-transport'
3
+ import LedgerEthereumApp, { ledgerService as LedgerEthereumAppService } from '@ledgerhq/hw-app-eth'
4
+ import { ethers } from 'ethers'
5
+
6
+ export class LedgerServiceEthereum implements LedgerService {
7
+ private readonly defaultPath = "44'/60'/0'/0/0"
8
+
9
+ async getAddress(transport: Transport): Promise<string> {
10
+ const ledgerApp = new LedgerEthereumApp(transport)
11
+ const { address } = await ledgerApp.getAddress(this.defaultPath)
12
+
13
+ return address
14
+ }
15
+
16
+ async getPublicKey(transport: Transport): Promise<string> {
17
+ const ledgerApp = new LedgerEthereumApp(transport)
18
+ const { publicKey } = await ledgerApp.getAddress(this.defaultPath)
19
+
20
+ return '0x' + publicKey
21
+ }
22
+
23
+ async getSignTransactionFunction(transport: Transport) {
24
+ return async (transaction: ethers.providers.TransactionRequest): Promise<string> => {
25
+ const ledgerApp = new LedgerEthereumApp(transport)
26
+
27
+ const unsignedTransaction: ethers.utils.UnsignedTransaction = {
28
+ ...transaction,
29
+ nonce: transaction.nonce ? ethers.BigNumber.from(transaction.nonce).toNumber() : undefined,
30
+ }
31
+
32
+ const serializedUnsignedTransaction = ethers.utils.serializeTransaction(unsignedTransaction).substring(2)
33
+
34
+ const resolution = await LedgerEthereumAppService.resolveTransaction(serializedUnsignedTransaction, {}, {})
35
+ const signature = await ledgerApp.signTransaction(this.defaultPath, serializedUnsignedTransaction, resolution)
36
+
37
+ return ethers.utils.serializeTransaction(unsignedTransaction, {
38
+ v: ethers.BigNumber.from('0x' + signature.v).toNumber(),
39
+ r: '0x' + signature.r,
40
+ s: '0x' + signature.s,
41
+ })
42
+ }
43
+ }
44
+ }
@@ -1,6 +1,7 @@
1
1
  import { ethers } from 'ethers'
2
2
  import { BSEthereum } from '../BSEthereum'
3
3
  import { Account } from '@cityofzion/blockchain-service'
4
+ import TransportNodeHid from '@ledgerhq/hw-transport-node-hid'
4
5
 
5
6
  let bsEthereum: BSEthereum
6
7
  let wallet: ethers.Wallet
@@ -89,8 +90,8 @@ describe('BSEthereum', () => {
89
90
  },
90
91
  })
91
92
 
92
- expect(fee).toEqual(expect.any(Number))
93
- })
93
+ expect(fee).toEqual(expect.any(String))
94
+ }, 50000)
94
95
 
95
96
  it.skip('Should be able to transfer a native token', async () => {
96
97
  const account = bsEthereum.generateAccountFromKey(process.env.TESTNET_PRIVATE_KEY as string)
@@ -124,6 +125,46 @@ describe('BSEthereum', () => {
124
125
  expect(transactionHash).toEqual(expect.any(String))
125
126
  }, 50000)
126
127
 
128
+ it.skip('Should be able to transfer a native token with ledger', async () => {
129
+ const transport = await TransportNodeHid.create()
130
+ const publicKey = await bsEthereum.ledgerService.getPublicKey(transport)
131
+ const account = bsEthereum.generateAccountFromPublicKey(publicKey)
132
+
133
+ const transactionHash = await bsEthereum.transfer({
134
+ senderAccount: account,
135
+ intent: {
136
+ amount: '0.00000001',
137
+ receiverAddress: '0x82B5Cd984880C8A821429cFFf89f36D35BaeBE89',
138
+ tokenDecimals: 18,
139
+ tokenHash: '-',
140
+ },
141
+ isLedger: true,
142
+ ledgerTransport: transport,
143
+ })
144
+
145
+ expect(transactionHash).toEqual(expect.any(String))
146
+ }, 50000)
147
+
148
+ it.skip('Should be able to transfer a ERC20 token with ledger', async () => {
149
+ const transport = await TransportNodeHid.create()
150
+ const publicKey = await bsEthereum.ledgerService.getPublicKey(transport)
151
+ const account = bsEthereum.generateAccountFromPublicKey(publicKey)
152
+
153
+ const transactionHash = await bsEthereum.transfer({
154
+ senderAccount: account,
155
+ intent: {
156
+ amount: '0.00000001',
157
+ receiverAddress: '0x82B5Cd984880C8A821429cFFf89f36D35BaeBE89',
158
+ tokenDecimals: 18,
159
+ tokenHash: '0xcf185f2F3Fe19D82bFdcee59E3330FD7ba5f27ce',
160
+ },
161
+ isLedger: true,
162
+ ledgerTransport: transport,
163
+ })
164
+
165
+ expect(transactionHash).toEqual(expect.any(String))
166
+ }, 50000)
167
+
127
168
  it('Should be able to resolve a name service domain', async () => {
128
169
  const address = await bsEthereum.resolveNameServiceDomain('alice.eth')
129
170
  expect(address).toEqual('0xa974890156A3649A23a6C0f2ebd77D6F7A7333d4')
@@ -0,0 +1,106 @@
1
+ import { BitqueryBDSEthereum } from '../BitqueryBDSEthereum'
2
+ import { DEFAULT_URL_BY_NETWORK_TYPE } from '../constants'
3
+
4
+ const bitqueryBDSEthereum = new BitqueryBDSEthereum(
5
+ { type: 'testnet', url: DEFAULT_URL_BY_NETWORK_TYPE.testnet },
6
+ process.env.BITQUERY_API_KEY as string
7
+ )
8
+
9
+ describe('BitqueryBDSEthereum', () => {
10
+ it('Should be able to get transaction - %s', async () => {
11
+ const hash = '0x43fa3015d077a13888409cfbd6228df8900abcd5314ff11ea6ce0c49e8b7c94d'
12
+ const transaction = await bitqueryBDSEthereum.getTransaction(hash)
13
+
14
+ expect(transaction).toEqual(
15
+ expect.objectContaining({
16
+ block: expect.any(Number),
17
+ hash,
18
+ notifications: [],
19
+ time: expect.any(Number),
20
+ })
21
+ )
22
+ transaction.transfers.forEach(transfer => {
23
+ expect(transfer).toEqual(
24
+ expect.objectContaining({
25
+ from: expect.any(String),
26
+ to: expect.any(String),
27
+ contractHash: expect.any(String),
28
+ amount: expect.any(String),
29
+ type: expect.any(String),
30
+ })
31
+ )
32
+ })
33
+ }, 10000)
34
+
35
+ it('Should be able to get transactions of address - %s', async () => {
36
+ const address = '0x82B5Cd984880C8A821429cFFf89f36D35BaeBE89'
37
+ const response = await bitqueryBDSEthereum.getTransactionsByAddress({ address: address, page: 1 })
38
+ expect(response.totalCount).toBeGreaterThan(0)
39
+ response.transactions.forEach(transaction => {
40
+ expect(transaction).toEqual(
41
+ expect.objectContaining({
42
+ block: expect.any(Number),
43
+ hash: expect.any(String),
44
+ notifications: [],
45
+ time: expect.any(Number),
46
+ fee: expect.any(String),
47
+ })
48
+ )
49
+
50
+ transaction.transfers.forEach(transfer => {
51
+ expect(transfer).toEqual(
52
+ expect.objectContaining({
53
+ from: expect.any(String),
54
+ to: expect.any(String),
55
+ contractHash: expect.any(String),
56
+ amount: expect.any(String),
57
+ type: expect.any(String),
58
+ })
59
+ )
60
+ })
61
+ })
62
+ }, 10000)
63
+
64
+ it('Should be able to get eth info - %s', async () => {
65
+ const hash = '-'
66
+ const token = await bitqueryBDSEthereum.getTokenInfo(hash)
67
+
68
+ expect(token).toEqual({
69
+ symbol: 'ETH',
70
+ name: 'Ethereum',
71
+ hash: '-',
72
+ decimals: 18,
73
+ })
74
+ })
75
+
76
+ it('Should be able to get token info - %s', async () => {
77
+ const hash = '0xBA62BCfcAaFc6622853cca2BE6Ac7d845BC0f2Dc'
78
+ const token = await bitqueryBDSEthereum.getTokenInfo(hash)
79
+
80
+ expect(token).toEqual({
81
+ hash: '0xba62bcfcaafc6622853cca2be6ac7d845bc0f2dc',
82
+ name: 'FaucetToken',
83
+ symbol: 'FAU',
84
+ decimals: 18,
85
+ })
86
+ })
87
+
88
+ it('Should be able to get balance - %s', async () => {
89
+ const address = '0x82B5Cd984880C8A821429cFFf89f36D35BaeBE89'
90
+ const balance = await bitqueryBDSEthereum.getBalance(address)
91
+
92
+ balance.forEach(balance => {
93
+ expect(balance).toEqual(
94
+ expect.objectContaining({
95
+ amount: expect.any(String),
96
+ token: {
97
+ hash: expect.any(String),
98
+ name: expect.any(String),
99
+ symbol: expect.any(String),
100
+ decimals: expect.any(Number),
101
+ },
102
+ })
103
+ )
104
+ })
105
+ })
106
+ })
@@ -0,0 +1,62 @@
1
+ import { RpcBDSEthereum } from '../RpcBDSEthereum'
2
+ import { DEFAULT_URL_BY_NETWORK_TYPE } from '../constants'
3
+
4
+ const rpcBDSEthereum = new RpcBDSEthereum({ type: 'testnet', url: DEFAULT_URL_BY_NETWORK_TYPE.testnet })
5
+
6
+ describe('RpcBDSEthereum', () => {
7
+ it('Should be able to get transaction', async () => {
8
+ const hash = '0x48eac645fac2280d7ac89a319372d7a38d52516f8b3003574bfaaed31b471ff3'
9
+ const transaction = await rpcBDSEthereum.getTransaction(hash)
10
+
11
+ expect(transaction).toEqual(
12
+ expect.objectContaining({
13
+ block: expect.any(Number),
14
+ hash,
15
+ notifications: [],
16
+ time: expect.any(Number),
17
+ })
18
+ )
19
+ transaction.transfers.forEach(transfer => {
20
+ expect(transfer).toEqual(
21
+ expect.objectContaining({
22
+ from: expect.any(String),
23
+ to: expect.any(String),
24
+ contractHash: expect.any(String),
25
+ amount: expect.any(String),
26
+ type: expect.any(String),
27
+ })
28
+ )
29
+ })
30
+ })
31
+
32
+ it('Should be able to get eth info', async () => {
33
+ const hash = '-'
34
+ const token = await rpcBDSEthereum.getTokenInfo(hash)
35
+
36
+ expect(token).toEqual({
37
+ symbol: 'ETH',
38
+ name: 'Ethereum',
39
+ hash: '-',
40
+ decimals: 18,
41
+ })
42
+ })
43
+
44
+ it('Should be able to get balance', async () => {
45
+ const address = '0xbA65F285D1F9E0bf76Ab01211547979a3b60011A'
46
+ const balance = await rpcBDSEthereum.getBalance(address)
47
+
48
+ balance.forEach(balance => {
49
+ expect(balance).toEqual(
50
+ expect.objectContaining({
51
+ amount: expect.any(String),
52
+ token: {
53
+ hash: expect.any(String),
54
+ name: expect.any(String),
55
+ symbol: expect.any(String),
56
+ decimals: expect.any(Number),
57
+ },
58
+ })
59
+ )
60
+ })
61
+ })
62
+ })
package/src/constants.ts CHANGED
@@ -13,7 +13,7 @@ export const NATIVE_ASSETS = commom
13
13
 
14
14
  export const DEFAULT_URL_BY_NETWORK_TYPE: Record<NetworkType, string> = {
15
15
  mainnet: 'https://ethereum-mainnet-rpc.allthatnode.com',
16
- testnet: 'https://ethereum-goerli.publicnode.com',
16
+ testnet: 'https://ethereum-sepolia-rpc.publicnode.com',
17
17
  custom: 'http://127.0.0.1:8545',
18
18
  }
19
19
 
@@ -1,126 +0,0 @@
1
- import { BlockchainDataService } from '@cityofzion/blockchain-service'
2
- import { BitqueryBDSEthereum } from '../BitqueryBDSEthereum'
3
- import { RpcBDSEthereum } from '../RpcBDSEthereum'
4
- import { DEFAULT_URL_BY_NETWORK_TYPE } from '../constants'
5
-
6
- const bitqueryBDSEthereum = new BitqueryBDSEthereum(
7
- { type: 'testnet', url: DEFAULT_URL_BY_NETWORK_TYPE.testnet },
8
- process.env.BITQUERY_API_KEY as string
9
- )
10
- const rpcBDSEthereum = new RpcBDSEthereum({ type: 'testnet', url: DEFAULT_URL_BY_NETWORK_TYPE.testnet })
11
-
12
- describe('BDSEthereum', () => {
13
- it.each([rpcBDSEthereum, bitqueryBDSEthereum])(
14
- 'Should be able to get transaction - %s',
15
- async (BDSEthereum: BlockchainDataService) => {
16
- const hash = '0x43fa3015d077a13888409cfbd6228df8900abcd5314ff11ea6ce0c49e8b7c94d'
17
- const transaction = await BDSEthereum.getTransaction(hash)
18
-
19
- expect(transaction).toEqual(
20
- expect.objectContaining({
21
- block: expect.any(Number),
22
- hash,
23
- notifications: [],
24
- time: expect.any(Number),
25
- })
26
- )
27
- transaction.transfers.forEach(transfer => {
28
- expect(transfer).toEqual(
29
- expect.objectContaining({
30
- from: expect.any(String),
31
- to: expect.any(String),
32
- contractHash: expect.any(String),
33
- amount: expect.any(String),
34
- type: expect.any(String),
35
- })
36
- )
37
- })
38
- },
39
- 10000
40
- )
41
-
42
- it.each([bitqueryBDSEthereum])(
43
- 'Should be able to get transactions of address - %s',
44
- async (BDSEthereum: BlockchainDataService) => {
45
- const address = '0x82B5Cd984880C8A821429cFFf89f36D35BaeBE89'
46
- const response = await BDSEthereum.getTransactionsByAddress({ address: address, page: 1 })
47
- expect(response.totalCount).toBeGreaterThan(0)
48
- response.transactions.forEach(transaction => {
49
- expect(transaction).toEqual(
50
- expect.objectContaining({
51
- block: expect.any(Number),
52
- hash: expect.any(String),
53
- notifications: [],
54
- time: expect.any(Number),
55
- fee: expect.any(String),
56
- })
57
- )
58
-
59
- transaction.transfers.forEach(transfer => {
60
- expect(transfer).toEqual(
61
- expect.objectContaining({
62
- from: expect.any(String),
63
- to: expect.any(String),
64
- contractHash: expect.any(String),
65
- amount: expect.any(String),
66
- type: expect.any(String),
67
- })
68
- )
69
- })
70
- })
71
- },
72
- 10000
73
- )
74
-
75
- it.each([bitqueryBDSEthereum, rpcBDSEthereum])(
76
- 'Should be able to get eth info - %s',
77
- async (BDSEthereum: BlockchainDataService) => {
78
- const hash = '-'
79
- const token = await BDSEthereum.getTokenInfo(hash)
80
-
81
- expect(token).toEqual({
82
- symbol: 'ETH',
83
- name: 'Ethereum',
84
- hash: '-',
85
- decimals: 18,
86
- })
87
- }
88
- )
89
-
90
- it.each([bitqueryBDSEthereum])(
91
- 'Should be able to get token info - %s',
92
- async (BDSEthereum: BlockchainDataService) => {
93
- const hash = '0xBA62BCfcAaFc6622853cca2BE6Ac7d845BC0f2Dc'
94
- const token = await BDSEthereum.getTokenInfo(hash)
95
-
96
- expect(token).toEqual({
97
- hash: '0xba62bcfcaafc6622853cca2be6ac7d845bc0f2dc',
98
- name: 'FaucetToken',
99
- symbol: 'FAU',
100
- decimals: 18,
101
- })
102
- }
103
- )
104
-
105
- it.each([bitqueryBDSEthereum, rpcBDSEthereum])(
106
- 'Should be able to get balance - %s',
107
- async (BDSEthereum: BlockchainDataService) => {
108
- const address = '0x82B5Cd984880C8A821429cFFf89f36D35BaeBE89'
109
- const balance = await BDSEthereum.getBalance(address)
110
-
111
- balance.forEach(balance => {
112
- expect(balance).toEqual(
113
- expect.objectContaining({
114
- amount: expect.any(String),
115
- token: {
116
- hash: expect.any(String),
117
- name: expect.any(String),
118
- symbol: expect.any(String),
119
- decimals: expect.any(Number),
120
- },
121
- })
122
- )
123
- })
124
- }
125
- )
126
- })