quantumcoin 7.0.3 → 7.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (155) hide show
  1. package/.github/workflows/publish-npmjs.yaml +22 -22
  2. package/.gitignore +15 -15
  3. package/LICENSE +21 -21
  4. package/README-SDK.md +756 -754
  5. package/README.md +165 -150
  6. package/SPEC.md +3845 -3843
  7. package/config.d.ts +50 -50
  8. package/config.js +115 -115
  9. package/examples/AllSolidityTypes.sol +184 -184
  10. package/examples/SimpleIERC20.sol +74 -74
  11. package/examples/events.js +41 -35
  12. package/examples/events.ts +35 -0
  13. package/examples/example-generator-sdk-js.js +100 -95
  14. package/examples/example-generator-sdk-js.ts +77 -0
  15. package/examples/example-generator-sdk-ts.js +100 -95
  16. package/examples/example-generator-sdk-ts.ts +77 -0
  17. package/examples/example.js +72 -61
  18. package/examples/example.ts +61 -0
  19. package/examples/offline-signing.js +79 -73
  20. package/examples/offline-signing.ts +66 -0
  21. package/examples/package-lock.json +48 -57
  22. package/examples/package.json +32 -16
  23. package/examples/read-operations.js +32 -27
  24. package/examples/read-operations.ts +31 -0
  25. package/examples/sdk-generator-erc20.inline.json +251 -251
  26. package/examples/solidity-types.ts +43 -43
  27. package/examples/wallet-offline.js +35 -29
  28. package/examples/wallet-offline.ts +34 -0
  29. package/generate-sdk.js +1824 -1490
  30. package/index.js +12 -12
  31. package/package.json +95 -75
  32. package/scripts/copy-declarations.js +31 -0
  33. package/scripts/run-all-one-by-one.js +151 -0
  34. package/src/abi/fragments.d.ts +42 -42
  35. package/src/abi/fragments.js +63 -63
  36. package/src/abi/index.d.ts +13 -13
  37. package/src/abi/index.js +9 -9
  38. package/src/abi/interface.d.ts +128 -132
  39. package/src/abi/interface.js +590 -590
  40. package/src/abi/js-abi-coder.d.ts +8 -0
  41. package/src/abi/js-abi-coder.js +474 -474
  42. package/src/constants.d.ts +66 -61
  43. package/src/constants.js +101 -94
  44. package/src/contract/contract-factory.d.ts +28 -28
  45. package/src/contract/contract-factory.js +105 -105
  46. package/src/contract/contract.d.ts +113 -114
  47. package/src/contract/contract.js +354 -354
  48. package/src/contract/index.d.ts +9 -9
  49. package/src/contract/index.js +9 -9
  50. package/src/errors/index.d.ts +92 -92
  51. package/src/errors/index.js +188 -188
  52. package/src/generator/index.d.ts +74 -0
  53. package/src/generator/index.js +1404 -1404
  54. package/src/index.d.ts +125 -127
  55. package/src/index.js +41 -41
  56. package/src/internal/hex.d.ts +61 -61
  57. package/src/internal/hex.js +144 -144
  58. package/src/providers/extra-providers.d.ts +139 -128
  59. package/src/providers/extra-providers.js +600 -575
  60. package/src/providers/index.d.ts +17 -16
  61. package/src/providers/index.js +10 -10
  62. package/src/providers/json-rpc-provider.d.ts +12 -12
  63. package/src/providers/json-rpc-provider.js +79 -79
  64. package/src/providers/provider.d.ts +207 -203
  65. package/src/providers/provider.js +392 -371
  66. package/src/types/index.d.ts +214 -462
  67. package/src/types/index.js +9 -9
  68. package/src/utils/address.d.ts +72 -72
  69. package/src/utils/address.js +181 -182
  70. package/src/utils/encoding.d.ts +120 -120
  71. package/src/utils/encoding.js +306 -306
  72. package/src/utils/hashing.d.ts +82 -76
  73. package/src/utils/hashing.js +313 -298
  74. package/src/utils/index.d.ts +65 -55
  75. package/src/utils/index.js +13 -13
  76. package/src/utils/result.d.ts +57 -57
  77. package/src/utils/result.js +128 -128
  78. package/src/utils/rlp.d.ts +12 -12
  79. package/src/utils/rlp.js +200 -200
  80. package/src/utils/units.d.ts +29 -29
  81. package/src/utils/units.js +107 -107
  82. package/src/wallet/index.d.ts +10 -10
  83. package/src/wallet/index.js +8 -8
  84. package/src/wallet/wallet.d.ts +160 -160
  85. package/src/wallet/wallet.js +483 -489
  86. package/test/e2e/all-solidity-types.dynamic.test.js +207 -200
  87. package/test/e2e/all-solidity-types.dynamic.test.ts +191 -0
  88. package/test/e2e/all-solidity-types.fixtures.js +231 -231
  89. package/test/e2e/all-solidity-types.generated-sdks.e2e.test.js +387 -368
  90. package/test/e2e/all-solidity-types.generated-sdks.e2e.test.ts +350 -0
  91. package/test/e2e/helpers.js +59 -47
  92. package/test/e2e/signing-context-and-fee.e2e.test.js +137 -0
  93. package/test/e2e/signing-context-and-fee.e2e.test.ts +128 -0
  94. package/test/e2e/simple-erc20.generated-sdks.e2e.test.js +168 -151
  95. package/test/e2e/simple-erc20.generated-sdks.e2e.test.ts +141 -0
  96. package/test/e2e/transactional.test.js +245 -191
  97. package/test/e2e/transactional.test.ts +208 -0
  98. package/test/e2e/typed-generator.e2e.test.js +407 -404
  99. package/test/e2e/typed-generator.e2e.test.ts +337 -0
  100. package/test/fixtures/ConstructorParam.sol +23 -23
  101. package/test/fixtures/MultiContracts.sol +37 -37
  102. package/test/fixtures/SimpleStorage.sol +18 -18
  103. package/test/fixtures/StakingContract.abi.json +1 -1
  104. package/test/integration/ipc-provider.test.js +49 -44
  105. package/test/integration/ipc-provider.test.ts +44 -0
  106. package/test/integration/provider.test.js +88 -72
  107. package/test/integration/provider.test.ts +85 -0
  108. package/test/integration/ws-provider.test.js +41 -33
  109. package/test/integration/ws-provider.test.ts +38 -0
  110. package/test/security/malformed-input.test.js +37 -31
  111. package/test/security/malformed-input.test.ts +35 -0
  112. package/test/unit/_encrypted-output.txt +6 -0
  113. package/test/unit/_log-encrypted-jsons.js +45 -0
  114. package/test/unit/_write-keystore-fixture.js +16 -0
  115. package/test/unit/abi-interface.test.js +103 -98
  116. package/test/unit/abi-interface.test.ts +102 -0
  117. package/test/unit/address-wallet.test.js +355 -257
  118. package/test/unit/address-wallet.test.ts +342 -0
  119. package/test/unit/browser-provider.test.js +85 -82
  120. package/test/unit/browser-provider.test.ts +79 -0
  121. package/test/unit/contract.test.js +85 -82
  122. package/test/unit/contract.test.ts +83 -0
  123. package/test/unit/encoding-units-rlp.test.js +92 -89
  124. package/test/unit/encoding-units-rlp.test.ts +91 -0
  125. package/test/unit/errors.test.js +77 -74
  126. package/test/unit/errors.test.ts +76 -0
  127. package/test/unit/filter-by-blockhash.test.js +55 -52
  128. package/test/unit/filter-by-blockhash.test.ts +54 -0
  129. package/test/unit/fixtures/encrypted-keystores-48-32-36.js +9 -0
  130. package/test/unit/generate-contract-cli.test.js +42 -39
  131. package/test/unit/generate-contract-cli.test.ts +41 -0
  132. package/test/unit/generate-sdk-artifacts-json.test.js +113 -110
  133. package/test/unit/generate-sdk-artifacts-json.test.ts +110 -0
  134. package/test/unit/generator.test.js +102 -99
  135. package/test/unit/generator.test.ts +101 -0
  136. package/test/unit/hashing.test.js +68 -54
  137. package/test/unit/hashing.test.ts +67 -0
  138. package/test/unit/init.test.js +39 -36
  139. package/test/unit/init.test.ts +38 -0
  140. package/test/unit/interface.test.js +56 -53
  141. package/test/unit/interface.test.ts +54 -0
  142. package/test/unit/internal-hex.test.js +50 -47
  143. package/test/unit/internal-hex.test.ts +49 -0
  144. package/test/unit/populate-transaction.test.js +65 -62
  145. package/test/unit/populate-transaction.test.ts +64 -0
  146. package/test/unit/providers.test.js +200 -144
  147. package/test/unit/providers.test.ts +196 -0
  148. package/test/unit/result.test.js +80 -77
  149. package/test/unit/result.test.ts +79 -0
  150. package/test/unit/solidity-types.test.js +49 -46
  151. package/test/unit/solidity-types.test.ts +39 -0
  152. package/test/unit/utils.test.js +57 -54
  153. package/test/unit/utils.test.ts +56 -0
  154. package/test/verbose-logger.js +74 -0
  155. package/tsconfig.build.json +14 -0
@@ -0,0 +1,6 @@
1
+ // 48-word encrypted JSON:
2
+ "{\"address\":\"3ce22c0e2714196734e42b0d4d5ad11284260502a560e46c2cd857391564142f\",\"crypto\":{\"cipher\":\"aes-256-ctr\",\"ciphertext\":\"5cb79a13b939760e4020e6e2ee662afeb6c0369ff21379402544282a4c33403162cdd360dbfa2e4f0060cfc2ac42eb7ce71aac79e35463c54ab61a1f88b25c536131451cfe39cdc65fd60e950437ee57a2210e4ac8cd3f4501e4482b36d254f1ac02e0cab514389791b7e28975a443a2ac776714baed0c9458c891de46d4ca1dd45ffad668831885e43b4a0731694ca68f0a2ae7a60471794c63b7f41d92f4ef08d98d721bd6bbb07f53929fab93bcbe5285a3fb80986fb7b8fe00e5a534366f9103f8d53aa392ff71ddeef91b38e0b00e0fc5f5e6394edd682aa3320eb388d65b0ed97243d7d01a99d49bb579f638e2c1930e24d546e169de0bc157e431398daf454d9b41fe6d88cd8fd5bdbc69fdb052011b5e5ac8ff6797bcb419ff61d5eb80777e6fd16e6c2b62ae0d0141e579c31070b94d5001dc305e73906b000c1e66587e4ba34e5c685e17331639d93064708b2bc9913ee08a25223b0b94c0f9038edba37699544e5029376ba8abc2c95a76e6d798ddab9f64eb5bdb72fc3267c29db1d05a48d8ac85e73b6dba46ed2d58c786083d2d98954508a08acb4b9cd56b5ab1597b1503b39cbffe686375293d96f9d6e26724862e2a3c3ec925148b2950db71d9ba14fb4d1e5f9519f28aba6380a773202ce541e00e13ce81b3ddc172686716e2aba32275d0d9894f863e452f78d2b545fe7b4461a9048cdf449a049ad01b65a885a7d83a9c518138ecf1353f7c4c3cd33d5bddb9e3bfcd89c2ee629518a68c0eebd98ee3eca4632baeddde239a4cbec88e63a211353db166721519a8f9ec4183241dd878d77c077eb76d7a3b9f47eea8af5b6b8fab1a279e9cdea487d538d2cec7c0df281565cf96c2d0979c935fd977962e6029969693508050303d3db9f1d0ccc1789615488414c78269916203661770ad0b3a6ce8e797ffbc47a34425c51514f875e0243827cf3f666d0a291eed5ede299f4893f97e0026b114a39b41b3902a5de34e3f5ba5f7eda4213db428fbf7cefb839618c9a0d7c37d2e2cd4f019d9befb6387b73f13ada6a6569283b3cbf9eabb75b37c8463d82883bad14595953e13c52a63b33d93749d7d2e55e07f1937a9ee1859930393755dc5b3c4ab5f23eb20749fb96ae99307fc019538308b21c1843b8e862d94045ced3ddae1d42038a92700751df3d35705e3e7b8a4b4f192f8855752c4c8edc91809a97797810777abc50685240aa8d814f580d754d7d230964f83be16d2abe411996097d9150394701d00ad7cbf383a53593bf4da2af6bdee3c6d91559de7980f614bbde1334c440ea98edfa7b7c6fe0b47da3f514021a331a93d519b7bca497236e7f19fb763ad1c2ac251d6e85908fa5e821055b8b052a84800cd8f2cd197f435406471fc6367dac0b31128307509a197fc7a95c7f3b998d61d326319f6a613bd44320a385edd43b0bd1d05dff98d76ec04747c073ca0cb2952fcf07ec40a34cfbaf9c9f5373b664cd2a13b40a3e3861957e57c7728e5364527a34e76c59a97454639341a4a110303b66673d93d49e15bff6d7bb1d7fb51c21ca1767e0d542379b9206bd7aa1a4328fffa9c5ecbbd7eb82c036f387f76afd75940df73e3fc41ab0c5b279cada8a3d0c442efd5a9196d91976f2ee675c4e460179e321b113c080a3c449d212c8b63b445d651be8ce69b8782201820717dfec7e8fe6e9c0b56bd1bf56ee53c872441a4b6e765980aee68a2ab6338b10b1ec28b53069d87c8b72ea7aa829346b18c45922e7846795735d9ec5a164a57fe6a6d1d445a63b94bc0b0a24f8303487d394ece7170e921f63ed90cd05e8ed18f79ac9b44965666126ac20e12c73b306a806dcdb514b3fed27b4cab2be438ed7dc6aa176d7b481f23194cf7d0f01266f31cd07701eb7912a4de43074089802ecb5de510883a9eb034cda419d420a46191e0f25475a502f18671883427105f040c64d7df72e598f22e5b8579284b53eed0154c2ed922594a6fb08f7bc7cc75805d0c2fa6546383bcfda289469dd87f20a63f24592a153d7f2445ae46a8337588387a573183b104d130b81123060c7cfd77cf2265a0176b1ed83c0bb168fe694dbbaf63bd625db605d4c51f198c7355e21cc69d3e7992d074dd6f32ddf8022fd36ebde8ba0859a14eab4fba9041d0e02ba85bc35a1fcb6a9b63935673132b3b5dc7d8344aa8c32ef2c43a6bbad213b302c18725c43d80b63f2c93900f52d9000b2bea2465fda1c9552c5e702e6251fab30364fffc5e49775d9d37b6c9ac440be9ab5db36ccbd98aa9cb4c6b2a3e37065db1c6934bf5e5156ce7e8fc67087cbbbc2fe134b9a1177d14401121f7488abf13736225fc78b193d5b4e0d84b8c7412699a400c74ff9220402c54fed53b87101a03342df57282892e5f911f0899e4db76785d50a467c903f9ac28682aafe4d3154562a78b711e330b8759a96c38f1168a3f5978f3ff733c4840f6f8c42082063c650139da7d90d997276e7ee311f44ddd61613273cd6b7e09424234f6620669e8f026989065facfb6c0ff5c20c08d1bb46904b1fc26a897abb95e2024a3d9425330c0c8d86780582c956d85b01af4a9689337a14a23fad98475217da347c4ef058dd21666a63d0a61162cf4b79e73370502232d9a3eec857e21cfcee60a7ccc372a72c45315e4084fb10e2233060662c29b921caa9aa60efc24b283807654b046ea15e4344f306e8c22c049e69440d37317c2fc12793f47d7973a822ed080dea0c7ed83ab16b84c4aa6f8fe86fea6b2908cf497abac1e013b9c6f94bffc864c84277b8c0a28abc7423dc9c147e5ec58a5dd2ecb90dbb37f9c529bebe8273f204fc5e5cda85100229ee8175e8568fe162fb62243f81a40702c2335b1a373cf51d268b866f7c78a8aeedb5c6b6c417fb5d170faebb68a28a599a5208627a1c99a2afc2f582e6e628073af5e0d2aeb93d5f5934b3b8bb72fb8f726c758176361de294295237bccabf4e3b8edf9301b119ce062793a830f80b97bc3851cf4258aa413863b2148c7cff2f6157d992be61add223331b7c70f23b458ff1dcaa5e0058d639d5ceda37f246096de5e84fd266d30957708d14100e0949149784a0e5a9468baebc90e4ce7f72ef808871264f0146430e66f291c0ab346c3aef25d90bd11df158f2433498ddc0c1059b098c4288705da3c24bea9064e1223dd492af479f1c22e539c176dc2e769305c8572255589d476f4ce88f66ee94dff2297bb6e28b53c11c8cfd12fabe1fd120de33e333385089f4f9c7c88baf197faabd624488adc09f4a1ea743b8f369c5e7d19d80bf5907bc82e981ac18ca2d72c3241a7a2ba3e2bb624094d9a0aa1cd20acb202ca5557099c4cbc9d0e767f36c263c58e2348a2e5c9f28e9baf1762447e901a74a4da345b32c21f2ff8c38981bdde7ded633a72281b3c20b5b12ca9f7eb973e6b57a661bcfa0ff0ecf30baa630ce044d354c8cc1d54f4e8687ff30a440a9947836f721738e6d6f7a22cf63d6985063bf82fc7c94787296c7f91611ade8d84bd56e529086e91c1786a7a86ef1285487102b06f2dacd8874bc03a857b347682c4f067617f13dfbe336f49a85b14d243c6637305b3a270337f8694681fd47ec58baae4c21cf38299616f107cf6629c07ebdd0c05dc814fb1d62c5b79cfecee1236201ecba2184e859daa5ade724872ad90a974c09215d138a14292110a18f6ab88d4878af832bc4e1ad59538d25e3682da6f89510ccb49fb2e1df39a16182dea13ce86db59150466204405830564ac10e28debaee211e7d4658d97d1b9631a0d292f96f9ba3d6282bc2e1e758e7a42f7844ba3a2f18234f741dbd8bb275bb558d5887b1894a2b501363514fb0db4320bbb6e9fcee52cc87a316b8deb33ef51d0fe5f6c5341508c74e80a2d3416f8653810dfef522870bfbb1340bc161d341c08b0035e6caf29d1d95bcc592f042d11940df601ff78fe6ffb3e5f93a39ae8c5419ccc119bbf1364494b32bb704c276f9b215ba1402e52fce17860f3794cd11d0d4a08cbb7bd61a69e5e63361dea7e4ca724624d92aea003d4400004b367841cc7ef8bfce7cd60256dc43bf8bf8e6ad4719682de342c7b3bf50085110fc6a8d45651f03ac4ae81225050e055ff1493ccd7247d1c369744b34e360c26426a3337f10aa0ae72d3f770928325c1ab74025fb082a63c231f79c725cb547d5a5a4e107a5a49f9e15a05027bfabb49c51a82fdc33df0e2e2b3f9bfb5c5a5720e137c519c98bd45f012cc1a88b22a4a8ee79dbcc225ed724d52af9776d0f1417f352e90e120fd546d633f4c86851d08a68bef2237a40987af904247104c37c904d1a464bbbaa2bcdfcc67beb1f09dda9c4e38af41a8a70cc45559fb8f95014ee41890c33ba9a4f59fe807628c8cfe598603477a6e575e553b28aa0130d3c76cbbbb16f7ed66b7cfc4ba1d95c2edd50a651725827e2b2312b7e361f4bb79192c8f8da7f5fdb66bbe7ccbaa60699ca363768def95ce5290963c1650430bbfaf4f27f1c555a5384e4b875085b7ff64d9bdc8d68861763567686e65cf554d90a4d0407fef5a871896c2f777ed3477b226a53e74455a5be1d45aff51d0bfd5e193c0b3d9b03389c5da7f57bbdc9d6a48f89ac949895801a33c80ca76afcf1c6cb829d0437d6423cd362cb654be401d5e111f1f42da9832cdf4ccbbd8fd60f4886fbf223a08ec128621872918deb7450bd8cdc3ec9266c6f9218cef5d41444dd385ef8ce69f06626f0c6808311e5e96d7861029c0505ee7389219762c4121319643f7a73d58b7969792d7d94f3a337bb0bf1a6d47725e00b1f0b47f10a85c3990938318de3a38a819add345e9e7dc3331aa67aa36080949bc27297b8e826153b50979c409c6edec6f7d0527a60b0d8b20adf7c16988b0f2286d8680615908ec4b4e41c938ef875494ef11e9a3be472d7a00cbb60d5680ae1025be1cf184cd84e4d67d77e89db218eb25778d51c63432c3149d5ff5d839e85cd6dd9e4354a8c6665abc4058d8f760481a5d41bd0757b1e4d86e6fd61dda2c8f2a4a97f6f147f4d0cdf4ef583e15ee05248c656d4ee9521a0912fd2ef44c0d57c1306cc7047ee61930e8fd8897e6c4a15ba1da438091ca1c59cadd387ae6da8ef31dfbcd4db57821ba280b3657072ed0e7575a312c12c0544bea06be81626b5f5d6e5323deffe3afb276d9b6cca98667ff0028bea092fb63e5ffa17b2b55fe78d92b231a28bdbf5494232dfeba57ad1e8b70c28e246e83b48fe44a38bcefd80ad23855ef29d392a9fbaff0ba1b1a1745ab64cb20fc90cc2a18c5a92bea4aca54f8da159bf8773de31fcbd2110bfcd5727f7a577138ff275896437c145801c5c41782002a42c3cc4f4ebc818bc454117d5dc6aa959ecfc97bf036b105d18524aa4ccdb219d804da945707cea2b23254a54a0fbf6cdc9cc3dd7b3d3379bdd47b81199e31e63c13f5fe7fe2bc84ca5ea684887d5e123c64567077c91a0ab983aa68f1adc65f740d5d2cb008c5dfefd9a52dfde1d929183d1a0225dcf10178f279e1b74d0925a271e7a8b34a3e376a36347d44cc776a22558f321e9912bf246324b52e93e539bc42c535e2d26cd6f47f06e1459b9abec8f41f416ec5054e0f75b1da2eb21b205a8aa5bb02f075887df4d0fc41afdd4957d8784bf464b4095ca29e26f6106ea7c87850b03a1a053bffdaaecee8cb5d8e134ab941359282fc33e991acbaec0914b4b6ff\",\"cipherparams\":{\"iv\":\"be4b593fc68ad5f07ea93d1fd7cb78c1\"},\"kdf\":\"scrypt\",\"kdfparams\":{\"dklen\":48,\"n\":262144,\"p\":1,\"r\":8,\"salt\":\"cb3e21cbc10194f051eb8ed0c4e93ed37034f372ae5fe97eead2a0c264509fdd\"},\"mac\":\"32e4669de77d6dde08ad5078d0f00a95fd537021428484919606f460b7fda355\"},\"id\":\"034c9bd6-5903-4241-b7ec-a865c9140616\",\"version\":4}"
3
+ // 32-word encrypted JSON:
4
+ "{\"address\":\"38b12df2d4762a04a183f936c47747a1f13d0b0ba72066b43b4b6d7f776e9e25\",\"crypto\":{\"cipher\":\"aes-256-ctr\",\"ciphertext\":\"f1150d64e620bfad27af456777574dcfbc4581d966e1343f613e34fd2fafb7a1d3513fbfa330e31c98d5d55ebad21c83d880efbd919ade136e696d0808cd608adc7e8542241763c75599327f667d197dd1456a71e04d751545d84ca7fc0bea73281da371a3fcde40442350bc74868dd468f9420cbf8a661b62b3aebfe7d07607cdd48c446be4d4b235f48d6374239a395336b430d84c75fd6686dce7a5fc73b56aff0d979200d772a198585058627a9395683e81b64ffb69082c34d1ea934228031ae5cf58ff28a46c8e79261721eaf4973d0d2fec0c7d4bc7c4c367f4947d2f60f74b3ac45e031de1ae617e7c9f597b58bbf7cd991e17e60c0b7814ae395d2624cac82e37d698eaa0bb2ec101c079ba1242340d2d30e17f2e52f3b33615c43be1a679a6b0b84ec2379ef6d35b25c489fb1ec1a353ca2e89226fd154f4d956c18dd3a37f1eece50abbc7512869446235aa8ee91288df87aabc41fb6d4de0f78ecb4cd786f51982582f64bae269f07c49edc59ca4224dfd07a2548db99aa09aad972cdc69adcf95c3377f8d393068c1e5337cb5c67bb1c77aacf4780327fd99f0e08ebbd78c74b1e08fa9225a3e1b7654db04c528a9f99aaffce6216cbf0087e795281e83f2ac355ae678db4fc6c9281ab5023cd741c26d4e4f8ce9f79062d82ae6716bc493f7b886fd9a9239804156f5dbb2e8d2bb5d4ee00f9765fe269033d3fc987f307abf209a16615ba7d06083e8b4cca0f1db373aaba9604083f2e9588d44ecc067e91caf53379c23c466c0897c48ed31898a28c6393035a569e6f10d78dbd39b06538fb361d0d9efa83045f2560c3550310868491c4b2a414a29c84eb046e134bc364609a460c11e65c196ff58332f4944f272e02493e0b757bf615723a063879ebc3f1d8388c603e8e48610100a19a0d65b7d4d6a7a66028e3922c9b3f7f2809e21e45c650b289229c0e75242d927667711badc90d26148a6f0d1eecd4b1388d9e546e9bbd3db77da2127008e21472bff9c9ab321a1fb5e2a582b622767e24c307ed9116a786b3da32e86f3a8ea2a7b9efb74d42e31e5acbca13b4714d58d79045cda35d4a4511cddfd0f53f2890120d636c2ddcf83b094e34b4ec7ce174d70d4e538e8f1b764e79ddb6e74088e6fa2709e1ad58b6a85ad9b6d59e6b24f1226158637a7a6d3c9cb83b48efa0a2cc2411ca03b3ed9ed41312bed6db494ebe278006398aeff4f59b0f28d70ff2c06f04bde7d5a052ae2bec0f27023f184186f7217368b9d6bcaed43ad911df97987fe75ecefb0e1e72a68cf422e263508f6d29dda7ae161cc22d01bd5f06a31c4086a3bc31a46b257cdae8d973fa1aa657a91df9d09de05cd780d4456f70d31d405de08624d67c1f024dd881ca833f92ac43eeeb364bad35a8e4d0ce784932d9486a15873d8dfaced2054ea90eb06a87bd93f7c31d020e5886779b4351aeaff2ef4985ef9f5c37579b4e29caa05e53a85a4d26b57205aa0298c8c895ce6c02db62d5e040d8c8467488d838b59228a1b0041119523f1e276f626e781e40833b514e1aed1631e82150b288d709e3b08a467e461ec42363394e88ac29b25da2fe7a1c8ad590aa2f050a95a2b6146c85a57c1b4fe2d70e2014adf53316111d5f33d7c2dff4e820ce2e4b1dbecee9379b5dd75a5a9c001dd4ace550893c4c11cdbc5246e8d35a6051e95243b633c2ade6b3b9fd7713e80634061f61a21013470dfc6b1e3015565e49471f34603e685e183bb2bfebe638e56a50b9257a25bab31ec0ae7982ce3d24f6ea927866bdcb2cf5b2f0698cc3c19dbb5cbd5a6e77241ee19529d9ca6ae2cb5d1972cc532a6151917de047a0b09edfdbc1c4582aa18d3763039bb53eb2e3bd6da097ab422a8dece84fe42d48e0f0e6ea00c17b229d57bd297927c3f63862377746af81b72d0068686bcf59816ff6046550363348f269d8adbcc5b78b4534e800852ee7ff9a9c758091f6162c8578fd82bc4bbc3e2631a3546c912a1e52f46f62592c26a9d454934d7cd4d06de382fef4e14f10cb28ac729aaafaa519f3adf6b39c4d1d0017930747c9e2e4aca095843d1a8452946a788948c4b9908e273ca88944bb622f9bccac497a8617d9a00724c9ed2982cadafe080175bb9bc9a79240556475ef24e58ea66d8fcc8c5c49a9c0bf1aacc2864eb009343a63d9b40670b51c1725c082172d88c725ff087b174df461a347063e0e22cb4930ab1040dd611961f5ffffe225d4a2b24f896a13805149fd78cb491f4e0312123ac0d15c6ee7f708518096dee0ed5bcaa5f67bc2d5bdcb9efb9f1f46b30efa824286333f877f1839cb4e6e4c030b3804b92d59a10e6ec40afb26faaed876ffef323346712508ef988b92e9327612926599df66237252847b234f1ef2806b14c14c47c7b46f45699ca4d72ef44d3a3d5c41652fa4837be24c67c331d21ab7748df6dc8e09dc1a1c5fdb7c9c7b160a86f6b8a3d192533c1652c8f77b2cf62c199812ff24f3f8bc6833eb223910079dd6d6ae32642b64b1fbcbced19fd980ae8e4b3517972a6aff0ba75d8a0c13bf508e46b415f64d8a2afec8474f9296dd51df10e31b29526d0dabffbc752f426bb3bc7792c1681a780916e89322b16ce9678e57ea83a3febb606641c83773cef7e62a23c090f5c8d4d2355088ff070d29eedf5d420a06c62890353bf3fe8c8f1608f2da3b14dcf974bf208db17c3833dd9b4cd722dfcf4324737884ba68b93568a659cd97e5f33079f6fa0072659dd72b6f3cea3c5eff60bb5dcd470dff37703315cca7f8473a9f6ce8da98a799f73aba16843c7e4b719e2a59a2259c8afceea6c0ce5840b7a083ce44a5319fc6b8cc395c4e3bfc2e6719990f9ccd0ef6ab7b0597b2e2f515cf42a2bd163bc65e6f17a91dbbe7edec36935333b2a45a63c5b590a9f89cb830b60e375c5700ac019317b21252c9f7c035cd97bc31659a0b11188b931f7095549d7a75c925c466e2a40f9cc6993e15841b20b7b3a4638ef9994258258bbe4897e42f210840cee5a2aa14190a4e0d9d2df0782348e3bc4622c7ed6017d216a219e58b4db3439118d7287b356d27164fbaf1547ead778e8bd8356fff6bbd1c5fa5aa3e2c588d57b7dec9d43d379063d3fb8f0d22d927fdd8bb63fac594c95d085e5333dc5179c1ecaf70a938b94ae7852ff0626c412a5963eca6c118a11773564d2aef4dde6e28e98517cbc82814c35ed9547895feaf1165edac7adc10a33995f8cb4759c9ef5e143dc1f1703e5c9a7d9bf2c2434f3628989015bbb341cc19e18554cdbd968652e2fc0d744910e8965b9fc89ef73d69825efba63a8366a517d4c8b468d1746d7ead5b435220f72d4f167b5b1098f55b687a03682650cc18218d28b3a85b225bdb45b3f802a2e63dcfabdf9e960c3cae6f946ac89768d15dba6ba7ed2c7c3ec5a4478c188e8c4996b3cd8de105aeac0139f07e5598496e0f1ce85f031b4ce99e700a42a71a427a535bf8c7bf0d8fc2d6c40e0e6f4693bbd8541ed3a790f81e0e57ecc850271a4f906bdb6604a8f8c12acddf3a21d60a922f4b8be9b057dfce30a2f1eb66cb7976b20a03c018d908e63bf8b15604f60a65950be3b282f2f6004de0d2f6d1041e4e989bad8130dcab738a7b282e7902e6ef7331e5fb5d305b1878dbf9ade1520448da1b1c20ed5425e4ef575ab5dcb8b901f6f8b01da06cb0ff96dc395412fd9d220262467241ee3022178999a3a267fe8fc21dbae279091a9d461bd4171dd9f84c7a6548ea8b3933c56ff8b20780da7a28c000283ca37a22c3875d9b23344dfd18a32e9eed33f2f074711f4f4d584b7a628bcd30c64cbf954ff38ec011279ea3b26ea477effecb242d18ef90264382b71b4d2166944759be92ae469584ba5c8ee80b3d195cfefcba8f418a2f23407effd57f9659b6d064df986e47d672967fda1f2887eec92cf7f4fd301be4e433bab223aef99f16bb723c645f0ded550cd6e116b1eb3627416705051a6f93dea27691a3dcf4a9b4adb90ba15dd509600a0ae5fb8f457683236602d94239063b545aee1e60d43044e7cbc5f6abd6af47858c26a7b5a771f995d0a29ee6589eaab2a082e0278f42903db4c501670bc43dd217fd8ce4ac8a7fe39decd8a972d028a7992c40d7ddccf5d947ff3da8cf7a5243785e3fe3c117c3be41ce12855351153fdfb28033d0f6e1b300c12afc8ccd120ec4aac10434e84b0017853fcfcb319139cee85a17dbf50d92f62b81dea0457b868ade815423271fc37663044757a464ac5f4814655c3de4a97acd4552e0032ddd13e4e0bc4a2bcbfb6e0a996cd45e1debe55417749ab316da2e45e8b43d3cfb9a90d2b852673232d9a2db8cdc0c33e0418c316ab6943e1ec07698b1bd2baed86fd153330496c2c716911e733b0d012ddcbbaa92b9e1c81b76f8e875ddc0060ab48e13091626825f6d08e08c61405cff05c79f56b176b5b0a1f07f2ccd700220838f3e94629af9fa8ec2e2fd0b1900416b4061f40ba4632838dcd579932a100cca9e13adb9e483c49c595bf8e823706135bff86af374701a6a653ae42b1d4beb9ed2cd3d257ccdaaa67e4b48edca459adda55a02b51a7ee53c39e3d5f43cd5c7cf767339b17a49d7242e90ccc23d4f40906492c382a4715129bf8327e7bfb630d1453d1457ac74fa076d16a33e6d218a46e3d102ca89ae3fcc1e9699caa01fb7d3675da97822ec1ddeec73916fff3d3712202f7dca44951c04cb2b40a45e6778a922108e70873de68e0eab3d472f5071bd62aa265e856fb94123b829a2f24b0cc28b30fdc976e72c561b126b73913e3efceb448b9cc0761cd96099f6982808d0bd20eff4b5ceaf5dec5a4894597888be79dedcac9a2801047fe75b2c6fcd5e7fe2bde58b996799ad337305e97d9a5fd9c7d7eabf3ac55bcfb3f101df418d4bd13589ade573882316707d99d32864cf812f6d65e81ef2d8db4246dca20c1f6afd798227b7b287f4467f0a314dca531446698f525c73647f5f78404db7bb76ad1588a46a505d44aa2ad946e3868eaa1abbe5a8f1fa1a9ea046ab901dbe3e7b33c379250588991a73c830531212f125103008a1f83c5213c9e0fbde466d84815bdfe195b78cef4e4031a482038f006a0bba59176a4726b0b0c6baa65cda65051afa82cbe79cc628e4a84de7184a1cd876cde38652995aae76f47f1dac0e6e9774333765a39412ffc27c1d32a2fb8510c0f8607d1fd132aa6a3166b05937fc433b0e8b461a2a12de0bb44c630234cd390a0939c70d6096ce86690066fecd7a83c6e254b24875eeedc71e5539bfeb18d902da0cfb61350b638358fbb5a34df93a10dcf24d5516e94d72bd77b91b6dced292824b290d7b05d34ac193fb01f0f8ef094c131d15ce437d6726ad4fe150c995d1815ac334b9feca590d0da0caa9e1ffee98cdfaa3e2b0954f58262c0b659293d3ea62f68701ea944c21fbfa9c55ac68e3630e6e00b1b2a16a6d7401966d3e56b94a49b25b2913229ce841869ca50c12021c0329c0c9cec744c7671d857a3417420c509e5eb2905c0c9234f0b0ef5c52f4291d84ce87212a757785e834092d23ee5429eb06a3a6650543bb82e4166938975090b8fc40017042f46a84c468155a6758de67b5d60f749503b967a9b4c33a810fc7b8d051393d9afeab7b667bf04b650bbf567b8949339940c86e3f87f178040d3dc3eb7ae1db8f3d2f060ada65877882eacb41db6318bae81\",\"cipherparams\":{\"iv\":\"9112c979d0714fec065bcf3a12286cdc\"},\"kdf\":\"scrypt\",\"kdfparams\":{\"dklen\":48,\"n\":262144,\"p\":1,\"r\":8,\"salt\":\"c6407f65441a88ac325849d03cb1735045d36ae89f72be6fbfec3bf7bc12c6ce\"},\"mac\":\"96f08145cc161251c38a067c3dabb619d490b9596af198a7b321f7578618ec83\"},\"id\":\"5807a935-de7b-47e4-90bb-9655f41f6f31\",\"version\":4}"
5
+ // 36-word encrypted JSON:
6
+ "{\"address\":\"030e264c853bd859c53fae3ad6ef0e011dc799685e2b05d5efa7ac50f10ca075\",\"crypto\":{\"cipher\":\"aes-256-ctr\",\"ciphertext\":\"ac8f440b516e262c33da8049f5b2029420e17f494bc28f8e6513cf57ee4b80e45b45c74b173dce88eb038f8e332844b958f8e99e1e17a5130f15ee1d33f3ccf1443cb24cb944071eb52c4a9dacd0a057c79b0c5585515b357b95a58f725a15d5db5fa14b56386877e774c631b81eba6b9da9cd49cb6bfef77483a39e66b750e5247cc4061aadf39aeab5fdb2eacb3f110f47653dae37b9bc037f5ae0b839f63d8d76987a725f59fac52f3dbc5dcb85609a5edf91ae2ed2b93bd059507c9a52e072271dba93ccefe6c31ca7e480130cbde267be1b951e51fa1103ed02aa8e8704140d78aabc881ad2303963890efeb6b2ed8a554870f55804fc0abc5e3209d3f26d88a75f914bb6adb27732cf97b4ede7eb6912733baf2a1b064de1bc068244b5af6030b6d4e2ff6d3b90e507e3144fac2c122d13766687bf39a27aaa8617bf562294f0feeb2683a869d8aa0ce2e593a504d801a8efb2d3cf2ac3d179ee18ccb640ad3fbe017155af58de0efb505e92a592ec2ff7507d3b301abb15dfeb907929d394a88e3853d95d71998db67b2858422f0553a2d199cf0d7542a551013631c6e9e6f7f50692210d27cfffa0de6052e743683c2baf434ced0555f952d1c75651cef3983ed0b63312398a8b51792d403e6fd4e63a0e7b33af85b0106762fe993a0bddfad879f4d4df0cc4427bcb155ef178e752dfbb20cd019cd99fa34ca28d56978818f23507f1d8cda54bc61a089ab27d54bf8752b5f1396a62d32267d5b395fd81ed82cb409b9f3ff106ea5c02d2f76d7b0cff1059eaa09aca90e5772aca9e4591b3341fbb57a923189161e3a3d3d04f11752c27b777f37e2b635a00f5005c6613ba74ab0f30eefa681c1b45985bcc3902b15e4c3c2807ef57bd99b2f4ee1c201186997f8bb9e808c071e5b55fbcc41c8f59aa73c0025a947dd7f8ec3151234ff8ba92400bf2f4c4b6efe04ab8f69e7a97aba403da7d9d80a9ca3a1e37ffccf7c0f5142a2d172320cb7494f31185f5d03c104a6e064e5200116a36bd73c1e970eba07a6fa9ee4521cab6970836481b2c794014bb659db120b52506afca461a78234b2ecc351cce54442bac13aa63d00ad2f18133c8e194b70776717e46fac1841a334f8a428a978aa103d73384ff7129503baaa6ffd54fa831c5ef1dbbc6f4848e5392eb5fe3c55b156d337b6ff979d025fff584419b77764faa625107ae51c81b656ffc8013d92d9054ece9864020c41b26bbb82eb43e910271a6818578aad18af3c318c50e1173b5aa1a1da6665db5737c81b92d8aaa627695e3a54f991fbc265dc7bcbd986046879af4ebc33a717866c3cd72d8fb2040f1dc7aa802662e21c45124a7da662e60cc8313cd8af15d6bdddff45ce58d8fa43abbd28360af9c40a1c54050baede9768420201a41850a27ed4c365acefdaeffe05a999cd8d5c0e4d90a71b021bf4364f542dc1c69a7af7c3a699ba34196599e332b1cc0ed7c0b55a8144098c0866bb0cc53367d7cf2afcfedaaab57d3f27a3d02d81a020bdd7c303d7d7499d219efc1ed31e31a6cc6abd0a459d2d0acbaff73ed2554ddcad988fc0642dac9e7843cd4adb1da0a2916bede8cbe58d9c1dc0c694d6cefde366b5f7a16b0f428f034631e1109ed986f501592b9cea6d03cfe47bc083b4ac9947b4c707aebed45a141b8ee2caa02057e092c43cb6a8a07e63f24369cb7940f8a891886a918d9e6e07535e52841aa49ee658f536084378092b8e4719459d41cf504c7f57326c59239660a994a948a64fb8a3ff14f095314ba9692fc6a190bc80095756efd0f9c36c21cb68e8b810e08d0c1a5ae6cd481eb94d273ae3d4ac63492bf384aa5be4b941639eba1bb0c91b34454e46e4c9075e23ca84d161276ed9782f59725713ae432aed92e27fee17f0aee180dcdac8081e6c7c07dd74c94a155270213d145d8cf55b75a5bf8d3032b3755980d9f53f0b9c6cf214a064801b6e0ede9ed6fb8e12f9318ab199ae6478b079d212cb3143096c6333b568b661c52b7878603f7c31ddc62ec956396903cf80363e34295d757dcd77ec69d2c26376d7e2475c47210b150a0e308fc2ea8828eac028d87ae583354a51786c494d6013ba29bc53fc3a7c55617f855e61f5b654a97a33698ae6c442d96869c285c6be820478dde9d8d9c4a1b5173a6e2c1b9017de5ef9e17f60a35234293f06d7e9da894d59c981c3f8bb78b2ce322dbc5b84874495f4bb43b67089bc42767dfd2c8fc085e7d91de82928aa1ca0f39a5b1c294d802c5ce420446f250036cce31c6d3990d1485489d724b9c8e98e802b0dd9462793e0105213fbc15f443f4d7e952c944abe70607e7676b3cf98ace5e44b7335f89577e8eee278ebcb519b89394422ce20991107579e02c7ff92ddef526473bc9f1ddfcb85b13f8bd89909f98e76e613325dd625bee005ea813006bc222e49d6b04213e4b578e235bddd275ede15d64b33e216582914741c46e576bfee17a32c814a684005f14c3d5b5d930ce1b2a8541816852cd78fa4fd4e0a714a5000e8fce48ae265f0fee00c17d9ae4e8b7c5b658fe404eeea67e0335a33454035a44e094dbc0b87d0e7f3a9d749acd9f3eddcb78053f780dc726be7b0869c9a351c6a49d109d6a47568105f5950f4dd097edc3b24d263377559d63e7b84c4496f4241d433d4ca7f0a053211112e00de375c8873520878aef2834da20a89e7ec8e0db0251c89dd3ae91d6a0b2f7053069729680d2eb8914f6b3b621542a6b18451b7a0523f00d4cdd65f22a18406564c3037668dfd8fe526c0e8f21bd845e47ff14164ce9dc341c8ac2a5c4a659f6b03a727f4504d5850a9d2b20d7189278e05010283843d19c5f49d53da91c8aaa9ca68790a92446bdfc4a2ddbb7073d690c17be11014d3dee8dbe17cddedb734430923de708870808bd73178dc5f7b0c90aa927362d094c84298d886b2de5a78c96c302dc7d60fb93a3c285920a77cd441d47ae6d06620a384792a21b21dba45aaddf25ca81c6c955227b9c04d60d53f68f0d1b7d426a7148a9c7f2af881f1e6acccf9dcfd66255d48ed37151bbf00a2dc9addc675b5938c18288f3a9ef79984c099bc175e66f344c01d89d3956e4e211bf5bd808587635f15ad5e4c62c62ada4d378cdd39b14eebadb8bb834cc7807d90399545edaeced63a34840871d612f1bc881312e07a948bb59c4b2121b2e4b2204031538b0400aca600b581787147620371df7858e4038d56f560503eace27ed14c94fd0b9f201a528c210336720992e021008087cd5a3c6db74c1d3360f6931dd6e4e5e78512899ced4ad1db875b0774ee32acdac75be111250b59183ecf0c8c5d0e8de0d60c590411d8ce646a72c1124c80cd3b9ba795e28d45923c1450c74daf582aec932f6c0e300dae45e9d8179be8c9fde9eca834636bde22b453c58c28a4c32b725e07ca425328379df8d44db01b298f21e94ea321142a9cda4616793b72630ef719bece24b783d794a81b64bc23f67b114f4fae007dfbe9b2ff88fd65536d23630199ce999e7e766dac80b1173981b0b92061681926ee8501e269623a48017c9ff5ffd4b1e453ef6db6c9b0178535748ddcac1c783e6ac0072329c44708de43206e07470d0fc3751b4e6720a9bd80a5b38f349b53077730750289c772fde0465969b7c828ba4114b027df23f1eb1a9715de3bedfd6635a43d22c9aac1eb3e89554e4a2bf0bdc4a57772c11027ca8aa27aa93b9d2bac0df2a559c792d5c319aef6509074d3df6253eca487ab8af737b75b553c993c86e56dd54296d65253551944fcb7866db6a426d93a0e5f1e26fc9c2d5499fc505da17336c0a06a0072ba442581e70252a5d0f3fa08941a09d4f25d8b1e20ff39e759eef15e9108b4120946067848acc7c797086884617cd7bc6a4626a244635ee4de794b68e71df2481f2d7af719ea4a774fd9b100d716bd2c0b848f5bb9c5b45ad7a68221db646749e1008afb7667feea8473ed9ab4fe087e5682e5d88e678c4475a9ad6343241d3988865ff282813caeb800e322391186f2a64696149495a4b2d759a0562432b35a7b2ff75cf59fb659b5d81a2270d594da936fd36fa345d045e377c8f9a454af95780133c0c7c86b9f0666f4bf5debcce734ee60c6430f31a7453fef6a97939918b1cc21027605b52097de988e9230372829077631684779c91c0c38e22fe17c9930f26411ec8b5396c64ee9b6cbb86f3b404d9bd2d07243930678ae583ba6596e0adc3af157745c8ca296242e41e81edbb9ab67b9e5cbbe71f4c823380044203052d7894539aa7b6d0de0e6d8cefef3da0ab40fcd88ca7bc269c50e0d2a5813f52dbae1f75e650e4893a642587b81937ba77e75da0784d73b70257403b1f090b4802043fcadf06dd5d61d90db757c768198727e809e040e2f6ad0b414b82ded552446ec01ec668c3fa5d567664c93f7f3d09eaae9528471a969a5b6be8d654e41220dfa194b04253091dbee6c5391ae9737abe2e4629545bbfeac34e947b926cb36f4bd538af201f12c0ddbb30b79cac76993aed3a83d3f42ac1d72a713a463c8936d23becb713ffcdb5d91e075966c1229e9dfbe04a999633eab9cdcf20e028202a970a883142fc3b646ca0020757953f953f06a16309dc00095fd3b86350cdd90947f52a95d925b14ec7607a84cb04b60fe7ee5a064f668581e59a22783689e85c98aafdd2cb70584227fa557e293babdbe3e9e39806aa1a6e1c0d169b8137eec802e7bacbacf7095348d6c938f10a296d7a9ee48d3b5ec1061417db3f90663e1bef9d50e5ba562e97814660650791f76b6d4d2dbdd15929f71152d13fc9dc1d5542f5281f820e3bb58bf679baf4ea2093393af61c41c8e7f9a455bf9c3d6d2dadb2a19b17bc0caef4f1430fe78870baf6661a7a21a1782f9de14df59b4fcc367e027ad6584a3e83cbf219b3948b9903aa70bc5ed7fd520dc91eae754a761c63cd9e24c55e241f095886c7292714bce60829afd9f426c1071d25e1ce16323f707c4d3c886dbd5ef8040c11c0f5b8fde4127c4881d11f00ffac43997d8a370b009ac0f3644abcd961563ebe0d114988f73196bbb61a224453a53f112f60dab588b3b06a82f91d7456bc256db6ee56fec99d64176491a0d9d7e9e7d5183726ed8e6dc3bd32cba63a22659ca3cdf46c3b0f0b7e7415a033b6a6d77872ce08e24750485437e476fe8d8dfce19a91f51583415f7f9c062061920319d6fab87918b016f3e638b321cc9a9185147c1ce1462bcfbc41659f295b45d6c748c1321c114f4477fb0ef34b6520caa8e47b20d9cc3c504655d698f4f27ea6a76dda0b731b265137f0e8c494d33742543958fb5f8120954b2c84fb2cb2d62fe95603a965a9b7aeeb95b738c08328c65ce9abea656fe917e39407dc18c73dcad136c510c2ddcb59d4dd07ca6a9de26b2d70eedad2b5024dbac7bb46725f821f36989db629f171b2236b49faad59d3d4359b49b6a99eb97de4e95576aaec28fd93f30211ac77960982e5a930bb2c78674e5538fee014914e73adb9d0d0b76efd8c4d1a1645919a60e3f74694a892fef85e0a34a777ac8d2ebc2c2b336332b710edcaf7292cf534158cc9368ccf424d2671dd2dd8346813607a6126cfcaa48bd27129c329675bdf203a22a6b9b5aed23f76af3404e0f8222847a61ae14cfe770aa337aeefa319bdeb7771379a8957a04015586d3ae05856865f71182a7ac425cc620c407702d8f20d62a2d10a5dd25d7716c19f670dc775f3f0ddc00c3bab5539e8f699090dc1fb7edc4054d95b779f39352f3e3e89fbeaf43dd96986927afce1d86b294e82394cbe8f2d431f2164b8a8c278ae1d672dff40c2bd6648d89aad21cd04cdeaf54eaa1818bf7579b87d59d85a3559764caf9f4cc70ede0c4251848c1435988f34f51fe15866ebf611a5b5efdc63428a4d65567cb53492392184c969e6689af0a1462351411f8ee6139bb246ccaa39f136f1af857246ef771d46756a0dba5e019c9baaf5ff4a2bb3916aa34fbf8d99c83605b50ad4ef2d1a321c7273c29b77a87ae4784d6f6b424988e6c19ceb79e92ca570ff0459f0abd2e60792288d26fef1b8e9b3688a611466f4364fc7f01acc9da0ba215d6004870cc6347eef68ce7aaa30957c3099acf5e0e8f734d036a62bc8c4e09cbf4454989635ffa45747e3e41ff8d153b401a2d0425b807124d204db279550c4f8bf1f6ac400df189971202d0bc55dd4a8730b4178eea3bf44fd15e6d80e53264816670b2180acac08ad1d9d69a50de3a01d7411ad16bcf5826aba3fabe94ee08da44cc44e9d430ee8e5fba63208849128e14c1dd042894bd0ef25f91712e2cfa0ee8d1269635e76fb57366f95358d9548ac683f3d88b65461d122ade96717ce4a20a5ff88bb7e080679cff5c945770edfdeb6d02a1e1f4af0da941fcceabf20b6fbbca9706403362bb82caaf9b248d3fd90d448239b6959fa2d5a81ecbefddfdd94f135a85a84e8fb91a5965edb839f66fab787e471cd610c7d6312a8418672e451090236700c7eec8f4364362dc3ae1a7971254dba17e0fed27d86194d934d44a5d886fcd3e046f02cf9f61d17aaacba072f29804e9b5a96a97c4aef32a8243a6be531c812023b894c8167e0190ea20dcda4bb4fc54cc241881e43bac58d0373381ecd4189bfafc8c198364f57cfa2b3522bde699f87cf1bef07f42a494750782bbbfed61d96574ffa25dc2b88bd46aa994796f305dcfaeef4e135063ef8735c2404ea4f88e5d8ad07ff04aef6a957e7544eb7cfba54f16b6fad2a0bfe56fedacdd99f84671ac9b52d4b4cd066086ceb114a6bfff0869341a6a13d514a6b3d297422ad5f3f91b5a92761064176bfbf4c0f9fb53f915658c2f20001a215a7286cdae9838a055d2134393c4779c64468051d8882dd30a25dd63ed2f6f50e13943a2e137db248b019f60f239d32a54707aa00a1c154c6338839d3843e43d740821f9093bf30dcdaf82f26014e2c3b0583b56c7a341863e8c5f63b2ea580664ce14ba0aad66f4c3976cbc979513b9120af33787917f0f53ddba61a56155886b6332aac9b48094c37ca0b38d5a168bee1582b15400df4d2f5520433684937e29c64f9fc201eeae89c0d671899550f9d8868c5606047895597e44094f84231b32100a66155a8b3c9c594566a6035336cf97608bc7d4089dc90a60069c14e91655244e7652216161ae914ca52c61f48c68383a1ce27df112cc7c2c1b362f788832f4a15aa977e267e10decc6ec7860ca0cfbba329e4a10673467d6639b8b631aaa4dfa436bc32d6ba1154525d5618739763af8758d737a0f03087be22534377b36e0eb19a38cdc90e75b1952ccc1853b9473fe11593072fdccc810f55a648e5ffd30e83a7672117f92a46ef08143c38e23fc79f91afd17b6ce157ec06c10c42dbd54abb3f330186ea0741018cef541e741743ff1f8b127d1462bd674c6ef90afdef9ad58c88960f4203c64891bf7d1f1d6eadf6b4eabed90d2a16a907bdb03f5fa36fea4ccd99fc026f33560845d97ac26b3c3ad30143a639b5673fe44d07b90cd18fdddfc094aed20c39ae9f43811c3cd7a4dc6ca48284acaf291673b3e376cb8ef1ce039c63f080b93987510aa6a1fa882489cac2e4316e6b3cc379ca26d70beaca5ce1aede572e9a9f7b2d245ce768870744432e43da7892dc62315f32203396af1aff7d76fed5d0d1bb4d59a98d286f661c1b0bd58f0e98b79b93fd0dbcc32dc2648bcf3f3b1d885462ad586621e65dace206a4f5c02214c8e33c7a91c178817397a9f03e9cd3fd589a38c2b030b8c0ef64b9bebba55e9889a8afb2baac628eb4a2280e5e63ebbe3fae5a11aaf97df037dc263e4b2fca6bf459e04e7623edfc07c2d5ad362fbb8be48ea6eb428eb09a474a98dd9e214c6a5eb3f1a04a822cc473e08cab1216b0a3f91a74fc3fccb54497d19fa9a8a599489e6b6c4d055947132ca54ae95d06030290b98399be2cd9392eba9854500634d15947bdbcc9c1f0a20ffeb7cd0aff5ae2911b94781f58c127842e0514ee8117e8eaaf7d2c999d070441e31335480a10f32f7779c5c51d3b452d42d8fbba6d20a9ac27d36789e48edf93f92d0cca72995be1cb86a4c9424788e4f6cb0da3e4fd57cee4840a91b1e62c7f17cad31639006c4e9bccc9cac826d1e4cc4aa80c93093b8466a8809ccf25133d5784e63bcd3b85e54748b07508b0fdd291bddb919c6f4d279e48f79f3218e671c88f0a081f55bb2d12794d07db45aa104bdf5982ce798381b86f036f0c5141f7a86e7cc79804c615ebbce780bbbeb1bf1ae88d550f692ba6aa0d59d8abf326ad10c09335639e73414668ba1e4d212b5900e8f3bef8ecb1916f7c158deb70a38d5f62d587516642d7a5db66079d1ecf708390f84bfda3acadff8fd36082ed26c10e4fa0e4a1cdbc2eb6ef68786e13fef22c3280a133327fc4058e451633012cf15c253748af3541a6c3089e56a0b1f1eb66a7d646833dd1a0977b3d37a4a0dd9d1e7f0e35708e0827b34b839fce06eb95a2f3ad756a389243d74910d39ed5e1b2360389a78b46259e22f7ddb08d45d1432664243a3727bb2e2c0684a87fe00a3d179dffe84958bea7f8318c64e193266f28259642c6b0f852fc67ee54517cbcca87b1e6bc12c115b8257a7c5a7fb71b00edfd853b8447c26cbd2a80aa0d44e24c9e8d68ba3854629c382732ed15b172879f9d7ed0783be0bac700e5ccbfbea5d71ac012df9135953ab4e93865c0b52014194872db9c9823614846f0b9562adc7564648986e9ca4440c54b23dc012e692f8890998ee5454205d6ce48371bd3baa85dc3c30f6b8b03894d4711077bb949d529564e9b860643991b0e42eaccb74280b337f0e49263f1304b74f321401b0942e258efc74f7f07caf1550ccf449b66b72fdf2f36cc9df11baa0f74a5a7b0d67fa33524979f64645dde1e8e9c042c3c15a6f84dda6066c8f4311e754c63486a9f02669eb10a99893d4d27f160f3e60002a19e0704c742ac1c6c7484d6029b19cedec37733231cfdddb20e3fd2093fe7bcd4dfef556d66dc98c2be2b18f331ba6c265c8e32c98de88e2879ca9cdc08de5b4f631f944a85f035d41ee9a1f6fff8d7ff53a3d48e7912ffcbbb87860a8b0089f3f0a63a7d4aa26bf351e244359e8daf65f42bb89d49c2b784dd79b95b68d0bcc14948a57d34b55d07e9322be894823c3bbcd1ec672a9e7081952d0a298df14212278c1d9f940013e227b39df8ffce086da53c901b8b859240852865e66f2c3d4e60e8db85fb73952dea0c04fc41acd57f046de4beeb391a8ef60bbc07ecc43f0fcb6eb3163fbf0c6b88286f4fe8a633965a5bdcc23757462f6c8c016778f210833929169e59b5452e81a7f3e3e88cb274ba5ad386bb32db7171400fcd2515fbfb3c334db566964ac419539224d20c6c35fef1d46b3389dde3feda0d0eaee7009984e0f4e1bb12bba81f3b33537ae1dc2ccc881d0cbc2d2e5b728f1df09215255473ed13bad0b020e1e2933658c2b1d98cabb53e2fc4d3cc4d5023cb9e152788241ad42e10de4b2c170478a361b150081b1fc4413a3271c67f9429c6198f1e11d668be5aa079e06208ae830f69d9d32bdc9da3c2da9a5160861057b9ffac097f0556ca703d2cd088a1e9f624c7e2654ae01dce59ac5edbdea61f15c17c6ed0d255e833dd77ee316d260f5d7e34d9a5bd0c433af6c70ab607e142a16f67d51a91a2bc520c21f387ae980b19723e34c2e71cf4972cee1e22b707e09a5d99ae5c2a425b86fb40a56fc03248fe573ce94a93520bf02ce64c6f5131c80497cc0e146c4a24f24f1bd92675df016a3d0324ba88af12211631944f468b87c1cce54f24164312eb34ac8b4fdf91821fd788db1b60497e0a4f1d1139e8b8825435c0c9c3f911558be66664182c9a73c3a12e9eb707fb469c37d532c4404aac8933eb95dfc5e4a90477d63cc643d51f47dcc077f1c0f143e7fd14b699df5a97294fd948e8188994afd90d663341a0862dbf0bb6db05db34bf6f4e9a82c1ec1b9c1fa72100fe47497076417ceb955c51171b8036a86d14b187bf7468b3730998ea812dd18a28dea9e582f3d0fc002ab0a079681987a94ca83547e5da9bebacf624c8c650983968604d2e735bfab52f44857a6d16e9972a431dad397858e16f7069123d7533c1fa7d2a94ed31b51a128b947a323cf5f738921eeb7c2fe84aa98fe29c1fcfce980b0801302e8fa2f6ae9058460a9eac4715f526a8c42423aa43bb23c353f568759d5894d379031b3ef937962e7857b856d7409de3b05afcb211cf4233cca330d2e7ed0d233f33f49617c73b048867f253035923706820ecd952cad9ddae20a8de42e5220fb5a711056238e3f0c324686f220af6c0134f39d474d86b5f1da0b6844183d3891b8a975f26f28a400f8529ef41ad14eaa0c8bee558029a70758b2fafb7b5943bb09ad5cb2f5d3aea1a7f1e4c3e4d2c1f03df78bf5982528dae93e0dd0ca5dcf621d8a52ded75605e5b8f2f6b2a2db465e113f50c3ceadaee5eda62139f451d5f3126ade422a4a41b5e0bbdbd91558f80cdcfe10beaa0d3b8cdfba420c451c3cffd3ec1f46bfb013d3ff61b9891a97e8e74782f77047776944ba0291355ea5bd0b9fd5b55e9fb007d364dba87d924a4dbab0329f5279e793d63e231d694c07b7f2721f6d19982e41714b3e970d5fbc1f670d6aefbe428084f1a77c4c905142b09079c68be5fc1fb6fa2a1dd8524dd8addb27a66d32238be102d078d0684979b8b5bce9f6e5488763c1dac3fefc1422b85d8453159557b6af5c377d17eb4b1677283891b0e320b\",\"cipherparams\":{\"iv\":\"f3423dcfdcd537484e103840656b2faa\"},\"kdf\":\"scrypt\",\"kdfparams\":{\"dklen\":48,\"n\":262144,\"p\":1,\"r\":8,\"salt\":\"790fc3e2b43174738e71f689ee4d79ee2dd4d7294b56eb34fcdcc687ab2568cc\"},\"mac\":\"5cc38c1379f2e7a76306142e48c5d836f92343b13fcc7779fec455102214eb0b\"},\"id\":\"10734f67-4af8-4782-b905-9ae50758e966\",\"version\":4}"
@@ -0,0 +1,45 @@
1
+ /**
2
+ * One-off: encrypt 48/32/36 word phrase wallets with same test password and log JSON.
3
+ * Run: node test/unit/_log-encrypted-jsons.js
4
+ * Then paste the three outputs into address-wallet.test.js as TEST_ENCRYPTED_JSON_48, _32, _36.
5
+ */
6
+ const { Initialize } = require("../../config");
7
+ const qc = require("../../index");
8
+
9
+ const PASSWORD = "mySecurePassword123";
10
+ const TEST_SEED_WORDS = [
11
+ "cylamidal", "suculate", "sealmate", "radiploid", "equifaxis", "and", "antipoise", "stitchesy", "perelade", "lite",
12
+ "gourtarel", "thursat", "overdrome", "cogulate", "nonviva", "stewnut", "floribund", "enduivist", "decatary", "elvenwort",
13
+ "indoucate", "ravelent", "vocalus", "wetshirt", "rutatory", "percect", "breaktout", "corpation", "myricorus", "veofreat",
14
+ "junkard", "supercarp", "sukerus", "tautang", "facetype", "shishkin", "insulal", "hobstone", "stumbed", "tecutonic",
15
+ "jumplike", "hegwirth", "idea", "bhagatpur", "pavastava", "kukuluan", "mageiline", "extranite",
16
+ ];
17
+
18
+ const fs = require("fs");
19
+ const path = require("path");
20
+
21
+ async function main() {
22
+ await Initialize(null);
23
+ const w48 = qc.Wallet.fromPhrase(TEST_SEED_WORDS);
24
+ const w32 = qc.Wallet.fromPhrase(TEST_SEED_WORDS.slice(0, 32));
25
+ const w36 = qc.Wallet.fromPhrase(TEST_SEED_WORDS.slice(0, 36));
26
+ const json48 = w48.encryptSync(PASSWORD);
27
+ const json32 = w32.encryptSync(PASSWORD);
28
+ const json36 = w36.encryptSync(PASSWORD);
29
+ const out = [
30
+ "// 48-word encrypted JSON:",
31
+ JSON.stringify(json48),
32
+ "// 32-word encrypted JSON:",
33
+ JSON.stringify(json32),
34
+ "// 36-word encrypted JSON:",
35
+ JSON.stringify(json36),
36
+ ].join("\n");
37
+ const outPath = path.join(__dirname, "_encrypted-output.txt");
38
+ fs.writeFileSync(outPath, out, "utf8");
39
+ console.log("Wrote", outPath);
40
+ }
41
+
42
+ main().catch((e) => {
43
+ console.error(e);
44
+ process.exitCode = 1;
45
+ });
@@ -0,0 +1,16 @@
1
+ const fs = require("fs");
2
+ const path = require("path");
3
+ const lines = fs.readFileSync(path.join(__dirname, "_encrypted-output.txt"), "utf8").split(/\r?\n/);
4
+ const out = `/**
5
+ * Hardcoded encrypted keystores for 48/32/36 word phrase wallets.
6
+ * Generated by _log-encrypted-jsons.js (password: mySecurePassword123).
7
+ * WARNING: test-only; never use for real funds.
8
+ */
9
+ const TEST_ENCRYPTED_JSON_48 = ${lines[1].trim()};
10
+ const TEST_ENCRYPTED_JSON_32 = ${lines[3].trim()};
11
+ const TEST_ENCRYPTED_JSON_36 = ${lines[5].trim()};
12
+ module.exports = { TEST_ENCRYPTED_JSON_48, TEST_ENCRYPTED_JSON_32, TEST_ENCRYPTED_JSON_36 };
13
+ `;
14
+ fs.mkdirSync(path.join(__dirname, "fixtures"), { recursive: true });
15
+ fs.writeFileSync(path.join(__dirname, "fixtures", "encrypted-keystores-48-32-36.js"), out);
16
+ console.log("Wrote fixtures/encrypted-keystores-48-32-36.js");
@@ -1,98 +1,103 @@
1
- /**
2
- * @testCategory unit
3
- * @blockchainRequired false
4
- * @transactional false
5
- * @description ABI fragments + Interface (optional params, not-implemented stubs)
6
- */
7
-
8
- const { describe, it } = require("node:test");
9
- const assert = require("node:assert/strict");
10
-
11
- const { Initialize } = require("../../config");
12
- const qc = require("../../index");
13
-
14
- describe("ABI fragments", () => {
15
- it("Fragment defaults inputs/outputs and format ignores optional format param", () => {
16
- const f = new qc.Fragment({ type: "function", name: "foo" });
17
- assert.deepEqual(f.inputs, []);
18
- assert.deepEqual(f.outputs, []);
19
- assert.equal(typeof f.format(), "string");
20
- assert.equal(typeof f.format("full"), "string");
21
- assert.equal(f.format(null), f.format());
22
- });
23
- });
24
-
25
- describe("Interface", () => {
26
- it("constructor accepts null ABI and format ignores optional format param", () => {
27
- const i1 = new qc.Interface(null);
28
- assert.equal(i1.formatJson(), "[]");
29
- assert.equal(i1.format(), "[]");
30
- assert.equal(i1.format("full"), "[]");
31
- assert.equal(i1.format(null), "[]");
32
- });
33
-
34
- it("getFunction/getEvent/getError/getConstructor behave as expected", () => {
35
- const abi = [
36
- { type: "function", name: "foo", inputs: [], outputs: [] },
37
- { type: "event", name: "E", inputs: [], anonymous: false },
38
- { type: "error", name: "Bad", inputs: [] },
39
- { type: "constructor", inputs: [{ name: "x", type: "uint256" }] },
40
- ];
41
- const iface = new qc.Interface(abi);
42
- assert.ok(iface.getFunction("foo") instanceof qc.FunctionFragment);
43
- assert.ok(iface.getEvent("E") instanceof qc.EventFragment);
44
- assert.ok(iface.getError("Bad") instanceof qc.ErrorFragment);
45
- assert.ok(iface.getConstructor() instanceof qc.ConstructorFragment);
46
- assert.throws(() => iface.getFunction("missing"));
47
- });
48
-
49
- it("encodeFunctionData accepts values omitted vs null vs [] for zero-arg functions", async () => {
50
- await Initialize(null);
51
- const abi = [{ type: "function", name: "foo", inputs: [], outputs: [] }];
52
- const iface = new qc.Interface(abi);
53
-
54
- const a = iface.encodeFunctionData("foo");
55
- const b = iface.encodeFunctionData("foo", null);
56
- const c = iface.encodeFunctionData("foo", []);
57
- const d = iface.encodeFunctionData(iface.getFunction("foo"), []);
58
-
59
- assert.equal(typeof a, "string");
60
- assert.ok(a.startsWith("0x"));
61
- assert.equal(a, b);
62
- assert.equal(a, c);
63
- assert.equal(a, d);
64
- });
65
-
66
- it("encodeEventLog accepts values omitted vs null vs [] for zero-arg events", async () => {
67
- await Initialize(null);
68
- const abi = [{ type: "event", name: "E", inputs: [], anonymous: false }];
69
- const iface = new qc.Interface(abi);
70
-
71
- const a = iface.encodeEventLog("E");
72
- const b = iface.encodeEventLog("E", null);
73
- const c = iface.encodeEventLog("E", []);
74
-
75
- assert.ok(a && Array.isArray(a.topics));
76
- assert.equal(typeof a.data, "string");
77
- assert.deepEqual(a, b);
78
- assert.deepEqual(a, c);
79
- });
80
-
81
- it("not-implemented Interface methods throw NOT_IMPLEMENTED", () => {
82
- const iface = new qc.Interface([]);
83
- assert.throws(() => iface.parseTransaction(), (e) => e && e.code === "NOT_IMPLEMENTED");
84
- assert.throws(() => iface.parseError(), (e) => e && e.code === "NOT_IMPLEMENTED");
85
- assert.throws(() => iface.getSighash(), (e) => e && e.code === "NOT_IMPLEMENTED");
86
- assert.throws(() => iface.getEventTopic(), (e) => e && e.code === "NOT_IMPLEMENTED");
87
- assert.equal(iface.getFallback(), null);
88
- assert.equal(iface.getReceive(), null);
89
- });
90
- });
91
-
92
- describe("AbiCoder", () => {
93
- it("getDefaultValue returns array of nulls", () => {
94
- const coder = new qc.AbiCoder();
95
- assert.deepEqual(coder.getDefaultValue(["uint256", "bool"]), [null, null]);
96
- });
97
- });
98
-
1
+ /**
2
+ * @testCategory unit
3
+ * @blockchainRequired false
4
+ * @transactional false
5
+ * @description ABI fragments + Interface (optional params, not-implemented stubs)
6
+ */
7
+
8
+ const { describe, it } = require("node:test");
9
+ const assert = require("node:assert/strict");
10
+
11
+ const { Initialize } = require("../../config");
12
+ const qc = require("../../index");
13
+ const { logSuite, logTest } = require("../verbose-logger");
14
+
15
+ describe("ABI fragments", () => {
16
+ logSuite("ABI fragments");
17
+ it("Fragment defaults inputs/outputs and format ignores optional format param", () => {
18
+ logTest("Fragment defaults inputs/outputs and format ignores optional format param", {});
19
+ const f = new qc.Fragment({ type: "function", name: "foo" });
20
+ assert.deepEqual(f.inputs, []);
21
+ assert.deepEqual(f.outputs, []);
22
+ assert.equal(typeof f.format(), "string");
23
+ assert.equal(typeof f.format("full"), "string");
24
+ assert.equal(f.format(null), f.format());
25
+ });
26
+ });
27
+
28
+ describe("Interface", () => {
29
+ logSuite("Interface");
30
+ it("constructor accepts null ABI and format ignores optional format param", () => {
31
+ logTest("constructor accepts null ABI and format ignores optional format param", {});
32
+ const i1 = new qc.Interface(null);
33
+ assert.equal(i1.formatJson(), "[]");
34
+ assert.equal(i1.format(), "[]");
35
+ assert.equal(i1.format("full"), "[]");
36
+ assert.equal(i1.format(null), "[]");
37
+ });
38
+
39
+ it("getFunction/getEvent/getError/getConstructor behave as expected", () => {
40
+ const abi = [
41
+ { type: "function", name: "foo", inputs: [], outputs: [] },
42
+ { type: "event", name: "E", inputs: [], anonymous: false },
43
+ { type: "error", name: "Bad", inputs: [] },
44
+ { type: "constructor", inputs: [{ name: "x", type: "uint256" }] },
45
+ ];
46
+ const iface = new qc.Interface(abi);
47
+ assert.ok(iface.getFunction("foo") instanceof qc.FunctionFragment);
48
+ assert.ok(iface.getEvent("E") instanceof qc.EventFragment);
49
+ assert.ok(iface.getError("Bad") instanceof qc.ErrorFragment);
50
+ assert.ok(iface.getConstructor() instanceof qc.ConstructorFragment);
51
+ assert.throws(() => iface.getFunction("missing"));
52
+ });
53
+
54
+ it("encodeFunctionData accepts values omitted vs null vs [] for zero-arg functions", async () => {
55
+ await Initialize(null);
56
+ const abi = [{ type: "function", name: "foo", inputs: [], outputs: [] }];
57
+ const iface = new qc.Interface(abi);
58
+
59
+ const a = iface.encodeFunctionData("foo");
60
+ const b = iface.encodeFunctionData("foo", null);
61
+ const c = iface.encodeFunctionData("foo", []);
62
+ const d = iface.encodeFunctionData(iface.getFunction("foo"), []);
63
+
64
+ assert.equal(typeof a, "string");
65
+ assert.ok(a.startsWith("0x"));
66
+ assert.equal(a, b);
67
+ assert.equal(a, c);
68
+ assert.equal(a, d);
69
+ });
70
+
71
+ it("encodeEventLog accepts values omitted vs null vs [] for zero-arg events", async () => {
72
+ await Initialize(null);
73
+ const abi = [{ type: "event", name: "E", inputs: [], anonymous: false }];
74
+ const iface = new qc.Interface(abi);
75
+
76
+ const a = iface.encodeEventLog("E");
77
+ const b = iface.encodeEventLog("E", null);
78
+ const c = iface.encodeEventLog("E", []);
79
+
80
+ assert.ok(a && Array.isArray(a.topics));
81
+ assert.equal(typeof a.data, "string");
82
+ assert.deepEqual(a, b);
83
+ assert.deepEqual(a, c);
84
+ });
85
+
86
+ it("not-implemented Interface methods throw NOT_IMPLEMENTED", () => {
87
+ const iface = new qc.Interface([]);
88
+ assert.throws(() => iface.parseTransaction(), (e) => e && e.code === "NOT_IMPLEMENTED");
89
+ assert.throws(() => iface.parseError(), (e) => e && e.code === "NOT_IMPLEMENTED");
90
+ assert.throws(() => iface.getSighash(), (e) => e && e.code === "NOT_IMPLEMENTED");
91
+ assert.throws(() => iface.getEventTopic(), (e) => e && e.code === "NOT_IMPLEMENTED");
92
+ assert.equal(iface.getFallback(), null);
93
+ assert.equal(iface.getReceive(), null);
94
+ });
95
+ });
96
+
97
+ describe("AbiCoder", () => {
98
+ it("getDefaultValue returns array of nulls", () => {
99
+ const coder = new qc.AbiCoder();
100
+ assert.deepEqual(coder.getDefaultValue(["uint256", "bool"]), [null, null]);
101
+ });
102
+ });
103
+
@@ -0,0 +1,102 @@
1
+ /**
2
+ * @testCategory unit
3
+ * @blockchainRequired false
4
+ * @transactional false
5
+ * @description ABI fragments + Interface (optional params, not-implemented stubs)
6
+ */
7
+
8
+ import { describe, it } from "node:test";
9
+ import assert from "node:assert/strict";
10
+
11
+ import { Initialize } from "../../config";
12
+ import qc from "../../index";
13
+ import { logSuite, logTest } from "../verbose-logger";
14
+
15
+ describe("ABI fragments", () => {
16
+ logSuite("ABI fragments");
17
+ it("Fragment defaults inputs/outputs and format ignores optional format param", () => {
18
+ logTest("Fragment defaults inputs/outputs and format ignores optional format param", {});
19
+ const f = new qc.Fragment({ type: "function", name: "foo" });
20
+ assert.deepEqual(f.inputs, []);
21
+ assert.deepEqual(f.outputs, []);
22
+ assert.equal(typeof f.format(), "string");
23
+ assert.equal(typeof f.format("full"), "string");
24
+ assert.equal(f.format(null), f.format());
25
+ });
26
+ });
27
+
28
+ describe("Interface", () => {
29
+ logSuite("Interface");
30
+ it("constructor accepts null ABI and format ignores optional format param", () => {
31
+ logTest("constructor accepts null ABI and format ignores optional format param", {});
32
+ const i1 = new qc.Interface(null);
33
+ assert.equal(i1.formatJson(), "[]");
34
+ assert.equal(i1.format(), "[]");
35
+ assert.equal(i1.format("full"), "[]");
36
+ assert.equal(i1.format(null), "[]");
37
+ });
38
+
39
+ it("getFunction/getEvent/getError/getConstructor behave as expected", () => {
40
+ const abi = [
41
+ { type: "function", name: "foo", inputs: [], outputs: [] },
42
+ { type: "event", name: "E", inputs: [], anonymous: false },
43
+ { type: "error", name: "Bad", inputs: [] },
44
+ { type: "constructor", inputs: [{ name: "x", type: "uint256" }] },
45
+ ];
46
+ const iface = new qc.Interface(abi);
47
+ assert.ok(iface.getFunction("foo") instanceof qc.FunctionFragment);
48
+ assert.ok(iface.getEvent("E") instanceof qc.EventFragment);
49
+ assert.ok(iface.getError("Bad") instanceof qc.ErrorFragment);
50
+ assert.ok(iface.getConstructor() instanceof qc.ConstructorFragment);
51
+ assert.throws(() => iface.getFunction("missing"));
52
+ });
53
+
54
+ it("encodeFunctionData accepts values omitted vs null vs [] for zero-arg functions", async () => {
55
+ await Initialize(null);
56
+ const abi = [{ type: "function", name: "foo", inputs: [], outputs: [] }];
57
+ const iface = new qc.Interface(abi);
58
+
59
+ const a = iface.encodeFunctionData("foo");
60
+ const b = iface.encodeFunctionData("foo", null);
61
+ const c = iface.encodeFunctionData("foo", []);
62
+ const d = iface.encodeFunctionData(iface.getFunction("foo"), []);
63
+
64
+ assert.equal(typeof a, "string");
65
+ assert.ok(a.startsWith("0x"));
66
+ assert.equal(a, b);
67
+ assert.equal(a, c);
68
+ assert.equal(a, d);
69
+ });
70
+
71
+ it("encodeEventLog accepts values omitted vs null vs [] for zero-arg events", async () => {
72
+ await Initialize(null);
73
+ const abi = [{ type: "event", name: "E", inputs: [], anonymous: false }];
74
+ const iface = new qc.Interface(abi);
75
+
76
+ const a = iface.encodeEventLog("E");
77
+ const b = iface.encodeEventLog("E", null);
78
+ const c = iface.encodeEventLog("E", []);
79
+
80
+ assert.ok(a && Array.isArray(a.topics));
81
+ assert.equal(typeof a.data, "string");
82
+ assert.deepEqual(a, b);
83
+ assert.deepEqual(a, c);
84
+ });
85
+
86
+ it("not-implemented Interface methods throw NOT_IMPLEMENTED", () => {
87
+ const iface = new qc.Interface([]);
88
+ assert.throws(() => iface.parseTransaction(), (e: Error & { code?: string }) => e && e.code === "NOT_IMPLEMENTED");
89
+ assert.throws(() => iface.parseError(), (e: Error & { code?: string }) => e && e.code === "NOT_IMPLEMENTED");
90
+ assert.throws(() => iface.getSighash(), (e: Error & { code?: string }) => e && e.code === "NOT_IMPLEMENTED");
91
+ assert.throws(() => iface.getEventTopic(), (e: Error & { code?: string }) => e && e.code === "NOT_IMPLEMENTED");
92
+ assert.equal(iface.getFallback(), null);
93
+ assert.equal(iface.getReceive(), null);
94
+ });
95
+ });
96
+
97
+ describe("AbiCoder", () => {
98
+ it("getDefaultValue returns array of nulls", () => {
99
+ const coder = new qc.AbiCoder();
100
+ assert.deepEqual(coder.getDefaultValue(["uint256", "bool"]), [null, null]);
101
+ });
102
+ });