Compare commits

...

1487 Commits

Author SHA1 Message Date
Richard Moore
7bc9c6b953 admin: updated dist files 2022-04-13 21:54:20 -04:00
Richard Moore
0855d6e9f5 Support new OpenEthereum NONCE_EXPIRED string (#2845, #2846). 2022-04-13 16:51:17 -04:00
Richard Moore
948f77050d admin: fixed update scripts to not conflict with reticulate used in v6 2022-04-13 00:26:24 -04:00
Richard Moore
9e57e71dc0 admin: updated dist files. 2022-04-13 00:25:25 -04:00
Richard Moore
dab6ede226 Mimic Hardhard error strings in CALL_EXCEPTION for popular matchers (#2849, #2862). 2022-04-12 23:54:39 -04:00
Richard Moore
1f6c0ab281 admin: Added more environment options to bug issue to help identify network. 2022-04-12 17:05:49 -04:00
Richard Moore
056d7c8bfc Fix pocket API key not being passed in for default provider (#2890). 2022-04-12 16:20:32 -04:00
Richard Moore
47c41143cb admin: added issue template for v6 beta 2022-04-12 13:46:15 -04:00
Richard Moore
ef1b28e958 admin: updated dist files 2022-03-25 17:56:35 -04:00
Richard Moore
e192903050 Fixed left-padding in arrayify (#2833). 2022-03-25 17:47:46 -04:00
Richard Moore
9d9b14b952 More robust JSON-RPC error handling for reverted executions (#2603). 2022-03-25 17:40:45 -04:00
Richard Moore
bc400c7b87 admin: updated spell-check dictionary 2022-03-25 04:33:51 -04:00
Richard Moore
120dcd024a admin: added enhancement tag for feature request issues. 2022-03-25 04:33:20 -04:00
Richard Moore
04f7a9f3b7 admin: updated dist files. 2022-03-25 04:32:41 -04:00
Richard Moore
e70f3fe26f Added IPNS support for ENS contenthash. 2022-03-25 03:57:43 -04:00
Richard Moore
ef529dc5e6 admin: updated issue templates 2022-03-19 05:48:01 -04:00
Richard Moore
9f0967f21f admin: updated issue forms 2022-03-19 05:44:40 -04:00
Richard Moore
774c310389 admin: updated issue templates 2022-03-19 05:41:13 -04:00
Richard Moore
21fae9f0ba admin: updating issue templates 2022-03-19 05:39:31 -04:00
Richard Moore
ce85a7e976 admin: updated issue form for bugs 2022-03-19 03:28:16 -04:00
Richard Moore
7c4a9083c2 admin: updated issue form for bugs 2022-03-19 03:27:24 -04:00
Richard Moore
7becc93ed0 admin: update issue template 2022-03-19 03:02:06 -04:00
Richard Moore
540a670f94 admin: updated spell-check dictionary 2022-03-19 03:00:15 -04:00
Richard Moore
ab628c285e admin: updated dist files 2022-03-19 02:59:38 -04:00
Richard Moore
9bff2cb3d9 docs: updated API key info 2022-03-19 02:48:17 -04:00
Richard Moore
96de58122a Added initial AnkrProvider 2022-03-19 02:45:59 -04:00
Richard Moore
b1c7f5c21a admin: updated dist files. 2022-03-16 01:25:22 -04:00
Richard Moore
905e98aa39 Update test cases for CCIP Read fix (#2478). 2022-03-16 01:20:11 -04:00
Richard Moore
dca0d14d38 admin: updated dist files 2022-03-15 22:04:05 -04:00
Richard Moore
5998fea53d Fix issue with CCIP Read using wrong sender (#2478). 2022-03-15 21:33:06 -04:00
Richard Moore
dfaa8ee7e6 admin: updated dist files 2022-03-09 14:58:07 -05:00
Richard Moore
fa4a29028d Tweaked test case to re-order transaction after event listeners added. 2022-03-09 14:51:48 -05:00
Richard Moore
f46aa75ef1 Fix events getting blocked from fix for missed events (#1798, #1814, #1830, #2274, #2652). 2022-03-09 14:49:37 -05:00
Richard Moore
d160bac273 Ignore errors when resolving ENS resolver properties. 2022-03-09 14:31:16 -05:00
Richard Moore
be518c32ec Enable CCIP Read for ENS resolvers (#2478). 2022-03-09 14:00:23 -05:00
Richard Moore
26cdbab59b admin: Updated spell check file 2022-03-09 02:56:46 -05:00
Richard Moore
b8cda5dffd admin: updated dist files 2022-03-09 02:56:08 -05:00
Richard Moore
f67a9a8569 Fix missing events on certain network conditions (#1798, #1814, #1830, #2274, #2652). 2022-03-09 02:08:37 -05:00
Richard Moore
bae215eb7f Added defaultProvider option to omit specific Providers. 2022-03-08 17:21:29 -05:00
Richard Moore
54e6e57fce Add support for pending blocks (#2225). 2022-03-08 17:16:32 -05:00
Richard Moore
38e825cee6 Updated help for errors (#2489). 2022-03-08 14:34:47 -05:00
Richard Moore
16007d4d1e Fixed typo in testcase string. 2022-03-04 16:39:55 -05:00
Richard Moore
cf47ec5fd5 docs: fixed typo (#2760). 2022-03-04 16:17:26 -05:00
Richard Moore
ae23bb76a9 Added CCIP support to provider.call (#2478). 2022-03-04 16:15:47 -05:00
Richard Moore
33a029e457 Adjust default maxPriorityFeePerGas to 1.5 gwei. 2022-03-02 11:33:27 -05:00
Richard Moore
c2a6a012bf Fix contracts when name resolution fails without any checks (#2737). 2022-02-24 03:51:53 -05:00
Richard Moore
6807a76b8d Preserve explicit chainId in JsonRpcProvider during transaction serialization (#2691). 2022-02-22 03:53:34 -05:00
Richard Moore
5f26fd55c9 Fixed eth_chainId response for Eip1193Bridge (#2711). 2022-02-22 03:51:37 -05:00
Richard Moore
c562150d26 Tweaked error URLs (#2489). 2022-02-21 14:16:25 -05:00
Richard Moore
4e8f004e9e Remove spurious console.log from Interface (#2714). 2022-02-19 02:29:34 -05:00
Richard Moore
9aac785395 Allow raw WebSocket to be passed into WebSocketProvider (#2562, #2644). 2022-02-19 01:57:45 -05:00
Richard Moore
1651389571 docs: added skipFetchSetup to ConnectionInfo (#1886). 2022-02-19 01:40:49 -05:00
Richard Moore
2d98b4fca1 Added Cloudflare Worker support (#1886). 2022-02-19 01:31:03 -05:00
Richard Moore
f26074b92b Add support for EIP-2098 compact signatures (#2246). 2022-02-18 18:54:00 -05:00
Richard Moore
eb91d708ac Merge branch 'v5.4' 2022-02-18 18:23:02 -05:00
Richard Moore
83891f9258 Add EIP-2544 Wildcard support (#2477, #2582, #2583). 2022-02-18 18:15:03 -05:00
Richard Moore
7b134bd5c9 docs: added more searchable wording. 2022-02-03 16:36:52 -05:00
Richard Moore
e175448380 docs: added BaseProvider (#2625). 2022-02-03 16:31:40 -05:00
Richard Moore
1d419b5829 docs: more explicitly describe the id function (#2115). 2022-02-03 16:08:15 -05:00
Richard Moore
95b2c72b12 docs: updated API provider supported networks (#2242). 2022-02-03 15:55:50 -05:00
Richard Moore
7b0d02d30e docs: fixed typos (#2289). 2022-02-03 15:46:18 -05:00
Richard Moore
0c72e0f1fd docs: added effectiveGasPrice to receipts (#2311). 2022-02-03 15:44:18 -05:00
Richard Moore
315ecfd19e docs: fixed typs (#2354). 2022-02-03 15:38:14 -05:00
Richard Moore
c61f3bc2a0 docs: fixed import typo (#2397). 2022-02-03 15:36:34 -05:00
Richard Moore
1be096130c docs: fixed typos (#2400). 2022-02-03 15:34:40 -05:00
Richard Moore
9eed04a6d5 docs: fixed typos (#2407). 2022-02-03 15:31:43 -05:00
Richard Moore
82d6dcbdde docs: fix typos (#2430). 2022-02-03 15:30:19 -05:00
Richard Moore
4935f93015 docs: add MetaMask request info (#2535). 2022-02-03 15:28:04 -05:00
Richard Moore
3df0e06c64 docs: fixed typos (#2522). 2022-02-03 15:25:26 -05:00
Richard Moore
18d8d1f34d docs: fixed typos (#2531). 2022-02-03 15:24:09 -05:00
Richard Moore
7b80ba20fe docs: fixed typos (#2614). 2022-02-03 15:23:20 -05:00
Richard Moore
f635af2684 docs: added getAvatar (#2591). 2022-01-30 22:58:43 -05:00
Richard Moore
813fcef4ad docs: added jsonRpcProvider.connection (#2611) 2022-01-30 22:45:46 -05:00
Richard Moore
32c9a09762 admin: update dist files 2022-01-24 21:33:40 -05:00
Richard Moore
03545aa78b Support invalid but popular IPFS URI format (#2271, #2527, #2590). 2022-01-24 16:39:50 -05:00
Richard Moore
03152ea014 Include trouble-shooting URLs in errors (#2489). 2022-01-24 16:32:41 -05:00
Richard Moore
0578a88efa Updated dist files. 2022-01-06 03:53:52 -05:00
Richard Moore
3f5bc6ddc1 Fixed case-folding in schemes for ENS avatars (#2500). 2022-01-06 03:46:02 -05:00
Richard Moore
ab13887cda Added Kintsugi network (#2434). 2022-01-06 03:37:13 -05:00
Richard Moore
28f383300c admin: updated dist files 2021-12-24 03:09:45 -05:00
Richard Moore
4ba63acc10 Fix browser random in WebWorkers (#2405). 2021-12-24 02:05:10 -05:00
Richard Moore
3d6a7ec020 Add support for IPFS metadata imageUrl in getAvatar (#2426). 2021-12-24 01:41:41 -05:00
Richard Moore
2f57c6a4ab Do not swallow ENS not supported errors (#2387). 2021-12-24 01:08:54 -05:00
Richard Moore
d3d2953e8d docs: fixed and expanded explanation of fees (#2321) 2021-12-01 13:09:14 -05:00
Richard Moore
0403314023 docs: added note about pure/view for constant methods. 2021-12-01 12:56:21 -05:00
Richard Moore
eb432aa1f4 admin: updated dist files 2021-11-30 19:16:49 -05:00
Richard Moore
617714d196 Fixed test case for getAvatar; url has moved 2021-11-30 19:11:44 -05:00
Richard Moore
42784b8d38 Added basic redirect support. 2021-11-30 19:11:03 -05:00
Richard Moore
50d712d6af admin: updated dist files 2021-11-30 11:19:37 -05:00
Richard Moore
c7e9715758 docs: Fixed ContractFactory.connect return type (#2224, #2257) 2021-11-30 10:24:06 -05:00
Richard Moore
0844de4eb4 Added arbitrum and optimism to networks and providers (#2335). 2021-11-30 10:20:26 -05:00
Richard Moore
caa1983665 docs: Add view/pure to docs (#2336) 2021-11-30 10:03:43 -05:00
Richard Moore
b8391b0e61 Added support for data URLs for avatar metadata. 2021-10-31 00:53:49 -04:00
Richard Moore
1e1c93effa Fixed getAvatar for unconfigured ENS names. 2021-10-31 00:05:27 -04:00
Richard Moore
b145898976 admin: updated dist files 2021-10-20 04:00:49 -04:00
Richard Moore
1bd91615ee Fixed abstract Provider signature issue (#2190). 2021-10-20 03:54:24 -04:00
Richard Moore
d3079745c5 admin: updated dist files 2021-10-19 00:01:37 -04:00
Richard Moore
ecce86125d Added ENS avatar support to provider (#2185). 2021-10-18 23:53:37 -04:00
Richard Moore
5899c8aec0 admin: updated dist files 2021-10-17 23:03:30 -04:00
Richard Moore
3de1b81501 Fixed splitSignature logic for verifying EIP-2930 and EIP-1559 v (#2084). 2021-10-17 22:56:57 -04:00
Richard Moore
ab319f2f4c Include events on ContractFactory deployment transactions (#1334). 2021-10-17 21:38:47 -04:00
Richard Moore
5b94ce2966 admin: updated dist files 2021-10-17 16:23:46 -04:00
Richard Moore
91c577b611 Removed non-english tests from the browser. 2021-10-17 16:18:22 -04:00
Richard Moore
2f363da5ff admin: add changelog 2021-10-16 02:31:02 -04:00
Richard Moore
73a46efea3 admin: updated dist files 2021-10-16 02:29:27 -04:00
Richard Moore
8f3d71dc5f admin: fixed alias script (#1494). 2021-10-16 01:53:12 -04:00
Richard Moore
a5c6a468f4 Better errors when non-string address or ENS name is passed into Contracts or provider methods (#1051). 2021-10-16 01:30:06 -04:00
Richard Moore
8947fd405e Use personal_sign instead of eth_sign for message signing with JsonRpcSigner; added _legacySignMessage for legacy support (#1542, #1840). 2021-10-16 01:11:53 -04:00
Richard Moore
cb43a99405 Removed extra wordlists from the dist files (#2058, #2077). 2021-10-15 22:34:03 -04:00
Richard Moore
b7e61bd67e admin: use https endpoints for NPM registry 2021-10-15 22:03:35 -04:00
Richard Moore
0a8be37b08 Fix issue when Solidity method collises with JavaScript prototype (#1432, #2054, #2120). 2021-10-15 21:32:48 -04:00
Richard Moore
6582ede1ce Add support for Cloudflare Workers (#1886). 2021-10-05 16:57:51 -04:00
Richard Moore
f3c6d819f3 Added more information to some invalid argument errors (#1130). 2021-10-05 16:05:40 -04:00
Richard Moore
bee76a49b2 Fix compile-time error in new TypeScript version. 2021-10-05 15:48:14 -04:00
Richard Moore
68095a48ae Adding customData support to transactions to assist L2 chains (#1761). 2021-10-05 15:47:26 -04:00
Richard Moore
0e5419ec79 Added some explicit null results to previously implicit null results for ENS (#1850). 2021-10-04 12:19:48 -04:00
Richard Moore
a48552a4fb Added BigNumber _difficulty to Block results (#2001, #2036). 2021-10-04 12:09:44 -04:00
Richard Moore
ab806cad15 docs: fixed typo (#1770). 2021-10-04 11:49:33 -04:00
Richard Moore
d5b41ce210 Removed redundant call to normalizing blockTag (1838). 2021-10-04 11:48:36 -04:00
Richard Moore
fb6d141723 docs: fixed typos in comments; h/t @ly0va (#1838). 2021-10-04 11:46:24 -04:00
Richard Moore
7a404fb8ed Fixed isBytes check for invalid length or elements (#1964). 2021-10-04 11:21:43 -04:00
Richard Moore
f8adf82e16 Fixed randomBytes not rejecting NaN as a length (#1977). 2021-10-04 11:08:58 -04:00
Richard Moore
8395cc146f docs: fixed typo in providers README (#1979). 2021-10-04 10:59:37 -04:00
Richard Moore
8fc5914c5a docs: fixed typo in cookbook (#2011). 2021-10-04 10:58:10 -04:00
Richard Moore
cc250b2060 Allow any Networkish for getDefaultProvider (#2031). 2021-10-04 10:57:00 -04:00
Richard Moore
375627f6b1 docs: updated signer prefix info (#2032). 2021-10-04 10:54:31 -04:00
Richard Moore
d67f8fb778 docs: fixed capitalization of MetaMask (#2033). 2021-10-04 10:52:34 -04:00
Richard Moore
45f367512d Stop allowing commas in fixed numbers; left over from legacy comma support (#2083). 2021-10-04 10:48:27 -04:00
Richard Moore
ad87b718a9 docs: fixed typos in comments (#2087). 2021-10-04 10:46:35 -04:00
Richard Moore
48c9e0bf39 Export FallbackProviderConfig (#2121). 2021-10-04 10:44:24 -04:00
Richard Moore
d1d636b503 docs: fixed typo (#2125). 2021-10-04 10:41:54 -04:00
Richard Moore
4166b2753d Updated dist files. 2021-09-16 13:19:43 -04:00
Richard Moore
32a6b2a362 Fix parseUints with excess zeros and fix ReDoS issue (#2016, #1975, #1976). 2021-09-16 13:04:32 -04:00
Richard Moore
f2a32d0d5b docs: added provider.FeeData 2021-08-27 15:35:23 -04:00
Richard Moore
5762a1f83d updated dist files. 2021-08-27 15:34:47 -04:00
Richard Moore
8320d534d7 Temporarily remove the block miner for clique-based networks from CI testing (#1967). 2021-08-27 15:29:52 -04:00
Richard Moore
c41b89a0c1 updated dist files. 2021-08-24 16:15:51 -03:00
Richard Moore
b6a061e7bf More readable errors involving Uint8Arrays. 2021-08-24 16:08:27 -03:00
Richard Moore
a662490e82 Added Deferred Error support to Description objects to extent Interface parse methods (#1894). 2021-08-24 16:03:12 -03:00
Richard Moore
bdb54ac52b docs: added cookbook entry to compute raw transaction (#1857). 2021-08-24 14:54:15 -03:00
Richard Moore
32a90b66f0 docs: added Alchemy tutorial 2021-08-24 14:43:27 -03:00
Richard Moore
95b87f61a6 docs: added BigNumber.toBigInt (#1799). 2021-08-24 14:42:38 -03:00
Richard Moore
017b1feba2 Fix address coder to prepare non-hexdatastring addresses as hexdatastring (#1906). 2021-08-24 14:33:04 -03:00
Richard Moore
accb85268c Removed temporary code for better errors needed until Alchemy added EIP-1559 support (#1893). 2021-08-23 23:02:32 -03:00
Richard Moore
f0b3bc32d5 Updated dist files. 2021-08-18 03:05:48 -03:00
Richard Moore
78e4273a32 Fxied getBlockWithTransactions results (1858). 2021-08-18 02:59:47 -03:00
Richard Moore
dd09bf0735 docs: dded code examples for Contract (#982). 2021-08-10 00:20:16 -03:00
Richard Moore
4b163e9e73 docs: added dynamic localSigner 2021-08-09 17:49:24 -03:00
Richard Moore
aacb95cd6b docs: added struct encoding example (#1147, #1301, #1302). 2021-08-09 17:47:33 -03:00
Richard Moore
e6315a6b3c docs: remove need to restart dev node after each run. 2021-08-09 17:46:33 -03:00
Richard Moore
3ac91a414c docs: added StaticJsonRpcProvider (#1514, #1531). 2021-08-09 16:02:37 -03:00
Richard Moore
2dd5c1a6d2 docs: Fixed topicset example (#1538). 2021-08-09 15:48:02 -03:00
Richard Moore
2653449f3c docs: updated transactions for EIP-1559. 2021-08-09 15:42:33 -03:00
Richard Moore
cddb03880a docs: added API for custom error coding. 2021-08-09 15:41:36 -03:00
Richard Moore
e80f8dd4e6 docs: updates for EIP-1559 (#1777). 2021-08-09 15:40:37 -03:00
Richard Moore
1b4bc7a6a6 docs: Fix listAccounts return type (#1851). 2021-08-09 15:35:43 -03:00
Richard Moore
4e9394554b Updated dist files. 2021-08-04 01:39:05 -03:00
Richard Moore
1d27d95670 Fixed Etherscan API key in default provider (#1807). 2021-08-04 01:32:30 -03:00
Richard Moore
2e431a5002 Temporarily remove Pocket fro provider tests. 2021-08-04 01:28:54 -03:00
Richard Moore
da4e107268 Update dist files. 2021-08-02 22:57:45 -03:00
Richard Moore
7175e2e99c Adjust default masPriorityFeePerGas to account for MEV-heavy blocks (#1817). 2021-08-02 22:52:29 -03:00
Richard Moore
68229ac0af Updated dist files. 2021-07-29 23:30:17 -04:00
Richard Moore
7274cd06cf Fixed JsonRpcProvider for pre-EIP-2930 chains (#1766). 2021-07-29 23:20:56 -04:00
Richard Moore
be3854e648 Forward some missing EIP-1559 fields to call and estimateGas (#1766). 2021-07-29 23:12:29 -04:00
Richard Moore
63f8b28223 Fixed possible UnhandledPromiseException for bad ENS names. 2021-07-29 23:11:06 -04:00
Richard Moore
593b4886ff Prevent overriding value for non-payble constructors (#1785). 2021-07-29 17:25:19 -04:00
Richard Moore
6d1904c379 Updated dist files. 2021-07-23 17:24:05 -04:00
Richard Moore
0aafca71db Fix test case for new transactions responses. 2021-07-23 17:17:43 -04:00
Richard Moore
0d40156fcb Updated dist files. 2021-07-23 02:21:24 -04:00
Richard Moore
576e9b54ab Added matic support to INFURA and Alchemy (#1546). 2021-07-23 02:13:35 -04:00
Richard Moore
bc5cc2e7e3 Added string change to coalesce errors on some clients. 2021-07-23 01:52:43 -04:00
Richard Moore
660e69db71 Added wait to transactions returned by getBlockWithTransactions (#971). 2021-07-22 20:04:07 -04:00
Richard Moore
551cfa0062 Fixed floor, ceiling and round for FixedNumber for non-default Formats (#1749). 2021-07-22 19:40:49 -04:00
Richard Moore
0f0d0c00d3 Fixed null confirmations in Wallet transaction (#1706). 2021-07-06 00:07:32 -04:00
Richard Moore
a1f8d188a7 Fixed Etherscan string change and enabled all tests. 2021-07-03 00:45:03 -04:00
Richard Moore
bde861436e updated dist files. 2021-07-02 01:49:02 -04:00
Richard Moore
6e8a39ec35 Added Pocket back into Homestead defaultProvider and skip certain EtherscanProvider tests affected by outage. 2021-07-02 01:42:16 -04:00
Richard Moore
ecae793edf Fixed EtherscanProvider NONCE_EXPIRED matching string update. 2021-07-02 00:18:53 -04:00
Richard Moore
bac684c5a0 docs: fixd type 2021-07-01 23:32:53 -04:00
Richard Moore
53671d0b17 docs: fixed typo (#1727) 2021-07-01 23:25:01 -04:00
Richard Moore
25c8b8b3e6 docs: fixed typo (#1729) 2021-07-01 23:22:14 -04:00
Richard Moore
a0fa92c075 updated dist files. 2021-06-29 12:25:07 -04:00
Richard Moore
72feee8f58 Fixed explicit EIP-1559 keys for JsonRpcSigner. 2021-06-29 11:57:53 -04:00
Richard Moore
71b7547f10 Update dist files. 2021-06-26 01:55:19 -04:00
Richard Moore
4970385e7b Fixing up testcases for non-eip-1559 ready platforms (#1610). 2021-06-26 01:44:12 -04:00
Richard Moore
0364dd9368 Added some provider-specific adjustments to deal with eip-1559 (#1610). 2021-06-25 22:58:55 -04:00
Richard Moore
e95708eedc Updated gasPrice to be optional for eip-1559 (#1610). 2021-06-25 22:58:01 -04:00
Richard Moore
ba6854bdd5 Added effectiveGasPrice to receipt. 2021-06-25 22:57:05 -04:00
Richard Moore
1e31b34a5a Fixed ENS names for JsonRpcSigner. 2021-06-25 00:02:08 -04:00
Richard Moore
7deb4c174a Added EIP-2930 and EIP-1559 transaction tests. 2021-06-24 23:49:59 -04:00
Richard Moore
f053a7ad58 Renamed Interface error coding methods. 2021-06-24 19:34:27 -04:00
Richard Moore
b1affdbc10 Fixed documentation on FallbackProvider priority (#1713). 2021-06-24 18:07:33 -04:00
Richard Moore
c2c0ce7503 Updated dist files. 2021-06-24 02:13:06 -04:00
Richard Moore
7efc36df29 Added ConstructorFragment to exports. 2021-06-24 01:29:13 -04:00
Richard Moore
720bde7719 Added error utilities to Interface. 2021-06-24 01:25:31 -04:00
Richard Moore
319987ec3e Fixed EIP-1559 from address calculation bug (#1610). 2021-06-24 00:46:53 -04:00
Richard Moore
2a7ce0e72a merged master including transaction type 0 legacy constant (#1610). 2021-06-24 00:02:50 -04:00
Richard Moore
8ba64af29f admin: updated Flatworm version 2021-06-23 23:42:00 -04:00
Richard Moore
17af9f812f docs: fixed typos and updated examples 2021-06-23 23:40:50 -04:00
Richard Moore
d001901c8c Added type to TransactionResponse and TrnsactionReceipt (#1687). 2021-06-23 23:39:57 -04:00
Richard Moore
91951dc825 Trap CALL_EXCEPTION errors when resolving ENS entries (#1690). 2021-06-21 23:25:37 -04:00
Richard Moore
8277f5a62a Fixed transaction serialization with explicit null type (#1628). 2021-06-21 21:21:35 -04:00
Richard Moore
e615e51fbf admin: updated spell check dictionary 2021-06-21 21:15:39 -04:00
Richard Moore
99422c1c7c admin: fixed typo in docs (#1686). 2021-06-21 21:15:01 -04:00
Richard Moore
e8a0144b7a Fix issue with loading JSON ABI with internalType property (#728). 2021-06-21 21:12:25 -04:00
Richard Moore
f9d09645e7 docs: Added info on signMessage (#1343). 2021-06-18 16:17:26 -04:00
Richard Moore
91fff1449d Better baseFee calculation (#1610). 2021-06-14 23:42:11 -04:00
Richard Moore
c5bca7767e Refactored eip-1559 logic (#1610). 2021-06-14 22:24:14 -04:00
Richard Moore
79c5bf6bcb docs: added more examples 2021-06-11 17:13:46 -04:00
Richard Moore
412bbe2939 Updated dist files. 2021-06-10 18:29:05 -04:00
Richard Moore
ee82e86ccc Fixed replacement transaction detection for JsonRpcSigner (#1658). 2021-06-10 18:22:02 -04:00
Richard Moore
376cf3cdbf Added Matic testnet info to networks (#1546). 2021-06-10 18:01:23 -04:00
Richard Moore
89bae3bd63 docs: grammar fix (#1594). 2021-06-10 17:48:55 -04:00
Richard Moore
a6e128f5cc Match Solidity identifier regex (#1657). 2021-06-10 17:47:17 -04:00
Richard Moore
5456c35924 Added EIP-1559 overrides to contracts (#1610). 2021-06-10 17:42:20 -04:00
Richard Moore
be20e28de1 docs: adding more examples 2021-06-10 17:38:38 -04:00
Richard Moore
30c0c97270 docs: added more examples and moved to new flatworm evaler format. 2021-06-04 01:17:56 -04:00
Richard Moore
4e6d121fb8 Updated dist files. 2021-05-31 19:06:24 -04:00
Richard Moore
bfcd05fcbb Added MinInt256 and MaxInt256 constants (#1576). 2021-05-31 18:32:33 -04:00
Richard Moore
819b1ace5c Version bumps for bn.js and hash.js to match elliptic and fix some build tools (#1478). 2021-05-31 18:29:26 -04:00
Richard Moore
4b331148d9 Removed Hangul checks in shims which crashes Android (#1519). 2021-05-31 18:20:32 -04:00
Richard Moore
7adcf3b154 Fixed ENS namehash with leading and trailing dots (#1605). 2021-05-31 18:16:30 -04:00
Richard Moore
630656e949 Fixed broken variable in template string (#1624, #1626). 2021-05-31 17:40:32 -04:00
Richard Moore
8681cd5969 Fixed FixedNumber rounding for non-default formats (#1629). 2021-05-31 17:37:56 -04:00
Richard Moore
470551e4ee Update ws dependency version to fix security (#1633, #1634). 2021-05-31 15:46:47 -04:00
Richard Moore
7a12216cfb Initial EIP-1559 support (#1610). 2021-05-30 17:47:04 -04:00
Richard Moore
d395d16fa3 admin: flags for karma to prevent timeout 2021-05-19 01:30:12 -04:00
Richard Moore
8077ce0aae Updated dist files. 2021-05-19 00:05:36 -04:00
Richard Moore
2fe78ad7e3 ci: Removing Pocket network from the default provider and tests as it is not currently reliable 2021-05-19 00:00:10 -04:00
Richard Moore
5f1f2c5e2c Updated dist files 2021-05-18 16:02:27 -04:00
Richard Moore
3c79ee8cef admin: added words to spellcheck 2021-05-18 15:56:01 -04:00
Richard Moore
772067a3c9 admin: added words to spellchecker 2021-05-18 15:53:15 -04:00
Richard Moore
621897f249 More resiliant testing. 2021-05-18 15:52:32 -04:00
Richard Moore
d3b7130ed6 Merge branch 'master' of github.com:ethers-io/ethers.js 2021-05-17 16:29:33 -04:00
Richard Moore
dad3829c2e Updated dist files. 2021-05-17 16:19:36 -04:00
Richard Moore
de4d683f6d admin: moved some changelog links around 2021-05-17 16:13:35 -04:00
Richard Moore
ebe4cc90f5 admin: updated Changelog 2021-05-13 23:51:01 -04:00
Richard Moore
35e3bf9d11 admin: dependency security audit updates 2021-05-13 23:50:24 -04:00
Richard Moore
2d717dcef8 docs: updated banner version. 2021-05-13 23:49:30 -04:00
Richard Moore
3316468e3e More aggresively check for mempool transactions sent from JsonRpcSigner. 2021-05-13 23:29:59 -04:00
Richard Moore
5144acf456 Added initial support for detecting replacement transactions (#1477). 2021-05-13 23:28:47 -04:00
Richard Moore
aadc5cd3d6 Added convenience method for HD path derivation. 2021-05-13 23:02:00 -04:00
Richard Moore
6e088099ad Added mnemonicPath option to cli. 2021-05-13 22:59:16 -04:00
Richard Moore
b6370f1360 Added some popular Ethereum-compatible chains to networks. 2021-05-13 22:58:16 -04:00
Richard Moore
26464c5425 Added debug event to Web3Provider. 2021-05-13 22:27:13 -04:00
Richard Moore
37a9c77ab2 Abstracted EtherscanProivder to more easily fascilitate other Etherscan-supported chains (#1204, #1473). 2021-05-07 00:31:15 -04:00
Richard Moore
4898e7baac admin: update issue templates 2021-04-27 18:43:54 -04:00
Richard Moore
c71bbbe7db admin: fixed config.yml filename 2021-04-27 18:40:44 -04:00
Richard Moore
c8fecbbc29 admin: fixed duplicate files GitHub UI created. 2021-04-27 18:38:22 -04:00
Richard Moore
b4df28dddd Update issue templates 2021-04-27 18:32:06 -04:00
Richard Moore
483d67f55c Added EIP-838 error name as well as error signature (#1498). 2021-04-26 17:46:16 -04:00
Richard Moore
987bec87af Added new error for replaced transactions (#1477). 2021-04-26 12:06:37 -04:00
Richard Moore
a9cdbe1238 More flexible FixedNumber input and output for strings with no decimals (#1019, #1291, #1463). 2021-04-23 18:41:00 -04:00
Richard Moore
4e9abfdee4 Added hex support for bigint (#1472). 2021-04-23 17:44:22 -04:00
Richard Moore
3bb5fbf533 Added support for null entries in EventFilter (#1499). 2021-04-23 17:43:27 -04:00
Richard Moore
cadccc3060 Add bigint to allowed BigNumberish types (#1472). 2021-04-22 22:34:06 -04:00
Richard Moore
65196097f6 Support for EIP-838 custom contract errors (#1498). 2021-04-22 22:29:30 -04:00
Richard Moore
8e22e0260e Minor version bump. 2021-04-22 22:10:56 -04:00
Richard Moore
de7da421b3 docs: updated versions and dates 2021-04-22 06:34:44 -04:00
Richard Moore
a9f7957550 Updated dist files. 2021-04-22 06:34:02 -04:00
Richard Moore
bd2d44eecf docs: updated script links in README. 2021-04-22 06:28:46 -04:00
Richard Moore
bd05aed070 Do not throw on ABI _error_ type (#1493, #1497). 2021-04-22 06:26:56 -04:00
Richard Moore
ce8f1e4015 Updated dist files. 2021-04-19 21:30:28 -04:00
Richard Moore
58488e78f9 Fixed JsonRpcProvider event-loop caching when using any network (#1484). 2021-04-19 20:56:18 -04:00
Richard Moore
29116593ba Updated experimental Eip1193Bridge to support final EIP-1193 API. 2021-04-19 20:52:50 -04:00
Richard Moore
51f0e1a52f Fail early for ABI decoding that will obviously run out of data (#1486). 2021-04-19 20:26:05 -04:00
Richard Moore
c086962302 Fixed BigNumber toBigInt return type (#1485). 2021-04-19 20:09:39 -04:00
Richard Moore
c0daf437f7 Updated dist files. 2021-04-18 19:33:26 -04:00
Richard Moore
8eaeba35f5 Increase provider tests gas price for sending a transaction. 2021-04-18 19:26:39 -04:00
Richard Moore
4a44865a8c Fixed run-checking non-filter Contract events (#1458). 2021-04-18 19:23:27 -04:00
Richard Moore
725fe0aa32 Updated dist files. 2021-04-18 02:48:05 -04:00
Richard Moore
08adc18a68 Increased sendTransaction timeout to 15 minutes and pull Pocket from tx tests. 2021-04-18 02:42:20 -04:00
Richard Moore
1fcf4b6ce6 Export Eip1193Bridge in experimental package. 2021-04-18 02:40:26 -04:00
Richard Moore
7c8ae9cfcb Merge branch 'master' of github.com:ethers-io/ethers.js 2021-04-17 22:41:31 -04:00
Richard Moore
0cd5fccfad Updated dist files. 2021-04-17 22:41:09 -04:00
Richard Moore
53ee187443 admin: updated spell-check data 2021-04-17 22:37:04 -04:00
Richard Moore
4577444c44 Prevent non-typed transactions from unsafely ignoring specified access lists (#1364). 2021-04-17 22:35:40 -04:00
Richard Moore
1cb3199e5c Update tests for current EIP-2930 support across backends (#1364). 2021-04-17 22:23:18 -04:00
Richard Moore
25c3024a89 docs: added AccessLists details (#1364). 2021-04-17 22:09:50 -04:00
Richard Moore
ae0d5eb7c2 Removed underscore from the JsonRpcBatchProvider name (#62, #656, #892). 2021-04-17 18:12:08 -04:00
Richard Moore
b8df000c8f Added better error detection when pre-EIP-155 transactions are disabled. 2021-04-17 18:10:27 -04:00
Richard Moore
eb1ec2f231 Fix Android React Native environment shims which crash on normalizing Korean test (#1298). 2021-04-17 18:08:00 -04:00
Richard Moore
b65508995c Fixed EIP-2930 transactions for EtherscanProvider (#1364). 2021-04-14 15:04:24 -04:00
Richard Moore
2a7dbf0571 Update issue templates 2021-04-12 20:50:14 -04:00
Richard Moore
0dc6f4a45b Update issue templates 2021-04-12 20:43:44 -04:00
Richard Moore
2534b1b3b2 docs: fixed typo in signature (#1411). 2021-04-10 19:58:20 -04:00
Richard Moore
a11602d066 docs: fixed typo (#1450). 2021-04-10 19:56:40 -04:00
Richard Moore
bec066bcb5 Re-enable AlchemyProvider Berlin tests. 2021-04-02 19:10:16 -04:00
Richard Moore
ef5a2b4baa docs: added details for reverted calls. 2021-04-02 03:55:53 -04:00
Richard Moore
9e273220b6 docs: Fixed typo in getting-started (#1423). 2021-04-02 03:55:06 -04:00
Richard Moore
d55ab6d4e6 Added experimental _JsonRpcBatchProvider (#62, #656, #892). 2021-04-02 03:53:48 -04:00
Richard Moore
1a7c4e89ef Cache JsonRpcProvider requests for certain methods per event loop (#1371). 2021-04-02 03:45:47 -04:00
Richard Moore
c84a5e62f5 admin: updated admin dist files 2021-03-30 19:59:47 -04:00
Richard Moore
6978cca17d admin: fixed rats nest linking on Windows (#1345, #1346) 2021-03-30 19:59:28 -04:00
Richard Moore
0e3016bfae admin: updated admin dist files 2021-03-30 19:55:25 -04:00
Richard Moore
d50b2d7e65 admin: updated spell check words 2021-03-30 19:54:52 -04:00
Richard Moore
941e4210c6 admin: added minor version bumping 2021-03-30 19:54:20 -04:00
Richard Moore
3b1d3fcee6 Update dist files. 2021-03-30 15:22:45 -04:00
Richard Moore
81fd628292 Added BigNumber.toBigInt method (#1415). 2021-03-30 14:28:43 -04:00
Richard Moore
f9dd0996ca docs: fixed typo (#1387). 2021-03-27 00:46:04 -04:00
Richard Moore
87ceaed4be Abstracted Contract with BaseContract without meta-class properties for easier extensions (#1384). 2021-03-26 17:32:36 -04:00
Richard Moore
0e1721b130 Fixed Contract properties that collide with null member properties (#1393). 2021-03-26 16:37:08 -04:00
Richard Moore
c47d2eba4d Added EIP-2930 support (#1364). 2021-03-26 16:16:56 -04:00
Richard Moore
1db4ce12d4 Added abstraction for EIP-2718 support. 2021-03-09 15:26:20 -05:00
Richard Moore
6c43e20e7a Updated dist files. 2021-03-07 18:24:04 -05:00
Richard Moore
b2ecffb0c8 Bumped TypeScript to 4.2.2 (#1288). 2021-03-07 18:12:39 -05:00
Richard Moore
a953f71752 Fixed shims from not displaying debug information. 2021-03-07 17:37:49 -05:00
Richard Moore
c5a53d6911 Force TypedData numbers to be in decimal (#1193). 2021-02-25 00:46:10 -05:00
Richard Moore
bcda16df1d Updated dist files. 2021-02-12 19:06:01 -05:00
Richard Moore
d937668dc1 Prevent unhandled rejections when passing nullish into Contract constructor (#1234). 2021-02-12 18:58:28 -05:00
Richard Moore
8279120e0a Better error messaging when provider backends give bogus responses (#1243). 2021-02-12 18:52:44 -05:00
Richard Moore
243beffa4f Prevent unconfigured ENS names from making an init tx (#1290). 2021-02-12 18:25:25 -05:00
Richard Moore
3a76d69a16 admin: small updates to build scripts. 2021-02-08 15:27:05 -05:00
Richard Moore
5b41675f33 docs: commit built docs 2021-02-08 15:26:10 -05:00
Richard Moore
80cde06bcc Updated dist files 2021-02-08 15:24:45 -05:00
Richard Moore
7d0b33dc42 docs: more details on various APIs. 2021-02-08 14:52:31 -05:00
Richard Moore
173f4d44bf docs: update links in README (#1281). 2021-02-08 14:48:30 -05:00
Richard Moore
73e94349de When in Status trigger personal_sign instead of eth_sign (#1285). 2021-02-08 14:46:04 -05:00
Richard Moore
796954f880 Bump elliptic version for CVE-2020-28498 (#1284). 2021-02-08 14:38:24 -05:00
Richard Moore
f0a88f551f docs: better linking to errors in docs 2021-02-04 18:59:51 -05:00
Richard Moore
f4b97c00ed docs: added more on contributing (#1153). 2021-02-04 18:54:43 -05:00
Richard Moore
38eccc8b9d docs: more descriptions for logs and events. 2021-02-04 18:54:10 -05:00
Richard Moore
a3b5f7132c docs: typo 2021-02-04 18:48:07 -05:00
Richard Moore
a1e7db4abe docs: added links 2021-02-04 18:46:27 -05:00
Richard Moore
689459c1fd docs: added social profile assets 2021-02-04 18:45:09 -05:00
Richard Moore
755fc72094 docs: added other resources. 2021-02-04 18:44:37 -05:00
Richard Moore
620b7b91a1 docs: added some info on contract overrides (#1199). 2021-02-04 17:29:21 -05:00
Richard Moore
fb9eea6c7e docs: typos and corrected priority order (#1252, #1255). 2021-02-04 17:23:23 -05:00
Richard Moore
d83c583412 docs: updated NonceManager method name (#1271). 2021-02-04 17:22:26 -05:00
Richard Moore
3f97b94d15 docs: typos (#1189, #1261) 2021-02-04 17:21:11 -05:00
Richard Moore
0ae9ac6f98 docs: added details on URL for JsonRpcProvider regarding ConnectionInfo support (#1266). 2021-02-04 17:17:55 -05:00
Richard Moore
2333b6cfd2 Updated dist files. 2021-02-03 14:44:48 -05:00
Richard Moore
73b31b371f Fixed typos in JSON ABI formatting (#1275). 2021-02-03 14:26:10 -05:00
Richard Moore
fd0cf2cc54 Updated dist files. 2021-02-02 17:32:11 -05:00
Richard Moore
27a981c84b Added load balancer support to PocketProvider (#1052). 2021-02-02 17:05:47 -05:00
Richard Moore
29be1e37bc Updated dist files. 2021-02-01 15:56:47 -05:00
Richard Moore
e727efc33e Added support for networks with slightly incorrect EIP-658 implementations (#952, #1251). 2021-02-01 15:50:27 -05:00
Richard Moore
4af2c19f45 Added Pocket network to the default provider (#1030, #1052). 2021-02-01 14:40:02 -05:00
Richard Moore
4f67ecdf62 Updated dist files. 2021-01-31 21:12:58 -05:00
Richard Moore
3396846a30 Added TypeScript declaration maps (#401). 2021-01-19 05:22:54 -05:00
Richard Moore
5c27b45ac9 Updated dist files. 2021-01-13 14:49:25 -05:00
Richard Moore
20f6e16394 Better provider internal block management (#1084, #1208, #1221, #1235). 2021-01-13 14:42:15 -05:00
Richard Moore
2df9dd1120 Updated dist files. 2021-01-13 03:41:29 -05:00
Richard Moore
74470defda Fixed abundant UnhandledRejectErrors in provider polling (#1084, #1208, #1221, #1235). 2021-01-13 03:16:27 -05:00
Richard Moore
8175c83026 Fixed non-checksum address comparisons in abstract Signer (#1236). 2021-01-12 21:43:49 -05:00
Richard Moore
e0ccafb140 Updated dist files. 2021-01-08 03:32:59 -05:00
Richard Moore
20335e96c2 Safety check on digest length for signing. 2020-12-19 15:26:16 -05:00
Richard Moore
a56a0a3336 Fixed listenerCount for contract when requesting for all events (#1205). 2020-12-18 03:56:14 -05:00
Richard Moore
4ad47b1b43 admin: added lock-versions script. 2020-12-14 01:26:05 -05:00
Richard Moore
0e6cc9a9a8 Lock package versions for the ESM builds (#1009). 2020-12-14 01:25:31 -05:00
Richard Moore
21c6c7ddb6 docs: use local dev node for exampels during build. 2020-12-08 18:30:34 -05:00
Richard Moore
8efbfc6afa docs: Filled in ContractFactory and examples. 2020-12-08 18:29:56 -05:00
Richard Moore
8e3cfd8517 Updated dist files. 2020-12-08 01:44:36 -05:00
Richard Moore
0a6c15e691 admin: Added TypeScript-migrated admin scripts. 2020-12-08 01:38:32 -05:00
Richard Moore
d3b1ac046a Fixed EIP-712 getPayload dropping EIP712Domain from types for JSON-RPC calls (#687). 2020-12-08 01:37:44 -05:00
Richard Moore
86b413750d admin: sync github issues. 2020-12-08 01:23:40 -05:00
Richard Moore
70c2b1b300 Remvoed dead files. 2020-12-08 01:22:09 -05:00
Richard Moore
5cb418cf7d Fixed typos in CHANGELOG. 2020-11-25 20:03:27 -05:00
Richard Moore
8e4ee887b9 build: added testing folder to git ignore. 2020-11-25 15:35:12 -05:00
Richard Moore
ef09361539 build: updated build scripts. 2020-11-25 15:34:05 -05:00
Richard Moore
6e36447aa0 Merge branch 'master' of github.com:ethers-io/ethers.js 2020-11-25 15:32:20 -05:00
Richard Moore
1c4259881a Updated dist files. 2020-11-25 15:30:58 -05:00
Richard Moore
ba00df1ab7 build: Added updated admin scripts 2020-11-25 15:29:58 -05:00
Richard Moore
45a2902874 Fix BigNumber when passed something with a length property (#1172). 2020-11-25 15:07:34 -05:00
Richard Moore
211defa27f Upddated dist files. 2020-11-23 19:23:11 -05:00
Richard Moore
bdc6df4b8b ci: Use macOS for coverage to fix libudev issue with ubuntu. 2020-11-23 19:10:17 -05:00
Richard Moore
799896ac13 Added directory to repo field for each package. 2020-11-23 18:44:11 -05:00
Richard Moore
8b54f7ff23 CI: use macos for tests. 2020-11-23 18:22:31 -05:00
Richard Moore
2cf462c571 ci: break ubuntu pacakge into its own step. 2020-11-23 18:12:21 -05:00
Richard Moore
1f6646e131 CI: attempting custom package repo. 2020-11-23 18:08:05 -05:00
Richard Moore
e6a52b309b CI: change linux version back to ubuntu-latest. 2020-11-23 13:09:00 -05:00
Richard Moore
fb808d1362 Updated dist files. 2020-11-23 03:43:28 -05:00
Richard Moore
fd2882d088 Temporary fix for GitHub actions being down. 2020-11-23 03:36:02 -05:00
Richard Moore
a8e3380ed5 Add ABI coder function to compute default values (#1101). 2020-11-23 00:59:44 -05:00
Richard Moore
7f775f7ad6 docs: updated generated docs. 2020-11-22 23:07:13 -05:00
Richard Moore
d122d18cfa docs: fixed source search link 2020-11-22 23:06:27 -05:00
Richard Moore
34488cd7d8 docs: updates and fixes (#1122). 2020-11-22 23:03:50 -05:00
Richard Moore
95e2871966 Updated dist files. 2020-11-22 22:44:33 -05:00
Richard Moore
4a8d579dca Fix for new versions of Geth which return formatted data on revert rather than standard data (#949). 2020-11-22 17:43:32 -05:00
Richard Moore
fbbe4ad638 Fixed typo in BigNumber error (#1164). 2020-11-22 16:38:28 -05:00
Richard Moore
20defec9f1 Addd missing sideEffects flag to some packages. 2020-11-22 16:35:27 -05:00
Richard Moore
c8bb77d8af Allow base-10 to be passed into BigNumbner.toString and improve errors for other radices (#1164). 2020-11-22 16:34:07 -05:00
Richard Moore
29f6c34343 Allow private keys to Wallet to omit the 0x prefix (#1166). 2020-11-20 17:30:36 -05:00
Richard Moore
a185e89181 Updated dist files. 2020-11-19 18:54:50 -05:00
Richard Moore
c9e548071e Force address to use bignumber package with base36 private functions (#1163). 2020-11-19 18:45:10 -05:00
Richard Moore
62c7195ed6 Updated dist files. 2020-11-19 17:44:10 -05:00
Richard Moore
cc63e61f73 Remove stray console.log in hardware wallets (#1136). 2020-11-19 17:24:37 -05:00
Richard Moore
2816850716 Added some funding links for the sponsor button. 2020-11-19 17:20:46 -05:00
Richard Moore
4b7028a661 docs: Typo in BigNumber source (#1100). 2020-11-18 17:25:58 -05:00
Richard Moore
0382faebb1 docs: Typo in BigNumber (#1127). 2020-11-18 17:22:22 -05:00
Richard Moore
97efeba8dc docs: fixed typo in contracts readme (#1128). 2020-11-18 17:20:24 -05:00
Richard Moore
cddc258c96 Remove invalid pkg.module reference (#1133). 2020-11-18 17:13:23 -05:00
Richard Moore
3abfdffffa Updated dist files. 2020-11-17 20:36:19 -05:00
Richard Moore
02546b9401 Fix browser ws alias. 2020-11-17 20:07:22 -05:00
Richard Moore
fff72ef369 Use faux-registry to better simulate real world React Native apps. 2020-11-17 18:48:02 -05:00
Richard Moore
f10977ab35 Fixing React Native tests. 2020-11-17 13:41:43 -05:00
Richard Moore
1729f804fb Prevent node 8 from using rollup (contains incompatible syntax). 2020-11-17 02:51:54 -05:00
Richard Moore
8933467c01 Updated dist build. 2020-11-16 23:07:24 -05:00
Richard Moore
22bd0c76dd Use dist files in browser tests. 2020-11-16 21:20:35 -05:00
Richard Moore
4809325bee Refactoring dist build process. 2020-11-14 17:42:36 -05:00
Richard Moore
e0b1d0e1e0 Updated dist files. 2020-10-22 21:55:40 -04:00
Richard Moore
fe17a29581 Allow 0x as a numeric value for 0 in Provider formatter (#1104). 2020-10-22 21:03:51 -04:00
Richard Moore
d8cdd0e94c admin: Updated spell checker and mime-types. 2020-10-22 20:01:57 -04:00
Richard Moore
5a9bc30336 Updated dist files. 2020-10-22 20:01:18 -04:00
Richard Moore
28f60d5ef8 Use POST for long requests in EtherscanProvider (#1093). 2020-10-22 19:46:52 -04:00
Richard Moore
a21202c66b Export verifyTypedData in utils (#687). 2020-10-20 00:17:43 -04:00
Richard Moore
116cc89686 admin: updated publish script to allow forcing publish 2020-10-20 00:17:02 -04:00
Richard Moore
550ecf2f25 Added verifyTypedData for EIP-712 typed data (#687). 2020-10-20 00:15:55 -04:00
Richard Moore
7b19fdfeed Updated dist files. 2020-10-19 01:27:15 -04:00
Richard Moore
15a90af5be Fix signTypedData call for JsonRpcSigner (#687). 2020-10-19 01:17:36 -04:00
Richard Moore
86146650d8 Updated dist files. 2020-10-18 23:19:16 -04:00
Richard Moore
7fcae25a78 Refactoring test case generation scripts. 2020-10-18 21:55:12 -04:00
Richard Moore
15893537c3 Added EIP-712 test cases (#687). 2020-10-18 21:54:21 -04:00
Richard Moore
be4e2164e6 Initial Signer support for EIP-712 signed typed data (#687). 2020-10-18 21:52:25 -04:00
Richard Moore
3e676f21b0 Split hash library files up. 2020-10-18 21:45:32 -04:00
Richard Moore
5a4dd5a703 Added EIP-712 multi-dimensional array support (#687). 2020-10-12 00:58:04 -04:00
Richard Moore
345a830dc4 Consolidated TypedDataEncoder methods (#687). 2020-10-10 04:44:17 -04:00
Richard Moore
cfa6dec293 Initial EIP-712 utilities (#687). 2020-10-10 04:12:52 -04:00
Richard Moore
5a6d9a3a38 Added test cases for PocketProvider. 2020-10-08 21:29:14 -04:00
Richard Moore
a62d20d86f Added initial PocketProvider (#1052). 2020-10-08 20:21:32 -04:00
Richard Moore
5e0e3de52e Admin: Upddated spell-check script. 2020-10-07 20:11:34 -04:00
Richard Moore
d78b7a3998 Updated dist files. 2020-10-07 20:10:50 -04:00
Richard Moore
5abc2f36e2 Better error message for parseUnits of non-strings (#981). 2020-10-07 19:50:27 -04:00
Richard Moore
38a068bcea Add gzip support to AlchemyProivder and InfuraProvider fetching (#1085). 2020-10-07 19:43:20 -04:00
Richard Moore
65772a8e1a Add gzip support to getUrl in node (#1085). 2020-10-07 19:40:28 -04:00
Richard Moore
a022093ce0 Added CommunityResourcable to mark Providers as highly throttled. 2020-10-07 17:28:18 -04:00
Richard Moore
50f84b3c57 Updated dist files. 2020-10-07 00:25:28 -04:00
Richard Moore
df21d5326a Admin: Added retry logic, fixed version exports and removed unnecessary logging. 2020-10-07 00:11:47 -04:00
Richard Moore
e65fa8fc00 Docs: Added referral link to Alchemy. 2020-10-07 00:09:10 -04:00
Richard Moore
8e682cc848 Added debug event info to WebSocketProvider (#1018). 2020-10-06 21:12:49 -04:00
Richard Moore
ef8e4330d3 Docs: Merge typos fixes (#1082). 2020-10-06 17:20:25 -04:00
Richard Moore
a0278615a4 Merge branch 'fix-doc-typos' of git://github.com/yuetloo/ethers.js into yuetloo-fix-doc-typos 2020-10-06 17:20:07 -04:00
Richard Moore
d8821d7317 Docs: Fixed typo (#1087). 2020-10-06 17:18:09 -04:00
Richard Moore
78a82d9ff2 CI: Force INFURA for provider and contract tests. 2020-10-06 16:58:52 -04:00
Richard Moore
1ac7decd89 CI: Removed solc tests to try fixing Promise issues. 2020-10-06 14:51:55 -04:00
Richard Moore
4fa7276cc1 CI: Updated provider tests. 2020-10-06 01:46:23 -04:00
Richard Moore
6ae222d55c CI: Temporarily remove Cloudflare from tests. 2020-10-05 23:51:14 -04:00
Richard Moore
efeeda5e5c CI: Updated dist files. 2020-10-05 23:27:03 -04:00
Richard Moore
c75c937b13 Updated dist files. 2020-10-05 22:17:15 -04:00
Richard Moore
d1ee596292 CI: Fix provider timeout. 2020-10-05 21:25:37 -04:00
Richard Moore
b61e2cc96a Updated dist files. 2020-10-05 16:49:47 -04:00
Richard Moore
ca94445f0f Added custom API key for Alchemy in test suite. 2020-10-05 16:44:40 -04:00
Richard Moore
4d95fe925d Updated dist files. 2020-10-05 15:46:12 -04:00
Richard Moore
f3e5b0ded1 ABI encoding performance additions (#1012). 2020-10-05 15:34:00 -04:00
Yuet Loo Wong
8ce9761bad fix typo begine to begins 2020-10-03 14:24:47 -03:00
Richard Moore
3d051e454d Export hexConcat in utils (#1079). 2020-10-03 13:18:56 -04:00
Yuet Loo Wong
c48ad4421f fix typos in documentation 2020-10-03 13:30:15 -03:00
Richard Moore
40264ff900 Cache chain ID for WebSocketProvider (#1054). 2020-10-03 02:54:03 -04:00
Richard Moore
e86f83b9c0 Docs: Fixed typo (#1074). 2020-10-03 02:23:32 -04:00
Richard Moore
e986b09e58 Build: Added new publish script. 2020-10-03 02:20:50 -04:00
Richard Moore
22dee96f51 Updated dist files. 2020-09-26 03:27:47 -04:00
Richard Moore
0c614b7097 CI: Refactored changelog admin script. 2020-09-26 03:25:54 -04:00
Richard Moore
f0a5869c53 Add more accurate intrinsic gas cost to ABI calls with specified gas property (#1058). 2020-09-26 02:17:05 -04:00
Richard Moore
5cd1668e0d Better errors for unconfigured ENS names (#1066). 2020-09-26 01:23:43 -04:00
Richard Moore
0b061d68cc CI: Fixed reaxct-native tests with new scripts. 2020-09-23 15:53:42 -04:00
Richard Moore
ffa4a2d054 CI: Fix test cases. 2020-09-23 01:00:30 -04:00
Richard Moore
f8072a8004 Build: Added node 8 support. 2020-09-23 00:23:02 -04:00
Richard Moore
4306b3563a Updated CLI solc to versin 0.7.1. 2020-09-23 00:00:21 -04:00
Richard Moore
c4de88af6f Docs: Fix typo (#1044). 2020-09-22 23:51:59 -04:00
Richard Moore
9486185ceb Updated dist files. 2020-09-22 23:18:45 -04:00
Richard Moore
261eb04e97 Ignore metadata files in each package. 2020-09-22 22:57:17 -04:00
Richard Moore
832bd6c908 Refactored admin scripts. 2020-09-22 22:54:48 -04:00
Richard Moore
05844caf85 Extended Karma testing timeout managed by tests. 2020-09-21 22:44:37 -04:00
Richard Moore
f7e82fcb46 Started refactoring admin scripts into TypeScript. 2020-09-21 01:14:06 -04:00
Richard Moore
27b3af0a7b Removed dead files. 2020-09-17 17:17:15 -04:00
Richard Moore
f733fac875 Custom API key for Etherscan during tests (#824). 2020-09-17 03:44:29 -04:00
Richard Moore
1097a1b020 Replaced lerna with admin hoist and link scripts. 2020-09-17 03:40:55 -04:00
Richard Moore
ea422d63b3 Replaced lerna with admin hoist and link scripts. 2020-09-17 03:39:25 -04:00
Richard Moore
a3821f6c4b Updated dist files. 2020-09-16 19:44:55 -04:00
Richard Moore
de8a717b4c Refactored provider test cases to more reliable CI. 2020-09-16 19:38:01 -04:00
Richard Moore
86e0269a86 Extend Karma timeout for new provider tests. 2020-09-16 11:00:29 -04:00
Richard Moore
d15c097dba Updated dist files. 2020-09-16 03:08:36 -04:00
Richard Moore
49f71574f4 More robust blockchain error detection (#1047) 2020-09-16 02:19:28 -04:00
Richard Moore
9ee685df46 Forward blockchain errors from Signer during gas estimation (#1047). 2020-09-15 22:14:22 -04:00
Richard Moore
263bfe5ce6 Improve fetch errors with looser mime-type detection (#1047). 2020-09-15 22:12:56 -04:00
Richard Moore
e8a9eea493 CI: Add node-hid requirements to all jobs. 2020-09-12 01:31:17 -04:00
Richard Moore
1c499c9f42 CI: Add node-hid requirements. 2020-09-12 01:18:28 -04:00
Richard Moore
c1a297db99 Updated dist files. 2020-09-11 02:10:58 -04:00
Richard Moore
be92339696 Force content-length in web fetching. 2020-09-11 01:10:53 -04:00
Richard Moore
bc3eeeca39 Better error forwarding from FallbackProvider (#1021). 2020-09-11 01:10:15 -04:00
Richard Moore
042b74e6ee Add clamping functions to FixedNumber (#1037). 2020-09-10 01:16:28 -04:00
Richard Moore
6e10675adf Docs: updated dist files. 2020-09-08 01:12:15 -04:00
Richard Moore
2b83feb6bd Docs: fixed markdown. 2020-09-08 01:11:29 -04:00
Richard Moore
19fd55e935 Docs: add example for custom ENS address (#911). 2020-09-08 01:10:08 -04:00
Richard Moore
710998b19a Docs: Added link to React-Native. 2020-09-08 00:36:44 -04:00
Richard Moore
828a35fdca Merge branch 'ChrisChinchilla-ethereum-basics' 2020-09-08 00:30:09 -04:00
Richard Moore
95bcda0d8a Merge branch 'ethereum-basics' of git://github.com/ChrisChinchilla/ethers.js into ChrisChinchilla-ethereum-basics 2020-09-08 00:29:14 -04:00
Richard Moore
ccfe205db8 Merge branch 'ChrisChinchilla-master' 2020-09-08 00:27:57 -04:00
Richard Moore
f9684aeec2 Merge branch 'master' of git://github.com/ChrisChinchilla/ethers.js into ChrisChinchilla-master 2020-09-08 00:26:54 -04:00
Richard Moore
9d5de46c84 Updated dist files. 2020-09-07 19:55:52 -04:00
Richard Moore
28ee745211 Docs: added React Native and fixed typos. 2020-09-07 19:40:50 -04:00
Richard Moore
4e394fc680 Allow events to use compact bytes ABI coded data for Solidity 0.4 external events (#891, #992). 2020-09-07 19:35:37 -04:00
Richard Moore
97acaa1129 Docs: fixed typo (#1026). 2020-09-06 01:57:06 -04:00
Richard Moore
fe280c8458 Updated dist files. 2020-09-05 23:57:15 -04:00
Richard Moore
bdccf7b8d3 Synced unorm in shims to most recent version. 2020-09-05 23:45:25 -04:00
Richard Moore
0234cfbbef Updated dist files. 2020-09-05 23:35:35 -04:00
Richard Moore
cadb28d6b3 Fixed LedgerSigner sendTransaction (#936). 2020-09-05 04:37:47 -04:00
Richard Moore
72385c2287 Added BrainWallet to experimental exports. 2020-09-05 04:29:53 -04:00
Richard Moore
201e5ced9c More readable server errors. 2020-09-05 04:29:08 -04:00
Richard Moore
bf481f4bbf Updated dist files. 2020-09-05 01:23:16 -04:00
Richard Moore
681f2a50b2 Fixed test retry in browsers. 2020-09-05 01:14:25 -04:00
Richard Moore
18fdb96fe1 Updated dist files. 2020-09-04 03:21:51 -04:00
Richard Moore
35b64b9a65 Add test retry support to reporter. 2020-09-04 03:15:07 -04:00
Richard Moore
4ca98825d4 Updated dist files. 2020-09-04 02:11:49 -04:00
Richard Moore
0558bba8eb Added retry logic to provider tests. 2020-09-04 02:06:04 -04:00
Richard Moore
a440317594 Updated dist files. 2020-09-04 01:37:14 -04:00
Richard Moore
2359a98641 Fixed link in docs (#1028). 2020-09-04 01:26:29 -04:00
Richard Moore
a32fbd835d Ignore coverage build folder. 2020-09-04 01:24:54 -04:00
Richard Moore
6fd3bb62d1 Added memory-like support and new opcodes to asm. 2020-09-04 01:20:35 -04:00
Richard Moore
83db8a6bd1 Added basic ENS resolver functions for contenthash, text and multi-coin addresses (#1003). 2020-09-04 01:18:57 -04:00
Richard Moore
f24240eddf Updated dist files. 2020-08-27 22:04:58 -04:00
Richard Moore
d01d0c8448 Added support for changing Reporter logging function. 2020-08-27 21:58:34 -04:00
Richard Moore
d3b473e7c7 Added test-react script. 2020-08-27 21:56:40 -04:00
Richard Moore
57eb5b777e Initial React Native test harness (#993). 2020-08-27 21:54:16 -04:00
Richard Moore
240aac5683 Updating shims for constrained environments (#944, #993). 2020-08-27 14:23:23 -04:00
Richard Moore
8abdbbbf63 Updating shims for constrained environments (#944, #993). 2020-08-27 14:22:58 -04:00
Richard Moore
5fcd03f27e Updated dist files. 2020-08-25 01:53:48 -04:00
Richard Moore
cb8f4a3a4e Updated docs for all packages on npm pages (#1013). 2020-08-25 01:09:48 -04:00
Richard Moore
8facc1a530 Added JSON support to BigNumber (#1010). 2020-08-24 23:15:03 -04:00
Richard Moore
17fdca8994 CI: added dummy file to preserve output folder. 2020-08-23 20:00:39 -04:00
Richard Moore
df0caab5d6 CI: added coverage artifacts. 2020-08-23 19:44:43 -04:00
Richard Moore
9733927f82 CI: added coverage artifacts. 2020-08-23 19:42:49 -04:00
Richard Moore
28dbcfc38c CI: added coverage artifacts. 2020-08-23 19:39:57 -04:00
Richard Moore
bb8e77dc70 Updated admin scripts. 2020-08-23 16:37:24 -04:00
Richard Moore
ae619bcfc7 CI: do not build dist files in node 8 (dependency syntax issues). 2020-08-23 16:35:15 -04:00
Richard Moore
5b5904ea99 Updated packages for security audit. 2020-08-20 17:22:41 -04:00
Richard Moore
8f4b3027ef Run bootstrap in postinstall for better testing UX (#1001). 2020-08-20 17:09:30 -04:00
Richard Moore
e9009631d5 Fixed typo in docs (#976). 2020-08-20 16:51:41 -04:00
Richard Moore
be273f26e9 Fixed typos in readme (#996). 2020-08-20 16:49:34 -04:00
Richard Moore
b0c082d728 Fix emitted error for ABI code array count mismatch (#1004). 2020-08-20 15:33:16 -04:00
Richard Moore
9640e864a6 Updated dist files. 2020-08-04 20:55:55 -04:00
Richard Moore
e1bbb064a1 Do not mutate connection in fetchJson. 2020-08-04 20:49:40 -04:00
Richard Moore
d38ebaeb23 Updated dist files. 2020-08-04 20:33:21 -04:00
Richard Moore
39a16260a7 Updated dist files. 2020-07-31 01:32:26 -04:00
Richard Moore
2c49a52a41 Renamed and documented experimental fetchData function. 2020-07-31 01:15:22 -04:00
Richard Moore
c414a45825 Updated dist files. 2020-07-30 17:04:53 -04:00
Richard Moore
e2d6f281d5 Abstract fetchJson for data. 2020-07-30 17:03:36 -04:00
Richard Moore
ba404ffb0b Updated dist files. 2020-07-20 02:27:26 -04:00
Richard Moore
af10705632 Add testcases for setLogLevel (#947). 2020-07-20 01:43:47 -04:00
Richard Moore
5443363de4 Fix Logger setLogLevel with enum case mismatch (#947). 2020-07-20 01:43:02 -04:00
Richard Moore
e3f7426af4 Removed UUID dependency from json-wallets (#966). 2020-07-20 01:33:15 -04:00
Richard Moore
8b907d5f5f Added link to Chrome CLI switches for Karma Browser Tests. 2020-07-19 01:19:38 -04:00
Richard Moore
771190202f Fixed typo in DAI docs example (#958). 2020-07-18 06:08:45 -04:00
Richard Moore
5a4e3ede2a Updated browser tests to lie about User-Agent to fix Etherscan tests. 2020-07-18 03:58:19 -04:00
Richard Moore
78b350bbc5 Removed unnecessary dependency from BigNumber (#951). 2020-07-16 05:47:58 -04:00
Richard Moore
fe2f0f7489 Updated dist files. 2020-07-16 05:35:32 -04:00
Richard Moore
9f20258d5d Longer Etherscan throttle slot interval. 2020-07-16 05:29:33 -04:00
Richard Moore
63dd3d4682 Fixed ENS overrides for the default provider (#959). 2020-07-16 05:27:36 -04:00
Richard Moore
b1166211e2 Updated dist files. 2020-07-15 14:00:36 -04:00
Richard Moore
7d43545303 Added Retry-After support and adjustable slot interval to fetchJson. 2020-07-14 22:50:05 -04:00
Chris Chinchilla
32de4f1930 Minor typo changes 2020-07-14 14:12:22 +02:00
Chris Chinchilla
232c7a895b Further review 2020-07-14 14:08:59 +02:00
Chris Chinchilla
c443a8bd9d Further review 2020-07-14 14:08:59 +02:00
Chris Chinchilla
0940944048 Start review of getting started guide 2020-07-14 14:08:59 +02:00
Chris Chinchilla
3ac0aeaac6 Further review 2020-07-14 14:05:55 +02:00
Chris Chinchilla
8557285da6 Merge branch 'master' of github.com:ethers-io/ethers.js 2020-07-14 13:14:08 +02:00
Chris Chinchilla
fb46e0fd79 Further review 2020-07-14 13:13:52 +02:00
Richard Moore
6fa853b309 Updated dist files. 2020-07-14 02:33:30 -04:00
Richard Moore
88c7eaed06 Added initial throttling support (#139, #904, #926). 2020-07-14 02:26:45 -04:00
Richard Moore
c730cbc629 docs: Added Provider api-keys page. 2020-07-14 02:12:59 -04:00
Richard Moore
4ef3fc501b docs: Updated code samples to use WebSocketProvider destroy. 2020-07-14 02:11:57 -04:00
Richard Moore
c22fd3e73d Fixed CI fail-fast and continue-on-error 2020-07-13 19:48:31 -04:00
Richard Moore
78eb9d6176 Updated dist files. 2020-07-13 09:34:20 -04:00
Richard Moore
00f4ba0eeb Prevent a CI job failure from killing the workflow. 2020-07-13 09:28:08 -04:00
Richard Moore
588f64c760 Use status code 1000 on WebSocket hangup for compatibility. 2020-07-13 09:27:08 -04:00
Richard Moore
6039464342 Updated dist files. 2020-07-13 08:50:41 -04:00
Richard Moore
866ab30400 Removing node v14 from CI (temporary). 2020-07-13 08:42:40 -04:00
Richard Moore
57fd6f0604 Updated WebSocketProvider to use web-style event listener API. 2020-07-13 08:41:54 -04:00
Richard Moore
49e83b0c4d Updated dist files. 2020-07-13 08:03:56 -04:00
Richard Moore
1cfe4962aa Added tests to help fill out coverage tests. 2020-07-13 07:30:49 -04:00
Richard Moore
79b1da130b Normalize formatUnits to simplified decimals. 2020-07-13 07:28:56 -04:00
Richard Moore
e128bfcd10 Prevent zero-padding on Solidity type lengths. 2020-07-13 07:28:05 -04:00
Richard Moore
e3d3e604f2 Set sensible defaults for INFURA and AlchemyAPI getWebSocketProvider methods. 2020-07-13 07:26:40 -04:00
Richard Moore
619a8888eb Added logger assert methods. 2020-07-13 07:24:57 -04:00
Richard Moore
c304d37cbd Added coverage keep-alive reporter. 2020-07-13 07:23:41 -04:00
Richard Moore
149e0839b1 Added TypeScript map generation and files. 2020-07-13 06:50:29 -04:00
Richard Moore
0c1d55b6dc Added initial code coverage testing. 2020-07-13 06:48:33 -04:00
Richard Moore
d0a79c6a13 Added destroy to WebSocketProvider. 2020-07-12 05:02:08 -04:00
Richard Moore
c6601769ad Updated packages (security updates). 2020-07-08 12:33:55 -04:00
Richard Moore
a78ca7eb8d Updated docs. 2020-07-07 23:20:32 -04:00
Richard Moore
59239d2f61 Updated dist files. 2020-07-07 23:19:00 -04:00
Richard Moore
bf65ddbff0 Fixed splitSignature when recoveryParam is encoded directly (#893, #933). 2020-07-07 22:54:35 -04:00
Richard Moore
7e56f3d392 Fixed BigNumber string validation (#935). 2020-07-07 22:18:02 -04:00
Chris Chinchilla
84d6fdfc37 Start review of getting started guide 2020-07-07 14:41:23 +02:00
Richard Moore
4124a568fd Adding @yuetloo web3 migration docs. 2020-07-06 18:26:11 -04:00
Yuet Loo Wong
db7202578d migration from web3 2020-07-06 17:47:51 -04:00
Richard Moore
e38fa1cdd4 Updated spell check script. 2020-07-05 00:03:50 -04:00
Richard Moore
a1b2a62e6b Updated docs build. 2020-07-05 00:02:47 -04:00
Richard Moore
f34be4e2c2 Updated dist files. 2020-07-05 00:01:57 -04:00
Richard Moore
84e253f3f9 Prevent negative exponents in BigNumber (#925). 2020-07-04 23:41:05 -04:00
Richard Moore
0fd9aa5cb6 Fixed StaticJsonRpcProvider when auto-detecting network (#901). 2020-07-04 23:06:18 -04:00
Richard Moore
2a73b6ed34 Updated docs for ESM import. 2020-07-04 22:46:47 -04:00
Richard Moore
0838135d4a Fixed typos in docs (#921). 2020-07-04 22:44:27 -04:00
Richard Moore
a144ed8a71 Fixed migration docs (#890). 2020-07-04 21:29:18 -04:00
Richard Moore
c646a0c881 Updated docs build. 2020-07-03 01:54:56 -04:00
Richard Moore
0059b7e468 Fixed documentation typos (#895, #917, #924). 2020-07-03 01:44:17 -04:00
Richard Moore
4838874127 Added WebSocket static method to Alchemy provider and updated Alchemy URLs. 2020-07-03 01:41:32 -04:00
Richard Moore
96cb44025b Updated dist files. 2020-06-29 00:54:30 -04:00
Richard Moore
7fe702d59b Fixed typo in error string. 2020-06-29 00:45:47 -04:00
Richard Moore
9e1434503e Updated elliptic package to address possible malleability issue; which should not affect Ethereum. 2020-06-29 00:40:17 -04:00
Richard Moore
08c74e9a13 Fixed FixedNumber unguarded constructor and added isZero (#898). 2020-06-29 00:38:27 -04:00
Richard Moore
c53864de0a Added StaticJsonRpcProvider for reducing calls to chainId in certain cases (#901). 2020-06-29 00:21:59 -04:00
Richard Moore
8c1ff4c862 Allow getDefaultProvider to accept a URL as a network. 2020-06-29 00:06:31 -04:00
Richard Moore
987b5354cc Make network an optional parameter to WebSocketProvider. 2020-06-29 00:04:45 -04:00
Richard Moore
1a4f7d1b53 Updated docs. 2020-06-17 23:38:59 -04:00
Richard Moore
f9e9347e69 Removed deprecated errors package. 2020-06-17 23:34:53 -04:00
Richard Moore
d00362eb70 Updated badges in docs. 2020-06-15 02:43:17 -04:00
Richard Moore
8ed67a5c19 Fixed typo in docs (#885). 2020-06-15 02:25:46 -04:00
Richard Moore
f99029b49a Merge branch 'master' of github.com:ethers-io/ethers.js 2020-06-13 21:39:55 -04:00
Richard Moore
3017a31127 Updated dist files. 2020-06-13 21:39:36 -04:00
Richard Moore
bbb4f407b3 Allow provider.ready to stall until the network is available (#882). 2020-06-13 21:26:50 -04:00
Richard Moore
be7e86ec90 Fixed typo in changelog. 2020-06-13 20:55:05 -04:00
Richard Moore
88e68495b6 Create security policy.
Create security policy.
2020-06-13 17:21:50 -04:00
Richard Moore
738d34969d Reduce dependencies to squash security issues. 2020-06-13 16:39:00 -04:00
Richard Moore
e0e0dbef18 Updated admin scripts for publishing prod releases. 2020-06-12 23:59:06 -04:00
Richard Moore
039bad3848 Changed root package name to match umbrella package. 2020-06-12 23:18:23 -04:00
Richard Moore
73d29e6853 Updated dist files. 2020-06-12 23:09:46 -04:00
Richard Moore
5a69e9caa8 Fixed embedded pacakge version strings. 2020-06-12 23:04:10 -04:00
Richard Moore
f302d7b61a Splitting CHANGELOG beta vs release. 2020-06-12 21:27:23 -04:00
Richard Moore
b30eaca475 Updating CI for release. 2020-06-12 21:26:47 -04:00
Richard Moore
d817416bae Merge branch 'master' into ethers-v5-beta 2020-06-12 21:14:55 -04:00
Richard Moore
427e16826e Updated dist files. 2020-04-21 23:17:53 -04:00
Richard Moore
fab14f8f5a Fixed typo in error message (#778). 2020-04-21 23:12:56 -04:00
Richard Moore
e8c89d7ca9 Allow receive type in ABI without warning (#746). 2020-04-21 23:10:15 -04:00
Richard Moore
b1c6575a1b Updated dist files. 2020-03-14 16:59:58 +01:00
Richard Moore
3b7176f322 Fixed typo in error (#722). 2020-03-13 18:37:23 +01:00
Richard Moore
5f7ddcd5d7 Fix EtherscanProvider from throwing outside async context (#729). 2020-03-13 18:34:56 +01:00
Richard Moore
4c9d740cdf Updated dist files. 2020-02-16 16:34:49 -05:00
Richard Moore
a930047a10 Added default API key for EtherscanProvider. 2020-02-16 16:29:29 -05:00
Richard Moore
4e41871fa4 Fixed typo in arguments name for waitForTransaction (#477). 2020-02-16 16:15:00 -05:00
Richard Moore
9947acc349 Partial support for non-English mnemonics for encrypted JSON wallets (#685). 2020-02-16 16:13:24 -05:00
Richard Moore
748f89660a Updated expected balance in test cases. 2020-01-29 22:45:34 -05:00
Richard Moore
2987925fa5 Updated dist files. 2020-01-29 22:14:34 -05:00
Richard Moore
0589b3102e Fix backwards compatibility with certain parsed JSON objects passed into Interface and Contracts (#721). 2020-01-29 22:01:42 -05:00
Richard Moore
df51b26fe7 Updated ENS registry address for all networks. 2020-01-29 21:54:49 -05:00
Richard Moore
b288ad9ba7 Updated dist files. 2020-01-10 21:14:46 -05:00
Richard Moore
6da5c53120 Fixed Contract and Interface constructor abi paramter type; should be a Fragment not a ParamType (#602). 2020-01-10 21:12:58 -05:00
Richard Moore
26d3271643 Add missing chainId to transaction responses (#700). 2020-01-10 20:59:28 -05:00
Richard Moore
12da07579a Updated dist files. 2020-01-07 20:06:25 -05:00
Richard Moore
bd066b8542 Fix resolveName when name is an address with an invalid checksum (#694). 2020-01-07 20:04:58 -05:00
Richard Moore
4478896ca5 Fixed testcases for PhantomJS syntax. 2020-01-03 19:43:27 -05:00
Richard Moore
f996ec0c32 Updated dist files. 2020-01-03 19:01:29 -05:00
Richard Moore
c76e01e61f Properly handle errors in the IpcProvider (#695). 2020-01-03 18:56:07 -05:00
Richard Moore
f8087ae39c Added utility function to compute CREATE2 addresses (#697). 2020-01-03 18:20:15 -05:00
Richard Moore
7250cdcd31 Updated dist files. 2019-12-21 01:09:18 -05:00
Richard Moore
20f34f1ba9 Added proper support for v0.6 Solidity JSON type (#688). 2019-12-21 01:03:05 -05:00
Richard Moore
4ac08432b8 Fixed PhantomJS test cases for new elliptic library. 2019-11-24 20:56:28 +09:00
Richard Moore
3e3048df81 Merge branch 'master' of github.com:ethers-io/ethers.js 2019-11-24 20:06:38 +09:00
Richard Moore
c6199bf52a Updated dist files. 2019-11-24 20:06:10 +09:00
Richard Moore
20409c083c Update elliptic package to protect from Minerva timing attack (#666). 2019-11-24 19:55:10 +09:00
Richard Moore
7a90f18145 Do not poll if disabled during the previous event loop. 2019-11-24 19:34:17 +09:00
Richard Moore
df1ae611ba Moved node types to devDependencies (#663). 2019-11-24 19:33:02 +09:00
Richard Moore
6009a26c89 Added provider property to Web3Provider (#641). 2019-11-24 19:31:02 +09:00
Richard Moore
30984b6f00 Merge pull request #628 from evertonfraga/patch-1
Fix typo in tests/readme.md.
2019-11-20 21:01:58 +09:00
Richard Moore
76a8e503dd Updated dist files. 2019-10-30 19:17:31 +09:00
Richard Moore
d0e0e30532 Fix filters by forcing a poll instantly when polling starts to capture the current block (#613). 2019-10-30 19:13:32 +09:00
Richard Moore
b3f5266e78 Updated dist files. 2019-10-17 01:32:36 +09:00
Richard Moore
0609ea9651 Fixed TypeScript 3.7-beta import issue (#622). 2019-10-17 01:30:00 +09:00
Ev
5af16a6090 Update README.md 2019-10-14 01:25:55 +09:00
Richard Moore
4f88c5ba6e Added changelog. 2019-09-20 02:21:11 -04:00
Richard Moore
023e946072 Update dist files. 2019-09-06 19:09:40 -04:00
Richard Moore
004cb826d2 Added pkg.ethereum key for donations (#593). 2019-09-06 19:03:15 -04:00
Richard Moore
bfcf224b2b Fixed typo in error message (#592). 2019-09-06 18:48:47 -04:00
Richard Moore
c969fe5a68 Fixed typo in error message (#580). 2019-09-06 18:47:21 -04:00
Richard Moore
8737f12e1b Fixed typo in error message (#574). 2019-09-06 18:45:56 -04:00
Richard Moore
1267eeef4a Updated dist files. 2019-08-26 17:31:40 -04:00
Richard Moore
11c250ff7c Updated package-lock for security reasons; dev dependency only. 2019-08-26 16:08:41 -04:00
Richard Moore
c303199d26 Fixed typo in error message (#592). 2019-08-26 15:59:43 -04:00
Richard Moore
ae458a1a49 Updated dist files. 2019-08-22 17:45:59 -04:00
Richard Moore
760a5aec74 Fixed ENS lookupAddress when the resolver isn't configured (#581). 2019-08-22 17:42:23 -04:00
Richard Moore
2967efc2b0 Updated dist files. 2019-08-22 15:27:28 -04:00
Richard Moore
24f243e689 Allow Secret Storage wallet address to be optional (#582). 2019-08-22 15:22:20 -04:00
Richard Moore
d719064628 Updated package-lock for lodash security advisory; the package is only a development dependency, so no urgent need to publish, just for developers (lodash/lodash#4336). 2019-07-15 19:22:21 -03:00
Richard Moore
a7d0b41d98 Reduce number of HDNode tests which cause TravisCI to timeout. 2019-07-09 20:16:37 -04:00
Richard Moore
a980fc3db0 Updated dist files. 2019-07-09 16:56:49 -04:00
Richard Moore
a34ca6b3a3 Added test cases for case-agnostic mnemonics (#557). 2019-07-09 16:55:44 -04:00
Richard Moore
ef91dcd757 Make mnemonics case-agnostic (#557). 2019-07-09 16:51:07 -04:00
Richard Moore
a5296a9258 Added tests for testnet extended private key (#553). 2019-06-28 15:42:41 -04:00
Richard Moore
f827ae68e2 Updated dist files. 2019-06-28 15:42:04 -04:00
Richard Moore
fbf15c0ffe Fixed testnet exteneded private keys (#553). 2019-06-28 15:38:19 -04:00
Richard Moore
10fdbe7274 Updated dist files. 2019-06-21 19:18:49 -04:00
Richard Moore
384fc328f2 No longer use hard-coded id of 42 in Web3Provider. 2019-06-21 19:17:55 -04:00
Richard Moore
055694ae61 Updated dist files. 2019-06-10 02:00:55 -04:00
Richard Moore
edf59d2c26 Updatd dist files. 2019-06-10 01:59:51 -04:00
Richard Moore
92c978e5c2 Fixed error in throwing an error for ABI decode (#539). 2019-06-10 01:57:03 -04:00
Richard Moore
34397fa2aa Updated dist files. 2019-05-24 19:41:38 -04:00
Richard Moore
19587eea3f Warn on deprecated INFURA API Token; use Project ID instead (#462). 2019-05-24 14:56:47 -04:00
Richard Moore
4a9373e773 Fixed typo in error message (#470). 2019-05-24 14:48:01 -04:00
Richard Moore
2997bae935 Export poll function (#514). 2019-05-24 14:38:54 -04:00
Richard Moore
b0bd9ee162 Updated dist files. 2019-05-23 18:58:05 -04:00
Richard Moore
7075c8c235 Fixed error message for unconfigured ENS names (#504). 2019-05-23 18:51:08 -04:00
Richard Moore
a4a532fe8e Fixed security recommendations (development deps only; not a problem, but quiets automatic audits). 2019-05-14 18:11:45 -04:00
Richard Moore
77c771bf76 Updated dist files. 2019-05-14 17:45:13 -04:00
Richard Moore
c93b48920e Increment JSON-RPC ID for JsonRpcProviders for environments that unsafely manage callbacks (#489). 2019-04-18 13:49:37 +02:00
Richard Moore
04c92bb8d5 Updated dist files. 2019-03-08 14:29:59 -05:00
Richard Moore
16c9745326 Added goerli to InfuraProvider (#421). 2019-03-08 14:28:39 -05:00
Richard Moore
05648177aa Updated dist files. 2019-02-15 13:44:33 -05:00
Richard Moore
f318fd9cf1 Added fastRetry to polling for JsonRpcSigner to improve polling for sent transactions (#402). 2019-02-15 13:42:12 -05:00
Richard Moore
c15a89832b Fix waitForTransaction delay (#424). 2019-02-15 13:32:08 -05:00
Richard Moore
94b0abc240 Updated dist files. 2019-02-12 00:56:38 -05:00
Richard Moore
72edcd054f Fixed waitForTransaction and removeListener (#410). 2019-02-12 00:54:32 -05:00
Richard Moore
e4a2f8ac6c Updated BIP39 list in readme. 2019-02-11 19:24:48 -05:00
Richard Moore
c6d7b31a84 Updated dist files. 2019-02-11 19:24:27 -05:00
Richard Moore
0ed983a264 Fixed support for calling self-destructed contracts (#411). 2019-02-11 19:21:53 -05:00
Richard Moore
8fab48a380 Updated balance address for Goerli test cases. 2019-02-11 19:19:02 -05:00
Richard Moore
86e815999d Updated dist files. 2019-02-08 19:58:41 -05:00
Richard Moore
a2306f7870 Fixed utils test case for phantomjs. 2019-02-08 19:52:29 -05:00
Richard Moore
60b75c10d7 Initial support for EIP-234; filter by blockHash (#412). 2019-02-08 19:49:12 -05:00
Richard Moore
41c2c8a729 Fixed out-of-safe-range hexlify values to throw an exception (#420). 2019-02-08 17:06:46 -05:00
Richard Moore
9785eed8dd Added goerli testnet support (#421). 2019-02-08 16:50:06 -05:00
Richard Moore
527de7ba5e Updated dist files. 2019-02-04 16:09:35 -05:00
Richard Moore
14484e566e Fixed missing TypeArray slice on constrained environments. 2019-02-04 16:03:45 -05:00
Richard Moore
429af2c40d Fixed test-hdnode for phantomjs; does not support let keyword. 2019-02-01 23:00:01 -05:00
Richard Moore
11fffd1690 Updated dist files. 2019-02-01 19:50:10 -05:00
Richard Moore
af3aed4580 Added xpub and xpriv deserialization (#405). 2019-02-01 19:47:20 -05:00
Richard Moore
3a3764bdb4 Added xpub and xpriv test cases for HD nodes (#405). 2019-02-01 19:46:18 -05:00
Richard Moore
18ee2c518c Support for xpub and xpriv derivation and generating extended keys; no fromExtendedKey yet (#405). 2019-02-01 18:39:50 -05:00
Richard Moore
36172f7f7b Updated dist files. 2019-01-25 19:10:44 -05:00
Richard Moore
908258f8d4 Fixed duplicate events from triggering (#404). 2019-01-25 19:08:31 -05:00
Richard Moore
774b2d5fee Updated dist files. 2019-01-24 16:53:44 -05:00
Richard Moore
b5f720ace6 Ganache does not include from in receipts (#400). 2019-01-24 16:52:24 -05:00
Richard Moore
9f201c386e Updated dist files. 2019-01-23 16:30:12 -05:00
Richard Moore
700dd34137 Added to and from for Transaction Receipts (#398). 2019-01-23 16:25:49 -05:00
Richard Moore
f2dd977de4 Added v3 INFURA end-points to InfuraProvider (#286). 2019-01-23 16:04:54 -05:00
Richard Moore
5f013216c5 Fixed long-response bug in IpcProvider (#384). 2019-01-21 17:03:52 -05:00
Richard Moore
eac0805435 Updated dist files. 2019-01-17 16:34:17 -05:00
Richard Moore
e5bee7e5a3 Fixed path for x-ethers metadata and wallet (#). 2019-01-17 16:32:51 -05:00
Richard Moore
442553620a Updated dist files. 2019-01-15 16:01:45 -05:00
Richard Moore
6d08968b87 Fixed contract removeAllListeners which did not clean up the event loop properly (#391). 2019-01-15 15:58:42 -05:00
Richard Moore
c2ce59f95e Updated dist files. 2018-12-27 15:53:00 -05:00
Richard Moore
f3ec27b95f Added customizable log levels to quiet warnings (#379). 2018-12-27 15:48:38 -05:00
Richard Moore
c88cb5ea90 Updated dist files. 2018-12-14 18:39:46 -05:00
Richard Moore
99a21660ab Allow unchecked transactions which will remain unwrapped for the JsonRpcSigner (#340). 2018-12-14 18:36:24 -05:00
Richard Moore
4bc62a1e8a Make it easier for sub-classes of Wallet to manage nonces. 2018-12-14 18:32:48 -05:00
Richard Moore
26eb6cc01a Updated dist files. 2018-12-12 16:59:25 -05:00
Richard Moore
bcba17a9e7 Allow nonce to be a BigNumber (#228). 2018-12-12 16:56:50 -05:00
Richard Moore
918b66bc2e Fixed typo in error strings (#376). 2018-12-12 16:31:23 -05:00
Richard Moore
152d672278 Add isHexString to exported utils (#367). 2018-12-12 16:23:39 -05:00
Richard Moore
51fb472809 Add abs method to BigNumber (#375). 2018-12-12 16:10:28 -05:00
Richard Moore
66440b8542 Better error messages for namehash (#364). 2018-12-10 17:02:02 -05:00
Richard Moore
fefdd51084 Updated dist files. 2018-12-08 18:48:53 -05:00
Richard Moore
6ca1d77298 Fixed function name in parsed transactions (#370). 2018-12-08 18:46:29 -05:00
Richard Moore
4f6748ec4c Include request body in web errors. 2018-12-05 04:19:34 -05:00
Richard Moore
f56fc572f1 Squashed unhandled promise exception for Providers that are never used (#362). 2018-12-05 04:18:47 -05:00
Richard Moore
16fdf6b621 Added gas estimation back into JsonRpcSigner (#365). 2018-12-05 03:32:24 -05:00
Richard Moore
a863037ca3 Updated dist files. 2018-12-04 17:16:42 -05:00
Richard Moore
2d854bd94c Do not fill in implicit values for JSON-RPC based signers (#335). 2018-12-04 17:13:55 -05:00
Richard Moore
9565c28a91 More relaxed transaction parsing (#357). 2018-12-04 16:31:18 -05:00
Richard Moore
bc457bb3bd Allow any whitespace characters in human-readable ABI (#360). 2018-12-04 16:14:57 -05:00
Richard Moore
db383a3121 Updated dist files. 2018-11-27 17:32:47 -05:00
Richard Moore
3f76f603d9 Fixed contract proxied tx.wait receipt properties (#355). 2018-11-27 17:32:05 -05:00
Richard Moore
68304848ae Updated dist files. 2018-11-27 16:03:39 -05:00
Richard Moore
bb6bc4cac3 Check for partially-working normalize support. 2018-11-27 15:59:14 -05:00
Richard Moore
ef8b9c36ef Support for platforms where UTF-8 is only half broken. 2018-11-27 15:56:50 -05:00
Richard Moore
e6c943d01f Updated dist files. 2018-11-21 16:24:40 -05:00
Richard Moore
31d3ee899f Throw exception instead of returning null for getDefaultProvider (#351). 2018-11-21 16:23:44 -05:00
Richard Moore
98143a845b Updated dist files. 2018-11-20 15:45:47 -05:00
Richard Moore
bffc557be1 Added default provider support for Ethereum classic (#351). 2018-11-20 15:41:12 -05:00
Richard Moore
09208fa8fe Updated dist files. 2018-11-13 07:50:04 -05:00
Richard Moore
048c571d3d Fixed 0 confirmation waiting (#346). 2018-11-13 07:48:37 -05:00
Richard Moore
24757f1064 Updated dist files. 2018-11-12 17:27:47 -05:00
Richard Moore
88f2f51266 Fix spacing in checkArgument errors (#318). 2018-11-12 17:22:18 -05:00
Richard Moore
93152ef863 Do not replay block events when the provider event block is reset (#343). 2018-11-12 17:17:43 -05:00
Richard Moore
09b698b0a9 Updated dist files. 2018-11-09 14:42:29 -05:00
Richard Moore
478aaf9619 Force unorm shim when String.prototype.normalize is broken (#338). 2018-11-09 14:36:21 -05:00
Richard Moore
fad902b438 Better error message when normalize is missing. 2018-11-09 14:34:14 -05:00
Richard Moore
7bfaf292db Added shims for React-Native support. 2018-11-08 18:25:16 -05:00
Richard Moore
be0488a1a0 Updated dist files. 2018-11-08 16:03:33 -05:00
Richard Moore
28a52cd485 Fix for when blockTag is specified as a null equivalent value in contract overrides (#329). 2018-11-08 16:01:48 -05:00
Richard Moore
3a19f43844 Added "debug" event for providers; do not depend on the format as it may change, but this should help debugging in most cases (#320). 2018-11-08 15:59:30 -05:00
Richard Moore
4852e837d2 Fix for Kovan filters without an address (#339). 2018-11-08 15:56:35 -05:00
Richard Moore
fa68385cfe Updated dist files. 2018-10-14 19:05:38 -04:00
Richard Moore
d54609a458 Fixed lingering polling timer when no events left to process in a provider. 2018-10-14 19:01:53 -04:00
Richard Moore
f682861e0b Fixed utils.poll from mutating passed variables. 2018-10-14 19:01:09 -04:00
Richard Moore
023a20ff47 Fixed and refactored populating transaction values for signers (#306). 2018-10-14 19:00:15 -04:00
Richard Moore
e39cd84923 Fixed test cases for phantomjs (must use ES3 syntax). 2018-10-13 17:27:19 -04:00
Richard Moore
5020897f10 Updated dist files. 2018-10-13 17:19:07 -04:00
Richard Moore
6ac2d923b7 Fixed filtering with null non-indexed parameters (#305). 2018-10-13 17:17:02 -04:00
Richard Moore
6996dd86f4 Updated dist files. 2018-10-11 16:50:52 -04:00
Richard Moore
493273d698 Added optional blockTag to call; note that this may not behave as expected on all nodes (#226). 2018-10-11 16:03:18 -04:00
Richard Moore
84344ac4c2 Check all transaction parameters are valid; protect against typos (#299). 2018-10-11 15:16:31 -04:00
Richard Moore
9b118af304 Updated dist files. 2018-10-07 01:13:10 -04:00
Richard Moore
e39e2ed718 Added address to HDNode (#196). 2018-10-07 01:09:56 -04:00
Richard Moore
71f781d542 Added French and Spanish to test-hdnode. 2018-10-07 01:05:49 -04:00
Richard Moore
b2db10e216 Mark progressCallback as optional (#293). 2018-10-07 00:42:52 -04:00
Richard Moore
3736a15714 Updated dist files. 2018-10-04 20:25:07 -04:00
Richard Moore
248158130e Added automatic event parsing for contract transaction receipts from tx.wait. 2018-10-04 19:54:15 -04:00
Richard Moore
f5c7ccbb80 Added ability to wait for a specific number of confirmations (#229). 2018-10-04 17:27:42 -04:00
Richard Moore
24335d0dd7 Fix for geth-etc (official geth is fine), which returns Receipts before the blockHash is synced to the database. 2018-10-04 16:46:19 -04:00
Richard Moore
908c2c1096 Fixed confirmations tests and bootstrap fast blockNumber. 2018-10-04 16:44:29 -04:00
Richard Moore
9797b36186 Added confirmations to TransactionResponse (#156, #238). 2018-10-04 16:24:31 -04:00
Richard Moore
731f189010 Fixed nested errors for providers that were masking true error (#292). 2018-10-04 15:24:29 -04:00
Richard Moore
cc5b157231 Updated dist files. 2018-10-03 22:52:55 -04:00
Richard Moore
99fed75202 Added version to errors. 2018-10-03 22:50:22 -04:00
Richard Moore
cb5f9f576a Fixed French and Spanish for browsers without Uint8Array.forEach. 2018-10-03 22:47:44 -04:00
Richard Moore
aeac2cdb86 Added French and Spanish includes to phantomjs test page. 2018-10-03 20:22:59 -04:00
Richard Moore
0dafd83033 Increased timeout for querying npm registry. 2018-10-03 20:08:01 -04:00
Richard Moore
f6d946cf68 Updated dist files. 2018-10-03 20:03:32 -04:00
Richard Moore
b9c07b549c Added French and Spanish wordlist dist files. 2018-10-03 20:01:35 -04:00
Richard Moore
c34a1f73c6 Added French and Spanish BIP-39 wordlists (#191). 2018-10-03 19:58:45 -04:00
Richard Moore
281bd0613d Added support for JSON serialized BigNumbers in the constructor (#288). 2018-10-03 19:54:38 -04:00
Richard Moore
d936b4cd09 Fixed scrypt for long passwords (#223). 2018-10-03 19:50:15 -04:00
Richard Moore
5a0ebf84ef Updated dist files. 2018-10-01 17:34:44 -04:00
Richard Moore
c9c5b4d641 Added chainId as supported override for contract transactions. 2018-10-01 17:33:09 -04:00
Richard Moore
5e86e02304 Fixed wildcard events and made nested events more robust (#289). 2018-10-01 17:30:45 -04:00
Richard Moore
15cd0d8e58 Fixed twitter link in README. 2018-09-28 11:00:33 -04:00
Richard Moore
061b0eae1d Version bump (major). 2018-09-27 17:17:41 -04:00
Richard Moore
d3876303f2 Merge branch 'master' into typescript 2018-09-27 17:11:25 -04:00
Richard Moore
2ad110548d Updated dist files. 2018-09-27 16:55:40 -04:00
Richard Moore
ef5d19e5c9 More logical interface for hexDataSlice (mimic slice). 2018-09-27 16:52:05 -04:00
Richard Moore
5f6bc405dd Added failure count to test case reporter. 2018-09-27 16:50:59 -04:00
Richard Moore
1ca203ca38 Remove unused dist files. 2018-09-27 16:49:38 -04:00
Richard Moore
c8a75ab01d Updated README. 2018-09-27 16:48:22 -04:00
Richard Moore
8c6eb555de Updated wordlists with new library layout for Wordlist. 2018-09-27 16:47:44 -04:00
Richard Moore
cb68403387 Fixed test case for phantomjs; non-ES3 token. 2018-09-26 16:29:16 -04:00
Richard Moore
7b5ce86c5b Updated dist files. 2018-09-26 16:15:13 -04:00
Richard Moore
f4e247fc92 Fixed trailing-zero issue after commify fix. 2018-09-26 16:11:38 -04:00
Richard Moore
e582bd73ee Updated unit test cases. 2018-09-26 16:11:07 -04:00
Richard Moore
543e12c6ca Changing contract deployment to ContractFactory. 2018-09-26 15:47:09 -04:00
Richard Moore
57439af25d Removed options from unit conversion and added separate otto-safe commify function (#202, prep for #228). 2018-09-26 15:44:39 -04:00
Richard Moore
f4dd5d19e7 Updated dist files. 2018-09-24 16:07:14 -04:00
Richard Moore
05e30f4680 Major overhaul of file layout and import/export structure to better support TypeScript. 2018-09-24 15:55:17 -04:00
Richard Moore
9c87e569cf Added Ethereum Classic Testnet to networks. 2018-09-21 15:34:56 -04:00
Richard Moore
15761027df Added constructor support for Human-Readable ABI. 2018-09-21 15:34:24 -04:00
Richard Moore
65fa0b7b22 Updated dist files. 2018-09-20 15:48:08 -04:00
Richard Moore
8b2e57276f Do not override nonce if forced to 0 (#282). 2018-09-20 15:46:53 -04:00
Richard Moore
25337d4543 Fix typo in error message (#272). 2018-09-20 15:46:04 -04:00
Richard Moore
892f30a051 Check HTTP status before parsing body in fetchJson (#280). 2018-09-20 12:44:46 -04:00
Richard Moore
829a56cc79 Updated dist files. 2018-09-20 11:58:46 -04:00
Richard Moore
9d04f2c1eb Prevent odd-length values from being passed in as bytesXX (#281). 2018-09-20 11:55:27 -04:00
Richard Moore
f02f4bc0c0 Enabled ropsten test cases for Etherscan (it is back up). 2018-09-20 11:53:52 -04:00
Richard Moore
b9829f205f Remove beta dist file. 2018-09-06 16:53:40 -04:00
Richard Moore
eef07e5a4f Updated dist files. 2018-09-06 16:41:02 -04:00
Richard Moore
13e50ec6db Exposed more secp256k1 primitives (#233 #271). 2018-09-06 16:37:44 -04:00
Richard Moore
9dcf6f3253 Added headers and timeout to fetchJson (#224 #257). 2018-09-06 16:34:45 -04:00
Richard Moore
e0cefb0398 Added VoidSigner for read-only access as a specific address. 2018-09-04 10:28:26 -04:00
Richard Moore
6018bf63f9 Make AbstractSigner provider readonly. 2018-09-04 10:27:22 -04:00
Richard Moore
7aebe53e5b Change Buffer constructor to safer operations (#265). 2018-09-04 10:20:31 -04:00
Richard Moore
32a070d909 Added support for fetching block transactions with blocks. 2018-09-04 10:08:50 -04:00
Richard Moore
b5408bcbd0 Updated readme with beta cdn link. 2018-08-27 20:19:06 +02:00
Richard Moore
284ffdfd1f Updated provider testcase for updated address. 2018-08-27 18:58:50 +02:00
Richard Moore
ae4cd90441 Updated dist files. 2018-08-27 14:51:44 +02:00
Richard Moore
5efd0c1f8a Backport fix for EIP-848 status codes from v4; only an error is generated in v3, the error string is ignored. (#262). 2018-08-27 14:51:03 +02:00
Richard Moore
962f75038b Skip dist checks for node 6 to fix Travis CI. 2018-08-27 14:04:21 +02:00
Richard Moore
ea5a56f0f0 Updated dist files. 2018-08-27 13:42:26 +02:00
Richard Moore
afae5cd2f9 Block calling contract methods until it deployed, if it is pending deployment. 2018-08-27 13:38:48 +02:00
Richard Moore
280dc56a74 Removing address from JsonRpcSigner and cache address (#263). 2018-08-27 13:27:59 +02:00
Richard Moore
2b9d8d6d6a Silence warning for external keyword in human-readable ABI. 2018-08-27 13:27:03 +02:00
Richard Moore
2d35e5e9d7 Fixed test cases for finney units. 2018-08-21 13:23:11 +02:00
Richard Moore
102a4e8bf4 Added tests for utf-8 errors. 2018-08-21 13:14:37 +02:00
Richard Moore
ce837e307e Fixed test DRNG. 2018-08-21 13:14:21 +02:00
Richard Moore
810e9e743e Updated dist files. 2018-08-21 13:13:52 +02:00
Richard Moore
e092746165 Removed jsonCopy and added deepCopy instead (#261). 2018-08-21 13:11:44 +02:00
Richard Moore
388b658bfa Invalid utf-8 strings now fail by default. 2018-08-21 13:08:28 +02:00
Richard Moore
0358e8afb7 Fixed typo in units for finney (#259). 2018-08-21 13:01:55 +02:00
Richard Moore
2b88efea65 Updated dist files. 2018-08-13 17:01:44 +01:00
Richard Moore
f4c3073304 Removed BigNumber and AbiCoder objects from utils and exposed them at the root. 2018-08-13 16:58:19 +01:00
Richard Moore
e4d5786861 Fixed isType for null values. 2018-08-13 16:56:59 +01:00
Richard Moore
46a55a1d99 Removing old dead code. 2018-08-13 16:56:20 +01:00
Richard Moore
2c1022cde1 Removed timeout from wait so we can use confirmations in the future instead and remain backwards compatible. 2018-08-13 16:54:32 +01:00
Richard Moore
f9723c42cb Re-use shallowCopy. 2018-08-13 16:52:35 +01:00
Richard Moore
3635a9bb40 Fixed custom network chain ID check. 2018-08-13 16:50:47 +01:00
Richard Moore
9e0bfa733b Updated dist files. 2018-08-05 18:35:26 -04:00
Richard Moore
a80a8a8ced Fixed miscalculating estimated fees for payable functions. 2018-08-05 18:35:00 -04:00
Richard Moore
b44a80800c Removed dead dist files. 2018-08-05 18:31:22 -04:00
Richard Moore
e3b04bb3fc Updated dist files. 2018-08-04 19:40:06 -04:00
Richard Moore
fcee62a3d9 Fixed parseSignature with empty parameter lists. 2018-08-04 19:34:30 -04:00
Richard Moore
7f1fbfc203 Make wallet.encrypt options optional. 2018-08-04 19:33:51 -04:00
Richard Moore
4f63b82bbb Updated dist files. 2018-08-03 15:26:01 -04:00
Richard Moore
f63c844c42 Added support for getting JsonRpcSigner by index and fixed gas limit in sendTransaction. 2018-08-03 15:22:28 -04:00
Richard Moore
694c0b3f7d Added test case to check build for TypeScript host-path mayhem. 2018-08-02 21:36:13 -04:00
Richard Moore
1c45840148 Updated dist files. 2018-08-02 21:35:39 -04:00
Richard Moore
421b2c857b Fixing TypeScript compiler using host paths for resolving constants. 2018-08-02 21:34:10 -04:00
Richard Moore
bacf42a22f Updated dist files. 2018-08-02 20:43:09 -04:00
Richard Moore
5c8703fb30 Restructuring for TypeScript. 2018-08-02 20:30:44 -04:00
Richard Moore
30a84d8577 Fixing long-output-delay issue on Travis CI. 2018-08-02 17:56:50 -04:00
Richard Moore
3198bc27fd Updated dist files. 2018-08-02 17:15:11 -04:00
Richard Moore
c7555516ff Using the Vyper-style gas limits sans the base cost. 2018-08-02 17:14:06 -04:00
Richard Moore
3cd0e8bf88 New custom Mocha reporter so Travis CI output is browser friendly. 2018-08-02 17:10:38 -04:00
Richard Moore
957ccd2eaf Updated dist files and tests. 2018-08-01 18:05:19 -04:00
Richard Moore
558ef2c00d Updated ethers exported structure. 2018-08-01 17:35:23 -04:00
Richard Moore
b73a964bac Moved type to enum for hmac SupportedAlgorithms. 2018-08-01 17:33:23 -04:00
Richard Moore
3e091a2938 Added Vyper-style gas ABI support. 2018-08-01 17:24:11 -04:00
Richard Moore
cb6d18035f Added error code detection for sendTransaction. 2018-08-01 17:02:27 -04:00
Richard Moore
4b15229832 Calculate estimated gasLimit for JsonRpcProvider. 2018-08-01 15:47:02 -04:00
Richard Moore
f0dfa50848 Adding node 8 back into tests. 2018-07-30 23:15:53 -04:00
Richard Moore
22f007498d Updated dist files. 2018-07-30 23:15:36 -04:00
Richard Moore
cc6f658ef1 Added support for Web3 v1.0 providers. 2018-07-30 23:14:07 -04:00
Richard Moore
9b885296d0 Major re-factor of the library layout for TypeScript; still up for discussion. 2018-07-30 18:59:52 -04:00
Richard Moore
c6c5ba0118 Updated dist files. 2018-07-27 17:02:46 -04:00
Richard Moore
a966a60656 Changed constant name for consistency. 2018-07-27 03:46:38 -04:00
Richard Moore
d05da1e487 Added transactionHash to error for consistency. 2018-07-27 03:45:11 -04:00
Richard Moore
294d0fda61 Added longer timeout for basic authentication test. 2018-07-26 18:19:26 -04:00
Richard Moore
29f3d2dea8 Fixed long fixed-length bytes from overflowing encoded ABI. (#237) 2018-07-26 18:02:42 -04:00
Richard Moore
d2b6570c39 Updated dist files. 2018-07-26 17:34:22 -04:00
Richard Moore
a1a765f6e4 Fixed types for Log Description. 2018-07-26 17:31:08 -04:00
Richard Moore
1d98928475 Updated dist files. 2018-07-26 17:02:32 -04:00
Richard Moore
73486d6f39 Added public and stateMutability for payable to ABI coder. 2018-07-26 16:58:31 -04:00
Richard Moore
640ed5dc33 Fixed recursive promise filling for contract calls. 2018-07-26 16:57:47 -04:00
Richard Moore
dda957c8e5 Removing junk files. 2018-07-25 22:05:38 -04:00
Richard Moore
97b6d8a797 Updated dist files. 2018-07-25 21:20:21 -04:00
Richard Moore
00bb20546b No longer using instanceof which conflicts with npm link. 2018-07-25 21:15:43 -04:00
Richard Moore
7cf8596906 Added bounds checks to the number coder and fixed bytes coder. 2018-07-25 19:32:27 -04:00
Richard Moore
5a0607d11b Updated dist files. 2018-07-23 19:23:53 -04:00
Richard Moore
26207e7bb8 Added non-unified types to resolve npm link issues. 2018-07-23 19:21:42 -04:00
Richard Moore
ae8d75fe6a Use ethers.wordlists for testing instead of re-import. 2018-07-23 05:38:53 -04:00
Richard Moore
4db19a1799 Type in console.log for tests. 2018-07-23 05:38:27 -04:00
Richard Moore
543ca19361 Updated dist files. 2018-07-23 05:37:48 -04:00
Richard Moore
7014afaab6 Fixing out-of-order browserify imports again. 2018-07-23 05:37:07 -04:00
Richard Moore
62987ac3a8 Updated test suite utils. 2018-07-23 03:02:39 -04:00
Richard Moore
3a5ec9b4ca Updated dist files. 2018-07-23 02:59:01 -04:00
Richard Moore
3169cf2f60 Generalized gulpfile and split browserify from tsc. 2018-07-23 02:56:40 -04:00
Richard Moore
bceefc7197 Better browserify for English wordlist. 2018-07-22 21:07:50 -04:00
Richard Moore
bfff3ea4cc Simpler empty modules for shims. 2018-07-22 20:41:30 -04:00
Richard Moore
7d4caa05ca Use class instance to detect BigNumber. 2018-07-22 20:06:36 -04:00
Richard Moore
004fd7d37d Make formatUnits options optional. 2018-07-22 20:05:45 -04:00
Richard Moore
e3da92d1ee Lazy load the elliptic curve; also fixed circular dependencies internal to the library that cause issues in browserify. 2018-07-22 20:05:14 -04:00
Richard Moore
0bc72c5ed4 Export computePublicKey in utils. 2018-07-22 19:59:27 -04:00
Richard Moore
d0cf0c8f43 Restructuring browser shims. 2018-07-22 18:25:36 -04:00
Richard Moore
4d4fe60a55 Version bump (pre-release: beta.1) 2018-07-18 16:38:40 -04:00
Richard Moore
81903e99d3 Updated dist files. 2018-07-18 16:36:21 -04:00
Richard Moore
fd40f66766 Removing node8, which fails to load Web3 dependencies. 2018-07-18 16:33:47 -04:00
Richard Moore
2aa2a38e37 Added a (hacky) way to get TypeScript to support the Contract meta-class functions. 2018-07-18 16:32:16 -04:00
Richard Moore
d701995bc0 Correct wallet.createRandom to have optional options. 2018-07-18 16:30:42 -04:00
Richard Moore
c4084fe625 Trying to fix Travis CI for node8; failing to load a devDependency in Web3. 2018-07-17 16:11:51 -04:00
Richard Moore
8c7c592bd1 Updated dist files. 2018-07-17 16:10:13 -04:00
Richard Moore
b9aca357a9 Updated generated version file. 2018-07-17 16:09:35 -04:00
Richard Moore
26f5a558d6 Fixed some concerns of eslint. 2018-07-17 16:09:06 -04:00
Richard Moore
960919d00a Version bump (pre-release: beta.0). 2018-07-17 15:49:37 -04:00
Richard Moore
b712c88088 Updated dist files. 2018-07-17 15:36:14 -04:00
Richard Moore
a062f75d38 Made Signatures more flexible for input. 2018-07-17 15:32:06 -04:00
Richard Moore
a67e3d1d65 Updated demo wallet send for v4 API. 2018-07-17 02:35:39 -04:00
Richard Moore
28927a6f1a Updated dist files. 2018-07-17 02:07:36 -04:00
Richard Moore
ce864fa1b2 Fixed browser shim for setImmediate. 2018-07-17 02:05:24 -04:00
Richard Moore
7e1e760b95 Remove editor swap file. 2018-07-17 01:49:51 -04:00
Richard Moore
d19df0dcae Updated dist files. 2018-07-17 01:46:27 -04:00
Richard Moore
b61b84dfc8 Moved static Wallet calls to utils and refactors exposed types. 2018-07-17 01:44:04 -04:00
Richard Moore
922de67a8b Updated dist files. 2018-07-16 04:00:56 -04:00
Richard Moore
e8c657ba70 Fixed type definitions using absolute path. 2018-07-16 03:59:25 -04:00
Richard Moore
1ce4f75b0d Increase wallet testcases timeout for decrypting and encrypting. 2018-07-16 03:30:09 -04:00
Richard Moore
175966674d Use brwoser hmac directly from browser pbkdf2. 2018-07-16 03:29:08 -04:00
Richard Moore
d1ce9f4964 Refactored imports and exports to be both node-friendly and TypeScript-friendly. 2018-07-16 03:27:49 -04:00
Richard Moore
0f9d0ef533 Updated dist files. 2018-07-16 00:55:34 -04:00
Richard Moore
e4df325e22 Moved getNetwork to utils. 2018-07-16 00:48:41 -04:00
Richard Moore
3b843a1782 Moving away from default exports. 2018-07-16 00:39:29 -04:00
Richard Moore
614b2d0325 Removing default export from wordlists. 2018-07-16 00:32:26 -04:00
Richard Moore
46e4db0b24 Added wordlists to faux-fs for phantomjs testing. 2018-07-16 00:25:13 -04:00
Richard Moore
94171f6c57 Updated dist files. 2018-07-16 00:24:50 -04:00
Richard Moore
e0391ee1bc Increased timeouts for some test cases that are failing in phantomjs on Travis CI. 2018-07-16 00:20:36 -04:00
Richard Moore
7004cd0b92 Added wordlist generation testing. 2018-07-16 00:19:50 -04:00
Richard Moore
b61643fecb Fixed internal exports to use types. 2018-07-16 00:09:13 -04:00
Richard Moore
8d6fa3dc93 Added sanity checksums to all BIP39 wordlists on load. 2018-07-14 20:51:51 -04:00
Richard Moore
e6c8db88bd Japanese sorting in browsers is different than in node; fixing wordlist and added sanity check. 2018-07-14 19:38:35 -04:00
Richard Moore
937194b5ee Updated dist files. 2018-07-14 17:21:32 -04:00
Richard Moore
5f3ceec6f9 Refactored types for TypeScript and to remove circular dependencies. 2018-07-14 17:19:08 -04:00
Richard Moore
3f9f0e02e5 Updated dist files. 2018-07-12 20:14:04 -04:00
Richard Moore
d6260ae11a Fixing weird browserify bug with pacakge resolution order. 2018-07-12 20:11:32 -04:00
Richard Moore
0ecfe4bafd Truly immutable BigNumber and hidden constructor. 2018-07-12 20:07:47 -04:00
Richard Moore
df2a00a2fc Fixed test-wallet for phantomjs (it does not like the "let" keyword). 2018-07-12 03:25:59 -04:00
Richard Moore
dfdbb9bb28 Updated dist files. 2018-07-12 02:53:06 -04:00
Richard Moore
979e374270 Added new-style events (removed old-style) to contracts and added filters to contracts and interfaces. 2018-07-12 02:52:43 -04:00
Richard Moore
b7e143b4f3 Changed Web3Proivder url to empty string instead of unknown if it cannot be determined. 2018-07-12 02:50:44 -04:00
Richard Moore
272265f085 Added common constants to root library. 2018-07-12 02:49:48 -04:00
Richard Moore
27402fafe6 Refactored Provider events. 2018-07-12 02:49:09 -04:00
Richard Moore
ac4211d0c6 Added common constants to utils. 2018-07-12 02:44:45 -04:00
Richard Moore
ee0faba708 Fixed ABI coder for no-name indexed parameters in events. 2018-07-12 02:43:55 -04:00
Richard Moore
e5d5871b95 Better transaction serializing API. 2018-07-12 02:42:46 -04:00
Richard Moore
4514229f27 Added eslint for promises. (#189) 2018-07-03 16:44:05 -04:00
Richard Moore
7ac8cb63c8 Use block polling rather than exponential backoff when possible. Added transactionHash to errors on failed transactions. 2018-07-03 15:48:37 -04:00
Richard Moore
8e83ceaedc Check for invalid strings in BigNumber constructor. (#219) 2018-07-03 14:58:24 -04:00
Richard Moore
b1d026b800 Added deployed to contract and abstracted polling into web. 2018-06-30 23:05:22 -04:00
Richard Moore
ebf42dc9e0 Fixed extra output in array data. (#220) 2018-06-30 22:40:20 -04:00
Richard Moore
a8283ea99f Add longer timeout for contract calling test cases. 2018-06-28 23:21:51 -04:00
Richard Moore
564c5fa364 Fix unresolved promise issues and add Promise linting. 2018-06-27 19:59:08 -04:00
Richard Moore
6faa978767 Fixes for handling weird TestRPC behaviour. 2018-06-26 18:59:22 -04:00
Richard Moore
8a340c8ff3 Fixed sendTransaction for JsonRpcSigner. 2018-06-26 18:37:21 -04:00
Richard Moore
0b35f1959a Fixed JsonRpcSigner for promises and made address optional again. 2018-06-26 17:49:54 -04:00
Richard Moore
98ea4b59a0 Fixed JsonRpcSigner for Promise-based values. 2018-06-26 17:47:31 -04:00
Richard Moore
ac2ad5a886 Travis CI and node 10 need the package-lock. 2018-06-25 21:58:34 -04:00
Richard Moore
8fe19de3ce Added support for unsigned transactions. 2018-06-25 21:02:20 -04:00
Richard Moore
40559b7044 Added node 10 to Travis CI testing. 2018-06-24 21:43:29 -04:00
Richard Moore
0b8b682fee Typo in travis config. 2018-06-24 21:29:04 -04:00
Richard Moore
083aca4693 Merge branch 'typescript' of github.com:ethers-io/ethers.js into typescript 2018-06-24 21:28:09 -04:00
Richard Moore
19475a06f5 Re-enable node 8 for testing. 2018-06-24 21:27:30 -04:00
Richard Moore
5fa014e01d Re-enable node 8 for testing. 2018-06-24 21:25:38 -04:00
Richard Moore
df591cfc4c Increase timeout for testcases that make contract requests. 2018-06-24 21:25:07 -04:00
Richard Moore
fcd57f9756 Added formatParamType and formatSignature. 2018-06-24 20:32:14 -04:00
Richard Moore
c348c60d5c Skip null values (not just undefined) when resolving ENS names. 2018-06-24 18:56:45 -04:00
Richard Moore
1d2fe8993b Populate from in estimateGas for determining gas limit. 2018-06-24 18:47:36 -04:00
Richard Moore
18aa885aef Provider and contract wait return receipts and throw on error status. 2018-06-24 18:41:28 -04:00
Richard Moore
a693576941 Updated dist files for wordlists. 2018-06-24 05:34:57 -04:00
Richard Moore
5c0475ce8c Added version to TypeScript library output. 2018-06-24 05:31:24 -04:00
Richard Moore
380c17a0a5 Removed unecessary private variable from Chinese wordlist. 2018-06-24 05:28:16 -04:00
Richard Moore
bd4ca0d4d3 Fixed TypeScript definition file generation. 2018-06-24 04:03:21 -04:00
Richard Moore
7949444612 Added initial support for EIP838, revert codes (#188). 2018-06-23 01:33:51 -04:00
Richard Moore
cf16b0ffa9 Typo in demo wallet. 2018-06-23 01:30:59 -04:00
Richard Moore
ec40c67c50 Added no implicit any for TypeScript checking. 2018-06-22 20:30:50 -04:00
Richard Moore
55ac3fef88 Increase test timeout for phantomjs hdnode tests. 2018-06-22 03:36:00 -04:00
Richard Moore
c4edd957b4 Updated dist files. 2018-06-22 03:10:59 -04:00
Richard Moore
a19cc91cd4 Updated test cases to reflect API name changes and remove brain wallets. 2018-06-22 02:31:07 -04:00
Richard Moore
c83596455b Updated dist files. 2018-06-22 02:18:19 -04:00
Richard Moore
41a91c3c2d Fixed encrypted JSON wallets in demo wallet. 2018-06-22 02:15:47 -04:00
Richard Moore
b77937ec4c Added shims include to the root library. 2018-06-22 02:14:46 -04:00
Richard Moore
1082105eea Added more specific types to signatures. 2018-06-22 02:13:34 -04:00
Richard Moore
45923ad5dd Added shims to browser in package.json. 2018-06-22 02:11:34 -04:00
Richard Moore
aa67537097 Added fallback operations to contract (#182). 2018-06-22 02:10:46 -04:00
Richard Moore
63e5ad1d95 Removed deprecated wallet operations (brainwallets and bare send). 2018-06-22 02:08:52 -04:00
Richard Moore
b2be7c807f Set up setImmediate for browsers. 2018-06-22 02:07:57 -04:00
Richard Moore
dde33aa5a5 Add tsconfig to npmignore. 2018-06-21 21:15:28 -04:00
Richard Moore
91f6e8ede6 Updated npmignore for TypeScript. 2018-06-21 21:13:34 -04:00
Richard Moore
7d8abf4463 Added sandbox test HTML file for debugging and testing. 2018-06-21 21:01:52 -04:00
Richard Moore
6abab3b974 Moved demo wallet to dist. 2018-06-21 21:01:29 -04:00
Richard Moore
970613fad9 Fixed wallet example. 2018-06-21 20:58:13 -04:00
Richard Moore
edbf8e319c Fixed resovleProperties not resolving properties. 2018-06-21 20:41:09 -04:00
Richard Moore
28cd3cace2 Moved TypeScript generation to match library layout for easier importing sub-components. 2018-06-21 20:24:30 -04:00
Richard Moore
45f8827c6e Moving wordlist generation scripts to tests. 2018-06-21 18:03:29 -04:00
Richard Moore
342be430cb Added types to package.json. 2018-06-21 17:57:33 -04:00
Richard Moore
622f02c369 Fix padding and stripping for signatures. 2018-06-20 22:07:26 -04:00
Richard Moore
263bf8047a Updated dist files (patch version bump). 2018-06-20 22:06:05 -04:00
Richard Moore
2feced5937 Strip the r and s (since we not pad) for transactions. 2018-06-20 22:03:23 -04:00
Richard Moore
6de0a765c9 Updated readme. 2018-06-20 21:19:08 -04:00
Richard Moore
4fd35224b3 Updated readme and dist files. 2018-06-20 21:14:56 -04:00
Richard Moore
52dc35bf0e Added missing String.prototype.normalize shim for phantomjs testing. 2018-06-20 21:12:04 -04:00
Richard Moore
2a111ab6ce Added mnemonic language support for Chinese, Italian, Japanese and Korean. 2018-06-20 20:29:54 -04:00
Li Xuanji
5631f071c3 pad output of signDigest 2018-06-19 13:40:11 -04:00
Richard Moore
a0f92954c8 Removing Etehrscan tests temporarily because Etherscan is down. 2018-06-19 02:21:52 -04:00
Richard Moore
64b312ef6e Adding phantomjs testing for Travis CI back. 2018-06-19 02:14:41 -04:00
Richard Moore
baf92d4ec8 Added missing browser implementations for crypto. 2018-06-19 02:14:06 -04:00
Richard Moore
1d282c544a Fixed up formatting for transforming. 2018-06-19 02:13:34 -04:00
Richard Moore
5b18a63ebc Use node crypto in node environments. 2018-06-19 02:12:57 -04:00
Richard Moore
336df72e04 Refactor Provider. 2018-06-18 18:49:00 -04:00
Richard Moore
cf79190175 Node 6 does not like async/await, which breaks Travis CI testing. 2018-06-18 14:53:41 -04:00
Richard Moore
5da4917c27 Refactoring. 2018-06-18 05:42:41 -04:00
Richard Moore
c1b24e818c Renamed convert to bytes. 2018-06-17 16:47:28 -04:00
Richard Moore
af893e79a4 Refectoring; split getAddress, expose transactions, hex operations. 2018-06-17 16:32:57 -04:00
Richard Moore
aa48dfcdf4 Removed stray localName in array sub-coders. 2018-06-15 17:50:22 -04:00
Richard Moore
efbfed0d40 Refactor API. 2018-06-15 04:18:17 -04:00
Richard Moore
059b03e090 Fixed ABI coder mutabing input. 2018-06-14 16:55:54 -04:00
Richard Moore
7391cf8d19 Added consolidated definition file. 2018-06-14 05:38:37 -04:00
Richard Moore
be7a128bf4 Renaming files. 2018-06-14 02:55:44 -04:00
Richard Moore
b6794b96a5 Removed legacy gruntfile. 2018-06-14 02:26:34 -04:00
Richard Moore
4df78764a2 Updates phantomjs test cases for gulp and TypeScript dist files. 2018-06-14 02:25:56 -04:00
Richard Moore
c411d9744d Added new checks and fixed up deploy for Contract. 2018-06-13 21:10:41 -04:00
Richard Moore
f7bfa50f15 Support for ENS addresses anywhere in a Contract call. 2018-06-13 20:02:28 -04:00
Richard Moore
8c0308dc58 Initial TypeScript migration. 2018-06-13 15:39:39 -04:00
Richard Moore
4758b30cd3 Updated mocha version to resolve node-growl security issue (not important, only part of the test suite). 2018-06-10 01:16:20 -04:00
Richard Moore
6a8ca9c318 Correctly transform uint to uint256 and int to int256 for signatures. 2018-06-06 20:48:45 -04:00
Richard Moore
884593ab76 Updated dist files. 2018-06-05 19:40:28 -04:00
Richard Moore
0517f70946 Temporary: remove ropsten test cases, it is having issues. 2018-06-05 19:38:35 -04:00
Richard Moore
514aab7ee3 Added positional and keyword argument test cases for ABIv2. 2018-06-05 19:32:18 -04:00
Richard Moore
eaaa689f2f Temporary - remove ropsten testcases for Etherscan (it is down). 2018-06-05 19:20:21 -04:00
Richard Moore
cf7872a498 Moved contract tests to Rinkeby. 2018-06-05 19:19:40 -04:00
Richard Moore
f779b6e3cc Fixed named parameters for tuples. 2018-06-05 19:18:41 -04:00
Richard Moore
a6cced81d6 Merge branch 'master' of github.com:ethers-io/ethers.js 2018-06-03 20:50:33 -04:00
Richard Moore
62e51861b8 Added more flexible ABI coder. 2018-06-03 20:50:21 -04:00
Richard Moore
6c6e031254 Added parseTransaction to interface to detect and parse relevant function and args. 2018-06-03 17:10:48 -04:00
Richard Moore
48c07f6ef6 Prevent pending filter hashes from returning null. 2018-06-03 17:08:25 -04:00
Richard Moore
1b6c20341e Updated Etherscan API URLs. 2018-06-03 16:54:13 -04:00
Richard Moore
75eb7ed507 Merge branch 'patch-1' of git://github.com/vasilisAntonakis/ethers.js into vasilisAntonakis-patch-1 2018-06-03 16:54:03 -04:00
Richard Moore
cd360a4f8c Updated CDN file in readme. 2018-06-03 16:51:23 -04:00
Richard Moore
fd27d3e2ce Merge branch 'patch-1' of git://github.com/alcuadrado/ethers.js into alcuadrado-patch-1 2018-06-03 16:51:11 -04:00
Richard Moore
6737128b84 Merge branch 'master' of github.com:ethers-io/ethers.js 2018-06-03 16:46:23 -04:00
Richard Moore
63b2eae4f5 Increase timeout for signing test cases. 2018-06-03 05:02:52 -04:00
Richard Moore
0b34aea23a Increase timeout for signing test cases. 2018-06-03 04:59:53 -04:00
Richard Moore
1290fa0073 Adding browser/process for now to try fixing Travis CI. 2018-06-03 03:16:58 -04:00
Richard Moore
da74e95f88 Fixing Travis CI, missing nextTick. 2018-06-03 02:42:53 -04:00
Richard Moore
ac82a5cb83 Merge branch 'master' of github.com:ethers-io/ethers.js 2018-06-03 01:11:49 -04:00
Richard Moore
ba21348c0f Added package-lock.json to fix PhantomJS tests on Travis CI. 2018-06-03 01:09:57 -04:00
Patricio Palladino
27207037a8 Fix browser installation instructions in README.md
Browser installation instructions were outdated and pointed to v2, while node's one to v3. 
I updated the browser's one.
2018-05-31 14:55:05 -03:00
Richard Moore
a612e1e8fa Added hashMessage to Wallet. 2018-05-31 02:13:59 -04:00
Richard Moore
08d3547d4e Updated dist files. 2018-05-31 02:13:43 -04:00
Vasilis Antonakis
7702d4ce7c API baseUrl changed
Hello, I noticed there is a change in the baseUrl of etherscan APIs

** Important: (Feb-12-2018) The ROPSTEN testnet API service URL has been updated to http://api-ropsten.etherscan.io . The previous API url http://ropsten.etherscan.io will cease to function as of March 31, 2018 

https://ropsten.etherscan.io/apis

same goes for all other testnets

nice work btw :)
2018-05-28 21:49:20 +03:00
Antoni Kedracki
3bf39b3bee Promote getHash into a static method of the Wallet. 2018-05-19 17:47:45 +02:00
Richard Moore
417065bad6 Added wait to transactions from JsonRpcSigner in sendTransaction (#177). 2018-05-15 15:32:32 -04:00
Richard Moore
3cb21dd6c7 Added timestamp to EtherscanProvider history (#174). 2018-05-14 15:50:25 -04:00
Richard Moore
cebf2aab29 Better error messages for contracts. 2018-04-16 21:42:17 -04:00
Richard Moore
72bf73f931 Updated dist files. 2018-04-16 21:31:49 -04:00
Richard Moore
65caec2ea5 Fix for Ganache getLogs. 2018-04-16 19:15:44 -04:00
Richard Moore
ea7c74d48d Version bump (patch). 2018-04-14 17:07:14 -04:00
Richard Moore
86df2306c4 Merge branch 'jlindberg-oss-jlindberg-oss-gethistory' 2018-04-14 17:06:15 -04:00
Richard Moore
6c12d8f30c Merge branch 'jlindberg-oss-gethistory' of git://github.com/jlindberg-oss/ethers.js into jlindberg-oss-jlindberg-oss-gethistory 2018-04-14 17:05:56 -04:00
Richard Moore
e649a22ccf Added basic authentication to JsonRpcProvider. 2018-04-14 16:10:26 -04:00
Richard Moore
eddf9de8f9 Refactor providers; moved getSigner and listAccounts to JsonRpcProvider from Web3Provider, using errors and added initial IpcProvider. 2018-04-13 18:21:48 -04:00
Richard Moore
7e91091cc3 Updated dist files. 2018-04-12 18:31:02 -04:00
Richard Moore
9745a6ecbc Added arg to SigningKey errors. 2018-04-12 18:29:53 -04:00
Richard Moore
3936b15afc Added long chain ID support to parsing. 2018-04-12 18:29:22 -04:00
Richard Moore
efb7dce524 Added splitSignature and beginning of better error messages. 2018-04-12 15:18:11 -04:00
jlindberg-oss
ac4b5d9199 handle 0 results from getHistory without error-ing
Similar to getLogs, getHistory seems to return `result.status == 0` when there are no results found.
2018-04-07 23:44:59 -04:00
Richard Moore
fdb7114511 Version bump (patch). 2018-04-05 15:48:46 -04:00
Richard Moore
03f8c1db86 Added better errors when calling contracts with incorrect number of arguments. 2018-04-05 15:47:34 -04:00
Richard Moore
12b68b0242 Added support for arbitrary number of decimals to parseUnits and formatUnits. 2018-04-05 15:46:44 -04:00
Richard Moore
28ddf485ed Allow large block difficulty, but set it to null for PoA (#152). 2018-04-05 15:31:31 -04:00
Richard Moore
96d420e832 Added parsing function outside of results for Interface. 2018-03-27 17:34:04 -04:00
Richard Moore
0f98bb5ac5 Added some extra checks for Wallet (from reading common mistakes on Stack Exchange). 2018-03-27 17:32:23 -04:00
Richard Moore
296473299c Added blockHash to Etherscan getLogs result (#146). 2018-03-27 17:19:46 -04:00
Richard Moore
ce7718c87e Transaction receipts in Ganache do not return logsBloom; making it optional. 2018-03-17 17:40:47 -04:00
Richard Moore
1ec8f9cf85 Fixed bool and number types not throwing an exception in the ABI decoding for empty bytes. 2018-03-17 17:39:45 -04:00
Richard Moore
46fd2deb8b Added pollingInterval to provider. (#132) 2018-03-15 16:03:20 -04:00
Richard Moore
5a9f440c8f Fixed getHistory range for EtherscanProvider. 2018-03-15 15:00:52 -04:00
Richard Moore
1d67aa3e29 Stall providers for blocks, transactions and transaction receipts with null results for triggered events (i.e. we know they should not be null). (#120) 2018-03-06 18:40:11 -05:00
Richard Moore
bd7e8e708f Updated dist files and version bump (patch) for publishing. 2018-03-05 22:34:12 -05:00
Richard Moore
8a842af999 Merge pull request #133 from ygnr/master
Fixed typo on JsonRpcProvider arguments length.
2018-03-05 21:43:29 -05:00
Gokulnath Reddy
224c17a9b9 Fix typo 2018-03-06 12:16:53 +11:00
Richard Moore
89e1cb02a4 Still problems with Travis CI with node 8; deactivating for now. 2018-03-05 03:19:18 -05:00
Richard Moore
3cdb6aad25 Refactored checkBlockTag. 2018-03-05 02:52:53 -05:00
Richard Moore
8a26f38579 Trying node 8 tests again. 2018-03-05 01:55:20 -05:00
Richard Moore
424cce9224 Fixed npmignore, which legacy was dropping all library packages. 2018-03-05 00:54:33 -05:00
Richard Moore
96abf66333 Updated dist files and fixed phantomjs dependency on them. 2018-03-04 21:17:16 -05:00
Richard Moore
b2ada0cda9 Fixing phantomjs test cases now that there is no sub-packages for test. 2018-03-04 20:00:46 -05:00
Richard Moore
e67a66f900 Major version update; some changes are not backwards compatible. This package has been merged into one package instead of an umbrella pacakge. (See: #95) 2018-03-04 19:31:09 -05:00
Richard Moore
20293fbcfb Updated testcase balance for Ropsen. 2018-03-03 00:18:29 -05:00
Richard Moore
03f20f023f Added ETC (classic) network. 2018-03-02 23:52:25 -05:00
Richard Moore
dfdf4ef317 Updated dist files. 2018-02-08 00:00:54 -05:00
Richard Moore
f10c595ad3 Added units manipulation to utils index. 2018-02-07 20:34:39 -05:00
Richard Moore
f611dba0ad Updated dist files. 2018-02-03 21:02:34 -05:00
Richard Moore
da852d0012 Merge branch 'master' of github.com:ethers-io/ethers.js 2018-02-03 20:32:02 -05:00
Richard Moore
6ade579542 Added bool support to Solidity-style hash functions (#113). 2018-02-03 20:31:50 -05:00
Richard Moore
e17947930c Updated dist files. 2018-01-28 21:30:50 -05:00
Richard Moore
74c71e6677 Fixed Contract method overrides with updated Interface. 2018-01-28 20:58:56 -05:00
Richard Moore
7635708c21 Merge branch 'master' of github.com:ethers-io/ethers.js 2018-01-26 21:56:33 -05:00
Richard Moore
4ee9a4d191 Added x-ethers compatible encrypted mnemonic to JSON wallets. 2018-01-26 21:56:20 -05:00
Richard Moore
bb24fce859 Added strict mode to properties. 2018-01-26 17:44:54 -05:00
Richard Moore
21d53f190b Updated dist files. 2018-01-17 19:11:04 -05:00
Richard Moore
5fc59dd1cf Some nodes (e.g. TestRPC) do not like checksum addresses in their RPC calls. 2018-01-17 17:26:31 -05:00
Richard Moore
34fd2882d8 Fix typo when detecting MetaMask. 2018-01-17 17:21:38 -05:00
Richard Moore
4a23b0ddc7 Merge branch 'master' of github.com:ethers-io/ethers.js 2018-01-17 16:23:12 -05:00
Richard Moore
c4690f9e7b Fixed auto-address and signing with Metamask and Web3Provicder. 2018-01-17 16:23:01 -05:00
Richard Moore
36c6d53757 Updated dist files. 2018-01-17 02:51:36 -05:00
Richard Moore
c550f2eb07 Merge branch 'master' of github.com:ethers-io/ethers.js 2018-01-16 18:56:10 -05:00
Richard Moore
67bb0b7f93 Added Web3Provider. 2018-01-16 18:55:56 -05:00
Richard Moore
c5b411811a Updated dist files. 2018-01-10 20:29:50 -05:00
Richard Moore
eddf93b200 Added named parameters to tuple encoding. 2018-01-10 19:20:18 -05:00
Richard Moore
9aeb309d9d Updated dist files. 2018-01-10 16:42:36 -05:00
Richard Moore
bea0ea3aaf Fixed overwriting name on Events. 2018-01-10 14:34:36 -05:00
Richard Moore
df930103e7 Fixed ABIv2 signatures for calling methods. 2018-01-09 20:45:38 -05:00
Richard Moore
d6cf970ae9 Added errors for providers trying to use ENS on networks without ENS. 2018-01-09 18:43:09 -05:00
Richard Moore
e778ab6f30 Added general unit conversion to utils/units. 2018-01-09 18:25:44 -05:00
Richard Moore
b7fc74a99d Updted dist files. 2017-12-30 14:05:40 -05:00
Richard Moore
b38a36b2f5 Version bump (patch). 2017-12-30 14:02:36 -05:00
Richard Moore
046a4a4dc0 Fixed new contract features on old platform strict mode. 2017-12-30 01:42:50 -05:00
Richard Moore
357d49ecee Version bump (patch). 2017-12-29 21:02:56 -05:00
Richard Moore
a568be9df3 Added getEtherPrice and getHistory calls for Etherscan Provider. 2017-12-29 21:01:43 -05:00
Richard Moore
43061c691b Verify message supports normalized and non-normalized recovery parameter. 2017-12-29 20:44:32 -05:00
Richard Moore
a4e768e2b3 Added pending transaction event for providers that support it. 2017-12-29 20:41:16 -05:00
Richard Moore
2d4fb371c2 Added get functions to the contract event callbacks. 2017-12-29 20:17:00 -05:00
Richard Moore
9b54b53081 Merge branch 'master' of github.com:ethers-io/ethers.js 2017-12-05 16:01:28 -05:00
Richard Moore
3512922bef Temporary - remove InfuraProvider homestead testcases; it is down. 2017-12-05 16:01:17 -05:00
Richard Moore
60334b66ba Updated dist files. 2017-12-05 03:25:08 -05:00
Richard Moore
d38bf992c2 Removing Node 8 for now in Travis CI; it is not working. 2017-12-05 02:36:33 -05:00
Richard Moore
ce95391804 Trying to unjam Travic CI build. 2017-12-05 02:33:04 -05:00
Richard Moore
511fff1390 Fixed message signing when the values are zero-padded. 2017-12-05 01:59:37 -05:00
Richard Moore
178980c34a Fixed address filtering and added more features to the event metadata. 2017-12-05 01:58:20 -05:00
Richard Moore
132e56e65e Added more provider log details. 2017-12-05 01:56:57 -05:00
Richard Moore
ff63e99c86 Updated dist files. 2017-12-02 02:52:36 -05:00
Richard Moore
a3fab18a93 Version bump (patch) for contracts. 2017-12-01 22:26:58 -05:00
Richard Moore
a9cc1bf641 Version bump (patch) for providers. 2017-12-01 22:26:12 -05:00
Richard Moore
fa4db2cecc Add binary message support for wallet.signMessage (#80). 2017-12-01 22:25:19 -05:00
Richard Moore
ca249054e5 If a block does not exist, return null (instead of rejecting). 2017-12-01 21:59:26 -05:00
Richard Moore
f6ace914e9 Allow contract overrides for nonce. 2017-12-01 21:58:36 -05:00
Richard Moore
1d38633e69 Updated dist files. 2017-11-23 03:49:36 -05:00
Richard Moore
8129f0cb8b Added tightly packed (aka non-standard packed) Solidity hash functions. 2017-11-23 02:11:08 -05:00
Richard Moore
b06002a2a8 Support for negative hexidecimal BigNumber. 2017-11-23 01:37:58 -05:00
Richard Moore
464584265a Merge pull request #76 from andrew--r/patch-1
Fixed error for incorrect private key.
2017-11-22 02:55:26 -05:00
Andrew Romanov
184839a57a Fix typo 2017-11-22 08:46:49 +03:00
Richard Moore
3ed66f5c16 Updated dist files. 2017-11-21 21:28:58 -05:00
Richard Moore
0d106d01af Added names for nested tuples and fixed topics (now optional) for event parsing. 2017-11-21 19:24:44 -05:00
Richard Moore
807c8133ea Fixed getTransaction to address and raw computation for providers that do not include it. 2017-11-21 19:05:34 -05:00
Richard Moore
f6cc207ae5 Merge branch 'master' of github.com:ethers-io/ethers.js 2017-11-20 01:41:15 -05:00
Richard Moore
388a77258e Updated dist files. 2017-11-20 01:41:01 -05:00
Richard Moore
424abc3395 Merge branch 'master' of github.com:ethers-io/ethers.js 2017-11-19 22:26:41 -05:00
Richard Moore
83b5e4b4a3 Merge branch 'master' of github.com:ethers-io/ethers.js 2017-11-19 22:26:14 -05:00
Richard Moore
03c10086e7 Expose BigNumber object for TypeScript. 2017-11-19 22:25:41 -05:00
Richard Moore
dae3a5b8b1 Updated dist files. 2017-11-18 18:58:53 -05:00
Richard Moore
67a29eb92e Etherscan is back up; re-adding the test cases. 2017-11-18 18:01:02 -05:00
Richard Moore
5a837e1b0a Fixed some weird cases for TestRPC and getTransaction. 2017-11-18 18:00:36 -05:00
Richard Moore
a1f2c84d03 Merge branch 'master' of github.com:ethers-io/ethers.js 2017-11-17 14:59:44 -05:00
Richard Moore
628c99936e Added test cases for legacy parameters. 2017-11-17 14:59:42 -05:00
Richard Moore
e8b23c29a5 Fixed for PoA networks getTransactionReceipt (#69). 2017-11-17 14:55:14 -05:00
Richard Moore
6e19e6eca9 Updated dist files. 2017-11-12 16:39:41 -05:00
Richard Moore
ef71271db6 Merge branch 'master' of github.com:ethers-io/ethers.js 2017-11-12 16:02:17 -05:00
Richard Moore
11f0434bdd Fixed legacy parameters for Providers and added test cases. 2017-11-12 16:02:07 -05:00
Richard Moore
46ff8e891e Updated dist files for umbrella package. 2017-11-09 19:54:28 -05:00
Richard Moore
4df288e244 Removed shims from PhantomJS tests. 2017-11-09 03:14:48 -05:00
Richard Moore
a9bc2b5ea8 Fixed slice for limited environments in HD and PBKDF2. 2017-11-08 22:38:11 -05:00
Richard Moore
d49beb8374 Added connect method and fixed missing provider/signer error. 2017-11-08 21:13:06 -05:00
Richard Moore
f88b3523c0 Version bump (patch) for provider. 2017-11-08 21:08:27 -05:00
Richard Moore
04f0a33489 Added slice and missing Math libraries for limited environments. 2017-11-08 20:19:41 -05:00
Richard Moore
b4bc01f2c3 Merge pull request #63 from ConnorGutman/patch-1
Remove double declaration of  transactionIndex for TransactionReceipt.
2017-11-08 19:04:11 -05:00
Connor Gutman
7eaf22f573 Remove double declaration of transactionIndex
This little guy nearly broke my react native app's production build by sneaking past me. 👋 Buh-bye 👋
2017-11-08 16:28:56 -07:00
Richard Moore
255b7e0a0f Version bump (patch) for utils. 2017-11-07 18:15:11 -05:00
Richard Moore
9adcbbb0fe Small README change. 2017-11-07 01:00:36 -05:00
Richard Moore
31b5650489 Merge branch 'master' of github.com:ethers-io/ethers.js 2017-11-06 22:45:06 -05:00
Richard Moore
2e90718d6a Merge branch 'master' of github.com:ethers-io/ethers.js 2017-11-06 19:36:22 -05:00
Richard Moore
fe3ac0e94d Added ABI v2 coder to Interface (still experimental in Solidity though). 2017-11-06 19:35:18 -05:00
Richard Moore
50422b6060 Removing duplicate license. 2017-11-05 13:44:21 -05:00
Richard Moore
4351a3ac86 Merge branch 'master' of github.com:ethers-io/ethers.js 2017-11-05 13:41:00 -05:00
Richard Moore
ccffc46f67 Added pow to BigNumber. 2017-11-05 13:40:54 -05:00
Richard Moore
e8bb624560 Adding default code of conduct
Adding the default code of conduct document.
2017-11-04 02:03:41 -05:00
Richard Moore
21c6fdce3a Creating license file in GitHub UI
Apparently GitHub doesn’t recognize license.txt, so adding license.
2017-11-03 14:53:11 -05:00
Richard Moore
18cd678b71 Version bump (patch) for providers. 2017-11-03 02:41:41 -05:00
Richard Moore
9cac6b06f5 Updated list of networks (legacy provider list). 2017-11-03 01:34:57 -05:00
Richard Moore
73ee7664a1 Merge branch 'master' of github.com:ethers-io/ethers.js 2017-11-03 01:31:09 -05:00
Richard Moore
8835225655 Updated getTransactionReceipt for Byzantium. 2017-11-03 01:30:56 -05:00
Richard Moore
54c19dfb5a Fixed default network for providers (#51). 2017-10-28 17:00:59 -04:00
Richard Moore
e4c455bdb6 Less strict parsing for loose providers. 2017-10-27 17:03:26 -04:00
Richard Moore
3c9f6f6ab9 Merge branch 'master' of github.com:ethers-io/ethers.js 2017-10-27 01:16:10 -04:00
Richard Moore
fb65772dd6 Added sighash and signature the Interface function properties. 2017-10-27 00:24:59 -04:00
Richard Moore
aeec6d6d52 Added Rinkeby and Kovan support. 2017-10-25 19:59:54 -04:00
Richard Moore
9be0053d62 Exclude the slower node version when running PhantomJS. 2017-10-22 18:36:47 -04:00
Richard Moore
466fbcb8da Using exclude instead of include for Travis-CI. 2017-10-22 18:20:20 -04:00
Richard Moore
f43a03a151 Using matrix include and fix test bug. 2017-10-22 18:17:31 -04:00
Richard Moore
b3134642a2 Splitting PhantomJS testing out of node testing. 2017-10-22 18:05:44 -04:00
Richard Moore
4d00215098 Added all test cases for PhantomJS. 2017-10-22 17:56:01 -04:00
Richard Moore
6926e5f423 Fix for case-sensitive Gruntfile. 2017-10-22 17:51:30 -04:00
Richard Moore
a5e1f40c30 First attempt at PhantomJS test cases. 2017-10-22 17:47:17 -04:00
Richard Moore
857688f36c Fix in test-accounts for case-sensitive file systems. 2017-10-21 04:03:51 -04:00
Richard Moore
0ac2bfd1cf Travis-CI updates. 2017-10-21 04:01:00 -04:00
Richard Moore
0adedcab50 Updating root test script for travis-ci. 2017-10-21 03:36:55 -04:00
Richard Moore
74406cc0b7 Adding travis-ci. 2017-10-21 03:28:01 -04:00
Richard Moore
8754bb80e0 Fixed documentation link in readme. 2017-10-20 23:01:08 -04:00
Richard Moore
67ac227fec Updated readme with latest dist version in CDN (and added utf-8 charset). 2017-10-20 22:59:30 -04:00
Richard Moore
666210a061 Fixed link in readme to documentation. 2017-10-20 22:01:51 -04:00
Richard Moore
2403a98219 Moved documentation to its own repository (see the ethers-io/documentation repo). 2017-10-20 21:59:30 -04:00
Richard Moore
f140fa6017 Updated dist files and dist scripts. 2017-10-20 15:44:54 -04:00
Richard Moore
a5df551689 Version bump (patch) for utils. 2017-10-20 15:16:18 -04:00
Richard Moore
ea6177d19e Updating some links in utils README. 2017-10-20 15:14:14 -04:00
Richard Moore
5c776a83ff Removed chatty library (See issue #36). 2017-10-20 15:13:29 -04:00
Richard Moore
bdcdfdabec Added Etherscan URL for testcase. 2017-10-19 02:56:40 -04:00
Richard Moore
264a7da9f7 Added some comparison test cases against ethereumjs-abi. 2017-10-19 02:55:38 -04:00
Richard Moore
f5f2bf85c5 Added message signing to Wallet. 2017-10-19 02:52:55 -04:00
Richard Moore
cb7e40a892 Updated to most recent stable web3 and ethereum lib. 2017-10-19 02:51:43 -04:00
Richard Moore
121d104d46 Removed old nodeunit test cases. 2017-10-19 02:51:20 -04:00
Richard Moore
44729ffba9 Migrated most test cases to mocha and added pre-generated gzipped test suite. 2017-10-18 21:28:45 -04:00
Richard Moore
4a3d68eada Version bump (patch). 2017-10-17 16:09:43 -04:00
Richard Moore
afb35ec307 Fixed Provider.lookup to support any address format. 2017-10-17 16:07:32 -04:00
Richard Moore
bbd3c94ec3 Added id to utils. 2017-10-17 16:05:44 -04:00
Richard Moore
394761a6ca Added ENS reverse lookup to provider. 2017-10-03 19:37:06 -04:00
Richard Moore
c566f00567 Updated dist files. 2017-07-05 20:39:03 -04:00
Richard Moore
03b967c99a Version bump (patch) for wallet. 2017-07-05 20:34:21 -04:00
Richard Moore
966267edf9 Version bump (patch) for providers. 2017-07-05 20:32:16 -04:00
Richard Moore
a53595eea5 Version bump (patch) for utils. 2017-07-05 20:31:13 -04:00
Richard Moore
eec9799706 Updated dist files. 2017-07-05 20:30:28 -04:00
Richard Moore
811710c8f0 Updated provider for picky JSON-RPC nodes. 2017-07-05 20:26:03 -04:00
Richard Moore
1c0d0157ad Add gt to big numbers. 2017-06-30 14:38:48 -04:00
Richard Moore
b4d622b02b Do not allow (non-hex-prefixed) strings to be treated as arrayish. 2017-06-30 14:38:27 -04:00
ricmoo
1b3b117b06 Fixed secret storage for bad passwords. 2017-05-29 23:08:47 -05:00
ricmoo
33ca1fc670 Version bump (patch). 2017-05-28 15:48:58 -05:00
ricmoo
91f9a47afa Added support for PBKD2 encrypted wallets (which Parity uses). 2017-05-28 15:46:57 -05:00
ricmoo
70f10cd23e Version bump (patch); updated dist files. 2017-05-21 20:39:16 -04:00
ricmoo
0a52beb539 Updated dist files. 2017-05-21 20:38:41 -04:00
ricmoo
0d36f839c3 Updated documents to include ENS. 2017-05-21 20:37:29 -04:00
ricmoo
c815166eb5 Added ENS null resolving cases. 2017-05-21 20:34:45 -04:00
ricmoo
9616720abb Version bump (minor); ENS support. 2017-05-21 20:31:37 -04:00
ricmoo
01f909fc05 Fixed getLogs bug. 2017-05-21 20:29:09 -04:00
ricmoo
b69d3de3e3 Contract is now ENS ready. 2017-05-21 20:27:47 -04:00
ricmoo
7b1856aacb Added name resolve test cases (need more though). 2017-05-21 18:09:17 -04:00
ricmoo
d5402d017a Allow getLogs filter to include ENS names. 2017-05-21 18:01:23 -04:00
ricmoo
c59414b74b Added ENS name support to Provider and Wallet. 2017-05-20 15:42:16 -04:00
ricmoo
0aee62df4d Updated dist and added donation address to readme. 2017-05-10 19:09:58 -04:00
ricmoo
1531793084 Fixed getDeployTransaction with ABI objects and added support for indexed parameters in event logs. 2017-05-09 21:48:56 -04:00
ricmoo
4b41c0e1a2 Added resetEventsBlock feature and fixed a problem with some INFURA nodes. 2017-05-09 21:45:36 -04:00
ricmoo
12eb60d2f7 Fixed createRandom when no options are passed in. 2017-05-09 18:53:32 -04:00
ricmoo
00b628c6cc Changed filenames of namehash test cases. 2017-05-08 16:14:55 -04:00
ricmoo
9e80c55275 Fixed up testcases for namehash. 2017-05-08 16:13:01 -04:00
ricmoo
301d803fc5 Version bump (patch) for namehash. 2017-05-08 12:14:56 -04:00
ricmoo
a07dfa9572 Added ENS test generation script. 2017-05-03 20:25:04 -04:00
ricmoo
b528131937 Added namehash to utils. 2017-05-03 20:24:07 -04:00
ricmoo
169347d0c4 Version bump (patch). 2017-04-22 11:58:43 -04:00
ricmoo
e4dcec7de7 Updating dist package for updated EtherscanProvider. 2017-04-22 11:57:39 -04:00
ricmoo
4407c7a4e1 Updated to new Etherscan URL. 2017-04-22 11:46:04 -04:00
ricmoo
cafd16b960 Updted etherscan provider (they changed their URL). 2017-04-22 11:43:32 -04:00
ricmoo
3d56251d15 Added npmignore to thin down the umbrella package. 2017-04-06 14:13:22 -04:00
ricmoo
a90ab3dbb1 Removed old file. 2017-04-06 14:10:32 -04:00
ricmoo
c137f5fe9f Version bump (patch) for Issue#15; browser-random-bytes using undefined utils. 2017-04-06 13:50:02 -04:00
Richard Moore
f7bdaadd7e Merge pull request #15 from slavik0329/master
Fixed call to defineProperty.
2017-04-06 13:48:16 -04:00
Steve Dakh
36a5b13a0c Fixed call to defineProperty 2017-04-06 13:39:21 -04:00
ricmoo
42f4ff398c Remove old hdnode (now part of Wallet). 2017-04-05 17:19:13 -04:00
ricmoo
d65a1f120e Updated test location (test files are too big to include in dist). 2017-04-05 17:14:57 -04:00
ricmoo
ef2be2e86d Updated wallet tool to use new library. 2017-04-05 17:14:09 -04:00
ricmoo
14841641c1 Updated gitignore. 2017-04-05 17:13:26 -04:00
ricmoo
cde70b1494 Updated documentation. 2017-04-05 17:06:11 -04:00
ricmoo
79a7f3dd64 Updated umbrella README. 2017-04-05 16:56:41 -04:00
ricmoo
ef2f0add35 Moved to using npm versions of packages in umbrella package. 2017-04-05 16:53:29 -04:00
ricmoo
2ff0b10084 Added repo ro package.json. 2017-04-05 16:43:57 -04:00
ricmoo
40634da90b Added basic README for npm. 2017-04-05 16:43:34 -04:00
ricmoo
afea5e81f9 Added repo to package.json 2017-04-05 16:35:53 -04:00
ricmoo
29cc0795b4 Fixed cross-package isBigNumber. 2017-04-05 16:33:37 -04:00
ricmoo
f77d5ff909 Added repo to package.json. 2017-04-05 16:27:06 -04:00
ricmoo
88b48738cc Added basic README for npm. 2017-04-05 16:26:39 -04:00
ricmoo
617f7a1ce6 Version bump (patch) to include new readme. 2017-04-05 16:10:06 -04:00
ricmoo
2ab382a355 Added basic readme for utils. 2017-04-05 16:09:33 -04:00
ricmoo
28f40287ce Adding repo to package.json. 2017-04-05 16:06:14 -04:00
ricmoo
7250e96850 Use most recent compatible version of ethers packages. 2017-04-04 18:55:36 -04:00
ricmoo
92bef64979 Removed HDNode dist files (moved to Wallet). 2017-04-04 18:54:46 -04:00
ricmoo
1c2d7c466e Updated dist packages. 2017-04-04 18:53:59 -04:00
ricmoo
85bce0582e Added HTML build of docs. 2017-04-04 18:48:34 -04:00
ricmoo
e746891ae0 Updated documentation. 2017-04-04 18:43:41 -04:00
ricmoo
9fa2c878b9 Updated to new version of etehreumjs-tx (for testing EIP155 support). 2017-04-04 18:32:35 -04:00
ricmoo
6c963f6404 Transactions are returned instead of hashes. 2017-04-04 18:32:00 -04:00
ricmoo
bb8f06c248 If raw is missing from a transaction, compute it. 2017-04-04 18:23:31 -04:00
ricmoo
cb9bfccb9a Moved HDNode into Wallet. 2017-04-04 17:50:50 -04:00
ricmoo
3069fa759b Contracts now return hex strings instead of arrays. 2017-04-04 17:40:25 -04:00
ricmoo
ecd9d31371 Renamed summonBrainWallet to fromBrainWallet. Removed crowdslae tests (they will be added again in the future). 2017-04-04 17:39:32 -04:00
ricmoo
6c0723bc43 Added testcase for nonce (which should be truncated). 2017-04-04 17:36:59 -04:00
ricmoo
dc4f2dcee7 Cleaned up umbrella index. 2017-04-04 17:35:34 -04:00
ricmoo
f772ce111e Renamed "execute" to "functions". Use signer estimateGas if possible. 2017-04-04 17:33:47 -04:00
ricmoo
d686374e05 Make safe integers into JavaScript numbers. Added more detail error messages. Prevent contracts from hijacking "functions" and "events". 2017-04-04 17:32:04 -04:00
ricmoo
73eef741b6 Small bug fixes and improved network ID population. 2017-04-04 17:30:17 -04:00
ricmoo
4075f330e2 Using Provider.inherits. 2017-04-04 17:28:25 -04:00
ricmoo
c10c3b937c Make fallback providers immutable. 2017-04-04 17:27:28 -04:00
ricmoo
8603c836e1 Cleaning up utils index. 2017-04-04 17:26:09 -04:00
ricmoo
27bdceaf32 Using throw-error to populate meaningful errors. 2017-04-04 17:22:53 -04:00
ricmoo
9672b9d3b8 Renamed rlp to RLP. 2017-04-04 17:21:59 -04:00
ricmoo
4f05bf87ac Fixed signing key recover when hex strings are passed in for r and s. 2017-04-04 17:19:55 -04:00
ricmoo
c88d796f0e Fixed progressCallback canel bug. Return transaction instead of transaction hash. Renamed rlp to RLP. 2017-04-04 17:19:18 -04:00
ricmoo
0b8cf42fcf Changed validMnemonic to isValidMnemonic. 2017-04-04 17:18:23 -04:00
ricmoo
807b27048b Added throw-error utility. 2017-04-04 17:06:49 -04:00
ricmoo
6a01b622a2 Updated a lot of the documentation. 2017-03-23 05:20:27 -04:00
ricmoo
7e61b6b730 Suppress too many levels of api-advanded in the toc. 2017-03-23 05:19:33 -04:00
ricmoo
156534e2ba Initial documentation (still lots to do). 2017-03-12 19:12:18 -04:00
ricmoo
5f650572ce Added sup override for dt. 2017-03-12 19:08:13 -04:00
ricmoo
9bed4096b8 Fixed contract-address bug (nonce was not zero-stripped). 2017-03-10 17:16:58 -05:00
ricmoo
b097e48efc Grunt file to produce browser test cases. 2017-03-08 01:55:02 -05:00
ricmoo
1a3aa4fd1a Added listener event for address balance changes. 2017-03-08 01:53:59 -05:00
ricmoo
83d099b37c Fixed constructor calls. 2017-03-08 01:52:53 -05:00
ricmoo
637a6d7f40 Better checks for trying to call contract methods with weird options. 2017-03-08 01:52:23 -05:00
ricmoo
78c4af5e4b Removed base option to toString. 2017-03-08 01:51:28 -05:00
ricmoo
730ccd36b2 Fixed fallback randomBytes for weak-crypto browsers.. 2017-03-08 01:51:04 -05:00
ricmoo
33a1459505 Re-org packages. 2017-03-08 01:50:12 -05:00
ricmoo
30cf4a1702 Moved wallet to separate file. 2017-03-08 01:49:05 -05:00
ricmoo
16529909f9 House cleaning. 2017-03-08 01:48:27 -05:00
ricmoo
adc1d93ac2 Added EIP155 support. 2017-03-08 01:47:29 -05:00
ricmoo
94ba940382 Moved hdnode to wallet. 2017-03-06 16:11:24 -05:00
ricmoo
cf83d92cc1 Fixing up browser test cases. 2017-03-01 15:56:49 -05:00
ricmoo
f6990b6e1f Changed name of local created test private keys. 2017-03-01 15:24:02 -05:00
ricmoo
da1526b92f Added dummy file to keep dist directory in tests. 2017-03-01 15:20:00 -05:00
ricmoo
4cd710f84e Added npm test to umbrella pacakge. 2017-03-01 15:18:54 -05:00
ricmoo
55833fcad0 Added Contract getDeployFunction. 2017-03-01 03:59:46 -05:00
ricmoo
f1d35ba18a Fixed to address bug and simplified code. 2017-03-01 02:36:14 -05:00
ricmoo
54685bd660 Fixed name bug (typo). 2017-03-01 02:34:52 -05:00
ricmoo
b0f0e8841e Moved to more flexible contract signers. 2017-03-01 02:34:18 -05:00
ricmoo
a073968597 Added constructor and simplified interface. 2017-03-01 02:33:29 -05:00
ricmoo
5ecba670a5 Moved to Provider provided inherits. 2017-03-01 02:31:11 -05:00
ricmoo
45c1108ca8 Added topic events and fixed bugs. 2017-03-01 02:30:37 -05:00
ricmoo
e115b2d8a8 Fixed call bug for strict JSON-RPC nodes. 2017-03-01 02:29:12 -05:00
ricmoo
cf20071189 Fixed empty response for getLogs and call bug. 2017-03-01 02:27:59 -05:00
ricmoo
b4b60b64aa Added provider test cases. 2017-03-01 02:26:50 -05:00
ricmoo
8111ef74b2 Refactored RLP coder a bit. 2017-02-28 20:50:53 -05:00
ricmoo
b4c498f088 Added TestContract.sol for testing contracts and providers. 2017-02-28 20:50:20 -05:00
ricmoo
8286c63ddc Gruntfile produces proper stand-alone files for browser. 2017-02-27 17:35:23 -05:00
ricmoo
7394e83eeb Added testcase name to failed test cases. 2017-02-27 17:29:23 -05:00
ricmoo
ebd9bbde2e Added browser test harness. 2017-02-27 01:51:27 -05:00
ricmoo
90f27da293 Fixed umbrella test harness. 2017-02-27 01:50:17 -05:00
ricmoo
7d11687f15 Updated hdnode API in test case. 2017-02-27 00:17:22 -05:00
ricmoo
3234f04b27 Added brainwallet test. 2017-02-27 00:17:01 -05:00
ricmoo
5c16c14fed Fixed filename typo. 2017-02-27 00:13:09 -05:00
ricmoo
6aca737405 Added contracts pacakge.json. 2017-02-27 00:10:19 -05:00
ricmoo
c884627e21 Added dist files. 2017-02-27 00:09:47 -05:00
ricmoo
8fa9b34e87 Added providers to umbrella package. 2017-02-27 00:09:07 -05:00
ricmoo
b1190e6e0b Optimized gruntfile (manually remove weird pulled in dependencies). 2017-02-27 00:08:48 -05:00
ricmoo
0c1615aef5 Custom pbkdf2 without create-hash and create-hmac. 2017-02-27 00:07:46 -05:00
ricmoo
e31f20e441 Added default url for JSON-RPC provider. 2017-02-27 00:06:32 -05:00
ricmoo
735e492f8c Cleaning up utils. 2017-02-27 00:05:39 -05:00
ricmoo
a107a7c3e2 Cleaning up hdnode. 2017-02-27 00:04:03 -05:00
ricmoo
b5f4d3b113 Cleaning up wallet. 2017-02-27 00:02:40 -05:00
ricmoo
005c0d2cdc Removed dead code. 2017-02-25 01:24:54 -05:00
ricmoo
0db4b352b6 Added split up providers. 2017-02-25 01:23:48 -05:00
ricmoo
0694a5db0e Added auto-running testcases. 2017-02-24 15:24:11 -05:00
ricmoo
73c7efffb0 Added wallet package.json. 2017-02-24 15:10:54 -05:00
ricmoo
729170ec97 Added split up contract. 2017-02-24 15:10:28 -05:00
ricmoo
2b0c40feb4 Added HDNode and BIP39 mnemonic phrases. 2017-02-24 14:59:05 -05:00
ricmoo
91543a0029 Split up utils. 2017-02-24 14:57:46 -05:00
ricmoo
9625745f4c Added new regression tests (based on pregenerated JSON files). 2017-02-24 14:56:55 -05:00
ricmoo
89c4c75e3c Scripts to run test cases. 2017-02-24 14:44:19 -05:00
ricmoo
6aceee8486 Added test case generation files. 2017-02-24 14:42:54 -05:00
ricmoo
26958d74d8 Moving test cases around; preparing to delete. 2017-02-24 14:41:24 -05:00
ricmoo
38d578a2c6 Migrating to a split up package; renaming files. 2017-02-24 14:32:44 -05:00
ricmoo
96aaed7395 Version bump (patch). 2017-02-02 17:06:44 -05:00
ricmoo
7027935ff7 Fixed failing contracts with fallback function. 2017-02-02 17:06:07 -05:00
ricmoo
5d692f4908 Some JSON-RPC clients do not allow call blockTag to be optional. 2017-01-27 16:24:53 -05:00
ricmoo
9def4a6170 Fix data bug for sendTransaction (was not incuded). 2017-01-27 15:49:15 -05:00
ricmoo
3a0d79b1e4 Just pulling in bn.js and hash.js libraries, instead of relying on the version pulled from elliptic. 2016-11-21 18:45:24 -05:00
ricmoo
048ef96ad0 Fixed package dependency issue when elliptic is already installed. 2016-11-21 18:20:36 -05:00
ricmoo
51f1fa50dd Expose the Interface and Contract objects. 2016-11-21 17:46:36 -05:00
ricmoo
d8a88c18d3 Added keyword arguments and proper result types for the Interface and Solidity parser. 2016-11-09 17:27:34 -05:00
ricmoo
db7cff9582 BN.js fixed nmask for us, so we use that now instead of our mask hack. 2016-11-09 16:39:33 -05:00
ricmoo
dc2583ddd8 Updating dist. 2016-10-05 00:12:15 +08:00
ricmoo
3be962f09d Made secret-storage more closely resemble geth. 2016-10-05 00:06:05 +08:00
ricmoo
736b08e016 Updated parseTransaction to format parameters more meaningfully. 2016-09-16 14:46:19 +08:00
ricmoo
d8013cae37 Added transaction parsing with address recovery. 2016-09-16 14:08:36 +08:00
ricmoo
b26b1b9c53 Moved getContractAddress to utils. 2016-08-23 22:06:26 -04:00
ricmoo
1c9c7b7a7d Refactored some internal libraries. 2016-08-23 20:24:18 -04:00
ricmoo
a9aaeefe24 Moved address functions to utils (things without need ofr signing do not need all the extra requires). 2016-08-23 20:12:12 -04:00
ricmoo
8257e3f885 Moved ether parsing/formatting into its own library. 2016-08-23 19:35:19 -04:00
ricmoo
965c987761 Updated docs for promise-based secret storage. 2016-08-15 23:27:10 -04:00
ricmoo
142e5276fe Moved encrypt, decrypt and brain wallet to use promises (which greatly improves nested progress callback, approx 4x performance). 2016-08-15 23:04:02 -04:00
ricmoo
351d1a2dad Added github repo to package.json. 2016-08-10 14:30:33 -04:00
ricmoo
72424ea2d2 Fixed typo in wallet demo. 2016-08-08 17:12:27 -04:00
ricmoo
1e703bfdb4 Version Bump (patch). 2016-08-08 14:34:55 -04:00
ricmoo
dee0a4bf3e Added raw private key and made homestead default network. 2016-08-08 00:18:01 -04:00
ricmoo
9c1d6051fb Fixed empty transaction field bug. 2016-08-07 15:18:42 -04:00
ricmoo
3c67736cbb Fixed randomish bug. 2016-08-07 15:17:53 -04:00
ricmoo
c697a5bc81 Version bump (patch). 2016-08-05 16:15:50 -04:00
ricmoo
0e9df5cb76 Fixed bug when passing in hex string to formatEther. 2016-08-05 16:14:09 -04:00
ricmoo
7a37dd6949 Added installing section and npm badge to docs. 2016-08-05 03:53:29 -04:00
ricmoo
cecefd416d Small changes to docs. 2016-08-05 03:40:31 -04:00
ricmoo
79f9047c21 Added wallet provider test. 2016-08-05 03:16:13 -04:00
ricmoo
f9f7469ccf Fixed variable masking issue in exaples in docs. 2016-08-05 03:06:36 -04:00
ricmoo
1e5933eb45 Fixed test cases that were being missed. 2016-08-05 03:04:17 -04:00
ricmoo
a4e1f531b7 Etherscan now supports estiateGas and getGasPrice (thanks Matt!). 2016-08-05 02:56:24 -04:00
ricmoo
0a38d14930 Updated dist. 2016-08-04 21:38:05 -04:00
ricmoo
4e7f2fa3d4 Allow wei to be passed in as a hex string. 2016-08-04 21:37:33 -04:00
ricmoo
4b99bb579c Fixed getContractAddress function 2016-08-04 21:37:15 -04:00
ricmoo
0b59519c19 Version bump (patch). 2016-08-04 20:29:55 -04:00
ricmoo
4d18119ccf Updated dist. 2016-08-04 20:29:20 -04:00
ricmoo
4af236d3ac Moved setImmediate shim to wallet. 2016-08-04 20:28:55 -04:00
ricmoo
eddb9c28a8 Moved setImmediate shim into wallet. 2016-08-04 20:27:21 -04:00
ricmoo
40a6fdd95e Removed web3 from splitter. 2016-08-04 20:12:50 -04:00
ricmoo
3f80001e4d On failed RPC, include original error and data. 2016-08-04 17:53:44 -04:00
ricmoo
89082164ce Version bump (patch). 2016-08-04 04:00:02 -04:00
ricmoo
9df7c2f37a Fixed etherscan production url. 2016-08-04 03:58:48 -04:00
ricmoo
840f510bf1 Added documentation note for why gas price is hard-coded. 2016-08-04 03:43:59 -04:00
ricmoo
1bd95b127b Added wallet example. 2016-08-04 03:21:49 -04:00
ricmoo
97154e49a6 Version bump (patch). 2016-08-04 03:20:37 -04:00
ricmoo
db757b5bbb Fixed wrong default gasLimit bug and clearing provider. 2016-08-04 03:20:01 -04:00
ricmoo
af62f54042 Added etherscan example to docs. 2016-08-03 19:41:46 -04:00
ricmoo
1b0dc18bdc Abstracted providers and added etherscan provider. 2016-08-03 19:36:44 -04:00
ricmoo
1db36b3132 Version bump (patch). 2016-08-03 02:27:56 -04:00
ricmoo
805879a213 Refactored provider to parse the response. 2016-08-03 02:26:36 -04:00
ricmoo
e1157f3a4c Updated documentation with Provider API and related methods. 2016-08-02 17:49:11 -04:00
ricmoo
46e0866410 Updated dist. 2016-08-02 17:46:38 -04:00
ricmoo
621c1ee74e Removed duplicate functions. 2016-08-02 17:46:20 -04:00
ricmoo
b3f9070b39 Added full provider API including estimate proxy. 2016-08-02 17:43:18 -04:00
ricmoo
14b15dcf5a Added provider standard methods. 2016-08-02 17:41:28 -04:00
ricmoo
e4c62d2939 Updated test info in the docs. 2016-08-02 01:12:04 -04:00
ricmoo
b50c0bd615 Added license file. 2016-08-02 01:11:43 -04:00
ricmoo
e55ee253ab Cleaned up solidity test cases. 2016-08-01 20:09:34 -04:00
ricmoo
f81fa6e4f5 Version bump (patch; still very beta). 2016-08-01 20:06:54 -04:00
ricmoo
4785c650f3 Upgraded some packages. 2016-08-01 19:39:54 -04:00
ricmoo
be99fa858e Removed debug logging. 2016-08-01 19:39:40 -04:00
ricmoo
196d4f6659 Fixed docs. at bit 2016-08-01 19:34:03 -04:00
ricmoo
1233233c6c Removed debugging logging. 2016-08-01 19:33:21 -04:00
ricmoo
742bcc753f Added brainwallet test case. 2016-08-01 19:32:57 -04:00
ricmoo
839c2a10aa Added summonBrainWallet function. 2016-08-01 19:25:18 -04:00
ricmoo
b298d41c22 Added dependencies for test cases. 2016-08-01 18:37:04 -04:00
ricmoo
c70a9f61cb Added some more info to contract tests that require RPC running. 2016-08-01 18:36:33 -04:00
ricmoo
6440d8e69d Allow running individual unit tests. 2016-08-01 18:34:12 -04:00
ricmoo
97dcd4d450 Fixed testcase generation for soidity parameter encoding/decoding. 2016-08-01 18:31:51 -04:00
ricmoo
b8d4514dd0 Fixed contract interface decoding numbers. 2016-08-01 18:26:12 -04:00
ricmoo
0ceee56de3 Fixed contract interface coder for numbers. 2016-08-01 17:57:00 -04:00
ricmoo
024cc1806f Re-ordered some parameters, fixed typo. 2016-08-01 14:14:53 -04:00
ricmoo
5e421d2636 Added ether string parsing and formatting. 2016-07-29 20:06:58 -04:00
ricmoo
f71ea72d54 Added https proxy for splitter demo. 2016-07-29 15:40:15 -04:00
ricmoo
d65379f6c4 Added splitter demo app. 2016-07-29 04:46:59 -04:00
ricmoo
06281e85c4 Fixed RPC method calls. 2016-07-29 04:45:46 -04:00
ricmoo
5dc2621a32 Fixed type in randomish. 2016-07-27 03:09:11 -04:00
ricmoo
c024f88ce1 Updated dist to inlcude randomish. 2016-07-27 03:03:14 -04:00
ricmoo
b5e6ac7db9 Varialbe name changes. 2016-07-27 03:02:30 -04:00
ricmoo
60732f8243 Added gitignore. 2016-07-27 03:01:52 -04:00
ricmoo
4a557349a3 Added testcase for encrypting a wallet. 2016-07-27 03:01:37 -04:00
ricmoo
5bf0c310d3 Added randomish library. 2016-07-27 02:53:40 -04:00
ricmoo
99ec103e97 Removed some debugging info. 2016-07-27 02:52:21 -04:00
ricmoo
829505d548 Split up test cases. 2016-07-26 17:58:17 -04:00
ricmoo
5c9ee7f2a5 Added beginning of RPC providers. 2016-07-26 17:57:11 -04:00
ricmoo
fa0d54966d Added use strict to all files. 2016-07-25 03:55:16 -04:00
ricmoo
401dd5162d Updated dist and version bump. 2016-07-23 03:29:31 -04:00
ricmoo
2dee42449a Updated testcases to include secret storage. 2016-07-23 03:28:19 -04:00
ricmoo
224e8aff07 Allow signing key to be passed into wallet and expose private key. 2016-07-23 03:27:56 -04:00
ricmoo
b5710cd710 Added Secret Storage JSON Wallet support. 2016-07-23 03:27:14 -04:00
ricmoo
8033a8f94c Fixed double-0x bug in Interface. 2016-07-22 14:49:26 -04:00
ricmoo
4bcef804b6 Updated testcases. 2016-07-22 14:49:03 -04:00
ricmoo
66a5b0ecdc Expose private key in a signing key. 2016-07-22 02:43:19 -04:00
ricmoo
2605e7de40 Moved to proper tet framework. 2016-07-22 02:43:03 -04:00
ricmoo
f50f171223 Reuse existing functions. 2016-07-21 17:07:40 -04:00
ricmoo
7626b541f5 Refactor. 2016-07-21 17:06:42 -04:00
ricmoo
24c7fc533a Refactored wallet and utilities. 2016-07-21 17:03:32 -04:00
ricmoo
21fdfe9581 Moved all Contract code to lib/contract.js. 2016-07-21 04:21:44 -04:00
ricmoo
ca8ee1c0e3 Updated documentation. 2016-07-21 04:20:31 -04:00
ricmoo
0980b864fa Added start of contract ABI library. 2016-07-20 18:06:03 -04:00
ricmoo
d0a822f02a Added isHexString and sha256 to utils. 2016-07-20 18:03:46 -04:00
ricmoo
4dbce955ee Added sha256 to utils. 2016-07-20 18:03:05 -04:00
ricmoo
6b18675274 Added basic documentation. 2016-07-16 00:34:40 -04:00
ricmoo
907e65a359 Moved ethereumjs libs to devDependencies since they are only used for testing. 2016-07-16 00:34:21 -04:00
ricmoo
723a4a910c Basic contract calls. 2016-07-16 00:33:04 -04:00
ricmoo
89a6fac231 Added contract support. 2016-07-15 23:47:35 -04:00
ricmoo
9a309ed7b7 Do not re-require elliptic for secp256k1. 2016-07-14 20:58:26 -04:00
ricmoo
d10aa35dab Initial code drop. 2016-07-14 13:43:15 -04:00
3498 changed files with 77796 additions and 43454 deletions

1
.github/FUNDING.yml vendored Normal file
View File

@@ -0,0 +1 @@
custom: [ 'https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2', 'https://www.buymeacoffee.com/ricmoo' ]

74
.github/ISSUE_TEMPLATE/beta-issue.yml vendored Normal file
View File

@@ -0,0 +1,74 @@
name: Beta (v6) Bug
description: Open an issue for a bug in the v6 beta
title: "Title Here"
labels: ["v6-beta"]
assignees:
- ricmoo
body:
- type: markdown
attributes:
value: |
This form is **only** for issues in the **v6 beta**, which you
can access using either the `v6-beta` tag in the repository or
install using `ethers@beta` with `npm`.
The v6 branch will be very lively, undergoing a lot of changes,
including backwards compatible changes between beta versions.
Before opening an issue, please make sure you have
**fully updated to the latest version** by removing the
`node_modules/` and `package-lock.json` and then running a
fresh `npm install`. Otherwise you may end up with incompatible
versions which may conflict with each other.
Thanks for trying out the v6 beta! Cheers!
- type: input
id: version
attributes:
label: Ethers Version
description: What version of ethers are you using? Before opening an issue, please make sure you are using the latest beta.
placeholder: x.y.z
validations:
required: true
- type: textarea
id: about-the-bug
attributes:
label: Describe the Problem
description: Please describe what you expected to happen vs what did happen?
placeholder: What happened?
validations:
required: true
- type: textarea
id: code-snippet
attributes:
label: Code Snippet
description: If possible, please include a **short and concise** code snippets that can reproduce this issue. Ideally code that can be pasted into the [Ethers Playground](https://playground.ethers.org).
placeholder: e.g. provider.getBlockNumber()
render: shell
- type: textarea
id: errors
attributes:
label: Errors
description: If there is an error, please include the **entire error** (redacting any sensitive information).
placeholder: "e.g. Error: invalid name (code='INVALID_ARGUMENT, ...)"
render: shell
- type: dropdown
id: environment
attributes:
label: Environment
description: What environment, platforms or frameworks are you using? Select all that apply.
multiple: true
options:
- node.js
- Browser (Chrome, Safari, etc)
- React Native/Expo/JavaScriptCore
- Hardhat
- Geth
- Parity
- Ganache
- Other (please specify)
- type: input
id: other-envrionment
attributes:
label: Environment (Other)
placeholder: anything else?

81
.github/ISSUE_TEMPLATE/bug-report.yml vendored Normal file
View File

@@ -0,0 +1,81 @@
name: Bug Report
description: Open an issue for a bug in Ethers
title: "Bug Report Title"
labels: ["investigate"]
assignees:
- ricmoo
body:
- type: markdown
attributes:
value: |
**READ THIS FIRST** and follow all instructions, please. `:)`
Thank you for taking the time to report an issue. This form is for reporting **bugs within ethers**.
If you are **new to ethers** or *uncertain* whether this is a bug in ethers, a bug in another framework or a bug in your own code, please [start a discussion](https://github.com/ethers-io/ethers.js/discussions) first.
- type: input
id: version
attributes:
label: Ethers Version
description: What version of ethers are you using? Before opening an issue, please make sure you are up to date.
placeholder: x.y.z
validations:
required: true
- type: input
id: search-terms
attributes:
label: Search Terms
description: Have you searched for answers [in the documentation](https://docs.ethers.io), through [the issues](https://github.com/ethers-io/ethers.js/issues) and [on the discusions](https://github.com/ethers-io/ethers.js/discussions)? Please include the search terms you have tried. This helps us add more keywords where needed.
placeholder: e.g. abi, network, utf8
- type: textarea
id: about-the-bug
attributes:
label: Describe the Problem
description: Please describe what you expected to happen vs what did happen?
placeholder: What happened?
validations:
required: true
- type: textarea
id: code-snippet
attributes:
label: Code Snippet
description: If possible, please include a **short and concise** code snippets that can reproduce this issue. Ideally code that can be pasted into the [Ethers Playground](https://playground.ethers.org).
placeholder: e.g. provider.getBlockNumber()
render: shell
- type: textarea
id: contract-abi
attributes:
label: Contract ABI
description: If this involves a contract, please include any **concise and relevant** ABI fragments.
placeholder: e.g. [ 'function balanceOf(address owner) view returns (uint)' ]
render: shell
- type: textarea
id: errors
attributes:
label: Errors
description: If there is an error, please include the **entire error** (redacting any sensitive information).
placeholder: "e.g. Error: invalid name (code='INVALID_ARGUMENT, ...)"
render: shell
- type: dropdown
id: environment
attributes:
label: Environment
description: What environment, platforms or frameworks are you using? Select all that apply.
multiple: true
options:
- Ethereum (mainnet, ropsten, rinkeby, goerli, etc.)
- Altcoin (Matic, BNB, etc.)
- node.js (v12 or newer)
- node.js (older than v12)
- Browser (Chrome, Safari, etc)
- React Native/Expo/JavaScriptCore
- Hardhat
- Geth
- Parity
- Ganache
- Other (please specify)
- type: input
id: other-envrionment
attributes:
label: Environment (Other)
placeholder: anything else?

1
.github/ISSUE_TEMPLATE/config.yml vendored Normal file
View File

@@ -0,0 +1 @@
blank_issues_enabled: false

View File

@@ -0,0 +1,23 @@
name: Documentation
description: Documentation update, change or suggestion
title: "Documentation Title"
labels: ["documentation"]
body:
- type: markdown
attributes:
value: |
Please include anything about the [documentation](https://docs.ethers.io) you would like to see improved.
- Missing information or details?
- Spelling or Grammar mistakes?
- Wrong Information?
- Dead or wrong links?
- Something needs code examples?
- General feedback or anything else?
- type: textarea
id: suggestion
attributes:
label: Suggestion
placeholder: e.g. please add an example for ropsten
validations:
required: true

View File

@@ -0,0 +1,26 @@
name: Feature Request
description: Suggest a new feature or addition to Ethers
title: "Feature Request Title"
labels: [ "enhancement" ]
body:
- type: markdown
attributes:
value: |
The best place to start a new feature request is by starting an [Idea discussion](https://github.com/ethers-io/ethers.js/discussions), to mull over the feature, discuss current options and think through the impact on the overall library.
Keep in mind that features increase the library size, and may require additional dependencies. Ethers strives to remain lean and the number of dependencies low, so many features may make more sense as ancillary packages.
- type: textarea
id: about-the-feature
attributes:
label: Describe the Feature
description: Please describe the feature, the problem it is solving, your solution and alternatives you've considered.
placeholder: e.g. I want Ethers to be more/less magical.
validations:
required: true
- type: textarea
id: code-example
attributes:
label: Code Example
description: Optionally, provide an example of how the feature would be used in code.
placeholder: e.g. provider.doMagic()
render: shell

27
.github/ISSUE_TEMPLATE/other.yml vendored Normal file
View File

@@ -0,0 +1,27 @@
name: Other
description: Open a general issue
title: Other Issue Title
body:
- type: markdown
attributes:
value: |
**READ THIS FIRST**
This form should almost **NEVER** be used. Consider closely why your issue does not fit into one of the [other categories](https://github.com/ethers-io/ethers.js/issues/new/choose).
You almost certainly wish to use [the discussions](https://github.com/ethers-io/ethers.js/discussions) instead, to ask a question or seek further guidance.
- type: textarea
id: about
attributes:
label: Describe your Issue
description: Please include as much relevant context as possible, be concise and clearly explain what you are looking for.
placeholder: e.g. What is the answer to life, the universe and everything?
validations:
required: true
- type: checkboxes
attributes:
label: This is an exception issue
description: This form is **only** for *exceptional issues*, which do not match any [other categoeries](https://github.com/ethers-io/ethers.js/issues/new/choose).
options:
- label: I understand this form is for exceptional issues and believe my issue qualifies.
required: true

View File

@@ -3,32 +3,49 @@ name: Node.js CI
on:
push:
branches:
- ethers-v5-beta
- master
jobs:
test-node:
runs-on: ubuntu-latest
# runs-on: ubuntu-latest
runs-on: macos-latest
strategy:
fail-fast: false
matrix:
node-version: [8.x, 10.x, 12.x, 13.x]
node-version: [ 12.x, 14.x, 16.x ]
steps:
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v1
with:
node-version: ${{ matrix.node-version }}
- uses: actions/checkout@v2
- run: npm ci
- run: npm run bootstrap
- run: npm run test-node
- name: Checkout repository
uses: actions/checkout@v2
# - name: Install node-hid requirements
# run: sudo apt-get install libusb-1.0-0 libusb-1.0-0-dev libudev-dev
- name: Install dependencies (and link per package)
run: npm ci
- name: Build CommonJS and ESM (from TypeScript)
run: npm run build-all
- name: Run tests
run: npm run test-node
test-browser:
runs-on: ubuntu-latest
# runs-on: ubuntu-latest
runs-on: macos-latest
strategy:
fail-fast: false
matrix:
module: [ 'esm', 'umd' ]
@@ -36,8 +53,91 @@ jobs:
- uses: actions/setup-node@v1
with:
node-version: 12.x
- uses: actions/checkout@v2
- run: npm ci
- run: npm run bootstrap
- run: npm run test-browser-${{ matrix.module }}
- name: Checkout repository
uses: actions/checkout@v2
# - name: Install node-hid requirements
# run: sudo apt-get install libusb-1.0-0 libusb-1.0-0-dev libudev-dev
- name: Install dependencies (and link per package)
run: npm ci
- name: Build CommonJS and ESM (from TypeScript)
run: npm run build-all
- name: Run tests
run: npm run test-browser-${{ matrix.module }}
test-react-native:
runs-on: macos-latest
# Temporary for testing CI
continue-on-error: true
strategy:
fail-fast: false
steps:
- name: Use Node.js 12.x
uses: actions/setup-node@v1
with:
node-version: 12.x
- name: Checkout repository
uses: actions/checkout@v2
- name: Install dependencies (and link per package)
run: npm ci
- name: Build CommonJS and ESM (from TypeScript)
run: npm run build-all
- name: Run tests
run: npm run test-react
coverage:
name: Coverage
# runs-on: ubuntu-latest
runs-on: macos-latest
continue-on-error: true
steps:
- uses: actions/setup-node@v1
with:
node-version: 12.x
- name: Checkout repository
uses: actions/checkout@v2
# - name: Install node-hid requirements
# run: sudo apt-get install libusb-1.0-0 libusb-1.0-0-dev libudev-dev
- name: Install dependencies (and link per package)
run: npm ci
- name: Build CommonJS and ESM (from TypeScript)
run: npm run build-all
- name: Run tests
run: npm run test-coverage
- name: Upload coverage summary
uses: actions/upload-artifact@v2
with:
name: coverage-summary
path: ./output/summary.txt
- name: Tar files
run: tar -cvf ./output/coverage.tar ./output/lcov-report/
- name: Upload coverage
uses: actions/upload-artifact@v2
with:
name: coverage-complete
path: ./output/coverage.tar

9
.gitignore vendored
View File

@@ -1,4 +1,7 @@
node_modules/
packages/*/node_modules
packages/*/lib._esm
.package_node_modules/
obsolete/
.DS_Store
.tmp/
@@ -18,3 +21,9 @@ lerna-debug.log
packages/*/tsconfig.tsbuildinfo
packages/testcases/input/nameprep/**
.nyc_output/**
output/**
misc/testing/**

File diff suppressed because it is too large Load Diff

523
CHANGELOG.v5-beta.md Normal file
View File

@@ -0,0 +1,523 @@
Changelog
=========
This change log is managed by `scripts/cmds/update-versions` but may be manually updated.
ethers/v5.0.0-beta.192 (2020-06-12 04:51)
-----------------------------------------
- Support nonpayable Solidity modifier in ABI. ([adc8d3d](https://github.com/ethers-io/ethers.js/commit/adc8d3d9aec2f5ee8e207f8bc77d99052e473d16))
- More debug information in timeout and fetch errors. ([#678](https://github.com/ethers-io/ethers.js/issues/678); [693094e](https://github.com/ethers-io/ethers.js/commit/693094e97ce4f0dc0cd49b9cf6b1557bd7dc517d))
- Use URL parse instead of constructor for react compatibility. ([#874](https://github.com/ethers-io/ethers.js/issues/874); [5e7d28b](https://github.com/ethers-io/ethers.js/commit/5e7d28b19b18aa1bbb4b851f74f6d7865725be02))
ethers/v5.0.0-beta.191 (2020-06-03 03:41)
-----------------------------------------
- Allow undefined properties in transaction object and fix stray this. ([#860](https://github.com/ethers-io/ethers.js/issues/860); [98bb589](https://github.com/ethers-io/ethers.js/commit/98bb58964bec7dff0ccf481d474354ec1ca6f376), [d2406c4](https://github.com/ethers-io/ethers.js/commit/d2406c42a18c123205918eb46bf24de0ff97ee23))
- Allow JsonRpcSigner to override from if it matches Signer. ([#862](https://github.com/ethers-io/ethers.js/issues/862); [1a89c59](https://github.com/ethers-io/ethers.js/commit/1a89c591c26a7fcc2031d0df90137d8a096c5c01))
- Added initial support for spontaneous network changes. ([#495](https://github.com/ethers-io/ethers.js/issues/495), [#861](https://github.com/ethers-io/ethers.js/issues/861); [2bc7bb6](https://github.com/ethers-io/ethers.js/commit/2bc7bb6e61219a40cfe2acd95c115c2195c21223), [d2ca4fb](https://github.com/ethers-io/ethers.js/commit/d2ca4fb443b2653063ca5aa349b52ecd0ff79e2f))
ethers/v5.0.0-beta.190 (2020-06-01 05:02)
-----------------------------------------
- Re-enable tests removed to fix slow CI. ([cd7a0b3](https://github.com/ethers-io/ethers.js/commit/cd7a0b36cd77df5d5951a97cdb6b6be1c9387f51))
- Major Contract refactor for overrides. ([#819](https://github.com/ethers-io/ethers.js/issues/819), [#845](https://github.com/ethers-io/ethers.js/issues/845), [#847](https://github.com/ethers-io/ethers.js/issues/847), [#860](https://github.com/ethers-io/ethers.js/issues/860); [42dee67](https://github.com/ethers-io/ethers.js/commit/42dee67187adb04d0b88f420b24cb3e73301d609))
- Remove legacy Circle CI tasks. ([c445232](https://github.com/ethers-io/ethers.js/commit/c445232980007d3474bc036ff59fb37638f93820))
- Fixing GitHub actions. ([#853](https://github.com/ethers-io/ethers.js/issues/853); [6b8f0f3](https://github.com/ethers-io/ethers.js/commit/6b8f0f3cb38295cd5d693f9b71f629b591206f1e))
ethers/v5.0.0-beta.189 (2020-05-29 21:25)
-----------------------------------------
- Simplify typing for properties module. ([41e66ab](https://github.com/ethers-io/ethers.js/commit/41e66ab834e9835807481658a7956207edfef3d7))
- Refactor Contract away from monolithic runMethod. ([e5a1b4d](https://github.com/ethers-io/ethers.js/commit/e5a1b4d5cbbaa0a8ce64c72e13d0d12fa2b856e3))
- Correctly set last emitted block for WebSocketProvider. ([#856](https://github.com/ethers-io/ethers.js/issues/856); [1b0ad5a](https://github.com/ethers-io/ethers.js/commit/1b0ad5aa69327f80c7814069142965914673dc06))
- Fixed delayed network detection attempting to overwrite read-only value. ([#854](https://github.com/ethers-io/ethers.js/issues/854); [8efd8d2](https://github.com/ethers-io/ethers.js/commit/8efd8d203158ebdef040ec759c3b423312a86e7c))
- Better WebSocket compatibilities with Parity. ([#849](https://github.com/ethers-io/ethers.js/issues/849); [180a1af](https://github.com/ethers-io/ethers.js/commit/180a1aff3adc5b4af3a1349b52666ca5942c92a2))
ethers/v5.0.0-beta.188 (2020-05-21 00:02)
-----------------------------------------
- Make filter blockHash property name match EIP-234. ([b03c4ed](https://github.com/ethers-io/ethers.js/commit/b03c4edd31a1929b411d0559d17eee7e3d6b11c8), [ed29fac](https://github.com/ethers-io/ethers.js/commit/ed29fac376c1a0aa210bf75979bb2ab62d0cf46b))
- Fixed FallbackProvider sync-stalling for backends. ([#841](https://github.com/ethers-io/ethers.js/issues/841); [f963589](https://github.com/ethers-io/ethers.js/commit/f96358940043123aa7a8fe97a1af7af293ce9740))
- Add correct tag to release on publish. ([#828](https://github.com/ethers-io/ethers.js/issues/828); [8516076](https://github.com/ethers-io/ethers.js/commit/85160766cdcd031f226382901ebadee9d7f40200))
ethers/v5.0.0-beta.187 (2020-05-12 23:29)
-----------------------------------------
- Add sub-error to gas estimate error for Ganache users. ([#829](https://github.com/ethers-io/ethers.js/issues/829); [647fbd8](https://github.com/ethers-io/ethers.js/commit/647fbd8cbfa0f94f72db6faadd528e61c49b1dd6))
- Moved ABI check for unique names to coding time and only if ambiguous. ([#816](https://github.com/ethers-io/ethers.js/issues/816); [fa87417](https://github.com/ethers-io/ethers.js/commit/fa87417e9416d99a37d9a2668a1e54feb7e342fc))
- Added missing Interface exports to umbrella utils. ([82a9326](https://github.com/ethers-io/ethers.js/commit/82a93263fae330ae39a7212e74d973fa9f820f64))
- Fixed FallbackProvider ESM super-this out-of-order issue. ([#822](https://github.com/ethers-io/ethers.js/issues/822); [fde102b](https://github.com/ethers-io/ethers.js/commit/fde102b7eda304403dcc677cd6d3b48339cd3a81))
- Fixed node hanging on unnecessary timeout when fetchJson fails. ([fdf2253](https://github.com/ethers-io/ethers.js/commit/fdf2253218cf379043acc32dea8c95c284a82cec))
ethers/v5.0.0-beta.186 (2020-05-08 15:27)
-----------------------------------------
- Fix JsonRpcProvider out-of-order super call. ([#822](https://github.com/ethers-io/ethers.js/issues/822); [963197d](https://github.com/ethers-io/ethers.js/commit/963197d70c96e5970b431173c2cc782cb496674c))
ethers/v5.0.0-beta.185 (2020-05-04 22:54)
-----------------------------------------
- More robust FallbackProvider on clean exits. ([8eeda23](https://github.com/ethers-io/ethers.js/commit/8eeda23e989fcb0126bd20b17c67f62466d19259))
- Safer test suite reporter timer. ([657a039](https://github.com/ethers-io/ethers.js/commit/657a0394f56b51a13c691477c2b0dcf74678fd7c))
- Added goerli to AlchemyProvider tests. ([ab7c781](https://github.com/ethers-io/ethers.js/commit/ab7c78118ab80990a3e3368749599a1cf6e9d4ae))
- Added more robust poll event to Provider. ([dc48bfb](https://github.com/ethers-io/ethers.js/commit/dc48bfb7adb9334848c93173ba2c634f22a9a72f))
- Added goerli to AlchemyProvider. ([86670eb](https://github.com/ethers-io/ethers.js/commit/86670eb80e96fc4ba4e3664c9389f8130bbfea73))
- Removed Cloudflare from test suite; it is down again. ([17dc022](https://github.com/ethers-io/ethers.js/commit/17dc022603afdfe4147638ab4b2704bcef09533f))
- Prevent forceOutput in test reporter from crashing. ([cafd344](https://github.com/ethers-io/ethers.js/commit/cafd34460b194d78092021f1d7e0307130340b68))
- Stall FallbackProvider backends from requests if not in-sync. ([fa6904f](https://github.com/ethers-io/ethers.js/commit/fa6904fef35e7ab888221f3a0613bfe7e6df3594))
- Allow providers to detect their network after instantiation. ([#814](https://github.com/ethers-io/ethers.js/issues/814); [99ae946](https://github.com/ethers-io/ethers.js/commit/99ae946476a317a9d89e5d8f57cf37f8680bfa2b))
- Better messaging on low-level network errors. ([#814](https://github.com/ethers-io/ethers.js/issues/814); [0e3a66c](https://github.com/ethers-io/ethers.js/commit/0e3a66c82959a08f3f4e4ffbca3ae3792ff2548f))
- Manage FallbackProvider stalling without unref. ([#815](https://github.com/ethers-io/ethers.js/issues/815); [7b1a7c7](https://github.com/ethers-io/ethers.js/commit/7b1a7c7f31a3631e12c2a341b562983360e670e9))
- Only error on duplicate signatures in Contract ABI. ([#499](https://github.com/ethers-io/ethers.js/issues/499); [098d7ef](https://github.com/ethers-io/ethers.js/commit/098d7efb21bd648c2660342297d2419904a10925))
- Added getWebSocketProvider static method to InfuraProvider. ([a6c1174](https://github.com/ethers-io/ethers.js/commit/a6c1174dffe6dca1a3a64d1d472cec6e12372117))
- Fix WebSocketProvider responses when message result is null. ([#813](https://github.com/ethers-io/ethers.js/issues/813); [472e5b0](https://github.com/ethers-io/ethers.js/commit/472e5b07eab180baa12185c8f00e5079ce4c671f))
- Allow modifiers on Human-Readable ABI for tuples and arrays. ([83fba3d](https://github.com/ethers-io/ethers.js/commit/83fba3de25b524cc48975b1952f4319d63874205))
- Added initial renew support to ENS CLI. ([54dfb75](https://github.com/ethers-io/ethers.js/commit/54dfb757c4c88e4bcada1890c4016fadfb25581a))
- Allow contract filters to include OR-ed values. ([#437](https://github.com/ethers-io/ethers.js/issues/437); [28800d7](https://github.com/ethers-io/ethers.js/commit/28800d7681f3bab08f6d30a22f0813e04feee18a))
ethers/v5.0.0-beta.184 (2020-04-28 04:58)
-----------------------------------------
- Removed old EIP-1193 experimental provider; it can now be supported by Web3Provider as EIP-1193 is now backwards compatible. ([84c68ac](https://github.com/ethers-io/ethers.js/commit/84c68ac5c17b10897ade966d6c8fac1f1f66a4af))
- Fixed getLogs filter deserialization. ([#805](https://github.com/ethers-io/ethers.js/issues/805); [393c0c7](https://github.com/ethers-io/ethers.js/commit/393c0c74a91175adca2e25026dcdb9e6445afd8f))
- Added EIP-1193 support to Web3Provider. ([56af441](https://github.com/ethers-io/ethers.js/commit/56af4413b1dd1787db68985e0b612b63d86fdf7c))
- Minor typing-detected fixes. ([d1f3a42](https://github.com/ethers-io/ethers.js/commit/d1f3a42c119d5588eab667ec7bb6e71042cfb656))
- Added initial support for recoverable coding erros. ([#800](https://github.com/ethers-io/ethers.js/issues/800); [bda6623](https://github.com/ethers-io/ethers.js/commit/bda66230916e58e25a522e8430ce4de25091eb6b))
- More draconian Typing. ([14e6811](https://github.com/ethers-io/ethers.js/commit/14e6811bf7d7c38a3b5714dededcc883c185d814))
- Omit HID libraries for hardware-wallets package on unsupported environments. ([#798](https://github.com/ethers-io/ethers.js/issues/798); [2e24920](https://github.com/ethers-io/ethers.js/commit/2e24920d028d42908d0764ad4ca0b56b55f852d1), [5aefb43](https://github.com/ethers-io/ethers.js/commit/5aefb4303d2fdda62e7e5ddb644919f613d6016a))
- Make default constructor non-payable. ([#684](https://github.com/ethers-io/ethers.js/issues/684); [017ea0d](https://github.com/ethers-io/ethers.js/commit/017ea0d6bd22833e9d399ae6b818443786f17884))
ethers/v5.0.0-beta.183 (2020-04-23 23:28)
-----------------------------------------
- Fixed inconsistent log format in WebSocketProvider. ([#795](https://github.com/ethers-io/ethers.js/issues/795); [8e7751f](https://github.com/ethers-io/ethers.js/commit/8e7751f7dfb41e58f81c7918cf36c152c3209ae2))
- Added WebSocketProvider support for ENS names in filters. ([6707754](https://github.com/ethers-io/ethers.js/commit/6707754580490c5a801d6205af0841794d20b3c9))
- Fixed provider filtering by ENS name. ([aeeb75f](https://github.com/ethers-io/ethers.js/commit/aeeb75f74c3be11b9b3b2925fd73349070542e54))
- Fixed ContractFactory.deploy ignoring overrides. ([#796](https://github.com/ethers-io/ethers.js/issues/796); [8bb2a0f](https://github.com/ethers-io/ethers.js/commit/8bb2a0fd08f6f128a80444e3fd90c29e4cd7edfb))
- Fix median calculation for large block number deltas across FallbackProvider backends. ([fca5ccb](https://github.com/ethers-io/ethers.js/commit/fca5ccbc2052569e700a96dbb1de1c9cef7c966f))
- Work-around for Cloudflare not offering eth_blockNumber. ([8cf4b3c](https://github.com/ethers-io/ethers.js/commit/8cf4b3cf4598f4f3643d5ebe9c366466d398cb83))
- Added string spell-checking to library and fixed discovered typos. ([71d03c6](https://github.com/ethers-io/ethers.js/commit/71d03c6e3cab1aacb3e4e74d3966fbaa7db2ee06))
- Fixed getUrl for node 8. ([560adea](https://github.com/ethers-io/ethers.js/commit/560adeabb06a2ab483bcad162f02ccef41ebc245))
- Dependency security updates. ([da3b0bf](https://github.com/ethers-io/ethers.js/commit/da3b0bf0786fe8a95c68485d130ca59c597ffe4d))
- Fixes for dist builds without injected XMLHttpRequest. ([#789](https://github.com/ethers-io/ethers.js/issues/789), [#506](https://github.com/ethers-io/ethers.js/issues/506); [9ae6b70](https://github.com/ethers-io/ethers.js/commit/9ae6b70efb9f3d3251820403597085cfa30ace05))
ethers/v5.0.0-beta.182 (2020-04-16 21:53)
-----------------------------------------
- Added support for Contract event parsing error recovery. ([cc72f76](https://github.com/ethers-io/ethers.js/commit/cc72f76695572d235d7f5a5ad4dc1838a5fe884a))
- Fix provider log filters with zero topics. ([#785](https://github.com/ethers-io/ethers.js/issues/785); [4ef0e4f](https://github.com/ethers-io/ethers.js/commit/4ef0e4f7653226bf8cca86e065ad614e7288af96))
ethers/v5.0.0-beta.181 (2020-04-15 18:23)
-----------------------------------------
- Temporarily remove CloudflareProvider tests; it is down and breaking the tests. ([797abb7](https://github.com/ethers-io/ethers.js/commit/797abb726711499d96bf1c12c61e3bb1a7b4925d))
- Better error reporting for Fragments. ([7dcefcb](https://github.com/ethers-io/ethers.js/commit/7dcefcbf71ef337103639bbe3f4ad2625565651a))
- Fixed Contract filter unsubscribing. ([2eb3823](https://github.com/ethers-io/ethers.js/commit/2eb3823de4ba111cc0c746a0715fe6dd3d1b16da), [39c78f3](https://github.com/ethers-io/ethers.js/commit/39c78f37ceff9b8ec08329903dcba7bd53bd8661))
- Fixed WebSocketProvider filter events. ([#784](https://github.com/ethers-io/ethers.js/issues/784); [69f7077](https://github.com/ethers-io/ethers.js/commit/69f707762ed5939c5f52bf6dce5c5513aaf6fa1d))
- Added bitwise operations to BigNumber. ([#781](https://github.com/ethers-io/ethers.js/issues/781); [7498c18](https://github.com/ethers-io/ethers.js/commit/7498c18235c7566b2f652cddba991f55e0943da8), [284771e](https://github.com/ethers-io/ethers.js/commit/284771ea39b6f4ee9cdf75ce5feea9e6aa9a65c5))
ethers/v5.0.0-beta.180 (2020-04-03 22:10)
-----------------------------------------
- Correctly return the Provider in NonceManager. ([6caf7c2](https://github.com/ethers-io/ethers.js/commit/6caf7c292cd5f03741cd6b30053c3325c4f30a81))
- Fail earlier when resolving an ENS name that is not a string. ([2882546](https://github.com/ethers-io/ethers.js/commit/28825463517f8821392464ec2283ee59c431d928))
- Fixed mutabilityState calculation for function fragments. ([#762](https://github.com/ethers-io/ethers.js/issues/762); [6526de0](https://github.com/ethers-io/ethers.js/commit/6526de016fda5403474dad61ee59acc62ee25ebc), [d7c8b35](https://github.com/ethers-io/ethers.js/commit/d7c8b355a049b36068b0525a357c6278639a8d58))
- Force Log properties to be non-optional. ([#415](https://github.com/ethers-io/ethers.js/issues/415); [da412f6](https://github.com/ethers-io/ethers.js/commit/da412f660723d1c411484e74970ce4eb166374c2), [8ad26f0](https://github.com/ethers-io/ethers.js/commit/8ad26f0ff42614a6c40e735cb6fffd36874da1a0))
- Fixed Signer call not forwarding blockTag. ([#768](https://github.com/ethers-io/ethers.js/issues/768); [053a2d7](https://github.com/ethers-io/ethers.js/commit/053a2d7fcdb4ca4c9bfd0bee0f42e0187d3db477))
ethers/v5.0.0-beta.179 (2020-03-31 23:40)
-----------------------------------------
- Fixed ENS CLI lookup for Website. ([0f144c6](https://github.com/ethers-io/ethers.js/commit/0f144c6cc03082026080782356b940af3389b34e))
- Fixed getEtherPrice for EtherscanProvider. ([#776](https://github.com/ethers-io/ethers.js/issues/776); [6c71b51](https://github.com/ethers-io/ethers.js/commit/6c71b515126d8ef3cea5a1aec814c4cab56cc1a5))
- Fixed ENS CLI tool set-websites and added set-name. ([70cffb6](https://github.com/ethers-io/ethers.js/commit/70cffb6a5166a79a54e02b03b6a7ec0085407e07))
ethers/v5.0.0-beta.178 (2020-03-30 22:14)
-----------------------------------------
- Fixed Event args keyword access. ([2692e78](https://github.com/ethers-io/ethers.js/commit/2692e783b40ce16207fa1a8e8513ebb5455fd2d0), [092ce9b](https://github.com/ethers-io/ethers.js/commit/092ce9bcc2abf92c40550c4a990a8e2c889cc250))
- Updating TypeScript library and fixing some audit issues. ([bd32ee0](https://github.com/ethers-io/ethers.js/commit/bd32ee0af5b25a435e5896773d8bfd482d3adcaf))
ethers/v5.0.0-beta.177 (2020-03-21 12:46)
-----------------------------------------
- Abstracted JSON-RPC parameter generation for others to use. ([030f65e](https://github.com/ethers-io/ethers.js/commit/030f65e66ce059d69d8d77973d5c3190745eaac2))
- Updated RLP package to use Logger instead of bare errors. ([390497f](https://github.com/ethers-io/ethers.js/commit/390497f38964a052837f6c0e7c96efe74c668517))
- Fixed log level filtering for Logger. ([#379](https://github.com/ethers-io/ethers.js/issues/379); [72c8992](https://github.com/ethers-io/ethers.js/commit/72c89922a4e1b77295414c8e0717a7373f2397b8))
- Throw errors when trying to RLP encode integers. ([9ea16e5](https://github.com/ethers-io/ethers.js/commit/9ea16e5172928962792ba4c0273e23db373409e0))
- Added delays to provider tests to prevent throttling causing failed tests. ([3e44aac](https://github.com/ethers-io/ethers.js/commit/3e44aac8f199ec09babb20c4af2ee668e0ab05a1))
ethers/v5.0.0-beta.176 (2020-03-12 19:10)
-----------------------------------------
- Checking in initial Eip1193Bridge (experimental). ([2c78f0b](https://github.com/ethers-io/ethers.js/commit/2c78f0bf265a0f7c9f4cfc1bc79ecd4629b59c49))
- Added initial WebSocketProvider. ([#141](https://github.com/ethers-io/ethers.js/issues/141); [117a5dd](https://github.com/ethers-io/ethers.js/commit/117a5dd7ffa783c4335c0b87621437447cd499d0))
- Renamed properties based on community recommendations; estimate to estimateGas and addressPromise to resovledAddress. ([fe3b3fa](https://github.com/ethers-io/ethers.js/commit/fe3b3fa1aded67827fec1131931d95d8153d8f32))
- Better error reporting and fixed look-ahead for data labels. ([e52312e](https://github.com/ethers-io/ethers.js/commit/e52312e783b8d0fdd7e9992716cbe2e179751b38))
ethers/v5.0.0-beta.175 (2020-02-27 19:53)
-----------------------------------------
- Fix address-less filter listening in Provider. ([#741](https://github.com/ethers-io/ethers.js/issues/741); [64dccb2](https://github.com/ethers-io/ethers.js/commit/64dccb275c68ebb40328350d4ab5be0f29b8a02e))
- Added sync version of wallet decryption. ([0ad94cd](https://github.com/ethers-io/ethers.js/commit/0ad94cdf8137259bedb38c0dc949b61570bcdac0), [6809c37](https://github.com/ethers-io/ethers.js/commit/6809c370c027aea148466c00d3ce09c6d0ee6ddc))
ethers/v5.0.0-beta.175 (2020-02-27 19:38)
-----------------------------------------
- Fix address-less filter listening in Provider. ([#741](https://github.com/ethers-io/ethers.js/issues/741); [64dccb2](https://github.com/ethers-io/ethers.js/commit/64dccb275c68ebb40328350d4ab5be0f29b8a02e))
- Added sync version of wallet decryption. ([0ad94cd](https://github.com/ethers-io/ethers.js/commit/0ad94cdf8137259bedb38c0dc949b61570bcdac0))
ethers/v5.0.0-beta.174 (2020-02-25 14:57)
-----------------------------------------
- Reduced default Provider quorum for testnets. ([1cfab31](https://github.com/ethers-io/ethers.js/commit/1cfab3173c3d0519beffc054efe73f70b7d28501))
- Added JSON-RPC debugging on error responses. ([ad27600](https://github.com/ethers-io/ethers.js/commit/ad27600c699827858e7343adff2d4fa622248e42))
- Fixed setLogLevel to affect global logging. ([ac51a88](https://github.com/ethers-io/ethers.js/commit/ac51a88c2913d7055e050c91d7d96bb42abf6656))
- Renamed interface getTopic to getEventTopic. ([f61f34b](https://github.com/ethers-io/ethers.js/commit/f61f34bfb295bafee3b7ee426efa696aaa9bbafe))
- Fix log parsing when no matching topic hash is found. ([#733](https://github.com/ethers-io/ethers.js/issues/733); [a5d2ec5](https://github.com/ethers-io/ethers.js/commit/a5d2ec534f75b21eebe69a789a3c43c33014a825), [4b8e198](https://github.com/ethers-io/ethers.js/commit/4b8e198bf209fcf0aea55018d8940355ea4345de), [89ac9f4](https://github.com/ethers-io/ethers.js/commit/89ac9f4f298ac340c4429e8ebdacd29962eba7f4))
ethers/v5.0.0-beta.173 (2020-02-12 17:09)
-----------------------------------------
- Added experimental EipWrappedProvider. ([944600d](https://github.com/ethers-io/ethers.js/commit/944600d779564c500ab98d3265286a0717642614))
- Updated signature for JsonRpcProvider.send to match EIP-1193. ([b962b59](https://github.com/ethers-io/ethers.js/commit/b962b59ab72e67bc4566a361964e42cf1b791025))
- Added binary literal support to ASM grammar. ([375bd15](https://github.com/ethers-io/ethers.js/commit/375bd15594a3179432e8452d819d91ea72b4bdd8))
- Added explicit pop placeholders to ASM dialect. ([a6b696d](https://github.com/ethers-io/ethers.js/commit/a6b696d8bd03c4027b52fe23745f066d158f1420))
- Added position independent code option for asm. ([89615c5](https://github.com/ethers-io/ethers.js/commit/89615c59d385a58fa79b6bbd8eae53c30e45fe96))
- Added ASM semantic checking and the Pop placeholder. ([a33bf0e](https://github.com/ethers-io/ethers.js/commit/a33bf0e37f4f969cc03b85ebf0dbadcf3e9b068a))
- Better type safety for defineReadOnly. ([e7adc84](https://github.com/ethers-io/ethers.js/commit/e7adc84a972968f39a983efb6f21b6ceaacd6cc5))
- Fixed CLI sandbox quiting after prompt entry. ([ff9bc2a](https://github.com/ethers-io/ethers.js/commit/ff9bc2a282e617125bbca76702dec85149661390))
ethers/v5.0.0-beta.172 (2020-02-04 00:59)
-----------------------------------------
- Synced GitHub issue cache. ([13dbf1f](https://github.com/ethers-io/ethers.js/commit/13dbf1f965eab344d2a304f7612d19ea96391261))
- Better typing for Timers. ([5622f70](https://github.com/ethers-io/ethers.js/commit/5622f703d962993442623ef1450a595825c4efa8))
- Safer transaction serialization, matching signature.v with chainId. ([#708](https://github.com/ethers-io/ethers.js/issues/708); [edb7c5d](https://github.com/ethers-io/ethers.js/commit/edb7c5da91ce271688561364d867998b0f0675e3))
- Fixed Opcode typo and added check to prevent future typos. ([15bb840](https://github.com/ethers-io/ethers.js/commit/15bb8409077f96b22e8bd60c426cddd015454e6b))
- Renamed AST nodes for teh assembler. ([f02c7db](https://github.com/ethers-io/ethers.js/commit/f02c7db4109d1785b4528757aa50f24948e896ae))
- Added timeout to waitForTransaction. ([#477](https://github.com/ethers-io/ethers.js/issues/477); [bacc440](https://github.com/ethers-io/ethers.js/commit/bacc4403979fa423890e269e7a5c7d11c6891a9f))
- Added CLI for asm package. ([aafa42a](https://github.com/ethers-io/ethers.js/commit/aafa42a32b2a5c7481a409ad048dfc06112c6599))
- Prevent Signer.checkTransaction from creating conflicting from properties. ([1decb13](https://github.com/ethers-io/ethers.js/commit/1decb1379902b60a15925b9b1de39633393db825))
- Include asm in generated TypeScript dependencies. ([ba29618](https://github.com/ethers-io/ethers.js/commit/ba296188960fb345dfdab12f2bb3ed3dc5eab51a))
- Clean up some asm checks and dead code. ([fa317eb](https://github.com/ethers-io/ethers.js/commit/fa317ebc032f8a5f9fb2dd10e23496252ae744e1))
- More contained Opcode API. ([da8153c](https://github.com/ethers-io/ethers.js/commit/da8153c87753b79e5e4cd34d484b8e0e717426d9))
- Added initial codedrop for the asm package. ([0296594](https://github.com/ethers-io/ethers.js/commit/0296594aba8d1e90e9ef7a18d2324f6cac815953))
ethers/v5.0.0-beta.171 (2020-02-01 05:05)
-----------------------------------------
- Added CLI for asm package. ([aafa42a](https://github.com/ethers-io/ethers.js/commit/aafa42a32b2a5c7481a409ad048dfc06112c6599))
- Added more flatworm documentation. ([1c85fe9](https://github.com/ethers-io/ethers.js/commit/1c85fe95b2b536828e83087676becba85c9a90bb))
- Prevent Signer.checkTransaction from creating conflicting from properties. ([1decb13](https://github.com/ethers-io/ethers.js/commit/1decb1379902b60a15925b9b1de39633393db825))
- Include asm in generated TypeScript dependencies. ([ba29618](https://github.com/ethers-io/ethers.js/commit/ba296188960fb345dfdab12f2bb3ed3dc5eab51a))
- Clean up some asm checks and dead code. ([fa317eb](https://github.com/ethers-io/ethers.js/commit/fa317ebc032f8a5f9fb2dd10e23496252ae744e1))
- More contained Opcode API. ([da8153c](https://github.com/ethers-io/ethers.js/commit/da8153c87753b79e5e4cd34d484b8e0e717426d9))
- Added initial codedrop for the asm package. ([0296594](https://github.com/ethers-io/ethers.js/commit/0296594aba8d1e90e9ef7a18d2324f6cac815953))
ethers/v5.0.0-beta.171 (2020-01-29 21:41)
-----------------------------------------
- Better solc support in CLI; it will search the local pacakge for an existing solc version. ([7428776](https://github.com/ethers-io/ethers.js/commit/7428776f75222d5c07282bc29c3dd8ed99f5d2cc))
- Update ENS registry address and lower default quorum for testnets. ([edb49da](https://github.com/ethers-io/ethers.js/commit/edb49da15518f25b3d60813ebb84f54171e308f3))
- Exposed isBytes and isBytesLike in ethers.utils. ([99329b0](https://github.com/ethers-io/ethers.js/commit/99329b013ce7f3af301d40c41f7eb35bff288910))
ethers/v5.0.0-beta.170 (2020-01-21 20:37)
-----------------------------------------
- Better, easier and more provider testing. ([e0d1d38](https://github.com/ethers-io/ethers.js/commit/e0d1d3866d2559f39627254873a0a1d4c0fcaf3d))
- Fixed out-of-bounds difficulty in getBlock, which can affect PoA networks. ([#711](https://github.com/ethers-io/ethers.js/issues/711); [251882c](https://github.com/ethers-io/ethers.js/commit/251882ced4379931ec82ba28a4db10bc7dbf3580))
ethers/v5.0.0-beta.169 (2020-01-20 19:42)
-----------------------------------------
- Fixed imports after refactor. ([adf5622](https://github.com/ethers-io/ethers.js/commit/adf56229c6cc83003d319ea9a004677e2555d478))
- Refactor some enum names and add UTF-8 error support to the umbrella package. ([931da2f](https://github.com/ethers-io/ethers.js/commit/931da2f77446fc9266cf07f0d7d78d4376625005))
- Allow arbitrary apiKey for UrlJsonRpcProvider. ([5878b54](https://github.com/ethers-io/ethers.js/commit/5878b54d6eded1329a6dc3b4023f876a87f72b6e))
- Added more general error handling (e.g. error, ignore, replace) for calling toUtf8String. ([a055edb](https://github.com/ethers-io/ethers.js/commit/a055edb5855b96fdf179403458c1694b96fd906c))
ethers/v5.0.0-beta.168 (2020-01-18 21:46)
-----------------------------------------
- Much more resiliant FallbackProvider which can ignore properties that are only approximate and supports per-provider priorities. ([#635](https://github.com/ethers-io/ethers.js/issues/635), [#588](https://github.com/ethers-io/ethers.js/issues/588); [f4bcf24](https://github.com/ethers-io/ethers.js/commit/f4bcf24a257a17ec9beb98f3d0b3682de543534c))
- Fixed some typing for receipts and logs. ([#497](https://github.com/ethers-io/ethers.js/issues/497); [ea102ef](https://github.com/ethers-io/ethers.js/commit/ea102ef7c4fa5df7b9389fbc8a2947bbbd4c471e))
- Abstracting mnemonic phrases. ([#685](https://github.com/ethers-io/ethers.js/issues/685); [92a383f](https://github.com/ethers-io/ethers.js/commit/92a383ff0dad4587e44953efca3c6ab795a1b1bd))
- Sync GitHub issues. ([75e1a37](https://github.com/ethers-io/ethers.js/commit/75e1a37bb5935d5d538ffcfce5b0073e1334d457))
- Fixed 304 status for fetchJson. ([c66d81e](https://github.com/ethers-io/ethers.js/commit/c66d81e96f7c9b0808f181085ffe1c92f6219d46))
ethers/v5.0.0-beta.167 (2020-01-11 04:16)
-----------------------------------------
- Fixed testcases for provider changes. ([90ed07c](https://github.com/ethers-io/ethers.js/commit/90ed07c74e7230ea0f02288b140d497d8b9779e0))
- Add support for legacy flat signatures with recid instead of normalized v. ([245cd0e](https://github.com/ethers-io/ethers.js/commit/245cd0e48e07eef35f5bf45ee7fe5ed5ef31338a))
- Fix TransactionResponse to have chainId instead of legacy networkId. ([#700](https://github.com/ethers-io/ethers.js/issues/700); [72b3bc9](https://github.com/ethers-io/ethers.js/commit/72b3bc9909074893038c768f3da1564ed96a6a20))
- Fixed splitSignature computing wrong v for BytesLike. ([#700](https://github.com/ethers-io/ethers.js/issues/700); [4151c0e](https://github.com/ethers-io/ethers.js/commit/4151c0eacd22287e2369a8656ffa00359db6f84b))
- Added dist files for hardware-wallets. ([c846649](https://github.com/ethers-io/ethers.js/commit/c84664953d2f50ee0d704a8aa18fe6c08668dabb))
- Browser support (with dist files) for Ledger. ([6f7fbf3](https://github.com/ethers-io/ethers.js/commit/6f7fbf3858c82417933a5e5595a919c0ec0487c7))
ethers/v5.0.0-beta.166 (2020-01-10 03:09)
-----------------------------------------
- Relaxed joinSignature API to allow SignauteLike. ([602e6a8](https://github.com/ethers-io/ethers.js/commit/602e6a8973480299843a0158f75451a2c6aac749))
- Initial code drop of new hardware wallet package. ([2e8f5ca](https://github.com/ethers-io/ethers.js/commit/2e8f5ca7ed498261079da75713b18f3370dfd236))
- Added more docs. ([381a72d](https://github.com/ethers-io/ethers.js/commit/381a72ddaa7fb59ef2ded84d228296d693df05c3))
ethers/v5.0.0-beta.165 (2020-01-09 03:31)
-----------------------------------------
- Fixed require resolution for CLI scripts. ([c04f9a7](https://github.com/ethers-io/ethers.js/commit/c04f9a7fff727bb04a4aa3a0fa05fd5cd8e795a6))
- Added new URLs for default ETC (and ETC testnets) providers. ([#351](https://github.com/ethers-io/ethers.js/issues/351); [3c184ac](https://github.com/ethers-io/ethers.js/commit/3c184ace21aafbb27f4d44cce1bb738af899d59f))
ethers/v5.0.0-beta.164 (2020-01-07 19:57)
-----------------------------------------
- Use better Description typing. ([2d5492c](https://github.com/ethers-io/ethers.js/commit/2d5492cd2ee722c818c249244af7b5bea05d67b0))
- Better property access on ABI decoded results. ([#698](https://github.com/ethers-io/ethers.js/issues/698); [13f50ab](https://github.com/ethers-io/ethers.js/commit/13f50abd847f7ddcc7e54c102da54e2d23b86fae))
- Better typing support for Description. ([d0f4642](https://github.com/ethers-io/ethers.js/commit/d0f4642f6d2c9f5119f1910a0082894c60e81191))
- Fixed resolveName when name is an address with an invalid checksum. ([#694](https://github.com/ethers-io/ethers.js/issues/694); [1e72fc7](https://github.com/ethers-io/ethers.js/commit/1e72fc7d6f7c3be4410dbdcfbab9a0463ceb52bd))
ethers/v5.0.0-beta.163 (2020-01-06 18:57)
-----------------------------------------
- Added function to generate CREATE2 addresses. ([#697](https://github.com/ethers-io/ethers.js/issues/697); [eb26a6d](https://github.com/ethers-io/ethers.js/commit/eb26a6d95022a241c44f859e7b2f29646afb4914))
- Force constructor name to be null (instead of undefined). ([a648f2b](https://github.com/ethers-io/ethers.js/commit/a648f2bd1e5e52a3662896f04fe7025884866972))
- Added documentation uploading script. ([e593aba](https://github.com/ethers-io/ethers.js/commit/e593aba2946c98820b0c2edf9c5dab6cb30c7402))
- Added Czech wordlist to default wordlists export. ([#691](https://github.com/ethers-io/ethers.js/issues/691); [5724fa5](https://github.com/ethers-io/ethers.js/commit/5724fa5d9c6fe73f14ec8bdea1f7226a222537ef))
- Added Czech BIP-39 wordlist. ([#691](https://github.com/ethers-io/ethers.js/issues/691); [f54f06b](https://github.com/ethers-io/ethers.js/commit/f54f06b5c8092997fd3c9055d69a3e0796ce44f3))
- Updated README. ([e809ead](https://github.com/ethers-io/ethers.js/commit/e809eadf8d608cd8c8a78c08a2e3547dd09156cf))
- Updating docs. ([184c459](https://github.com/ethers-io/ethers.js/commit/184c459fab0d089a8a879584b72e5eb3560b33ce))
- Merge branch 'yuetloo-ethers-v5-beta' into ethers-v5-beta ([06cafe3](https://github.com/ethers-io/ethers.js/commit/06cafe3437ef129b47f5f9c02f4759f2c4854d3c))
- Add circleci and parity test files ([fdf0980](https://github.com/ethers-io/ethers.js/commit/fdf0980663ffead0faf3e9b7b233b22ca1574e21))
- Fixed typo in package test dist scripts. ([9c78c7f](https://github.com/ethers-io/ethers.js/commit/9c78c7fee69d07733048d898d58205ae7f5c82d7))
ethers/v5.0.0-beta.162 (2019-11-25 00:02)
-----------------------------------------
- Update elliptic package to protect from Minerva timing attack. ([#666](https://github.com/ethers-io/ethers.js/issues/666); [cf036e1](https://github.com/ethers-io/ethers.js/commit/cf036e1ffad3340fcf1c7559d0032493ccc08e6e))
- Browser and node testing works again. ([4470477](https://github.com/ethers-io/ethers.js/commit/4470477d7fd3031f2f3a1fbd9c538468c33c7350))
ethers/v5.0.0-beta.161 (2019-11-23 21:43)
-----------------------------------------
- Updated dist files (sorted package.json to reduce package version change chatter). ([f308ba3](https://github.com/ethers-io/ethers.js/commit/f308ba3540ed0d282d099456d0369873ad9596b0))
- Stubs for adding throttle support. ([2f0e679](https://github.com/ethers-io/ethers.js/commit/2f0e679f0bc81bf901cf60a79e50f9715cddec5a))
- Refactor wordlists. ([abab9f6](https://github.com/ethers-io/ethers.js/commit/abab9f6aa27d1870d1053e7caa951408b86c454d))
- Browser testcases work again. ([c11c2e2](https://github.com/ethers-io/ethers.js/commit/c11c2e2e3376a6764f07ed443245823f2792b8cc))
- Added dist files for non-English wordlists. ([3d75c52](https://github.com/ethers-io/ethers.js/commit/3d75c52dac668af5eeede3e7764dadd3055a0707))
- Sync GitHub issue cache. ([29f0e9d](https://github.com/ethers-io/ethers.js/commit/29f0e9dd627a7b4b7f772300497f27718c9ecc7b))
ethers/v5.0.0-beta.160 (2019-11-20 18:36)
-----------------------------------------
- Updated API in testcases. ([3ab3733](https://github.com/ethers-io/ethers.js/commit/3ab373334c75800f2b20b6639ed8eb1b11e453ef))
- Fixed scrypt import in ESM build. ([b72ef27](https://github.com/ethers-io/ethers.js/commit/b72ef27b2a8f9941fb9d79122ec449fed9d2464d))
- Fixed null apiKey problem for InfuraProvider. ([e518151](https://github.com/ethers-io/ethers.js/commit/e51815150912d10e2734707986b10b37c87d6d12))
- Added support for sighash-style tuple parsing. ([19aaade](https://github.com/ethers-io/ethers.js/commit/19aaade9c62510012cfd50ae487ebd1705a28678))
- Fixed solc imports for cli. ([c35ddaf](https://github.com/ethers-io/ethers.js/commit/c35ddaf646efa25e738fee604585a0a7af45b206))
- Added nonce manager to experimental index. ([8316406](https://github.com/ethers-io/ethers.js/commit/8316406977ea26ca2044d16f7b3bb6ba21ef5b43))
- Removing NodesmithProvider from default provider as it is being discontinued. ([01ca350](https://github.com/ethers-io/ethers.js/commit/01ca35036ca11a47f60890e5cae62e46a00f3da8))
- Moved bare ABI named functions and events from Interface into Contracts to simplify other consumers of Interface. ([da8ca2e](https://github.com/ethers-io/ethers.js/commit/da8ca2e8bc982fc3ea0343bb3c593a485ca1fef0))
- Added support for complex API keys including support for INFURA project secrets. ([#464](https://github.com/ethers-io/ethers.js/issues/464), [#651](https://github.com/ethers-io/ethers.js/issues/651), [#652](https://github.com/ethers-io/ethers.js/issues/652); [1ec5804](https://github.com/ethers-io/ethers.js/commit/1ec5804bd460f6948d4813469fdc7bf739baa6a6))
- Migrated to scrypt-js v3. ([75895fa](https://github.com/ethers-io/ethers.js/commit/75895fa1491e7542c755a102f4e4c190685fd2b6))
- Moved getDefaultProvider to providers package. ([51e4ef2](https://github.com/ethers-io/ethers.js/commit/51e4ef2b45b83a8d82923600a2fac544d70b0807))
- Migrating providers to modern syntax and scoping. ([#634](https://github.com/ethers-io/ethers.js/issues/634); [e1509a6](https://github.com/ethers-io/ethers.js/commit/e1509a6326dd2cb8bf7ed64b82dd3947b768a314))
- Migrating to modern syntax and scoping. ([#634](https://github.com/ethers-io/ethers.js/issues/634); [394c36c](https://github.com/ethers-io/ethers.js/commit/394c36cad43f229a94c72d21f94d1c7982a887a1))
- Added provider property to Web3Provider. ([#641](https://github.com/ethers-io/ethers.js/issues/641); [1d4f90a](https://github.com/ethers-io/ethers.js/commit/1d4f90a958da6364117353850d62535c9702abd2))
- Updated GitHub issue cache. ([494381a](https://github.com/ethers-io/ethers.js/commit/494381a6284cc8ed90bd8002d42a6b6d94dc1200))
- Force deploy receipt to address to be null. ([#573](https://github.com/ethers-io/ethers.js/issues/573); [d9d438a](https://github.com/ethers-io/ethers.js/commit/d9d438a119bb11f8516fc9cf02c534ab3816fcb3))
- Updated experimental NonceManager. ([3d514c8](https://github.com/ethers-io/ethers.js/commit/3d514c8dbb94e1c4ce5754463e683dd9dbe7c0aa))
- Fixed typo in error message. ([28339a9](https://github.com/ethers-io/ethers.js/commit/28339a9c8585392086da159a46df4afb8958915c))
- Added GitHub issue caching. ([fea867a](https://github.com/ethers-io/ethers.js/commit/fea867a206f007a17718396e486883a5e718aa29))
ethers/v5.0.0-beta.159 (2019-10-17 01:08)
-----------------------------------------
- Removing TypeScript build files from npm to fix excessive package diffs.
- Fixed getBlock for blockhashes with a leading 0. ([#629](https://github.com/ethers-io/ethers.js/issues/629); [12cfc59](https://github.com/ethers-io/ethers.js/commit/12cfc599656d7e3a6d3d9aa4e468592865a711cc))
ethers/v5.0.0-beta.158 (2019-09-28 01:56)
-----------------------------------------
- Added less-common, but useful, coding functions to Interface. ([778eb3b](https://github.com/ethers-io/ethers.js/commit/778eb3b425b5ab5b23d28e75be92feccd0fc56bc))
- Add response handling and 304 support to fetchJson. ([3d25882](https://github.com/ethers-io/ethers.js/commit/3d25882d6bf689740506b9c569f6e0d30da6f6a5))
- Allow numeric values in a transaction to be odd-lengthed hexstrings. ([#614](https://github.com/ethers-io/ethers.js/issues/614); [a12030a](https://github.com/ethers-io/ethers.js/commit/a12030ad29aa13c02aa75d9e0860f4986a0043b4))
- Simpler crypt for admin tools. ([828c8cf](https://github.com/ethers-io/ethers.js/commit/828c8cfd419ac4f8d11d978c2e2ff83eba5ae909))
ethers/v5.0.0-beta.157 (2019-09-08 02:43)
-----------------------------------------
- Fixed getContractAddress for odd-length hex values. ([#572](https://github.com/ethers-io/ethers.js/issues/572); [751793e](https://github.com/ethers-io/ethers.js/commit/751793ea25183d54d7fc4c610a789608f91c062e))
- Fixed typo in error message. ([#592](https://github.com/ethers-io/ethers.js/issues/592); [6f4291f](https://github.com/ethers-io/ethers.js/commit/6f4291f65f0ea20c65fef7fd7b09b4d5bf5f0dcd))
- Fixed typo in error message. ([#580](https://github.com/ethers-io/ethers.js/issues/580); [9c63b4a](https://github.com/ethers-io/ethers.js/commit/9c63b4a7535f423a802bb1c17c325ce968987349))
- Fixed typo in error message. ([#574](https://github.com/ethers-io/ethers.js/issues/574); [22a2673](https://github.com/ethers-io/ethers.js/commit/22a26736cc332fe6e896c9d2707cc99ceee2fb10))
ethers/v5.0.0-beta.156 (2019-09-06 17:56)
-----------------------------------------
- Removed export star to fix UMD dist file. ([4c17c4d](https://github.com/ethers-io/ethers.js/commit/4c17c4db0455e1b89fd597c4c929cdc36aa3d90d))
- Updated TypeScript version. ([e8028d0](https://github.com/ethers-io/ethers.js/commit/e8028d0e73368257b76b394bb8e2bf63f8aecd71))
- Fixed test suites and reporter. ([1e0ed4e](https://github.com/ethers-io/ethers.js/commit/1e0ed4e99a22a27fe5057336f8cb320809768f3e))
- Added lock-versions admin tool. ([2187604](https://github.com/ethers-io/ethers.js/commit/21876049137644af2b3afa31120ee95d032843a8))
- Updated packages with version lock and moved types. ([85b4db7](https://github.com/ethers-io/ethers.js/commit/85b4db7d6db37b853f11a90cf4648c34404edcf9))
- Fixed typo in error message. ([#592](https://github.com/ethers-io/ethers.js/issues/592); [019c1fc](https://github.com/ethers-io/ethers.js/commit/019c1fc7089b3da2d7bd41c933b6c6bc35c8dade))
- Fixed build process to re-target browser field to ES version. ([3a91e91](https://github.com/ethers-io/ethers.js/commit/3a91e91df56c1ef6cf096c0322f74fd5060891e0))
- Major overhaul in compilation to enable ES6 module generation. ([73a0077](https://github.com/ethers-io/ethers.js/commit/73a0077fd38c6ae79f33a9d4d3cc128a904b4a6c))
- Updated some of the flatworm docs. ([81fd942](https://github.com/ethers-io/ethers.js/commit/81fd9428cab4be7eee7ddeb564bf91f282cae475))
- Fixed package descriptions. ([#561](https://github.com/ethers-io/ethers.js/issues/561); [ebfca98](https://github.com/ethers-io/ethers.js/commit/ebfca98dc276d6f6ca6961632635e8203bb17645))
ethers/v5.0.0-beta.155 (2019-08-22 17:11)
-----------------------------------------
- Added Wrapped Ether and Token transfers to CLI. ([c031a13](https://github.com/ethers-io/ethers.js/commit/c031a1336815923bae85d9982dba0985a79cfaed))
- Fixed sendTransaction and use median gas price in FallbackProvider. ([07e1599](https://github.com/ethers-io/ethers.js/commit/07e15993ba181cfbff987778d158dbde6bb84de2))
- Port optional Secret Storage wallet address to v5. ([#582](https://github.com/ethers-io/ethers.js/issues/582); [a12d60d](https://github.com/ethers-io/ethers.js/commit/a12d60d722dfcf998a2e06eba5e46390d7d442e5))
- Updated flatworm docs output. ([8745a81](https://github.com/ethers-io/ethers.js/commit/8745a81b11b710036ddb546308c13958be1affb9))
- Added initial flatworm documentation stubs. ([0333a76](https://github.com/ethers-io/ethers.js/commit/0333a76f4ff382b5b59b24c672b702721e7a386a))
ethers/v5.0.0-beta.154 (2019-08-21 01:51)
-----------------------------------------
- Use safe transfer for ENS in CLI. ([b7494d8](https://github.com/ethers-io/ethers.js/commit/b7494d8618001797a4e856f3d1886273897e6ba4))
- Fixed quorum-matching logic for FallbackProvider. ([b304ec1](https://github.com/ethers-io/ethers.js/commit/b304ec1f008ec5301c0dbd1a493d790fe3528512))
- Added CloudflareProvider. ([#587](https://github.com/ethers-io/ethers.js/issues/587); [621313d](https://github.com/ethers-io/ethers.js/commit/621313d2a697bc6e1dd25eb5b08d67e832a28d05))
- Added receipt to CALL_EXCEPTION errors. ([724c32e](https://github.com/ethers-io/ethers.js/commit/724c32e8c08b55404594f263e52babb0550a15b8))
ethers/v5.0.0-beta.153 (2019-08-06 19:15)
-----------------------------------------
- Updated gas estimate failure messaging to include that the tx may simple be causing a revert. ([edb26b1](https://github.com/ethers-io/ethers.js/commit/edb26b16354afd707e5d03e174c4cc809b951c4f))
- Additional sanity checks in ethers-ens. ([de4b2a4](https://github.com/ethers-io/ethers.js/commit/de4b2a449ca3a49807c8bedb3e21e8e8d71e63fc))
- Fix bug in --wait for CLI. ([9977c9f](https://github.com/ethers-io/ethers.js/commit/9977c9f66a7007dcc1963128c88c584b6b6c064b))
- Added content-hash support to ENS CLI. ([7dfef46](https://github.com/ethers-io/ethers.js/commit/7dfef463f83a9190d1b89cf81e0fb692da3dd813))
ethers/v5.0.0-beta.152 (2019-08-05 14:37)
-----------------------------------------
- Using CLI --wait instead of custom Plugin flag for ethers-ens. ([19ee2b5](https://github.com/ethers-io/ethers.js/commit/19ee2b516005b2c35b846f19457ec9bbfa0c283b))
- Added --wait as a general flag to CLI. ([7640292](https://github.com/ethers-io/ethers.js/commit/7640292ac8b7b9e6de3ad6699d23e2debf26cc1b))
- Added migrate-registrar and transfer to ENS CLI. ([31e8e1b](https://github.com/ethers-io/ethers.js/commit/31e8e1b0520bc8be390fbf7e2b473c36a8649eb3))
- Include data in the CLI transaction dump. ([53bd96a](https://github.com/ethers-io/ethers.js/commit/53bd96a9f675233906033290f1e0c71ca4e9d389))
- Better errors on gas estimation failure. ([0e6b810](https://github.com/ethers-io/ethers.js/commit/0e6b810def390309240508a99b2cf0736848dedd))
ethers/v5.0.0-beta.151 (2019-08-05 14:29)
-----------------------------------------
- Added package name prefix to all _version for Logger. ([692589d](https://github.com/ethers-io/ethers.js/commit/692589db54cbca10a2a453e9a1801a8612056559))
ethers/v5.0.0-beta.150 (2019-08-03 01:07)
-----------------------------------------
- Fixed old references to errors package. ([1cabce7](https://github.com/ethers-io/ethers.js/commit/1cabce7e1c23b15cc2b630c0b403dd72d815a5ba))
- Added generation scripts for Table A.1 for stringprep. ([#42](https://github.com/ethers-io/ethers.js/issues/42); [b21681a](https://github.com/ethers-io/ethers.js/commit/b21681a7f4292b0e77315caad3a59fe814e9292b))
ethers/v5.0.0-beta.149 (2019-08-03 00:45)
-----------------------------------------
- Fixed some case-folding and added Table A.1 for IDNA. ([#42](https://github.com/ethers-io/ethers.js/issues/42); [f955dca](https://github.com/ethers-io/ethers.js/commit/f955dca417a6f86690cf33a81b08baa99e1b1a5c))
- Removed references to legacy errors pacakge and updated umbrella pacakge. ([c09de16](https://github.com/ethers-io/ethers.js/commit/c09de163473c361cac11ddef9ec852f4cbb7d8e3))
- Updated admin module to use new fetchJson. ([226c100](https://github.com/ethers-io/ethers.js/commit/226c100c72c3fcb0c0e3b62be5f579fd9cc4c904))
- Updated dist files. ([8354c3f](https://github.com/ethers-io/ethers.js/commit/8354c3f9fe5487f21acaaeccd4450d9a5d495bc1))
- Full case-folding for IDNA in namehash. ([0af95f4](https://github.com/ethers-io/ethers.js/commit/0af95f4a655106e67c2ba8f445af88c9e9e24339))
- Deprecating errors for logger. ([0b224e8](https://github.com/ethers-io/ethers.js/commit/0b224e8fb5811cd06727063c909ca1e1e5cde57e))
- More consistent debug events for Providers. ([e8f28b5](https://github.com/ethers-io/ethers.js/commit/e8f28b55d7dd62e29f03628232ffe7c75dc811b5))
ethers/v5.0.0-beta.148 (2019-07-27 18:56)
-----------------------------------------
- Initial drop of new ENS CLI tool. ([c3c65b2](https://github.com/ethers-io/ethers.js/commit/c3c65b2fa19e117d6433c2e0b3d20decfe506c74))
- Added TypeScript tool support for functions with multiple outputs. ([6de4a5d](https://github.com/ethers-io/ethers.js/commit/6de4a5d8a9d114c4c33c58f8a304b60e7370eeff))
- Added CLI support for stand-alone (no sub-command) tools. ([b67b121](https://github.com/ethers-io/ethers.js/commit/b67b12123996f1aaf7cbe3c8648fd85a22d6674e))
- Make utils.resolveProperties preserve object parameter order. ([74dbc28](https://github.com/ethers-io/ethers.js/commit/74dbc281ede042c5eeaa7b45150b215dea860a88))
- Added initial IDNA support for full UTF-8 support in namehash. ([#42](https://github.com/ethers-io/ethers.js/issues/42); [28eb38e](https://github.com/ethers-io/ethers.js/commit/28eb38ee703288aaad9f730b2d93fe3aeea7ada6))
ethers/v5.0.0-beta.147 (2019-07-23 01:04)
-----------------------------------------
- Use the CLI solc instead of solc directly for ABI testcase generation. ([99c7b1c](https://github.com/ethers-io/ethers.js/commit/99c7b1ca94382490b9757fd51375a7ad4259b831))
- Added experimental UTF-8 functions for escaping non-ascii strings. ([b132e32](https://github.com/ethers-io/ethers.js/commit/b132e32172c9d63e59209628dadd5796dd6291c8))
- Bump Solidity version in CLI to 0.5.10. ([6005248](https://github.com/ethers-io/ethers.js/commit/600524842e1a4b857e8428a45c0c7d1baa0624ee))
ethers/v5.0.0-beta.146 (2019-07-20 21:06)
-----------------------------------------
- Keep extra filter topics when using Frgment filters in Contracts. ([efaafb2](https://github.com/ethers-io/ethers.js/commit/efaafb203feaf703de803df7e346652372e9fb75))
- Updated package.json description for Contract package. ([#561](https://github.com/ethers-io/ethers.js/issues/561); [d88ee45](https://github.com/ethers-io/ethers.js/commit/d88ee45937b3484b68f72e3f72ad6c29556c984b))
ethers/v5.0.0-beta.145 (2019-07-20 20:12)
-----------------------------------------
- Export provider.Formatter. ([#562](https://github.com/ethers-io/ethers.js/issues/562); [083fd76](https://github.com/ethers-io/ethers.js/commit/083fd76a3a638ec16d5f9bf652101e5a150c7347))
- Update CLI to use new Fragment.format style. ([9a41199](https://github.com/ethers-io/ethers.js/commit/9a4119910b07d1ad61bafafb38ac18a9dae1d9ed))
- Added FormatTypes to utils. ([a05027c](https://github.com/ethers-io/ethers.js/commit/a05027c744102bbe1be5e13dd89b9c1e64b3b526))
- Added experimental memory-hard password scheme for password-protected mnemonics to the CLI. ([5877418](https://github.com/ethers-io/ethers.js/commit/5877418de94256a69fdf2ad466ba579309b9dee8))
- Added more flexible output options to fragment.format (JSON and minimal) and better JSON object parsing. ([e9558c8](https://github.com/ethers-io/ethers.js/commit/e9558c8d4fe6df889f4d7ba6ac6448aa543ef99d))
ethers/v5.0.0-beta.144 (2019-07-09 17:28)
-----------------------------------------
- Make mnemonic phrases case agnostic. ([#557](https://github.com/ethers-io/ethers.js/issues/557); [e4423b7](https://github.com/ethers-io/ethers.js/commit/e4423b7a277e7e1be1c02d345d4ab1eab484c9b8))
ethers/v5.0.0-beta.143 (2019-07-02 16:12)
-----------------------------------------
- Adding more support for offline signing in the CLI. ([9cc269c](https://github.com/ethers-io/ethers.js/commit/9cc269ceb5d33b2d88542d4bc6771279f729e733))
- Allow providers to prepare their Network object. ([6484908](https://github.com/ethers-io/ethers.js/commit/6484908cb25dd35e5d98b2672dca72ed3f30cbe1))
- Export BIP-44 default path in ethers.utils. ([04bdf45](https://github.com/ethers-io/ethers.js/commit/04bdf456eb07aa72872265e0ee01e3231d2b6cf1))
ethers/v5.0.0-beta.142 (2019-06-28 16:13)
-----------------------------------------
- Do not require a Signer for contract.populateTransaction. ([0e78386](https://github.com/ethers-io/ethers.js/commit/0e78386a08d3d3a0a98c8d03cd665b8992ab3ea2))
- Bumping version of solc to 0.5.9. ([e2da447](https://github.com/ethers-io/ethers.js/commit/e2da447c7bc05937966bc4909c47291e4819d2a9))
ethers/v5.0.0-beta.141 (2019-06-24 21:25)
-----------------------------------------
- Fix non-ES6 import in keccak256. ([5eb393d](https://github.com/ethers-io/ethers.js/commit/5eb393d828328b34567566d3c0d622b4aef1e202))
- Refactored wordlist exports to export Wordlist directly. ([746d255](https://github.com/ethers-io/ethers.js/commit/746d255b741844b615583b2de3ffd07631b4e872))
ethers/v5.0.0-beta.140 (2019-06-12 01:25)
-----------------------------------------
- Move from node-fetch to cross-fetch; better browser fallback implementation. ([826ffbc](https://github.com/ethers-io/ethers.js/commit/826ffbc7c4ed1c301f30e6f264eedeaf3c243ca8))
- Added getStatic with support for inheritance of static methods. ([5e4535e](https://github.com/ethers-io/ethers.js/commit/5e4535e939fdb9d9d23bd14b3e2590873d3eb508))
- Fixed node-fetch for Safari (todo: push this fix upstream to node-fetch). ([7164e51](https://github.com/ethers-io/ethers.js/commit/7164e51131215ae3201b49f8c7f5ade8cbd8a420))
- Migrated XMLHttpRequest to fetch API. ([#506](https://github.com/ethers-io/ethers.js/issues/506); [62201c5](https://github.com/ethers-io/ethers.js/commit/62201c5eebc52e9723dbbb2cc64823155ce1e0f9))
ethers/v5.0.0-beta.139 (2019-06-11 17:55)
-----------------------------------------
- Removed freeze option from deepCopy; all properties are read-only and only objects may have new properties added. ([1bc792d](https://github.com/ethers-io/ethers.js/commit/1bc792d9dcc6a06a1be4fc5e5b9a538a3f6b7ada))
- Moved away from isNamedInstance which breaks after Browserify name mangling. ([257d67c](https://github.com/ethers-io/ethers.js/commit/257d67c9625fa237bcfb3d651c49aa3b79175cae))
- Expose poll function in utils. ([#512](https://github.com/ethers-io/ethers.js/issues/512); [e6f6383](https://github.com/ethers-io/ethers.js/commit/e6f6383346818fa67423f1f20450e011242eb554))
- Make TransactionResponse hash required. ([#537](https://github.com/ethers-io/ethers.js/issues/537); [095c1fe](https://github.com/ethers-io/ethers.js/commit/095c1fe579068a3204ea0d1bc1893f293f61e719))
ethers/v5.0.0-beta.138 (2019-06-04 16:05)
-----------------------------------------
- Fixed INFURA project ID checking. ([#534](https://github.com/ethers-io/ethers.js/issues/534); [5bf763f](https://github.com/ethers-io/ethers.js/commit/5bf763fe2307e8570ab5e91e30c43e2e5731fc39))
ethers/v5.0.0-beta.137 (2019-06-01 14:06)
-----------------------------------------
- Fixed invalid arrayify value in browser for SHA2-HMAC. ([#530](https://github.com/ethers-io/ethers.js/issues/530); [c4a494b](https://github.com/ethers-io/ethers.js/commit/c4a494b528f2e5f706c159d916d8ff0ffd96a211))
- Fix event and function fragment formatting. ([a2d4b29](https://github.com/ethers-io/ethers.js/commit/a2d4b2907184d9480a72fe6f67652489074af86e))
- Fixed default JsonRpcSigner. ([#532](https://github.com/ethers-io/ethers.js/issues/532); [5ba6a61](https://github.com/ethers-io/ethers.js/commit/5ba6a616a6f969b1f28f8c6367c21488f497a7ae))
- Added changelog management to update-versions. ([4a3f719](https://github.com/ethers-io/ethers.js/commit/4a3f7190dc04275030d313289e1ba6a2b31407ec))
ethers/v5.0.0-beta.136
----------------------
- Added queryFilter to Contracts. ([#463](https://github.com/ethers-io/ethers.js/issues/463); [eea53bb](https://github.com/ethers-io/ethers.js/commit/eea53bb1be29ad2bd1b229a13c85b12be264b019))
- Allow storage class in Human-Readable ABI. ([#476](https://github.com/ethers-io/ethers.js/issues/476); [cf39adb](https://github.com/ethers-io/ethers.js/commit/cf39adb09020ca0393e028b330bfd07fb4869236))
- Track per-provider JSON-RPC ID in JsonRpcProvider. ([#337](https://github.com/ethers-io/ethers.js/issues/337), [#489](https://github.com/ethers-io/ethers.js/issues/489); [044554b](https://github.com/ethers-io/ethers.js/commit/044554b58525d1677646a74119f86ea867a06d1e))
- Fixed typo in error message. ([#470](https://github.com/ethers-io/ethers.js/issues/470); [47d92ae](https://github.com/ethers-io/ethers.js/commit/47d92aeff02cacfb26793850c7faef7cb21ce4cf))
ethers/v5.0.0-beta.135
----------------------
- Better error message for unconfigured ENS names. ([#504](https://github.com/ethers-io/ethers.js/issues/504); [3cbc4b4](https://github.com/ethers-io/ethers.js/commit/3cbc4b462262ba61fa7d99a7a12e7bbf8049afb1))
- Fixed contract events. ([#404](https://github.com/ethers-io/ethers.js/issues/404); [8cdda37](https://github.com/ethers-io/ethers.js/commit/8cdda37095df28f828ccd2ac5437ccb6541b16cc))
- Updated license for BaseX to include original authors; was only included in the source. ([03c9725](https://github.com/ethers-io/ethers.js/commit/03c97259c46de10dbe6ce62921de2f32ffff0522))

View File

@@ -1,7 +1,7 @@
The Ethers Project
==================
[![npm (tag)](https://img.shields.io/npm/v/ethers/next)](https://www.npmjs.com/package/ethers/v/next)
[![npm (tag)](https://img.shields.io/npm/v/ethers)](https://www.npmjs.com/package/ethers)
[![Node.js CI](https://github.com/ethers-io/ethers.js/workflows/Node.js%20CI/badge.svg?branch=ethers-v5-beta)](https://github.com/ethers-io/ethers.js/actions?query=workflow%3A%22Node.js+CI%22)
A complete Ethereum wallet implementation and utilities in JavaScript (and TypeScript).
@@ -17,7 +17,7 @@ A complete Ethereum wallet implementation and utilities in JavaScript (and TypeS
- **Tiny** (~104kb compressed; 322kb uncompressed)
- **Modular** packages; include only what you need
- **Complete** functionality for all your Ethereum desires
- Extensive [documentation](https://docs.ethers.io/ethers.js/html/)
- Extensive [documentation](https://docs.ethers.io/v5/)
- Large collection of **test cases** which are maintained and added to
- Fully **TypeScript** ready, with definition files and full TypeScript source
- **MIT License** (including ALL dependencies); completely open source to do with as you please
@@ -26,10 +26,12 @@ A complete Ethereum wallet implementation and utilities in JavaScript (and TypeS
Keep Updated
------------
For the latest news and advisories, please follow the [@ethersproject](https://twitter.com/ethersproject)
on Twitter (low-traffic, non-marketting, important information only) as well as watch this GitHub project.
For the latest news and advisories, please follow the
[@ethersproject](https://twitter.com/ethersproject) on Twitter (low-traffic,
non-marketing, important information only) as well as watch this GitHub project.
For the latest changes, see the [CHANGELOG](https://github.com/ethers-io/ethers.js/blob/master/CHANGELOG.md).
For the latest changes, see the
[CHANGELOG](https://github.com/ethers-io/ethers.js/blob/master/CHANGELOG.md).
Installing
@@ -38,13 +40,13 @@ Installing
**node.js**
```
/home/ricmoo/some_project> npm install --save ethers@next
/home/ricmoo/some_project> npm install --save ethers
```
**browser (UMD)**
```
<script src="https://cdn.ethers.io/lib/ethers-5.0.umd.min.js" type="text/javasctipt">
<script src="https://cdn.ethers.io/lib/ethers-5.6.umd.min.js" type="text/javascript">
</script>
```
@@ -52,7 +54,7 @@ Installing
```
<script type="module">
import { ethers } from "https://cdn.ethers.io/lib/ethers-5.0.umd.min.js";
import { ethers } from "https://cdn.ethers.io/lib/ethers-5.6.esm.min.js";
</script>
```
@@ -60,13 +62,40 @@ Installing
Documentation
-------------
Browse the documentation online:
Browse the [documentation](https://docs.ethers.io/v5/) online:
- [Getting Started](https://docs.ethers.io/)
- [Full API Documentation](https://docs.ethers.io/)
- [Getting Started](https://docs.ethers.io/v5/getting-started/)
- [Full API Documentation](https://docs.ethers.io/v5/api/)
- [Various Ethereum Articles](https://blog.ricmoo.com/)
Or browser the entire documentations as a [single page](https://docs.ethers.io/single-page/).
Providers
---------
Ethers works closely with an ever-growing list of third-party providers
to ensure getting started is quick and easy, by providing default keys
to each service.
These built-in keys mean you can use `ethers.getDefaultProvider()` and
start developing right away.
However, the API keys provided to ethers are also shared and are
intentionally throttled to encourage developers to eventually get
their own keys, which unlock many other features, such as faster
responses, more capacity, analytics and other features like archival
data.
When you are ready to sign up and start using for your own keys, please
check out the [Provider API Keys](https://docs.ethers.io/v5/api-keys/) in
the documentation.
A special thanks to these services for providing community resources:
- [Ankr](https://www.ankr.com/)
- [Etherscan](https://etherscan.io/)
- [INFURA](https://infura.io/)
- [Alchemy](https://dashboard.alchemyapi.io/signup?referral=55a35117-028e-4b7c-9e47-e275ad0acc6d)
- [Pocket](https://pokt.network/pocket-gateway-ethereum-mainnet/)
Ancillary Packages
@@ -75,14 +104,14 @@ Ancillary Packages
These are a number of packages not included in the umbrella `ethers` npm package, and
additional packages are always being added. Often these packages are for specific
use-cases, so rather than adding them to the umbrella package, they are added as
ancillary packaged, which can be included by those who need them, while not bloating
ancillary packages, which can be included by those who need them, while not bloating
everyone else with packages they do not need.
We will keep a list of useful pacakges here.
We will keep a list of useful packages here.
- `@ethersproject/experimental` ([documentation](https://docs.ethers.io))
- `@ethersproject/cli` ([documentation](https://docs.ethers.io))
- `@ethersproject/hardware-wallets` ([documentation](https://docs.ethers.io))
- `@ethersproject/experimental` ([documentation](https://docs.ethers.io/v5/api/experimental/))
- `@ethersproject/cli` ([documentation](https://docs.ethers.io/v5/cli/))
- `@ethersproject/hardware-wallets` ([documentation](https://docs.ethers.io/v5/api/other/hardware/))
License

33
SECURITY.md Normal file
View File

@@ -0,0 +1,33 @@
# Security Policy
## Supported Versions
Maintaining multiple versions of the library is quite time consuming, so
the majority of the effort is focused on the latest major release.
If you do require a version outside of this chart updated with patch fix,
please [contact me](mailto:github@ricmoo.com).
| Version | Supported | Initial Release |
| ------- | ------------------------------------------ | ----------------- |
| 5.0.x | :white_check_mark: | 2020-06-12 |
| 4.0.x | :white_check_mark: (security patches only) | 2018-10-01 |
| 3.0.x | :x: | 2018-03-05 |
| 2.2.x | :x: | 2018-01-11 |
| 2.1.x | :x: | 2017-05-22 |
| 2.0.x | :x: | 2017-04-05 |
| 1.0.x | :x: | 2016-08-23 |
| 0.0.x | :x: | 2016-07-14 |
## Reporting a Vulnerability
If you identify a security vulnerability with this library (or any dependency),
please do not hesitate to contact [github@ricmoo.com](mailto:github@ricmoo.com)
immediately.
I try to respond within the same day and will address any concern as quickly
as possible (including code fixes and publishing to NPM).
Any vulnerability will also be published to this file, along with credits,
pertinent information and links to fixes.

View File

@@ -1,59 +0,0 @@
Admin Tool
==========
This tool is meant for admin tasks related to ethers.js.
Workflow
--------
After a new series of changes have been made and tested:
1. Run `npm run update-versions` to update and build all packages
2. Make any human-necessary changes to the automatically updated `CHANGELOG.md`
3. Run `git add .`
4. Run `git commit -S -m "Updated dist files."`
5. Run `git push`
6. Wait for TravisCI to complete running test cases
7. Run `npm run publish-all` to publish changed packages to NPM and tag GitHub
Update Dependency Graph: admin/cmds/update-depgraph
---------------------------------------------------
This is run as part of `npm run bootstrap` before running lerna bootstrap.
It recomputes the dependency graph and writes out the ordered
**tsconfig.project.json**
Update Versions: admin/cmds/update-versions
-------------------------------------------
Run using the `npm run update-versions`, which also cleans, bootstraps and
rebuilds the project before running the script.
For each package that has changed from the version in NPM (the published
tarballs are compared):
- Update the `version` in the **package.json**
- Update the `src.ts/_version.ts` (matches the **package.json**)
- Updates the `tarballHash` in the **package.json**
- Compiles the TypeScript (which updates the `_version.js` and `_version.d.js`)
- Lists all changed files (highlighting src.ts files)
Then:
- Generate the distribution files
- Update the `CHANGELOG.md`
Publish: admin/cmds/publish
---------------------------
Run using `npm run publish-all`. This requires a password for the secure
local config and the OTP for NPM.
- Publish (in dependency order) changed files to NPM
- The `gitHead` is updated in **only** the NPM **package.json**
- @TODO: Cut a release on GitHub including the relevant CHANGELOG entry

View File

@@ -1,111 +0,0 @@
"use strict";
const fs = require("fs");
const resolve = require("path").resolve;
const spawn = require("child_process").spawn;
const { dirnames } = require("./local");
const { loadPackage, savePackage } = require("./local");
const { loadJson, saveJson } = require("./utils");
function run(progname, args, ignoreErrorStream) {
return new Promise((resolve, reject) => {
const proc = spawn(progname, args);
let stdout = Buffer.from([]);
let stderr = Buffer.from([]);
proc.stdout.on("data", (data) => {
stdout = Buffer.concat([ stdout, data ]);
});
proc.stderr.on("data", (data) => {
stderr = Buffer.concat([ stdout, data ]);
});
proc.on("error", (error) => {
console.log("ERROR");
console.log(stderr.toString());
error.stderr = stderr.toString();
error.stdout = stdout.toString();
reject(error);
});
proc.on("close", (code) => {
if ((stderr.length && !ignoreErrorStream) || code !== 0) {
console.log("ERROR");
console.log(stderr.toString());
let error = new Error(`stderr not empty: ${ progname } ${ JSON.stringify(args) }`);
error.stderr = stderr.toString();
error.stdout = stdout.toString();
error.statusCode = code;
reject(error);
} else {
resolve(stdout.toString());
}
});
});
}
function setupConfig(outDir, moduleType, targetType) {
// Configure the tsconfit.package.json...
const path = resolve(__dirname, "../tsconfig.package.json");
const content = loadJson(path);
content.compilerOptions.module = moduleType;
content.compilerOptions.target = targetType;
saveJson(path, content);
// Configure the browser field for every pacakge, copying the
// browser.umd filed for UMD and browser.esm for ESM
dirnames.forEach((dirname) => {
let info = loadPackage(dirname);
if (info._ethers_nobuild) { return; }
if (targetType === "es2015") {
if (info["browser.esm"]) {
info.browser = info["browser.esm"];
}
} else if (targetType === "es5") {
if (info["browser.umd"]) {
info.browser = info["browser.umd"];
}
} else {
throw new Error("unsupported target");
}
savePackage(dirname, info);
let path = resolve(__dirname, "../packages", dirname, "tsconfig.json");
let content = loadJson(path);
content.compilerOptions.outDir = outDir;
saveJson(path, content);
});
}
function setupBuild(buildModule) {
if (buildModule) {
setupConfig("./lib.esm/", "es2015", "es2015");
} else {
setupConfig("./lib/", "commonjs", "es5");
}
}
function runBuild(buildModule) {
setupBuild(buildModule);
// Compile
return run("npx", [ "tsc", "--build", resolve(__dirname, "../tsconfig.project.json"), "--force" ]);
}
function runDist() {
return run("npm", [ "run", "_dist" ], true);
}
module.exports = {
run: run,
runDist: runDist,
runBuild: runBuild,
setupBuild: setupBuild
};

View File

@@ -1,145 +0,0 @@
"use strict";
const fs = require("fs");
const resolve = require("path").resolve;
const git = require("./git");
const local = require("./local");
const npm = require("./npm");
const utils = require("./utils");
const ChangelogPath = resolve(__dirname, "../CHANGELOG.md");
async function generate() {
// Get each section of the Changelog
let existing = fs.readFileSync(ChangelogPath).toString().split("\n");
let sections = [ ];
let lastLine = existing[0];
existing.slice(1).forEach((line) => {
if (line.substring(0, 5) === "=====" || line.substring(0, 5) === "-----") {
sections.push({
title: lastLine,
underline: line.substring(0, 1),
body: [ ]
});
lastLine = null;
return;
} else if (lastLine) {
sections[sections.length - 1].body.push(lastLine);
}
lastLine = line;
});
sections[sections.length - 1].body.push(lastLine);
let lastVersion = await npm.getPackageVersion("ethers");
let logs = await git.run([ "log", (lastVersion.gitHead + "..") ]);
let changes = [ ];
logs.split("\n").forEach((line) => {
if (line.toLowerCase().substring(0, 6) === "commit") {
changes.push({
commit: line.substring(6).trim(),
body: [ ]
});
} else if (line.toLowerCase().substring(0, 5) === "date:") {
changes[changes.length - 1].date = utils.getDateTime(new Date(line.substring(5).trim()));
} else if (line.substring(0, 1) === " ") {
line = line.trim();
if (line === "") { return; }
changes[changes.length - 1].body += line + " ";
}
});
// @TODO:
// ethers/version ([date](tag))
let newSection = {
title: `ethers/v${ local.loadPackage("ethers").version } (${utils.getDateTime(new Date())})`,
underline: "-",
body: [ ]
}
// Delete duplicate sections for the same version (ran update multiple times)
while (sections[1].title === newSection.title) {
sections.splice(1, 1);
}
changes.forEach((change) => {
let body = change.body.trim();
let link = body.match(/(\((.*#.*)\))/)
let commit = `[${ change.commit.substring(0, 7) }](https://github.com/ethers-io/ethers.js/commit/${ change.commit })`;
if (link) {
body = body.replace(/ *(\(.*#.*)\) */, "");
link = link[2].replace(/#([0-9]+)/g, (all, issue) => {
return `[#${ issue }](https://github.com/ethers-io/ethers.js/issues/${ issue })`;
}) + "; " + commit;
} else {
link = commit;
}
newSection.body.push(` - ${ body } (${ link })`);
});
sections.splice(1, 0, newSection);
let formatted = [ ];
sections.forEach((section) => {
formatted.push(section.title);
formatted.push(utils.repeat(section.underline, section.title.length));
formatted.push("");
section.body.forEach((line) => {
line = line.trim();
if (line === "") { return; }
if (line.substring(0, 1) === "-") {
line = "- " + line.substring(1).trim();
}
if (section.underline === "-") {
line = " " + line;
}
formatted.push(line);
});
formatted.push("");
});
return formatted.join("\n") + "\n";
}
function getChanges() {
const changes = [ ];
let lastLine = null;
fs.readFileSync(ChangelogPath).toString().split("\n").forEach((line) => {
line = line.trim();
if (line === "") { return; }
if (line.substring(0, 5) === "-----") {
changes.push({ title: lastLine, lines: [ ] });
} else if (line.substring(0, 1) === "-" && changes.length) {
changes[changes.length - 1].lines.push(line);
}
lastLine = line;
});
return changes;
}
function latestChange() {
const recent = getChanges()[0];
const match = recent.title.match(/ethers\/([^\(]*)\(([^\)]*)\)/);
return {
title: recent.title,
version: match[1].trim(),
data: match[2].trim(),
content: recent.lines.join("\n")
};
}
module.exports = {
generate: generate,
latestChange: latestChange,
ChangelogPath: ChangelogPath,
}

View File

@@ -1,142 +0,0 @@
"use strict";
const { colorify } = require("../log");
const { getIssues } = require("../github");
const { repeat } = require("../utils");
const Options = {
"body": 1,
"end": 1,
"issue": 1,
"start": 1,
"title": 1,
"user": 1,
};
const Flags = {
"open": 1,
"match-case": 1,
};
(async function() {
const options = { };
for (let i = 2; i < process.argv.length; i++) {
const option = process.argv[i];
if (option.substring(0, 2) === "--") {
const comps = option.substring(2).split(/=/);
if (Flags[comps[0]]) {
if (comps[1] != null) { throw new Error("Invalid flag: " + option); }
options[comps[0]] = true;
} else if (Options[comps[0]]) {
if (comps[1] == null) {
options[comps[0]] = process.argv[++i];
if (options[comps[0]] == null) {
throw new Error("Missing option value: " + option);
}
} else {
options[comps[0]] = comps[1];
}
} else {
throw new Error("Unexpected option: " + option);
}
} else {
throw new Error("Unexpected argument: " + option);
}
}
if (options["title"]) { options.title = new RegExp(options.title, (options["match-case"] ? "": "i")); }
if (options["body"]) { options.body = new RegExp(options.title, (options["match-case"] ? "": "i")); }
if (options["start"]) {
if (options["start"].match(/^[0-9]{4}-[0-9]{2}-[0-9{2}]$/)) {
throw new Error("Expected YYYY-MM-DD");
}
}
if (options["end"]) {
if (options["end"].match(/^[0-9]{4}-[0-9]{2}-[0-9{2}]$/)) {
throw new Error("Expected YYYY-MM-DD");
}
}
const count = { issues: 0, comments: 0, code: 0, responses: 0 };
const issues = await getIssues();
issues.forEach((issue) => {
const info = issue.issue;
const comments = issue.comments;
if (options.issue && parseInt(options.issue) != info.number) { return; }
if (options.open && info.state !== "open") { return; }
if (options.title && !info.title.match(options.title)) { return; }
if (options.body) {
const body = info.body + "\n" + comments.map((c) => (c.body)).join("\n");
if (!body.match(options.body)) {
return;
}
}
if (options.user) {
const users = comments.map((c) => (c.user.login));
users.push(info.user.login);
if (users.indexOf(options.user) === -1) {
return;
}
}
const dates = comments.map((c) => (c.created_at.split("T")[0]));
dates.push(info.created_at.split("T")[0]);
if (options.start) {
if (dates.filter((d) => (d >= options.start)).length === 0) { return; }
}
if (options.end) {
if (dates.filter((d) => (d <= options.start)).length === 0) { return; }
}
count.issues++;
console.log(colorify(repeat("=", 70), "bold"))
console.log(colorify("Issue:", "bold"), info.title, ` (#${ info.number })`);
console.log(colorify("User:","bold"), colorify(info.user.login, "blue"));
console.log(colorify("State:", "bold"), info.state);
if (info.created_at === info.updated_at) {
console.log(colorify("Created:", "bold"), info.created_at);
} else {
console.log(colorify("Created:", "bold"), info.created_at, ` (updated: ${ info.updated_at })`);
}
info.body.trim().split("\n").forEach((line) => {
console.log(" " + line);
});
if (comments.length) {
comments.forEach((info) => {
if (options.start && info.created_at < options.start) { return ; }
if (options.end && info.created_at > options.end) { return; }
count.comments++;
if (options.user && info.user.login !== options.user) { return; }
count.responses++;
if (info.body.indexOf("`") >= 0) { count.code++; }
console.log(colorify(repeat("-", 70), "bold"));
console.log(colorify("User:", "bold"), colorify(info.user.login, "green"));
if (info.created_at === info.updated_at) {
console.log(colorify("Created:", "bold"), info.created_at);
} else {
console.log(colorify("Created:", "bold"), info.created_at, ` (updated: ${ info.updated_at })`);
}
info.body.trim().split("\n").forEach((line) => {
console.log(" " + line);
});
});
}
});
console.log(colorify(repeat("=", 70), "bold"))
// @TODO: Add stats on new/closed issues
//if (options.user) {
// console.log(`${ count.responses } responses (${ count.code } w/ code) on ${ count.comments } comments across ${ count.issues } issues.`);
//} else {
console.log(`${ count.comments } comment${ (count.comments !== 1) ? "s": "" } across ${ count.issues } issue${ (count.issues !== 1) ? "s": ""}.`);
//}
})().catch((error) => {
console.log("Error: " + error.message);
});

View File

@@ -1,41 +0,0 @@
"use strict";
const { getOrdered, loadPackage } = require("../depgraph");
const { savePackage } = require("../local");
const { log } = require("../log");
(async function() {
let versions = { };
const dirnames = getOrdered();
dirnames.forEach((dirname) => {
let info = loadPackage(dirname);
if (info.name.split("/")[0] === "@ethersproject" || info.name === "ethers") {
versions[info.name] = info.version;
}
});
dirnames.forEach((dirname) => {
const info = loadPackage(dirname);
let shown = false;
["dependencies", "devDependencies"].forEach((key) => {
const deps = info[key];
if (!deps) { return; }
Object.keys(deps).forEach((name) => {
if (versions[name] == null) { return; }
const value = ">=" + versions[name];
if (value !== deps[name])
if (!deps[name]) { return; }
if (!shown) {
log(`<bold:Locking ${ info.name }:>`);
shown = true;
}
log(` <green:${ name }>: ${ deps[name] } => <bold:${ value.substring(2) }>`);
deps[name] = value;
});
});
savePackage(dirname, info);
});
})();

View File

@@ -1,117 +0,0 @@
"use strict";
const config = require("../config");
const { ChangelogPath, latestChange } = require("../changelog");
const { getOrdered, loadPackage } = require("../depgraph");
const { getGitTag } = require("../git");
const { createRelease } = require("../github");
const { getPackageVersion, publish } = require("../npm");
const { log } = require("../log");
const USER_AGENT = "ethers-dist@0.0.0";
const TAG = "next";
let dirnames = getOrdered();
// Only publish specific packages
if (process.argv.length > 2) {
let filter = process.argv.slice(2);
// Verify all named packages exist
filter.forEach((dirname) => {
try {
loadPackage(dirname);
} catch (error) {
console.log("Package not found: " + dirname);
process.exit(1);
}
});
// Filter out pacakges we don't care about
dirnames = dirnames.filter((dirname) => (filter.indexOf(dirname) >= 0));
}
(async function() {
let token = null;
const gitCommit = await getGitTag(ChangelogPath);
let includeEthers = false;
// @TODO: Fail if there are any untracked files or unchecked in files
// Load the token from the encrypted store
try {
token = await config.get("npm-token");
} catch (error) {
switch (error.message) {
case "wrong password":
log("<bold:Wrong password>");
break;
case "cancelled":
break;
default:
console.log(error);
}
log("<red:Aborting.>");
return;
}
token = token.trim().split("=");
let options = {
npmVersion: USER_AGENT,
tag: TAG
};
// Set the authentication token
options[token[0]] = token[1];
for (let i = 0; i < dirnames.length; i++) {
let dirname = dirnames[i];
if (dirname === "ethers") {
options.tag = "next";
includeEthers = true;
} else {
options.tag = "latest";
}
let info = loadPackage(dirname);
let npmInfo = await getPackageVersion(info.name);
if (!npmInfo) { npmInfo = { version: "NEW" }; }
if (info.tarballHash === npmInfo.tarballHash) { continue; }
log(`<bold:Publishing:> ${info.name}...`);
log(` <blue:Version:> ${npmInfo.version} <bold:=\\>> ${info.version}`);
let success = await publish(dirname, options);
if (!success) {
log(" <red:FAILED! Aborting.>");
return;
}
log(" <green:Done.>");
}
// Publish the GitHub release (currently beta)
const beta = true;
if (includeEthers) {
// The password above already succeeded
const username = await config.get("github-user");
const password = await config.get("github-release");
// Get the latest change from the changelog
const change = latestChange();
// Publish the release
const link = await createRelease(username, password, change.version, change.title, change.content, beta, gitCommit);
log(`<bold:Published Release:> ${ link }`);
}
})();

View File

@@ -1,5 +0,0 @@
"use strict";
const { setupBuild } = require("../build");
setupBuild(false);

View File

@@ -1,16 +0,0 @@
"use strict";
const { prompt } = require("../../packages/cli");
const config = require("../config");
if (process.argv.length !== 3) {
console.log("Usage: set-config KEY");
process.exit(1);
}
const key = process.argv[2];
(async function() {
const value = await prompt.getPassword("Value: ");
await config.set(key, value);
})();

View File

@@ -1,37 +0,0 @@
const { setupBuild } = require("../build");
const { loadPackage, savePackage } = require("../local");
const arg = process.argv[2];
(async function() {
process.argv.slice(2).forEach((arg) => {
console.log("Setting Option:", arg);
switch(arg) {
case "esm":
setupBuild(true);
break;
case "cjs":
setupBuild(false);
break;
// This will remove the browser field entirely, so make sure
// to set esm of cjs first as they will restore the browser
// field
case "browser-lang-all": {
const info = loadPackage("wordlists");
delete info.browser;
savePackage("wordlists", info);
break;
}
default:
console.log("Unknown option:", arg);
return 1;
}
});
return 0;
})().then((result) => {
process.exit(result);
});

View File

@@ -1,16 +0,0 @@
"use stricT";
const depgraph = require("../depgraph");
const { log } = require("../log");
const { loadJson, resolve, saveJson } = require("../utils");
(async function() {
log(`<bold:Updating dependency-graph build order (tsconfig.project.json)...>`);
let ordered = depgraph.getOrdered(true);
let path = resolve("tsconfig.project.json")
let projectConfig = loadJson(path);
projectConfig.references = ordered.map((name) => ({ path: ("./packages/" + name) }));
saveJson(path, projectConfig);
})();

View File

@@ -1,30 +0,0 @@
"use strict";
const fs = require("fs");
const { resolve } = require("path");
const sourceEthers = fs.readFileSync(resolve(__dirname, "../../packages/ethers/src.ts/ethers.ts")).toString();
const targets = sourceEthers.match(/export\s*{\s*((.|\s)*)}/)[1].trim();
const output = `"use strict";
// To modify this file, you must update ./admin/cmds/update-exports.js
import * as ethers from "./ethers";
try {
const anyGlobal = (window as any);
if (anyGlobal._ethers == null) {
anyGlobal._ethers = ethers;
}
} catch (error) { }
export { ethers };
export {
${ targets }
} from "./ethers";
`;
fs.writeFileSync(resolve(__dirname, "../../packages/ethers/src.ts/index.ts"), output);

View File

@@ -1,146 +0,0 @@
"use strict";
// Expected this to be run after
// - npm run clean
// - npm run bootstrap
// - npm run build
const fs = require("fs");
const semver = require("semver");
const { runBuild, runDist } = require("../build");
const { ChangelogPath, generate } = require("../changelog");
const { getOrdered, loadPackage } = require("../depgraph");
const { getDiff, getStatus, getGitTag } = require("../git");
const { updatePackage } = require("../local");
const { getPackageVersion } = require("../npm");
const { resolve } = require("../utils");
const { colorify, log } = require("../log");
const { prompt } = require("../../packages/cli");
let dirnames = getOrdered();
// Only publish specific packages
if (process.argv.length > 2) {
let filter = process.argv.slice(2);
// Verify all named packages exist
filter.forEach((dirname) => {
try {
loadPackage(dirname);
} catch (error) {
console.log("Package not found: " + dirname);
process.exit(1);
}
});
// Filter out pacakges we don't care about
dirnames = dirnames.filter((dirname) => (filter.indexOf(dirname) >= 0));
}
(async function() {
let progress = prompt.getProgressBar(colorify("Updating versions", "bold"));
for (let i = 0; i < dirnames.length; i++) {
progress(i / dirnames.length);
let dirname = dirnames[i];
let path = resolve("packages", dirname);
// Get local package.json (update the tarballHash)
let info = await updatePackage(dirname);
// Get the remote package.json (or sub in a placeholder for new pacakges)
let npmInfo = await getPackageVersion(info.name);
if (!npmInfo) { npmInfo = { version: "NEW" }; }
if (info.tarballHash === npmInfo.tarballHash) { continue; }
// Bump the version if necessary
if (info.version === npmInfo.version) {
let newVersion = semver.inc(info.version, "prerelease", "beta");
// Write out the _version.ts
if (!info._ethers_nobuild) {
let code = "export const version = " + JSON.stringify(dirname + "/" + newVersion) + ";\n";
fs.writeFileSync(resolve(path, "src.ts/_version.ts"), code);
}
// Update the package.json (we do this after _version, so if we fail,
// this remains old; which is what triggers the version bump)
info = await updatePackage(dirname, { version: newVersion });
}
}
progress(1);
try {
log("<bold:Building TypeScript source (es6)...>");
await runBuild(true);
log("<bold:Building TypeScript source (commonjs)...>");
await runBuild(false);
log("<bold:Building distribution files...>");
let content = await runDist();
console.log(content);
} catch (error) {
console.log(error);
log("<red:Aborting.>");
return;
}
// Update the tarball hash now that _version and package.json may have changed.
progress = prompt.getProgressBar(colorify("Updating tarballHash", "bold"));
for (let i = 0; i < dirnames.length; i++) {
progress(i / dirnames.length);
await updatePackage(dirnames[i]);
}
progress(1);
// Show the changed files (compared to npm)
for (let i = 0; i < dirnames.length; i++) {
let dirname = dirnames[i];
// Get local package.json
let info = await loadPackage(dirname);
let path = resolve("packages/", dirname);
// Get the remote package.json (or sub in a placeholder for new pacakges)
let npmInfo = await getPackageVersion(info.name);
if (!npmInfo) { npmInfo = { version: "NEW" }; }
// No change
if (info.tarballHash === npmInfo.tarballHash) { continue; }
let gitHead = await getGitTag(path);
log(`<bold:Package>: ${info.name}`);
log(` <green:Tarball Changed:> (bumping version)`);
log(` ${npmInfo.version} => ${info.version}`)
log(` <blue:Changed:>`);
let filenames = await getDiff(path, npmInfo.gitHead, true);
filenames.forEach((filename) => {
let short = filename.split("/").slice(1).join("/");
if (short.indexOf("/src.ts/") >= 0 || short.indexOf("/dist/") >= 0) {
log(` <bold:${short}>`);
} else {
log(` ${short}`);
}
});
log("");
}
let existing = fs.readFileSync(ChangelogPath).toString();
let changelog = await generate();
if (existing !== changelog) {
let changelogStatus = await getStatus(ChangelogPath);
if (changelogStatus !== "unmodified") {
log("<bold:WARNING:> There are local changes to the CHANGELOG (they will be discarded)");
console.log(existing);
}
log("<bold:Updating CHANGELOG>...");
fs.writeFileSync(ChangelogPath, changelog);
}
})();

View File

@@ -1,120 +0,0 @@
"use strict";
const fs = require("fs");
const os = require("os");
const resolve = require("path").resolve;
const AES = require("aes-js");
const scrypt = require("scrypt-js");
const { prompt } = require("../packages/cli");
const randomBytes = require("../packages/random").randomBytes;
const computeHmac = require("../packages/sha2").computeHmac;
const colorify = require("./log").colorify;
function getScrypt(message, password, salt) {
let progressBar = prompt.getProgressBar(message);
return scrypt.scrypt(Buffer.from(password), Buffer.from(salt), (1 << 17), 8, 1, 64, progressBar);
}
function Config(filename) {
this.salt = null;
this.dkey = null;
this.values = { };
this.canary = "";
this.filename = filename;
}
Config.prototype.load = async function() {
if (this.dkey) { return; }
let data = null;
if (fs.existsSync(this.filename)) {
data = JSON.parse(fs.readFileSync(this.filename));
} else {
data = {
salt: Buffer.from(randomBytes(32)).toString("hex")
};
}
this.canary = data.canary || "";
this.salt = data.salt;
const password = await prompt.getPassword(colorify("Password (config-store): ", "bold"));
this.dkey = await getScrypt(colorify("Unlocking config", "bold"), password, this.salt);
if (data.ciphertext) {
const ciphertext = Buffer.from(data.ciphertext, "base64");
const iv = Buffer.from(data.iv, "base64");
const aes = new AES.ModeOfOperation.ctr(this.dkey.slice(0, 32), new AES.Counter(iv));
const plaintext = aes.decrypt(ciphertext);
const hmac = computeHmac("sha512", this.dkey.slice(32, 64), plaintext);
if (hmac !== data.hmac) {
throw new Error("wrong password");
}
this.values = JSON.parse(Buffer.from(plaintext).toString());
}
};
Config.prototype.keys = async function() {
await this.load();
return Object.keys(this.values);
}
Config.prototype.save = function() {
this.values._junk = Buffer.from(randomBytes(16 + parseInt(Math.random() * 48))).toString("base64")
const plaintext = Buffer.from(JSON.stringify(this.values));
const iv = Buffer.from(randomBytes(16));
const hmac = computeHmac("sha512", this.dkey.slice(32, 64), plaintext);
const aes = new AES.ModeOfOperation.ctr(this.dkey.slice(0, 32), new AES.Counter(iv));
const ciphertext = Buffer.from(aes.encrypt(plaintext));
const data = {
ciphertext: ciphertext.toString("base64"),
iv: iv.toString("base64"),
salt: this.salt,
hmac: hmac,
canary: this.canary
};
fs.writeFileSync(this.filename, JSON.stringify(data, null, 2));
}
Config.prototype.get = async function(key) {
await this.load();
return this.values[key];
};
Config.prototype.set = async function(key, value) {
await this.load();
this.values[key] = value;
this.save();
};
Config.prototype.lock = function() {
this.salt = this.dkey = null;
}
const config = new Config(resolve(os.homedir(), ".ethers-dist"));
module.exports = {
get: function(key) {
return config.get(key);
},
set: function(key, value) {
config.set(key, value);
},
keys: function() {
return config.keys();
},
lock: function() {
config.lock();
}
}

View File

@@ -1,94 +0,0 @@
"use strict";
const fs = require("fs");
const { loadJson, resolve } = require("./utils");
const ROOT = resolve("packages");
const dirnames = fs.readdirSync(ROOT);
function loadPackage(dirname) {
return loadJson(resolve("packages", dirname, "package.json"));
}
function getOrdered(skipNobuild) {
let packages = { };
let filenames = { };
let addDeps = (name, depends) => {
Object.keys(depends).forEach((dep) => {
// Not a package we manage
if (packages[dep] == null) { return; }
deps[name][dep] = true;
});
}
for (let i = 0; i < dirnames.length; i++) {
let dirname = dirnames[i];
let info = loadPackage(dirname);
if (skipNobuild && info._ethers_nobuild) { continue; }
packages[info.name] = info;
filenames[info.name] = dirname;
}
// Maps names to list of dependencies; { [ name:string]: Array<name: string> }
let deps = { };
let depGraph = { };
Object.keys(packages).forEach((name) => {
let info = packages[name];
deps[info.name] = { };
addDeps(info.name, info.dependencies || { });
addDeps(info.name, info.devDependencies || { });
deps[info.name] = Object.keys(deps[info.name]);
deps[info.name].sort();
});
let ordered = [ ];
let remaining = Object.keys(deps);
let isSatisfied = (name) => {
for (let i = 0; i < deps[name].length; i++) {
if (ordered.indexOf(deps[name][i]) === -1) { return false; }
}
return true;
}
while (remaining.length) {
let bail = true;
for (let i = 0; i < remaining.length; i++) {
if (!isSatisfied(remaining[i])) { continue; }
bail = false;
ordered.push(remaining[i]);
remaining.splice(i, 1);
break;
}
if (bail) {
throw new Error("Nothing processed; circular dependencies...");
}
}
return ordered.map((name) => filenames[name]);
}
function sort(dirnames) {
let ordered = getOrdered();
dirnames.sort((a, b) => {
let ai = ordered.indexOf(local.loadPackage(a).name);
let bi = ordered.indexOf(local.loadPackage(b).name);
if (ai === -1 || bi === -1) {
throw new Error("unknown dirname - " + [a, b].join(", "));
}
return ai - bi;
});
}
module.exports = {
dirnames: dirnames,
getOrdered: getOrdered,
loadPackage: loadPackage,
ROOT: ROOT,
sort: sort
}

View File

@@ -1,186 +0,0 @@
"use strict";
const resolve = require("path").resolve;
const spawn = require("child_process").spawn;
const semver = require("semver");
const { run } = require("./build");
const { loadPackage } = require("./local");
function git(args) {
return run("git", args);
}
function getStatus(filename) {
return git([ "status", "-s", resolve(__dirname, "..", filename) ]).then((result) => {
result = result.trim();
if (result === "") { return "unmodified"; }
switch (result.substring(0, 2)) {
case 'M ': return "modified";
case 'A ': return "added";
case 'D ': return "deleted";
case 'R ': return "renamed";
case 'C ': return "copied";
case 'U ': return "updated";
case '??': return "untracked";
}
console.log(result);
return "unknown";
});
}
async function getChanges(latest) {
let diff = await git(["diff", "--name-only", latest ]);
// Map dirname => { dist: [ ], src: [ ] }
let changes = { "_": { filename: "_", dist: [], src: [] } };
diff.split("\n").forEach((line) => {
// e.g. packages/constants/index.d.ts
let comps = line.trim().split("/");
// Track non-packages as dist
if (comps.length < 2 || comps[0] !== "packages") {
let filename = comps.join("/").trim();
if (filename === "") { return; }
changes._.dist.push(filename);
return;
}
let name = loadPackage(comps[1]).name;
let change = changes[name];
if (!change) {
change = { filename: comps[1], dist: [ ], src: [ ] }
changes[name] = change;
}
// Split changes into source changes (src.ts/) or dist changes (output of TypeScript)
if (comps[2] === "src.ts") {
change.src.push(comps.join("/"));
} else {
change.dist.push(comps.join("/"));
}
});
return changes;
}
function getLatestTag() {
let seq = Promise.resolve();
// @TODO: Pull
if (false) {
seq = seq.then(() => {
console.log("Pulling remote changes...");
return git([ "pull" ]);
});
}
seq = seq.then(() => {
return git([ "tag" ]).then((tags) => {
tags = tags.split("\n").filter(tag => (tag.match(/^v[0-9]+\.[0-9]+\.[0-9]+\-/)));
tags.sort(semver.compare)
return tags.pop();
});
});
return seq;
}
function findChanges(latest) {
let seq = Promise.resolve();
seq = seq.then(() => {
return git(["diff", "--name-only", latest, "HEAD" ]).then((result) => {
let filenames = { };
result.split("\n").forEach((line) => {
// e.g. packages/constants/index.d.ts
let comps = line.trim().split("/");
if (comps.length < 2) { return; }
filenames[comps[1]] = true;
});
return Object.keys(filenames);
});
});
seq = seq.then((filenames) => {
return filenames.map((filename) => {
let name = packages[filename].name;
return {
filename: filename,
name: name,
localVersion: getLocalVersion(name),
}
});
});
seq = seq.then((packages) => {
let seq = Promise.resolve();
packages.forEach((p) => {
seq = seq.then(() => {
return getNpmVersion(p.name).then((version) => {
p.npmVersion = version;
});
});
});
return seq.then(() => packages);
});
return seq;
}
async function getGitTag(filename) {
let result = await git([ "log", "-n", "1", "--", filename ]);
result = result.trim();
if (!result) { return null; }
result = result.match(/^commit\s+([0-9a-f]{40})\n/i);
if (!result) { return null; }
return result[1];
}
async function getDiff(filename, tag, nameOnly) {
if (tag == null) { tag = "HEAD"; }
let cmd = [ "diff", "--name-only", tag, "--", filename ]
if (!nameOnly) { cmd.splice(1, 1); }
try {
let result = await git(cmd);
result = result.trim();
if (result === "") { return [ ]; }
return result.split("\n");
} catch (error) {
// This tag does not exist, so compare against beginning of time
// This happens when there is a new history (like an orphan branch)
if (error.stderr.trim().match(/^fatal: bad object/)) {
console.log("Could not find history; showing all");
let cmd = [ "rev-list", "--max-parents=0", "HEAD" ];
let tag = await git(cmd);
return getDiff(filename, tag.trim(), nameOnly);
}
throw error;
}
}
async function getUntracked(filename) {
let cmd = [ "ls-files", "-o", "--exclude-standard"];
if (filename) {
cmd.push("--");
cmd.push(filename);
}
let result = await git(cmd);
result = result.trim();
if (result === "") { return [ ]; }
return result.split("\n");
}
module.exports = {
findChanges: findChanges,
getChanges: getChanges,
getDiff: getDiff,
getGitTag: getGitTag,
getLatestTag: getLatestTag,
getStatus: getStatus,
getUntracked: getUntracked,
run: git,
}

View File

@@ -1,162 +0,0 @@
"use strict";
const fs = require("fs");
const { resolve } = require("path");
const zlib = require("zlib");
const { id } = require("../packages/hash");
const { fetchJson } = require("../packages/web");
const CacheDir = resolve(__dirname, "../github-cache/");
function addResponse(result, response) {
return { result, response };
}
function loadFile(filename) {
return JSON.parse(zlib.gunzipSync(fs.readFileSync(filename)).toString());
//return JSON.parse(fs.readFileSync(filename).toString());
}
// @TODO: atomic
function saveFile(filename, content) {
fs.writeFileSync(filename, zlib.gzipSync(JSON.stringify(content)));
//fs.writeFileSync(filename, JSON.stringify(content));
}
function mockFetchJson(url, body, headers) {
return {
result: null,
response: {
statusCode: 304
}
}
}
async function _fetchGitHub(user, password, fetchJson, url) {
const result = [ ];
while (true) {
const filename = resolve(CacheDir, id(url).substring(2, 14));
const headers = {
"User-Agent": "ethers-io",
};
let items = null;
let link = null;
try {
const data = loadFile(filename);
headers["if-none-match"] = data.etag;
items = data.items;
link = data.link;
} catch (error) {
if (error.code !== "ENOENT") { throw error; }
}
const fetch = await fetchJson({
url: url,
user: user,
password: password,
headers: headers
}, null, addResponse);
// Cached response is good; use it!
if (fetch.response.statusCode !== 304) {
items = fetch.result;
if (fetch.response.headers) {
link = (fetch.response.headers.link || null);
}
if (fetch.response.headers.etag){
saveFile(filename, {
timestamp: (new Date()).getTime(),
url: url,
link: link,
etag: fetch.response.headers.etag,
items: items,
version: 1
});
}
}
items.forEach((item) => { result.push(item)});
url = null;
(link || "").split(",").forEach((item) => {
if (item.indexOf('rel="next"') >= 0) {
const match = item.match(/<([^>]*)>/);
if (match) { url = match[1]; }
}
});
if (!url) { break; }
}
return result;
}
async function fetchGitHub(user, password, url, cacheOnly) {
if (cacheOnly) {
return await _fetchGitHub("none", "none", mockFetchJson, url);
}
const results = await _fetchGitHub(user, password, fetchJson, url);
return results;
}
async function _getIssues(user, password) {
const cacheOnly = (user == null);
let issues = await fetchGitHub(user, password, "https:/\/api.github.com/repos/ethers-io/ethers.js/issues?state=all&per_page=100", cacheOnly)
if (!cacheOnly) { console.log(`Found ${ issues.length } issues`); }
const result = [ ];
for (let i = 0; i < issues.length; i++) {
const issue = issues[i];
let comments = await fetchGitHub(user, password, issue.comments_url, cacheOnly);
result.push({ issue, comments});
if (!cacheOnly) { console.log(` Issue ${ issue.number }: ${ comments.length } comments`); }
}
result.sort((a, b) => (a.issue.number - b.issue.number));
return result;
}
function getIssues() {
return _getIssues();
}
function syncIssues(user, password) {
return _getIssues(user, password);
}
async function createRelease(user, password, tagName, title, body, prerelease, commit) {
const payload = {
tag_name: tagName,
target_commitish: (commit || "master"),
name: title,
body: body,
//draft: true,
draft: false,
prerelease: !!prerelease
};
const headers = {
"User-Agent": "ethers-io",
};
const result = await fetchJson({
url: "https://api.github.com/repos/ethers-io/ethers.js/releases",
user: user,
password: password,
headers: headers
}, JSON.stringify(payload));
return result.html_url;
}
module.exports = {
getIssues,
syncIssues,
createRelease,
}

View File

@@ -1,401 +0,0 @@
"use strict";
const fs = require("fs");
const resolve = require("path").resolve;
const diff = require("diff");
const semver = require("semver");
const { prompt } = require("../packages/cli");
const build = require("./build");
const changelog = require("./changelog");
const depgraph = require("./depgraph");
const { colorify, colorifyStatus, log } = require("./log");
const config = require("./config")
const git = require("./git");
const local = require("./local");
const npm = require("./npm");
const utils = require("./utils");
/*
async function runChanged(dirnames, callback) {
try {
await callback(dirname, info, npmInfo);
} catch (error) {
console.log(error);
console.log(colorify("Aborting! " + error.message));
return;
}
}
}
}
*/
/*
if (diff) {
} else {
*/
async function runDiff(dirnames) {
// Default to all packages
if (dirnames == null || dirnames.length === 0) { dirnames = local.dirnames; }
for (let i = 0; i < dirnames.length; i++) {
let dirname = dirnames[i];
// Get local (update the tarballHash) and remote package.json
let info = await local.loadPackage(dirname);
let npmInfo = await npm.getPackageVersion(info.name);
if (!npmInfo) { npmInfo = { gitHead: "HEAD", version: "NEW" }; }
let delta = await git.getDiff(resolve(__dirname, "../packages", dirname), npmInfo.gitHead);
if (delta.length === 0) { continue; }
// Bump the version if necessary
if (info.version === npmInfo.version) {
info.version = semver.inc(info.version, "prerelease", "beta");
}
console.log(colorify("<bold:Package>: ") + info.name);
console.log(colorify(" <green:Git Head Changed:> (run update to bump version)"));
console.log(" " + npmInfo.gitHead)
console.log(" " + npmInfo.version + colorify(" => ", "bold") + info.version)
console.log(colorify(" Diff", "bold"));
delta.forEach((line) => {
let color = "blue";
switch (line.substring(0, 1)) {
case '+':
color = "green";
break;
case '-':
color = "red";
break;
case ' ':
color = "normal";
break;
}
console.log(" " + colorify(line, color));
});
console.log("");
}
console.log("");
}
async function updateChangelog() {
let filename = resolve(local.ROOT, "../CHANGELOG.md");
let lastVersion = await git.getLatestTag();
let newVersion = "v" + local.getVersion("ethers");
let current = fs.readFileSync(filename).toString();
let log = await changelog.generate();
if (log === current) { return; }
let changes = diff.createTwoFilesPatch("CHANGELOG-old.md", "CHANGELOG.md", current, log, lastVersion, newVersion);
console.log(changes);
try {
let response = await prompt.getChoice(colorify("Accept changes?", "bold"), "yn", "n");
if (response === "n") { throw new Error("Not changing."); }
} catch (error) {
console.log("Abort: " + error.message);
return;
}
fs.writeFileSync(filename, log);
}
// Updates the dependency-graph (tsconfig.project.json) so the build order is correct
async function runUpdateDepgraph() {
log(`<bold:Updating dependency-graph build order (tsconfig.project.json)...>`);
let ordered = depgraph.getOrdered();
let path = resolve(local.ROOT, "../tsconfig.project.json")
let projectConfig = local.loadJson(path);
projectConfig.references = ordered.map((name) => ({ path: ("./packages/" + name) }));
local.saveJson(path, projectConfig);
}
async function runUpdate(dirnames) {
// Check for untracked files...
let untracked = [ ];
if (dirnames == null || dirnames.length === 0) {
dirnames = local.dirnames;
let filenames = await git.getUntracked(resolve(__dirname, ".."));
for (let i = 0; i < filenames.length; i++) {
untracked.push(filenames[i]);
}
} else {
for (let i = 0; i < dirnames.length; i++) {
let filenames = await git.getUntracked(resolve(local.ROOT, dirnames[i]));
for (let j = 0; j < filenames.length; j++) {
untracked.push(filenames[j]);
}
}
}
// Untracked files! Abort.
if (untracked.length) {
log("<bold:Untracked Files:>");
untracked.forEach((filename) => {
console.log(" " + filename);
});
log("<red:Aborting.>");
return;
}
log(`<bold:Run TypeScript build...>`);
await build.runBuild()
log("");
// @TODO: Root
// Update all the package.json and _version.ts
let progress = prompt.getProgressBar(colorify("Updating versions", "bold"));
for (let i = 0; i < dirnames.length; i++) {
progress(i / dirnames.length);
let dirname = dirnames[i];
let path = resolve(__dirname, "../packages/", dirname);
// Get local package.json (update the tarballHash)
let info = await local.updatePackage(dirname);
// Get the remote package.json (or sub in a placeholder for new pacakges)
let npmInfo = await npm.getPackageVersion(info.name);
if (!npmInfo) { npmInfo = { version: "NEW" }; }
if (info.tarballHash === npmInfo.tarballHash) { continue; }
// Bump the version if necessary
if (info.version === npmInfo.version) {
let newVersion = semver.inc(info.version, "prerelease", "beta");
// Write out the _version.ts
if (!info._ethers_skipPrepare) {
let code = "export const version = " + JSON.stringify(newVersion) + ";\n";
fs.writeFileSync(resolve(path, "src.ts/_version.ts"), code);
}
// Update the package.json (we do this after _version, so if we fail,
// this remains old; which is what triggers the version bump)
info = await local.updatePackage(dirname, { version: newVersion });
}
}
progress(1);
// Build the TypeScript sources
log("<bold:Runing TypeScript build...>");
try {
await build.runTsc();
} catch (error) {
console.log(error);
log("<red:Aborting.>");
return;
}
// Run the dist
// @TODO:
// Update the tarball hash now that _version and package.json may have changed.
progress = prompt.getProgressBar(colorify("Updating tarballHash", "bold"));
for (let i = 0; i < dirnames.length; i++) {
progress(i / dirnames.length);
await local.updatePackage(dirnames[i]);
}
progress(1);
// Show the changed files (compared to npm)
for (let i = 0; i < dirnames.length; i++) {
let dirname = dirnames[i];
// Get local package.json
let info = await local.loadPackage(dirname);
let path = resolve(__dirname, "../packages/", dirname);
// Get the remote package.json (or sub in a placeholder for new pacakges)
let npmInfo = await npm.getPackageVersion(info.name);
if (!npmInfo) { npmInfo = { version: "NEW" }; }
// No change
if (info.tarballHash === npmInfo.tarballHash) { continue; }
let gitHead = await git.getGitTag(path);
log(`<bold:Package>: ${info.name}`);
log(` <green:Tarball Changed:> (bumping version)`);
log(` ${npmInfo.version} => ${info.version}`)
log(` <blue:Changed:>`);
let filenames = await git.getDiff(resolve(__dirname, "../packages", dirname), npmInfo.gitHead, true);
filenames.forEach((filename) => {
let short = filename.split("/").slice(1).join("/");
if (short.indexOf("/src.ts/") >= 0) {
log(` <bold:${short}>`);
} else {
log(` ${short}`);
}
});
log("");
}
// @TODO: Changelog
await updateChangelog();
}
async function runAdd(type, names) {
let latest = await git.getLatestTag();
console.log("");
console.log(colorify("<bold:Latest Published>: ") + latest);
console.log("");
let changes = await git.getChanges("HEAD");
if (!names || names.length === 0) {
names = Object.keys(changes);
}
let filenames = [ ];
for (let i = 0; i < names.length; i++) {
let name = names[i];
let change = changes[name] || changes[(packages[name] || {}).name];
if (!change) { return; }
change[type].forEach((filename) => {
filenames.push(filename);
});
}
if (filenames.length === 0) {
console.log(colorify("<bold:Nothing to add.>"));
console.log("");
return;
}
for (let i = 0; i < filenames.length; i++) {
let filename = filenames[i];
let status = await git.getStatus(filename);
console.log(" " + colorifyStatus(status) + ": " + utils.repeat(" ", 10 - status.length) + filename);
}
console.log("");
try {
let response = await prompt.getChoice(colorify("Add these files?", "bold"), "yn", "n");
if (response === "n") { throw new Error("Not adding."); }
} catch (error) {
console.log("Abort: " + error.message);
return;
}
let params = filenames.map((f) => f); //resolve(ROOT, f));
params.unshift("--");
params.unshift("add");
console.log("git " + params.join(" "));
try {
await git.run(params);
} catch (error) {
console.log("Error: (status: " + error.code + ")");
console.log(" " + error.stderr);
return;
}
console.log("Added.");
}
function runDist() {
// Run npm dist
// Generate changelog
// run status to update all the package
// add dist files?
}
async function runPublish(dirnames) {
// @TODO: Make sure there are no staged files
// @TODO: Make sure the repo has been pushed
// @TODO: Run the publish in the correct order
// Get the authentication token from our encrypted store
let token = await config.get("token");
token = token.trim().split("=");
let options = {
npmVersion: "ethers-dist@0.0.0",
tag: "next"
};
// Set the authentication token
options[token[0]] = token[1];
if (dirnames == null || dirnames.length === 0) { dirnames = local.dirnames; }
depgraph.sort(dirnames);
await runChanged(dirnames, async (dirname, info, npmInfo) => {
console.log(colorify("<bold:Publishing:> ") + info.name + "...")
console.log(colorify(" Version: ", "blue") + npmInfo.version + colorify(" => ", "bold") + info.version);
let success = await npm.publish(dirname, options);
if (!success) {
console.log(colorify(" <red:FAILED! Aborting.>"));
throw new Error("");
}
console.log(colorify(" <green:Done.>"));
});
}
async function runTest() {
let r = await git([ "tag", "--porcelain", "-a", "-m", "Title of Release\n\nHello\n-----\n\nTesting 4 **bold** #1\nHello World", "test6", "HEAD" ]);
console.log(r);
try {
r = await git([ "push", "--tags" ])
} catch(e) { console.log(e); }
console.log(r);
}
(function() {
let args = process.argv.slice(2);
switch (args[0]) {
// Compare published to current stage
case "diff":
return runDiff(args.slice(1));
// Add unchecked-in source files
case "add-source":
return runAdd("src", args.slice(1));
// Update all package.json. the changelog and dist files
case "update":
return runUpdate(args.slice(1));
// Update dependency graph (./tsconfig-project.json)
case "update-depgraph":
return runUpdateDepgraph();
// Add unchecked-in dist files
case "add-dist":
return runAdd("dist", args.slice(1));
// Add unchecked-in source files
case "changelog":
return updateChangelog();
// Add unchecked-in source files
case "publish":
return runPublish(args.slice(1));
case "test":
return runTest();
}
})();

View File

@@ -1,101 +0,0 @@
"use strict";
const packlist = require("npm-packlist");
const tar = require("tar");
const keccak256 = (function() {
try {
return require("../packages/keccak256").keccak256;
} catch (error) {
console.log("Cannot load Keccak256 (maybe not built yet? Not really a problem for most things)");
return null;
}
})();
const { dirnames, loadPackage, ROOT } = require("./depgraph");
const { resolve, saveJson } = require("./utils");
function sorted(obj) {
if (Array.isArray(obj)) { return obj.map(sorted); }
if (obj == null || typeof(obj) !== "object") { return obj; }
const keys = Object.keys(obj);
keys.sort();
const result = { };
keys.forEach((key) => { result[key] = sorted(obj[key]); });
return result;
}
function savePackage(dirname, info) {
return saveJson(resolve(ROOT, dirname, "package.json"), sorted(info));
}
async function createTarball(dirname) {
let base = resolve(ROOT, dirname);
// From NPM publish, create the packed version
let files = await packlist({ path: base });
files = files.map((f) => ("./" + f));
let options = {
cwd: base,
prefix: 'package/',
portable: true,
sync: true,
// Provide a specific date in the 1980s for the benefit of zip,
// which is confounded by files dated at the Unix epoch 0.
mtime: new Date('1985-10-26T08:15:00.000Z'),
gzip: true
};
// Take the hash of the package sans
return tar.create(options, files).read();
}
async function updatePackage(dirname, values) {
let info = loadPackage(dirname);
if (values) {
for (let key in values) {
info[key] = values[key];
}
}
/*
["dependencies", "devDependencies"].forEach((key) => {
let deps = info[key] || [];
for (let name in deps) {
if (name.substring(0, "@ethersproject".length) === "@ethersproject" || name === "ethers") {
deps[name] = ">5.0.0-beta.0";
}
}
});
*/
//if (dirname !== "ethers") {
// delete info.publishConfig.tag;
//}
// Create a normalized version sans tarballHash to compute the tarballHash
delete info.tarballHash;
savePackage(dirname, info);
// Compute the tarballHash
let tarball = await createTarball(dirname);
info.tarballHash = keccak256(tarball);
// Save the updated package.json to disk
savePackage(dirname, info);
return info;
}
module.exports = {
ROOT: ROOT,
createTarball: createTarball,
dirnames: dirnames,
getVersion: function(dirname) { return ((loadPackage(dirname) || {}).version || null); },
loadPackage: loadPackage,
savePackage: savePackage,
updatePackage: updatePackage,
}

View File

@@ -1,53 +0,0 @@
"use strict";
function getColor(color) {
if (!color || color === "normal") { return "\x1b[0m"; }
return "\x1b[1m" + ({
blue: "\x1b[34m",
cyan: "\x1b[36m",
green: "\x1b[32m",
magenta: "\x1b[35m",
red: "\x1b[31m",
yellow: "\x1b[33m",
bold: ""
})[color];
}
// See: https://stackoverflow.com/questions/9781218/how-to-change-node-jss-console-font-color
let disableColor = !(process.stdout.isTTY);
function colorify(message, color) {
if (color) {
if (disableColor) { return message; }
return getColor(color) + message + getColor();
}
return message.replace(/<([^:]*):((?:[^<>\\]|\\.)*)>/g, (all, color, message) => {
message = message.replace("\\>", ">");
if (disableColor) { return message; }
return getColor(color) + message + getColor();
});
}
function colorifyStatus(status) {
switch (status) {
case "modified": return colorify("<blue:" + status + ">");
case "added": return colorify("<green:" + status + ">");
case "deleted": return colorify("<red:" + status + ">");
case "unmodified": return colorify("<magenta:" + status + ">");
}
return status;
}
function log(message, color) {
if (color) {
console.log(colorify(message, color));
} else {
console.log(colorify(message));
}
}
module.exports = {
colorify: colorify,
colorifyStatus: colorifyStatus,
log: log
}

View File

@@ -1,104 +0,0 @@
"use strict";
const resolve = require("path").resolve;
const npm = require("libnpm");
const semver = require("semver");
const local = require("./local");
const keccak256 = require("../packages/keccak256").keccak256;
const fetchJson = require("../packages/web").fetchJson;
const { prompt } = require("../packages/cli");
const colorify = require("./log").colorify;
const git = require("./git");
let cache = { };
async function getPackage(name) {
if (cache[name]) { return cache[name]; }
return fetchJson("http:/" + "/registry.npmjs.org/" + name).then((result) => {
cache[name] = result;
return result;
}, (error) => {
if (error.status === 404) {
return null;
}
throw error;
});
}
async function getVersion(name) {
return getPackage(name).then((result) => {
if (!result) { return null; }
let versions = Object.keys(result.versions);
versions.sort(semver.compare)
return versions.pop();
});
}
async function getPackageVersion(name, version) {
let info = await getPackage(name)
if (!info) { return null; }
if (version == null) {
let versions = Object.keys(info.versions);
versions.sort(semver.compare);
version = versions.pop();
}
return info.versions[version] || null;
}
async function getTarballHash(name, version) {
let info = await getPackageVersion(name, version);
return (info || {}).tarballHash;
}
async function _publish(info, tarball, options) {
try {
let result = await npm.publish(info, tarball, options);
return result;
} catch (error) {
// We need an OTP
if (error.code === "EOTP") {
try {
let otp = await prompt.getMessage(colorify("Enter OTP: ", "bold"));
options.otp = otp.replace(" ", "");
} catch (error) {
// CTRL-C
if (error.message === "cancelled") {
return false;
}
// Something unexpected...
throw error;
}
// Retry with the new OTP
return _publish(info, tarball, options);
}
throw error;
}
}
async function publish(dirname, options) {
let info = local.loadPackage(dirname);
info.gitHead = await git.getGitTag(resolve(__dirname, "../packages/", dirname));
if (info.gitHead == null) { throw new Error("no git tag found - " + dirname); }
let tarball = await local.createTarball(dirname);
return _publish(info, tarball, options);
}
module.exports = {
getPackage: getPackage,
getPackageVersion: getPackageVersion,
getTarballHash: getTarballHash,
getVersion: getVersion,
publish: publish,
};

View File

@@ -1,50 +0,0 @@
{
"name": "DevelopmentChain",
"engine": {
"instantSeal": null
},
"params": {
"gasLimitBoundDivisor": "0x0400",
"accountStartNonce": "0x0",
"maximumExtraDataSize": "0x20",
"minGasLimit": "0x1388",
"networkID" : "0x11",
"registrar" : "0x0000000000000000000000000000000000001337",
"maxCodeSize": 24576,
"maxCodeSizeTransition": "0x0",
"eip98Transition": "0x7fffffffffffff",
"eip140Transition": "0x0",
"eip145Transition": "0x0",
"eip150Transition": "0x0",
"eip155Transition": "0x0",
"eip160Transition": "0x0",
"eip161abcTransition": "0x0",
"eip161dTransition": "0x0",
"eip211Transition": "0x0",
"eip214Transition": "0x0",
"eip658Transition": "0x0",
"wasmActivationTransition": "0x0"
},
"genesis": {
"seal": {
"generic": "0x0"
},
"difficulty": "0x20000",
"author": "0x0000000000000000000000000000000000000000",
"timestamp": "0x00",
"parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"extraData": "0x",
"gasLimit": "0x7A1200"
},
"accounts": {
"0000000000000000000000000000000000000001": { "balance": "1", "builtin": { "name": "ecrecover", "pricing": { "linear": { "base": 3000, "word": 0 } } } },
"0000000000000000000000000000000000000002": { "balance": "1", "builtin": { "name": "sha256", "pricing": { "linear": { "base": 60, "word": 12 } } } },
"0000000000000000000000000000000000000003": { "balance": "1", "builtin": { "name": "ripemd160", "pricing": { "linear": { "base": 600, "word": 120 } } } },
"0000000000000000000000000000000000000004": { "balance": "1", "builtin": { "name": "identity", "pricing": { "linear": { "base": 15, "word": 3 } } } },
"0000000000000000000000000000000000000005": { "balance": "1", "builtin": { "name": "modexp", "activate_at": 0, "pricing": { "modexp": { "divisor": 20 } } } },
"0000000000000000000000000000000000000006": { "balance": "1", "builtin": { "name": "alt_bn128_add", "activate_at": 0, "pricing": { "linear": { "base": 500, "word": 0 } } } },
"0000000000000000000000000000000000000007": { "balance": "1", "builtin": { "name": "alt_bn128_mul", "activate_at": 0, "pricing": { "linear": { "base": 40000, "word": 0 } } } },
"0000000000000000000000000000000000000008": { "balance": "1", "builtin": { "name": "alt_bn128_pairing", "activate_at": 0, "pricing": { "alt_bn128_pairing": { "base": 100000, "pair": 80000 } } } },
"0x7454a8f5a7c7555d79b172c89d20e1f4e4cc226c": { "balance": "1606938044258990275541962092341162602522202993782792835301376" }
}
}

View File

@@ -1 +0,0 @@
{"id":"24d70b97-fff9-d322-e760-4b8cc2e21751","version":3,"crypto":{"cipher":"aes-128-ctr","cipherparams":{"iv":"45d392cd16dbbd5c0f5b2d145c112da9"},"ciphertext":"b001ccd09fc5431dc055975b58ee61f86e85529245506c04182c902716e750e5","kdf":"pbkdf2","kdfparams":{"c":10240,"dklen":32,"prf":"hmac-sha256","salt":"028594da27a0e864105f33b912e5dc6ce7c75ecd13c81bfc158fe963d30c93bb"},"mac":"374bf2e9144b74b889708abc19e9ebc164f90bc27e83fd9f01da4571a9f81a70"},"address":"7454a8f5a7c7555d79b172c89d20e1f4e4cc226c","name":"","meta":"{}"}

View File

@@ -1,64 +0,0 @@
"use strict";
const fs = require("fs");
const _resolve = require("path").resolve;
function repeat(chr, length) {
let result = chr;
while (result.length < length) { result += chr; }
return result;
}
function zpad(value) {
value = String(value);
while (value.length < 2) { value = "0" + value; }
return value;
}
function getDate(date) {
return [
date.getFullYear(),
zpad(date.getMonth() + 1),
zpad(date.getDate())
].join("-");
}
function getDateTime(date) {
return getDate(date) + " " + [
zpad(date.getHours()) ,
zpad(date.getMinutes() + 1)
].join(":");
}
function today() {
return getDate(new Date());
}
function loadJson(filename) {
return JSON.parse(fs.readFileSync(filename).toString());
}
// @TODO: atomic write
function saveJson(filename, json) {
fs.writeFileSync(filename, JSON.stringify(json, null, 2) + "\n");
}
function resolve(...args) {
args = args.slice();
args.unshift("..");
args.unshift(__dirname);
return _resolve.apply(null, args);
}
module.exports = {
resolve: resolve,
loadJson: loadJson,
saveJson: saveJson,
repeat: repeat,
today: today,
getDate: getDate,
getDateTime: getDateTime
}

167
docs.wrm/api-keys.wrm Normal file
View File

@@ -0,0 +1,167 @@
_section: Provider API Keys @<api-keys>
//( **TL; DR** &ndash; sign up for your own API keys with the links below to improve your application performance )//
When using a [[Provider]] backed by an API service (such as [[link-alchemy]],
[[link-etherscan]] or [[link-infura]]), the service requires an API key,
which allows each service to track individual projects and their usage and
permissions.
The ethers library offers default API keys for each service, so that each
[[Provider]] works out-of-the-box.
These API keys are provided as a community resource by the backend services
for low-traffic projects and for early prototyping.
Since these API keys are shared by all users (that have not acquired their
own API key), they are aggressively throttled which means retries occur more
frequently and the responses are slower.
It is **highly recommended** that you sign up for a free API key from each service for their
free tier, which (depending on the service) includes many advantages:
- a much **higher request rate** and concurrent request limit
- **faster** responses with fewer retries and timeouts
- useful **metric tracking** for performance tuning and to analyze your customer behaviour
- more **advanced APIs**, such as archive data or advanced log queries
_subsection: Etherscan @NOTE<(see the [[EtherscanProvider]])> @<api-keys--etherscan>
Etherscan is an Ethereum block explorer, which is possibly the most useful
developer tool for building and debugging Ethereum applications.
They offer an extensive collection of API endpoints which provide all the
operations required to interact with the Ethereum Blockchain.
[Sign up for a free API key on Etherscan](link-etherscan-signup)
**Benefits:**
- higher rate limit (since you are not using the [shared rate limit](link-etherscan-ratelimit))
- customer usage metrics
_definition: **Networks:**
``homestead``, ``ropsten``, ``rinkeby``, ``goerli`` and ``kovan``.
_subsection: INFURA @NOTE<(see the [[InfuraProvider]])> @<api-keys--infura>
The INFURA service has been around for quite some time and is very robust
and reliable and highly recommended.
They offer a standard JSON-RPC interface and a WebSocket interface, which makes
interaction with standard tools versatile, simple and straightforward.
[Sign up for a free Project ID on INFURA](link-infura-signup)
**Benefits:**
- higher rate limit
- customer usage metrics
- access to archive data (requires paid upgrade)
_definition: **Networks:**
``homestead``, ``ropsten``, ``rinkeby``, ``goerli``, ``kovan``, ``matic``,
``maticmum``, ``optimism``, ``optimism-kovan``, ``arbitrum`` and
``arbitrum-rinkeby``.
_subsection: Alchemy @NOTE<(see the [[AlchemyProvider]])> @<api-keys--alchemy>
The Alchemy service has been around a few years and is also very robust
and reliable.
They offer a standard JSON-RPC interface and a WebSocket interface, as well
as a collection of advanced APIs for interacting with tokens and to assist
with debugging.
[Sign up for a free API key on Alchemy](link-alchemy-signup)
**Benefits:**
- higher rate limit
- customer usage metrics
- access to advanced token balance and metadata APIs
- access to advanced debugging trace and revert reason APIs
_definition: **Networks:**
``homestead``, ``ropsten``, ``rinkeby``, ``goerli``, ``kovan``, ``matic``,
``maticmum``, ``optimism``, ``optimism-kovan``, ``arbitrum`` and
``arbitrum-rinkeby``.
_subsection: Pocket Gateway @NOTE<(see the [[PocketProvider]])> @<api-keys--pocket-gateway>
They offer a standard JSON-RPC interface using either a load-balanced
network or non-load-balanced fleet.
[Sign up for a free API key on Pocket](link-pocket-signup)
**Benefits:**
- customer usage metrics
- decentralized Access to Blockchain Infrastructure
- Stake as opposed to paying a monthly fee
- Highly redundant global set of nodes incentivized by cryptoeconomic incentives
_definition: **Networks:**
``homestead``
_subsection: Ankr @NOTE<(see the [[AnkrProvider]])> @<api-keys--ankr>
They offer a standard JSON-RPC interface and have fairly high capacity without
the need for an API key early on in the development cycle.
[See their free tier features on Ankr](link-ankr-public)
**Benefits:**
- higher rate limit
- customer usage metrics
- access to archive data (requires paid upgrade)
_definition: **Networks:**
``homestead``, ``matic`` and ``arbitrum``
_subsection: Creating a Default Provider @<api-keys--getDefaultProvider>
The [default provider](providers-getDefaultProvider) connects to multiple
backends and verifies their results internally, making it simple to have
a high level of trust in third-party services.
A second optional parameter allows API keys to be specified to each
Provider created internally and any API key omitted will fallback onto
using the default API key for that service.
It is **highly recommended** that you provide an API for each service, to
maximize your applications performance.
If the API key ``"-"`` is used, the corresponding Provider will be omitted.
_code: Passing API Keys into getDefaultProvider @lang<script>
// Use the mainnet
const network = "homestead";
// Specify your own API keys
// Each is optional, and if you omit it the default
// API key for that service will be used.
const provider = ethers.getDefaultProvider(network, {
etherscan: YOUR_ETHERSCAN_API_KEY,
infura: YOUR_INFURA_PROJECT_ID,
// Or if using a project secret:
// infura: {
// projectId: YOUR_INFURA_PROJECT_ID,
// projectSecret: YOUR_INFURA_PROJECT_SECRET,
// },
alchemy: YOUR_ALCHEMY_API_KEY,
pocket: YOUR_POCKET_APPLICATION_KEY
// Or if using an application secret key:
// pocket: {
// applicationId: ,
// applicationSecretKey:
// },
ankr: YOUR_ANKR_API_KEY
});

View File

@@ -0,0 +1,34 @@
// Do not use this; it is only for an example in the docs
contract MyToken {
event Transfer(address indexed from, address indexed to, uint amount);
mapping (address => uint256) _balances;
constructor(uint256 totalSupply) {
emit Transfer(address(0), msg.sender, totalSupply);
_balances[msg.sender] = totalSupply;
}
// Read-Only Functions
function balanceOf(address owner) public view returns (uint256) {
return _balances[owner];
}
function decimals() public pure returns (uint8) {
return 18;
}
function symbol() public pure returns (string memory) {
return "MyToken";
}
// Authenticated Functions
function transfer(address to, uint amount) public returns (bool) {
require(_balances[msg.sender] >= amount, "insufficient token balance");
_balances[msg.sender] -= amount;
_balances[to] += amount;
emit Transfer(msg.sender, to, amount);
return true;
}
}

View File

@@ -1,78 +1,119 @@
_section: ContractFactory @<ContractFactory> @SRC<contracts:class.ContractFactory>
@TODO: Fill this in, including @SRC links
To deploy a [[Contract]], additional information is needed
that is not available on a Contract object itself.
Mainly, the bytecode (more specifically the initcode) of a contract is required.
The **Contract Factory** sends a special type of transaction, an initcode
transaction (i.e. the ``to`` field is null, and the ``data`` field is the
initcode) where the initcode will be evaluated and the result becomes the
new code to be deployed as a new contract.
_subsection: Creating Instances @<ContractFactory--creating>
_property: new ethers.ContractFactory(interface, bydecode [ , signer ]) @SRC<contracts:constructor.ContractFactory>
_property: new ethers.ContractFactory(interface, bytecode [ , signer ]) @SRC<contracts:constructor.ContractFactory>
Creates a new instance of a **ContractFactory** for the contract described
by the //interface// and //bytecode// initcode.
_property: ContractFactory.fromSolidity(compilerOutput [ , signer ]) => [[ContractFactory]]
_property: contractFactory.connect(signer) => [[Contract]] @<ContractFactory-connect>
Consumes the output of the Solidity compiler, extracting the ABI
and bytecode from it, allowing for the various formats the solc
compiler has emitted over its life.
_property: contractFactory.connect(signer) => [[ContractFactory]] @<ContractFactory-connect>
Returns a **new instance** of the ContractFactory with the same //interface//
and //bytecode//, but with a different //signer//.
_subsection: Properties @<ContractFactory--properties>
_property: contractFactory.interface => [[Interface]]
The [[Contract]] interface.
_property: contractFactory.bytecode => string<[[DataHexString]]>
The bytecode (i.e. initcode) that this **ContractFactory** will
use to deploy the Contract.
_property: contractFactory.signer => [[Signer]]
The [[Signer]] (if any) this ContractFactory will use to deploy instances
of the Contract to the Blockchain.
_subsection: Methods @<ContractFactory--methods>
_property: contractFactory.attach(address) => [[Contract]] @<ContractFactory-attach>
Return an instance of a [[Contract]] attched to //address//. This is the
Return an instance of a [[Contract]] attached to //address//. This is the
same as using the [Contract constructor](Contract--creating) with
//address// and this the the //interface// and //signerOrProvider// passed
//address// and this the //interface// and //signerOrProvider// passed
in when creating the ContractFactory.
_property: contractFactory.getDeployTransaction(...args) => [[UnsignedTransaction]]
_property: contractFactory.getDeployTransaction(...args [ , overrides ]) => [[UnsignedTransaction]]
Returns the unsigned transaction which would deploy this Contract with //args// passed
to the Contract's constructor.
_property: contractFactory.deploy(...args) => Promise<[[Contract]]> @<ContractFactory-deploy>
If the optional //overrides// is specified, they can be used to
override the endowment ``value``, transaction ``nonce``, ``gasLimit`` or
``gasPrice``.
Uses the signer to deploy the Contract with //args// passed into tgee constructor and
retruns a Contract which is attached to the address where this contract **will** be
deployed once the transction is mined.
_property: contractFactory.deploy(...args [ , overrides ]) => Promise<[[Contract]]> @<ContractFactory-deploy>
The transction can be found at ``contract.deployTransaction``, and no interactions
Uses the signer to deploy the Contract with //args// passed into the constructor and
returns a Contract which is attached to the address where this contract **will** be
deployed once the transaction is mined.
The transaction can be found at ``contract.deployTransaction``, and no interactions
should be made until the transaction is mined.
_code: Deploying a Contract
If the optional //overrides// is specified, they can be used to
override the endowment ``value``, transaction ``nonce``, ``gasLimit`` or
``gasPrice``.
// <hide>
const signer = ethers.LocalSigner();
const ContractFactory = ethers.ContractFactory;
// </hide>
_code: Deploying a Contract @lang<javascript>
//_hide: const signer = localSigner;
//_hide: const ContractFactory = ethers.ContractFactory;
//_hide: const bytecode = "608060405234801561001057600080fd5b5060405161012e38038061012e8339818101604052604081101561003357600080fd5b81019080805190602001909291908051906020019092919050505081600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508060008190555050506088806100a66000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c80633fa4f24514602d575b600080fd5b60336049565b6040518082815260200191505060405180910390f35b6000805490509056fea2646970667358221220926465385af0e8706644e1ff3db7161af699dc063beaadd55405f2ccd6478d7564736f6c63430007040033";
// If your contract constructor requires parameters, the ABI
// must include the constructor
const abi = [
"constructor(address owner, uint256 initialValue)"
"constructor(address owner, uint256 initialValue)",
"function value() view returns (uint)"
];
const factory = new ContractFactory(abi, bytecode, signer)
// The factory we use for deploying contracts
factory = new ContractFactory(abi, bytecode, signer)
const contract = await factory.deploy("ricmoo.eth", 42);
// Deploy an instance of the contract
contract = await factory.deploy("ricmoo.eth", 42);
// The address is available immediately, but the contract
// is NOT deployed yet
//_result:
contract.address
//!
//_log:
// The transaction that the signer sent to deploy
//_result:
contract.deployTransaction
//!
//_log:
// Wait until the transaction is mined
contract.deployTransaction.wait()
//!
// Wait until the transaction is mined (i.e. contract is deployed)
// - returns the receipt
// - throws on failure (the reciept is on the error)
//_result:
await contract.deployTransaction.wait()
//_log:
// Now the contract is safe to ineract with
contract.value()
//!
// Now the contract is safe to interact with
//_result:
await contract.value()
//_log:

View File

@@ -1,25 +1,29 @@
_section: Contract @<Contract> @SRC<contracts:class.Contract>
Explain contract here...
A **Contract** is an abstraction of code that has been deployed
to the blockchain.
A Contract may be sent transactions, which will trigger its code
to be run with the input of the transaction data.
_subsection: Creating Instances @<Contract--creating>
_property: new ethers.Contract(address, abi, signerOrProvider) @src<contracts:constructor.Contract>
_property: new ethers.Contract(address, abi, signerOrProvider) @src<contracts:class.Contract>
_property: contract.attach(addressOrName) => [[Contract]] @<Contract-attach> @SRC<contracts:Contract.attach>
_property: contract.attach(addressOrName) => [[Contract]] @<Contract-attach> @SRC<contracts:BaseContract.attach>
Returns a new instance of the **Contract** attached to a new
address. This is useful if there are multiple similar or identical
copies of a Contract on the network and you wish to interact with
each of them.
_property: contract.connect(providerOrSigner) => [[Contract]] @<Contract-connect> @SRC<contracts:Contract.connect>
_property: contract.connect(providerOrSigner) => [[Contract]] @<Contract-connect> @SRC<contracts:BaseContract.connect>
Returns a new instance of the Contract, but connected to
//providerOrSigner//.
By passing in a [[Provider]], this will return a downgraded
**Contract** which only has read-only access (i.e. constant calls).
By passing in a [[Signer]]. the will return a **Contract** which
By passing in a [[Signer]]. this will return a **Contract** which
will act on behalf of that signer.
@@ -61,11 +65,11 @@ _subsection: Events @<Contract--events>
_property: contract.queryFilter(event [ , fromBlockOrBlockHash [ , toBlock ]) => Promise<Array<Event>> @<Contract-queryFilter> @SRC<contracts>
Return Events that match the //event//.
_property: contract.listenerCount([ event ]) => number @<Contract-listenerCount> @SRC<contracts:Contract.listenerCount>
_property: contract.listenerCount([ event ]) => number @<Contract-listenerCount> @SRC<contracts:BaseContract.listenerCount>
Return the number of listeners that are subscribed to //event//. If
no event is provided, returns the total count of all events.
_property: contract.listeners(event) => Array<Listener> @<Contract-listeners> @SRC<contracts:Contract.listeners>
_property: contract.listeners(event) => Array<Listener> @<Contract-listeners> @SRC<contracts:BaseContract.listeners>
Return a list of listeners that are subscribed to //event//.
_property: contract.off(event, listener) => this @<Contract-off> @SRC<contracts>
@@ -78,7 +82,7 @@ _property: contract.once(event, listener) => this @<Contract-once> @SRC<contrac
Subscribe once to //event// calling //listener// when the event
occurs.
_property: contract.removeAllListeners([ event ]) => this @<Contract-removeAllListeners> @SRC<contracts:Contract.removeAllListeners>
_property: contract.removeAllListeners([ event ]) => this @<Contract-removeAllListeners> @SRC<contracts:BaseContract.removeAllListeners>
Unsubscribe all listeners for //event//. If no event is provided,
all events are unsubscribed.
@@ -94,25 +98,55 @@ at run-time during the **Contract** constructor.
_heading: Read-Only Methods (constant) @<Contract--readonly>
A constant method is read-only and evaluates a small amount of EVM
code against the current blockchain state and can be computed by
asking a single node, which can return a result. It is therefore
free and does not require any ether, but **cannot make changes** to
the blockchain state..
A constant method (denoted by ``pure`` or ``view`` in Solidity)
is read-only and evaluates a small amount of EVM code against the
current blockchain state and can be computed by asking a single
node, which can return a result. It is therefore free and does
not require any ether, but **cannot make changes** to the
blockchain state..
_property: contract.METHOD_NAME(...args [, overrides ]) => Promise<any> @<Contract-functionsCall>
The type of the result depends on the ABI.
The type of the result depends on the ABI. If the method returns a single
value, it will be returned directly, otherwise a [[Result]] object will
be returned with each parameter available positionally and if the parameter
is named, it will also be available by its name.
For values that have a simple meaning in JavaScript, the types are fairly
straight forward; strings and booleans are returned as JavaScript strings
straightforward; strings and booleans are returned as JavaScript strings
and booleans.
For numbers, if the **type** is in the JavaSsript safe range (i.e. less
For numbers, if the **type** is in the JavaScript safe range (i.e. less
than 53 bits, such as an ``int24`` or ``uint48``) a normal JavaScript
number is used. Otherwise a [[BigNumber]] is returned.
For bytes (both fixed length and dynamic), a [[DataHexString]] is returned.
If the call reverts (or runs out of gas), a [CALL_EXCEPTION](errors--call-exception)
will be thrown which will include:
- ``error.address`` - the contract address
- ``error.args`` - the arguments passed into the method
- ``error.transaction`` - the transaction
The //overrides// object for a read-only method may include any of:
- ``overrides.from`` - the ``msg.sender`` (or ``CALLER``) to use during the
execution of the code
- ``overrides.value`` - the ``msg.value`` (or ``CALLVALUE``) to use during the
execution of the code
- ``overrides.gasPrice`` - the price to pay per gas (theoretically); since there
is no transaction, there is not going to be any fee charged, but the EVM still
requires a value to report to ``tx.gasprice`` (or ``GASPRICE``);
//most developers will not require this//
- ``overrides.gasLimit`` - the amount of gas (theoretically) to allow a node
to use during the execution of the code; since there is no transaction, there
is not going to be any fee charged, but the EVM still processes gas metering
so calls like ``gasleft`` (or ``GAS``) report meaningful values
- ``overrides.blockTag`` - a block tag to simulate the execution at, which
can be used for hypothetical historic analysis; note that many backends
do not support this, or may require paid plans to access as the node database
storage and processing requirements are much higher
_property: contract.functions.METHOD_NAME(...args [, overrides ]) => Promise<[[Result]]>
The result will always be a [[Result]], even if there is only a single
@@ -130,6 +164,8 @@ allowing an alternate UTF-8 error strategy to be used.
Most developers should not require this.
The //overrides// are identical to the read-only operations above.
_heading: Write Methods (non-constant) @<Contract--write>
A non-constant method requires a transaction to be signed and requires
@@ -147,31 +183,65 @@ Returns a [[providers-TransactionResponse]] for the transaction after
it is sent to the network. This requires the **Contract** has a
signer.
The //overrides// object for write methods may include any of:
- ``overrides.gasPrice`` - the price to pay per gas
- ``overrides.gasLimit`` - the limit on the amount of gas to allow the transaction
to consume; any unused gas is returned at the gasPrice
- ``overrides.value`` - the amount of ether (in wei) to forward with the call
- ``overrides.nonce`` - the nonce to use for the [[Signer]]
If the ``wait()`` method on the returned [[providers-TransactionResponse]]
is called, there will be additional properties on the receipt:
- ``receipt.events`` - an array of the logs, with additional properties
(if the ABI included a description for the events)
- ``receipt.events[n].args`` - the parsed arguments
- ``receipt.events[n].decode`` - a method that can be used to parse the
log topics and data (this was used to compute ``args``)
- ``receipt.events[n].event`` - the name of the event
- ``receipt.events[n].eventSignature`` - the full signature of the event
- ``receipt.removeListener()`` - a method to remove the listener that trigger
this event
- ``receipt.getBlock()`` - a method to return the [Block](providers-Block) this event occurred in
- ``receipt.getTransaction()`` - a method to return the
[Transaction](providers-TransactionResponse) this event occurred in
- ``receipt.getTransactionReceipt()`` - a method to return the
[Transaction Receipt](providers-TransactionReceipt) this event occurred in
_heading: Write Methods Analysis @<Contract--check>
There are secveral options to analyze properties and results of a
There are several options to analyze properties and results of a
write method without actually executing it.
_property: contract.estimateGas.METHOD_NAME(...args [ , overrides ]) => Promise<[[BigNumber]]> @<contract-estimateGas>
Returns the estimate units of gas that would be required to
execute the //METHOD_NAME// with //args// and //overrides//.
The //overrides// are identical to the overrides above for read-only
or write methods, depending on the type of call of //METHOD_NAME//.
_property: contract.populateTransaction.METHOD_NAME(...args [ , overrides ]) => Promise<[UnsignedTx](UnsignedTransaction)> @<contract-populateTransaction>
Returns an [[UnsignedTransaction]] which represents the transaction
that would need to be signed and submitted to the network to execute
//METHOD_NAME// with //args// and //overrides//.
_property: contract.staticCall.METHOD_NAME(...args [ , overrides ]) => Promise<any> @<contract-staticCall>
The //overrides// are identical to the overrides above for read-only
or write methods, depending on the type of call of //METHOD_NAME//.
_property: contract.callStatic.METHOD_NAME(...args [ , overrides ]) => Promise<any> @<contract-callStatic>
Rather than executing the state-change of a transaction, it is possible
to ask a node to //pretend// that a call is not state-changing and
return the result.
This does not actually chagne any state, but is free. This in some cases
This does not actually change any state, but is free. This in some cases
can be used to determine if a transaction will fail or succeed.
This otherwise functions the same as a [Read-Only Method](Contract--readonly).
The //overrides// are identical to the read-only operations above.
_heading: Event Filters @<Contract--filters>
An event filter is made up of topics, which are values logged in a
[[link-wiki-bloomfilter]], allowing efficient searching for entries

View File

@@ -1,10 +1,75 @@
_section: Example: ERC-20 Contract
The concept of Meta-Classes is somewhat confusing, so we will go
over a short example.
A meta-class is a class which is defined at run-time. A Contract
is specified by an //Application Binary Interface// (ABI), which describes
the methods and events it has. This description is passed the the
[[Contract]] object at run-time, and it creates a new Class, adding
all the methods defined in the ABI at run-time.
_subsection: Deploying a Contract
Most often, any contract you will need to interact with will already
be deployed to the blockchain, but for this example will will first
deploy the contract.
_property: new ethers.ContractFactory(abi, bytecode, signer)
Create a new [[ContractFactory]] which can deploy a contract to the
blockchain.
_code: @lang<javascript>
//_hide: const signer = localSigner;
//_hide: const parseUnits = utils.parseUnits;
const bytecode = "0x608060405234801561001057600080fd5b506040516103bc3803806103bc83398101604081905261002f9161007c565b60405181815233906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a333600090815260208190526040902055610094565b60006020828403121561008d578081fd5b5051919050565b610319806100a36000396000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c8063313ce5671461005157806370a082311461006557806395d89b411461009c578063a9059cbb146100c5575b600080fd5b604051601281526020015b60405180910390f35b61008e610073366004610201565b6001600160a01b031660009081526020819052604090205490565b60405190815260200161005c565b604080518082018252600781526626bcaa37b5b2b760c91b6020820152905161005c919061024b565b6100d86100d3366004610222565b6100e8565b604051901515815260200161005c565b3360009081526020819052604081205482111561014b5760405162461bcd60e51b815260206004820152601a60248201527f696e73756666696369656e7420746f6b656e2062616c616e6365000000000000604482015260640160405180910390fd5b336000908152602081905260408120805484929061016a9084906102b6565b90915550506001600160a01b0383166000908152602081905260408120805484929061019790849061029e565b90915550506040518281526001600160a01b0384169033907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a350600192915050565b80356001600160a01b03811681146101fc57600080fd5b919050565b600060208284031215610212578081fd5b61021b826101e5565b9392505050565b60008060408385031215610234578081fd5b61023d836101e5565b946020939093013593505050565b6000602080835283518082850152825b818110156102775785810183015185820160400152820161025b565b818111156102885783604083870101525b50601f01601f1916929092016040019392505050565b600082198211156102b1576102b16102cd565b500190565b6000828210156102c8576102c86102cd565b500390565b634e487b7160e01b600052601160045260246000fdfea2646970667358221220d80384ce584e101c5b92e4ee9b7871262285070dbcd2d71f99601f0f4fcecd2364736f6c63430008040033";
// A Human-Readable ABI; we only need to specify relevant fragments,
// in the case of deployment this means the constructor
const abi = [
"constructor(uint totalSupply)"
];
const factory = new ethers.ContractFactory(abi, bytecode, signer)
// Deploy, setting total supply to 100 tokens (assigned to the deployer)
const contract = await factory.deploy(parseUnits("100"));
// The contract is not currentl live on the network yet, however
// its address is ready for us
//_result:
contract.address
//_log:
//_hide: _page.address = contract.address;
// Wait until the contract has been deployed before interacting
// with it; returns the receipt for the deployemnt transaction
//_result:
await contract.deployTransaction.wait();
//_log:
_subsection: Connecting to a Contract
_code: A simple ERC-20 contract @lang<javascript>
_heading: ERC20Contract @INHERIT<[[Contract]]>
// A Human-Readable ABI; any supported ABI format could be used
_property: new ethers.Contract(address, abi, providerOrSigner)
Creating a new instance of a Contract connects to an existing
contract by specifying its //address// on the blockchain,
its //abi// (used to populate the class' methods) a //providerOrSigner//.
If a [[Provider]] is given, the contract has only read-only access, while
a [[Signer]] offers access to state manipulating methods.
_code: @lang<javascript>
//_hide: const provider = localProvider;
//_hide: const signer = localSigner;
// A Human-Readable ABI; for interacting with the contract, we
// must include any fragment we wish to use
const abi = [
// Read-Only Functions
"function balanceOf(address owner) view returns (uint256)",
@@ -12,20 +77,15 @@ const abi = [
"function symbol() view returns (string)",
// Authenticated Functions
"function transfer(address to, uint amount) returns (boolean)",
"function transfer(address to, uint amount) returns (bool)",
// Events
"event Transfer(address indexed from, address indexed to, uint amount)"
];
// This can be an address or an ENS name
const address = "dai.tokens.ethers.eth";
// An example Provider
const provider = ethers.getDefaultProvider();
// An example Signer
const signer = ethers.Wallet.createRandom().connect(provider);
//_hide: const address = _page.address;
//_verbatim: `const address = ${ JSON.stringify(address) };`
// Read-Only; By connecting to a Provider, allows:
// - Any constant function
@@ -34,20 +94,13 @@ const signer = ethers.Wallet.createRandom().connect(provider);
// - Estimating Gas for non-constant (as an anonymous sender)
// - Static Calling non-constant methods (as anonymous sender)
const erc20 = new ethers.Contract(address, abi, provider);
//_hide: _page.erc20 = erc20;
// Read-Write; By connecting to a Signer, allows:
// - Everything from Read-Only (except as Signer, not anonymous)
// - Sending transactions for non-constant functions
const erc20_rw = new ethers.Contract(address, abi, signer)
_heading: ERC20Contract @INHERIT<[[Contract]]>
_property: new ethers.Contract(address, abi, providerOrSigner)
See the above code example for creating an Instance which will
(in addition to the Contact methods and properties) automatically
add the additional properties defined in //abi// to a **Contract**
connected to //address// using the //providerOrSigner//.
const erc20_rw = new ethers.Contract(address, abi, signer);
//_hide: _page.erc20_rw = erc20_rw;
_subsection: Properties @NOTE<(inheritted from [[Contract]])>
@@ -91,7 +144,7 @@ Returns a new instance of the Contract, but connected to
By passing in a [[Provider]], this will return a downgraded
**Contract** which only has read-only access (i.e. constant calls).
By passing in a [[Signer]]. the will return a **Contract** which
By passing in a [[Signer]]. this will return a **Contract** which
will act on behalf of that signer.
_property: erc20.deployed() => Promise<Contract>
@@ -101,6 +154,8 @@ _property: Contract.isIndexed(value) => boolean
_subsection: Events @NOTE<(inheritted from [[Contract]])> @<erc20-events>
See [Meta-Class Filters](erc20-meta-events) for examples using events.
_property: erc20.queryFilter(event [ , fromBlockOrBlockHash [ , toBlock ]) => Promise<Array<Event>> @<erc20-queryfilter>
Return Events that match the //event//.
@@ -126,7 +181,7 @@ Unsubscribe all listeners for //event//. If no event is provided,
all events are unsubscribed.
_subsection: Meta-Class Methods @NOTE<(added at Runtime)>
_subsection: Meta-Class Methods @NOTE<(added at Runtime)> @<erc20-meta-methods>
Since the Contract is a Meta-Class, the methods available here depend
on the ABI which was passed into the **Contract**.
@@ -136,12 +191,35 @@ Returns the number of decimal places used by this ERC-20 token. This can be
used with [parseUnits](utils-parseUnits) when taking input from the user or
[formatUnits](utils-formatunits] when displaying the token amounts in the UI.
_property: erc20.getBalance(owner [, overrides ]) => Promise<[[BigNumber]]>
_code: @lang<javascript>
//_hide: const erc20 = _page.erc20;
//_result:
await erc20.decimals();
//_log:
_property: erc20.balanceOf(owner [, overrides ]) => Promise<[[BigNumber]]>
Returns the balance of //owner// for this ERC-20 token.
_code: @lang<javascript>
//_hide: const signer = localSigner;
//_hide: const erc20 = _page.erc20;
//_result:
await erc20.balanceOf(signer.getAddress())
//_log:
_property: erc20.symbol([ overrides ]) => Promise<string>
Returns the symbol of the token.
_code: @lang<javascript>
//_hide: const erc20 = _page.erc20;
//_result:
await erc20.symbol();
//_log:
_property: erc20_rw.transfer(target, amount [, overrides ]) => Promise<[[providers-TransactionResponse]]>
Transfers //amount// tokens to //target// from the current signer.
The return value (a boolean) is inaccessible during a write operation
@@ -149,20 +227,86 @@ using a transaction. Other techniques (such as events) are required
if this value is required. On-chain contracts calling the ``transfer``
function have access to this result, which is why it is possible.
_code: @lang<javascript>
//_hide: const signer = localSigner;
//_hide: const erc20_rw = _page.erc20_rw;
//_hide: const parseUnits = utils.parseUnits;
//_hide: const formatUnits = utils.formatUnits;
// Before...
//_result:
formatUnits(await erc20_rw.balanceOf(signer.getAddress()));
//_log:
// Transfer 1.23 tokens to the ENS name "ricmoo.eth"
//_result:
tx = await erc20_rw.transfer("ricmoo.eth", parseUnits("1.23"));
//_log:
// Wait for the transaction to be mined...
//_result:
await tx.wait();
//_log:
// After!
//_result:
formatUnits(await erc20_rw.balanceOf(signer.getAddress()));
//_log:
//_result:
formatUnits(await erc20_rw.balanceOf("ricmoo.eth"));
//_log:
_property: erc20.callStatic.transfer(target, amount [, overrides ]) => Promise<boolean>
Performs a dry-run of transferring //amount// tokens to //target// from
the current signer, without actually signing or sending a transaction.
This can be used to preflight check that a transaction will be successful.
_code: @lang<javascript>
//_hide: const erc20_rw = _page.erc20_rw;
//_hide: const randomWallet = ethers.Wallet.createRandom().connect(erc20_rw.provider);
//_hide: const parseUnits = utils.parseUnits;
// The signer has enough tokens to send, so true is returned
//_result:
await erc20_rw.callStatic.transfer("ricmoo.eth", parseUnits("1.23"));
//_log:
// A random address does not have enough tokens to
// send, in which case the contract throws an error
erc20_random = erc20_rw.connect(randomWallet);
//_throws:
await erc20_random.callStatic.transfer("ricmoo.eth", parseUnits("1.23"));
//_log:
_property: erc20.estimateGas.transfer(target, amount [, overrides ]) => Promise<[[BigNumber]]>
Returns an estimate for how many units of gas would be required
to transfer //amount// tokens to //target//.
_code: @lang<javascript>
//_hide: const erc20_rw = _page.erc20_rw;
//_hide: const parseUnits = utils.parseUnits;
//_result:
await erc20_rw.estimateGas.transfer("ricmoo.eth", parseUnits("1.23"));
//_log:
_property: erc20.populateTransaction.transfer(target, amount [, overrides ]) => Promise<[UnsignedTx](UnsignedTransaction)>
Returns an [[UnsignedTransaction]] which could be signed and submitted
to the network to transaction //amount// tokens to //target//.
_code: @lang<javascript>
//_hide: const erc20_rw = _page.erc20_rw;
//_hide: const parseUnits = utils.parseUnits;
//_result:
await erc20_rw.populateTransaction.transfer("ricmoo.eth", parseUnits("1.23"));
//_log:
_note: Note on Estimating and Static Calling
@@ -173,14 +317,86 @@ blockchain also means there are certain consistency modes that cannot be
known until an actual transaction is attempted.
_subsection: Meta-Class Filters @NOTE<(added at Runtime)>
_subsection: Meta-Class Filters @NOTE<(added at Runtime)> @<erc20-meta-events>
Since the Contract is a Meta-Class, the methods available here depend
on the ABI which was passed into the **Contract**.
_property: erc20.filters.Transafer([ fromAddress [ , toAddress ] ]) => Filter
_property: erc20.filters.Transfer([ fromAddress [ , toAddress ] ]) => Filter
Returns a new Filter which can be used to [query](erc20-queryfilter) or
to [subscribe/unsubscribe to events](erc20-events).
If //fromAddress// is null or not provided, then any from address matches.
If //toAddress// is null or not provided, then any to address matches.
_code: query filter *from* events @lang<javascript>
//_hide: const signer = localSigner;
//_hide: const erc20 = _page.erc20;
//_result:
filterFrom = erc20.filters.Transfer(signer.address);
//_log:
// Search for transfers *from* me in the last 10 blocks
//_result:
logsFrom = await erc20.queryFilter(filterFrom, -10, "latest");
//_log:
// Note that the args providees the details of the event, each
// parameters is available positionally, and since our ABI
// included parameter names also by name
//_result:
logsFrom[0].args
//_log:
//_hide: _page.filterFrom = filterFrom;
_code: query filter with *to* events @lang<javascript>
//_hide: const signer = localSigner;
//_hide: const erc20 = _page.erc20;
//_result:
filterTo = erc20.filters.Transfer(null, signer.address);
//_log:
// Search for transfers *to* me in the last 10 blocks
// Note: the contract transferred totalSupply tokens to us
// when it was deployed in its constructor
//_result:
logsTo = await erc20.queryFilter(filterTo, -10, "latest");
//_log:
// Note that the args providees the details of the event, each
// parameters is available positionally, and since our ABI
// included parameter names also by name
//_result:
logsTo[0].args
//_log:
//_hide: _page.filterTo = filterTo;
_code: listen for events @lang<javascript>
//_hide: const erc20 = _page.erc20;
//_hide: const filterFrom = _page.filterFrom;
//_hide: const filterTo = _page.filterTo;
// Listen to incoming events from signer:
erc20.on(filterFrom, (from, to, amount, event) => {
// The `from` will always be the signer address
});
// Listen to incoming events to signer:
erc20.on(filterTo, (from, to, amount, event) => {
// The `to` will always be the signer address
});
// Listen to all Transfer events:
erc20.on("Transfer", (from, to, amount, event) => {
// ...
});
//_hide: erc20.removeAllListeners();

View File

@@ -2,10 +2,10 @@ _section: Contract Interaction @<contracts>
A **Contract** object is an abstraction of a contract (EVM bytecode)
deployed on the Ethereum network. It allows for a simple way to
serialize calls and transaxtions to an on-chain contract and
serialize calls and transactions to an on-chain contract and
deserialize their results and emitted logs.
A **ContractFactory** is an abstraction a contract's //bytecode//
A **ContractFactory** is an abstraction of a contract's //bytecode//
and facilitates deploying a contract.
_toc:

View File

@@ -5,6 +5,10 @@ to be included in the base library. The API should not be considered
stable and does not follow [[link-semver]] versioning, so applications
requiring it should specify the //exact version// needed.
These features are not available in the core ethers package, so to use them
you must install the ``@ethersproject/experimental`` package and import them
from that.
_subsection: BrainWallet @<experimental-brainwallet> @INHERIT<[[Wallet]]>
Ethers removed support for BrainWallets in v4, since they are unsafe and
@@ -17,7 +21,15 @@ Generates a brain wallet, with a slightly improved experience, in which
the generated wallet has a mnemonic.
_property: BrainWallet.generateLegacy(username, password [ , progressCallback ]) => [[experimental-brainwallet]]
Generate a brain wallet which is compatibile with the ethers v3 and earlier.
Generate a brain wallet which is compatible with the ethers v3 and earlier.
_code: Importing @lang<script>
// Node
const { BrainWallet } = require("@ethersproject/experimental");
// ESM/TypeScript
import { BrainWallet } from "@ethersproject/experimental";
_subsection: EIP1193Bridge @<experimental-eip1193bridge> @INHERIT<[[link-npm-events]]>
@@ -26,6 +38,14 @@ The **EIP1193Bridge** allows a normal Ethers [[Signer]] and [[Provider]] to be
exposed in as a standard [EIP-1193 Provider](link-eip-1193), which may be useful
when interacting with other libraries.
_code: Importing @lang<script>
// Node
const { Eip1193Bridge } = require("@ethersproject/experimental");
// ESM/TypeScript
import { Eip1193Bridge } from "@ethersproject/experimental";
_subsection: NonceManager @<experimental-noncemanager> @INHERIT<[[Signer]]>
@@ -55,11 +75,19 @@ The provider associated with the signer.
_property: nonceManager.setTransactionCount(count) => void
Set the current transaction count (nonce) for the signer.
This may be useful it interacting with the signer outside of using
This may be useful in interacting with the signer outside of using
this class.
_property: nonceManager.increaseTransactionCount( [ count = 1 ]) => void
_property: nonceManager.incrementTransactionCount( [ count = 1 ]) => void
Bump the current transaction count (nonce) by //count//.
This may be useful it interacting with the signer outside of using
This may be useful in interacting with the signer outside of using
this class.
_code: Importing @lang<script>
// Node
const { NonceManager } = require("@ethersproject/experimental");
// ESM/TypeScript
import { NonceManager } from "@ethersproject/experimental";

View File

@@ -4,9 +4,9 @@ An Application Programming Interface (API) is the formal
specification of the library.
_toc:
contract
signer
providers
signer
contract
utils
other
experimental

View File

@@ -26,7 +26,7 @@ Create a formatted output of an array of [[asm-operation]].
_heading: Bytecode @<asm-bytecode> @INHERIT<Array\<[[asm-operation]]\>>
Each arary index represents an operation, collapsing multi-byte operations
Each array index represents an operation, collapsing multi-byte operations
(i.e. ``PUSH``) into a single operation.
_property: bytecode.getOperation(offset) => [[asm-operation]]
@@ -52,7 +52,7 @@ If the opcode is a ``PUSH``, this is the value of that push
_subsection: Opcode @<asm-opcode> @SRC<asm/opcodes:class.Opcode>
_property: asm.Opcode.from(valueOrMnemonic) => [[asm-opcode]]
Create a new instnace of an Opcode for a given numeric value
Create a new instance of an Opcode for a given numeric value
(e.g. 0x60 is PUSH1) or mnemonic string (e.g. "PUSH1").
_heading: Properties

View File

@@ -49,7 +49,7 @@ string of a decimal number.
_property: literalNode.verbatim => boolean
This is true in a [[asm-datanode]] context, since in that case the
value should be taken verbatim and no ``PUSH`` operation shoud be
value should be taken verbatim and no ``PUSH`` operation should be
added, otherwise false.
@@ -57,7 +57,7 @@ _heading: PopNode @<asm-popnode> @INHERIT<[[asm-valuenode]]> @SRC<asm:class.PopN
A **PopNode** is used to store a place-holder for an implicit pop from the
stack. It represents the code for an implicit place-holder (i.e. ``$$``) or an
explicit place-holder (e.g. ``$1``), which indicates the expect stack position
explicit place-holder (e.g. ``$1``), which indicates the expected stack position
to consume.
_property: literalNode.index => number
@@ -72,7 +72,7 @@ A **LinkNode** represents a link to another [[asm-node]]'s data,
for example ``$foo`` or ``#bar``.
_property: linkNode.label => string
Te name of the target node.
The name of the target node.
_property: linkNode.type => "offset" | "length"
Whether this node is for an offset or a length value of the
@@ -96,7 +96,7 @@ any output assembly, using the ``{{! code here }}`` syntax.
_property: literalNode.verbatim => boolean
This is true in a [[asm-datanode]] context, since in that case the
value should be taken verbatim and no ``PUSH`` operation shoud be
value should be taken verbatim and no ``PUSH`` operation should be
added, otherwise false.
_property: evaluationNode.script => string
@@ -115,7 +115,7 @@ The code to execute. Any result is ignored.
_heading: LabelledNode @<asm-labellednode> @INHERIT<[[asm-node]]> @SRC<asm:class.LabelledNode>
A **LabelledNode** is used for any Node that has a name, and can therefore
be targetted by a [[asm-linknode]].
be targeted by a [[asm-linknode]].
_property: labelledNode.name => string
The name of this node.

View File

@@ -1,9 +1,9 @@
_section: Ethers ASM Dialect @<asm-dialect>
This provides a quick, high-level overcview of the **Ethers ASM Dialect**
This provides a quick, high-level overview of the **Ethers ASM Dialect**
for EVM, which is defined by the [Ethers ASM Dialect Grammar](link-ethers-asm-grammar)
Once a program is compiled by a higher level langauge into ASM (assembly),
Once a program is compiled by a higher level language into ASM (assembly),
or hand-coded directly in ASM, it needs to be assembled into bytecode.
The assembly process performs a very small set of operations and is
@@ -34,7 +34,7 @@ A **Label** is a position in the program which can be jumped to. A
``JUMPDEST`` is automatically added to this point in the assembled
output.
@TODO: Exmaples
@TODO: Examples
_subsection: Literals @<asm-dialect-literal>
@@ -45,7 +45,7 @@ operation.
A **Literal** can be provided using a [[DataHexString]] or a decimal
byte value.
@TODO: exmples
@TODO: examples
_subsection: Comments @<asm-dialect-comment>
@@ -64,7 +64,7 @@ within a **deployment bytecode**, which can be used as **init code**.
When deploying a program to Ethereum, an **init transaction** is used. An
//init transaction// has a null ``to`` address and contains bytecode in
the ``data``. This ``data`` bytecode is a program, that when executed
returns some other bytecode as a result, this restul is the bytecode
returns some other bytecode as a result, this result is the bytecode
to be installed.
Therefore it is important that embedded code uses jumps relative to itself,
@@ -76,7 +76,7 @@ A scope may access the offset of any child [[asm-dialect-datasegment]] or
child [[asm-dialect-scope]] (with respect to itself) and may access the length
of any [[asm-dialect-datasegment]] or [[asm-dialect-scope]] anywhere in the program.
Every program in the **Ethers ASM Dialect** has a top-leve scope named ``_``.
Every program in the **Ethers ASM Dialect** has a top-level scope named ``_``.
_subsection: Data Segment @<asm-dialect-datasegment>
@@ -84,7 +84,7 @@ _subsection: Data Segment @<asm-dialect-datasegment>
A **Data Segment** allows arbitrary data to be embedded into a program,
which can be useful for lookup tables or deploy-time constants.
An emtpty **Data Segment** can also be used when a labelled location is
An empty **Data Segment** can also be used when a labelled location is
required, but without the ``JUMPDEST`` which a [[asm-dialect-label]] adds.
@TODO: Example
@@ -111,5 +111,5 @@ _subsection: Stack Placeholders @<asm-dialect-placeholder>
@TODO: exampl
_subsection: Evaluation and Excution @<asm-dialect-scripting>
_subsection: Evaluation and Execution @<asm-dialect-scripting>

View File

@@ -6,12 +6,12 @@ to them, which simplifies development, since you do not need
to run your own instance or cluster of Ethereum nodes.
However, this reliance on third-party services can reduce
resiliance, security and increase the amount of required trust.
resilience, security and increase the amount of required trust.
To mitigate these issues, it is recommended you use a
[Default Provider](providers-getDefaultProvider).
_subsection: EtherscanProvider @<EtherscanProvider> @inherit<[[Provider]]> @src<providers:class.EtherscanProvider>
_subsection: EtherscanProvider @<EtherscanProvider> @inherit<[[BaseProvider]]> @src<providers:class.EtherscanProvider>
The **EtherscanProvider** is backed by a combination of the various
[Etherscan APIs](link-etherscan-api).
@@ -20,7 +20,7 @@ _property: new ethers.providers.EtherscanProvider([ network = "homestead", [ api
Create a new **EtherscanProvider** connected to //network// with the
optional //apiKey//.
The //network// may be specified as **string** for a common
The //network// may be specified as a **string** for a common
network name, a **number** for a common chain ID or a
[Network Object]provider-(network).
@@ -39,18 +39,16 @@ It is highly recommended for production, you register with
_definition: **Supported Networks**
- Homestead (Mainnet)
- Ropsten (proof-of-work testnet)
- Rinkeby (proof-of-authority testnet)
- G&ouml;rli (clique testnet)
- Kovan (proof-of-authority testnet)
- ``homestead`` - Homestead (Mainnet)
- ``ropsten`` - Ropsten (proof-of-work testnet)
- ``rinkeby`` - Rinkeby (proof-of-authority testnet)
- ``goerli`` - G&ouml;rli (clique testnet)
- ``kovan`` - Kovan (proof-of-authority testnet)
_code: Etherscan Examples @lang<javascript>
// <hide>
const EtherscanProvider = ethers.providers.EtherscanProvider;
const apiKey = "...";
// </hide>
//_hide: const EtherscanProvider = ethers.providers.EtherscanProvider;
//_hide: const apiKey = "...";
// Connect to mainnet (homestead)
provider = new EtherscanProvider();
@@ -59,12 +57,9 @@ provider = new EtherscanProvider();
provider = new EtherscanProvider("rinkeby");
provider = new EtherscanProvider(4);
const network = ethers.providers.getNetwork("rinkeby");
// <hide>
delete network._defaultProvider;
network
// </hide>
//!
network = ethers.providers.getNetwork("rinkeby");
//_hide: delete network._defaultProvider;
//_log: network
provider = new EtherscanProvider(network);
@@ -82,11 +77,11 @@ _subsection: InfuraProvider @<InfuraProvider> @INHERIT<[[UrlJsonRpcProvider]]> @
The **InfuraProvider** is backed by the popular [INFURA](link-infura)
Ethereum service.
_property: new ethers.providers.InfuraProvider([ network = "homestead", [ apiKey ] ])
_property: new ethers.providers.InfuraProvider([ network = "homestead", [ apiKey ] ]) @SRC<providers>
Create a new **InfuraProvider** connected to //network// with
the optional //apiKey//.
The //network// may be specified as **string** for a common
The //network// may be specified as a **string** for a common
network name, a **number** for a common chain ID or a
[Network Object]provider-(network).
@@ -96,6 +91,12 @@ specify a [Project Secret](link-infura-secret) which can be used
on non-public sources (like on a server) to further secure your
API access and quotas.
_property: InfuraProvider.getWebSocketProvider([ network [ , apiKey ] ]) => [[WebSocketProvider]] @<InfuraProvider-getWebSocketProvider> @SRC<providers:InfuraProvider.getWebSocketProvider>
Create a new [[WebSocketProvider]] using the INFURA web-socket endpoint
to connect to //network// with the optional //apiKey//.
The //network// and //apiKey// are specified the same as [the constructor](InfuraProvider).
_note: Note: Default API keys
If no //apiKey// is provided, a shared API key will be used,
which may result in reduced performance and throttled requests.
@@ -105,19 +106,23 @@ It is highly recommended for production, you register with
_definition: **Supported Networks**
- Homestead (Mainnet)
- Ropsten (proof-of-work testnet)
- Rinkeby (proof-of-authority testnet)
- G&ouml;rli (clique testnet)
- Kovan (proof-of-authority testnet)
- ``homestead`` - Homestead (Mainnet)
- ``ropsten`` - Ropsten (proof-of-work testnet)
- ``rinkeby`` - Rinkeby (proof-of-authority testnet)
- ``goerli`` - G&ouml;rli (clique testnet)
- ``kovan`` - Kovan (proof-of-authority testnet)
- ``matic`` - Polygon
- ``maticmum`` - Polygon Mumbai Testnet
- ``optimism`` - Optimism (L2; optimistic roll-up)
- ``optimism-kovan`` - Optimism Testnet (L2; optimistic roll-up testnet)
- ``arbitrum`` - Arbitrum (L2; optimistic roll-up)
- ``arbitrum-rinkeby`` - Arbitrum Testnet (L2; optimistic roll-up testnet)
_code: INFURA Examples @lang<javascript>
// <hide>
const InfuraProvider = ethers.providers.InfuraProvider;
const projectId = "...";
const projectSecret = "...";
// </hide>
//_hide: const InfuraProvider = ethers.providers.InfuraProvider;
//_hide: const projectId = "...";
//_hide: const projectSecret = "...";
// Connect to mainnet (homestead)
provider = new InfuraProvider();
@@ -136,6 +141,10 @@ provider = new InfuraProvider("homestead", {
projectSecret: projectSecret
});
// Connect to the INFURA WebSocket endpoints with a WebSocketProvider
provider = InfuraProvider.getWebSocketProvider()
//_hide: await provider.destroy();
_subsection: AlchemyProvider @<AlchemyProvider> @inherit<[[UrlJsonRpcProvider]]> @src<providers:class.AlchemyProvider>
@@ -145,7 +154,7 @@ _property: new ethers.providers.AlchemyProvider([ network = "homestead", [ apiKe
Create a new **AlchemyProvider** connected to //network// with
the optional //apiKey//.
The //network// may be specified as **string** for a common
The //network// may be specified as a **string** for a common
network name, a **number** for a common chain ID or a
[Network Object](providers-Network).
@@ -158,18 +167,22 @@ It is highly recommended for production, you register with
_definition: **Supported Networks**
- Homestead (Mainnet)
- Ropsten (proof-of-work testnet)
- Rinkeby (proof-of-authority testnet)
- G&ouml;rli (clique testnet)
- Kovan (proof-of-authority testnet)
- ``homestead`` - Homestead (Mainnet)
- ``ropsten`` - Ropsten (proof-of-work testnet)
- ``rinkeby`` - Rinkeby (proof-of-authority testnet)
- ``goerli`` - G&ouml;rli (clique testnet)
- ``kovan`` - Kovan (proof-of-authority testnet)
- ``matic`` - Polygon
- ``maticmum`` - Polygon Mumbai Testnet
- ``optimism`` - Optimism (L2; optimistic roll-up)
- ``optimism-kovan`` - Optimism Testnet (L2; optimistic roll-up testnet)
- ``arbitrum`` - Arbitrum (L2; optimistic roll-up)
- ``arbitrum-rinkeby`` - Arbitrum Testnet (L2; optimistic roll-up testnet)
_code: Alchemy Examples @lang<javascript>
// <hide>
const AlchemyProvider = ethers.providers.AlchemyProvider;
const apiKey = "...";
// </hide>
//_hide: const AlchemyProvider = ethers.providers.AlchemyProvider;
//_hide: const apiKey = "...";
// Connect to mainnet (homestead)
provider = new AlchemyProvider();
@@ -182,6 +195,10 @@ provider = new AlchemyProvider("ropsten");
provider = new AlchemyProvider(null, apiKey);
provider = new AlchemyProvider("homestead", apiKey);
// Connect to the Alchemy WebSocket endpoints with a WebSocketProvider
provider = AlchemyProvider.getWebSocketProvider()
//_hide: provider.destroy();
_subsection: CloudflareProvider @<CloudflareProvider> @inherit<[[UrlJsonRpcProvider]]> @src<providers:class.CloudflareProvider>
@@ -192,13 +209,106 @@ Create a new **CloudflareProvider** connected to mainnet (i.e. "homestead").
_definition: **Supported Networks**
- Homestead (Mainnet)
- ``homestead`` - Homestead (Mainnet)
_code: Cloudflare Examples @lang<javascript>
// <hide>
const CloudflareProvider = ethers.providers.CloudflareProvider;
// </hide>
//_hide: const CloudflareProvider = ethers.providers.CloudflareProvider;
// Connect to mainnet (homestead)
provider = new CloudflareProvider();
_subsection: PocketProvider @<PocketProvider> @inherit<[[UrlJsonRpcProvider]]> @src<providers:class.PocketProvider>
The **PocketProvider** is backed by [Pocket](link-pocket).
_property: new ethers.providers.PocketProvider([ network = "homestead", [ apiKey ] ])
Create a new **PocketProvider** connected to //network// with
the optional //apiKey//.
The //network// may be specified as a **string** for a common
network name, a **number** for a common chain ID or a
[Network Object](providers-Network).
_note: Note: Default API keys
If no //apiKey// is provided, a shared API key will be used,
which may result in reduced performance and throttled requests.
It is highly recommended for production, you register with
[Pocket](link-pocket) for your own API key.
_definition: **Supported Networks**
- ``homestead`` - Homestead (Mainnet)
- ``ropsten`` - Ropsten (proof-of-work testnet)
- ``rinkeby`` - Rinkeby (proof-of-authority testnet)
- ``goerli`` - G&ouml;rli (clique testnet)
_code: Pocket Examples @lang<javascript>
//_hide: const PocketProvider = ethers.providers.PocketProvider;
//_hide: const applicationId = "...";
//_hide: const applicationSecretKey = "...";
//_hide: const loadBalancer = true;
// Connect to mainnet (homestead)
provider = new PocketProvider();
// Connect to the ropsten testnet
// (see EtherscanProvider above for other network examples)
provider = new PocketProvider("ropsten");
// Connect to mainnet with an Application ID (these are equivalent)
provider = new PocketProvider(null, applicationId);
provider = new PocketProvider("homestead", applicationId);
// Connect to mainnet with an application ID, application secret
// and specify whether to use the load balances
provider = new PocketProvider("homestead", {
applicationId: applicationId,
applicationSecretKey: applicationSecretKey,
loadBalancer: loadBalancer // true or false
});
_subsection: AnkrProvider @<AnkrProvider> @inherit<[[UrlJsonRpcProvider]]> @src<providers:class.AnkrProvider>
The **AnkrProvider** is backed by [Ankr](link-ankr).
_property: new ethers.providers.AnkrProvider([ network = "homestead", [ apiKey ] ])
Create a new **AnkrProvider** connected to //network// with
the optional //apiKey//.
The //network// may be specified as a **string** for a common
network name, a **number** for a common chain ID or a
[Network Object](providers-Network).
_note: Note: Default API keys
If no //apiKey// is provided, a shared API key will be used,
which may result in reduced performance and throttled requests.
It is highly recommended for production, you register with
[Ankr](link-ankr) for your own API key.
_definition: **Supported Networks**
- ``homestead`` - Homestead (Mainnet)
- ``matic`` - Polygon
- ``arbitrum`` - Arbitrum (L2; optimistic roll-up)
_code: Ankr Examples @lang<javascript>
//_hide: const AnkrProvider = ethers.providers.AnkrProvider;
//_hide: const apiKey = "...";
// Connect to mainnet (homestead)
provider = new AnkrProvider();
// Connect to polygont
// (see EtherscanProvider above for other network examples)
provider = new AnkrProvider("matic");
// Connect to mainnet with an API Key (these are equivalent)
provider = new AnkrProvider(null, apiKey);
provider = new AnkrProvider("homestead", apiKey);

View File

@@ -9,7 +9,7 @@ cover the vast majority of use-cases, but also includes the
necessary functions and classes for sub-classing if a more
custom configuration is necessary.
Most users should be able to simply use the [[providers-getDefaultProvider]].
Most users should use the [[providers-getDefaultProvider]].
_subsection: Default Provider @<providers-getDefaultProvider>
@@ -20,7 +20,7 @@ for use in production.
It creates a [[FallbackProvider]] connected to as many backend
services as possible. When a request is made, it is sent to
multiple backends simulatenously. As responses from each backend
multiple backends simultaneously. As responses from each backend
are returned, they are checked that they agree. Once a quorum
has been reached (i.e. enough of the backends agree), the response
is provided to your application.
@@ -31,42 +31,95 @@ responses that match the majority.
_property: ethers.getDefaultProvider([ network, [ options ] ]) => [[Provider]]
Returns a new Provider, backed by multiple services, connected
to //network//. Is no //network// is provided, **homestead**
to //network//. If no //network// is provided, **homestead**
(i.e. mainnet) is used.
The //network// may also be a URL to connect to, such as ``http:/\/localhost:8545``
or ``wss:/\/example.com``.
The //options// is an object, with the following properties:
_table: Option Properties
$Alchemy: [[link-alchemy]] API Token
$Etherscan: [[link-etherscan]] API Token
$Infura: [[link-infura]] Project ID or ProjectID and Project Secret
$Infura: [[link-infura]] Project ID or ``{ projectId, projectSecret }``
$Pocket: [[link-pocket]] Application ID or ``{ applicationId, applicationSecretKey }``
$Quorum: The number of backends that must agree
//(default: 2 for mainnet, 1 for testnets)//
| **Property** | **Description** |
| //alchemy// | $Alchemy |
| //etherscan// | $Etherscan |
| //infura// | $Infura |
| //pocket// | $Pocket |
| //quorum// | $Quorum |
_note: Note: API Keys
It is highly recommended for production services that to acquire
and specify an API Key for each sercice.
It is highly recommended for production services to acquire
and specify an API Key for each service.
The deafult API Keys used by ethers are shared across all users,
The default API Keys used by ethers are shared across all users,
so services may throttle all services that are using the default
API Keys during periods of load without realizing it.
Many services also have monitoring and usage metrics, which are
only available if an API Key is specifie. This allows tracking
only available if an API Key is specified. This allows tracking
how many requests are being sent and which methods are being
used the most.
Some services also provide additional paid features, whichare only
Some services also provide additional paid features, which are only
available when specifying an API Key.
_subsection: Networks
There are several official common Ethereum networks as well as custom
networks and other compatible projects.
Any API that accept a [[providers-Networkish]] can be passed a common
name (such as ``"mainnet"`` or ``"ropsten"``) or chain ID to use that
network definition or may specify custom parameters.
_property: ethers.providers.getNetwork(aNetworkish) => [[providers-Network]]
Returns the full [[providers-Network]] for the given standard
//aNetworkish// [[providers-Networkish]].
This is useful for functions and classes which wish to accept [[providers-Networkish]]
as an input parameter.
_code: @lang<javascript>
//_hide: const getNetwork = ethers.providers.getNetwork;
// By Chain Name
//_result:
getNetwork("homestead");
//_hide: delete _._defaultProvider;
//_log:
// By Chain ID
//_result:
getNetwork(1);
//_hide: delete _._defaultProvider;
//_log:
_heading: Custom ENS Contract
One common reason to specify custom properties for a [[providers-Network]] is to override
the address of the root ENS registry, either on a common network to intercept
the [ENS Methods](Provider--ens-methods) or to specify the ENS registry on a
dev network (on most dev networks you must deploy the ENS contracts manually).
_code: Example: Override the ENS registry @lang<script>
const network = {
name: "dev",
chainId: 1337,
ensAddress: customEnsAddress
};
_subsection: Provider Documentation

View File

@@ -1,22 +1,27 @@
_section: JsonRpcProvider @<JsonRpcProvider> @INHERIT<[[Provider]]> @SRC<providers:class.JsonRpcProvider>
_section: JsonRpcProvider @<JsonRpcProvider> @INHERIT<[[BaseProvider]]> @SRC<providers:class.JsonRpcProvider>
The [JSON-RPC API](link-jsonrpc) is a very popular method for interacting
The [JSON-RPC API](link-jsonrpc) is a popular method for interacting
with Ethereum and is available in all major Ethereum node implementations
(e.g. [[link-geth]] and [[link-parity]]) as well as many
third-party web services (e.g. [[link-infura]])
_property: new ethers.providers.JsonRpcProvider([ url [ , aNetworkish ] ]) @SRC<providers:constructor.JsonRpcProvider>
Connect to a JSON-RPC API located at //url// using the //aNetworkish// network.
If //url// is not specified, the default (i.e. ``http:/\/localhost:8545``) is used
and if no network is specified, it will be determined automatically by
querying the node.
_property: new ethers.providers.JsonRpcProvider([ urlOrConnectionInfo [ , networkish ] ]) @SRC<providers:constructor.JsonRpcProvider>
Connect to a JSON-RPC HTTP API using the URL or [[ConnectionInfo]] //urlOrConnectionInfo//
connected to the //networkish// network.
If //urlOrConnectionInfo// is not specified, the default (i.e. ``http:/\/localhost:8545``)
is used and if no network is specified, it will be determined automatically by querying the
node using ``eth_chaindId`` and falling back on ``eth_networkId``.
_note: Note: Connecting to a Local Node
Each node implementation is slightly different and may require specific
command-line flags, configuration or settings in their UI to enable
JSON-RPC, unlock accounrs or expose specific APIs. Please consult
JSON-RPC, unlock accounts or expose specific APIs. Please consult
their documentation.
_property: jsonRpcProvider.connection => [[ConnectionInfo]]
The fully formed [[ConnectionInfo]] the Provider is connected to.
_property: jsonRpcProvider.getSigner([ addressOrIndex ]) => [[JsonRpcSigner]] @<JsonRpcProvider-getSigner> @SRC<providers/json-rpc-provider>
Returns a [[JsonRpcSigner]] which is managed by this Ethereum node, at
//addressOrIndex//. If no //addressOrIndex// is provided, the first
@@ -24,7 +29,7 @@ account (account #0) is used.
_property: jsonRpcProvider.getUncheckedSigner([ addressOrIndex ]) => [[UncheckedJsonRpcSigner]] @<JsonRpcProvider-getUncheckedSigner> @SRC<providers/json-rpc-provider>
_property: jsonRpcProvider.listAccounts() => Array<string> @<JsonRpcProvider-listAccounts> @SRC<providers/json-rpc-provider>
_property: jsonRpcProvider.listAccounts() => Promise<Array<string>> @<JsonRpcProvider-listAccounts> @SRC<providers/json-rpc-provider>
Returns a list of all account addresses managed by this provider.
_property: jsonRpcProvider.send(method, params) => Promise<any> @<JsonRpcProvider-send> @SRC<providers/json-rpc-provider>
@@ -42,12 +47,12 @@ _property: signer.provider => [[JsonRpcProvider]]
The provider this signer was established from.
_property: signer.connectUnchecked() => [[UncheckedJsonRpcSigner]] @<JsonRpcSigner-connectUnchecked> @SRC<providers>
Returns a new Signer object which does not perform addtional checks when
Returns a new Signer object which does not perform additional checks when
sending a transaction. See [getUncheckedSigner](JsonRpcProvider-getUncheckedSigner) for more details.
_property: signer.sendUncheckedTransaction(transaction) => Promise<string<[[DataHexString]]\<32>\>> @<JsonRpcSigner-sendUncheckedTransaction> @SRC<providers>
Sends the //transaction// and returns a Promise which resolves to the
opacque transaction hash.
opaque transaction hash.
_property: signer.unlock(password) => Promise<boolean> @<JsonRpcSigner-unlock> @SRC<providers>
Request the node unlock the account (if locked) using //password//.
@@ -60,7 +65,7 @@ of a transaction before returning it. For example, the gas price and gas limit
may be adjusted by the node or the nonce automatically included, in which case
the opaque transaction hash has discarded this.
To remedy this, the [[JsonRpcSigner]] immeidately queries the provider for
To remedy this, the [[JsonRpcSigner]] immediately queries the provider for
the details using the returned transaction hash to populate the [[providers-TransactionResponse]]
object.
@@ -73,6 +78,25 @@ object, with most of the properties set to null, but allows access to the
transaction hash quickly, if that is all that is required.
_subsection: StaticJsonRpcProvider @<StaticJsonRpcProvider> @INHERIT<[[JsonRpcProvider]]> @SRC<providers:class.StaticJsonRpcProvider>
An ethers Provider will execute frequent ``getNetwork`` calls to ensure
the network calls and network being communicated with are consistent.
In the case of a client like MetaMask, this is desired as the network
may be changed by the user at any time, in such cases the cost of
checking the chainId is local and therefore cheap.
However, there are also many times where it is known the network cannot
change, such as when connecting to an INFURA endpoint, in which case,
the **StaticJsonRpcProvider** can be used which will indefinitely cache
the chain ID, which can reduce network traffic and reduce round-trip
queries for the chain ID.
This [[Provider]] should **only** be used when it is known the network
cannot change.
_subsection: Node-Specific Methods @<JsonRpcProvider--other>
Many methods are less common or specific to certain Ethereum Node implementations
@@ -85,7 +109,7 @@ The [jsonRpcProvider.send](JsonRpcProvider-send) method can be used to access th
- [All JSON-RPC methods](link-json-rpc) (including the less common methods) which most
Ethereum Nodes support.
- [Parity's Trace Module](link-parity-trace) can be used to trace and debug EVM
execcution of a transaction (requires custom configuration)
execution of a transaction (requires custom configuration)
- [Geth's Debug Module](link-geth-debug) can be used to debug transactions and
internal cache state, etc.
- [Additional Geth Methods](link-geth-rpc)

View File

@@ -1,8 +1,6 @@
_section: Other Providers
Others...
_subsection: FallbackProvider @<FallbackProvider> @INHERIT<[[Provider]]> @SRC<providers/fallback-provider:class.FallbackProvider>
_subsection: FallbackProvider @<FallbackProvider> @INHERIT<[[BaseProvider]]> @SRC<providers/fallback-provider:class.FallbackProvider>
The **FallbackProvider** is the most advanced [[Provider]] available in
ethers.
@@ -11,7 +9,7 @@ It uses a quorum and connects to multiple [Providers](Provider) as backends,
each configured with a //priority// and a //weight// .
When a request is made, the request is dispatched to multiple backends, randomly
choosen (higher prioirty backends are always selected first) and the results from
chosen (lower-value priority backends are always selected first) and the results from
each are compared against the others. Only once the quorum has been reached will that
result be accepted and returned to the caller.
@@ -40,9 +38,9 @@ _property: fallbackProviderConfig.provider => [[Provider]]
The provider for this configuration.
_property: fallbackProviderConfig.priority => number
The priority used for the provider. Higher priorities are favoured over lower
priorities. If multiple providers share the same prioirty, they are choosen
at random.
The priority used for the provider. Lower-value priorities are favoured over
higher-value priorities. If multiple providers share the same priority, they
are chosen at random.
_property: fallbackProviderConfig.stallTimeout => number
The timeout (in ms) after which another [[Provider]] will be attempted. This
@@ -70,6 +68,18 @@ _property: ipcProvider.path => string
The path this [[Provider]] is connected to.
_subsection: JsonRpcBatchProvider @<JsonRpcBatchProvider> @INHERIT<[[JsonRpcProvider]]> @SRC<providers:class.JsonRpcBatchProvider>
The **JsonRpcBatchProvider** operated identically to any other Provider,
except the calls are implicly batched during an event-loop and sent using
the JSON-RPC batch protocol to the backend.
This results in fewer connections and fewer requests, which may result
in lower costs or faster responses, depending on your use case.
Keep in mind some backends may not support batched requests.
_subsection: UrlJsonRpcProvider @<UrlJsonRpcProvider> @INHERIT<[[JsonRpcProvider]]> @SRC<providers:class.UrlJsonRpcProvider>
This class is intended to be sub-classed and not used directly. It
@@ -93,15 +103,15 @@ The URL to use for the JsonRpcProvider instance.
_subsection: Web3Provider @<Web3Provider> @INHERIT<[[JsonRpcProvider]]>
_subsection: Web3Provider @<Web3Provider> @INHERIT<[[JsonRpcProvider]]> @SRC<providers:class.Web3Provider>
The Web3Provider is meant to ease moving from a [web3.js based](link-web3)
application to ethers by wraping an existing Web3-compatible (such as a
application to ethers by wrapping an existing Web3-compatible (such as a
[Web3HttpProvider](link-web3-http), [Web3IpcProvider](link-web3-ipc) or
[Web3WsProvider](link-web3-ws)) and exposing it as an ethers.js [[Provider]]
which can then be used with the rest of the library.
This may also be used to wrap a standard [EIP-1193 Provider](link-eip-1193].
This may also be used to wrap a standard [EIP-1193 Provider](link-eip-1193).
_property: new ethers.providers.Web3Provider(externalProvider [, network ])
Create a new **Web3Provider**, which wraps an [EIP-1193 Provider](link-eip-1193) or
@@ -144,3 +154,20 @@ This is identical to ``sendAsync``. Historically, this used a synchronous
web request, but no current browsers support this, so its use this way
was deprecated quite a long time ago
_subsection: WebSocketProvider @<WebSocketProvider> @INHERIT<[[JsonRpcProvider]]> @SRC<providers:class.WebSocketProvider>
The **WebSocketProvider** connects to a JSON-RPC WebSocket-compatible backend
which allows for a persistent connection, multiplexing requests and pub-sub
events for a more immediate event dispatching.
The WebSocket API is newer, and if running your own infrastructure, note that
WebSockets are much more intensive on your server resources, as they must manage
and maintain the state for each client. For this reason, many services may also
charge additional fees for using their WebSocket endpoints.
_property: new ethers.providers.WebSocketProvider([ url [ , network ] ])
Returns a new [[WebSocketProvider]] connected to //url// as the //network//.
If //url// is unspecified, the default ``"ws:/\/localhost:8546"`` will be used.
If //network// is unspecified, it will be queried from the network.

View File

@@ -1,42 +1,61 @@
_section: Provider @<Provider>
Explain what a provider is...
A **Provider** in ethers is a read-only abstraction to
access the blockchain data.
_note: Coming from Web3.js?
If you are coming from Web3.js, this is one of the biggest
differences you will encounter using ethers.
The ethers library creates a strong division between the
operation a **Provider** can perform and those of a [[Signer]],
which Web3.js lumps together.
This separation of concerns and a stricted subset of Provider
operations allows for a larger variety of backends, a more
consistent API and ensures other libraries to operate without
being able to rely on any underlying assumption.
_subsection: Accounts Methods @<Provider--account-methods>
_property: provider.getBalance(address [ , blockTag = latest ]) => Promise<[[BigNumber]]> @<Provider-getBalance> @SRC<providers/base-provider>
Returns the balance of //address// as of the //blockTag// block height.
_code: @lang<javascript>
//_result:
await provider.getBalance("ricmoo.eth");
//_log:
_property: provider.getCode(address [ , blockTag = latest ]) => Promise<string<[[DataHexString]]>> @<Provider-getCode> @SRC<providers/base-provider>
Returns the contract code of //address// as of the //blockTag// block height. If there is
no contract currently deployed, the result is ``0x``.
_code: @lang<javascript>
//_result:
await provider.getCode("registrar.firefly.eth");
//_log:
_property: provider.getStorageAt(addr, pos [ , blockTag = latest ]) => Promise<string<[[DataHexString]]>> @<Provider-getStorageAt> @SRC<providers/base-provider>
Returns the ``Bytes32`` value of the position //pos// at address //addr//, as of the //blockTag//.
_code: @lang<javascript>
//_result:
await provider.getStorageAt("registrar.firefly.eth", 0)
//_log:
_property: provider.getTransactionCount(address [ , blockTag = latest ]) => Promise<number> @<Provider-getTransactionCount> @SRC<providers/base-provider>
Returns the number of transactions //address// has ever **sent**, as of //blockTag//.
This value is required to be the nonce for the next transaction from //address//
sent to the network.
_code: Account Examples @lang<javascript>
_code: @lang<javascript>
// Get the balance for an account...
provider.getBalance("ricmoo.firefly.eth");
//!
// Get the code for a contract...
provider.getCode("registrar.firefly.eth");
//!
// Get the storage value at position 0...
provider.getStorageAt("registrar.firefly.eth", 0)
//!
// Get transaction count of an account...
provider.getTransactionCount("ricmoo.firefly.eth");
//!
//_result:
await provider.getTransactionCount("ricmoo.eth");
//_log:
_subsection: Blocks Methods @<Provider--block-methods>
@@ -45,22 +64,26 @@ _property: provider.getBlock(block) => Promise<[[providers-Block]]> @<Provider-
Get the //block// from the network, where the ``result.transactions`` is a list
of transaction hashes.
_code: @lang<javascript>
//_result:
await provider.getBlock(100004)
//_log:
_property: provider.getBlockWithTransactions(block) => Promise<[[providers-BlockWithTransactions]]> @<Provider-getBlockWithTransactions> @SRC<providers/base-provider>
Get the //block// from the network, where the ``result.transactions`` is
an Array of [[providers-TransactionResponse]] objects.
_code: Block Examples @lang<javascript>
_code: @lang<javascript>
provider.getBlock(100004)
//!
provider.getBlockWithTransactions(100004)
//!
//_result:
await provider.getBlockWithTransactions(100004)
//_log:
_subsection: Ethereum Naming Service (ENS) Methods @<Provider--ens-methods>
The [Ethereum Naming Service](link-ens) (ENS) allows a short and
easy-to-remember ENS Name to be atached to any set of keys
easy-to-remember ENS Name to be attached to any set of keys
and values.
One of the most common uses for this is to use a simple name to
@@ -73,26 +96,118 @@ reading and debugging much simpler.
The provider offers some basic operations to help resolve and
work with ENS names.
_property: provider.getAvatar(name) => Promise<string>
Returns the URL for the avatar associated to the ENS name, or null
if no avatar was configured.
_property: provider.getResolver(name) => Promise<[[EnsResolver]]>
Returns an EnsResolver instance which can be used to further inquire
about specific entries for an ENS name.
_code: @lang<javascript>
//_hide: provider = ethers.getDefaultProvider();
// See below (Resolver) for examples of using this object
const resolver = await provider.getResolver("ricmoo.eth");
//_hide: _page.resolver = resolver;
_property: provider.lookupAddress(address) => Promise<string> @<Provider-lookupAddress> @SRC<providers/base-provider>
Performs a reverse lookup of the //address// in ENS using the
//Reverse Registrar//. If the name does not exist, or the
forward lookup does not match, ``null`` is returned.
An ENS name requries additional configuration to setup a reverse
record, they are not automatically set up.
_code: @lang<javascript>
//_result:
await provider.lookupAddress("0x5555763613a12D8F3e73be831DFf8598089d3dCa");
//_log:
_property: provider.resolveName(name) => Promise<string<[Address](address)>> @<Provider-ResolveName> @SRC<providers/base-provider>
Looks up the address of //name//. If the name is not owned, or
does not have a //Resolver// configured, or the //Resolver// does
not have an address configured, ``null`` is returned.
_code: ENS Examples @lang<javascript>
_code: @lang<javascript>
// Reverse lookup of an ENS by address...
provider.lookupAddress("0x6fC21092DA55B392b045eD78F4732bff3C580e2c");
//!
//_result:
await provider.resolveName("ricmoo.eth");
//_log:
// Lookup an address of an ENS name...
provider.resolveName("ricmoo.firefly.eth");
//!
_subsection: EnsResolver @<EnsResolver>
_property: resolver.name => string
The name of this resolver.
_property: resolver.address => string<[[address]]>
The address of the Resolver.
_property: resolver.getAddress([ cointType = 60 ]) => Promise<string>
Returns a Promise which resolves to the [[link-eip-2304]] multicoin address
stored for the //coinType//. By default an Ethereum [[address]]
(``coinType = 60``) will be returned.
_code: @lang<javascript>
//_hide: const resolver = _page.resolver;
// By default, looks up the Ethereum address
// (this will match provider.resolveName)
//_result:
await resolver.getAddress();
//_log:
// Specify the coinType for other coin addresses (0 = Bitcoin)
//_result:
await resolver.getAddress(0);
//_log:
_property: resolver.getAvatar() => Promise<AvatarInfo>
Returns an object the provides the URL of the avatar and the
linkage representing each stage in the avatar resolution.
If there is no avatar found (or the owner of any NFT does not
match the name owner), null is returned.
The AvatarInfo has the properties:
- ``info.linkage`` - An array of info on each step resolving the avatar
- ``info.url`` - The URL of the avatar
_property: resolver.getContentHash() => Promise<string>
Returns a Promise which resolves to any stored [[link-eip-1577]] content hash.
_code: @lang<javascript>
//_hide: const resolver = _page.resolver;
//_result:
await resolver.getContentHash();
//_log:
_property: resolver.getText(key) => Promise<string>
Returns a Promise which resolves to any stored [[link-eip-634]] text entry for //key//.
_code: @lang<javascript>
//_hide: const resolver = _page.resolver;
//_result:
await resolver.getText("email");
//_log:
//_result:
await resolver.getText("url");
//_log:
//_result:
await resolver.getText("com.twitter");
//_log:
_subsection: Logs Methods @<Provider--log-methods>
@@ -109,36 +224,65 @@ _subsection: Network Status Methods @<Provider--network-methods>
_property: provider.getNetwork() => Promise<[[providers-Network]]> @<Provider-getNetwork> @SRC<providers/base-provider:method.BaseProvider.getNetwork>
Returns the [[providers-Network]] this Provider is connected to.
_code: @lang<javascript>
//_result:
await provider.getNetwork()
//_hide: _ = utils.shallowCopy(_);
//_hide: delete _._defaultProvider;
//_log:
_property: provider.getBlockNumber() => Promise<number> @<Provider-getBlockNumber> @SRC<providers/base-provider>
Returns the block number (or height) of the most recently mined block.
_code: @lang<javascript>
//_result:
await provider.getBlockNumber()
//_log:
_property: provider.getGasPrice() => Promise<[[BigNumber]]> @<Provider-getGasPrice> @SRC<providers/base-provider>
Returns a //best guess// of the [[gas-price]] to use in a transaction.
_code: Network Status Examples @lang<javascript>
_code: @lang<javascript>
// The network information
provider.getNetwork()
// <hide>
//!
network = utils.shallowCopy(_)
delete network._defaultProvider
network
// </hide>
//!
// The current block number
provider.getBlockNumber()
//!
// Get the current suggested gas price (in wei)...
// The gas price (in wei)...
gasPrice = await provider.getGasPrice()
//! async gasPrice
//_log: gasPrice
// ...often this gas price is easier to understand or
// display to the user in gwei (giga-wei, or 1e9 wei)
// display to the user in gwei
//_result:
utils.formatUnits(gasPrice, "gwei")
//!
//_log:
_property: provider.getFeeData() => Promise<[[providers-FeeData]]> @<Provider-getFeeData> @SRC<abstract-provider>
Returns the current recommended [[providers-FeeData]] to use in a transaction.
For an EIP-1559 transaction, the ``maxFeePerGas`` and ``maxPriorityFeePerGas``
should be used.
For legacy transactions and networks which do not support EIP-1559, the ``gasPrice``
should be used.
_code: @lang<javascript>
// The gas price (in wei)...
feeData = await provider.getFeeData()
//_log: feeData
// ...often these values are easier to understand or
// display to the user in gwei
//_result:
utils.formatUnits(feeData.maxFeePerGas, "gwei")
//_log:
_property: provider.ready => Promise<[[providers-Network]]> @<Provider-ready> @src<providers/base-provider>
Returns a Promise which will stall until the network has heen established,
ignoring errors due to the target node not being active yet.
This can be used for testing or attaching scripts to wait until the node is
up and running smoothly.
_subsection: Transactions Methods @<Provider--transaction-methods>
@@ -146,7 +290,19 @@ _subsection: Transactions Methods @<Provider--transaction-methods>
_property: provider.call(transaction [ , blockTag = latest ]) => Promise<string<[[DataHexString]]>> @<Provider-call> @SRC<providers/base-provider>
Returns the result of executing the //transaction//, using //call//. A call
does not require any ether, but cannot change any state. This is useful
for calling gettings on Contracts.
for calling getters on Contracts.
_code: @lang<javascript>
//_result:
await provider.call({
// ENS public resovler address
to: "0x4976fb03C32e5B8cfe2b6cCB31c09Ba78EBaBa41",
// `function addr(namehash("ricmoo.eth")) view returns (address)`
data: "0x3b3b57debf074faa138b72c65adbdcfb329847e4f2c04bde7f7dd7fcad5a52d2f395a558"
});
//_log:
_property: provider.estimateGas(transaction) => Promise<[[BigNumber]]> @<Provider-estimateGas> @SRC<providers/base-provider>
Returns an estimate of the amount of gas that would be required to submit //transaction//
@@ -156,44 +312,116 @@ An estimate may not be accurate since there could be another transaction
on the network that was not accounted for, but after being mined affected
relevant state.
_code: @lang<javascript>
//_hide: const parseEther = ethers.utils.parseEther;
//_result:
await provider.estimateGas({
// Wrapped ETH address
to: "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",
// `function deposit() payable`
data: "0xd0e30db0",
// 1 ether
value: parseEther("1.0")
});
//_log:
_property: provider.getTransaction(hash) => Promise<[[providers-TransactionResponse]]> @<Provider-getTransaction> @src<providers/base-provider>
Returns the transaction with //hash// or null if the transaction is unknown.
If a transaction has not been mined, this method will search the transaction
pool. Various backends may have more restrictive transaction pool access (e.g.
if the gas price is too low or the transaction was only recently sent and not
yet indexed) in which case this method may also return null.
_code: @lang<javascript>
//_result:
await provider.getTransaction("0x5b73e239c55d790e3c9c3bbb84092652db01bb8dbf49ccc9e4a318470419d9a0");
//_log:
_property: provider.getTransactionReceipt(hash) => Promise<[[providers-TransactionReceipt]]> @<Provider-getTransactionReceipt> @src<providers/base-provider>
Returns the transaction receipt for //hash// or null if the transaction
has not been mined.
To stall until the transaction has been mined, consider the ``waitForTransaction``
method below.
_code: @lang<javascript>
//_result:
await provider.getTransactionReceipt("0x5b73e239c55d790e3c9c3bbb84092652db01bb8dbf49ccc9e4a318470419d9a0");
//_log:
_property: provider.sendTransaction(transaction) => Promise<[[providers-TransactionResponse]]> @<Provider-sendTransaction> @SRC<providers/base-provider>
Submits //transaction// to the network to be mined. The //transaction// **must** be signed,
and be valid (i.e. the nonce is correct and the account has sufficient balance to pay
for the transaction).
_code: @lang<javascript>
//_hide: const provider = localProvider;
//_hide: const wallet = new ethers.Wallet(ethers.utils.id("HelloWorld"), provider);
//_hide: const fundTx = await localSigner.sendTransaction({
//_hide: to: wallet.address,
//_hide: value: ethers.utils.parseEther("2.0")
//_hide: });
//_hide: await fundTx.wait();
//_hide: const tx = await localSigner.populateTransaction({ to: "ricmoo.eth", value: ethers.utils.parseEther("3.14159") });
//_hide: const signedTx = await localSigner.signTransaction(tx);
//_verbatim: `const signedTx = ${ JSON.stringify(signedTx) };`
//_result:
await provider.sendTransaction(signedTx);
//_log:
_property: provider.waitForTransaction(hash [ , confirms = 1 [ , timeout ] ]) => Promise<[TxReceipt](providers-TransactionReceipt)> @<Provider-waitForTransaction> @SRC<providers/base-provider>
Returns a Promise which will not resolve until //transactionHash// is mined.
If //confirms// is 0, this method is non-blocking and if the
transaction has not been mined returns null. Otherwise,
this method will block until the transaction has //confirms//
blocks mined on top of the block in which is was mined.
_subsection: Event Emitter Methods @<Provider--event-methods>
Explain events here...
The EventEmitter API allows applications to use an
[[link-wiki-observer-pattern]] to register callbacks for when
various events occur.
This closely follows the Event Emitter provided by other JavaScript
libraries with the exception that event names support some more
[complex objects](Provider--events), not only strings. The objects
are normalized internally.
_property: provider.on(eventName, listener) => this @<Provider-on> @SRC<providers/base-provider>
Add a //listener// to be triggered for each //eventName//.
Add a //listener// to be triggered for each //eventName// [event](Provider--events).
_property: provider.once(eventName, listener) => this @<Provider-once> @SRC<providers/base-provider>
Add a //listener// to be triggered for only the next //eventName//,
at which time it be removed.
Add a //listener// to be triggered for only the next
//eventName// [event](Provider--events), at which time it will be removed.
_property: provider.emit(eventName, ...args) => boolean @<Provider-emit> @SRC<providers/base-provider>
Notify all listeners of //eventName//, passing //args// to each listener. This
is generally only used internally.
Notify all listeners of the //eventName// [event](Provider--events),
passing //args// to each listener. This is generally only used internally.
_property: provider.off(eventName [ , listener ]) => this @<Provider-off> @SRC<providers/base-provider>
Remove a //listener// for //eventName//. If no //listener// is provided,
all listeners for //eventName// are removed.
Remove a //listener// for the //eventName// [event](Provider--events).
If no //listener// is provided, all listeners for //eventName// are removed.
_property: provider.removeAllListeners([ eventName ]) => this @<Provider-removeAllListeners> @SRC<providers/base-provider>
Remove all the listeners for //eventName//. If no //eventName// is provided,
**all** events are removed.
Remove all the listeners for the //eventName// [events](Provider--events).
If no //eventName// is provided, **all** events are removed.
_property: provider.listenerCount([ eventName ]) => number @<Provider-listenerCount> @SRC<providers/base-provider>
Returns the number of listeners for //eventName//. If no //eventName// is
provided, the total number of listeners is returned.
Returns the number of listeners for the //eventName// [events](Provider--events).
If no //eventName// is provided, the total number of listeners is returned.
_property: provider.listeners(eventName) => Array<Listener> @<Provider-listeners> @SRC<providers/base-provider>
Returns the list of Listeners for //eventName//.
Returns the list of Listeners for the //eventName// [events](Provider--events).
_heading: Events @<Provider--events>
@@ -207,7 +435,7 @@ properties ``address`` (the source contract) and ``topics`` (a topic-set to matc
If ``address`` is unspecified, the filter matches any contract address.
See events for more information on how to specify topic-sets.
See [EventFilters](providers-EventFilter) for more information on filtering events.
_definition: **Topic-Set Filter**
@@ -216,6 +444,8 @@ The value of a **Topic-Set Filter** is a array of Topic-Sets.
This event is identical to a //Log Filter// with the address omitted (i.e. from
any contract).
See [EventFilters](providers-EventFilter) for more information on filtering events.
_definition: **Transaction Filter**
The value of a **Transaction Filter** is any transaction hash.
@@ -260,11 +490,10 @@ $Debug: each Provider may use this to emit useful debugging information
_code: Events Example @lang<javascript>
// <hide>
const txHash = utils.id("dummy-data");
const myAddress = ethers.constants.HashZero;
const myOtherAddress = ethers.constants.HashZero;
// </hide>
//_hide: const txHash = utils.id("dummy-data");
//_hide: const myAddress = ethers.constants.HashZero;
//_hide: const myOtherAddress = ethers.constants.HashZero;
//_hide: const hexZeroPad = ethers.utils.hexZeroPad;
provider.on("block", (blockNumber) => {
// Emitted on every block change
@@ -282,7 +511,7 @@ provider.once(txHash, (transaction) => {
filter = {
address: "dai.tokens.ethers.eth",
topics: [
utils.id("Transfer(address,address,uint256")
utils.id("Transfer(address,address,uint256)")
]
}
provider.on(filter, (log, event) => {
@@ -293,11 +522,11 @@ provider.on(filter, (log, event) => {
// Notice this is an array of topic-sets and is identical to
// using a filter with no address (i.e. match any address)
topicSets = [
utils.id("Transfer(address,address,uint256"),
utils.id("Transfer(address,address,uint256)"),
null,
[
myAddress,
myOtherAddress
hexZeroPad(myAddress, 32),
hexZeroPad(myOtherAddress, 32)
]
]
provider.on(topicSets, (log, event) => {
@@ -314,13 +543,24 @@ provider.on("error", (tx) => {
// Emitted when any error occurs
});
// <hide>
// Make sure our documentation builds without waiting forever
provider.removeAllListeners()
// </hide>
//_hide: provider.removeAllListeners() /* Make sure the docs build without waiting forever */
_subsection: Inspection Methods @<Provider--inspection-methods>
_property: Provider.isProvider(object) => boolean @<Provider-isProvider> @SRC<abstract-provider>
Returns true if and only if //object// is a Provider.
_subsection: BaseProvider @<BaseProvider> @INHERIT<[[Provider]]> @SRC<providers:class.BaseProvider>
Most Providers available in ethers are sub-classes of BaseProvider, which
simplifies sub-classes, as it handles much of the event operations, such as
polling and formatting.
_property: provider.polling => boolean
Indicates if the Provider is currently polling. If there are no events to
poll for or polling has been explicitly disabled, this will be false.
_property: provider.pollingInterval => number
The frequency at which the provider polls.

View File

@@ -1,26 +1,27 @@
_section: Types
_subsection: BlockTag @<providers-BlockTag>
A **BlockTag** specifies a specific location in the Blockchain.
A **BlockTag** specifies a specific block location in the Blockchain.
- **``"latest"``** -- The most recently mined block
- **``"earliest"``** -- Block #0
- **``"pending"``** -- The block currently being prepared for mining; not all
- **``"latest"``** - The most recently mined block
- **``"earliest"``** - Block #0
- **``"pending"``** - The block currently being prepared for mining; not all
operations and backends support this BlockTag
- **//number//** -- The block at this height
- **//a negative number//** -- The block this many blocks ago
- **//number//** - The block at this height
- **//a negative number//** - The block this many blocks ago
- **//hex string//** - The block at this height (as a hexidecimal value)
_heading: EventType @<providers-EventType>
And **EventType** can be any of the following.
- **//string//** -- TODO...
- **//Array<string<[[DataHexString]]<32>> | Array<string<[[DataHexString]]<32>>>>//** -- TODO...
- **//[[providers-EventFilter]]//** -- TODO...
_subsection: Networkish @<providers-Networkish>
A **Networkish** may be any of the following:
- a [[providers-Network]] object
- the name of a common network as a string (e.g. ``"homestead"``)
- the chain ID a network as a number; if the chain ID is that of a
common network, the ``name`` and ``ensAddress`` will be populated, otherwise,
the default name ``"unknown"`` and no ``ensAddress`` is used
_subsection: Network @<providers-Network>
A **Network** represents an Etherem network.
A **Network** represents an Ethereum network.
_property: network.name => string
The human-readable name of the network, such as ``homestead``. If the network
@@ -33,6 +34,23 @@ _property: network.ensAddress => string<[[address]]>
The address at which the ENS registry is deployed on this network.
_subsection: FeeData @<providers-FeeData>
A **FeeData** object encapsulates the necessary fee data required
to send a transaction, based on the best available recommendations.
_property: feeData.gasPrice => [[BigNumber]]
The gasPrice to use for legacy transactions or networks which do not
support EIP-1559.
_property: feeData.maxFeePerGas => [[BigNumber]]
The ``maxFeePerGas`` to use for a transaction. This is based on the
most recent block's ``baseFee``.
_property: feeData.maxPriorityFeePerGas => [[BigNumber]]
The ``maxPriorityFeePerGas`` to use for a transaction. This accounts
for the uncle risk and for the majority of current MEV risk.
_subsection: Block @<providers-Block>
_property: block.hash => string<[[DataHexString]]<32>>
@@ -50,19 +68,19 @@ The timestamp of this block.
_property: block.nonce => string<[[DataHexString]]>
The nonce used as part of the proof-of-work to mine this block.
This property is generally of little interest developers.
This property is generally of little interest to developers.
_property: block.difficulty => number
The difficulty target required to be met by the miner of the block.
This property is generally of little interest developers.
This property is generally of little interest to developers.
_property: block.gasLimit => [[BigNumber]]
The maximum amount of gas that this block was permitted to use. This
is a value that can be voted up or voted down by miners and is used
to automatically adjust the bandwidth requirements of the network.
This property is generally of little interest developers.
This property is generally of little interest to developers.
_property: block.gasUsed => [[BigNumber]]
The total amount of gas used by all transactions in this block.
@@ -74,7 +92,7 @@ miner that mined this block would like the subsidy reward to go to.
_property: block.extraData => string
This is extra data a miner may choose to include when mining a block.
This property is generally of little interest developers.
This property is generally of little interest to developers.
_heading: Block (with transaction hashes)
@@ -102,10 +120,15 @@ _heading: EventFilter @<providers-EventFilter>
_property: filter.address => string<[[address]]>
The address to filter by, or ``null`` to match any address.
_property: filter.topics => Array<string<[[DataHexString]]<32>> | Array<string<[[DataHexString]]<32>>>>
The topics to filter by, or ``null`` to match any topics. Each entry represents an
**AND** condition that must match, or may be ``null`` to match anything. If a given
entry is an Array, then that entry is treated as an **OR** for any value in the entry.
_property: filter.topics => Array<string<[Data](DataHexString)<32>> | Array<string<[Data](DataHexString)<32>>>>
The topics to filter by or ``null`` to match any topics.
Each entry represents an **AND** condition that must match, or may
be ``null`` to match anything. If a given entry is an Array, then
that entry is treated as an **OR** for any value in the entry.
See [Filters](events--filters) for more details and examples
on specifying complex filters.
_heading: Filter @<providers-Filter> @INHERIT<[[providers-EventFilter]]>
@@ -177,18 +200,47 @@ _property: transactionRequest.nonce => number | Promise<number>
The nonce for this transaction. This should be set to the number of
transactions ever sent **from** this address.
_property: transactionRequest.gasLimit => [[BigNumber]] | Promise<[[BigNumber]]>
The maximum amount of gas this transaction is permitted to use.
_property: transactionRequest.gasPrice => [[BigNumber]] | Promise<[[BigNumber]]>
The price (in wei) per unit of gas this transaction will pay.
_property: transactionRequest.data => [[DataHexString]] | Promise<[[DataHexString]]>
The transaction data.
_property: transactionRequest.value => [[BigNumber]] | Promise<[[BigNumber]]>
The amount (in wei) this transaction is sending.
_property: transactionRequest.gasLimit => [[BigNumber]] | Promise<[[BigNumber]]>
The maximum amount of gas this transaction is permitted to use.
If left unspecified, ethers will use ``estimateGas`` to determine the value
to use. For transactions with unpredicatable gas estimates, this may be required
to specify explicitly.
_property: transactionRequest.gasPrice => [[BigNumber]] | Promise<[[BigNumber]]>
The price (in wei) per unit of gas this transaction will pay.
This may not be specified for transactions with ``type`` set to ``1`` or ``2``, or
if ``maxFeePerGas`` or ``maxPriorityFeePerGas`` is given.
_property: transactionRequest.maxFeePerGas => [[BigNumber]] | Promise<[[BigNumber]]>
The maximum price (in wei) per unit of gas this transaction will pay for the
combined [[link-eip-1559]] block's base fee and this transaction's priority fee.
Most developers should leave this unspecified and use the default value that
ethers determines from the network.
This may not be specified for transactions with ``type`` set to ``0`` or if ``gasPrice``
is specified..
_property: transactionRequest.maxPriorityFeePerGas => [[BigNumber]] | Promise<[[BigNumber]]>
The price (in wei) per unit of gas this transaction will allow in addition to
the [[link-eip-1559]] block's base fee to bribe miners into giving this transaction
priority. This is **included in** the ``maxFeePerGas``, so this will **not affect**
the total maximum cost set with ``maxFeePerGas``.
Most developers should leave this unspecified and use the default value that
ethers determines from the network.
This may not be specified for transactions with ``type`` set to ``0`` or if ``gasPrice``
is specified.
_property: transactionRequest.chainId => number | Promise<number>
The chain ID this transaction is authorized on, as specified by
[EIP-155](link-eip-155).
@@ -196,7 +248,19 @@ The chain ID this transaction is authorized on, as specified by
If the chain ID is 0 will disable EIP-155 and the transaction will be valid
on any network. This can be **dangerous** and care should be taken, since it
allows transactions to be replayed on networks that were possibly not
intended.
intended. Intentionally-replayable transactions are also disabled by default
on recent versions of Geth and require configuration to enable.
_property: transactionRequest.type => null | number
The [[link-eip-2718]] type of this transaction envelope, or ``null``
for to use the network default. To force using a lagacy transaction
without an envelope, use type ``0``.
_property: transactionRequest.accessList => [[providers-AccessListish]]
The [[providers-AccessList]] to include; only available for [[link-eip-2930]]
and [[link-eip-1559]] transactions.
_heading: TransactionResponse @<providers-TransactionResponse> @INHERIT<[[Transaction]]>
@@ -220,16 +284,50 @@ The number of blocks that have been mined (including the initial block) since th
transaction was mined.
_property: transaction.raw => string<[[DataHexString]]>
The serialized transaction.
The serialized transaction. This may be null as some backends do not
rpopulate it. If this is required, it can be computed from a **TransactionResponse**
object using [this cookbook recipe](cookbook--compute-raw-transaction).
_property: transaction.wait([ confirmations = 1 ]) => Promise<[[providers-TransactionReceipt]]>
Wait for //confirmations//. If 0, and the transaction has not been mined,
``null`` is returned.
_property: transaction.wait([ confirms = 1 ]) => Promise<[[providers-TransactionReceipt]]>
Resolves to the [[providers-TransactionReceipt]] once the transaction
has been included in the chain for //confirms// blocks. If //confirms//
is 0, and the transaction has not been mined, ``null`` is returned.
If the transaction execution failed (i.e. the receipt status is ``0``),
a [CALL_EXCEPTION](errors--call-exception) error will be rejected with
the following properties:
- ``error.transaction`` - the original transaction
- ``error.transactionHash`` - the hash of the transaction
- ``error.receipt`` - the actual receipt, with the status of ``0``
If the transaction is replaced by another transaction, a
[TRANSACTION_REPLACED](errors--transaction-replaced) error will be rejected
with the following properties:
- ``error.hash`` - the hash of the original transaction which was replaced
- ``error.reason`` - a string reason; one of ``"repriced"``, ``"cancelled"`` or ``"replaced"``
- ``error.cancelled`` - a boolean; a ``"repriced"`` transaction is not considered cancelled, but ``"cancelled"`` and ``"replaced"`` are
- ``error.replacement`` - the replacement transaction (a [[providers-TransactionResponse]])
- ``error.receipt`` - the receipt of the replacement transaction (a [[providers-TransactionReceipt]])
Transactions are replaced when the user uses an option in their client to
send a new transaction from the same account with the original ``nonce``.
This is usually to speed up a transaction or to cancel one, by bribing
miners with additional fees to prefer the new transaction over the original one.
_property: transactionRequest.type => number
The [[link-eip-2718]] type of this transaction. If the transaction
is a legacy transaction without an envelope, it will have the type ``0``.
_property: transactionRequest.accessList => [[providers-AccessList]]
The [[providers-AccessList]] included, or null for transaction types which
do not support access lists.
_heading: TransactionReceipt @<providers-TransactionReceipt>
_property: receipt.to => string<[[address]]>
The address this transaction is to. This is ``null`` if the the
The address this transaction is to. This is ``null`` if the
transaction was an **init transaction**, used to deploy a contract.
_property: receipt.from => string<[[address]]>
@@ -248,6 +346,10 @@ _property: receipt.transactionIndex => number
The index of this transaction in the list of transactions included in
the block this transaction was mined in.
_property: receipt.type => number
The [[link-eip-2718]] type of this transaction. If the transaction
is a legacy transaction without an envelope, it will have the type ``0``.
_property: receipt.root => string
The intermediate state root of a receipt.
@@ -262,9 +364,19 @@ must be considered.
_property: receipt.gasUsed => [[BigNumber]]
The amount of gas actually used by this transaction.
_property: receipt.effectiveGasPrice => [[BigNumber]]
The effective gas price the transaction was charged at.
Prior to EIP-1559 or on chains that do not support it, this value will
simply be equal to the transaction ``gasPrice``.
On EIP-1559 chains, this is equal to the block ``baseFee`` for the block
that the transaction was included in, plus the transaction
``maxPriorityFeePerGas`` clamped to the transaction ``maxFeePerGas``.
_property: receipt.logsBloom => string<[[DataHexString]]>
A [bloom-filter](link-wiki-bloomfilter), which
incldues all the addresses and topics included in any log in this
includes all the addresses and topics included in any log in this
transaction.
_property: receipt.blockHash => string<[[DataHexString]]<32>>
@@ -286,7 +398,7 @@ including the actual block it was mined in.
_property: receipt.cumulativeGasUsed => [[BigNumber]]
For the block this transaction was included in, this is the sum of the
gas used used by each transaction in the ordered list of transactions
gas used by each transaction in the ordered list of transactions
up to (and including) this transaction.
This is generally of little interest to developers.
@@ -299,3 +411,102 @@ _property: receipt.status => boolean
The status of a transaction is 1 is successful or 0 if it was
reverted. Only transactions included in blocks [post-Byzantium Hard Fork](link-eip-609)
have this property.
_subsection: Access Lists
An Access List is optional an includes a list of addresses and storage
slots for that address which should be //warmed// or pre-fetched for
use within the execution of this transaction. A //warmed// value has an
additional upfront cost to access, but is discounted throughout the code
execution for reading and writing.
_heading: AccessListish @<providers-AccessListish>
A looser description of an [[providers-AccessList]], which will be
converted internally using [accessListify](utils-accessListify).
It may be any of:
- any [[providers-AccessList]]
- an Array of 2-element Arrays, where the first element is the address
and second array is an array of storage keys
- an object, whose keys represent the addresses and each value is an
array of storage keys
When using the object form (the last option), the addresses and storage
slots will be sorted. If an explicit order for the access list is
required, one of the other forms must be used. Most developers
**do not** require explicit order.
_code: equivalent to the AccessList example below @lang<javascript>
// Option 1:
// AccessList
// see below
// Option 2:
// Array< [ Address, Array<Bytes32> ] >
//_hide: ;
accessList = [
[
"0x0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e",
[
"0x0000000000000000000000000000000000000000000000000000000000000004",
"0x0bcad17ecf260d6506c6b97768bdc2acfb6694445d27ffd3f9c1cfbee4a9bd6d"
]
],
[
"0x5FfC014343cd971B7eb70732021E26C35B744cc4",
[
"0x0000000000000000000000000000000000000000000000000000000000000001"
]
]
];
// Option 3:
// Record<Address, Array<Bytes32>>
accessList = {
"0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e": [
"0x0000000000000000000000000000000000000000000000000000000000000004",
"0x0bcad17ecf260d6506c6b97768bdc2acfb6694445d27ffd3f9c1cfbee4a9bd6d"
],
"0x5FfC014343cd971B7eb70732021E26C35B744cc4": [
"0x0000000000000000000000000000000000000000000000000000000000000001"
]
};
_heading: AccessList @<providers-AccessList>
An [[link-eip-2930]] transaction allows an optional **AccessList**
which causes a transaction to //warm// (i.e. pre-cache) another
addresses state and the specified storage keys.
This incurs an increased intrinsic cost for the transaction, but provides
discounts for storage and state access throughout the execution of the
transaction.
_code: example access list
// Array of objects with the form:
// {
// address: Address,
// storageKey: Array< DataHexString< 32 > >
// }
accessList = [
{
address: "0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e",
storageKeys: [
"0x0000000000000000000000000000000000000000000000000000000000000004",
"0x0bcad17ecf260d6506c6b97768bdc2acfb6694445d27ffd3f9c1cfbee4a9bd6d"
]
},
{
address: "0x5FfC014343cd971B7eb70732021E26C35B744cc4",
storageKeys: [
"0x0000000000000000000000000000000000000000000000000000000000000001"
]
}
];

View File

@@ -6,7 +6,7 @@ which can be used to sign messages and transactions and send
signed transactions to the Ethereum Network to execute state
changing operations.
The available operations depends largely on the sub-class used.
The available operations depend largely on the sub-class used.
For example, a Signer from MetaMask can send transactions and sign
messages but cannot sign a transaction (without broadcasting it).
@@ -20,9 +20,9 @@ The most common Signers you will encounter are:
_subsection: Signer @<Signer> @SRC<abstract-signer:class.Signer>
The **Signer** class is abstract and cannot be directly instaniated.
The **Signer** class is abstract and cannot be directly instantiated.
Instead use one of the concreate sub-classes, such as the [[Wallet]],
Instead use one of the concrete sub-classes, such as the [[Wallet]],
[[VoidSigner]] or [[JsonRpcSigner]].
_property: signer.connect(provider) => [[Signer]] @<Signer-connect>
@@ -39,7 +39,7 @@ asynchronous source, such as hardware wallets.
Sub-classes **must** implement this.
_property: Signer.isSigner(object) => boolean @<Signer-isSigner> @SRC<abstract-signer>
Returns true if an only if //object// is a **Signer**.
Returns true if and only if //object// is a **Signer**.
_heading: Blockchain Methods @<Signer--blockchain-methods>
@@ -47,7 +47,7 @@ _property: signer.getBalance([ blockTag = "latest" ]) => Promise<[[BigNumber]]>
Returns the balance of this wallet at //blockTag//.
_property: signer.getChainId() => Promise<number> @<Signer-getChainId> @SRC<abstract-signer>
Returns ths chain ID this wallet is connected to.
Returns the chain ID this wallet is connected to.
_property: signer.getGasPrice() => Promise<[[BigNumber]]> @<Signer-getGasPrice> @SRC<abstract-signer>
Returns the current gas price.
@@ -74,6 +74,12 @@ _property: signer.signMessage(message) => Promise<string<[RawSignature](signatur
This returns a Promise which resolves to the [[signature-raw]]
of //message//.
A signed message is prefixd with ``"\\x19Ethereum Signed Message:\\n"`` and
the length of the message, using the [hashMessage](utils-hashMessage)
method, so that it is [EIP-191](link-eip-191) compliant. If recovering
the address in Solidity, this prefix will be required to create a matching
hash.
Sub-classes **must** implement this, however they may throw if signing a
message is not supported, such as in a Contract-based Wallet or
Meta-Transaction-based Wallet.
@@ -112,6 +118,61 @@ Sub-classes **must** implement this, however they may throw if sending a
transaction is not supported, such as the [[VoidSigner]] or if the
Wallet is offline and not connected to a [[Provider]].
_property: signer._signTypedData(domain, types, value) => Promise<string<[RawSignature](signature-raw)>> @<Signer-signTypedData>
Signs the typed data //value// with //types// data structure for //domain// using
the [[link-eip-712]] specification.
_warning: Experimental feature (this method name will change)
This is still an experimental feature. If using it, please specify the **exact**
version of ethers you are using (e.g. spcify ``"5.0.18"``, **not** ``"^5.0.18"``) as
the method name will be renamed from ``_signTypedData`` to ``signTypedData`` once
it has been used in the field a bit.
_code: Typed Data Example @lang<javascript>
//_hide: signer = new Wallet("0x1234567890123456789012345678901234567890123456789012345678901234");
// All properties on a domain are optional
const domain = {
name: 'Ether Mail',
version: '1',
chainId: 1,
verifyingContract: '0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC'
};
// The named list of all type definitions
const types = {
Person: [
{ name: 'name', type: 'string' },
{ name: 'wallet', type: 'address' }
],
Mail: [
{ name: 'from', type: 'Person' },
{ name: 'to', type: 'Person' },
{ name: 'contents', type: 'string' }
]
};
// The data to sign
const value = {
from: {
name: 'Cow',
wallet: '0xCD2a3d9F938E13CD947Ec05AbC7FE734Df8DD826'
},
to: {
name: 'Bob',
wallet: '0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB'
},
contents: 'Hello, Bob!'
};
//_result:
signature = await signer._signTypedData(domain, types, value);
//_log:
_heading: Sub-Classes @<Signer--subclassing>
It is very important that all important properties of a **Signer** are
@@ -121,23 +182,23 @@ properties such as the //provider// and //address// static throughout the
life-cycle of the Signer helps prevent serious issues and many other classes
and libraries make this assumption.
A sub-class **must** extend Sigenr and **must** call ``super()``.
A sub-class **must** extend Signer and **must** call ``super()``.
_property: signer.checkTransaction(transactionRequest) => [[providers-TransactionRequest]] @<Signer-checkTransaction> @SRC<abstract-signer>
This is generally not required to be overridden, but may needed to provide
This is generally not required to be overridden, but may be needed to provide
custom behaviour in sub-classes.
This should return a **copy** of the //transactionRequest//, with any properties
needed by ``call``, ``estimateGas`` and ``populateTransaction`` (which is used
by sendTransaction). It should also throw an error if any unknown key is specified.
The default implementation checks only valid [[providers-TransactionRequest]] properties
The default implementation checks only if valid [[providers-TransactionRequest]] properties
exist and adds ``from`` to the transaction if it does not exist.
If there is a ``from`` field it **must** be verified to be equal to the Signer's address.
_property: signer.populateTransaction(transactionRequest) => Promise<[[providers-TransactionRequest]]> @<Signer-populateTransaction> @SRC<abstract-signer>
This is generally not required to be overridden, but may needed to provide
This is generally not required to be overridden, but may be needed to provide
custom behaviour in sub-classes.
This should return a **copy** of //transactionRequest//, follow the same procedure
@@ -167,7 +228,7 @@ does not have a secure entropy source, an error is thrown.
Wallets created using this method will have a mnemonic.
_property: ethers.Wallet.fromEncryptedJson(json, password [ , progress ]) => Promise<[[Wallet]]> @<Wallet-fromEncryptedJson> @SRC<wallet>
Create an instance from an encrypted JSON wallet.
Create an instance by decrypting an encrypted JSON wallet.
If //progress// is provided it will be called during decryption
with a value between 0 and 1 indicating the progress towards
@@ -193,11 +254,11 @@ _property: wallet.address => string<[[address]]>
The address for the account this Wallet represents.
_property: wallet.provider => [[Provider]]
The provider this wallet is connected to, which will ge used for any [[Signer--blockchain-methods]]
The provider this wallet is connected to, which will be used for any [[Signer--blockchain-methods]]
methods. This can be null.
_note: Note
A **Wallet** instance is immuatable, so if you wish to change the Provider, you
A **Wallet** instance is immutable, so if you wish to change the Provider, you
may use the [connect](Signer-connect) method to create a new instance connected
to the desired provider.
@@ -224,35 +285,43 @@ walletMnemonic = Wallet.fromMnemonic(mnemonic)
// ...or from a private key
walletPrivateKey = new Wallet(walletMnemonic.privateKey)
//_result:
walletMnemonic.address === walletPrivateKey.address
//!
//_log:
// The address as a Promise per the Signer API
walletMnemonic.getAddress()
//!
//_result:
await walletMnemonic.getAddress()
//_log:
// A Wallet address is also available synchronously
//_result:
walletMnemonic.address
//!
//_log:
// The internal cryptographic components
//_result:
walletMnemonic.privateKey
//!
//_log:
//_result:
walletMnemonic.publicKey
//!
//_log:
// The wallet mnemonic
//_result:
walletMnemonic.mnemonic
//!
//_log:
// Note: A wallet created with a private key does not
// have a mnemonic (the derivation prevents it)
//_result:
walletPrivateKey.mnemonic
//!
//_log:
// Signing a message
walletMnemonic.signMessage("Hello World")
//!
//_result:
await walletMnemonic.signMessage("Hello World")
//_log:
tx = {
to: "0x8ba1f109551bD432803012645Ac136ddd64DBA72",
@@ -260,24 +329,29 @@ tx = {
}
// Signing a transaction
walletMnemonic.signTransaction(tx)
//!
//_result:
await walletMnemonic.signTransaction(tx)
//_log:
// The connect method returns a new instance of the
// Wallet connected to a provider
//_result:
wallet = walletMnemonic.connect(provider)
//_null:
// Querying the network
wallet.getBalance();
//!
wallet.getTransactionCount();
//!
//_result:
await wallet.getBalance();
//_log:
//_result:
await wallet.getTransactionCount();
//_log:
// Sending ether
wallet.sendTransaction(tx)
// <hide>
//! error
// </hide>
//_hide: wallet = localSigner; /* prevent insufficient funds error from blowing up the docs */
//_result:
await wallet.sendTransaction(tx)
//_log:
@@ -310,12 +384,10 @@ abi = [
]
contract = new ethers.Contract("dai.tokens.ethers.eth", abi, signer)
// <hide>
//!
// </hide>
// Get the number of tokens for this account
//_result:
tokens = await contract.balanceOf(signer.getAddress())
//! async tokens
//_log:
//
// Pre-flight (check for revert) on DAI from the signer
@@ -327,12 +399,14 @@ tokens = await contract.balanceOf(signer.getAddress())
//
// This will pass since the token balance is available
contract.callStatic.transfer("donations.ethers.eth", tokens)
//!
//_result:
await contract.callStatic.transfer("donations.ethers.eth", tokens)
//_log:
// This will fail since it is greater than the token balance
contract.callStatic.transfer("donations.ethers.eth", tokens.add(1))
//! error
//_throws:
await contract.callStatic.transfer("donations.ethers.eth", tokens.add(1))
//_log:
_subsection: ExternallyOwnedAccount @<ExternallyOwnedAccount>
@@ -352,5 +426,5 @@ The privateKey of this EOA
_property: eoa.mnemonic => [[Mnemonic]]
//Optional//. The account HD mnemonic, if it has one and can be
determined. Some sources do not encode the mnemonic, such as an
determined. Some sources do not encode the mnemonic, such as
HD extended keys.

View File

@@ -12,7 +12,7 @@ _subsection: Creating Instance @<AbiCoder--creating>
For the most part, there should never be a need to manually create
an instance of an [[AbiCoder]], since one is created with the
default coersion function when the library is loaded which can
default coercion function when the library is loaded which can
be used universally.
This is likely only needed by those with specific needs to override
@@ -39,10 +39,81 @@ _subsection: Coding Methods @<AbiCoder--methods>
_property: abiCoder.encode(types, values) => string<[[DataHexString]]> @<AbiCoder-encode> @SRC<abi/abi-coder>
Encode the array //values// according the array of //types//, each of which may be a
Encode the array //values// according to the array of //types//, each of which may be a
string or a [[ParamType]].
_code: @lang<javascript>
//_hide: const abiCoder = utils.defaultAbiCoder;
// Encoding simple types
//_result:
abiCoder.encode([ "uint", "string" ], [ 1234, "Hello World" ]);
//_log:
//_hide: _page.example1 = _;
// Encoding with arrays types
//_result:
abiCoder.encode([ "uint[]", "string" ], [ [ 1234, 5678 ] , "Hello World" ]);
//_log:
//_hide: _page.example2 = _;
// Encoding complex structs (using positional properties)
//_result:
abiCoder.encode(
[ "uint", "tuple(uint256, string)" ],
[
1234,
[ 5678, "Hello World" ]
]
);
//_log:
//_hide: _page.example3 = _;
// Encoding complex structs (using keyword properties)
//_result:
abiCoder.encode(
[ "uint a", "tuple(uint256 b, string c) d" ],
[
1234,
{ b: 5678, c: "Hello World" }
]
);
//_log:
_property: abiCoder.decode(types, data) => [[Result]] @<AbiCoder-decode> @SRC<abi/abi-coder>
Decode the //data// according to the array of //types//, each of which may be a
string or [[ParamType]].
_code: @lang<javascript>
//_hide: const abiCoder = utils.defaultAbiCoder;
// Decoding simple types
//_hide: data = _page.example1;
//_verbatim: `data = ${ JSON.stringify(data) };`
//_result:
abiCoder.decode([ "uint", "string" ], data);
//_log:
// Decoding with arrays types
//_hide: data = _page.example2;
//_verbatim: `data = ${ JSON.stringify(data) };`
//_result:
abiCoder.decode([ "uint[]", "string" ], data);
//_log:
// Decoding complex structs; unnamed parameters allows ONLY
// positional access to values
//_hide: data = _page.example3;
//_verbatim: `data = ${ JSON.stringify(data) };`
//_result:
abiCoder.decode([ "uint", "tuple(uint256, string)" ], data);
//_log:
// Decoding complex structs; named parameters allows positional
// or keyword access to values
//_result:
abiCoder.decode([ "uint a", "tuple(uint256 b, string c) d" ], data);
//_log:

View File

@@ -1,11 +1,289 @@
_section: ABI Formats @<abi-formats>
@TODO: Expand this section
There are several formats available to specify an ABI for
a Smart Contract, which specifies to the under-lying library
what methods, events and errors exist so that encoding and
decoding the data from and to the network can be handled by
the library.
The supports ABI types are:
- [Human-Readable ABI](abi-formats--human-readable-abi)
- [Solidity JSON ABI](abi-formats--solidity)
- [Solidity Object ABI](abi-formats--object)
_subsection: Human-Readable ABI @<abi-formats--human-readable-abi>
See [Human-Readable Abi](link-ricmoo-humanreadableabi).
The **Human-Readable ABI** was [introduced early by ethers](link-ricmoo-humanreadableabi),
which allows for a Solidity signatures to be used to describe each
method, event and error.
It is important to note that a Solidity signature **fully describes**
all the properties the ABI requires:
- name
- type (constructor, event, function)
- inputs (types, nested structures and optionally names)
- outputs (types nested structures and optionally names)
- state mutability (for constructors and methods)
- payability (for constructors and methods)
- whether inputs are indexed (for events)
This allows for a simple format which is both machine-readable (since
the parser is a machine) and human-readable (at least **developer-readable**),
as well as simple for humans to type and inline into code, which improves
code readability. The Human-Readable ABI is also considerably smaller, which
helps reduce code size.
A Human-Readable ABI is simple an array of strings, where each string is
the Solidity signature.
Signatures may be minimally specified (i.e. names of inputs and outputs
may be omitted) or fully specified (i.e. with all property names) and
whitespace is ignored.
Several modifiers available in Solidity are dropped internally, as they
are not required for the ABI and used old by Solidity's semantic checking
system, such as input parameter data location like ``"calldata"``
and ``"memory"``. As such, they can be safely dropped in the ABI as well.
_code: Human-Readable ABI Example @lang<javascript>
const humanReadableAbi = [
// Simple types
"constructor(string symbol, string name)",
"function transferFrom(address from, address to, uint value)",
"function balanceOf(address owner) view returns (uint balance)",
"event Transfer(address indexed from, address indexed to, address value)",
"error InsufficientBalance(account owner, uint balance)",
// Some examples with the struct type, we use the tuple keyword:
// (note: the tuple keyword is optional, simply using additional
// parentheses accomplishes the same thing)
// struct Person {
// string name;
// uint16 age;
// }
"function addPerson(tuple(string name, uint16 age) person)",
"function addPeople(tuple(string name, uint16 age)[] person)",
"function getPerson(uint id) view returns (tuple(string name, uint16 age))",
"event PersonAdded(uint indexed id, tuple(string name, uint16 age) person)"
];
//_hide: _page.humanReadableAbi = humanReadableAbi;
_subsection: Solidity JSON ABI @<abi-formats--solidity>
See [Solidity compiler](link-solc-output).
The **Solidity JSON ABI** is a standard format that many tools export,
including the Solidity compiler. For the full specification, see
the [Solidity compiler documentation](link-solc-output).
Various versions include slightly different keys and values. For example,
early compilers included only a boolean ``"constant"`` to indicate mutability,
while newer versions include a string ``"mutabilityState"``, which encompasses
several older properties.
When creating an instance of a [Fragment](Fragment) using a JSON ABI, it will
automatically infer all legacy properties for new-age ABIs and for legacy
ABIs will infer the new-age properties. All properties will be populated, so
it will match the equivalent created using a Human-Readable ABI fragment.
_code: The same ABI as JSON ABI @lang<javascript>
const jsonAbi = `[
{
"type": "constructor",
"payable": false,
"inputs": [
{ "type": "string", "name": "symbol" },
{ "type": "string", "name": "name" }
]
},
{
"type": "function",
"name": "transferFrom",
"constant": false,
"payable": false,
"inputs": [
{ "type": "address", "name": "from" },
{ "type": "address", "name": "to" },
{ "type": "uint256", "name": "value" }
],
"outputs": [ ]
},
{
"type": "function",
"name": "balanceOf",
"constant":true,
"stateMutability": "view",
"payable":false, "inputs": [
{ "type": "address", "name": "owner"}
],
"outputs": [
{ "type": "uint256"}
]
},
{
"type": "event",
"anonymous": false,
"name": "Transfer",
"inputs": [
{ "type": "address", "name": "from", "indexed":true},
{ "type": "address", "name": "to", "indexed":true},
{ "type": "address", "name": "value"}
]
},
{
"type": "error",
"name": "InsufficientBalance",
"inputs": [
{ "type": "account", "name": "owner"},
{ "type": "uint256", "name": "balance"}
]
},
{
"type": "function",
"name": "addPerson",
"constant": false,
"payable": false,
"inputs": [
{
"type": "tuple",
"name": "person",
"components": [
{ "type": "string", "name": "name" },
{ "type": "uint16", "name": "age" }
]
}
],
"outputs": []
},
{
"type": "function",
"name": "addPeople",
"constant": false,
"payable": false,
"inputs": [
{
"type": "tuple[]",
"name": "person",
"components": [
{ "type": "string", "name": "name" },
{ "type": "uint16", "name": "age" }
]
}
],
"outputs": []
},
{
"type": "function",
"name": "getPerson",
"constant": true,
"stateMutability": "view",
"payable": false,
"inputs": [
{ "type": "uint256", "name": "id" }
],
"outputs": [
{
"type": "tuple",
"components": [
{ "type": "string", "name": "name" },
{ "type": "uint16", "name": "age" }
]
}
]
},
{
"type": "event",
"anonymous": false,
"name": "PersonAdded",
"inputs": [
{ "type": "uint256", "name": "id", "indexed": true },
{
"type": "tuple",
"name": "person",
"components": [
{ "type": "string", "name": "name", "indexed": false },
{ "type": "uint16", "name": "age", "indexed": false }
]
}
]
}
]`;
//_hide: _page.jsonAbi = jsonAbi;
_subsection: Solidity Object ABI @<abi-formats--object>
The output from parsing (using JSON.parse) a Solidity JSON ABI
is also fully compatible with the [[Interface]] class and each
method, event and error from that object are compatible with
the [[Fragment]] class.
Some developers may prefer this as it allows access to the ABI
properties as normal JavaScript objects, and closely matches the
JSON ABI that those familiar with the Solidity ABI will recognize.
_subsection: Converting Between Formats
The [[Fragment]] object makes it simple to reformat a single
method, event or error, however most developers will be interested
in converting an entire ABI.
For production code it is recommended to inline the Human-Readable
ABI as it makes it easy to see at a glance which methods, events
and errors are available. It is also highly recommend to strip out
unused parts of the ABI (such as admin methods) to further reduce
code size.
_code: Converting to Full Human-Readable ABI @lang<javascript>
//_hide: const Interface = ethers.utils.Interface;
//_hide: const FormatTypes = ethers.utils.FormatTypes;
//_hide: jsonAbi = _page.jsonAbi;
// Using the "full" format will ensure the Result objects
// have named properties, which improves code readability
const iface = new Interface(jsonAbi);
//_result:
iface.format(FormatTypes.full);
//_log:
_code: Converting to Minimal Human-Readable ABI @lang<javascript>
//_hide: const Interface = ethers.utils.Interface;
//_hide: const FormatTypes = ethers.utils.FormatTypes;
//_hide: jsonAbi = _page.jsonAbi;
// Using the "minimal" format will save a small amount of
// space, but is generally not worth it as named properties
// on Results will not be available
const iface = new Interface(jsonAbi);
//_result:
iface.format(FormatTypes.minimal);
//_log:
_code: Converting to JSON ABI @lang<javascript>
//_hide: const Interface = ethers.utils.Interface;
//_hide: const FormatTypes = ethers.utils.FormatTypes;
//_hide: humanReadableAbi = _page.humanReadableAbi;
// Sometimes you may need to export a Human-Readable ABI to
// JSON for tools that do not have Human-Readable support
// For compactness, the JSON is kept with minimal white-space
const iface = new Interface(humanReadableAbi);
//_result:
jsonAbi = iface.format(FormatTypes.json);
//_log:
// However it is easy to use JSON.parse and JSON.stringify
// with formatting parameters to assist with readability
//_result:
JSON.stringify(JSON.parse(jsonAbi), null, 2);
//_log:

View File

@@ -5,60 +5,83 @@ Explain an ABI.
_subsection: Formats
_heading: JSON String ABI (Solidity Output JSON)
The **JSON ABI Format** is the format that is
[output from the Solidity compiler](link-solc-output).
A JSON serialized object is always a string, which represents an Array
of Objects, where each Object has various properties describing the [[Fragment]] of the ABI.
The deserialied JSON string (which is a normal JavaScript Object) may
The deserialized JSON string (which is a normal JavaScript Object) may
also be passed into any function which accepts a JSON String ABI.
_heading: Humanb-Readable ABI
_heading: Humanb-Readable ABI @<human-readable-abi>
The Human-Readable ABI was introduced by ethers in [this article](link-ricmoo-humanreadableabi)
and has since gained wider adoption.
The Human-Readable ABI was
The ABI is described by using an array of strings, where each string is the
Solidity signature of the **constructor**, **function**, **event** or **error**.
[article](link-ricmoo-humanreadableabi)
When parsing a fragment, all inferred properties will be injected (e.g. a //payable//
method will have its ``constant`` proeprty set to false).
Tuples can be specified by using the ``tuple(...)`` syntax or with bare (additional)
parenthesis, ``(...)``.
_code: Example Human-Readable ABI
const ABI = [
// Constructor
"constructor(address ens)",
// Constant functions (pure or view)
"function balanceOf(address owner) view returns (uint)",
// State-mutating functions (payable or non-payable)
"function mint(uint amount) payable",
"function transfer(address to, uint amount) returns (bool)",
// Events
"event Transfer(address indexed from, address indexed to, uint amount)",
// Errors
"error InsufficientFunds(address from, uint balance)",
]
_heading: Output Formats @<fragments--output-formats> @SRC<abi/fragments:FormatTypes>
Each [[Fragment]] and [[ParamType]] may be output using its ``format``
method.
_property: ethers.utils.FragmentTypes.full => string
_property: ethers.utils.FormatTypes.full => string
This is a full human-readable string, including all parameter names, any
optional modifiers (e.g. ``indexed``, ``public``, etc) and white-space
to aid in human readabiliy.
_property: ethers.utils.FragmentTypes.minimal => string
to aid in human readability.
_property: ethers.utils.FormatTypes.minimal => string
This is similar to ``full``, except with no unnecessary whitespace or parameter
names. This is useful for storing a minimal string which can still fully
reconstruct the original Fragment using [Fragment&thinsp;.&thinsp;from](Fragment-from).
_property: ethers.utils.FragmentTypes.json => string
_property: ethers.utils.FormatTypes.json => string
This returns a JavaScript Object which is safe to call ``JSON.stringify``
on to create a JSON string.
_property: ethers.utils.FragmentTypes.sighash => string
_property: ethers.utils.FormatTypes.sighash => string
This is a minimal output format, which is used by Solidity when computing a
signature hash or an event topic hash.
_warning: Note
The ``sighash`` format is **insufficient** to re-create the original [[Fragment]],
since it discards modifiers such as indexed, anonymous, stateMutability, etc.
It is only useful for computing the selector for a Fragment, and cannot
be used to format an Interface.
_subsection: Fragment @<Fragment> @SRC<abi/fragments:class.Fragment>
An ABI is a collection of **Fragments**, where each fragment specifies:
- An [Error](ErrorFragment)
- An [Event](EventFragment)
- A [Function](FunctionFragment)
- A [Constructor](ConstructorFragment)
@@ -66,12 +89,10 @@ An ABI is a collection of **Fragments**, where each fragment specifies:
_heading: Properties
_property: fragment.name => string
This is the name of the Event or Function. This will be null for
a [[ConstructorFragment]].
_property: fragment.type => string
This is a string which indicates the type of the [[Fragment]]. This
will be one of:
@@ -80,19 +101,20 @@ will be one of:
- ``function``
_property: fragment.inputs => Array<[[ParamType]]>
This is an array of of each [[ParamType]] for the input parameters to
This is an array of each [[ParamType]] for the input parameters to
the Constructor, Event of Function.
_heading: Methods
_property: ethers.utils.Fragment.from(objectOrString) => [[Fragment]] @<Fragment-from> @SRC<abi/fragments:Fragment.from>
_property: fragment.format([ format = sighash]) => string @<Fragment-format> @SRC<abi/fragments:Fragment.format>
Creates a string representation of the Fragment using the available
[output formats](fragments--output-formats).
Returns a
_property: ethers.utils.Fragment.from(objectOrString) => [[Fragment]] @<Fragment-from> @SRC<abi/fragments:Fragment.from>
Creates a new **Fragment** sub-class from any compatible //objectOrString//.
_property: ethers.utils.Fragment.isFragment(object) => boolean @<Fragment-isFragment> @SRC<abi/fragments:Fragment.isFragment>
Tra lal al
Returns true if //object// is a **Fragment**.
_subsection: ConstructorFragment @<ConstructorFragment> @INHERIT<[[Fragment]]> @SRC<abi/fragments:class.ConstructorFragment>
@@ -100,17 +122,14 @@ _subsection: ConstructorFragment @<ConstructorFragment> @INHERIT<[[Fragment]]> @
_heading: Properties
_property: fragment.gas => [[BigNumber]]
This is the gas limit that should be used during deployment. It may be
null.
_property: fragment.payable => boolean
This is whether the constructor may receive ether during deployment as
an endowment (i.e. msg.value != 0).
_property: fragment.stateMutability => string
This is the state mutability of the constructor. It can be any of:
- ``nonpayable``
@@ -119,12 +138,21 @@ This is the state mutability of the constructor. It can be any of:
_heading: Methods
_property: ethers.utils.ConstructorFragment.from(objectOrString) => [[ConstructorFragment]] @<ConstructorFragment-from> @SRC<abi/fragments:ConstructorFragment.from>
Tra la la...
Creates a new **ConstructorFragment** from any compatible //objectOrString//.
_property: ethers.utils.ConstructorFragment.isConstructorFragment(object) => boolean @<ConstructorFragment-isConstructorFragment> @SRC<abi/fragments:ConstructorFragment.isConstructorFragment>
Returns true if //object// is a **ConstructorFragment**.
Tra lal al
_subsection: ErrorFragment @<ErrorFragment> @INHERIT<[[Fragment]]> @SRC<abi/fragments:class.ErrorFragment>
_heading: Methods
_property: ethers.utils.ErrorFragment.from(objectOrString) => [[ErrorFragment]] @<ErrorFragment-from> @SRC<abi/fragments:ErrorFragment.from>
Creates a new **ErrorFragment** from any compatible //objectOrString//.
_property: ethers.utils.ErrorFragment.isErrorFragment(object) => boolean @<ErrorFragment-isErrorFragment> @SRC<abi/fragments:ErrorFragment.isErrorFragment>
Returns true if //object// is an **ErrorFragment**.
_subsection: EventFragment @<EventFragment> @INHERIT<[[Fragment]]> @SRC<abi/fragments:class.EventFragment>
@@ -132,19 +160,16 @@ _subsection: EventFragment @<EventFragment> @INHERIT<[[Fragment]]> @SRC<abi/frag
_heading: Properties
_property: fragment.anonymous => boolean
This is whether the event is anonymous. An anonymous Event does not inject its
topic hash as topic0 when creating a log.
_heading: Methods
_property: ethers.utils.EventFragment.from(objectOrString) => [[EventFragment]] @<EventFragment-from> @SRC<abi/fragments:EventFragment.from>
Tra la la...
Creates a new **EventFragment** from any compatible //objectOrString//.
_property: ethers.utils.EventFragment.isEventFragment(object) => boolean @<EventFragment-isEventFragment> @SRC<abi/fragments:EventFragment.isEventFragment>
Tra lal al
Returns true if //object// is an **EventFragment**.
_subsection: FunctionFragment @<FunctionFragment> @INHERIT<[[ConstructorFragment]]> @SRC<abi/fragments:class.FunctionFragment>
@@ -152,12 +177,10 @@ _subsection: FunctionFragment @<FunctionFragment> @INHERIT<[[ConstructorFragment
_heading: Properties
_property: fragment.constant => boolean
This is whether the function is constant (i.e. does not change state). This
is true if the state mutability is ``pure`` or ``view``.
_property: fragment.stateMutability => string
This is the state mutability of the constructor. It can be any of:
- ``nonpayable``
@@ -166,22 +189,18 @@ This is the state mutability of the constructor. It can be any of:
- ``view``
_property: fragment.outputs => Array<[[ParamType]]>
A list of the Function output parameters.
_heading: Method
_heading: Methods
_property: ethers.utils.FunctionFragment.from(objectOrString) => [[FunctionFragment]] @<FunctionFragment-from> @SRC<abi/fragments:ConstructorFragment.from>
Tra la la...
Creates a new **FunctionFragment** from any compatible //objectOrString//.
_property: ethers.utils.FunctionFragment.isFunctionFragment(object) => boolean @<FunctionFragment-isFunctionFragment> @SRC<abi/fragments:FunctionFragment.isFunctionFragment>
Tra lal al
Returns true if //object// is a **FunctionFragment**.
_subsection: ParamType @<ParamType> @SRC<abi/fragments:class.ParamType>
The following examples will represent the Solidity parameter:
``string foobar``
@@ -189,53 +208,42 @@ The following examples will represent the Solidity parameter:
_heading: Properties
_property: paramType.name => string @<ParamType-name>
The local parameter name. This may be null for unnamed parameters. For example,
the parameter definition ``string foobar`` would be ``foobar``.
_property: paramType.type => string @<ParamType-type>
The full type of the parameter, including tuple and array symbols. This may be null
for unnamed parameters. For the above example, this would be ``foobar``.
_property: paramType.baseType => string @<ParamType-baseType>
The base type of the parameter. For primitive types (e.g. ``address``, ``uint256``, etc)
this is equal to [type](ParamType-type). For arrays, it will be the string ``array`` and for
a tuple, it will be the string ``tuple``.
_property: paramType.indexed => boolean @<ParamType-indexed>
Whether the parameter has been marked as indexed. This **only** applies
to parameters which are part of an [[EventFragment]].
_property: paramType.arrayChildren => [[ParamType]] @<ParamType-arrayChildren>
The type of children of the array. This is null for for any parameter
wjhich is not an array.
The type of children of the array. This is null for any parameter
which is not an array.
_property: paramType.arrayLength => number @<ParamType-arrayLength>
The length of the array, or ``-1`` for dynamic-length arrays. This is
null for parameters which is not arrays.
null for parameters which are not arrays.
_property: paramType.components => Array<[[ParamType]]> @<ParamType-components>
The components of a tuple. This is null for non-tuple parameters.
_heading: Methods
Tra la la...
_property: paramType.format([ outputType = sighash ])
Tra la la...
Creates a string representation of the Fragment using the available
[output formats](fragments--output-formats).
_property: ethers.utils.ParamType.from(objectOrString) => [[ParamType]] @<ParamType-from> @SRC<abi/fragments:ParamType.from>
Tra la la...
Creates a new **ParamType** from any compatible //objectOrString//.
_property: ethers.utils.ParamType.isParamType(object) => boolean @<ParamType-isParamType> @SRC<abi/fragments:ParamType.isParamType>
Tra la la...
Returns true if //object// is a **ParamType**.

View File

@@ -4,7 +4,7 @@ The **Interface** Class abstracts the encoding and decoding required
to interact with contracts on the Ethereum network.
Many of the standards organically evolved along side the [[link-solidity]]
language, which other languages have adopted to remain compatibile with
language, which other languages have adopted to remain compatible with
existing deployed contracts.
The EVM itself does not understand what the ABI is. It is simply an agreed
@@ -26,11 +26,47 @@ which is a format the Ethers created to simplify manually typing the ABI
into the source and so that a Contract ABI can also be referenced easily
within the same source file.
_code: Creating an Interface instance @lang<javascript>
//_hide: const Interface = ethers.utils.Interface;
// This interface is used for the below examples
const iface = new Interface([
// Constructor
"constructor(string symbol, string name)",
// State mutating method
"function transferFrom(address from, address to, uint amount)",
// State mutating method, which is payable
"function mint(uint amount) payable",
// Constant method (i.e. "view" or "pure")
"function balanceOf(address owner) view returns (uint)",
// An Event
"event Transfer(address indexed from, address indexed to, uint256 amount)",
// A Custom Solidity Error
"error AccountLocked(address owner, uint256 balance)",
// Examples with structured types
"function addUser(tuple(string name, address addr) user) returns (uint id)",
"function addUsers(tuple(string name, address addr)[] user) returns (uint[] id)",
"function getUser(uint id) view returns (tuple(string name, address addr) user)"
]);
//_hide: _page.iface = iface;
_subsection: Properties @<Interface--properties>
_property: interface.fragments => Array<[[Fragment]]>
All the [Fragments](Fragment) in the interface.
_property: interface.errors => Array<[[ErrorFragment]]>
All the [Error Fragments](ErrorFragment) in the interface.
_property: interface.events => Array<[[EventFragment]]>
All the [Event Fragments](EventFragment) in the interface.
@@ -48,24 +84,133 @@ Return the formatted **Interface**. If the format type is ``json`` a
single string is returned, otherwise an Array of the human-readable
strings is returned.
_code: @lang<javascript>
//_hide: const iface = _page.iface;
const FormatTypes = ethers.utils.FormatTypes;
//_result:
iface.format(FormatTypes.json)
//_log:
//_result:
iface.format(FormatTypes.full)
//_log:
//_result:
iface.format(FormatTypes.minimal)
//_log:
_subsection: Fragment Access @<Interface--fragments>
_property: interface.getFunction(fragment) => [[FunctionFragment]] @SRC<abi/interface>
Returns the [[FunctionFragment]] for //fragment// (see [[Interface--specifying-fragments]]).
_code: @lang<javascript>
//_hide: const iface = _page.iface;
// By method signature, which is normalized so whitespace
// and superfluous attributes are ignored
iface.getFunction("transferFrom(address, address, uint256)");
// By name; this ONLY works if the method is non-ambiguous
iface.getFunction("transferFrom");
// By method selector
iface.getFunction("0x23b872dd");
// Throws if the method does not exist
//_throws:
iface.getFunction("doesNotExist()");
//_log:
_property: interface.getError(fragment) => [[ErrorFragment]] @SRC<abi/interface>
Returns the [[ErrorFragment]] for //fragment// (see [[Interface--specifying-fragments]]).
_code: @lang<javascript>
//_hide: const iface = _page.iface;
// By error signature, which is normalized so whitespace
// and superfluous attributes are ignored
iface.getError("AccountLocked(address, uint256)");
// By name; this ONLY works if the error is non-ambiguous
iface.getError("AccountLocked");
// By error selector
iface.getError("0xf7c3865a");
// Throws if the error does not exist
//_throws:
iface.getError("DoesNotExist()");
//_log:
_property: interface.getEvent(fragment) => [[EventFragment]] @SRC<abi/interface>
Returns the [[EventFragment]] for //fragment// (see [[Interface--specifying-fragments]]).
_code: @lang<javascript>
//_hide: const iface = _page.iface;
// By event signature, which is normalized so whitespace
// and superfluous attributes are ignored
iface.getEvent("Transfer(address, address, uint256)");
// By name; this ONLY works if the event is non-ambiguous
iface.getEvent("Transfer");
// By event topic hash
iface.getEvent("0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef");
// Throws if the event does not exist
//_throws:
iface.getEvent("DoesNotExist()");
//_log:
_subsection: Signature and Topic Hashes @<Interface--selectors>
_property: interface.getSighash(fragment) => string<[[DataHexString]]<4>> @SRC<abi/interface:method.Interface.getSighash>
Return the sighash (or Function Selector) for //fragment// (see [[Interface--specifying-fragments]]).
_code: @lang<javascript>
//_hide: const iface = _page.iface;
//_result:
iface.getSighash("balanceOf");
//_log:
//_result:
iface.getSighash("balanceOf(address)");
//_log:
const fragment = iface.getFunction("balanceOf")
//_result:
iface.getSighash(fragment);
//_log:
_property: interface.getEventTopic(fragment) => string<[[DataHexString]]<32>> @SRC<abi/interface:method.Interface.getEventTopic>
Return the topic hash for //fragment// (see [[Interface--specifying-fragments]]).
_code: @lang<javascript>
//_hide: const iface = _page.iface;
//_result:
iface.getEventTopic("Transfer");
//_log:
//_result:
iface.getEventTopic("Transfer(address, address, uint)");
//_log:
const fragment = iface.getEvent("Transfer")
//_result:
iface.getEventTopic(fragment);
//_log:
_subsection: Encoding Data @<Interface--encoding>
@@ -74,25 +219,145 @@ Return the encoded deployment data, which can be concatenated to the
deployment bytecode of a contract to pass //values// into the contract
constructor.
_property: interface.encodeFilterTopics(fragment [ , values ]) => Array<topic | Array<topic>> @SRC<abi/interface>
_code: @lang<javascript>
//_hide: const iface = _page.iface;
//_hide: const parseEther = ethers.utils.parseEther;
// The data that should be appended to the bytecode to pass
// parameters to the constructor during deployment
//_result:
iface.encodeDeploy([ "SYM", "Some Name" ])
//_log:
_property: interface.encodeErrorResult(fragment [ , values ]) => string<[[DataHexString]]> @SRC<abi/interface>
Returns the encoded error result, which would normally be the response from
a reverted call for //fragment// (see [[Interface--specifying-fragments]]) for
the given //values//.
Most developers will not need this method, but may be useful for authors of
a mock blockchain.
_code: @lang<javascript>
//_hide: const iface = _page.iface;
//_hide: const parseEther = ethers.utils.parseEther;
// Encoding result data (like is returned by eth_call during a revert)
//_result:
iface.encodeErrorResult("AccountLocked", [
"0x8ba1f109551bD432803012645Ac136ddd64DBA72",
parseEther("1.0")
]);
//_log:
_property: interface.encodeFilterTopics(fragment, values) => Array<topic | Array<topic>> @SRC<abi/interface>
Returns the encoded topic filter, which can be passed to getLogs for //fragment//
(see [[Interface--specifying-fragments]]) for the given //values//.
Each //topic// is a 32 byte (64 nibble) [[DataHexString]].
_code: @lang<javascript>
//_hide: const iface = _page.iface;
//_hide: const parseEther = ethers.utils.parseEther;
// Filter that matches all Transfer events
//_result:
iface.encodeFilterTopics("Transfer", [])
//_log:
// Filter that matches the sender
//_result:
iface.encodeFilterTopics("Transfer", [
"0x8ba1f109551bD432803012645Ac136ddd64DBA72"
])
//_log:
// Filter that matches the receiver
//_result:
iface.encodeFilterTopics("Transfer", [
null,
"0x8ba1f109551bD432803012645Ac136ddd64DBA72"
])
//_log:
_property: interface.encodeFunctionData(fragment [ , values ]) => string<[[DataHexString]]> @SRC<abi/interface>
Returns the encoded data, which can be used as the data for a transaction for
//fragment// (see [[Interface--specifying-fragments]]) for the given //values//.
_code: @lang<javascript>
//_hide: const iface = _page.iface;
//_hide: const parseEther = ethers.utils.parseEther;
// Encoding data for the tx.data of a call or transaction
//_result:
iface.encodeFunctionData("transferFrom", [
"0x8ba1f109551bD432803012645Ac136ddd64DBA72",
"0xaB7C8803962c0f2F5BBBe3FA8bf41cd82AA1923C",
parseEther("1.0")
])
//_log:
// Encoding structured data (using positional Array)
user = [
"Richard Moore",
"0x8ba1f109551bD432803012645Ac136ddd64DBA72"
];
//_result:
iface.encodeFunctionData("addUser", [ user ]);
//_log:
// Encoding structured data, using objects. Only available
// if paramters are named.
user = {
name: "Richard Moore",
addr: "0x8ba1f109551bD432803012645Ac136ddd64DBA72"
};
//_result:
iface.encodeFunctionData("addUser", [ user ]);
//_log:
_property: interface.encodeFunctionResult(fragment [ , values ]) => string<[[DataHexString]]> @SRC<abi/interface>
Returns the encoded result, which would normally be the response from a call for
//fragment// (see [[Interface--specifying-fragments]]) for the given //values//.
Most developers will not need this method, but may be useful for authors of a mock blockchain.
_code: @lang<javascript>
//_hide: const iface = _page.iface;
//_hide: const parseEther = ethers.utils.parseEther;
// Encoding result data (like is returned by eth_call)
//_result:
iface.encodeFunctionResult("balanceOf", [
"0x8ba1f109551bD432803012645Ac136ddd64DBA72"
])
//_log:
_subsection: Decoding Data @<Interface--decoding>
_property: interface.decodeErrorResult(fragment, data) => [[Result]] @SRC<abi/interface>
Returns the decoded values from the result of a call during a revert for
//fragment// (see [[Interface--specifying-fragments]]) for the given //data//.
Most developers won't need this, as the ``decodeFunctionResult`` will automatically
decode errors if the //data// represents a revert.
_code: @lang<javascript>
//_hide: const iface = _page.iface;
// Decoding result data (e.g. from an eth_call)
errorData = "0xf7c3865a0000000000000000000000008ba1f109551bd432803012645ac136ddd64dba720000000000000000000000000000000000000000000000000de0b6b3a7640000";
//_result:
iface.decodeErrorResult("AccountLocked", errorData)
//_log:
_property: interface.decodeEventLog(fragment, data [ , topics ]) => [[Result]] @SRC<abi/interface>
Returns the decoded event values from an event log for
//fragment// (see [[Interface--specifying-fragments]]) for the given //data//
@@ -100,6 +365,26 @@ with the optional //topics//.
If //topics// is not specified, placeholders will be inserted into the result.
Most develoeprs will find the [parsing methods](Interface--parsing) more
convenient for decoding event data, as they will automatically detect the
matching event.
_code: @lang<javascript>
//_hide: const iface = _page.iface;
// Decoding log data and topics (the entries in a receipt)
const data = "0x0000000000000000000000000000000000000000000000000de0b6b3a7640000";
const topics = [
"0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef",
"0x0000000000000000000000008ba1f109551bd432803012645ac136ddd64dba72",
"0x000000000000000000000000ab7c8803962c0f2f5bbbe3fa8bf41cd82aa1923c"
];
//_result:
iface.decodeEventLog("Transfer", data, topics);
//_log:
_property: interface.decodeFunctionData(fragment, data) => [[Result]] @SRC<abi/interface>
Returns the decoded values from transaction data for
//fragment// (see [[Interface--specifying-fragments]]) for the given //data//.
@@ -107,25 +392,119 @@ Returns the decoded values from transaction data for
Most developers will not need this method, but may be useful for debugging
or inspecting transactions.
Most develoeprs will also find the [parsing methods](Interface--parsing) more
convenient for decoding transation data, as they will automatically detect the
matching function.
_code: @lang<javascript>
//_hide: const iface = _page.iface;
// Decoding function data (the value of tx.data)
const txData = "0x23b872dd0000000000000000000000008ba1f109551bd432803012645ac136ddd64dba72000000000000000000000000ab7c8803962c0f2f5bbbe3fa8bf41cd82aa1923c0000000000000000000000000000000000000000000000000de0b6b3a7640000";
//_result:
iface.decodeFunctionData("transferFrom", txData);
//_log:
_property: interface.decodeFunctionResult(fragment, data) => [[Result]] @SRC<abi/interface>
Returns the decoded values from the result of a call for
//fragment// (see [[Interface--specifying-fragments]]) for the given //data//.
_code: @lang<javascript>
//_hide: const iface = _page.iface;
// Decoding result data (e.g. from an eth_call)
resultData = "0x0000000000000000000000000000000000000000000000000de0b6b3a7640000";
//_result:
iface.decodeFunctionResult("balanceOf", resultData)
//_log:
// Decoding result data which was caused by a revert
// Throws a CALL_EXCEPTION, with extra details
errorData = "0xf7c3865a0000000000000000000000008ba1f109551bd432803012645ac136ddd64dba720000000000000000000000000000000000000000000000000de0b6b3a7640000";
//_throws:
iface.decodeFunctionResult("balanceOf", errorData)
//_log:
// Decoding structured data returns a Result object, which
// will include all values positionally and if the ABI
// included names, values will additionally be available
// by their name.
resultData = "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000400000000000000000000000008ba1f109551bd432803012645ac136ddd64dba72000000000000000000000000000000000000000000000000000000000000000d52696368617264204d6f6f726500000000000000000000000000000000000000";
//_result:
result = iface.decodeFunctionResult("getUser", resultData);
//_log:
// Access positionally:
// The 0th output parameter, the 0th proerty of the structure
//_result:
result[0][0];
//_log:
// Access by name: (only avilable because parameters were named)
//_result:
result.user.name
//_log:
_subsection: Parsing @<Interface--parsing>
The functions are generally the most useful for most developers. They will
automatically search the ABI for a matching Event or Function and decode
the components as a fully specified description.
_property: interface.parseError(data) => [[ErrorDescription]] @SRC<abi/interface>
Search for the error that matches the error selector in //data// and parse out
the details.
_code: @lang<javascript>
//_hide: const iface = _page.iface;
const data = "0xf7c3865a0000000000000000000000008ba1f109551bd432803012645ac136ddd64dba720000000000000000000000000000000000000000000000000de0b6b3a7640000";
//_result:
iface.parseError(data);
//_hide: _.errorFragment = createClass("ErrorFragment");
//_log:
_property: interface.parseLog(log) => [[LogDescription]] @SRC<abi/interface>
Search the event that matches the //log// topic hash and parse the values
the log represents.
_code: @lang<javascript>
//_hide: const iface = _page.iface;
const data = "0x0000000000000000000000000000000000000000000000000de0b6b3a7640000";
const topics = [
"0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef",
"0x0000000000000000000000008ba1f109551bd432803012645ac136ddd64dba72",
"0x000000000000000000000000ab7c8803962c0f2f5bbbe3fa8bf41cd82aa1923c"
];
//_result:
iface.parseLog({ data, topics });
//_hide: _.eventFragment = createClass("EventFragment");
//_log:
_property: interface.parseTransaction(transaction) => [[TransactionDescription]] @SRC<abi/interface>
Search for the function that matches the //transaction// data sighash
and parse the transaction properties.
_code: @lang<javascript>
//_hide: const iface = _page.iface;
//_hide: const parseEther = ethers.utils.parseEther;
const data = "0x23b872dd0000000000000000000000008ba1f109551bd432803012645ac136ddd64dba72000000000000000000000000ab7c8803962c0f2f5bbbe3fa8bf41cd82aa1923c0000000000000000000000000000000000000000000000000de0b6b3a7640000";
const value = parseEther("1.0");
//_result:
iface.parseTransaction({ data, value });
//_hide: _.functionFragment = createClass("FunctionFragment");
//_log:
_subsection: Types @<Interface--types>
@@ -142,6 +521,24 @@ any named value for this key is renamed to ``_length``. If there is a
name collision, only the first is available by its key.
_heading: ErrorDescription @<ErrorDescription>
_property: errorDescription.args => [[Result]]
The values of the input parameters of the error.
_property: errorDescription.errorFragment => [[ErrorFragment]]
The [[ErrorFragment]] which matches the selector in the data.
_property: errorDescription.name => string
The error name. (e.g. ``AccountLocked``)
_property: errorDescription.signature => string
The error signature. (e.g. ``AccountLocked(address,uint256)``)
_property: errorDescription.sighash => string
The selector of the error.
_heading: LogDescription @<LogDescription>
_property: logDescription.args => [[Result]]

View File

@@ -18,7 +18,6 @@ of errors introduced from typing an address or cut and paste issues.
All functions that return an Address will return a Checksum Address.
_heading: ICAP Address @<address-icap>
The **ICAP Address Format** was an early attempt to introduce a checksum
@@ -45,17 +44,76 @@ _property: ethers.utils.getAddress(address) => string<[[address]]> @<utils-getA
Returns //address// as a Checksum Address.
If //address// is an invalid 40-nibble [[HexString]] or if it contains mixed case and
the checksum is invalid, an InvalidArgument Error is throw.
the checksum is invalid, an [INVALID_ARGUMENT](errors--invalid-argument) Error is thrown.
The value of //address// may be any supported address format.
_code: @lang<javascript>
//_hide: const getAddress = ethers.utils.getAddress;
// Injects the checksum (via upper-casing specific letters)
//_result:
getAddress("0x8ba1f109551bd432803012645ac136ddd64dba72");
//_log:
// Converts and injects the checksum
//_result:
getAddress("XE65GB6LDNXYOFTX0NSV3FUWKOWIXAMJK36");
//_log:
// Throws if a checksummed address is provided, but a
// letter is the wrong case
// ------------v (should be lower-case)
//_throws:
getAddress("0x8Ba1f109551bD432803012645Ac136ddd64DBA72")
//_log:
// Throws if the ICAP/IBAN checksum fails
//_throws:
getIcapAddress("XE65GB6LDNXYOFTX0NSV3FUWKOWIXAMJK37");
//_log:
// Throws if the address is invalid, in general
//_throws:
getIcapAddress("I like turtles!");
//_log:
_property: ethers.utils.getIcapAddress(address) => string<[IcapAddress](address-icap)> @<utils-getIcapAddress> @SRC<address>
Returns //address// as an [ICAP address](link-icap).
Supports the same restrictions as [utils.getAddress](utils-getAddress).
Supports the same restrictions as [getAddress](utils-getAddress).
_code: @lang<javascript>
//_hide: const getIcapAddress = ethers.utils.getIcapAddress;
//_result:
getIcapAddress("0x8ba1f109551bd432803012645ac136ddd64dba72");
//_log:
//_result:
getIcapAddress("XE65GB6LDNXYOFTX0NSV3FUWKOWIXAMJK36");
//_log:
_property: ethers.utils.isAddress(address) => boolean @<utils-isAddress> @SRC<address>
Returns true if //address// is valid (in any supported format).
_code: @lang<javascript>
//_hide: const isAddress = ethers.utils.isAddress;
//_result:
isAddress("0x8ba1f109551bd432803012645ac136ddd64dba72");
//_log:
//_result:
isAddress("XE65GB6LDNXYOFTX0NSV3FUWKOWIXAMJK36");
//_log:
//_result:
isAddress("I like turtles.");
//_log:
_subsection: Derivation @<utils--address-derivation>
@@ -64,10 +122,49 @@ Returns the address for //publicOrPrivateKey//. A public key may be
compressed or uncompressed, and a private key will be converted
automatically to a public key for the derivation.
_code: @lang<javascript>
//_hide: const computeAddress = ethers.utils.computeAddress;
// Private Key
//_result:
computeAddress("0xb976778317b23a1385ec2d483eda6904d9319135b89f1d8eee9f6d2593e2665d");
//_log:
// Public Key (compressed)
//_result:
computeAddress("0x0376698beebe8ee5c74d8cc50ab84ac301ee8f10af6f28d0ffd6adf4d6d3b9b762");
//_log:
// Public Key (uncompressed)
//_result:
computeAddress("0x0476698beebe8ee5c74d8cc50ab84ac301ee8f10af6f28d0ffd6adf4d6d3b9b762d46ca56d3dad2ce13213a6f42278dabbb53259f2d92681ea6a0b98197a719be3");
//_log:
_property: ethers.utils.recoverAddress(digest, signature) => string<[[address]]> @<utils-recoverAddress> @SRC<transactions>
Use [[link-wiki-ecrecover]] to determine the address that signed //digest// to
which generated //signature//.
_code: @lang<javascript>
//_hide: const recoverAddress = ethers.utils.recoverAddress;
const digest = "0x7c5ea36004851c764c44143b1dcb59679b11c9a68e5f41497f6cf3d480715331";
// Using an expanded Signature
//_result:
recoverAddress(digest, {
r: "0x528459e4aec8934dc2ee94c4f3265cf6ce00d47cf42bb106afda3642c72e25eb",
s: "0x42544137118256121502784e5a6425e6183ca964421ecd577db6c66ba9bccdcf",
v: 27
});
//_log:
// Using a flat Signature
const signature = "0x528459e4aec8934dc2ee94c4f3265cf6ce00d47cf42bb106afda3642c72e25eb42544137118256121502784e5a6425e6183ca964421ecd577db6c66ba9bccdcf1b";
//_result:
recoverAddress(digest, signature);
//_log:
_subsection: Contracts Addresses @<utils--contract-addresses>
@@ -75,9 +172,33 @@ _property: ethers.utils.getContractAddress(transaction) => string<[[address]]>
Returns the contract address that would result if //transaction// was
used to deploy a contract.
_code: @lang<javascript>
//_hide: const getContractAddress = ethers.utils.getContractAddress;
const from = "0x8ba1f109551bD432803012645Ac136ddd64DBA72";
const nonce = 5;
//_result:
getContractAddress({ from, nonce });
//_log:
_property: ethers.utils.getCreate2Address(from, salt, initCodeHash) => string<[[address]]> @<utils-getCreate2Address> @SRC<address>
Returns the contract address that would result from the given
[CREATE2](link-eip-1014) call.
_code: @lang<javascript>
//_hide: const getCreate2Address = ethers.utils.getCreate2Address;
//_hide: const keccak256 = ethers.utils.keccak256;
const from = "0x8ba1f109551bD432803012645Ac136ddd64DBA72";
const salt = "0x7c5ea36004851c764c44143b1dcb59679b11c9a68e5f41497f6cf3d480715331";
const initCode = "0x6394198df16000526103ff60206004601c335afa6040516060f3";
const initCodeHash = keccak256(initCode);
//_result:
getCreate2Address(from, salt, initCodeHash);
//_log:

View File

@@ -1,10 +1,10 @@
_section: BigNumber @<BigNumber>
Many operations in Ethereum operation on numbers which are
Many operations in Ethereum operate on numbers which are
[outside the range of safe values](BigNumber--notes-safenumbers) to use
in JavaScript.
A **BigNumber** is an object which safely allows mathematic operations
A **BigNumber** is an object which safely allows mathematical operations
on numbers of any magnitude.
Most operations which need to return a value will return a **BigNumber**
@@ -17,7 +17,7 @@ _heading: BigNumberish @<BigNumberish>
Many functions and methods in this library take in values which
can be non-ambiguously and safely converted to a BigNumber. These
values can be sepcified as:
values can be specified as:
_definition: **//string//**
A [[HexString]] or a decimal string, either of which may
@@ -49,43 +49,52 @@ _heading: Examples: @<>
_code: @lang<javascript>
// From a decimal string...
//_result:
BigNumber.from("42")
//!
//_log:
// From a HexString...
//_result:
BigNumber.from("0x2a")
//!
//_log:
// From a negative HexString...
//_result:
BigNumber.from("-0x2a")
//!
//_log:
// From an Array (or Uint8Array)...
//_result:
BigNumber.from([ 42 ])
//!
//_log:
// From an existing BigNumber...
let one1 = constants.One;
let one2 = BigNumber.from(one1)
//_result:
one2
//!
//_log:
// ...which returns the same instance
//_result:
one1 === one2
//!
//_log:
// From a (safe) number...
//_result:
BigNumber.from(42)
//!
//_log:
// From a ES2015 BigInt... (only on platforms with BigInt support)
//_result:
BigNumber.from(42n)
//!
//_log:
// Numbers outside the safe range fail:
//_throws:
BigNumber.from(Number.MAX_SAFE_INTEGER);
//! error
//_log:
_subsection: Methods @<BigNumber--methods>
@@ -122,18 +131,18 @@ Returns a BigNumber with the value of //BigNumber// with bits beyond
the //bitcount// least significant bits set to zero.
_heading: Two's Compliment
_heading: Two's Complement
[Two's Complicment](link-wiki-twoscomplement)
[Two's Complement](link-wiki-twoscomplement)
is an elegant method used to encode and decode fixed-width signed values
while efficiently preserving mathematic operations.
while efficiently preserving mathematical operations.
Most users will not need to interact with these.
_property: BigNumber.fromTwos(bitwidth) => [[BigNumber]] @SRC<bignumber>
Returns a BigNumber with the value of //BigNumber// converted from twos-compliment with //bitwidth//.
Returns a BigNumber with the value of //BigNumber// converted from twos-complement with //bitwidth//.
_property: BigNumber.toTwos(bitwidth) => [[BigNumber]] @SRC<bignumber>
Returns a BigNumber with the value of //BigNumber// converted to twos-compliment with //bitwidth//.
Returns a BigNumber with the value of //BigNumber// converted to twos-complement with //bitwidth//.
_heading: Comparison and Equivalence
@@ -153,12 +162,16 @@ Returns true if and only if the value of //BigNumber// **>** //otherValue//.
_property: BigNumber.gte(otherValue) => boolean @SRC<bignumber>
Returns true if and only if the value of //BigNumber// **&ge;** //otherValue//.
_property: BigNumber.isZero() => boolean @SRC<bignumber>
_property: BigNumber.isZero() => boolean @SRC<bignumber:BigNumber.isZero>
Returns true if and only if the value of //BigNumber// is zero.
_heading: Conversion
_property: BigNumber.toBigInt() => bigint @SRC<bignumber>
Returns the value of //BigNumber// as a [JavaScript BigInt](link-js-bigint) value,
on platforms which support them.
_property: BigNumber.toNumber() => number @SRC<bignumber>
Returns the value of //BigNumber// as a JavaScript value.
@@ -175,7 +188,7 @@ Returns the value of //BigNumber// as a base-16, ``0x``-prefixed [[DataHexString
_heading: Inspection
_property: ethers.BigNumnber.isBigNumber(object) => boolean @SRC<bignumber>
_property: ethers.BigNumber.isBigNumber(object) => boolean @SRC<bignumber>
Returns true if and only if the //object// is a BigNumber object.
@@ -186,8 +199,9 @@ _code: @lang<javascript>
let a = BigNumber.from(42);
let b = BigNumber.from("91");
//_result:
a.mul(b);
//!
//_log:
_subsection: Notes @<BigNumber--notes>
@@ -214,8 +228,9 @@ To demonstrate how this may be an issue in your code, consider:
_code: @lang<javascript>
//_result:
(Number.MAX_SAFE_INTEGER + 2 - 2) == (Number.MAX_SAFE_INTEGER)
//!
//_log:
_null:
@@ -232,7 +247,7 @@ mathematical operations handled safely.
_heading: Why not BigNumber.js, BN.js, BigDecimal, etc?
Everyone has their own favourite Big Number library, and once someone
has choosen one, it becomes part of their identity, like their editor,
has chosen one, it becomes part of their identity, like their editor,
vi vs emacs. There are over 100 Big Number libraries on [npm](link-npm-query-bignumber).
One of the biggest differences between the Ethers [[BigNumber]] object and
@@ -246,7 +261,7 @@ low-level library's objects which supports myriad in-place operations.
Second, the Ethers [[BigNumber]] provides all the functionality required
internally and should generally be sufficient for most developers while
not exposing some of the more advanced and rare functionality. So it will
be eaiser to swap out the underlying library without impacting consumers.
be easier to swap out the underlying library without impacting consumers.
For example, if [[link-npm-bnjs]] was exposed, someone may use the
greatest-common-denominator functions, which would then be functionality
@@ -270,7 +285,7 @@ various purposes.
_heading: Allow us to set a global Big Number library?
Another comment that comes up frequently is tha desire to specify a
Another comment that comes up frequently is the desire to specify a
global user-defined Big Number library, which all functions would
return.

View File

@@ -1,6 +1,13 @@
_section: Byte Manipulation
Tra la la...
While there are many high-level APIs for interacting with
Ethereum, such as [Contracts](Contract) and [Providers](Provider),
a lot of the low level access requires byte manipulation
operations.
Many of these operations are used internally, but can also be
used to help normalize binary data representations from the
output of various functions and methods.
_subsection: Types
@@ -25,19 +32,21 @@ binary data as a string.
_heading: HexString @<HexString>
A **Hexstring** is a string which has a ``0x`` prefix followed by any
number of nibbles (i.e. case-insensitive hexidecumal characters, ``0-9`` and ``a-f``).
number of nibbles (i.e. case-insensitive hexadecimal characters, ``0-9`` and ``a-f``).
_heading: Signature @<Signature>
- **r** and **s** --- The x co-ordinate of **r** and the **s** value of the signature
- **v** --- The parity of the y co-ordinate of **r**
- **_vs** --- The [compact representation](link-eip-2098) of the **s** and **v**
- **yParityAndS** --- The [compact representation](link-eip-2098) of the **s** and **v**
- **_vs** --- Deprecated property; renamed to yParityAndS
- **recoveryParam** --- The normalized (i.e. 0 or 1) value of **v**
- **compact** - The full siggnature using [compact representation](link-eip-2098)
_heading: Raw Signature @<signature-raw> @inherit<string\<[[DataHexString]]\<65\>\>>
A **Raw Signature** is a common Signature format where the r, s and v are
concanenated into a 65 byte (130 nibble) [[DataHexString]].
concatenated into a 65 byte (130 nibble) [[DataHexString]].
_heading: SignatureLike @<SignatureLike>
@@ -79,28 +88,34 @@ zeros.
_code: Examples @lang<javascript>
// Convert a hexstring to a Uint8Array
//_result:
arrayify("0x1234")
//!
//_log:
// Convert an Array to a hexstring
//_result:
hexlify([1, 2, 3, 4])
//!
//_log:
// Convert an Object to a hexstring
//_result:
hexlify({ length: 2, "0": 1, "1": 2 })
//!
//_log:
// Convert an Array to a hexstring
//_result:
hexlify([ 1 ])
//!
//_log:
// Convert a number to a stripped hex value
//_result:
hexValue(1)
//!
//_log:
// Convert an Array to a stripped hex value
//_result:
hexValue([ 1, 2 ])
//!
//_log:
_subsection: Array Manipulation
@@ -112,7 +127,7 @@ _property: ethers.utils.stripZeros(aBytesLike) => Uint8Array @<utils-stripZeros
Returns a Uint8Array with all leading ``0`` bytes of //aBtyesLike// removed.
_property: ethers.utils.zeroPad(aBytesLike, length) => Uint8Array @<utils-zeroPad> @SRC<bytes>
Retutns a Uint8Array of the data in //aBytesLike// with ``0`` bytes prepended to
Returns a Uint8Array of the data in //aBytesLike// with ``0`` bytes prepended to
//length// bytes long.
If //aBytesLike// is already longer than //length// bytes long, an InvalidArgument
@@ -155,7 +170,7 @@ Any missing properties will be computed.
_subsection: Random Bytes
_property: ethers.utils.randomBytes(length) => Uint8Array @<utils-randomBytes> @SRC<random/index>
_property: ethers.utils.randomBytes(length) => Uint8Array @<utils-randomBytes> @SRC<random/random>
Return a new Uint8Array of //length// random bytes.
_property: ethers.utils.shuffled(array) => Array<any> @<utils-shuffled> @SRC<random>
@@ -163,15 +178,18 @@ Return a copy of //array// shuffled using [[link-wiki-shuffle]].
_code: Examples @lang<javascript>
//_result:
utils.randomBytes(8)
//!
//_log:
const data = [ 1, 2, 3, 4, 5, 6, 7 ];
// Returns a new Array
//_result:
utils.shuffled(data);
//!
//_log:
// The Original is unscathed...
//_result:
data
//!
//_log:

View File

@@ -1,6 +1,6 @@
_section: Constants @<constants>
The **ethers.contants** Object contains commonly used values.
The **ethers.constants** Object contains commonly used values.
_subsection: Bytes

View File

@@ -1,4 +1,4 @@
_section: Display Logic and Input
_section: Display Logic and Input @<display-logic>
When creating an Application, it is useful to convert between
user-friendly strings (usually displaying **ether**) and the
@@ -17,11 +17,11 @@ The [formatUnits](unit-conversion) will format a [BigNumberish](BigNumberish)
into a string, which is useful when displaying a balance.
_subsection: Units
_subsection: Units @<display-logic--units>
_heading: Decimal Count
A **Unit** can be specified as an number, which indicates the
A **Unit** can be specified as a number, which indicates the
number of decimal places that should be used.
**Examples:**
@@ -29,7 +29,7 @@ number of decimal places that should be used.
- 1 ether in wei, has **18** decimal places (i.e. 1 ether represents 10^^18^^ wei)
- 1 bitcoin in Satoshi, has **8** decimal places (i.e. 1 bitcoin represents 10^^8^^ satoshi)
_heading: Named Units
_heading: Named Units @<display-logic--named-units>
There are also several common **Named Units**, in which case their name (as
a string) may be used.
@@ -46,13 +46,20 @@ _table: @STYLE<compact>
| //ether// | 18 |
_subsection: Functions
_subsection: Functions @<display-logic--functions>
_heading: Formatting
_heading: Formatting @<display-logic--formatting>
_property: ethers.utils.commify(value) => string @<utils-commify> @SRC<units>
Returns a string with value grouped by 3 digits, separated by ``,``.
_code: @lang<javascript>
//_hide: const commify = ethers.utils.commify;
//_result:
commify("-1000.3000");
//_log:
_heading: Conversion @<unit-conversion>
@@ -60,13 +67,88 @@ _property: ethers.utils.formatUnits(value [ , unit = "ether" ] ) => string @<ut
Returns a string representation of //value// formatted with //unit//
digits (if it is a number) or to the unit specified (if a string).
_code: @lang<javascript>
//_hide: const formatUnits = ethers.utils.formatUnits;
//_hide: const BigNumber = ethers.BigNumber;
const oneGwei = BigNumber.from("1000000000");
const oneEther = BigNumber.from("1000000000000000000");
//_result:
formatUnits(oneGwei, 0);
//_log:
//_result:
formatUnits(oneGwei, "gwei");
//_log:
//_result:
formatUnits(oneGwei, 9);
//_log:
//_result:
formatUnits(oneEther);
//_log:
//_result:
formatUnits(oneEther, 18);
//_log:
_property: ethers.utils.formatEther(value) => string @<utils-formatEther> @SRC<units>
The equivalent to calling ``formatUnits(value, "ether")``.
_code: @lang<javascript>
//_hide: const formatEther = ethers.utils.formatEther;
//_hide: const BigNumber = ethers.BigNumber;
const value = BigNumber.from("1000000000000000000");
//_result:
formatEther(value);
//_log:
_property: ethers.utils.parseUnits(value [ , unit = "ether" ] ) => [BigNumber](BigNumber) @<utils-parseUnits> @SRC<units>
Returns a [BigNumber](BigNumber) representation of //value//, parsed with
//unit// digits (if it is a number) or from the unit specified (if
a string).
_code: @lang<javascript>
//_hide: const parseUnits = ethers.utils.parseUnits;
//_result:
parseUnits("1.0");
//_log:
//_result:
parseUnits("1.0", "ether");
//_log:
//_result:
parseUnits("1.0", 18);
//_log:
//_result:
parseUnits("121.0", "gwei");
//_log:
//_result:
parseUnits("121.0", 9);
//_log:
_property: ethers.utils.parseEther(value) => [BigNumber](BigNumber) @<utils-parseEther> @SRC<units>
The equivalent to calling ``parseUnits(value, "ether")``.
_code: @lang<javascript>
//_hide: const parseEther = ethers.utils.parseEther;
//_result:
parseEther("1.0");
//_log:
//_result:
parseEther("-0.5");
//_log:

View File

@@ -2,23 +2,63 @@ _section: Encoding Utilities @<encoding>
_subsection: Base58 @<Bse58> @SRC<basex:Base58>
_property: ethers.utils.base58.decode(textData) => Uin8Array
_property: ethers.utils.base58.decode(textData) => Uint8Array
Return a typed Uint8Array representation of //textData// decoded using
base-58 encoding.
_code: @lang<javascript>
//_hide: const base58 = ethers.utils.base58;
//_result:
base58.decode("TzMhH");
//_log:
_property: ethers.utils.base58.encode(aBytesLike) => string
Return //aBytesLike// encoded as a string using the base-58 encoding.
_code: @lang<javascript>
//_hide: const base58 = ethers.utils.base58;
//_result:
base58.encode("0x12345678");
//_log:
//_result:
base58.encode([ 0x12, 0x34, 0x56, 0x78 ]);
//_log:
_subsection: Base64 @<Base64>
_property: ethers.utils.base64.decode(textData) => Uin8Array @SRC<base64>
_property: ethers.utils.base64.decode(textData) => Uint8Array @SRC<base64>
Return a typed Uint8Array representation of //textData// decoded using
base-64 encoding.
_code: @lang<javascript>
//_hide: const base64 = ethers.utils.base64;
//_result:
base64.decode("EjQ=");
//_log:
_property: ethers.utils.base64.encode(aBytesLike) => string @SRC<base64>
Return //aBytesLike// encoded as a string using the base-64 encoding.
_code: @lang<javascript>
//_hide: const base64 = ethers.utils.base64;
//_result:
base64.encode("0x1234");
//_log:
//_result:
base64.encode([ 0x12, 0x34 ]);
//_log:
_subsection: Recursive-Length Prefix @<rlp--methods>
@@ -26,15 +66,53 @@ The [[link-rlp]] encoding is used throughout Ethereum to serialize nested
structures of Arrays and data.
_property: ethers.utils.RLP.encode(dataObject) => string<[[DataHexString]]> @<utils-rlpEncode> @SRC<rlp>
Encode a structured Data Object into its RLP-encoded representation.
Encode a structured [Data Object](rlp--dataobject) into its RLP-encoded representation.
Each Data component may be an valid [[BytesLike]].
_code: @lang<javascript>
//_hide: const RLP = ethers.utils.RLP;
//_result:
RLP.encode("0x12345678");
//_log:
//_result:
RLP.encode([ "0x12345678" ]);
//_log:
//_result:
RLP.encode([ new Uint8Array([ 0x12, 0x34, 0x56, 0x78 ]) ]);
//_log:
//_result:
RLP.encode([ [ "0x42", [ "0x43" ] ], "0x12345678", [ ] ]);
//_log:
//_result:
RLP.encode([ ]);
//_log:
_property: ethers.utils.RLP.decode(aBytesLike) => [DataObject](rlp--dataobject) @<utils.rlpDecode> @SRC<rlp>
Decode an RLP-encoded //aBytesLike// into its structured Data Object.
Decode an RLP-encoded //aBytesLike// into its structured [Data Object](rlp--dataobject).
All Data components will be returned as a [[DataHexString]].
_code: @lang<javascript>
//_hide: const RLP = ethers.utils.RLP;
//_result:
RLP.decode("0x8412345678");
//_log:
//_result:
RLP.decode("0xcac342c1438412345678c0");
//_log:
//_result:
RLP.decode("0xc0");
//_log:
_heading: Data Object @<rlp--dataobject>
A **Data Object** is a recursive structure which is used to serialize many

View File

@@ -49,6 +49,12 @@ _property: fixednumber.round([ decimals = 0 ]) => [[FixedNumber]] @SRC<bignumbe
Returns a new FixedNumber with the value of //fixedvalue// rounded to //decimals//.
_heading: Comparison and Equivalence
_property: FixedNumber.isZero() => boolean @SRC<bignumber/fixednumber:FixedNumber.isZero>
Returns true if and only if the value of //FixedNumber// is zero.
_heading: Conversion
_property: fixednumber.toFormat(format) => [[FixedNumber]] @SRC<bignumber/fixednumber>
@@ -75,7 +81,7 @@ _subsection: FixedFormat @<FixedFormat>
A **FixedFormat** is a simple object which represents a decimal
(base-10) Fixed-Point data representation. Usually using this
class directly is uneccessary, as passing in a [[FixedFormat--strings]]
class directly is unnecessary, as passing in a [[FixedFormat--strings]]
directly into the [[FixedNumber]] will automatically create this.
_heading: Format Strings @<FixedFormat--strings>
@@ -87,7 +93,7 @@ A signed format string begins with ``fixed``, which an unsigned format
string begins with ``ufixed``, followed by the width (in bits) and the
number of decimals.
The width must be conguent to 0 mod 8 (i.e. ``(width % 8) == 0``) and no
The width must be congruent to 0 mod 8 (i.e. ``(width % 8) == 0``) and no
larger than 256 bits and the number of decimals must be no larger than 80.
For example:

View File

@@ -1,6 +1,8 @@
_section: Hashing Algorithms @<hashing-algorithms>
Explain what hash functions are?
There are many hashing algorithms used throughout the blockchain
space as well as some more complex usages which require utilities
to facilitate these common operations.
_subsection: Cryptographic Hash Functions @<cryptographic-hash-functions>
@@ -9,7 +11,7 @@ The [Cryptographic Hash Functions](link-wiki-cryptographichash)
are a specific family of hash functions.
_property: ethers.utils.id(text) => string<[[DataHexString]]<32>> @<utils-id> @SRC<hash>
The Ethereum Identity function computs the [KECCAK256](link-wiki-sha3) hash of the //text// bytes.
The Ethereum Identity function computes the [KECCAK256](link-wiki-sha3) hash of the //text// bytes.
_property: ethers.utils.keccak256(aBytesLike) => string<[[DataHexString]]<32>> @<utils-keccak256> @SRC<keccak256>
Returns the [KECCAK256](link-wiki-sha3) digest //aBytesLike//.
@@ -25,14 +27,17 @@ Returns the [SHA2-512](link-wiki-sha2) digest of //aBytesLike//.
_code: KECCAK256 @lang<javascript>
//_result:
utils.keccak256([ 0x12, 0x34 ])
//!
//_log:
//_result:
utils.keccak256("0x")
//!
//_log:
//_result:
utils.keccak256("0x1234")
//!
//_log:
// The value MUST be data, such as:
// - an Array of numbers
@@ -40,16 +45,19 @@ utils.keccak256("0x1234")
// - a Uint8Array
// Do NOT use UTF-8 strings that are not a DataHexstring
//_throws:
utils.keccak256("hello world")
//! error
//_log:
// If needed, convert strings to bytes first:
//_result:
utils.keccak256(utils.toUtf8Bytes("hello world"))
//!
//_log:
// Or equivalently use the identity function:
//_result:
utils.id("hello world")
//!
//_log:
// Keep in mind that the string "0x1234" represents TWO
// bytes (i.e. [ 0x12, 0x34 ]. If you wish to compute the
@@ -59,48 +67,56 @@ utils.id("hello world")
// Consider the following examples:
// Hash of TWO (2) bytes:
//_result:
utils.keccak256("0x1234")
//!
//_log:
// Hash of TWO (2) bytes: (same result)
//_result:
utils.keccak256([ 0x12, 0x34 ])
//!
//_log:
const bytes = utils.toUtf8Bytes("0x1234");
// <hide>
bytes
// </hide>
//!
//_result:
bytes = utils.toUtf8Bytes("0x1234")
//_log:
// Hash of SIX (6) characters (different than above)
//_result:
utils.keccak256(bytes)
//!
//_log:
// Hash of SIX (6) characters (same result)
//_result:
utils.id("0x1234")
//!
//_log:
_code: RIPEMD160 @lang<javascript>
//_result:
utils.ripemd160("0x")
//!
//_log:
//_result:
utils.ripemd160("0x1234")
//!
//_log:
_code: SHA-2 @lang<javascript>
//_result:
utils.sha256("0x")
//!
//_log:
//_result:
utils.sha256("0x1234")
//!
//_log:
//_result:
utils.sha512("0x")
//!
//_log:
//_result:
utils.sha512("0x1234")
//!
//_log:
_subsection: HMAC @<utils--hmac>
@@ -119,10 +135,11 @@ Use the [SHA2-512](link-wiki-sha2) hash algorithm.
_code: HMAC @lang<javascript>
const key = "0x0102";
const data = "0x1234";
const key = "0x0102"
const data = "0x1234"
//_result:
utils.computeHmac("sha256", key, data)
//!
//_log:
_subsection: Hashing Helpers @<utils--hashing-helpers>
@@ -132,27 +149,179 @@ Computes the [[link-eip-191]] personal message digest of //message//. Personal m
converted to UTF-8 bytes and prefixed with ``\\x19Ethereum Signed Message:``
and the length of //message//.
_code: Hashing Messages @lang<javascript>
// Hashing a string message
//_result:
utils.hashMessage("Hello World")
//_log:
// Hashing binary data (also "Hello World", but as bytes)
//_result:
utils.hashMessage( [ 72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100 ])
//_log:
// NOTE: It is important to understand how strings and binary
// data is handled differently. A string is ALWAYS processed
// as the bytes of the string, so a hexstring MUST be
// converted to an ArrayLike object first.
// Hashing a hex string is the same as hashing a STRING
// Note: this is the hash of the 4 characters [ '0', 'x', '4', '2' ]
//_result:
utils.hashMessage("0x42")
//_log:
// Hashing the binary data
// Note: this is the hash of the 1 byte [ 0x42 ]
//_result:
utils.hashMessage([ 0x42 ])
//_log:
// Hashing the binary data
// Note: similarly, this is the hash of the 1 byte [ 0x42 ]
//_result:
utils.hashMessage(utils.arrayify("0x42"))
//_log:
_property: ethers.utils.namehash(name) => string<[[DataHexString]]<32>> @<utils-namehash> @SRC<hash>
Returns the [ENS Namehash](link-namehash) of //name//.
_code: Hashing Messages @lang<javascript>
// @TODO: include examples of hashMessage; it can be complex. :)
_code: Namehash @lang<javascript>
//_result:
utils.namehash("")
//!
//_log:
//_result:
utils.namehash("eth")
//!
//_log:
//_result:
utils.namehash("ricmoo.firefly.eth")
//!
//_log:
//_result:
utils.namehash("ricmoo.xyz")
//!
//_log:
_heading: Typed Data Encoder @<TypedDataEncoder> @SRC<hash:class.TypedDataEncoder>
The **TypedDataEncoder** is used to compute the various encoded data required
for [[link-eip-712]] signed data.
Signed data requires a domain, list of structures and their members and the data
itself.
The **domain** is an object with values for any of the standard domain
properties.
The **types** is an object with each property being the name of a structure, mapping
to an array of field descriptions. It should **not** include the ``EIP712Domain``
property unless it is required as a child structure of another.
_note: Experimental Feature (this exported class name will change)
This is still an experimental feature. If using it, please specify the **exact**
version of ethers you are using (e.g. spcify ``"5.0.18"``, **not** ``"^5.0.18"``) as
the exported class name will be renamed from ``_TypedDataEncoder`` to ``TypedDataEncoder`` once
it has been used in the field a bit.
_property: ethers.utils._TypedDataEncoder.from(types) => [TypedDataEncoder] @<TypedDataEncoder-from> @SRC<hash:TypedDataEncoder.from>
Creates a new **TypedDataEncoder** for //types//. This object is a fairly
low-level object that most developers should not require using instances
directly.
Most developers will find the static class methods below the most useful.
_property: TypedDataEncoder.encode(domain, types, values) => string @<TypedDataEncoder-encode> @SRC<hash:staticmethod.TypedDataEncoder.encode>
Encodes the Returns the hashed [[link-eip-712]] domain.
_property: TypedDataEncoder.getPayload(domain, types, value) => any @<TypedDataEncoder-getPayload> @SRC<hash:TypedDataEncoder.getPayload>
Returns the standard payload used by various JSON-RPC ``eth_signTypedData*``
calls.
All domain values and entries in value are normalized and the types are
verified.
_property: TypedDataEncoder.getPrimaryType(types) => string @<TypedDataEncoder-getPrimaryType> @SRC<hash:TypedDataEncoder.getPrimaryType>
Constructs a directed acyclic graph of the types and returns the
root type, which can be used as the **primaryType** for [[link-eip-712]]
payloads.
_property: TypedDataEncoder.hash(domain, types, values) => string<[[DataHexString]]<32>> @<TypedDataEncoder-hash> @SRC<hash:staticmethod.TypedDataEncoder.hash>
Returns the computed [[link-eip-712]] hash.
_property: TypedDataEncoder.hashDomain(domain) => string<[[DataHexString]]<32>> @<TypedDataEncoder-hashDomain> @SRC<hash:TypedDataEncoder.hashDomain>
Returns the hashed [[link-eip-712]] domain.
_property: TypedDataEncoder.resolveNames(domain, types, value, resolveName) => Promise<any> @<TypedDataEncoder-resolveNames> @SRC<hash:TypedDataEncoder.resolveNames>
Returns a copy of value, where any leaf value with a type of ``address`` will have
been recursively replacedwith the value of calling //resolveName// with that value.
_code: Typed Data Example @lang<javascript>
//_hide: TypedDataEncoder = ethers.utils._TypedDataEncoder
domain = {
name: 'Ether Mail',
version: '1',
chainId: 1,
verifyingContract: '0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC'
};
// The named list of all type definitions
types = {
Person: [
{ name: 'name', type: 'string' },
{ name: 'wallet', type: 'address' }
],
Mail: [
{ name: 'from', type: 'Person' },
{ name: 'to', type: 'Person' },
{ name: 'contents', type: 'string' }
]
};
// The data to sign
value = {
from: {
name: 'Cow',
wallet: '0xCD2a3d9F938E13CD947Ec05AbC7FE734Df8DD826'
},
to: {
name: 'Bob',
wallet: '0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB'
},
contents: 'Hello, Bob!'
};
//_result:
TypedDataEncoder.encode(domain, types, value)
//_log:
//_result:
TypedDataEncoder.getPayload(domain, types, value)
//_log:
//_result:
TypedDataEncoder.getPrimaryType(types)
//_log:
//_result:
TypedDataEncoder.hash(domain, types, value)
//_log:
//_result:
TypedDataEncoder.hashDomain(domain)
//_log:
_subsection: Solidity Hashing Algorithms @<utils--solidity-hashing>
@@ -163,7 +332,7 @@ the tightly packing algorithm.
_property: ethers.utils.solidityPack(types, values) => string<[[DataHexString]]> @<utils-solidityPack> @SRC<solidity:pack>
Returns the non-standard encoded //values// packed according to
their respecive type in //types//.
their respective type in //types//.
_property: ethers.utils.solidityKeccak256(types, values) => string<[[DataHexString]]<32>> @<utils-solidityKeccak256> @SRC<solidity:keccak256>
Returns the [KECCAK256](link-wiki-sha3) of the non-standard encoded //values// packed
@@ -175,15 +344,40 @@ according to their respective type in //types//.
_code: Solidity Hashing @lang<javascript>
//_result:
utils.solidityPack([ "int16", "uint48" ], [ -1, 12 ])
//!
//_log:
//_result:
utils.solidityPack([ "string", "uint8" ], [ "Hello", 3 ])
//!
//_log:
//_result:
utils.solidityKeccak256([ "int16", "uint48" ], [ -1, 12 ])
//!
//_log:
//_result:
utils.soliditySha256([ "int16", "uint48" ], [ -1, 12 ])
//!
//_log:
// As a short example of the non-distinguished nature of
// Solidity tight-packing (which is why it is inappropriate
// for many things from a security point of view), consider
// the following examples are all equal, despite representing
// very different values and layouts.
//_result:
utils.solidityPack([ "string", "string" ], [ "hello", "world01" ])
//_log:
//_result:
utils.solidityPack([ "string", "string" ], [ "helloworld", "01" ])
//_log:
//_result:
utils.solidityPack([ "string", "string", "uint16" ], [ "hell", "oworld", 0x3031 ])
//_log:
//_result:
utils.solidityPack([ "uint96" ], [ "32309054545061485574011236401" ])
//_log:

View File

@@ -1,6 +1,16 @@
_section: HD Wallet @<hdnodes>
TODO: Explain [BIP32](link-bip-32) [BIP-39](link-bip-39) and whatnot here...
The Hierarchal Desterministic (HD) Wallet was a standard
created for Bitcoin, but lends itself well to a wide variety of
Blockchains which rely on secp256k1 private keys.
For a more detailed technical understanding:
- [BIP-32](link-bip-32) - the hierarchal deterministic description
- [BIP-39](link-bip-39) - the method used to derive the BIP-32 seed
from human-readable sequences of words (i.e. a mnemonic)
- [BIP-44](link-bip-44) - a standard defined to make BIP-32 easy
to adapt to any future compatible blockchain
_subsection: Types
@@ -101,7 +111,7 @@ _heading: Methods @<HDNode--methods>
_property: hdNode.neuter() => [[HDNode]] @<HDNode-neuter> @SRC<hdnode>
Return a new instance of //hdNode// with its private key removed
but all otehr properties preserved. This ensures that the key
but all other properties preserved. This ensures that the key
can not leak the private key of itself or any derived children,
but may still be used to compute the addresses of itself and
any non-hardened children.

View File

@@ -48,39 +48,38 @@ Throw an Error with //message// and an optional //code// and
additional //params// set.
_property: logger.throwArgumentError(message, name, value) => never @SRC<logger>
Throw an [INVALID_ARGUMENT](errors-InvalidArgument) Error with //name// and //value//.
Throw an [INVALID_ARGUMENT](errors--invalid-argument) Error with //name// and //value//.
_heading: Usage Validation
There can be used to ensure various properties and actions are safe.
_property: logger.checkAbstract(target, kind) => void @SRC<logger>
Checks that //target// is not //kind// and performs the same operatons
as ``checkNew``. This is useful for ensuring abstract classes are not
being instantiated.
_property: logger.checkAbstract(target, kind) => void @<Logger-checkAbstract> @SRC<logger>
If //target// is //kind//, throws a [UNSUPPORTED_OPERATION](errors--unsupported-operation) error
otherwise performs the same operations as [checkNew](Logger-checkNew).
_property: logger.checkArgumentCount(count, expectedCound [ , message) => void @SRC<logger>
If //count// is not equal to //expectedCount//, throws a [MISSING_ARGUMENT](errors-MissingArgument)
or [UNEXPECTED_ARGUMENT](errors-UnexpectedArgument) error.
This is useful for ensuring abstract classes are not being instantiated.
_property: logger.checkNew(target, kind) => void @SRC<logger>
_property: logger.checkArgumentCount(count, expectedCount [ , message) => void @<Logger-checkArgumentCount> @SRC<logger>
If //count// is not equal to //expectedCount//, throws a [MISSING_ARGUMENT](errors--missing-argument)
or [UNEXPECTED_ARGUMENT](errors--unexpected-argument) error.
_property: logger.checkNew(target, kind) => void @<Logger-checkNew> @SRC<logger>
If //target// is not a valid ``this`` or ``target`` value, throw a
[MISSING_NEW](errors-MissingNew) error. This is useful to ensure
[MISSING_NEW](errors--missing-new) error. This is useful to ensure
callers of a Class are using ``new``.
_property: logger.checkNormalize(message) => void @SRC<logger>
_property: logger.checkNormalize(message) => void @<Logger-checkNoralize> @SRC<logger>
Check that the environment has a correctly functioning [[link-js-normalize]]. If not, a
[UNSUPPORTED_OPERATION](errors-UnsupportedOperation) error is thrown.
[UNSUPPORTED_OPERATION](errors--unsupported-operation) error is thrown.
_property: logger.checkSafeUint53(value [, message ]) => void @SRC<logger>
_property: logger.checkSafeUint53(value [, message ]) => void @<Logger-checkSafeUint53> @SRC<logger>
If //value// is not safe as a [JavaScript number](link-wiki-ieee754), throws a
[NUMERIC_FAULT](errors-NumericFault) error.
[NUMERIC_FAULT](errors--numeric-fault) error.
_heading: Censorship @<Logger--censorship>
_property: Logger.setCensorship(censor [ , permanent = false ]) => void @SRC<logger>
_property: Logger.setCensorship(censor [ , permanent = false ]) => void @<Logger-setCensorship> @SRC<logger>
Set error censorship, optionally preventing errors from being uncensored.
In production applications, this prevents any error from leaking information
@@ -88,7 +87,7 @@ by masking the message and values of errors.
This can impact debugging, making it substantially more difficult.
_property: Logger.setLogLevel(logLevel) => void @SRC<logger>
_property: Logger.setLogLevel(logLevel) => void @<Logger-setLogLevel> @SRC<logger>
Set the log level, to suppress logging output below a [particular log level](Logger-levels).
@@ -98,76 +97,113 @@ Every error in Ethers has a ``code`` value, which is a string that will
match one of the following error codes.
_heading: Generic Error Codes
_heading: Generic Error Codes @<errors-generic>
_property: Logger.errors.NOT_IMPLEMENTED
The operation is not implemented.
_property: Logger.errors.NOT_IMPLEMENTED @<errors--not-implemented>
The operation is not implemented. This may occur when calling a method
on a sub-class that has not fully implemented its abstract superclass.
_property: Logger.errors.SERVER_ERROR
_property: Logger.errors.SERVER_ERROR @<errors--server-error>
There was an error communicating with a server.
_property: Logger.errors.TIMEOUT @<errors-Timeout>
This may occur for a number of reasons, for example:
- a [CORS](link-cors) issue; this is quite often the problem and also the
hardest to diagnose and fix, so it is very beneficial to familiarize
yourself with CORS; some backends allow you configure your CORS, such as
the geth command-line or conifguration files or the INFURA and Alchemy
dashboards by specifing allowed Origins, methods, etc.
- an SSL issue; for example, if you are trying to connect to a local node via
HTTP but are serving the content from a secure HTTPS website
- a link issue; a firewall is preventing the traffic from reaching the server
- a server issue; the server is down, or is returning 500 error codes
- a backend DDoS mitigation proxy; for example, Etherscan operates behind a
Cloudflare proxy, which will block traffic if the request is sent via
specific User Agents or the client fingerprint is detected as a bot in some
cases
_property: Logger.errors.TIMEOUT @<errors--timeout>
A timeout occurred.
_property: Logger.errors.UNKNOWN_ERROR @<errors-UnknownError>
_property: Logger.errors.UNKNOWN_ERROR @<errors--unknown-error>
A generic unknown error.
_property: Logger.errors.UNSUPPORTED_OPERATION @<errors-UnsupportedOperation>
_property: Logger.errors.UNSUPPORTED_OPERATION @<errors--unsupported-operation>
The operation is not supported.
This can happen for a variety reasons, for example:
_heading: Safety Error Codes
- Some backends do not support certain operations; such as passing a blockTag
to an [[EtherscanProvider]] for [call](Provider-call)
- A [[Contract]] object connected to [[Provider]] (instead of a [[Signer]]) cannot
[sign](Signer-signTransaction) or [send](Signer-sendTransaction) transactions
- a [[Contract]] connected to a [[Signer]] without a [[Provider]] is write-only
and cannot estimate gas or execute static calls
_property: Logger.errors.BUFFER_OVERRUN
_heading: Safety Error Codes @<errors-safety>
_property: Logger.errors.BUFFER_OVERRUN @<errors--buffer-overrun>
The amount of data needed is more than the amount of data required,
which would cause the data buffer to read past its end.
_property: Logger.errors.NUMERIC_FAULT @<errors-NumericFault>
This can occur if a contract erroneously returns invalid ABI-encoded
data or RLP data is malformed.
_property: Logger.errors.NUMERIC_FAULT @<errors--numeric-fault>
There was an invalid operation done on numeric values.
Common cases of this occur when there is [[link-wiki-overflow]],
[[link-wiki-underflow]] in fixed numeric types or division by zero.
_heading: Usage Error Codes
_heading: Usage Error Codes @<errors-usage>
_property: Logger.errors.INVALID_ARGUMENT @<errors-InvalidArgument>
_property: Logger.errors.INVALID_ARGUMENT @<errors--invalid-argument>
The type or value of an argument is invalid. This will generally also
include the ``name`` and ``value`` of the argument. Any function which
accepts sensitive data (such as a private key) will include the string
``[\[REDACTED]\]`` instead of the value passed in.
``"[\[REDACTED]\]"`` instead of the value passed in.
_property: Logger.errors.MISSING_ARGUMENT @<errors-MissingArgument>
_property: Logger.errors.MISSING_ARGUMENT @<errors--missing-argument>
An expected parameter was not specified.
_property: Logger.errors.MISSING_NEW @<errors-MissingNew>
An object is a Class, but is now being called with ``new``.
_property: Logger.errors.MISSING_NEW @<errors--missing-new>
An object is a Class, but is not being called with ``new``.
_property: Logger.errors.UNEXPECTED_ARGUMENT @<errors-UnexpectedArgument>
_property: Logger.errors.UNEXPECTED_ARGUMENT @<errors--unexpected-argument>
Too many parameters we passed into a function.
_heading: Ethereum Error Codes
_heading: Ethereum Error Codes @<errors-ethereum>
_property: Logger.errors.CALL_EXCEPTION
_property: Logger.errors.CALL_EXCEPTION @<errors--call-exception>
An attempt to call a blockchain contract (getter) resulted in a
revert or other error.
revert or other error, such as insufficient gas (out-of-gas) or an
invalid opcode. This can also occur during gas estimation or if
waiting for a [[providers-TransactionReceipt]] which failed during execution.
_property: Logger.errors.INSUFFICIENT_FUNDS
Consult the contract to determine the cause, such as a failed condition
in a ``require`` statement. The ``reason`` property may provide more
context for the cause of this error.
_property: Logger.errors.INSUFFICIENT_FUNDS @<errors--insufficient-funds>
The account is attempting to make a transaction which costs more than is
available.
A sending account must have enough ether to pay for the value, the gas limit
(at the gas price) as well as the intrinsic cost of data. The intrinsic cost
of data is 4 gas for each zero byte and 68 gas for each non-zero byte.
of data is 4 gas for each zero byte and 68 gas for each non-zero byte, as well
as 35000 gas if a transaction contains no ``to`` property and is therefore
expected to create a new account.
_property: Logger.errors.NETWORK_ERROR
_property: Logger.errors.NETWORK_ERROR @<errors--network>
An Ethereum network validation error, such as an invalid chain ID.
_property: Logger.errors.NONCE_EXPIRED
_property: Logger.errors.NONCE_EXPIRED @<errors--nonce-expired>
The nonce being specified has already been used in a mined transaction.
_property: Logger.errors.REPLACEMENT_UNDERPRICED
_property: Logger.errors.REPLACEMENT_UNDERPRICED @<errors--replacement-underpriced>
When replacing a transaction, by using a nonce which has already been sent to
the network, but which has not been mined yet the new transaction must specify
a higher gas price.
@@ -175,9 +211,28 @@ a higher gas price.
This error occurs when the gas price is insufficient to //bribe// the transaction
pool to prefer the new transaction over the old one. Generally, the new gas price
should be about 50% + 1 wei more, so if a gas price of 10 gwei was used, the
replacement should be 15.000000001 gwei.
replacement should be 15.000000001 gwei. This is not enforced by the protocol, as
it deals with unmined transactions, and can be configured by each node, however
to ensure a transaction is propagated to a miner it is best practice to follow
the defaults most nodes have enabled.
_property: Logger.errors.UNPREDICTABLE_GAS_LIMIT
_property: Logger.errors.TRANSACTION_REPLACED @<errors--transaction-replaced>
When a transaction has been replaced by the user, by broadcasting a new transaction
with the same nonce as an existing in-flight (unmined) transaction in the mempool,
this error will occur while waiting if the transaction being waited for has become
invalidated by that other transaction.
This can happen for several reasons, but most commonly because the user has increased
the gas price (which changes the transaction hash) to "speed up" a transaction or if
a user has "cancelled" the transaction in their client. In either case this is
usually accomplished by bribing the miners with a higher gas priced transaction.
This error will have the additional properties, ``cancelled``, ``hash``, ``reason``,
``receipt`` and ``replacement``.
See the [[providers-TransactionResponse]] for the ``wait`` method for more details.
_property: Logger.errors.UNPREDICTABLE_GAS_LIMIT @<errors--unpredicatable-gas-limit>
When estimating the required amount of gas for a transaction, a node is queried for
its best guess.
@@ -196,7 +251,7 @@ _property: Logger.levels.DEBUG
Log all output, including debugging information.
_property: Logger.levels.INFO
Only log output for infomational, warnings and errors.
Only log output for informational, warnings and errors.
_property: Logger.levels.WARNING
Only log output for warnings and errors.

View File

@@ -1,9 +1,40 @@
_section: Property Utilities
_property: ethers.utils.checkProperties() => void
This is a collection of utility functions used for handling
properties in a platform-safe way.
The next major version of ethers will no longer be compatible
with ES3, so many of these will be removed in favor of the
built-in options available in ES2015 and above.
_property: ethers.utils.checkProperties(object, check) => void
Checks that //object// only contains properties included
in //check//, and throws [INVALID_ARGUMENT](errors--invalid-argument) if not.
_property: ethers.utils.deepCopy(anObject) => any
Creates a recursive copy of //anObject//. Frozen (i.e. and other known
immutable) objects are copied by reference.
_property: ethers.utils.defineReadOnly(anObject, name, value) => void
Uses the ``Object.defineProperty`` method to set a read-only property
on an object.
_property: ethers.utils.getStatic(aConstructor, key) => any
Recursively check for a static method //key// on an inheritance chain
from //aConstructor// to all ancestors.
This is used to mimic behaviour in other languages where ``this`` in
a static method will also search ancestors.
_property: ethers.utils.resolveProperties(anObject) => Promise<any> @<utils-resolveproperties> @SRC<properties>
Retruns a Promise which resolves all child values on //anObject//.
_property: ethers.utils.shallowCopy(anObject) => any
Returns a shallow copy of //anObject//. This is the same as
using ``Object.assign({ }, anObject)``.

View File

@@ -8,11 +8,11 @@ The private key for this Signing Key.
_property: signingKey.publicKey => string<[[DataHexString]]<65>>
The uncompressed public key for this Signing Key. It will always be
65 bytes (130 nibbles) and begine with ``0x04``.
65 bytes (130 nibbles) and begins with ``0x04``.
_property: signingKey.compressedPublicKey => string<[[DataHexString]]<33>>
The compressed public key for this Signing Key. It will always be
33 bytes (66 nibbles) and begine with either ``0x02`` or ``0x03``.
33 bytes (66 nibbles) and begins with either ``0x02`` or ``0x03``.
_property: signingKey.signDigest(digest) => [[Signature]]
Sign the //digest// and return the signature.
@@ -39,7 +39,13 @@ will then be used to compute the address; this allows systems which use
the v to encode additional data (such as [EIP-155](link-eip-155))
to be used since the v parameter is still completely non-ambiguous.
_property: ethers.utils.verifyTypedData(domain, types, value, signature) => string<[[address]]> @<utils-verifyTypedData> @SRC<wallet>
Returns the address that signed the [[link-eip-712]] //value// for the //domain//
and //types// to produce the signature.
_property: ethers.utils.recoverPublicKey(digest, signature) => string<[[DataHexString]]<65>> @<utils-recoverPublicKey>
Returns the uncompressed public key (i.e. the first byte will be ``0x04``)
of the private key that was used to sign //digest// which gave the //signature//.
_property: ethers.utils.computePublicKey(key [, compressed = false ]) => string<[[DataHexString]]> @<utils-computePublicKey>
Computes the public key of //key//, optionally compressing it. The //key//

View File

@@ -1,7 +1,11 @@
_section: Strings @<strings>
Tra la la
A **String** is a representation of a human-readable input of output,
which are often taken for granted.
When dealing with blockchains, properly handling human-readable and
human-provided data is important to prevent loss of funds, assets,
incorrect permissions, etc.
_subsection: Bytes32String @<Bytes32String>
@@ -40,7 +44,7 @@ Returns the Array of codepoints of //text//, optionally normalized using the
_note: Note
This function correctly splits each **user-perceived character** into
its codepoint, accounting for surrogate pairs. This should not be confused with
``string.split("")``, which destroys surrogate pairs, spliting between each UTF-16
``string.split("")``, which destroys surrogate pairs, splitting between each UTF-16
codeunit instead.
_property: ethers.utils.toUtf8String(aBytesLike [ , onError = error ] ) => string @<utils-toUtf8String> @SRC<strings>
@@ -88,7 +92,7 @@ See NFKC for more an example.
_note: Note
Only certain specified characters are folded in Canonical Equivalence, and thus
it should **not** be considered a method to acheive //any// level of security from
it should **not** be considered a method to achieve //any// level of security from
[homoglyph attacks](link-wiki-homoglyph).

View File

@@ -7,7 +7,7 @@ An unsigned transaction represents a transaction that has not been
signed and its values are flexible as long as they are not ambiguous.
_property: unsignedTransaction.to => string<[Address](address)>
The addres this transaction is to.
The address this transaction is to.
_property: unsignedTransaction.nonce => number
The nonce of this transaction.
@@ -18,6 +18,12 @@ The gas limit for this transaction.
_property: unsignedTransaction.gasPrice => [[BigNumberish]]
The gas price for this transaction.
_property: unsignedTransaction.maxFeePerGas => [[BigNumberish]]
The maximum fee per unit of gas for this transaction.
_property: unsignedTransaction.maxPriorityFeePerGas => [[BigNumberish]]
The maximum priority fee per unit of gas for this transaction.
_property: unsignedTransaction.data => [[BytesLike]]
The data for this transaction.
@@ -38,7 +44,7 @@ The transaction hash, which can be used as an identifier for
//transaction//. This is the keccak256 of the serialized RLP encoded
representation of //transaction//.
_property: unsignedTransaction.to => string<[Address](address)>
_property: transaction.to => string<[Address](address)>
The address //transaction// is to.
_property: transaction.from => string<[Address](address)>
@@ -54,12 +60,24 @@ _property: transaction.gasLimit => [[BigNumber]]
The gas limit for //transaction//. An account must have enough ether to
cover the gas (at the specified **gasPrice**). Any unused gas is
refunded at the end of the transaction, and if there is insufficient gas
to complete execution, the effects of the trasaction are reverted, but
to complete execution, the effects of the transaction are reverted, but
the gas is **fully consumed** and an out-of-gas error occurs.
_property: transaction.gasPrice => [[BigNumber]]
_property: transaction.gasPrice => null | [[BigNumber]]
The price (in wei) per unit of gas for //transaction//.
For [[link-eip-1559]] transactions, this will be null.
_property: transaction.maxFeePerGas => [[BigNumber]]
The maximum price (in wei) per unit of gas for //transaction//.
For transactions that are not [[link-eip-1559]] transactions, this will be null.
_property: transaction.maxPriorityFeePerGas => [[BigNumber]]
The priority fee price (in wei) per unit of gas for //transaction//.
For transactions that are not [[link-eip-1559]] transactions, this will be null.
_property: transaction.data => [[BytesLike]]
The data for //transaction//. In a contract this is the call data.
@@ -97,8 +115,17 @@ used to encode the chain ID into the serialized transaction.
_subsection: Functions @<transactions--functions>
_property: ethers.utils.accessListify(anAcceslistish) => [[providers-AccessList]] @<utils-accessListify> @SRC<transactions:accessListify>
Normalizes the [[providers-AccessListish]] //anAccessListish// into
an [[providers-AccessList]].
This is useful for other utility functions which wish to remain
flexible as to the input parameter for access lists, such as
when creating a [[Signer]] which needs to manipulate a possibly
typed transaction envelope.
_property: ethers.utils.parseTransaction(aBytesLike) => [[Transaction]] @<utils-parseTransaction> @SRC<transactions:parse>
Parses the transaction properties from a serialized transactions.
Parses the transaction properties from a serialized transaction.
_property: ethers.utils.serializeTransaction(tx [ , signature ]) => string<[[DataHexString]]> @<utils-serializeTransaction> @SRC<transactions:serialize>
Computes the serialized //transaction//, optionally serialized with

View File

@@ -3,7 +3,7 @@ _section: Web Utilities @<web>
_property: ethers.utils.fetchJson(urlOrConnectionInfo [, json [ , processFunc ] ]) => Promise<any> @<utils-fetchJson>
Fetch and parse the JSON content from //urlOrConnectionInfo//, with the
optiona body //json// and optionally processing the result with //processFun//
optional body //json// and optionally processing the result with //processFun//
before returning it.
_property: ethers.utils.poll(pollFunc [, options ]) => Promise<any> @<utils-poll>
@@ -33,11 +33,17 @@ How long to wait before rejecting with a //timeout// error.
_property: connection.headers => { [ key: string]: string }
Additional headers to include in the connection.
_property: connection.skipFetchSetup => boolean
Normally a connection will specify the default values for a connection
such as CORS-behavior and caching policy, to ensure compatibility across
platforms. On some services, such as Cloudflare Workers, specifying any
value (inclluding the default values) will cause failure. Setting this
to true will prevent any values being passed to the underlying API.
_heading: PollOptions @<PollOptions>
_property: options.timeout => number
The amount of time allowed to ellapse before triggering a timeout
The amount of time allowed to elapse before triggering a timeout
error.
_property: options.floor => number

View File

@@ -30,8 +30,8 @@ the registered //name//.
_subsection: Languages @<wordlists--languages>
The [official wordlists](link-bip39-wordlists) availalbe in at
`ethers.wordlists`. In the browser, only the english langauge is
The [official wordlists](link-bip39-wordlists) available at
`ethers.wordlists`. In the browser, only the english language is
available by default; to include the others (which increases the
size of the library), see the dist files in the `ethers` package.

View File

@@ -2,7 +2,7 @@ _section: Assembler @<cli-asm>
The assembler Command-Line utility allows you to assemble the
[Ethers ASM Dialect](asm-dialect) into deployable EVM bytecode
and disassemle EVM bytecode into human-readable mnemonics.
and disassemble EVM bytecode into human-readable mnemonics.
_subsection: Help
@@ -31,7 +31,7 @@ _code: SimpleStore.asm @lang<asm>
; SimpleStore (uint)
; Set the inital value of 42
; Set the initial value of 42
sstore(0, 42)
; Init code to deploy myContract
@@ -104,8 +104,8 @@ bytecode by running multiple passes of an assemble stage, each pass
more closely approximating the final result.
This allows small portions of the bytecode to be massaged and tweaked
until the bytecode stablizes. This allows for more compact jump
destinations and for code to be include more advanced meta-programming
until the bytecode stabilizes. This allows for more compact jump
destinations and for code to include more advanced meta-programming
techniques.
_code: @lang<shell>
@@ -144,7 +144,7 @@ Byt specifying the **Position Independent Code** flag, code
will be generated in a way such that all offsets are relative, allowing
the program to be moved without any impact to its logic.
This does incur an additional gsas cost of 8 gas per offset access though.
This does incur an additional gas cost of 8 gas per offset access though.
_definition: **-\-target LABEL**
All programs have a root scope named ``_`` which is by default

View File

@@ -62,7 +62,7 @@ TRANSACTION OPTIONS (default: query network)
--gasPrice GWEI Default gas price for transactions(in wei)
--gasLimit GAS Default gas limit for transactions
--nonce NONCE Initial nonce for the first transaction
--yes Always accept Siging and Sending
--yes Always accept Signing and Sending
OTHER OPTIONS
--wait Wait until transactions are mined

View File

@@ -1,7 +1,7 @@
_section: Sandbox Utility
The sandbox utility provides a simple way to use the most common
ethers utilities required during learning, debuging and managing
ethers utilities required during learning, debugging and managing
interactions with the Ethereum network.
If no command is given, it will enter a REPL interface with many
@@ -64,7 +64,7 @@ TRANSACTION OPTIONS (default: query network)
--gasPrice GWEI Default gas price for transactions(in wei)
--gasLimit GAS Default gas limit for transactions
--nonce NONCE Initial nonce for the first transaction
--yes Always accept Siging and Sending
--yes Always accept Signing and Sending
OTHER OPTIONS
--wait Wait until transactions are mined

View File

@@ -21,7 +21,7 @@ associated plugin class will be instantiated and run.
_property: setPlugin(pluginClass) => void @<cli-setplugin> @SRC<cli/cli>
Set a dedicated [[cli-plugin]] class which will handle all input. This
may not be used in conjuction with addPlugin and will not automatically
may not be used in conjunction with addPlugin and will not automatically
accept a command from the arguments.
_property: showUsage([ message = "" [ , status = 0 ] ]) => never @<cli-showusage> @SRC<cli/cli>
@@ -36,7 +36,7 @@ _subsection: Plugin @<cli-plugin> @SRC<cli:class.Plugin>
Each **Plugin** manages each command of a CLI and is executed in phases.
If the usage (i.e. help) of a CLI is requested, the static methods ``getHelp``
and ``getOptionHelp`` are used to geneate the help screen.
and ``getOptionHelp`` are used to generate the help screen.
Otherwise, a plugin is instantiated and the ``prepareOptions`` is called. Each
plugin **must** call ``super.prepareOptions``, otherwise the basic options are
@@ -47,8 +47,8 @@ for a given option is invalid or some combination of options and flags is not
allowed.
Once the prepareOptions is complete (the returned promise is resolved), the ``prepareArguments``
is called. This should validate the number of arguments is expected and throw
and error if there are too many or too few arguments or if any arguments do not
is called. This should validate the number of arguments expected and throw
an error if there are too many or too few arguments or if any arguments do not
make sense.
Once the prepareArguments is complete (the returned promise is resolved), the ``run``
@@ -83,7 +83,7 @@ _property: plugin.prepareArgs(args) => Promise<void> @<plugin-prepareargs> @SR
_property: plugin.run() => Promise<void> @<plugin-run> @SRC<cli/cli:Plugin.run>
_property: plugin.getAddress(addressOrName [ , message = "", [ allowZero = false ] ]) => Promise<string> @<plugin-getaddress> @SRC<cli/cli:Plugin.getAddress>
A plugin should use this method to resolve an address. If the resovled address is
A plugin should use this method to resolve an address. If the resolved address is
the zero address and //allowZero// is not true, an error is raised.
_property: plugin.dump(header, info) => void @<plugin-dump> @SRC<cli/cli:Plugin.dump>
@@ -92,7 +92,7 @@ formatted style. In the future, plugins may support a JSON output format
which will automatically work with this method.
_property: plugin.throwUsageError([ message = "" ]) => never @<plugin-throwusageerror> @SRC<cli/cli>
Stops exectuion of the plugin and shows the help screen of the plugin with
Stops execution of the plugin and shows the help screen of the plugin with
the optional //message//.
_property: plugin.throwError(message) => never @<plugin-throwerror> @SRC<cli/cli>
@@ -133,7 +133,7 @@ Flags are simple binary options (such as the ``--yes``), which are true if prese
otherwise false.
Options require a single parameter follow them on the command line
(such as ``--account wallet.json``, which nhas the name ``account`` and the value
(such as ``--account wallet.json``, which has the name ``account`` and the value
``wallet.json``)
Arguments are all other values on the command line, and are not accessed through

View File

@@ -20,7 +20,7 @@ refresh the page. This should cause all your UI components to
reset to a known-safe state, including any banners and warnings
to your users if they are on an unsupported network.
This can be acomplished by using the following function:
This can be accomplished by using the following function:
_code: Automatically Refresh on Network Change @lang<script>

View File

@@ -1,34 +1,40 @@
_section: Events
Explain how topics and such work
_subsection: Solidity Topics
How to compute the topic...
_section: Events @<events>
_subsection: Logs and Filtering
Example hog logs are used.
Logs and filtering are used quite often in blockchain applications,
since they allow for efficient queries of indexed data and provide
lower-cost data storage when the data is not required to be
accessed on-chain.
Link to provider.getLogs and contract.on
These can be used in conjunction with the [Provider Events API](Provider--event-methods)
and with the [Contract Events API](Contract--events).
_heading: Filters
The Contract Events API also provides [higher-level methods](Contract--filters)
to compute and query this data, which should be preferred over the lower-level filter.
Filter are used as a way to query ... efficient, explain bloom filters lightly
_heading: Filters @<events--filters>
A filter may have up to 4 topic-sets, where each topic-set refers
to a condition that must match the log topic in that position (i.e. each
condition is ``AND``-ed together).
When a Contract creates a log, it can include up to 4 pieces of
data to be indexed by. The indexed data is hashed and included in
a [[link-wiki-bloomfilter]], which is a data structure that allows
for efficient filtering.
If a topic-set is ``null``, a log topic in that position is not filtered
So, a filter may correspondingly have up to 4 topic-sets, where each
topic-set refers to a condition that must match the indexed log topic
in that position (i.e. each condition is ``AND``-ed together).
If a topic-set is ``null``, a log topic in that position is **not filtered**
at all and **any value** matches.
If a topic-set is a single topic, a log topic in that position must match
If a topic-set is a single topic, a log topic in that position **must** match
**that topic**.
If a topic-set is an array of topics, a log topic in that position must
match any **one** of topics (i.e. the topic in thie position are ``OR``-ed).
match **any one** of the topics (i.e. the topic in this position are ``OR``-ed).
This may sound complicated at first, but is more easily understood with
some examples.
_table: Example Log Matching @style<full>
@@ -51,13 +57,11 @@ $TopicABaCD: **[** (topic[0] = A) **OR** (topic[0] = B) **]** **AND**
_code: ERC-20 Transfer Filter Examples @lang<javascript>
// <hide>
const tokenAddress = ethers.constants.AddressZero;
const myAddress = ethers.constants.AddressZero;
const myOtherAddress = ethers.constants.AddressZero;
const id = ethers.utils.id;
const hexZeroPad = ethers.utils.hexZeroPad;
// </hide>
//_hide: const tokenAddress = ethers.constants.AddressZero;
//_hide: const myAddress = ethers.constants.AddressZero;
//_hide: const myOtherAddress = ethers.constants.AddressZero;
//_hide: const id = ethers.utils.id;
//_hide: const hexZeroPad = ethers.utils.hexZeroPad;
// Short example of manually creating filters for an ERC-20
// Transfer event.
@@ -87,33 +91,33 @@ const hexZeroPad = ethers.utils.hexZeroPad;
filter = {
address: tokenAddress,
topics: [
id("Transfer(address,address,uint256)"),
utils.id("Transfer(address,address,uint256)"),
hexZeroPad(myAddress, 32)
]
}
};
// List all token transfers *to* myAddress:
filter = {
address: tokenAddress,
topics: [
id("Transfer(address,address,uint256)"),
utils.id("Transfer(address,address,uint256)"),
null,
hexZeroPad(myAddress, 32)
]
}
};
// List all token transfers *to* myAddress or myOtherAddress:
filter = {
address: tokenAddress,
topics: [
id("Transfer(address,address,uint256)"),
utils.id("Transfer(address,address,uint256)"),
null,
[
hexZeroPad(myAddress, 32),
hexZeroPad(myOtherAddress, 32),
]
]
}
};
_null:
@@ -122,35 +126,87 @@ To simplify life, ..., explain here, the contract API
_code: ERC-20 Contract Filter Examples @lang<javascript>
// <hide>
const tokenAddress = "0x6B175474E89094C44Da98b954EedeAC495271d0F"; // DAI
const myAddress = "0x8ba1f109551bD432803012645Ac136ddd64DBA72";
const otherAddress = "0xEA517D5a070e6705Cc5467858681Ed953d285Eb9";
const provider = ethers.getDefaultProvider();
const Contract = ethers.Contract;
// </hide>
//_hide: const tokenAddress = "0x6B175474E89094C44Da98b954EedeAC495271d0F"; /* DAI */
//_hide: const myAddress = "0x8ba1f109551bD432803012645Ac136ddd64DBA72";
//_hide: const otherAddress = "0xEA517D5a070e6705Cc5467858681Ed953d285Eb9";
//_hide: const provider = ethers.getDefaultProvider();
//_hide: const Contract = ethers.Contract;
const abi = [
abi = [
"event Transfer(address indexed src, address indexed dst, uint val)"
];
const contract = new Contract(tokenAddress, abi, provider);
contract = new Contract(tokenAddress, abi, provider);
// List all token transfers *from* myAddress
//_result:
contract.filters.Transfer(myAddress)
//!
//_log:
// List all token transfers *to* myAddress:
//_result:
contract.filters.Transfer(null, myAddress)
//!
//_log:
// List all token transfers *from* myAddress *to* otherAddress:
//_result:
contract.filters.Transfer(myAddress, otherAddress)
//!
//_log:
// List all token transfers *to* myAddress OR otherAddress:
//_result:
contract.filters.Transfer(null, [ myAddress, otherAddress ])
//!
//_log:
_subsection: Solidity Topics @<events-solidity>
This is a quick (and non-comprehensive) overview of how events are computed
in Solidity.
This is likely out of the scope for most developers, but may be interesting
to those who want to learn a bit more about the underlying technology.
Solidity provides two types of events, anonymous and non-anonymous. The
default is non-anonymous, and most developers will not need to worry about
anonymous events.
For non-anonymous events, up to 3 topics may be indexed (instead of 4), since
the first topic is reserved to specify the event signature. This allows
non-anonymous events to always be filtered by their event signature.
This topic hash is always in the first slot of the indexed data, and is
computed by normalizing the Event signature and taking the keccak256 hash
of it.
For anonymous events, up to 4 topics may be indexed, and there is no
signature topic hash, so the events cannot be filtered by the event
signature.
Each additional indexed property is processed depending on whether its
length is fixed or dynamic.
For fixed length types (e.g. ``uint``, ``bytes5``), all of which are
internally exactly 32 bytes (shorter types are padded with zeros;
numeric values are padded on the left, data values padded on the right),
these are included directly by their actual value, 32 bytes of data.
For dynamic types (e.g. ``string``, ``uint256[]``) , the value is hashed
using keccak256 and this hash is used.
Because dynamic types are hashed, there are important consequences in
parsing events that should be kept in mind. Mainly that the original
value is lost in the event. So, it is possible to tell is a topic is
equal to a given string, but if they do not match, there is no way
to determine what the value was.
If a developer requires that a string value is required to be both
able to be filtered and also able to be read, the value must be included
in the signature twice, once indexed and once non-indexed (e.g.
``someEvent(string indexed searchBy, string clearText)``).
For a more detailed description, please refer to the
[Solidity Event Documentation](link-solidity-events).
_heading: Other Things? TODO

View File

@@ -1,13 +1,14 @@
_section: Ethereum Basics
This is a very breif overview of some aspects of //Ethereum//
This is a brief overview of some aspects of //Ethereum//
and blockchains which developers can make use of or should
be aware of.
This section is fairly sparse at the moment, but will be expanded
This section is sparse at the moment, but will be expanded
as time goes on.
_toc:
events
gas
security
best-practices

View File

@@ -1,5 +1,82 @@
_section: Security @<security>
While security should be a concern for all developers, in the
blockchain space developers must be additionally conscious of
many areas which can be exploited.
Once a problem has an economic incentives to exploit it, there
is a much larger risk and with blockchain apps it can become
quite valuable to attack.
In addition to many of the other security issues app developers
may have to worry about, there are a few additional vectors
that JavaScript developers should be aware of.
_subsection: Side-Channel Attacks
A [Side-Channel Attack](link-wiki-side-channel-attack) occurs
when something orthogonal to the implementation of the algorithm
used can be exploited to learn more about secure or private
information.
_heading: Released Data (Strings, Uint8Arrays, Buffers)
In JavaScript, memory may not be securely allocated, or more
importantly securely released.
[Historically](https://github.com/nodejs/node/issues/4660),
``new Buffer(16)`` would re-use old memory that had been
released. This would mean that code running later, may have
access to data that was discarded.
As an example of the dangers, imagine if you had used a Buffer
to store a private key, signed data and then returned from the
function, allowing the Buffer to be de-allocated. A future
function may be able to request a new Buffer, which would still
have that left-over private key, which it could then use to
steal the funds from that account.
There are also many debugging tools and systems designed to
assist developers inspect the memory contents of JavaScript
programs. In these cases, any //private key// or //mnemonic//
sitting in memory may be visible to other users on the system,
or malicious scripts.
_heading: Timing Attack
Timing attacks allow a malicious user or script to determine
private data through analysing how long an operation requires
to execute.
In JavaScript, //Garbage Collection// occurs periodically when the
system determines it is required. Each JavaScript implementation
is different, with a variety of strategies and and abilities.
Most Garbage Collection requires "stopping the world", or pausing
all code being executed while it runs. This adds a large delay
to any code that was currently running.
This can be exploited by attackers to "condition cause a delay".
They will set up a scenario where the system is on the edge of
needing to garbage collect, and call your code with two paths,
a simple path and complex path. The simple path won't stir things
up enough to cause a garbage collection, while the complex one
will. By timing how long the code took to execute, they now know
whether garbage collection occured and therefore whether the simple
or complex path was taken.
Advanced timing attacks are very difficult to mitigate in any
garbage-collection-based language. Most libraries where this
matters will hopefully mitigate this for you as much as possible,
but it is still good to be aware of.
_heading: General Concerns
- [Cross-Site Scripting](link-wiki-xss)
- [Cross-Site Request Forgery](link-wiki-csrf)
- [Phishing](link-wiki-phishing)
_subsection: Key Derivation Functions @<security--pbkdf>
This is not specific to Ethereum, but is a useful technique
@@ -12,7 +89,7 @@ much stronger security.
The algorithm usually used for this process is [scrypt](link-wiki-scrypt),
which is a memory and CPU intensive algorithm which computes
a key (fixed-length psudo-random series of bytes) for a given
a key (fixed-length pseudo-random series of bytes) for a given
password.
@@ -21,7 +98,7 @@ _heading: Why does it take so long?
The goal is to use as much CPU and memory as possible during
this algorithm, so that a single computer can only compute a
very small number of results for some fixed amount of time. To
scale up an attack, the attacker requires additional compuers,
scale up an attack, the attacker requires additional computers,
increasing the cost to [brute-force attack](link-wiki-bruteforce)
to guess the password.
@@ -50,8 +127,8 @@ progress callback which will be periodically called with a number between
In general a progress bar makes the experience feel faster, as well as
more comfortable since there is a clear indication how much (relative) time
is remaining. Additionally, using language like //"decrpyting..."// in
a progress bar makes a user feel like there time is not being //needlessly//
is remaining. Additionally, using language like //"decrypting..."// in
a progress bar makes a user feel like their time is not being //needlessly//
wasted.
_heading: Work-Arounds (not recommended)

View File

@@ -43,6 +43,8 @@ function getDefinitions(source) {
if (depth === 3) {
add("var", node.name.escapedText, node.name.end);
}
} else if (ts.isGetAccessorDeclaration(node)) {
add("getter", (lastClass + "." + node.name.text), node.name.end);
}
ts.forEachChild(node, (node) => { return visit(node, depth + 1); });
}
@@ -54,7 +56,7 @@ function getDefinitions(source) {
const getSourceUrl = (function(path, include, exclude) {
console.log("Scanning TypeScript Sources...");
const Link = "https://github.com/ethers-io/ethers.js/blob/ethers-v5-beta/packages$FILENAME#L$LINE";
const Link = "https://github.com/ethers-io/ethers.js/blob/master/packages$FILENAME#L$LINE";
const Root = resolve(__dirname, path);
const readdir = function(path) {
@@ -115,10 +117,14 @@ const getSourceUrl = (function(path, include, exclude) {
}
})("../packages/", new RegExp("packages/.*/src.ts/.*\.ts$"), new RegExp("/node_modules/|src.ts/.*browser.*"));
let localSigner = null;
function codeContextify(context) {
const { inspect } = require("util");
const ethers = context.require("./packages/ethers");
if (localSigner == null) { localSigner = ethers.Wallet.createRandom(); }
context.ethers = ethers;
context.BigNumber = ethers.BigNumber;
context.constants = ethers.constants;
@@ -127,40 +133,88 @@ function codeContextify(context) {
context.hexlify = ethers.utils.hexlify;
context.hexValue = ethers.utils.hexValue;
context.Wallet = ethers.Wallet;
context.provider = new ethers.providers.InfuraProvider();
context.provider = new ethers.providers.InfuraProvider("mainnet", "49a0efa3aaee4fd99797bfa94d8ce2f1");
// We use a local dev node for some signing examples, but want to
// resolve ENS names against mainnet; super hacky but makes the
// docs nicer (funded in _startup)
context.localProvider = new ethers.providers.JsonRpcProvider();
context.localSigner = localSigner.connect(context.localProvider);
context.localProvider.resolveName = context.provider.resolveName.bind(context.provider);
context.BigNumber.prototype[inspect.custom] = function(depth, options) {
return `{ BigNumber: ${JSON.stringify(this.toString()) } }`;
}
context.createClass = function(name) {
let C = class{ }
Object.defineProperty(C, "name", { value: name })
return C;
}
context._inspect = function(value, depth) {
if (toString.call(value) === '[object Error]') {
// Not an error from ethers...
if (ethers.utils.Logger.errors[value.code] == null) {
return `Error: ${ value.message }`;
}
// Trim the ethers errors down on their verbosity for the docs...
if (value.message) {
value.message = value.message.split(" (")[0];
}
value.stack = undefined;
}
if (value && value.constructor && value.constructor.name === "Uint8Array") {
return `Uint8Array [ ${ Array.prototype.join.call(value, ", ") } ]`;
}
if (typeof(value) === "string" && value.indexOf("\n") >= 0) {
return "`" + value + "`";
}
//return JSON.stringify(value);
return inspect(value, {
compact: false,
depth: null,
breakLength: Infinity,
sorted: true,
});
}
context._startup = async function() {
console.log("Startup");
const signer = context.localProvider.getSigner();
const tx = await signer.sendTransaction({
to: localSigner.address,
value: ethers.utils.parseEther("10.0")
});
await tx.wait();
}
context._shutdown = function() {
console.log("Shutdown");
}
}
module.exports = {
title: "ethers",
subtitle: "v5.0-beta",
subtitle: "v5.4",
description: "Documentation for ethers, a complete, tiny and simple Ethereum library.",
logo: "logo.svg",
socialImage: "social.jpg",
prefix: "/v5",
link: "https:/\/docs-beta.ethers.io",
link: "https:/\/docs.ethers.io",
copyright: "The content of this site is licensed under the [Creative Commons License](https:/\/choosealicense.com/licenses/cc-by-4.0/). Generated on &$now;.",
markdown: {
"banner": "-----\n\nDocumentation: [html](https://docs-beta.ethers.io/)\n\n-----\n\n"
"banner": "-----\n\nDocumentation: [html](https://docs.ethers.io/)\n\n-----\n\n"
},
codeContextify: codeContextify,
@@ -170,23 +224,40 @@ module.exports = {
codeRoot: "../",
externalLinks: {
"link-mail": "mailto:me@ricmoo.com",
"link-alchemy": { name: "Alchemy", url: "https:/\/alchemyapi.io" },
"link-ankr": { name: "Ankr", url: "https:/\/www.ankr.com" },
"link-cloudflare": { name: "Cloudflare", url: "https:/\/developers.cloudflare.com/distributed-web/ethereum-gateway/" },
"link-ens": { name: "ENS", url: "https:/\/ens.domains/" },
"link-ethereum": { name: "Ethereum", url: "https:/\/ethereumorg" },
"link-etherscan": { name: "Etherscan", url: "https:/\/etherscan.io" },
"link-expo": { name: "Expo", url: "https:/\/expo.io" },
"link-etherscan-api": "https:/\/etherscan.io/apis",
"link-flatworm": { name: "Flatworm", url: "https:/\/github.com/ricmoo/flatworm" },
"link-geth": { name: "Geth", url: "https:/\/geth.ethereum.org" },
"link-infura": { name: "INFURA", url: "https:/\/infura.io" },
"link-javascriptcore": { name: "JavaScriptCore", url: "https:/\/developer.apple.com/documentation/javascriptcore?language=objc" },
"link-ledger": "https:/\/www.ledger.com",
"link-metamask": { name: "Metamask", url: "https:/\/metamask.io/" },
"link-metamask": { name: "MetaMask", url: "https:/\/metamask.io/" },
"link-otto": "https:/\/github.com/robertkrimen/otto",
"link-parity": { name: "Parity", url: "https:/\/www.parity.io" },
"link-pocket": { name: "Pocket Network", url: "https:/\/pokt.network" },
"link-react-native": { name: "React Native", url: "https:/\/reactnative.dev" },
"link-rtd": "https:/\/github.com/readthedocs/sphinx_rtd_theme",
"link-semver": { name: "semver", url: "https:/\/semver.org" },
"link-solidity": { name: "Solidity" , url: "https:/\/solidity.readthedocs.io/en/v0.6.2/" },
"link-solidity": { name: "Solidity" , url: "https:/\/solidity.readthedocs.io/" },
"link-solidity-errors": "https:/\/docs.soliditylang.org/en/v0.8.4/abi-spec.html#errors",
"link-solidity-events": "https:/\/docs.soliditylang.org/en/v0.8.4/abi-spec.html#events",
"link-sphinx": { name: "Sphinx", url: "https:/\/www.sphinx-doc.org/" },
"link-alchemy-signup": "https:/\/dashboard.alchemyapi.io/signup?referral=55a35117-028e-4b7c-9e47-e275ad0acc6d",
"link-ankr-public": "https:/\/www.ankr.com/protocol/public/",
"link-ankr-premium": "https:/\/www.ankr.com/protocol/plan/",
"link-etherscan-signup": "https:/\/etherscan.io/apis",
"link-etherscan-ratelimit": "https:/\/info.etherscan.com/api-return-errors/",
"link-infura-signup": "https:/\/infura.io/register",
"link-pocket-signup": "https:/\/pokt.network/pocket-gateway-ethereum-mainnet/",
"link-json-rpc": "https:/\/github.com/ethereum/wiki/wiki/JSON-RPC",
"link-web3-send": "https:/\/github.com/ethereum/web3.js/blob/1.x/packages/web3-providers-http/types/index.d.ts#L57",
"link-parity-trace": "https:/\/openethereum.github.io/wiki/JSONRPC-trace-module",
@@ -197,6 +268,11 @@ module.exports = {
"link-legacy-docs3": "https:/\/docs.ethers.io/v3/",
"link-legacy-docs4": "https:/\/docs.ethers.io/v4/",
"link-github-ci": "https:/\/github.com/ethers-io/ethers.js/actions/runs/158006903",
"link-github-issues": "https:/\/github.com/ethers-io/ethers.js/issues",
"link-issue-407": "https:/\/github.com/ethers-io/ethers.js/issues/407",
"link-infura-secret": "https:/\/infura.io/docs/gettingStarted/authentication",
"link-web3": "https:/\/github.com/ethereum/web3.js",
@@ -215,42 +291,60 @@ module.exports = {
"link-ethersio": "https:/\/ethers.io/",
"link-ethers-docs": "https:/\/docs.ethers.io/",
"link-ethers-js": "https:/\/cdn.ethers.io/lib/ethers-5.0.esm.min.js",
"link-ethers-js": "https:/\/cdn.ethers.io/lib/ethers-5.1.esm.min.js",
"link-ethers-npm": "https:/\/www.npmjs.com/search?q=%40ethersproject%2F",
"link-ethers-asm-grammar": "https:/\/github.com/ethers-io/ethers.js/blob/ethers-v5-beta/packages/asm/grammar.jison",
"link-ethers-asm-grammar": "https:/\/github.com/ethers-io/ethers.js/blob/master/packages/asm/grammar.jison",
"link-eip-155": { name: "EIP-155", url: "https:/\/eips.ethereum.org/EIPS/eip-155" },
"link-eip-191": { name: "EIP-191", url: "https:/\/eips.ethereum.org/EIPS/eip-191" },
"link-eip-609": { name: "EIP-609", url: "https:/\/eips.ethereum.org/EIPS/eip-609" },
"link-eip-634": { name: "EIP-634", url: "https:/\/eips.ethereum.org/EIPS/eip-634" },
"link-eip-712": { name: "EIP-712", url: "https:/\/eips.ethereum.org/EIPS/eip-712" },
"link-eip-1014": { name: "EIP-1014", url: "https:/\/eips.ethereum.org/EIPS/eip-1014" },
"link-eip-1193": { name: "EIP-1193", url: "https:/\/eips.ethereum.org/EIPS/eip-1193" },
"link-eip-1559": { name: "EIP-1559", url: "https:/\/eips.ethereum.org/EIPS/eip-1559" },
"link-eip-1577": { name: "EIP-1577", url: "https:/\/eips.ethereum.org/EIPS/eip-1577" },
"link-eip-2098": { name: "EIP-2098", url: "https:/\/eips.ethereum.org/EIPS/eip-2098" },
"link-eip-2304": { name: "EIP-2304", url: "https:/\/eips.ethereum.org/EIPS/eip-2304" },
"link-eip-2718": { name: "EIP-2718", url: "https:/\/eips.ethereum.org/EIPS/eip-2718" },
"link-eip-2930": { name: "EIP-2930", url: "https:/\/eips.ethereum.org/EIPS/eip-2930" },
"link-bip-39": { name: "BIP-39", url: "https:/\/en.bitcoin.it/wiki/BIP_0039" },
"link-bip-32": { name: "BIP-32", url: "https:/\/github.com/bitcoin/bips/blob/master/bip-0032.mediawiki" },
"link-bip-44": { name: "BIP-44", url: "https:/\/en.bitcoin.it/wiki/BIP_0044" },
"link-npm-elliptic": { name: "elliptic", url: "https:/\/www.npmjs.com/package/elliptic" },
"link-npm-ethersproject-shims": { name: "Shims", url: "https:/\/www.npmjs.com/package/@ethersproject/shims" },
"link-npm-events": { name: "EventEmitter", url: "https:/\/nodejs.org/dist/latest-v13.x/docs/api/events.html#events_class_eventemitter" },
"link-npm-bnjs": { name: "BN.js", url: "https:/\/www.npmjs.com/package/bn.js" },
"link-npm-query-bignumber": "https:/\/www.npmjs.com/search?q=bignumber",
"link-npm-react-native-get-random-values": { name: "React Native get-random-values", url: "https:/\/www.npmjs.com/package/react-native-get-random-values" },
"link-js-array": "https:/\/developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array",
"link-js-bigint": "https:/\/developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/BigInt",
"link-js-normalize": { name: "String.normalize", url: "https:/\/developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/normalize" },
"link-js-maxsafe": "https:/\/developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/MAX_SAFE_INTEGER#Description",
"link-js-proxy": "https:/\/developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy",
"link-js-typedarray": "https:/\/developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray",
"link-cors": { name: "CORS", url: "https:/\/developer.mozilla.org/en-US/docs/Web/HTTP/CORS" },
"link-ricmoo-humanreadableabi": "https:/\/blog.ricmoo.com/human-readable-contract-abis-in-ethers-js-141902f4d917",
"link-other-ethereum-dev-docs": "https:/\/ethereum.org/en/developers/docs/",
"link-wiki-basicauth": { name: "Basic Authentication", url: "https:/\/en.wikipedia.org/wiki/Basic_access_authentication" },
"link-wiki-backoff": { name: "Exponential Backoff", url: "https:/\/en.wikipedia.org/wiki/Exponential_backoff" },
"link-wiki-bloomfilter": { name: "Bloom Filter", url: "https:/\/en.wikipedia.org/wiki/Bloom_filter" },
"link-wiki-bruteforce": "https:/\/en.wikipedia.org/wiki/Brute-force_attack",
"link-wiki-cryptographichash": "https:/\/en.wikipedia.org/wiki/Cryptographic_hash_function",
"link-wiki-csrf": "https:/\/en.wikipedia.org/wiki/Cross-site_request_forgery",
"link-wiki-ecrecover": { name: "ECDSA Public Key Recovery", url: "https:/\/en.wikipedia.org/wiki/Elliptic_Curve_Digital_Signature_Algorithm#Public_key_recovery" },
"link-wiki-homoglyph": "https:/\/en.wikipedia.org/wiki/IDN_homograph_attack",
"link-wiki-hmac": "https:/\/en.wikipedia.org/wiki/HMAC",
"link-wiki-iban": "https:/\/en.wikipedia.org/wiki/International_Bank_Account_Number",
"link-wiki-ieee754": "https:/\/en.wikipedia.org/wiki/Double-precision_floating-point_format",
"link-wiki-observer-pattern": { name: "Observer Pattern", url: "https:/\/en.wikipedia.org/wiki/Observer_pattern" },
"link-wiki-phishing": "https:/\/en.wikipedia.org/wiki/Phishing",
"link-wiki-ripemd": "https:/\/en.m.wikipedia.org/wiki/RIPEMD",
"link-wiki-sha2": "https:/\/en.wikipedia.org/wiki/SHA-2",
"link-wiki-twoscomplement": "https:/\/en.wikipedia.org/wiki/Two%27s_complement",
@@ -258,9 +352,11 @@ module.exports = {
"link-wiki-utf8-overlong": "https:/\/en.wikipedia.org/wiki/UTF-8#Overlong_encodings",
"link-wiki-utf8-replacement": "https:/\/en.wikipedia.org/wiki/Specials_%28Unicode_block%29#Replacement_character",
"link-wiki-scrypt": "https:/\/en.wikipedia.org/wiki/Scrypt",
"link-wiki-side-channel-attack": "https:/\/en.wikipedia.org/wiki/Side-channel_attack",
"link-wiki-sha3": "https:/\/en.wikipedia.org/wiki/SHA-3",
"link-wiki-shuffle": { name: "Fisher-Yates Shuffle", url: "https:/\/en.wikipedia.org/wiki/Fisher-Yates_shuffle" },
"link-wiki-overflow": { name: "overflow", url: "https:/\/en.wikipedia.org/wiki/Integer_overflow" },
"link-wiki-underflow": { name: "arithmetic underflow", url: "https:/\/en.wikipedia.org/wiki/Arithmetic_underflow" },
"link-wiki-xss": "https:/\/en.wikipedia.org/wiki/Cross-site_scripting",
},
};

View File

@@ -1,4 +1,4 @@
_section: Contributing and Hacking
_section: Contributing and Hacking @<contributing>
The ethers.js library is something that I've written out of necessity,
and has grown somewhat organically over time.
@@ -7,7 +7,7 @@ Many things are the way they are for good (at the time, at least) reasons,
but I always welcome criticism, and am completely willing to have my mind
changed on things.
So, pull requests are always welcome, but please keep a few points in mind:
Pull requests are always welcome, but please keep a few points in mind:
- Backwards-compatibility-breaking changes will not be accepted; they may be
considered for the next major version
@@ -15,60 +15,209 @@ So, pull requests are always welcome, but please keep a few points in mind:
arguments as to why
- The library aims to be lean, so keep an eye on the dist/ethers.min.js
file size before and after your changes
- Keep the PR simple and readable; only modify files in the ``docs.wrm/``
and ``packages/*/src.ts/`` folders, as this allows the changes to be easily
verified
- Add test cases for both expected and unexpected input
- Any new features need to be supported by me (future issues, documentation,
testing, migration), so anything that is overly complicated or specific
may not be accepted
In general, **please start an issue //before// beginning a pull request**, so we can
have a public discussion and figure out the best way to address to problem/feature.
have a public discussion and figure out the best way to address the problem/feature.
**:)**
_subsection: Building
_subsection: Building @<contributing--building>
If you wish to modify the source code, there are a few steps involved in setting up
your environment.
The build process for ethers is unfortunatly not super trivial, but
I have attempted to make it as straightforward as possible.
_code: Preparing the Package @lang<shell>
It is a mono-repo which attempts to be compatibile with a large
number of environments, build tools and platforms, which is why
there are a some weird things it must do.
There are several custom scripts in the ``misc/admin`` folder
to help manage the monorepo. Developers working on contributing
to ethers should not generally need to worry about those, since
they are wrapped up behind ``npm run SCRIPT`` operations.
_code: Installing @lang<shell>
# Clone the repository
/home/ricmoo> git clone https://github.com/ethers-io/ethers.js.git
# Clone the REPO
/home/ricmoo> git clone git@github.com:ethers-io/ethers.js.git
/home/ricmoo> cd ethers.js
# Install the base dependencies
# Install all dependencies:
# - Hoists all sub-package dependencies in the package.json (preinstall)
# - Installs all the (hoisted) dependencies and devDependencies (install)
# - Build the rat-nests (in .package_node_modules) (postinstall)
# - Create a dependency graph for the TypeScript (postinstall)
# - Link the rat-nets into each project (postinstall)
/home/ricmoo/ethers.js> npm install
# Install each module's dependencies and link the libraries
# internally, so they reference each other
/home/ricmoo/ethers.js> npm run bootstrap
_heading: Making Changes @<contributing--updating>
Once your environment is set up, you should be able to simply
start the ``auto-build`` feature, and make changes to the
TypeScript source.
_code: Watching and Building @lang<shell>
# Begin watching the files and re-building whenever they change
/home/ricmoo/ethers.js> npm run auto-build
# Or if you do not want to watch and just build
/home/ricmoo/ethers.js> npm run build
# Sometimes the issue only affects the ESM modules
/home/ricmoo/ethers.js> npm run auto-build-esm
_heading: Creating Browser-Ready Files
To create files for use directly in a browser, the distribution
files (located in ``packages/ethers/dist``) need to be built
which requires several intermediate builds, scripts and for
various rollup scripts to execute.
# Or if you only need to run a single build
/home/ricmoo/ethers.js> npm run _build-cjs
/home/ricmoo/ethers.js> npm run _build-esm
_code: Building Distribution Files @lang<shell>
# If you need to rebuild all the libs (esm + cjs) and dist files
# Note: this requires node 10 or newer
/home/ricmoo/ethers.js> npm run build-all
_heading: Testing
_code: Testing @lang<shell>
# Rebuilds all files and bundles testcases up for testing
# Rebuilds all files (npm run build-all) and bundles testcases up for testing
/home/ricmoo/ethers.js> npm test
# Often you don't need the full CI experience
/home/ricmoo/ethers.js> npm run _test-node
/home/ricmoo/ethers.js> npm run test-node
_heading: Distribution
Most developers should not ever require this step, but for people
forking ethers and creating alternates (for example if you have
a non-EVM compatible chain but are trying to reuse this package).
This script will rebuild the entire ethers project, compare it
against npm, re-write package versions, update internal hashes,
re-write various TypeScript files (to get around some ES+TS
limitations for Tree Shaking and linking), re-write map files,
bundle stripped versions of dependencies and basically just a
whole bunch of stuff.
If you use this and get stuck, [message me](link-mail).
_code: Preparing the Distribution @lang<shell>
# Prepare all the distribution files
# - Remove all generated files (i.e. npm run clean)
# - Re-install all dependencies, hoisting, etc. (npm install)
# - Spell check all strings in every TypeScript files
# - Build everything from scratch with this clean install
# - Compare local with npm, bumping the version if changed
# - Build everything again (with the updated versions)
# - Update the CHANGELOG.md with the git history since the last change
/home/ricmoo/ethers.js> npm run update-version
_note: Do NOT check in dist files in a PR
For Pull Requests, please ONLY commit files in the ``docs.wrm/`` and
``packages/*/src.ts/`` folders. I will prepare the distribution builds
myself and keeping the PR relevant makes it easier to verify the changes.
_heading: Publishing
Again, this should not be necessary for most developers. This step
requires using the ``misc/admin/cmds/config-set`` script for a number
of values, including private keys, NPM session keys, AWS access keys,
GitHub API tokens, etc.
The config file is encrypted with about 30 seconds of scrypt password-based
key derivation function, so brute-forcing the file is quite expensive.
The config file also contains a plain-text mnemonic. This is a money-pot.
Place a tempting amount of ether or Bitcoin on this account and set up an
e-mail alert for this account.
If any attacker happens across your encrypted config, they will have instant
access to the plain-text mnemonic, so they have the option to immediately
steal the ether (i.e. the responsible-disclosure bond).
If you ever see this ether taken, your encrypted file is compromised! Rotate
all your AWS keys, NPM session keys, etc. immedately.
@TODO: document all the keys that need to be set for each step
_code: Preparing the Distribution @lang<shell>
# Publish
# - Update any changed packages to NPM
# - Create a release on GitHub with the latest CHANGELOG.md description
# - Upload the bundled files the the CDN
# - Flush the CDN edge caches
/home/ricmoo/ethers.js> npm run publish-all
_subsection: Documentation @<contributing--documentation>
The documents are generated using [Flatworm](flatworm) documentation
generation tool, which was written for the purpose of writing the documentation
for ethers.
Style Guide (this section will have much more coming):
- Try to keep lines no longer than //around// 80 characters
- Avoid inline links in the source; use the ``externalLinks`` field in the config.js
- Prefix external links with ``link-``
- Changing an anchor name must be well justified, as it will break all existing links
to that section; flatworm will support symlinks in the future
- In general, I aim for consistency; look to similar situations throughout the documentation
_heading: Building
To build the documentation, you should first follow the
[above steps](contributing--building) to build the ethers library.
Building the docs will generate several types of output:
- A full set of HTML pages, linking across each other
- A single one-page HTML page with all pages linking to local anchors
- A full set of README.md pages organized to be browsable and linkable in GitHub
- A metadata dump for tool ingestion (still needs more work)
- (@TODO; only half done) The documentation as a LaTeX and generated PDF
_code: Building the Documentations @lang<shell>
/home/ricmoo/ethers.js> npm run build-docs
_heading: Evaluation
When building the documentation, all code samples are run through a JavaScript
VM to ensure there are no typos in the example code, as well the exact output
of results are injected into the output, so there is no need to keep the results
and code in-sync.
However, this can be a bit of a headache when making many small changes, so to
build the documentation faster, you can skip the evaluation step, which will
inject the code directly.
_code: Build docs skipping evaluation @lang<shell>
/home/ricmoo/ethers.js> npm run build-docs -- --skip-eval
_heading: Previewing Changes
To preview the changes locally, you can use any standard web server and run
from the ``/docs/`` folder, or use the built-in web server.
The same caveats as normal web development apply, such flushing browser
caches after changing (and re-building) the docs.
_code: Running a webserver @lang<shell>
/home/ricmoo/ethers.js> npm run serve-docs

View File

@@ -1,5 +1,10 @@
_section: Cookbook
Cooking...
A collection (that will grow over time) of common, simple
snippets of code that are in general useful.
_toc:
react-native
transactions

View File

@@ -0,0 +1,60 @@
_section: React Native (and ilk) @<cookbook-reactnative>
The [[link-react-native]] framework has become quite popular and
has many popular forks, such as [[link-expo]].
React Native is based on [[link-javascriptcore]] (part of WebKit) and
does not use Node.js or the common Web and DOM APIs. As such,
there are many operations missing that a normal web environment
or Node.js instance would provide.
For this reason, there is a [[link-npm-ethersproject-shims]] module
provided to fill in the holes.
_subsection: Installing @<cookbook-reactnative-shims>
To use ethers in React Native, you must either provide shims for the needed
missing functionality, or use the ethers.js shim.
It is **HIGHLY RECOMMENDED** you check out the [security section](cookbook-reactnative-security)
below for instructions on installing packages which can affect the security
of your application.
After installing packages, you may need to restart your packager and company.
_code: Installing @lang<shell>
/home/ricmoo/my-react-project> npm install @ethersproject/shims --save
_code: Importing @lang<script>
// Pull in the shims (BEFORE importing ethers)
import "@ethersproject/shims"
// Import the ethers library
import { ethers } from "ethers";
_subsection: Security @<cookbook-reactnative-security>
The React Native environment does not contain a secure random source, which
is used when computing random private keys. This could result in private
keys that others could possibly guess, allowing funds to be stolen and assets
manipulated.
For this reason, it is **HIGHLY RECOMMENDED** to also install the
[[link-npm-react-native-get-random-values]], which **must** be included
before the shims. If it worked correctly you should not receive any
warning in the console regarding missing secure random sources.
_code: Importing with Secure Random Sources @lang<script>
// Import the crypto getRandomValues shim (**BEFORE** the shims)
import "react-native-get-random-values"
// Import the the ethers shims (**BEFORE** ethers)
import "@ethersproject/shims"
// Import the ethers library
import { ethers } from "ethers";

View File

@@ -0,0 +1,24 @@
_section: Transactions @<cookbook--transactions>
_subsection: Compute the raw transaction @<cookbook--compute-raw-transaction>
_code: @lang<javascript>
function getRawTransaction(tx) {
function addKey(accum, key) {
if (tx[key]) { accum[key] = tx[key]; }
return accum;
}
// Extract the relevant parts of the transaction and signature
const txFields = "accessList chainId data gasPrice gasLimit maxFeePerGas maxPriorityFeePerGas nonce to type value".split(" ");
const sigFields = "v r s".split(" ");
// Seriailze the signed transaction
const raw = utils.serializeTransaction(txFields.reduce(addKey, { }), sigFields.reduce(addKey, { }));
// Double check things went well
if (utils.keccak256(raw) !== tx.hash) { throw new Error("serializing failed!"); }
return raw;
}

View File

@@ -1,4 +1,4 @@
_section: Flatworm Docs
_section: Flatworm Docs @<flatworm>
The //Flatworm Docs// rendering engine is designed to be **very**
simple, but provide enough formatting necessary for documenting
@@ -102,7 +102,7 @@ _definition: **_table:** //FOOTER//
Creates a [Table](flatworm--table) structured according to the body.
Each cell support and variables support markdown.
Each cell contents supports markdown and variables supports markdown.
**Extensions:** [@style](flatworm--ext-style)
@@ -173,7 +173,8 @@ This is placed in an orange box.
\_null:
This breaks out of a directive. For example, to end a
This breaks out of a directive. For example, to end
a ``_note:`` or ``_code:``.
_subsection: Markdown @<flatworm-markdown>
@@ -218,58 +219,64 @@ for displaying code samples.
_heading: JavaScript Evaluation @<flatworm--code-eval>
For JavaScript files, the file is executed with some simple substitution.
For JavaScript files, the file is transpiled and executed in a VM,
allowiung output (or exceptions) of blocks to be included in the
fragment output.
A bare ``\/\/!`` on a line is replaced with the result of the last
statement. Building will fail if an error is thrown.
The entire **code fragment** source is included in an async IIFE,
whick means ``await`` is allowed, and several special comment
directives are allowed.
A bare ``\/\/!error`` is replaced with the throw error. Building will
fail if an error is not thrown.
A ``/\/_hide:`` will include any following code directly into the
output, but will not include it in the generated output for the fragment.
Also any code included between the lines **``\/\/ <hide>``** and
**``\/\/ </hide>``** will be omitted from the output, which can be used
to setup variables.
A ``/\/_log:`` will include the value of any following expression in the
output, prefixed with a ``/\/ ``. Renderers will mark output in different
style if possible.
A ``/\/_result:`` will begin a block, assigning the contents to ``_``. The
block can be ended with a ``/\/_log:`` or ``/\/_null:``, if no value is given
to log, then ``_`` is assumed. If an error occurs, generation fails.
A ``/\/_throws:`` will begin a block, which is expected to throw assigning
the error to ``_``. The block can be ended with a ``/\/_log:`` or ``/\/_null:``,
if no value is given to log, then ``_`` is assumed. If an error do not occur,
generation fails.
_code: Code Evaluation Example @lang<text>
\_code: Result of Code Example @lang<javascript>
// <hide>
const url = require("url");
// </hide>
//_hide: const url = require("url");
//_result:
url.parse("https://www.ricmoo.com/").protocol
//!
//_log:
//_throws:
url.parse(45)
//! error
//_log:
// You want to assign (doesn't emit eval) AND display the value
const foo = 4 + 5;
// <hide>
foo
// </hide>
//!
//_log: foo
_code: Result of Code Example @lang<javascript>
// <hide>
const url = require("url");
// </hide>
//_hide: const url = require("url");
//_result:
url.parse("https://www.ricmoo.com/").protocol
//!
//_log:
//_throws:
url.parse(45)
//! error
//_log:
// You want to assign (doesn't emit eval) AND display the value
const foo = 4 + 5;
// <hide>
foo
// </hide>
//!
//_log: foo
_heading: Languages
@@ -279,7 +286,7 @@ The language can be specified using the [@lang extension](flatworm--ext-lang).
_table:
| **Language** | **Notes** |
| javascript | Syntax highlights and [evaluates](flatworm--code-eval) the JavaScipt |
| javascript | Syntax highlights and [evaluates](flatworm--code-eval) the JavaScript |
| script | Same as ``javascript``, but does not evaluate the results |
| shell | Shell scripts or command-line |
| text | Plain text with no syntax highlighting |
@@ -378,8 +385,8 @@ _heading: Variables @<flatworm--table-variable>
Often the layout of a table is easier to express and maintain without
uneven or changing content within it. So the content can be defined
separately within a table directive using **variables**. A varaible
name must being with a letter and must only contain letters and numbers.
separately within a table directive using **variables**. A variable
name must begin with a letter and must only contain letters and numbers.
Variables are also useful when content is repeated throughout a table.

BIN
docs.wrm/favicon.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

View File

@@ -3,14 +3,14 @@ _section: Getting Started @<getting-started>
_subsection: Installing @<installing>
The various Classes and Functions are available to be imported
Ethers' various Classes and Functions are available to import
manually from sub-packages under the [@ethersproject](link-ethers-npm)
organization but for most projects, the umbrella package is the
easiest way to get started.
_code: @lang<shell>
/home/ricmoo> npm install --save ethers@next
/home/ricmoo> npm install --save ethers
_subsection: Importing @<importing>
@@ -32,20 +32,22 @@ It is generally better practice (for security reasons) to copy the
[ethers library](link-ethers-js) to your own webserver and serve it
yourself.
For quick demos or prototyping though, it can be loaded in your
For quick demos or prototyping though, you can load it in your
Web Applications from our CDN.
_code: ES6 in the Browser @lang<html>
<script src="https://cdn.ethers.io/lib/ethers-5.0.esm.min.js"
type="application/javascipt"></script>
<script type="module">
import { ethers } from "https://cdn.ethers.io/lib/ethers-5.2.esm.min.js";
// Your code here...
</script>
_code: ES3 (UMD) in the Browser @lang<html>
<script src="https://cdn.ethers.io/lib/ethers-5.0.umd.min.js"
type="application/javascipt"></script>
<script src="https://cdn.ethers.io/lib/ethers-5.2.umd.min.js"
type="application/javascript"></script>
_subsection: Common Terminology @<getting-started--glossary>
@@ -62,8 +64,8 @@ $Signer: A Signer is a class which (usually) in some way directly or
and transactions to authorize the network to charge your account
ether to perform operations.
$Contract: A Contract is an abstraction which represents a connection to a
specific contract on the Ethereum Network, so that it can be
used like a normal JavaScipt object.
specific contract on the Ethereum Network, so that applications
can use it like a normal JavaScript object.
| **Provider** | $Provider |
@@ -71,52 +73,79 @@ $Contract: A Contract is an abstraction which represents a connection to a
| **Contract** | $Contract |
_subsection: Connecting to Ethereum: Metamask @<getting-started--connecting>
_subsection: Connecting to Ethereum: MetaMask @<getting-started--connecting>
The quickest and easiest way to experiment and begin developing on
Ethereum is to use [[link-metamask]], which is a browser extension
that provides:
- A connection to the Ethereum network (a [[Provider]])
- Holds your private key and can sign thing (a [[Signer]])
- Holds your private key and can sign things (a [[Signer]])
_code: Connecting to Metamask @lang<script>
_code: Connecting to MetaMask @lang<script>
// A Web3Provider wraps a standard Web3 provider, which is
// what Metamask injects as window.ethereum into each page
// what MetaMask injects as window.ethereum into each page
const provider = new ethers.providers.Web3Provider(window.ethereum)
// The Metamask plugin also allows signing transactions to
// MetaMask requires requesting permission to connect users accounts
await provider.send("eth_requestAccounts", []);
// The MetaMask plugin also allows signing transactions to
// send ether and pay to change state within the blockchain.
// For this, you need the account signer...
const signer = provider.getSigner()
_subsection: Connecting to Ethereum: RPC @<getting-started--connecting-rpc>
The [JSON-RPC API](link-jsonrpc) is another popular method for interacting
with Ethereum and is available in all major Ethereum node implementations
(e.g. [[link-geth]] and [[link-parity]]) as well as many
third-party web services (e.g. [[link-infura]]). It typically provides:
- A connection to the Ethereum network (a [[Provider]])
- Holds your private key and can sign things (a [[Signer]])
_code: Connecting to an RPC client @lang<script>
// If you don't specify a //url//, Ethers connects to the default
// (i.e. ``http:/\/localhost:8545``)
const provider = new ethers.providers.JsonRpcProvider();
// The provider also allows signing transactions to
// send ether and pay to change state within the blockchain.
// For this, we need the account signer...
const signer = provider.getSigner()
_heading: Querying the Blockchain @<getting-started--querying>
Once you have a [[Provider]], you have a read-only connection to the
blockchain, which can be used to query the current state, fetch historic
blockchain, which you can use to query the current state, fetch historic
logs, look up deployed code and so on.
_code: Basic Queries @lang<javascript>
// Look up the current block number
provider.getBlockNumber()
//!
//_result:
await provider.getBlockNumber()
//_log:
// Get the balance of an account (by address or ENS name)
// Get the balance of an account (by address or ENS name, if supported by network)
//_result:
balance = await provider.getBalance("ethers.eth")
//! async balance
//_log:
// Often you will need to format the output for the user
// which prefer to see values in ether (instead of wei)
// Often you need to format the output to something more user-friendly,
// such as in ether (instead of wei)
//_result:
ethers.utils.formatEther(balance)
//!
//_log:
// Or if a user enters a string in an input field, you may need
// If a user enters a string in an input field, you may need
// to convert it from ether (as a string) to wei (as a BigNumber)
//_result:
ethers.utils.parseEther("1.0")
//!
//_log:
_heading: Writing to the Blockchain @<getting-started--sending>
@@ -136,37 +165,36 @@ A Contract is an abstraction of program code which lives on the
Ethereum blockchain.
The [[Contract]] object makes it easier to use an on-chain
Contract as a normal JavaScript object, with the method all
Contract as a normal JavaScript object, with the methods
mapped to encoding and decoding data for you.
If you are familiar with Databases, this is similar to ORM.
If you are familiar with Databases, this is similar to an //Object Relational Mapper// (ORM).
In order to communicate with the Contract on-chain, this class
needs to know what methods are available and how to encode and
decode the data, which is what the //Application Binary Interface// (API)
decode the data, which is what the //Application Binary Interface// (ABI)
provides.
This class is a meta-class, which means its methods are constructed
at runtime, when you pass in the ABI to the constructor it uses that
This class is a //meta-class//, which means its methods are constructed
at runtime, and when you pass in the ABI to the constructor it uses it
to determine which methods to add.
While a on-chain Contract may have many methods available, you can safely ignore
While an on-chain Contract may have many methods available, you can safely ignore
any methods you don't need or use, providing a smaller subset of the ABI to
the contract.
An ABI often comes from the Solidity or Vyper compiler, but may also be
placed in the code easily using the Human-Readable ABI, which the following
examples use.
An ABI often comes from the Solidity or Vyper compiler, but you can use the
Human-Readable ABI in code, which the following examples use.
_code: Connecting to the DAI Contract @lang<javascript>
// We can use an ENS name for the contract address
// You can also use an ENS name for the contract address
const daiAddress = "dai.tokens.ethers.eth";
// The ERC-20 Contract ABI, which is a common contract interface
// for tokens (this is the Human-Readable ABI format)
const daiAbi = [
// Some simple details about the token
// Some details about the token
"function name() view returns (string)",
"function symbol() view returns (string)",
@@ -183,38 +211,33 @@ const daiAbi = [
// The Contract object
const daiContract = new ethers.Contract(daiAddress, daiAbi, provider);
//_hide: _page.daiAbi = daiAbi;
//_hide: _page.daiContract = daiContract;
_heading: Read-Only Methods @<getting-started--reading>
_code: Querying the DAI Contract @lang<javascript>
// <hide>
const daiAbi = [
// Some simple details about the token
"function name() view returns (string)",
"function symbol() view returns (string)",
// Get the account balance
"function balanceOf(address) view returns (uint)",
];
const daiContract = new ethers.Contract("dai.tokens.ethers.eth", daiAbi, provider);
// </hide>
//_hide: const daiContract = _page.daiContract;
// Get the ERC-20 token name
daiContract.name()
//!
//_result:
await daiContract.name()
//_log:
// Get the ERC-20 token synbol (for tickers and UIs)
daiContract.symbol()
//!
// Get the ERC-20 token symbol (for tickers and UIs)
//_result:
await daiContract.symbol()
//_log:
// Get the balance of an address
balance = await daiContract.balanceOf("ricmoo.firefly.eth")
//! async balance
//_log: balance
// Format the DAI for displaying to the user
//_result:
ethers.utils.formatUnits(balance, 18)
//!
//_log:
_heading: State Changing Methods @<getting-started--writing>
@@ -222,8 +245,8 @@ _heading: State Changing Methods @<getting-started--writing>
_code: Sending DAI @lang<script>
// The DAI Contract is currently connected to the Provider,
// which is read-only. We need to connect to a Signer, so
// that we can pay to send state-changing transactions.
// which is read-only. You need to connect to a Signer, so
// that you can pay to send state-changing transactions.
const daiWithSigner = contract.connect(signer);
// Each DAI has 18 decimal places
@@ -237,13 +260,8 @@ _heading: Listening to Events @<getting-started--events>
_code: Listening to Events @lang<javascript>
// <hide>
const daiAbi = [
"event Transfer(address indexed, address indexed, uint256)"
];
const daiContract = new ethers.Contract("dai.tokens.ethers.eth", daiAbi, provider);
const formatEther = ethers.utils.formatEther;
// </hide>
//_hide: const daiContract = _page.daiContract;
//_hide: const formatEther = ethers.utils.formatEther;
// Receive an event when ANY transfer occurs
daiContract.on("Transfer", (from, to, amount, event) => {
@@ -256,10 +274,7 @@ daiContract.on("Transfer", (from, to, amount, event) => {
// A filter for when a specific address receives tokens
myAddress = "0x8ba1f109551bD432803012645Ac136ddd64DBA72";
filter = daiContract.filters.Transfer(null, myAddress)
// <hide>
filter
// </hide>
//!
//_log: filter
// Receive an event when that filter occurs
daiContract.on(filter, (from, to, amount, event) => {
@@ -267,73 +282,55 @@ daiContract.on(filter, (from, to, amount, event) => {
console.log(`I got ${ formatEther(amount) } from ${ from }.`);
});
// <hide>
// Don't want to block the docs from compiling...
daiContract.removeAllListeners();
// </hide>
//_hide: daiContract.removeAllListeners(); /* Don't want to block the docs from compiling... */
_heading: Query Historic Events @<getting-started--history>
_code: Filtering Historic Events @lang<javascript>
// <hide>
const signer = new ethers.VoidSigner("0x8ba1f109551bD432803012645Ac136ddd64DBA72");
const daiAbi = [
"event Transfer(address indexed, address indexed, uint256)"
];
const daiContract = new ethers.Contract("dai.tokens.ethers.eth", daiAbi, provider);
//!
// </hide>
//_hide: const signer = new ethers.VoidSigner("0x8ba1f109551bD432803012645Ac136ddd64DBA72");
//_hide: const daiContract = _page.daiContract;
// Get the address of the Signer
myAddress = await signer.getAddress()
//! async myAddress
// Filter for all token transfers to me
filterFrom = daiContract.filters.Transfer(myAddress, null);
// <hide>
filterFrom
// </hide>
//!
//_log: myAddress
// Filter for all token transfers from me
filterTo = daiContract.filters.Transfer(null, myAddress);
// <hide>
filterTo
// </hide>
//!
filterFrom = daiContract.filters.Transfer(myAddress, null);
//_log: filterFrom
// List all transfers sent from me a specific block range
daiContract.queryFilter(filterFrom, 9843470, 9843480)
//!
// Filter for all token transfers to me
filterTo = daiContract.filters.Transfer(null, myAddress);
//_log: filterTo
// List all transfers sent from me in a specific block range
//_result:
await daiContract.queryFilter(filterFrom, 9843470, 9843480)
//_log:
//
// The following have had the results omitted due to the
// number of entries; but they provide some useful examples
//
// List all transfers I sent in the last 10,000 blocks
daiContract.queryFilter(filterFrom, -10000)
// List all transfers sent in the last 10,000 blocks
await daiContract.queryFilter(filterFrom, -10000)
// List all transfers ever sent to me
daiContract.queryFilter(filterTo)
await daiContract.queryFilter(filterTo)
_subsection: Signing Messages @<getting-started--signing>
_code: Signing Messages @lang<javascript>
// <hide>
const signer = ethers.Wallet.createRandom();
//!
// </hide>
//_hide: const signer = ethers.Wallet.createRandom();
// To sign a simple string, which can often be used for
// logging into a service, such as CryptoKitties simply
// To sign a simple string, which are used for
// logging into a service, such as CryptoKitties,
// pass the string in.
signature = await signer.signMessage("Hello World");
//! async signature
//_log: signature
//
// A common case is also signing a hash, which is 32
@@ -341,13 +338,13 @@ signature = await signer.signMessage("Hello World");
// data it MUST be an Array (or TypedArray)
//
// This string is 66 chacacters long
// This string is 66 characters long
message = "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef"
// This array representation is 32 bytes long
messageBytes = ethers.utils.arrayify(message);
//!
//_log: messageBytes
// To sign a hash, you most often want to sign the bytes
signature = await signer.signMessage(messageBytes)
//! async signature
//_log: signature

View File

@@ -5,7 +5,7 @@ _subsection: What is Ethers? @<preamble>
The ethers.js library aims to be a complete and compact library for
interacting with the Ethereum Blockchain and its ecosystem. It was
originally designed for use with [ethers.io](link-ethersio) and
has since expanded into a much more general-purpose library.
has since expanded into a more general-purpose library.
_subsection: Features @<features>
@@ -38,12 +38,14 @@ _toc:
getting-started
concepts
api-keys
api
cli
cookbook
migration
testing
contributing
other-resources
documentation
license

View File

@@ -7,7 +7,7 @@ of uses.
_heading: MIT License
//Copyright &copy; 2019 [Richard Moore](mailto:me@ricmoo.com).//
//Copyright &copy; 2019-2021 [Richard Moore](mailto:me@ricmoo.com).//
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal

View File

@@ -1,5 +1,16 @@
_section: Migration: From Ethers v4 @<migration-v4>
This document only covers the features present in v4 which have changed
in some important way in v5.
It does not cover all the new additional features that have been added and
mainly aims to help those updating their older scripts and applications to
retain functional parity.
If you encounter any missing changes, please let me know and I'll update this
guide.
_subsection: BigNumber
_heading: Namespace
@@ -18,6 +29,7 @@ ethers.BigNumberish
_heading: Creating Instances
The ``bigNumberify`` method was always preferred over the constructor
since it could short-circuit an object instantiation for [[BigNumber]
objects (since they are immutable). This has been moved to a static
@@ -37,9 +49,99 @@ ethers.BigNumber.from(someValue)
_subsection: Contracts
_code: @lang<script>
_heading: ENS Name Resolution
// @TODO
The name of the resolved address has changed. If the address passed into the
constructor was an ENS name, the address will be resolved before any calls
are made to the contract.
The name of the property where the resolved address has changed from ``addressPromise``
to ``resolvedAddress``.
_code: Resolved ENS Names @lang<script>
// v4
contract.addressPromise
// v5
contract.resolvedAddress
_heading: Gas Estimation
The only difference in gas estimation is that the bucket has changed
its name from ``estimate`` to ``estimateGas``.
_code: Gas Estimation @lang<script>
// v4
contract.estimate.transfer(toAddress, amount)
// v5
contract.estimateGas.transfer(toAddress, amount)
_heading: Functions
In a contract in ethers, there is a ``functions`` bucket, which exposes
all the methods of a contract.
All these functions are available on the root contract itself as well
and historically there was no difference between ``contact.foo`` and
``contract.functions.foo``. The original reason for the ``functions`` bucket
was to help when there were method names that collided with other buckets,
which is rare.
In v5, the ``functions`` bucket is now intended to help with frameworks and
for the new error recovery API, so most users should use the methods on the
root contract.
The main difference will occur when a contract method only returns a single
item. The root method will dereference this automatically while the ``functions``
bucket will preserve it as an [[Result]].
If a method returns multiple items, there is no difference.
This helps when creating a framework, since the result will always be known to
have the same number of components as the [[Fragment]] outputs, without having
to handle the special case of a single return value.
_code: Functions Bucket @lang<script>
const abi = [
// Returns a single value
"function single() view returns (uint8)",
// Returns two values
"function double() view returns (uint8, uint8)",
];
// v4
await contract.single()
// 123
await contract.functions.single()
// 123
// v5 (notice the change in the .function variant)
await contract.single()
// 123
await contract.functions.single()
// [ 123 ]
// v4
await contract.double()
// [ 123, 5 ]
await contract.functions.double()
// [ 123, 5 ]
// v5 (no difference from v4)
await contract.double()
// [ 123, 5 ]
await contract.functions.double()
// [ 123, 5 ]
_subsection: Errors
@@ -49,7 +151,7 @@ All errors now belong to the [[Logger]] class and the related functions
have been moved to [[Logger]] instances, which can include a per-package
version string.
Global error fucntions have been moved [[Logger]] class methods.
Global error functions have been moved to [[Logger]] class methods.
_code: @lang<script>
@@ -84,6 +186,7 @@ logger.info(...)
_subsection: Interface
The [[Interface]] object has undergone the most dramatic changes.
It is no longer a meta-class and now has methods that simplify handling
@@ -99,14 +202,14 @@ interface.functions.transfer.encode(to, amount)
interface.functions.transfer.decode(callData)
// v5
interface.encodeData("transfer", [ to, amount ])
interface.decodeResult("transfer", data)
interface.encodeFunctionData("transfer", [ to, amount ])
interface.decodeFunctionResult("transfer", data)
// Or you can use any compatible signature or Fragment objects.
// Notice that signature normalization is performed for you,
// e.g. "uint" and "uint256" will be automatically converted
interface.encodeData("transfer(address,uint)", [ to, amount ])
interface.decodeResult("transfer(address to, uint256 amount)", data)
interface.encodeFunctionData("transfer(address,uint)", [ to, amount ])
interface.decodeFunctionResult("transfer(address to, uint256 amount)", data)
_heading: Events
@@ -119,7 +222,7 @@ interface.events.Transfer.decode(data, topics)
// v5
interface.encodeFilterTopics("Transfer", values)
interface.encodeEventLog("Transfer", data, topics)
interface.decodeEventLog("Transfer", data, topics)
_heading: Inspection
@@ -178,14 +281,6 @@ const eventSig = eventFragment.format()
const topic = interface.getTopic(eventFragment)
_subsection: Utilities
_heading: Renaming
_code: @lang<script>
// @TODO
_subsection: Wallet
_heading: Mnemonic Phrases

View File

@@ -1,13 +1,198 @@
_section: Migration: From Web3.js
TODO
_subsection: Contracts
This migration guide focuses on migrating web3.js version 1.2.9 to ethers.js v5.
_subsection: Providers
In ethers, a provider provides an abstraction for a connection to the Ethereum Network. It can be used to issue read only queries and send signed state changing transactions to the Ethereum Network.
_heading: Connecting to Ethereum
_code: @lang<script>
// web3
var Web3 = require('web3');
var web3 = new Web3('http://localhost:8545');
// ethers
var ethers = require('ethers');
const url = "http://127.0.0.1:8545";
const provider = new ethers.providers.JsonRpcProvider(url);
_heading: Connecting to Ethereum: Metamask
_code: @lang<script>
// web3
const web3 = new Web3(Web3.givenProvider);
// ethers
const provider = new ethers.providers.Web3Provider(window.ethereum);
_subsection: Signers
In ethers, a **signer** is an abstraction of an Ethereum Account. It can be used to sign messages and transactions and send signed transactions to the Ethereum Network.
In web3, an account can be used to sign messages and transactions.
_heading: Creating signer
_code: @lang<script>
// web3
const account = web3.eth.accounts.create();
// ethers (create random new account)
const signer = ethers.Wallet.createRandom();
// ethers (connect to JSON-RPC accounts)
const signer = provider.getSigner();
_heading: Signing a message
_code: @lang<script>
// web3 (using a private key)
signature = web3.eth.accounts.sign('Some data', privateKey)
// web3 (using a JSON-RPC account)
// @TODO
// ethers
signature = await signer.signMessage('Some data')
_subsection: Contracts
A contract object is an abstraction of a smart contract on the Ethereum Network. It allows for easy interaction with the smart contract.
_heading: Deploying a Contract
_code: @lang<script>
// web3
const contract = new web3.eth.Contract(abi);
contract.deploy({
data: bytecode,
arguments: ["my string"]
})
.send({
from: "0x12598d2Fd88B420ED571beFDA8dD112624B5E730",
gas: 150000,
gasPrice: "30000000000000"
}), function(error, transactionHash){ ... })
.then(function(newContract){
console.log('new contract', newContract.options.address)
});
// ethers
const signer = provider.getSigner();
const factory = new ethers.ContractFactory(abi, bytecode, signer);
const contract = await factory.deploy("hello world");
console.log('contract address', contract.address);
// wait for contract creation transaction to be mined
await contract.deployTransaction.wait();
_heading: Interacting with a Contract
_code: @lang<script>
// web3
const contract = new web3.eth.Contract(abi, contractAddress);
// read only query
contract.methods.getValue().call();
// state changing operation
contract.methods.changeValue(42).send({from: ....})
.on('receipt', function(){
...
});
// ethers
// pass a provider when initiating a contract for read only queries
const contract = new ethers.Contract(contractAddress, abi, provider);
const value = await contract.getValue();
// pass a signer to create a contract instance for state changing operations
const contract = new ethers.Contract(contractAddress, abi, signer);
const tx = await contract.changeValue(33);
// wait for the transaction to be mined
const receipt = await tx.wait();
_heading: Overloaded Functions
Overloaded functions are functions that have the same name but different parameter
types.
In ethers, the syntax to call an overloaded contract function is different
from the non-overloaded function. This section shows the differences between web3
and ethers when calling overloaded functions.
See [issue #407](link-issue-407) for more details.
_code: @lang<script>
// web3
message = await contract.methods.getMessage('nice').call();
// ethers
const abi = [
"function getMessage(string) public view returns (string)",
"function getMessage() public view returns (string)"
]
const contract = new ethers.Contract(address, abi, signer);
// for ambiguous functions (two functions with the same
// name), the signature must also be specified
message = await contract['getMessage(string)']('nice');
_subsection: Numbers
_heading: BigNumber
Convert to BigNumber:
_code: @lang<script>
// web3
web3.utils.toBN('123456');
// ethers (from a number; must be within safe range)
ethers.BigNumber.from(123456)
// ethers (from base-10 string)
ethers.BigNumber.from("123456")
// ethers (from hex string)
ethers.BigNumber.from("0x1e240")
_subsection: Utilities
_heading: Hash
Computing Keccak256 hash of a UTF-8 string in web3 and ethers:
_code: @lang<script>
// web3
web3.utils.sha3('hello world');
web3.utils.keccak256('hello world');
// ethers (hash of a string)
ethers.utils.id('hello world')
// ethers (hash of binary data)
ethers.utils.keccak256('0x4242')

View File

@@ -0,0 +1,17 @@
_section: Other Resources
There is a lot of documentation on the internet to help you get started,
learn more or cover advanced topics. Here are a few resources to check out.
_subsection: Ethereum Overview
- Official [Ethereum Developer Documentations](link-other-ethereum-dev-docs)
- The [Solidity Documentation](link-solidity), the defactor language for smart
contracts as well as a resource for some of the core concepts of Ethereum
_subsection: Tutorials
I do not manage or maintain these tutorials, but have happened across them.
If a link is dead or outdated, please [let me know](link-mail) and I'll update it.
- [Alchemy - How to Mint an NFT](https://docs.alchemy.com/alchemy/tutorials/how-to-create-an-nft/how-to-mint-an-nft-with-ethers)

BIN
docs.wrm/social.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

View File

@@ -1,3 +1,385 @@
_section: Testing
Here goes info about testing
Testing is a critical part of any library which wishes to remain secure, safe
and reliable.
Ethers currently has **over 23k tests** among its test suites, which are all
made available for other projects to use as simple exported GZIP-JSON files.
The tests are run on every check-in and the results can been seen on the
[GitHub CI Action](link-github-ci).
We also strive to constantly add new test cases, especially when issues
arise to ensure the issue is present prior to the fix, corrected after the
fix and included to prevent future changes from causing a regression.
A large number of the test cases were created procedurally by using
known correct implementations from various sources (such as Geth) and
written in different languages and verified with multiple libraries.
For example, the ABI test suites were generated by procedurally generating
a list of types, for each type choosing a random (valid) value, which then
was converted into a Solidity source file, compiled using ``solc`` and
deployed to a running Parity node and executed, with its outputs being
captured. Similar to the how many of the hashing, event and selector test
cases were created.
_subsection: Supported Platforms @<testing-supported>
While web technologies move quite fast, especially in the Web3 universe, we try
to keep ethers as accessible as possible.
Currently ethers should work on almost any ES3 or better environment and tests
are run against:
- node.js 8.x
- node.js 10.x
- node.js 12.x
- node.js 13.x
- Web Browsers (using UMD)
- Web Browsers (using ES modules)
If there is an environment you feel has been overlooked or have suggestions, please feel
free to reach out by opening an [issue on Github](link-github-issues).
We would like to add a test build for Expo and React as those developers often seem
to encounter pain points when using ethers, so if you have experience or ideas on this,
[bug us](link-github-issues).
The next Major version (probably summer 2021) will likely drop support for node 8.x
and will require ES2015 for [Proxy](link-js-proxy).
Certain features in JavaScript are also avoided, such as look-behind tokens in regular
expressions, since these have caused conflicts (at import time) with certain JavaScript
environments such as [Otto](link-otto).
Basically, the moral of the story is "be inclusive and don't drop people needlessly".
_subsection: Test Suites @<testing-suites>
The test suites are available as gzipped JSON files in the
``@ethersproject/testcases``, which makes it easy to install and import
(both GZIP and JSON are quite easy to consume from most languages). Each
test suite also has its schema available in this package.
_table: Test Suites @style<full>
$Account: Private Keys and addresses in checksum and ICAP formats
$ContractEvents: Compiled Solidity, ABI interfaces, input types/values with the
output types/values for emitted events; all tests were
executed against real Ethereum nodes
$ContractAbi: Compiled Solidity, ABI interfaces, input types/values with the
output types/values, encoded and decoded binary data and normalized
values for function calls executed against real Ethereum nodes.
$ContractAbi2: Identical to ``contract-interface``, except with emphasis on
the ABIv2 coder which supports nested dynami types and structured
data
$ContractSignatures: Contract signatures and matching selectors
$Hashes: Data and respective hashes against a variety of hash functions
$HDNode: HDNodes (BIP-32) with mnemonics, entropy, seed and computed nodes
with pathes and addresses
$Namehash: ENS names along with computed [namehashes](link-namehash
$Nameprep: IDNA and Nameprep representations including official vectors
$RLP: Recursive-Length Prefix (RLP) data and encodings
$SoliditiyHashes: Hashes based on the Solidity non-standard packed form
$Transactions: Signed and unsigned transactions with their serialized formats
including both with and without EIP-155 replay protection
$Units: Values converted between various units
$Wallet: Keystore JSON format wallets, passwords and decrypted values
$Wordlist: Fully decompressed BIP-39 official wordlists
| **Filename** | **Test Cases** <|
| accounts.json.gz | $Account <|
| contract-events.json.gz | $ContractEvents <|
| contract-interface.json.gz | $ContractAbi <|
| contract-interface-abi2.json.gz | $ContractAbi2 <|
| contract-signatures.json.gz | $ContractSignatures <|
| hashes.json.gz | $Hashes <|
| hdnode.json.gz | $HDNode <|
| namehash.json.gz | $Namehash <|
| nameprep.json.gz | $Nameprep <|
| rlp-coder.json.gz | $RLP <|
| solidity-hashes.json.gz | $SoliditiyHashes <|
| transactions.json.gz | $Transactions <|
| units.json.gz | $Units <|
| wallets.json.gz | $Wallet <|
| wordlists.json.gz | $Wordlist <|
_subsection: Test Suite API @<testing-api>
There are also convenience functions for those developing directly in TypeScript.
_property: testcases.loadTests(tag) => Array<TestCase>
Load all the given testcases for the //tag//.
A tag is the string in the above list of test case names not including
any extension (e.g. ``"solidity-hashes"``)
_property: testcases.TestCase.TEST_NAME
Most testcases have its schema available as a TypeScript type to make testing
each property easier.
_heading: Deterministic Random Numbers (DRNG)
When creating test cases, often we want want random data from the perspective
we do not case what values are used, however we want the values to be consistent
across runs. Otherwise it becomes difficult to reproduce an issue.
In each of the following the seed is used to control the random value returned. Be
sure to tweak the seed properly, for example on each iteration change the value and
in recursive functions, concatenate to the seed.
_property: testcases.randomBytes(seed, lower [, upper ]) => Uint8Array
Return at least //lower// random bytes, up to //upper// (exclusive) if specified,
given //seed//. If //upper// is omitted, exactly ///lower// bytes are returned.
_property: testcases.randomHexString(seed, lower [, upper ]) => string<[[DataHexString]]>
Identical to randomBytes, except returns the value as a [[DataHexString]] instead of a
Uint8Array.
_property: testcases.randomNumber(seed, lower, upper) => number
Returns a random number of at least //lower// and less than //upper//
given //seed//.
_subsection: Schemas @<testing-schemas>
This section is still a work in progress, but will outline some of the more nuanced
aspects of the test cases and their values.
There will likely be an overhaul of the test cases in the next major version, to
make code coverage testing more straightforward and to collapse some of the redundancy.
For example, there is no longer a need to separate the ABI and ABIv2 test case and the
accounts and transactions suites can be merged into one large collection.
_heading: Accounts
Basic account information using a private key and computing various address forms.
Tests were verified against [EthereumJS](https:/\/github.com/ethereumjs) and custom
scripts created to directly interact with Geth and cpp implementations.
//See: ``accounts.json.gz``//
_table: Properties
| **Property** | **Meaning** |
| name | The testcase name |
| privateKey | The private key |
| address | The address (lowercase) |
| checksumAddress | The address with checksum-adjusted case |
| icapAddress | The ICAP address |
_code: Example @lang<script>
{
"name": "random-1023",
"address": "0x53bff74b9af2e3853f758a8d2bd61cd115d27782",
"privateKey": "0x8ab0e165c2ea461b01cdd49aec882d179dccdbdb5c85c3f9c94c448aa65c5ace",
"checksumAddress": "0x53bFf74b9Af2E3853f758A8D2Bd61CD115d27782",
"icapAddress": "XE709S6NUSJR6SXQERCMYENAYYOZ2Y91M6A"
}
_heading: Contract Interface
Procedurally generated test cases to test ABI coding.
_code: Example @lang<script>
{
"name": "random-1999",
"source": "contract Test {\n function test() constant returns (address, bool, bytes14[1]) {\n address a = address(0x061C7F399Ee738c97C7b7cD840892B281bf772B5);\n bool b = bool(true);\n bytes14[1] memory c;\n c[0] = bytes14(0x327621c4abe12d4f21804ed40455);\n return (a, b, c);\n }\n}\n",
"types": "[\"address\",\"bool\",\"bytes14[1]\"]",
"interface": "[{\"constant\":true,\"inputs\":[],\"name\":\"test\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"},{\"name\":\"\",\"type\":\"bool\"},{\"name\":\"\",\"type\":\"bytes14[1]\"}],\"type\":\"function\"}]\n",
"bytecode": "0x6060604052610175806100126000396000f360606040526000357c010000000000000000000000000000000000000000000000000000000090048063f8a8fd6d1461003957610037565b005b610046600480505061009d565b604051808473ffffffffffffffffffffffffffffffffffffffff1681526020018315158152602001826001602002808383829060006004602084601f0104600f02600301f150905001935050505060405180910390f35b600060006020604051908101604052806001905b60008152602001906001900390816100b157905050600060006020604051908101604052806001905b60008152602001906001900390816100da5790505073061c7f399ee738c97c7b7cd840892b281bf772b59250600191506d327621c4abe12d4f21804ed404557201000000000000000000000000000000000000028160006001811015610002579090602002019071ffffffffffffffffffffffffffffffffffff191690818152602001505082828295509550955061016d565b50505090919256",
"result": "0x000000000000000000000000061c7f399ee738c97c7b7cd840892b281bf772b50000000000000000000000000000000000000000000000000000000000000001327621c4abe12d4f21804ed40455000000000000000000000000000000000000",
"values": "[{\"type\":\"string\",\"value\":\"0x061C7F399Ee738c97C7b7cD840892B281bf772B5\"},{\"type\":\"boolean\",\"value\":true},[{\"type\":\"buffer\",\"value\":\"0x327621c4abe12d4f21804ed40455\"}]]",
"normalizedValues": "[{\"type\":\"string\",\"value\":\"0x061C7F399Ee738c97C7b7cD840892B281bf772B5\"},{\"type\":\"boolean\",\"value\":true},[{\"type\":\"buffer\",\"value\":\"0x327621c4abe12d4f21804ed40455\"}]]",
"runtimeBytecode": "0x60606040526000357c010000000000000000000000000000000000000000000000000000000090048063f8a8fd6d1461003957610037565b005b610046600480505061009d565b604051808473ffffffffffffffffffffffffffffffffffffffff1681526020018315158152602001826001602002808383829060006004602084601f0104600f02600301f150905001935050505060405180910390f35b600060006020604051908101604052806001905b60008152602001906001900390816100b157905050600060006020604051908101604052806001905b60008152602001906001900390816100da5790505073061c7f399ee738c97c7b7cd840892b281bf772b59250600191506d327621c4abe12d4f21804ed404557201000000000000000000000000000000000000028160006001811015610002579090602002019071ffffffffffffffffffffffffffffffffffff191690818152602001505082828295509550955061016d565b50505090919256"
}
_heading: Contract Signatures
Computed ABI signatures and the selector hash.
_code: Example @lang<script>
{
"name": "random-1999",
"sigHash": "0xf51e9244",
"abi": "[{\"constant\":false,\"inputs\":[{\"name\":\"r0\",\"type\":\"string[2]\"},{\"name\":\"r1\",\"type\":\"uint128\"},{\"components\":[{\"name\":\"a\",\"type\":\"bytes\"},{\"name\":\"b\",\"type\":\"bytes\"},{\"name\":\"c\",\"type\":\"bytes\"}],\"name\":\"r2\",\"type\":\"tuple\"},{\"name\":\"r3\",\"type\":\"bytes\"}],\"name\":\"testSig\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"test\",\"outputs\":[{\"name\":\"r0\",\"type\":\"string[2]\"},{\"name\":\"r1\",\"type\":\"uint128\"},{\"components\":[{\"name\":\"a\",\"type\":\"bytes\"},{\"name\":\"b\",\"type\":\"bytes\"},{\"name\":\"c\",\"type\":\"bytes\"}],\"name\":\"r2\",\"type\":\"tuple\"},{\"name\":\"r3\",\"type\":\"bytes\"}],\"payable\":false,\"stateMutability\":\"pure\",\"type\":\"function\"}]",
"signature": "testSig(string[2],uint128,(bytes,bytes,bytes),bytes)"
}
_heading: Hashes
_code: Examples @lang<script>
{
"data": "0x3718a88ceb214c1480c32a9d",
"keccak256": "0x82d7d2dc3d384ddb289f41917b8280675bb1283f4fe2b601ac7c8f0a2c2824fa",
"sha512": "0xe93462bb1de62ba3e6a980c3cb0b61728d3f771cea9680b0fa947b6f8fb2198a2690a3a837495c753b57f936401258dfe333a819e85f958b7d786fb9ab2b066c",
"sha256": "0xe761d897e667aa72141dd729264c393c4ddda5c62312bbd21b0f4d954eba1a8d"
}
_heading: Hierarchal Deterministic Node (BIP-32)
Tests for [BIP-32](link-bip-32) HD Wallets.
_code: Example @lang<script>
{
"name": "trezor-23",
"entropy": "0xf585c11aec520db57dd353c69554b21a89b20fb0650966fa0a9d6f74fd989d8f",
"mnemonic": "void come effort suffer camp survey warrior heavy shoot primary clutch crush open amazing screen patrol group space point ten exist slush involve unfold",
"locale": "en",
"password": "TREZOR",
"hdnodes": [
{
"path": "m",
"address": "0xfd8eb95169ce57eab52fb69bc6922e9b6454d9aa",
"privateKey": "0x679bf92c04cf16307053cbed33784f3c4266b362bf5f3d7ee13bed6f2719743c"
},
{
"address": "0xada964e9f10c4fc9787f9e17f00c63fe188722b0",
"privateKey": "0xdcbcb48a2b11eef0aab93a8f88d83f60a3aaabb34f9ffdbe939b8f059b30f2b7",
"path": "m/8'/8'/2/3/4"
},
{
"privateKey": "0x10fd3776145dbeccb3d6925e4fdc0d58b452fce40cb8760b12f8b4223fafdfa6",
"address": "0xf3f6b1ef343d5f5f231a2287e801a46add43eb06",
"path": "m/1'/3'"
},
{
"address": "0xb7b0fdb6e0f79f0529e95400903321e8a601b411",
"privateKey": "0x093a8ff506c95a2b79d397aed59703f6212ff3084731c2f03089b069ae76e69d",
"path": "m/8'/4'/7'"
},
{
"path": "m/7'/5'/11",
"privateKey": "0x6bd79da4dfa7dd0abf566a011bdb7cba0d28bba9ca249ba25880d5dabf861b42",
"address": "0x1b3ad5fa50ae32875748107f4b2160829cc10536"
},
{
"path": "m/9'/6'/2'/7'/3'",
"address": "0x42eb4bed59f3291d02387cf0fb23098c55d82611",
"privateKey": "0xfc173acba7bc8bb2c434965d9e99f5a221f81add421bae96a891d08d60be11dd"
}
],
"seed": "0x01f5bced59dec48e362f2c45b5de68b9fd6c92c6634f44d6d40aab69056506f0e35524a518034ddc1192e1dacd32c1ed3eaa3c3b131c88ed8e7e54c49a5d0998"
}
_heading: ENS Namehash
Test cases for the [ENS Namehash Algorithm](link-namehash).
_code: Examples
{
"expected": "0x33868cc5c3fd3a9cd3adbc1e868ea133d2218f60dc2660c3bc48d8b1f4961384",
"name": "ViTalIk.WALlet.Eth",
"test": "mixed case"
}
_heading: RLP Coder
_code: Examples @lang<script>
{
"name": "arrayWithNullString3",
"encoded": "0xc3808080",
"decoded": [ "0x", "0x", "0x" ]
}
_heading: Solidity Hashes
Tests for the non-standard packed form of the Solidity hash functions.
These tests were created by procedurally generating random signatures and
values that match those signatures, constructing the equivalent Soldity,
compiling it and deploying it to a Parity node then evaluating the response.
_code: Example @lang<script>
{
"name": "random-1999",
"keccak256": "0x7d98f1144a0cd689f720aa2f11f0a73bd52a2da1117175bc4bacd93c130966a1",
"ripemd160": "0x59384617f8a06efd57ab106c9e0c20c3e64137ac000000000000000000000000",
"sha256": "0xf9aeea729ff39f8d372d8552bca81eb2a3c5d433dc8f98140040a03b7d81ac92",
"values": [
"0xcdffcb5242e6",
"0xc1e101b60ebe4688",
"0x5819f0ef5537796e43bdcd48309f717d6f7ccffa",
"0xec3f3f9f",
false,
true
],
"types": [
"int184",
"int176",
"address",
"int64",
"bool",
"bool"
]
}
_heading: Transactions
Serialized signed and unsigned transactions with both EIP-155 enabled and
disabled.
_code: Examples @lang<script>
{
"name": "random-998",
"privateKey": "0xd16c8076a15f7fb583f05dc12686fe526bc59d298f1eb7b9a237b458133d1dec",
"signedTransactionChainId5": "0xf8708391d450848517cfba8736fcf36da03ee4949577303fd4e0acbe72c6c116acab5bf63f0b1e9c8365fdc7827dc82ea059891894eb180cb7c6c45a52f62d2103420d3ad0bc3ba518d0a25ed910842522a0155c0ea2aee2ea82e75843aab297420bad907d46809d046b13d692928f4d78aa",
"gasLimit": "0x36fcf36da03ee4",
"to": "0x9577303fd4e0acbe72c6c116acab5bf63f0b1e9c",
"data": "0x7dc8",
"accountAddress": "0x6d4a6aff30ca5ca4b8422eea0ebcb669c7d79859",
"unsignedTransaction": "0xed8391d450848517cfba8736fcf36da03ee4949577303fd4e0acbe72c6c116acab5bf63f0b1e9c8365fdc7827dc8",
"nonce": "0x91d450",
"gasPrice": "0x8517cfba",
"signedTransaction": "0xf8708391d450848517cfba8736fcf36da03ee4949577303fd4e0acbe72c6c116acab5bf63f0b1e9c8365fdc7827dc81ba05030832331e6be48c95e1569a1ca9505c495486f72d6009b3a30fadfa05d9686a05cd3116b416d2362da1e9b0ca7fb1856c4e591cc22e63b395bd881ce2d3735e6",
"unsignedTransactionChainId5": "0xf08391d450848517cfba8736fcf36da03ee4949577303fd4e0acbe72c6c116acab5bf63f0b1e9c8365fdc7827dc8058080",
"value": "0x65fdc7"
}
_heading: Units
Unit conversion.
_code: Example @lang<script>
{
"name": "one-two-three-3",
"gwei_format": "-1234567890123456.789012345",
"ether_format": "-1234567.890123456789012345",
"gwei": "-1234567890123456.789012345",
"ether": "-1234567.890123456789012345",
"finney": "-1234567890.123456789012345",
"wei": "-1234567890123456789012345",
"finney_format": "-1234567890.123456789012345"
}
_heading: Wallets
Tests for the JSON keystore format.
_code: Example @lang<script>
{
"mnemonic": null,
"name": "secretstorage_password",
"type": "secret-storage",
"password": "foo",
"privateKey": "0xf03e581353c794928373fb0893bc731aefc4c4e234e643f3a46998b03cd4d7c5",
"hasAddress": true,
"json": "{\"address\":\"88a5c2d9919e46f883eb62f7b8dd9d0cc45bc290\",\"Crypto\":{\"cipher\":\"aes-128-ctr\",\"ciphertext\":\"10adcc8bcaf49474c6710460e0dc974331f71ee4c7baa7314b4a23d25fd6c406\",\"cipherparams\":{\"iv\":\"1dcdf13e49cea706994ed38804f6d171\"},\"kdf\":\"scrypt\",\"kdfparams\":{\"dklen\":32,\"n\":262144,\"p\":1,\"r\":8,\"salt\":\"bbfa53547e3e3bfcc9786a2cbef8504a5031d82734ecef02153e29daeed658fd\"},\"mac\":\"1cf53b5ae8d75f8c037b453e7c3c61b010225d916768a6b145adf5cf9cb3a703\"},\"id\":\"fb1280c0-d646-4e40-9550-7026b1be504a\",\"version\":3}\n",
"address": "0x88a5c2d9919e46f883eb62f7b8dd9d0cc45bc290"
}

View File

@@ -0,0 +1,15 @@
_section: Building @<troubleshooting-building>
@TODO
_subsection: Packages
Sometimes packages get out of sync.
_code:
/home/ethers> rm package-lock.json node_modules/
/home/ethers> rm yarn.lock
/home/ethers> npm install

View File

@@ -0,0 +1,249 @@
_section: Error Codes @<error-codes>
All errors in ethers are created by the [[Logger]] class, which includes
a number of additional properties and extra data, which can assist in
debugging and when submitting issues.
When submitting an issue, please include as much of any error as possible,
but also make sure you understand the error and have tried suggested solutions
both in this trouble-shooting document and any other issues you find when
searching the GitHub issues.
_subsection: CALL_EXCEPTION @<help-CALL_EXCEPTION>
This error occurs when a call or transaction is used to interact with
the blockchain reverts (via ``revert``, ``require``, et cetera).
Due to the overall flexibility of Ethereum and Turing Completeness,
there is a large variety of reasons this can occur and troubleshooting
requires attention.
_heading: Common Causes
- The code does not exist on-chain. This may happen if you failed to wait
until the contract was deployed, the address is incorrect or if you
are connected to a different network than the contract has been deployed.
Check the code exists using ``provider.getCode(address)``.
- The wrong code is being accessed, for example if an artifact file was
not correctly updated so an older instance of the contract is being called
- The contract is failing during a ``require`` statement. For example, if
a contract method requires an //admin account// to be used, but the
contract is connected to another [[Signer]].
- The wrong ABI is being used to interact with a contract.
_heading: Debugging
- Always double check the address and network you are connected to and use
``provider.getCode(address)`` to verify the deployed code matches your
most recent version.
- Try accessing other, simpler contract methods to verify the account is correct.
_subsection: INSUFFICIENT_FUNDS @<help-INSUFFICIENT_FUNDS>
This usually occurs when a transaction is attempted, but the sending account
does not have enough ether to cover the cost of the transaction.
A transaction has an intrinsic cost which must be met, which accounts for
the value being sent, the base fee of the transaction, additional fees per byte
of calldata and whether the transaction will create a new account (i.e. the ``to``
is empty).
This error can also happen if ``provider.estimateGas`` is used with a non-zero
fee (i.e. ``gasPrice``, ``maxFeePerGas`` or ``maxPriorityFeePerGas``). If any
fee properties are specified, the ``from`` account must have sufficient ether
to execute the transaction.
_subsection: MISSING_NEW @<help-MISSING_NEW>
Classes in ethers must be instantiated with the ``new`` operator. This
error indicates that a Class is attempting to be used as a function.
_code: Examples @lang<javascript>
//_hide: privateKey = "0x0123456789012345678901234567890123456789012345678901234567890123";
//_hide: Wallet = ethers.Wallet;
// Bad:
//_throws:
ethers.Wallet(privateKey)
//_log:
// Good:
//_result:
new ethers.Wallet(privateKey)
//_log:
_subsection: NONCE_EXPIRED @<help-NONCE_EXPIRED>
This error occurs when a transaction is being sent with a ``nonce`` that
is lower than next required ``nonce``.
Each Ethereum transaction requires a ``nonce`` property equal to the index
of that transaction for that account for all time. So, if an account has
send four transactions over its lifetime, that means the nonces 0 though 3
(inclusive) have been used. The next transaction must use a nonce of 4.
Attempting to re-use a nonce less than 4 will result in this error.
_subsection: NUMERIC_FAULT @<help-NUMERIC_FAULT>
A [numeric fault](errors--numeric-fault) is a consequence of
performing an illegal operation with numeric values, such as
dividing by zero.
The error will indicate the ``operation``, which further indicates
the reason for the error.
_heading: Overflow @<help-NUMERIC_FAULT-overflow>
JavaScript uses [IEEE 754 double-precision binary floating point](link-wiki-ieee754)
numbers to represent numeric values. As a result, there are //holes//
in the integer set after 9,007,199,254,740,991; which is
problematic for //Ethereum// because that is only around 0.009
ether (in wei), which means any value over that will begin to
experience rounding errors.
As a result, any attempt to use a number which is outside the safe
range, which would result in incorrect values, an error is thrown.
In general, numbers should be kept as strings, [[BigNumber]] instances or
using ES2020 bigints, which all can safely be used without loss of precission.
_code: Examples @lang<javascript>
// One ether is outside the safe range
//_throws:
BigNumber.from(1000000000000000000)
//_log:
// Providing the value as a string is safe
//_result:
BigNumber.from("1000000000000000000")
//_log:
// As is using a bigint (notice the `n` suffix)
//_result:
BigNumber.from(1000000000000000000n)
//_log:
// But most often, the `parseEther` function solves this
//_result:
utils.parseEther("1.0")
//_log:
_heading: Numeric Underflow @<help-NUMERIC_FAULT-underflow>
Numeric underflow sbould not be confused with overflow.
Numeric underflow occurs when the precission of a value cannot be
safely represented in the current data type.
**Common Causes**
- Using values with fractional componets (e.g. ``BigNumber.from(1.2)``).
If you require fractions, you must use the [[FixedNumber]] class.
- Parsing string values that have more decimals than the unit supports
(e.g. ``parseUints("1.33", 1)``).
_code: Examples @lang<javascript>
// BigNumbers cannot be created with a fractional component
//_throws:
BigNumber.from(1.2)
//_log:
// Parsing a value with more decimals than the type
//_throws:
utils.parseUnits("1.34", 1);
//_log:
_heading: Division by zero @<help-NUMERIC_FAULT-division-by-zero>
This error occurs when dividing by zero or attempting to take the modulo zero.
_heading: Unbound Result @<help-NUMERIC_FAULT-unbound-result>
The ethers [[BigNumber]] does not support bitwise operators
on negative numbers which can result in the need for an infinite
number of set bits.
Other implementations may use negative values to indicate this,
but this is considered out of scope for ethers.
_heading: Unsupported Operation @<help-NUMERIC_FAULT-unsupported>
The ethers [[BigNumber]] does not support negative powers or bitwise
shift operation using negative values.
_code: Examples @lang<javascript>
two = BigNumber.from(2);
//_throws:
two.pow(-2)
//_log:
// Cannot use negative values to alter shift direction
//_throws:
two.shr(-1)
//_log:
_subsection: REPLACEMENT_UNDERPRICED @<help-REPLACEMENT_UNDERPRICED>
To prevent nodes from being overloaded with junk transactions, a transaction
is only accepted into the memory pool if it has a reasonable chance of being
actually mined, which means that the account has sufficient balance, the nonce
is correct and the fee seems reasonable.
Once a transaction is in the memory pool though, to prevent an account from
flooding the network with many different transactions with the same nonce (each
of which satisfies the above criteria), to replace an existing transaction
an additional committment of a fee must be made by increasing the promised fee.
When replacing a legacy non-EIP1559 transaction, the ``gasPrice`` must be
increased. When replacing a modern, EIP-1559 transaction, the ``maxPriorityFeePerGas``
should be increased.
_subsection: TRANSACTION_REPLACED @<help-TRANSACTION_REPLACED>
This error is thrown when waiting for a transaction which has been
replaced by another, by the sender submitting a second transaction
with the same nonce, while the transaction was pending in the
transaction pool.
You can learn more about this feature in the ``.wait`` method of
[TransactionResponse](providers-TransactionResponse).
_subsection: UNPREDICTABLE_GAS_LIMIT @<help-UNPREDICTABLE_GAS_LIMIT>
During gas estimation it is possible that a transaction would actually
fail (and hence has no reasonable estimate of gas requirements) or that
the transaction is complex in a way that does not permit a node to
estiamte the gas requirements, in which case this error is thrown.
In almost all cases, this will unfortunately require you specify an
explicit ``gasLimit`` for your transaction, which will disable ether's
automatic population of the ``gasLimit`` field, which will cause this
error to go away.
To dial in an appropriate gas limit, try a value that is much higher
than you expect, and then make a few transactions to discover reasonable
values and then you can reduce this value down to that ballpark.
Keep in mind this error can also occur if the transaction would
legitimately fail, in which case the root cause must be addressed, such
as ensuring the correct [[Signer]] is being used, the appropriate allowance
for an ERC-20 token has been approved, etc.

View File

@@ -0,0 +1,62 @@
_section: Getting Help @<troubleshooting-issues>
@TODO
_subsection: Starting a discussion
Before opening an issue
_subsection: Opening an Issue
Keep in mind that opening an issue should be a last resort, as it
requires time and energy by the library developers to look at that
could otherwise be spent on improving the library, documentation
and tools.
Before opening an issue, please make sure you have searched any
public information, such as:
- Documentation
- GitHub Discussions
- GitHub Issues (including closed issues)
There are several types of issues tracked by ethers. Using the correct
one helps you receive feedback quicker and helps us keep the right
person
_heading: Feature Requests
_heading: Bugs
This type of issue is for anything you you believe to be a bug in ethers.
Keep in mind that ethers is used extensively by thousands of people every
day, so while chances are possible you found a bug, please make sure to
do your due diligence to rule out user error.
If you are new to ethers, or are doing a fairly common operation, it is
quite likely what you are experiencing is a misunderstanding of how to
use a function, method or class. You should consider opening a discussion first.
Please make sure you include as much information as is useful:
- Are you using a third-party library, like Hardhat or Truffle?
- What platform are you on, a web browser, React Native, node, etc.?
- What network are you on, such as Ethereum mainnet, Optimism, etc.?
- What backend are you using, such as Geth, INFURA, Provider Engine, etc.?
_heading: Docuementation
If you have found a typo in the documentation, a feature which isn't
documented (or documented well) or just find something described in
the documentation confusing, please feel free to create an issue and
we will try to improve it.
_heading: Other
This should never be used.

Some files were not shown because too many files have changed in this diff Show More