From 57bcb82f02cc3df947875edac8178b2250db56ad Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 8 Nov 2023 09:23:38 +0000 Subject: [PATCH 001/163] Bump undici from 5.19.1 to 5.27.2 Bumps [undici](https://github.com/nodejs/undici) from 5.19.1 to 5.27.2. - [Release notes](https://github.com/nodejs/undici/releases) - [Commits](https://github.com/nodejs/undici/compare/v5.19.1...v5.27.2) --- updated-dependencies: - dependency-name: undici dependency-type: indirect ... Signed-off-by: dependabot[bot] --- yarn.lock | 30 ++++++++++++++---------------- 1 file changed, 14 insertions(+), 16 deletions(-) diff --git a/yarn.lock b/yarn.lock index e65694553d..d92dd8748e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2522,6 +2522,11 @@ unique-filename "^1.1.1" which "^1.3.1" +"@fastify/busboy@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@fastify/busboy/-/busboy-2.0.0.tgz#f22824caff3ae506b18207bad4126dbc6ccdb6b8" + integrity sha512-JUFJad5lv7jxj926GPgymrWQxxjPYuJNiNjNMzqT+HiuP6Vl3dk5xzG+8sTX96np0ZAluvaMzPsjhHZ5rNuNQQ== + "@formatjs/ecma402-abstract@1.11.7": version "1.11.7" resolved "https://registry.yarnpkg.com/@formatjs/ecma402-abstract/-/ecma402-abstract-1.11.7.tgz#47f1a854f679f813d9baa1ee55adae94880ec706" @@ -9190,13 +9195,6 @@ builtins@^1.0.3: resolved "https://registry.yarnpkg.com/builtins/-/builtins-1.0.3.tgz#cb94faeb61c8696451db36534e1422f94f0aee88" integrity sha512-uYBjakWipfaO/bXI7E8rq6kpwHRZK5cNYrUv2OzZSI/FvmdMyXJ2tG9dKcjEC5YHmHpUAwsargWIZNWdxb/bnQ== -busboy@^1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/busboy/-/busboy-1.6.0.tgz#966ea36a9502e43cdb9146962523b92f531f6893" - integrity sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA== - dependencies: - streamsearch "^1.1.0" - byline@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/byline/-/byline-5.0.0.tgz#741c5216468eadc457b03410118ad77de8c1ddb1" @@ -23952,6 +23950,11 @@ rlp@^2.2.4: dependencies: bn.js "^5.2.0" +rlp@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/rlp/-/rlp-3.0.0.tgz#5a60725ca4314a3a165feecca1836e4f2c1e2343" + integrity sha512-PD6U2PGk6Vq2spfgiWZdomLvRGDreBLxi5jv5M8EpRo3pU6VEm31KO+HFxE18Q3vgqfDrQ9pZA3FP95rkijNKw== + rollup-plugin-copy@^3.4.0: version "3.4.0" resolved "https://registry.yarnpkg.com/rollup-plugin-copy/-/rollup-plugin-copy-3.4.0.tgz#f1228a3ffb66ffad8606e2f3fb7ff23141ed3286" @@ -25237,11 +25240,6 @@ stream-to-it@^0.2.0, stream-to-it@^0.2.1: dependencies: get-iterator "^1.0.2" -streamsearch@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-1.1.0.tgz#404dd1e2247ca94af554e841a8ef0eaa238da764" - integrity sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg== - streamx@^2.15.0: version "2.15.1" resolved "https://registry.yarnpkg.com/streamx/-/streamx-2.15.1.tgz#396ad286d8bc3eeef8f5cea3f029e81237c024c6" @@ -26736,11 +26734,11 @@ undertaker@^1.2.1: undertaker-registry "^1.0.0" undici@^5.14.0: - version "5.19.1" - resolved "https://registry.yarnpkg.com/undici/-/undici-5.19.1.tgz#92b1fd3ab2c089b5a6bd3e579dcda8f1934ebf6d" - integrity sha512-YiZ61LPIgY73E7syxCDxxa3LV2yl3sN8spnIuTct60boiiRaE1J8mNWHO8Im2Zi/sFrPusjLlmRPrsyraSqX6A== + version "5.27.2" + resolved "https://registry.yarnpkg.com/undici/-/undici-5.27.2.tgz#a270c563aea5b46cc0df2550523638c95c5d4411" + integrity sha512-iS857PdOEy/y3wlM3yRp+6SNQQ6xU0mmZcwRSriqk+et/cwWAtwmIGf6WkoDN2EK/AMdCO/dfXzIwi+rFMrjjQ== dependencies: - busboy "^1.6.0" + "@fastify/busboy" "^2.0.0" unicode-canonical-property-names-ecmascript@^2.0.0: version "2.0.0" From 14a75efafbced0fab73f3de15e52cfbc807df781 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 9 Nov 2023 10:49:52 +0000 Subject: [PATCH 002/163] Bump @babel/traverse from 7.16.3 to 7.23.3 Bumps [@babel/traverse](https://github.com/babel/babel/tree/HEAD/packages/babel-traverse) from 7.16.3 to 7.23.3. - [Release notes](https://github.com/babel/babel/releases) - [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md) - [Commits](https://github.com/babel/babel/commits/v7.23.3/packages/babel-traverse) --- updated-dependencies: - dependency-name: "@babel/traverse" dependency-type: indirect ... Signed-off-by: dependabot[bot] --- yarn.lock | 229 ++++++++++++++++++++++++------------------------------ 1 file changed, 102 insertions(+), 127 deletions(-) diff --git a/yarn.lock b/yarn.lock index d92dd8748e..8eda0561b1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -62,6 +62,14 @@ dependencies: "@babel/highlight" "^7.16.0" +"@babel/code-frame@^7.22.13": + version "7.22.13" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.22.13.tgz#e3c1c099402598483b7a8c46a721d1038803755e" + integrity sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w== + dependencies: + "@babel/highlight" "^7.22.13" + chalk "^2.4.2" + "@babel/compat-data@^7.17.7", "@babel/compat-data@^7.18.8", "@babel/compat-data@^7.19.1": version "7.19.1" resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.19.1.tgz#72d647b4ff6a4f82878d184613353af1dd0290f9" @@ -175,7 +183,7 @@ jsesc "^2.5.1" source-map "^0.5.0" -"@babel/generator@^7.15.8", "@babel/generator@^7.21.0", "@babel/generator@^7.21.1", "@babel/generator@^7.4.0", "@babel/generator@^7.7.2": +"@babel/generator@^7.15.8", "@babel/generator@^7.21.0", "@babel/generator@^7.4.0", "@babel/generator@^7.7.2": version "7.21.1" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.21.1.tgz#951cc626057bc0af2c35cd23e9c64d384dea83dd" integrity sha512-1lT45bAYlQhFn/BHivJs43AiW2rg3/UbLyShGfF3C0KmHvO5fSghWd5kBJy30kpRRucGzXStvnnCFniCR2kXAA== @@ -185,24 +193,6 @@ "@jridgewell/trace-mapping" "^0.3.17" jsesc "^2.5.1" -"@babel/generator@^7.16.0": - version "7.16.5" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.16.5.tgz#26e1192eb8f78e0a3acaf3eede3c6fc96d22bedf" - integrity sha512-kIvCdjZqcdKqoDbVVdt5R99icaRtrtYhYK/xux5qiWCBmfdvEYMFZ68QCrpE5cbFM1JsuArUNs1ZkuKtTtUcZA== - dependencies: - "@babel/types" "^7.16.0" - jsesc "^2.5.1" - source-map "^0.5.0" - -"@babel/generator@^7.19.0": - version "7.19.0" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.19.0.tgz#785596c06425e59334df2ccee63ab166b738419a" - integrity sha512-S1ahxf1gZ2dpoiFgA+ohK9DIpz50bJ0CWs7Zlzb54Z4sG8qmdIrGrVqmy1sAtTVRb+9CU6U8VqT9L0Zj7hxHVg== - dependencies: - "@babel/types" "^7.19.0" - "@jridgewell/gen-mapping" "^0.3.2" - jsesc "^2.5.1" - "@babel/generator@^7.19.3": version "7.19.3" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.19.3.tgz#d7f4d1300485b4547cb6f94b27d10d237b42bf59" @@ -221,6 +211,16 @@ "@jridgewell/gen-mapping" "^0.3.2" jsesc "^2.5.1" +"@babel/generator@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.23.3.tgz#86e6e83d95903fbe7613f448613b8b319f330a8e" + integrity sha512-keeZWAV4LU3tW0qRi19HRpabC/ilM0HRBBzf9/k8FFiG4KVpiv0FIy4hHfLfFQZNhziCTPTmd59zoyv6DNISzg== + dependencies: + "@babel/types" "^7.23.3" + "@jridgewell/gen-mapping" "^0.3.2" + "@jridgewell/trace-mapping" "^0.3.17" + jsesc "^2.5.1" + "@babel/helper-annotate-as-pure@^7.16.0": version "7.16.0" resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.0.tgz#9a1f0ebcda53d9a2d00108c4ceace6a5d5f1f08d" @@ -332,6 +332,11 @@ resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz#0c0cee9b35d2ca190478756865bb3528422f51be" integrity sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg== +"@babel/helper-environment-visitor@^7.22.20": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz#96159db61d34a29dba454c959f5ae4a649ba9167" + integrity sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA== + "@babel/helper-explode-assignable-expression@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz#41f8228ef0a6f1a036b8dfdfec7ce94f9a6bc096" @@ -356,13 +361,13 @@ "@babel/template" "^7.18.10" "@babel/types" "^7.19.0" -"@babel/helper-function-name@^7.21.0": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz#d552829b10ea9f120969304023cd0645fa00b1b4" - integrity sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg== +"@babel/helper-function-name@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz#1f9a3cdbd5b2698a670c30d2735f9af95ed52759" + integrity sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw== dependencies: - "@babel/template" "^7.20.7" - "@babel/types" "^7.21.0" + "@babel/template" "^7.22.15" + "@babel/types" "^7.23.0" "@babel/helper-get-function-arity@^7.16.0": version "7.16.0" @@ -371,13 +376,6 @@ dependencies: "@babel/types" "^7.16.0" -"@babel/helper-hoist-variables@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.0.tgz#4c9023c2f1def7e28ff46fc1dbcd36a39beaa81a" - integrity sha512-1AZlpazjUR0EQZQv3sgRNfM9mEVWPK3M6vlalczA+EECcPz3XPh6VplbErL5UoMpChhSck5wAJHthlj1bYpcmg== - dependencies: - "@babel/types" "^7.16.0" - "@babel/helper-hoist-variables@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz#d4d2c8fb4baeaa5c68b99cc8245c56554f926678" @@ -385,6 +383,13 @@ dependencies: "@babel/types" "^7.18.6" +"@babel/helper-hoist-variables@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz#c01a007dac05c085914e8fb652b339db50d823bb" + integrity sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw== + dependencies: + "@babel/types" "^7.22.5" + "@babel/helper-member-expression-to-functions@^7.16.0": version "7.16.0" resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.16.0.tgz#29287040efd197c77636ef75188e81da8bccd5a4" @@ -571,6 +576,13 @@ dependencies: "@babel/types" "^7.18.6" +"@babel/helper-split-export-declaration@^7.22.6": + version "7.22.6" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz#322c61b7310c0997fe4c323955667f18fcefb91c" + integrity sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g== + dependencies: + "@babel/types" "^7.22.5" + "@babel/helper-string-parser@^7.18.10": version "7.18.10" resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.18.10.tgz#181f22d28ebe1b3857fa575f5c290b1aaf659b56" @@ -581,6 +593,11 @@ resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz#38d3acb654b4701a9b77fb0615a96f775c3a9e63" integrity sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw== +"@babel/helper-string-parser@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz#533f36457a25814cf1df6488523ad547d784a99f" + integrity sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw== + "@babel/helper-validator-identifier@^7.15.7": version "7.15.7" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz#220df993bfe904a4a6b02ab4f3385a5ebf6e2389" @@ -591,6 +608,11 @@ resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz#7eea834cf32901ffdc1a7ee555e2f9c27e249ca2" integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w== +"@babel/helper-validator-identifier@^7.22.20": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0" + integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A== + "@babel/helper-validator-option@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz#bf0d2b5a509b1f336099e4ff36e1a63aa5db4db8" @@ -651,22 +673,31 @@ chalk "^2.0.0" js-tokens "^4.0.0" +"@babel/highlight@^7.22.13": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.22.20.tgz#4ca92b71d80554b01427815e06f2df965b9c1f54" + integrity sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg== + dependencies: + "@babel/helper-validator-identifier" "^7.22.20" + chalk "^2.4.2" + js-tokens "^4.0.0" + "@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.21.0", "@babel/parser@^7.7.0": version "7.21.1" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.21.1.tgz#a8f81ee2fe872af23faea4b17a08fcc869de7bcc" integrity sha512-JzhBFpkuhBNYUY7qs+wTzNmyCWUHEaAFpQQD2YfU1rPL38/L43Wvid0fFkiOCnHvsGncRZgEPyGnltABLcVDTg== -"@babel/parser@^7.15.8", "@babel/parser@^7.21.2", "@babel/parser@^7.4.3": +"@babel/parser@^7.15.8", "@babel/parser@^7.4.3": version "7.21.2" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.21.2.tgz#dacafadfc6d7654c3051a66d6fe55b6cb2f2a0b3" integrity sha512-URpaIJQwEkEC2T9Kn+Ai6Xe/02iNaVCuT/PtoRz3GPVJVDpPd7mLo+VddTbhCRU9TXqW5mSrQfXZyi8kDKOVpQ== -"@babel/parser@^7.16.0", "@babel/parser@^7.16.3": +"@babel/parser@^7.16.0": version "7.16.6" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.16.6.tgz#8f194828193e8fa79166f34a4b4e52f3e769a314" integrity sha512-Gr86ujcNuPDnNOY8mi383Hvi8IYrJVJYuf3XcuBM/Dgd+bINn/7tHqsj+tKkoreMbmGsFLsltI/JJd8fOFWGDQ== -"@babel/parser@^7.18.10", "@babel/parser@^7.19.1": +"@babel/parser@^7.18.10": version "7.19.1" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.19.1.tgz#6f6d6c2e621aad19a92544cc217ed13f1aac5b4c" integrity sha512-h7RCSorm1DdTVGJf3P2Mhj3kdnkmF/EiysUkzS2TdgAYqyjFdMQJbVuXOBej2SBJaXan/lIVtT6KkGbyyq753A== @@ -681,6 +712,11 @@ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.19.6.tgz#b923430cb94f58a7eae8facbffa9efd19130e7f8" integrity sha512-h1IUp81s2JYJ3mRkdxJgs4UvmSsRvDrx5ICSJbPvtWYv5i1nTBGcBpnog+89rAFMwvvru6E5NUHdBe01UeSzYA== +"@babel/parser@^7.22.15", "@babel/parser@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.23.3.tgz#0ce0be31a4ca4f1884b5786057cadcb6c3be58f9" + integrity sha512-uVsWNvlVsIninV2prNz/3lHCb+5CJ+e+IUBfbjToAHODtfGYLfCFuY4AU7TskI+dAKk+njsPiBjq1gKTvZOBaw== + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz#da5b8f9a580acdfbe53494dba45ea389fb09a4d2" @@ -1658,98 +1694,28 @@ "@babel/parser" "^7.18.10" "@babel/types" "^7.18.10" -"@babel/traverse@^7.15.4", "@babel/traverse@^7.21.2", "@babel/traverse@^7.4.3": - version "7.21.2" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.21.2.tgz#ac7e1f27658750892e815e60ae90f382a46d8e75" - integrity sha512-ts5FFU/dSUPS13tv8XiEObDu9K+iagEKME9kAbaP7r0Y9KtZJZ+NGndDvWoRAYNpeWafbpFeki3q9QoMD6gxyw== - dependencies: - "@babel/code-frame" "^7.18.6" - "@babel/generator" "^7.21.1" - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-function-name" "^7.21.0" - "@babel/helper-hoist-variables" "^7.18.6" - "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/parser" "^7.21.2" - "@babel/types" "^7.21.2" - debug "^4.1.0" - globals "^11.1.0" - -"@babel/traverse@^7.16.0": - version "7.16.3" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.16.3.tgz#f63e8a938cc1b780f66d9ed3c54f532ca2d14787" - integrity sha512-eolumr1vVMjqevCpwVO99yN/LoGL0EyHiLO5I043aYQvwOJ9eR5UsZSClHVCzfhBduMAsSzgA/6AyqPjNayJag== - dependencies: - "@babel/code-frame" "^7.16.0" - "@babel/generator" "^7.16.0" - "@babel/helper-function-name" "^7.16.0" - "@babel/helper-hoist-variables" "^7.16.0" - "@babel/helper-split-export-declaration" "^7.16.0" - "@babel/parser" "^7.16.3" - "@babel/types" "^7.16.0" - debug "^4.1.0" - globals "^11.1.0" - -"@babel/traverse@^7.19.0", "@babel/traverse@^7.19.1": - version "7.19.1" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.19.1.tgz#0fafe100a8c2a603b4718b1d9bf2568d1d193347" - integrity sha512-0j/ZfZMxKukDaag2PtOPDbwuELqIar6lLskVPPJDjXMXjfLb1Obo/1yjxIGqqAJrmfaTIY3z2wFLAQ7qSkLsuA== - dependencies: - "@babel/code-frame" "^7.18.6" - "@babel/generator" "^7.19.0" - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-function-name" "^7.19.0" - "@babel/helper-hoist-variables" "^7.18.6" - "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/parser" "^7.19.1" - "@babel/types" "^7.19.0" - debug "^4.1.0" - globals "^11.1.0" - -"@babel/traverse@^7.19.3": - version "7.19.3" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.19.3.tgz#3a3c5348d4988ba60884e8494b0592b2f15a04b4" - integrity sha512-qh5yf6149zhq2sgIXmwjnsvmnNQC2iw70UFjp4olxucKrWd/dvlUsBI88VSLUsnMNF7/vnOiA+nk1+yLoCqROQ== - dependencies: - "@babel/code-frame" "^7.18.6" - "@babel/generator" "^7.19.3" - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-function-name" "^7.19.0" - "@babel/helper-hoist-variables" "^7.18.6" - "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/parser" "^7.19.3" - "@babel/types" "^7.19.3" - debug "^4.1.0" - globals "^11.1.0" - -"@babel/traverse@^7.19.4", "@babel/traverse@^7.19.6": - version "7.19.6" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.19.6.tgz#7b4c865611df6d99cb131eec2e8ac71656a490dc" - integrity sha512-6l5HrUCzFM04mfbG09AagtYyR2P0B71B1wN7PfSPiksDPz2k5H9CBC1tcZpz2M8OxbKTPccByoOJ22rUKbpmQQ== - dependencies: - "@babel/code-frame" "^7.18.6" - "@babel/generator" "^7.19.6" - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-function-name" "^7.19.0" - "@babel/helper-hoist-variables" "^7.18.6" - "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/parser" "^7.19.6" - "@babel/types" "^7.19.4" - debug "^4.1.0" - globals "^11.1.0" - -"@babel/traverse@^7.21.0", "@babel/traverse@^7.7.0", "@babel/traverse@^7.7.2": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.21.0.tgz#0e1807abd5db98e6a19c204b80ed1e3f5bca0edc" - integrity sha512-Xdt2P1H4LKTO8ApPfnO1KmzYMFpp7D/EinoXzLYN/cHcBNrVCAkAtGUcXnHXrl/VGktureU6fkQrHSBE2URfoA== - dependencies: - "@babel/code-frame" "^7.18.6" - "@babel/generator" "^7.21.0" - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-function-name" "^7.21.0" - "@babel/helper-hoist-variables" "^7.18.6" - "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/parser" "^7.21.0" - "@babel/types" "^7.21.0" +"@babel/template@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.22.15.tgz#09576efc3830f0430f4548ef971dde1350ef2f38" + integrity sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w== + dependencies: + "@babel/code-frame" "^7.22.13" + "@babel/parser" "^7.22.15" + "@babel/types" "^7.22.15" + +"@babel/traverse@^7.15.4", "@babel/traverse@^7.16.0", "@babel/traverse@^7.19.0", "@babel/traverse@^7.19.1", "@babel/traverse@^7.19.3", "@babel/traverse@^7.19.4", "@babel/traverse@^7.19.6", "@babel/traverse@^7.21.0", "@babel/traverse@^7.21.2", "@babel/traverse@^7.4.3", "@babel/traverse@^7.7.0", "@babel/traverse@^7.7.2": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.23.3.tgz#26ee5f252e725aa7aca3474aa5b324eaf7908b5b" + integrity sha512-+K0yF1/9yR0oHdE0StHuEj3uTPzwwbrLGfNOndVJVV2TqA5+j3oljJUb4nmB954FLGjNem976+B+eDuLIjesiQ== + dependencies: + "@babel/code-frame" "^7.22.13" + "@babel/generator" "^7.23.3" + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-function-name" "^7.23.0" + "@babel/helper-hoist-variables" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + "@babel/parser" "^7.23.3" + "@babel/types" "^7.23.3" debug "^4.1.0" globals "^11.1.0" @@ -1815,6 +1781,15 @@ "@babel/helper-validator-identifier" "^7.19.1" to-fast-properties "^2.0.0" +"@babel/types@^7.22.15", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.23.3.tgz#d5ea892c07f2ec371ac704420f4dcdb07b5f9598" + integrity sha512-OZnvoH2l8PK5eUvEcUyCt/sXgr/h+UWpVuBbOljwcrAgUl6lpchoQ++PHGyQy1AtYnVA6CEq3y5xeEI10brpXw== + dependencies: + "@babel/helper-string-parser" "^7.22.5" + "@babel/helper-validator-identifier" "^7.22.20" + to-fast-properties "^2.0.0" + "@bcoe/v8-coverage@^0.2.3": version "0.2.3" resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" From 551c31768db7b352331e3f263a5371942aafd67d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 9 Nov 2023 10:59:42 +0000 Subject: [PATCH 003/163] Bump browserify-sign from 4.2.1 to 4.2.2 Bumps [browserify-sign](https://github.com/crypto-browserify/browserify-sign) from 4.2.1 to 4.2.2. - [Changelog](https://github.com/browserify/browserify-sign/blob/main/CHANGELOG.md) - [Commits](https://github.com/crypto-browserify/browserify-sign/compare/v4.2.1...v4.2.2) --- updated-dependencies: - dependency-name: browserify-sign dependency-type: indirect ... Signed-off-by: dependabot[bot] --- yarn.lock | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/yarn.lock b/yarn.lock index 8eda0561b1..aad7e718b2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8867,7 +8867,7 @@ browserify-reload@^1.0.3: chokidar "^1.6.0" ws "^1.1.1" -browserify-rsa@^4.0.0, browserify-rsa@^4.0.1: +browserify-rsa@^4.0.0, browserify-rsa@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.1.0.tgz#b2fd06b5b75ae297f7ce2dc651f918f5be158c8d" integrity sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog== @@ -8876,19 +8876,19 @@ browserify-rsa@^4.0.0, browserify-rsa@^4.0.1: randombytes "^2.0.1" browserify-sign@^4.0.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.2.1.tgz#eaf4add46dd54be3bb3b36c0cf15abbeba7956c3" - integrity sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg== + version "4.2.2" + resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.2.2.tgz#e78d4b69816d6e3dd1c747e64e9947f9ad79bc7e" + integrity sha512-1rudGyeYY42Dk6texmv7c4VcQ0EsvVbLwZkA+AQB7SxvXxmcD93jcHie8bzecJ+ChDlmAm2Qyu0+Ccg5uhZXCg== dependencies: - bn.js "^5.1.1" - browserify-rsa "^4.0.1" + bn.js "^5.2.1" + browserify-rsa "^4.1.0" create-hash "^1.2.0" create-hmac "^1.1.7" - elliptic "^6.5.3" + elliptic "^6.5.4" inherits "^2.0.4" - parse-asn1 "^5.1.5" - readable-stream "^3.6.0" - safe-buffer "^5.2.0" + parse-asn1 "^5.1.6" + readable-stream "^3.6.2" + safe-buffer "^5.2.1" browserify-wrap@^1.0.1: version "1.0.2" @@ -21349,7 +21349,7 @@ parents@^1.0.0, parents@^1.0.1: dependencies: path-platform "~0.11.15" -parse-asn1@^5.0.0, parse-asn1@^5.1.5: +parse-asn1@^5.0.0, parse-asn1@^5.1.6: version "5.1.6" resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.6.tgz#385080a3ec13cb62a62d39409cb3e88844cdaed4" integrity sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw== @@ -23205,7 +23205,7 @@ readable-stream@2.2.9, readable-stream@~2.2.9: string_decoder "~1.0.0" util-deprecate "~1.0.1" -readable-stream@^3.6.0: +readable-stream@^3.6.0, readable-stream@^3.6.2: version "3.6.2" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== From 42d7a6b6842a4c1fc66045817a8ff55d82b51e18 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 1 Nov 2023 10:14:41 +0000 Subject: [PATCH 004/163] Bump postcss from 8.4.16 to 8.4.31 Bumps [postcss](https://github.com/postcss/postcss) from 8.4.16 to 8.4.31. - [Release notes](https://github.com/postcss/postcss/releases) - [Changelog](https://github.com/postcss/postcss/blob/main/CHANGELOG.md) - [Commits](https://github.com/postcss/postcss/compare/8.4.16...8.4.31) --- updated-dependencies: - dependency-name: postcss dependency-type: indirect ... Signed-off-by: dependabot[bot] --- yarn.lock | 27 +++++++++------------------ 1 file changed, 9 insertions(+), 18 deletions(-) diff --git a/yarn.lock b/yarn.lock index aad7e718b2..33e1721e5b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -19812,10 +19812,10 @@ nanoid@^3.0.2, nanoid@^3.1.3: resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.29.tgz#214fb2d7a33e1a5bef4757b779dfaeb6a4e5aeb4" integrity sha512-dW2pUSGZ8ZnCFIlBIA31SV8huOGCHb6OwzVCc7A69rb/a+SgPBwfmLvK5TKQ3INPbRkcI8a/Owo0XbiTNH19wg== -nanoid@^3.3.4: - version "3.3.4" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.4.tgz#730b67e3cd09e2deacf03c027c81c9d9dbc5e8ab" - integrity sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw== +nanoid@^3.3.6: + version "3.3.6" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.6.tgz#443380c856d6e9f9824267d960b4236ad583ea4c" + integrity sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA== nanomatch@^1.2.9: version "1.2.13" @@ -22168,21 +22168,12 @@ postcss-value-parser@^4.2.0: resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== -postcss@^8.3.5, postcss@^8.4.14, postcss@^8.4.7: - version "8.4.16" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.16.tgz#33a1d675fac39941f5f445db0de4db2b6e01d43c" - integrity sha512-ipHE1XBvKzm5xI7hiHCZJCSugxvsdq2mPnsq5+UF+VHCjiBvtDrlxJfMBToWaP9D5XlgNmcFGqoHmUn0EYEaRQ== +postcss@^8.3.5, postcss@^8.4.14, postcss@^8.4.17, postcss@^8.4.7: + version "8.4.31" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.31.tgz#92b451050a9f914da6755af352bdc0192508656d" + integrity sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ== dependencies: - nanoid "^3.3.4" - picocolors "^1.0.0" - source-map-js "^1.0.2" - -postcss@^8.4.17: - version "8.4.21" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.21.tgz#c639b719a57efc3187b13a1d765675485f4134f4" - integrity sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg== - dependencies: - nanoid "^3.3.4" + nanoid "^3.3.6" picocolors "^1.0.0" source-map-js "^1.0.2" From b229b3c99779898e5d8fb24d054df77632d3f259 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 26 Oct 2023 13:05:53 +0000 Subject: [PATCH 005/163] Bump get-func-name from 2.0.0 to 2.0.2 Bumps [get-func-name](https://github.com/chaijs/get-func-name) from 2.0.0 to 2.0.2. - [Release notes](https://github.com/chaijs/get-func-name/releases) - [Commits](https://github.com/chaijs/get-func-name/commits/v2.0.2) --- updated-dependencies: - dependency-name: get-func-name dependency-type: indirect ... Signed-off-by: dependabot[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 33e1721e5b..23bcb1d27b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -14093,9 +14093,9 @@ get-caller-file@^2.0.1, get-caller-file@^2.0.5: integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== get-func-name@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41" - integrity sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig== + version "2.0.2" + resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.2.tgz#0d7cf20cd13fda808669ffa88f4ffc7a3943fc41" + integrity sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ== get-intrinsic@^1.0.1, get-intrinsic@^1.1.3: version "1.1.3" From 033dc94992f4e061f940498799a13a473c52551d Mon Sep 17 00:00:00 2001 From: aniket-engg Date: Thu, 9 Nov 2023 16:17:49 +0530 Subject: [PATCH 006/163] template --- .../src/templates/hashchecker/README.txt | 10 ++ .../hashchecker/circuits/calculateHash.circom | 41 +++++ .../src/templates/hashchecker/index.ts | 14 ++ .../hashchecker/scripts/run_setup.ts | 72 ++++++++ .../hashchecker/scripts/run_verification.ts | 74 ++++++++ .../templates/groth16_verifier.sol.ejs | 165 ++++++++++++++++++ 6 files changed, 376 insertions(+) create mode 100644 libs/remix-ws-templates/src/templates/hashchecker/README.txt create mode 100644 libs/remix-ws-templates/src/templates/hashchecker/circuits/calculateHash.circom create mode 100644 libs/remix-ws-templates/src/templates/hashchecker/index.ts create mode 100644 libs/remix-ws-templates/src/templates/hashchecker/scripts/run_setup.ts create mode 100644 libs/remix-ws-templates/src/templates/hashchecker/scripts/run_verification.ts create mode 100644 libs/remix-ws-templates/src/templates/hashchecker/templates/groth16_verifier.sol.ejs diff --git a/libs/remix-ws-templates/src/templates/hashchecker/README.txt b/libs/remix-ws-templates/src/templates/hashchecker/README.txt new file mode 100644 index 0000000000..1ba1c46b22 --- /dev/null +++ b/libs/remix-ws-templates/src/templates/hashchecker/README.txt @@ -0,0 +1,10 @@ +CIRCOM ZKP Hash Checker WORKSPACE + +Welcome to the Remix Circom ZKP Hash Checker Workspace. + +The workspace comprises two main directories: + +- circuits: Contains sample Hash Checker contracts. These can be compiled to generate a witness using 'Circom ZKP Compiler' plugin. +- scripts: Provides a sample script designed for a trusted setup using snarkjs. This script also aids in generating Solidity code, +which is essential for on-chain deployment. + diff --git a/libs/remix-ws-templates/src/templates/hashchecker/circuits/calculateHash.circom b/libs/remix-ws-templates/src/templates/hashchecker/circuits/calculateHash.circom new file mode 100644 index 0000000000..edbd8aaea2 --- /dev/null +++ b/libs/remix-ws-templates/src/templates/hashchecker/circuits/calculateHash.circom @@ -0,0 +1,41 @@ +pragma circom 2.0.0; + +include "circomlib/poseidon.circom"; + +template CalculateHash() { + signal input value1; + signal input value2; + signal input value3; + signal input value4; + signal output out; + + component poseidon = Poseidon(4); + + poseidon.inputs[0] <== value1; + poseidon.inputs[1] <== value2; + poseidon.inputs[2] <== value3; + poseidon.inputs[3] <== value4; + + out <== poseidon.out; +} +template HashChecker() { + signal input value1; + signal input value2; + signal input value3; + signal input value4; + signal input hash; + + component calculateSecret = CalculateHash(); + calculateSecret.value1 <== value1; + calculateSecret.value2 <== value2; + calculateSecret.value3 <== value3; + calculateSecret.value4 <== value4; + + signal calculatedHash; + calculatedHash <== calculateSecret.out; + + assert(hash == calculatedHash); + +} + +component main {public [value1, value2, value3, value4]} = HashChecker(); \ No newline at end of file diff --git a/libs/remix-ws-templates/src/templates/hashchecker/index.ts b/libs/remix-ws-templates/src/templates/hashchecker/index.ts new file mode 100644 index 0000000000..953558ecd2 --- /dev/null +++ b/libs/remix-ws-templates/src/templates/hashchecker/index.ts @@ -0,0 +1,14 @@ +export default async () => { + return { + // @ts-ignore + 'circuits/calculateHash.circom': (await import('raw-loader!./circuits/calculateHash.circom')).default, + // @ts-ignore + 'scripts/run_setup.ts': (await import('!!raw-loader!./scripts/run_setup.ts')).default, + // @ts-ignore + 'scripts/run_verification.ts': (await import('!!raw-loader!./scripts/run_verification.ts')).default, + // @ts-ignore + 'templates/groth16_verifier.sol.ejs': (await import('!!raw-loader!./templates/groth16_verifier.sol.ejs')).default, + // @ts-ignore + 'README.txt': (await import('raw-loader!./README.txt')).default + } +} \ No newline at end of file diff --git a/libs/remix-ws-templates/src/templates/hashchecker/scripts/run_setup.ts b/libs/remix-ws-templates/src/templates/hashchecker/scripts/run_setup.ts new file mode 100644 index 0000000000..9924e6b27a --- /dev/null +++ b/libs/remix-ws-templates/src/templates/hashchecker/scripts/run_setup.ts @@ -0,0 +1,72 @@ +import { ethers, BigNumber } from 'ethers' + +// eslint-disable-next-line @typescript-eslint/no-var-requires +const snarkjs = require('snarkjs'); + +const logger = { + info: (...args) => console.log(...args), + debug: (...args) => console.log(...args) +}; + +/** + * Creates a keccak256 hash of a message compatible with the SNARK scalar modulus. + * @param message The message to be hashed. + * @returns The message digest. + */ +function hash(message: any): bigint { + message = BigNumber.from(message).toTwos(256).toHexString() + message = ethers.utils.zeroPad(message, 32) + return BigInt(ethers.utils.keccak256(message)) >> BigInt(8) +} + +(async () => { + try { + // @ts-ignore + await remix.call('circuit-compiler', 'generateR1cs', 'circuits/calculate_hash.circom'); + + const ptau_final = "https://ipfs-cluster.ethdevops.io/ipfs/QmTiT4eiYz5KF7gQrDsgfCSTRv3wBPYJ4bRN1MmTRshpnW"; + // @ts-ignore + const r1csBuffer = await remix.call('fileManager', 'readFile', 'circuits/.bin/calculate_hash.r1cs', true); + // @ts-ignore + const r1cs = new Uint8Array(r1csBuffer); + const zkey_0 = { type: "mem" }; + const zkey_1 = { type: "mem" }; + const zkey_final = { type: "mem" }; + + console.log('newZkey') + await snarkjs.zKey.newZKey(r1cs, ptau_final, zkey_0); + + console.log('contribute') + await snarkjs.zKey.contribute(zkey_0, zkey_1, "p2_C1", "pa_Entropy1"); + + console.log('beacon') + await snarkjs.zKey.beacon(zkey_1, zkey_final, "B3", "0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20", 10); + + console.log('verifyFromR1cs') + const verifyFromR1csResult = await snarkjs.zKey.verifyFromR1cs(r1cs, ptau_final, zkey_final); + console.assert(verifyFromR1csResult); + + console.log('verifyFromInit') + const verifyFromInit = await snarkjs.zKey.verifyFromInit(zkey_0, ptau_final, zkey_final); + console.assert(verifyFromInit); + + console.log('exportVerificationKey') + const vKey = await snarkjs.zKey.exportVerificationKey(zkey_final) + await remix.call('fileManager', 'writeFile', './zk/build/verification_key.json', JSON.stringify(vKey)) + + const templates = { + groth16: await remix.call('fileManager', 'readFile', 'templates/groth16_verifier.sol.ejs') + } + const solidityContract = await snarkjs.zKey.exportSolidityVerifier(zkey_final, templates) + + await remix.call('fileManager', 'writeFile', './zk/build/zk_verifier.sol', solidityContract) + + console.log('buffer', (zkey_final as any).data.length) + await remix.call('fileManager', 'writeFile', './zk/build/zk_setup.txt', JSON.stringify(Array.from(((zkey_final as any).data)))) + + console.log('setup done.') + + } catch (e) { + console.error(e.message) + } +})() \ No newline at end of file diff --git a/libs/remix-ws-templates/src/templates/hashchecker/scripts/run_verification.ts b/libs/remix-ws-templates/src/templates/hashchecker/scripts/run_verification.ts new file mode 100644 index 0000000000..6d43f3ef6d --- /dev/null +++ b/libs/remix-ws-templates/src/templates/hashchecker/scripts/run_verification.ts @@ -0,0 +1,74 @@ +import { poseidon } from "circomlibjs" // v0.0.8 + +// eslint-disable-next-line @typescript-eslint/no-var-requires +const snarkjs = require('snarkjs'); + +const logger = { + info: (...args) => console.log(...args), + debug: (...args) => console.log(...args), + error: (...args) => console.error(...args), +} + +/** + * Creates a keccak256 hash of a message compatible with the SNARK scalar modulus. + * @param message The message to be hashed. + * @returns The message digest. + */ +function hash(message: any): bigint { + message = BigNumber.from(message).toTwos(256).toHexString() + message = ethers.utils.zeroPad(message, 32) + return BigInt(ethers.utils.keccak256(message)) >> BigInt(8) +} + +(async () => { + try { + // @ts-ignore + const r1csBuffer = await remix.call('fileManager', 'readFile', 'circuits/.bin/calculate_hash.r1cs', true); + // @ts-ignore + const r1cs = new Uint8Array(r1csBuffer); + // @ts-ignore + const wasmBuffer = await remix.call('fileManager', 'readFile', 'circuits/.bin/calculate_hash.wasm', true); + // @ts-ignore + const wasm = new Uint8Array(wasmBuffer); + + const zkey_final = { + type: "mem", + data: new Uint8Array(JSON.parse(await remix.call('fileManager', 'readFile', './zk/build/zk_setup.txt'))) + } + const wtns = { type: "mem" }; + + const vKey = JSON.parse(await remix.call('fileManager', 'readFile', './zk/build/verification_key.json')) + + const value1 = '1234' + const value2 = '2' + const value3 = '3' + const value4 = '4' + + const wrongValue = '5' // put this in the poseidon hash calculation to simulate a non matching hash. + + const signals = { + value1, + value2, + value3, + value4, + hash: poseidon([value1, value2, value3, value4]) + } + + console.log('calculate') + await snarkjs.wtns.calculate(signals, wasm, wtns); + + console.log('check') + await snarkjs.wtns.check(r1cs, wtns, logger); + + + console.log('prove') + const { proof, publicSignals } = await snarkjs.groth16.prove(zkey_final, wtns); + + const verified = await snarkjs.groth16.verify(vKey, publicSignals, proof, logger); + console.log('zk proof validity', verified); + + + } catch (e) { + console.error(e.message) + } +})() \ No newline at end of file diff --git a/libs/remix-ws-templates/src/templates/hashchecker/templates/groth16_verifier.sol.ejs b/libs/remix-ws-templates/src/templates/hashchecker/templates/groth16_verifier.sol.ejs new file mode 100644 index 0000000000..692aedf612 --- /dev/null +++ b/libs/remix-ws-templates/src/templates/hashchecker/templates/groth16_verifier.sol.ejs @@ -0,0 +1,165 @@ +// SPDX-License-Identifier: GPL-3.0 +/* + Copyright 2021 0KIMS association. + + This file is generated with [snarkJS](https://github.com/iden3/snarkjs). + + snarkJS is a free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + snarkJS is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + License for more details. + + You should have received a copy of the GNU General Public License + along with snarkJS. If not, see . +*/ + +pragma solidity >=0.7.0 <0.9.0; + +contract Groth16Verifier { + // Scalar field size + uint256 constant r = 21888242871839275222246405745257275088548364400416034343698204186575808495617; + // Base field size + uint256 constant q = 21888242871839275222246405745257275088696311157297823662689037894645226208583; + + // Verification Key data + uint256 constant alphax = <%= vk_alpha_1[0] %>; + uint256 constant alphay = <%= vk_alpha_1[1] %>; + uint256 constant betax1 = <%= vk_beta_2[0][1] %>; + uint256 constant betax2 = <%= vk_beta_2[0][0] %>; + uint256 constant betay1 = <%= vk_beta_2[1][1] %>; + uint256 constant betay2 = <%= vk_beta_2[1][0] %>; + uint256 constant gammax1 = <%= vk_gamma_2[0][1] %>; + uint256 constant gammax2 = <%= vk_gamma_2[0][0] %>; + uint256 constant gammay1 = <%= vk_gamma_2[1][1] %>; + uint256 constant gammay2 = <%= vk_gamma_2[1][0] %>; + uint256 constant deltax1 = <%= vk_delta_2[0][1] %>; + uint256 constant deltax2 = <%= vk_delta_2[0][0] %>; + uint256 constant deltay1 = <%= vk_delta_2[1][1] %>; + uint256 constant deltay2 = <%= vk_delta_2[1][0] %>; + + <% for (let i=0; i + uint256 constant IC<%=i%>x = <%=IC[i][0]%>; + uint256 constant IC<%=i%>y = <%=IC[i][1]%>; + <% } %> + + // Memory data + uint16 constant pVk = 0; + uint16 constant pPairing = 128; + + uint16 constant pLastMem = 896; + + function verifyProof(uint[2] calldata _pA, uint[2][2] calldata _pB, uint[2] calldata _pC, uint[<%=IC.length-1%>] calldata _pubSignals) public view returns (bool) { + assembly { + function checkField(v) { + if iszero(lt(v, q)) { + mstore(0, 0) + return(0, 0x20) + } + } + + // G1 function to multiply a G1 value(x,y) to value in an address + function g1_mulAccC(pR, x, y, s) { + let success + let mIn := mload(0x40) + mstore(mIn, x) + mstore(add(mIn, 32), y) + mstore(add(mIn, 64), s) + + success := staticcall(sub(gas(), 2000), 7, mIn, 96, mIn, 64) + + if iszero(success) { + mstore(0, 0) + return(0, 0x20) + } + + mstore(add(mIn, 64), mload(pR)) + mstore(add(mIn, 96), mload(add(pR, 32))) + + success := staticcall(sub(gas(), 2000), 6, mIn, 128, pR, 64) + + if iszero(success) { + mstore(0, 0) + return(0, 0x20) + } + } + + function checkPairing(pA, pB, pC, pubSignals, pMem) -> isOk { + let _pPairing := add(pMem, pPairing) + let _pVk := add(pMem, pVk) + + mstore(_pVk, IC0x) + mstore(add(_pVk, 32), IC0y) + + // Compute the linear combination vk_x + <% for (let i = 1; i <= nPublic; i++) { %> + g1_mulAccC(_pVk, IC<%=i%>x, IC<%=i%>y, calldataload(add(pubSignals, <%=(i-1)*32%>))) + <% } %> + + // -A + mstore(_pPairing, calldataload(pA)) + mstore(add(_pPairing, 32), mod(sub(q, calldataload(add(pA, 32))), q)) + + // B + mstore(add(_pPairing, 64), calldataload(pB)) + mstore(add(_pPairing, 96), calldataload(add(pB, 32))) + mstore(add(_pPairing, 128), calldataload(add(pB, 64))) + mstore(add(_pPairing, 160), calldataload(add(pB, 96))) + + // alpha1 + mstore(add(_pPairing, 192), alphax) + mstore(add(_pPairing, 224), alphay) + + // beta2 + mstore(add(_pPairing, 256), betax1) + mstore(add(_pPairing, 288), betax2) + mstore(add(_pPairing, 320), betay1) + mstore(add(_pPairing, 352), betay2) + + // vk_x + mstore(add(_pPairing, 384), mload(add(pMem, pVk))) + mstore(add(_pPairing, 416), mload(add(pMem, add(pVk, 32)))) + + + // gamma2 + mstore(add(_pPairing, 448), gammax1) + mstore(add(_pPairing, 480), gammax2) + mstore(add(_pPairing, 512), gammay1) + mstore(add(_pPairing, 544), gammay2) + + // C + mstore(add(_pPairing, 576), calldataload(pC)) + mstore(add(_pPairing, 608), calldataload(add(pC, 32))) + + // delta2 + mstore(add(_pPairing, 640), deltax1) + mstore(add(_pPairing, 672), deltax2) + mstore(add(_pPairing, 704), deltay1) + mstore(add(_pPairing, 736), deltay2) + + + let success := staticcall(sub(gas(), 2000), 8, _pPairing, 768, _pPairing, 0x20) + + isOk := and(success, mload(_pPairing)) + } + + let pMem := mload(0x40) + mstore(0x40, add(pMem, pLastMem)) + + // Validate that all evaluations ∈ F + <% for (let i=0; i + checkField(calldataload(add(_pubSignals, <%=i*32%>))) + <% } %> + + // Validate all evaluations + let isValid := checkPairing(_pA, _pB, _pC, _pubSignals, pMem) + + mstore(0, isValid) + return(0, 0x20) + } + } + } \ No newline at end of file From 78d8d75f1fcd2744c96b670ae9c5bd547bb6f2da Mon Sep 17 00:00:00 2001 From: aniket-engg Date: Thu, 9 Nov 2023 16:45:14 +0530 Subject: [PATCH 007/163] template option on UI --- apps/remix-ide/src/app/tabs/locales/en/filePanel.json | 1 + libs/remix-ui/workspace/src/lib/actions/workspace.ts | 2 +- libs/remix-ui/workspace/src/lib/remix-ui-workspace.tsx | 3 +++ libs/remix-ui/workspace/src/lib/types/index.ts | 2 +- libs/remix-ui/workspace/src/lib/utils/constants.ts | 3 ++- libs/remix-ws-templates/src/index.ts | 1 + 6 files changed, 9 insertions(+), 3 deletions(-) diff --git a/apps/remix-ide/src/app/tabs/locales/en/filePanel.json b/apps/remix-ide/src/app/tabs/locales/en/filePanel.json index 6b7dc748e5..6b3b8524d0 100644 --- a/apps/remix-ide/src/app/tabs/locales/en/filePanel.json +++ b/apps/remix-ide/src/app/tabs/locales/en/filePanel.json @@ -104,6 +104,7 @@ "filePanel.burnable": "Burnable", "filePanel.pausable": "Pausable", "filePanel.semaphore": "Semaphore", + "filePanel.hashchecker": "Hash Checker", "filePanel.transparent": "Transparent", "filePanel.initGitRepoTitle": "Check option to initialize workspace as a new git repository", "filePanel.switchToBranchTitle1": "Checkout new branch from remote branch", diff --git a/libs/remix-ui/workspace/src/lib/actions/workspace.ts b/libs/remix-ui/workspace/src/lib/actions/workspace.ts index c4818c8d90..b4307250c1 100644 --- a/libs/remix-ui/workspace/src/lib/actions/workspace.ts +++ b/libs/remix-ui/workspace/src/lib/actions/workspace.ts @@ -170,7 +170,7 @@ export const createWorkspace = async ( const isActive = await plugin.call('manager', 'isActive', 'dgit') if (!isActive) await plugin.call('manager', 'activatePlugin', 'dgit') } - if (workspaceTemplateName === 'semaphore') { + if (workspaceTemplateName === 'semaphore' || workspaceTemplateName === 'hashchecker') { const isCircomActive = await plugin.call('manager', 'isActive', 'circuit-compiler') if (!isCircomActive) await plugin.call('manager', 'activatePlugin', 'circuit-compiler') } diff --git a/libs/remix-ui/workspace/src/lib/remix-ui-workspace.tsx b/libs/remix-ui/workspace/src/lib/remix-ui-workspace.tsx index 236f0be705..b5fb03ea39 100644 --- a/libs/remix-ui/workspace/src/lib/remix-ui-workspace.tsx +++ b/libs/remix-ui/workspace/src/lib/remix-ui-workspace.tsx @@ -742,6 +742,9 @@ export function Workspace() { + diff --git a/libs/remix-ui/workspace/src/lib/types/index.ts b/libs/remix-ui/workspace/src/lib/types/index.ts index 2292f180da..41ece8274f 100644 --- a/libs/remix-ui/workspace/src/lib/types/index.ts +++ b/libs/remix-ui/workspace/src/lib/types/index.ts @@ -17,7 +17,7 @@ export interface JSONStandardInput { } } export type MenuItems = action[] -export type WorkspaceTemplate = 'gist-template' | 'code-template' | 'remixDefault' | 'blank' | 'ozerc20' | 'zeroxErc20' | 'ozerc721' | 'playground' | 'semaphore' +export type WorkspaceTemplate = 'gist-template' | 'code-template' | 'remixDefault' | 'blank' | 'ozerc20' | 'zeroxErc20' | 'ozerc721' | 'playground' | 'semaphore' | 'hashchecker' export interface WorkspaceProps { plugin: FilePanelType } diff --git a/libs/remix-ui/workspace/src/lib/utils/constants.ts b/libs/remix-ui/workspace/src/lib/utils/constants.ts index 60f0d03ea0..716652df6d 100644 --- a/libs/remix-ui/workspace/src/lib/utils/constants.ts +++ b/libs/remix-ui/workspace/src/lib/utils/constants.ts @@ -82,5 +82,6 @@ export const TEMPLATE_NAMES = { 'zeroxErc20': '0xProject ERC20', 'gnosisSafeMultisig': 'Gnosis Safe', 'playground': 'Playground', - 'semaphore': 'Semaphore' + 'semaphore': 'Semaphore', + 'hashchecker': 'Hash Checker' } diff --git a/libs/remix-ws-templates/src/index.ts b/libs/remix-ws-templates/src/index.ts index 48c239019b..1dab217e0a 100644 --- a/libs/remix-ws-templates/src/index.ts +++ b/libs/remix-ws-templates/src/index.ts @@ -7,6 +7,7 @@ export { default as zeroxErc20 } from './templates/zeroxErc20' export { default as gnosisSafeMultisig } from './templates/gnosisSafeMultisig' export { default as playground } from './templates/playground' export { default as semaphore } from './templates/semaphore' +export { default as hashchecker } from './templates/hashchecker' export { contractDeployerScripts } from './script-templates/contract-deployer' export { etherscanScripts } from './script-templates/etherscan' From c442138a5b5b722c09fad097be85f11fb301c892 Mon Sep 17 00:00:00 2001 From: aniket-engg Date: Thu, 9 Nov 2023 16:58:15 +0530 Subject: [PATCH 008/163] hashchecker template e2e --- .../remix-ide-e2e/src/tests/workspace.test.ts | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/apps/remix-ide-e2e/src/tests/workspace.test.ts b/apps/remix-ide-e2e/src/tests/workspace.test.ts index 1da1bba7b6..058e8be8a8 100644 --- a/apps/remix-ide-e2e/src/tests/workspace.test.ts +++ b/apps/remix-ide-e2e/src/tests/workspace.test.ts @@ -382,6 +382,35 @@ module.exports = { }) // No test file is added in upgradeable contract template }, + 'Should create circom zkp hashchecker workspace #group1': function (browser: NightwatchBrowser) { + browser + .click('*[data-id="workspacesMenuDropdown"]') + .click('*[data-id="workspacecreate"]') + .waitForElementVisible('*[data-id="modalDialogCustomPromptTextCreate"]') + .waitForElementVisible('[data-id="fileSystemModalDialogModalFooter-react"] > button') + .click('select[id="wstemplate"]') + .click('select[id="wstemplate"] option[value=hashchecker]') + .waitForElementPresent('[data-id="fileSystemModalDialogModalFooter-react"] .modal-ok') + .execute(function () { (document.querySelector('[data-id="fileSystemModalDialogModalFooter-react"] .modal-ok') as HTMLElement).click() }) + .pause(100) + .waitForElementVisible('*[data-id="treeViewLitreeViewItemcircuits"]') + .waitForElementVisible('*[data-id="treeViewLitreeViewItemcircuits/calculateHash.circom"]') + .click('*[data-id="treeViewLitreeViewItemcircuits/calculateHash.circom"]') + .pause(1000) + .getEditorValue((content) => { + browser.assert.ok(content.indexOf(`template CalculateHash() {`) !== -1, + 'Incorrect content') + }) + .waitForElementVisible('*[data-id="treeViewLitreeViewItemscripts"]') + .waitForElementVisible('*[data-id="treeViewLitreeViewItemscripts/run_setup.ts"]') + .waitForElementVisible('*[data-id="treeViewLitreeViewItemscripts/run_verification.ts"]') + .waitForElementVisible('*[data-id="treeViewLitreeViewItemtemplates/groth16_verifier.sol.ejs"]') + .click('*[data-id="treeViewLitreeViewItemtemplates/groth16_verifier.sol.ejs"]') + .getEditorValue((content) => { + browser.assert.ok(content.indexOf(`contract Groth16Verifier {`) !== -1, + 'Incorrect content') + }) + }, // WORKSPACE TEMPLATES E2E END From 0396641235426d3f04d66bc4e666ff4b3239e211 Mon Sep 17 00:00:00 2001 From: aniket-engg Date: Thu, 9 Nov 2023 17:27:19 +0530 Subject: [PATCH 009/163] update file name --- apps/remix-ide-e2e/src/tests/workspace.test.ts | 2 +- .../circuits/{calculateHash.circom => calculate_hash.circom} | 0 libs/remix-ws-templates/src/templates/hashchecker/index.ts | 2 +- 3 files changed, 2 insertions(+), 2 deletions(-) rename libs/remix-ws-templates/src/templates/hashchecker/circuits/{calculateHash.circom => calculate_hash.circom} (100%) diff --git a/apps/remix-ide-e2e/src/tests/workspace.test.ts b/apps/remix-ide-e2e/src/tests/workspace.test.ts index 058e8be8a8..df85880733 100644 --- a/apps/remix-ide-e2e/src/tests/workspace.test.ts +++ b/apps/remix-ide-e2e/src/tests/workspace.test.ts @@ -394,7 +394,7 @@ module.exports = { .execute(function () { (document.querySelector('[data-id="fileSystemModalDialogModalFooter-react"] .modal-ok') as HTMLElement).click() }) .pause(100) .waitForElementVisible('*[data-id="treeViewLitreeViewItemcircuits"]') - .waitForElementVisible('*[data-id="treeViewLitreeViewItemcircuits/calculateHash.circom"]') + .waitForElementVisible('*[data-id="treeViewLitreeViewItemcircuits/calculate_hash.circom"]') .click('*[data-id="treeViewLitreeViewItemcircuits/calculateHash.circom"]') .pause(1000) .getEditorValue((content) => { diff --git a/libs/remix-ws-templates/src/templates/hashchecker/circuits/calculateHash.circom b/libs/remix-ws-templates/src/templates/hashchecker/circuits/calculate_hash.circom similarity index 100% rename from libs/remix-ws-templates/src/templates/hashchecker/circuits/calculateHash.circom rename to libs/remix-ws-templates/src/templates/hashchecker/circuits/calculate_hash.circom diff --git a/libs/remix-ws-templates/src/templates/hashchecker/index.ts b/libs/remix-ws-templates/src/templates/hashchecker/index.ts index 953558ecd2..bcae81f336 100644 --- a/libs/remix-ws-templates/src/templates/hashchecker/index.ts +++ b/libs/remix-ws-templates/src/templates/hashchecker/index.ts @@ -1,7 +1,7 @@ export default async () => { return { // @ts-ignore - 'circuits/calculateHash.circom': (await import('raw-loader!./circuits/calculateHash.circom')).default, + 'circuits/calculate_hash.circom': (await import('raw-loader!./circuits/calculate_hash.circom')).default, // @ts-ignore 'scripts/run_setup.ts': (await import('!!raw-loader!./scripts/run_setup.ts')).default, // @ts-ignore From 7af944d8bb06a78d2de9adab415c64dd46253593 Mon Sep 17 00:00:00 2001 From: aniket-engg Date: Thu, 9 Nov 2023 17:30:05 +0530 Subject: [PATCH 010/163] clean code --- .../src/templates/hashchecker/scripts/run_setup.ts | 13 ------------- .../hashchecker/scripts/run_verification.ts | 11 ----------- 2 files changed, 24 deletions(-) diff --git a/libs/remix-ws-templates/src/templates/hashchecker/scripts/run_setup.ts b/libs/remix-ws-templates/src/templates/hashchecker/scripts/run_setup.ts index 9924e6b27a..1fc7312546 100644 --- a/libs/remix-ws-templates/src/templates/hashchecker/scripts/run_setup.ts +++ b/libs/remix-ws-templates/src/templates/hashchecker/scripts/run_setup.ts @@ -1,5 +1,3 @@ -import { ethers, BigNumber } from 'ethers' - // eslint-disable-next-line @typescript-eslint/no-var-requires const snarkjs = require('snarkjs'); @@ -8,17 +6,6 @@ const logger = { debug: (...args) => console.log(...args) }; -/** - * Creates a keccak256 hash of a message compatible with the SNARK scalar modulus. - * @param message The message to be hashed. - * @returns The message digest. - */ -function hash(message: any): bigint { - message = BigNumber.from(message).toTwos(256).toHexString() - message = ethers.utils.zeroPad(message, 32) - return BigInt(ethers.utils.keccak256(message)) >> BigInt(8) -} - (async () => { try { // @ts-ignore diff --git a/libs/remix-ws-templates/src/templates/hashchecker/scripts/run_verification.ts b/libs/remix-ws-templates/src/templates/hashchecker/scripts/run_verification.ts index 6d43f3ef6d..834ddf1081 100644 --- a/libs/remix-ws-templates/src/templates/hashchecker/scripts/run_verification.ts +++ b/libs/remix-ws-templates/src/templates/hashchecker/scripts/run_verification.ts @@ -9,17 +9,6 @@ const logger = { error: (...args) => console.error(...args), } -/** - * Creates a keccak256 hash of a message compatible with the SNARK scalar modulus. - * @param message The message to be hashed. - * @returns The message digest. - */ -function hash(message: any): bigint { - message = BigNumber.from(message).toTwos(256).toHexString() - message = ethers.utils.zeroPad(message, 32) - return BigInt(ethers.utils.keccak256(message)) >> BigInt(8) -} - (async () => { try { // @ts-ignore From 263ebffb26ffb0612a2dce0a2af22c0342356c45 Mon Sep 17 00:00:00 2001 From: aniket-engg Date: Thu, 9 Nov 2023 17:38:24 +0530 Subject: [PATCH 011/163] fix file name --- apps/remix-ide-e2e/src/tests/workspace.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/remix-ide-e2e/src/tests/workspace.test.ts b/apps/remix-ide-e2e/src/tests/workspace.test.ts index df85880733..c8b391e2fd 100644 --- a/apps/remix-ide-e2e/src/tests/workspace.test.ts +++ b/apps/remix-ide-e2e/src/tests/workspace.test.ts @@ -395,7 +395,7 @@ module.exports = { .pause(100) .waitForElementVisible('*[data-id="treeViewLitreeViewItemcircuits"]') .waitForElementVisible('*[data-id="treeViewLitreeViewItemcircuits/calculate_hash.circom"]') - .click('*[data-id="treeViewLitreeViewItemcircuits/calculateHash.circom"]') + .click('*[data-id="treeViewLitreeViewItemcircuits/calculate_hash.circom"]') .pause(1000) .getEditorValue((content) => { browser.assert.ok(content.indexOf(`template CalculateHash() {`) !== -1, From 12a2915a45ad4ad27d1e6c6d0e1612718340224a Mon Sep 17 00:00:00 2001 From: filip mertens Date: Thu, 9 Nov 2023 15:51:22 +0100 Subject: [PATCH 012/163] support submodules --- apps/remix-ide/src/app/files/dgitProvider.js | 116 ++++++++++++++++-- apps/remix-ide/src/app/files/fileManager.ts | 9 +- .../workspace/src/lib/actions/payload.ts | 7 ++ .../workspace/src/lib/actions/workspace.ts | 19 ++- .../workspace/src/lib/contexts/index.ts | 1 + .../src/lib/providers/FileSystemProvider.tsx | 10 +- .../workspace/src/lib/reducers/workspace.ts | 17 +++ .../workspace/src/lib/remix-ui-workspace.tsx | 16 ++- .../remix-ui/workspace/src/lib/types/index.ts | 1 + package.json | 2 +- yarn.lock | 37 +++--- 11 files changed, 194 insertions(+), 41 deletions(-) diff --git a/apps/remix-ide/src/app/files/dgitProvider.js b/apps/remix-ide/src/app/files/dgitProvider.js index d4c78d8099..4988cffaf9 100644 --- a/apps/remix-ide/src/app/files/dgitProvider.js +++ b/apps/remix-ide/src/app/files/dgitProvider.js @@ -21,7 +21,7 @@ const profile = { description: 'Decentralized git provider', icon: 'assets/img/fileManager.webp', version: '0.0.1', - methods: ['init', 'localStorageUsed', 'addremote', 'delremote', 'remotes', 'fetch', 'clone', 'export', 'import', 'status', 'log', 'commit', 'add', 'remove', 'rm', 'lsfiles', 'readblob', 'resolveref', 'branches', 'branch', 'checkout', 'currentbranch', 'push', 'pin', 'pull', 'pinList', 'unPin', 'setIpfsConfig', 'zip', 'setItem', 'getItem'], + methods: ['init', 'localStorageUsed', 'addremote', 'delremote', 'remotes', 'fetch', 'clone', 'export', 'import', 'status', 'log', 'commit', 'add', 'remove', 'rm', 'lsfiles', 'readblob', 'resolveref', 'branches', 'branch', 'checkout', 'currentbranch', 'push', 'pin', 'pull', 'pinList', 'unPin', 'setIpfsConfig', 'zip', 'setItem', 'getItem', 'updateSubmodules'], kind: 'file-system' } class DGitProvider extends Plugin { @@ -48,13 +48,13 @@ class DGitProvider extends Plugin { this.ipfsSources = [this.remixIPFS, this.globalIPFSConfig, this.ipfsconfig] } - async getGitConfig () { + async getGitConfig (dir = '') { const workspace = await this.call('filePanel', 'getCurrentWorkspace') if (!workspace) return return { fs: window.remixFileSystemCallback, - dir: addSlash(workspace.absolutePath) + dir: addSlash(path.join(workspace.absolutePath, dir || '')), } } @@ -105,15 +105,37 @@ class DGitProvider extends Plugin { } async checkout (cmd, refresh = true) { + const gitmodules = await this.parseGitmodules() || [] await git.checkout({ ...await this.getGitConfig(), ...cmd }) - if (refresh) { + const newgitmodules = await this.parseGitmodules() || [] + // find the difference between the two gitmodule versions + const toRemove = gitmodules.filter((module) => { + return !newgitmodules.find((newmodule) => { + return newmodule.name === module.name + }) + }) + + for (const module of toRemove) { + const path = (await this.getGitConfig(module.path)).dir + if (await window.remixFileSystem.exists(path)) { + const stat = await window.remixFileSystem.stat(path) + try { + if (stat.isDirectory()) { + await window.remixFileSystem.unlink((await this.getGitConfig(module.path)).dir) + } + } catch (e) { + } + } + } + + if (refresh) setTimeout(async () => { await this.call('fileManager', 'refresh') }, 1000) - } + this.emit('checkout') } @@ -150,19 +172,19 @@ class DGitProvider extends Plugin { } async currentbranch (config) { - try{ + try { const defaultConfig = await this.getGitConfig() const cmd = config ? defaultConfig ? { ...defaultConfig, ...config } : config : defaultConfig const name = await git.currentBranch(cmd) return name - }catch(e){ + } catch (e) { return '' } } async branches (config) { - try{ + try { const defaultConfig = await this.getGitConfig() const cmd = config ? defaultConfig ? { ...defaultConfig, ...config } : config : defaultConfig const remotes = await this.remotes(config) @@ -174,7 +196,7 @@ class DGitProvider extends Plugin { branches = [...branches, ...remotebranches] } return branches - }catch(e){ + } catch (e) { return [] } } @@ -261,6 +283,7 @@ class DGitProvider extends Plugin { } const result = await git.clone(cmd) + await this.updateSubmodules(input) if (!workspaceExists) { setTimeout(async () => { await this.call('fileManager', 'refresh') @@ -270,7 +293,80 @@ class DGitProvider extends Plugin { return result } - async push (input) { + async parseGitmodules () { + try { + const gitmodules = await this.call('fileManager', 'readFile', '.gitmodules') + if (gitmodules) { + const lines = gitmodules.split('\n') + let currentModule = {} + let modules = [] + for (let line of lines) { + line = line.trim() + if (line.startsWith('[')) { + if (currentModule.path) { + modules.push(currentModule) + } + currentModule = {} + currentModule.name = line.replace('[submodule "', '').replace('"]', '') + } else if (line.startsWith('url')) { + currentModule.url = line.replace('url = ', '') + } else if (line.startsWith('path')) { + currentModule.path = line.replace('path = ', '') + } + } + if (currentModule.path) { + modules.push(currentModule) + } + return modules + } + } catch (e) { + // do nothing + } + } + + async updateSubmodules(input) { + try { + const gitmodules = await this.parseGitmodules() + //parse gitmodules + if (gitmodules) { + for (let module of gitmodules) { + const path = (await this.getGitConfig(module.path)).dir + if (await window.remixFileSystem.exists(path)) { + const stat = await window.remixFileSystem.stat(path) + try { + if (stat.isDirectory()) { + await window.remixFileSystem.unlink((await this.getGitConfig(module.path)).dir) + } + } catch (e) { + } + } + } + for (let module of gitmodules) { + try { + const cmd = { + url: module.url, + singleBranch: true, + depth: 1, + ...await this.parseInput(input), + ...await this.getGitConfig(module.path) + } + await git.clone(cmd) + } catch (e) { + console.log(e) + + } + } + setTimeout(async () => { + await this.call('fileManager', 'refresh') + }, 1000) + } + } catch (e) { + console.log(e) + // do nothing + } + } + + async push(input) { const cmd = { force: input.force, ref: input.ref, diff --git a/apps/remix-ide/src/app/files/fileManager.ts b/apps/remix-ide/src/app/files/fileManager.ts index 154e571bb0..9b80a5fcf7 100644 --- a/apps/remix-ide/src/app/files/fileManager.ts +++ b/apps/remix-ide/src/app/files/fileManager.ts @@ -25,7 +25,7 @@ const profile = { methods: ['closeAllFiles', 'closeFile', 'file', 'exists', 'open', 'writeFile', 'writeMultipleFiles', 'writeFileNoRewrite', 'readFile', 'copyFile', 'copyDir', 'rename', 'mkdir', 'readdir', 'dirList', 'fileList', 'remove', 'getCurrentFile', 'getFile', 'getFolder', 'setFile', 'switchFile', 'refresh', 'getProviderOf', 'getProviderByName', 'getPathFromUrl', 'getUrlFromPath', - 'saveCurrentFile', 'setBatchFiles', 'isGitRepo', 'isFile', 'isDirectory' + 'saveCurrentFile', 'setBatchFiles', 'isGitRepo', 'isFile', 'isDirectory', 'hasGitSubmodule' ], kind: 'file-system' } @@ -919,6 +919,13 @@ class FileManager extends Plugin { return exists } + async hasGitSubmodules(): Promise { + const path = '.gitmodules' + const exists = await this.exists(path) + + return exists + } + async moveFileIsAllowed (src: string, dest: string) { try { diff --git a/libs/remix-ui/workspace/src/lib/actions/payload.ts b/libs/remix-ui/workspace/src/lib/actions/payload.ts index 6f5d5793cb..e023c4eaf7 100644 --- a/libs/remix-ui/workspace/src/lib/actions/payload.ts +++ b/libs/remix-ui/workspace/src/lib/actions/payload.ts @@ -294,6 +294,13 @@ export const setCurrentWorkspaceIsGitRepo = (isRepo: boolean): Action<'SET_CURRE } } +export const setCurrentWorkspaceHasGitSubmodules = (hasGitSubmodules: boolean): Action<'SET_CURRENT_WORKSPACE_HAS_GIT_SUBMODULES'> => { + return { + type: 'SET_CURRENT_WORKSPACE_HAS_GIT_SUBMODULES', + payload: hasGitSubmodules + } +} + export const setGitConfig = (config: {username: string, token: string, email: string}): Action<'SET_GIT_CONFIG'> => { return { type: 'SET_GIT_CONFIG', diff --git a/libs/remix-ui/workspace/src/lib/actions/workspace.ts b/libs/remix-ui/workspace/src/lib/actions/workspace.ts index c4818c8d90..1bfcc59376 100644 --- a/libs/remix-ui/workspace/src/lib/actions/workspace.ts +++ b/libs/remix-ui/workspace/src/lib/actions/workspace.ts @@ -25,6 +25,7 @@ import { setRenameWorkspace, setCurrentWorkspaceIsGitRepo, setGitConfig, + setCurrentWorkspaceHasGitSubmodules, } from './payload' import { addSlash, checkSlash, checkSpecialChars } from '@remix-ui/helper' @@ -423,7 +424,7 @@ export const switchToWorkspace = async (name: string) => { await plugin.fileProviders.workspace.setWorkspace(name) await plugin.setWorkspace({ name, isLocalhost: false }) const isGitRepo = await plugin.fileManager.isGitRepo() - + const hasGitSubmodule = await plugin.fileManager.hasGitSubmodules() if (isGitRepo) { const isActive = await plugin.call('manager', 'isActive', 'dgit') if (!isActive) await plugin.call('manager', 'activatePlugin', 'dgit') @@ -513,9 +514,9 @@ export const uploadFolder = async (target, targetFolder: string, cb?: (err: Erro } } -export const getWorkspaces = async (): Promise<{ name: string; isGitRepo: boolean; branches?: { remote: any; name: string }[]; currentBranch?: string }[]> | undefined => { +export const getWorkspaces = async (): Promise<{ name: string; isGitRepo: boolean; hasGitSubmodules: boolean; branches?: { remote: any; name: string }[]; currentBranch?: string }[]> | undefined => { try { - const workspaces: { name: string; isGitRepo: boolean; branches?: { remote: any; name: string }[]; currentBranch?: string }[] = await new Promise((resolve, reject) => { + const workspaces: { name: string; isGitRepo: boolean; hasGitSubmodules: boolean; branches?: { remote: any; name: string }[]; currentBranch?: string }[] = await new Promise((resolve, reject) => { const workspacesPath = plugin.fileProviders.workspace.workspacesPath plugin.fileProviders.browser.resolveDirectory('/' + workspacesPath, (error, items) => { @@ -527,7 +528,7 @@ export const getWorkspaces = async (): Promise<{ name: string; isGitRepo: boolea .filter((item) => items[item].isDirectory) .map(async (folder) => { const isGitRepo: boolean = await plugin.fileProviders.browser.exists('/' + folder + '/.git') - + const hasGitSubmodules: boolean = await plugin.fileProviders.browser.exists('/' + folder + '/.gitmodules') if (isGitRepo) { let branches = [] let currentBranch = null @@ -539,11 +540,13 @@ export const getWorkspaces = async (): Promise<{ name: string; isGitRepo: boolea isGitRepo, branches, currentBranch, + hasGitSubmodules } } else { return { name: folder.replace(workspacesPath + '/', ''), isGitRepo, + hasGitSubmodules } } }) @@ -608,7 +611,9 @@ export const cloneRepository = async (url: string) => { export const checkGit = async () => { const isGitRepo = await plugin.fileManager.isGitRepo() + const hasGitSubmodule = await plugin.fileManager.hasGitSubmodules() dispatch(setCurrentWorkspaceIsGitRepo(isGitRepo)) + dispatch(setCurrentWorkspaceHasGitSubmodules(hasGitSubmodule)) await refreshBranches() const currentBranch = await plugin.call('dGitProvider', 'currentbranch') dispatch(setCurrentWorkspaceCurrentBranch(currentBranch)) @@ -773,6 +778,12 @@ export const createHelperScripts = async (script: string) => { plugin.call('notification', 'toast', 'scripts added in the "scripts" folder') } +export const updateGitSubmodules = async () => { + dispatch(cloneRepositoryRequest()) + await plugin.call('dGitProvider', 'updateSubmodules') + dispatch(cloneRepositorySuccess()) +} + export const checkoutRemoteBranch = async (branch: string, remote: string) => { const localChanges = await hasLocalChanges() diff --git a/libs/remix-ui/workspace/src/lib/contexts/index.ts b/libs/remix-ui/workspace/src/lib/contexts/index.ts index d0b578d85e..23337569a6 100644 --- a/libs/remix-ui/workspace/src/lib/contexts/index.ts +++ b/libs/remix-ui/workspace/src/lib/contexts/index.ts @@ -46,6 +46,7 @@ export const FileSystemContext = createContext<{ dispatchCreateTsSolGithubAction: () => Promise, dispatchCreateSlitherGithubAction: () => Promise dispatchCreateHelperScripts: (script: string) => Promise + dispatchUpdateGitSubmodules: () => Promise }>(null) \ No newline at end of file diff --git a/libs/remix-ui/workspace/src/lib/providers/FileSystemProvider.tsx b/libs/remix-ui/workspace/src/lib/providers/FileSystemProvider.tsx index 13adb71235..0ddbe42ac9 100644 --- a/libs/remix-ui/workspace/src/lib/providers/FileSystemProvider.tsx +++ b/libs/remix-ui/workspace/src/lib/providers/FileSystemProvider.tsx @@ -45,7 +45,8 @@ import { createSolidityGithubAction, createTsSolGithubAction, createSlitherGithubAction, - createHelperScripts + createHelperScripts, + updateGitSubmodules } from '../actions' import {Modal, WorkspaceProps, WorkspaceTemplate} from '../types' // eslint-disable-next-line @typescript-eslint/no-unused-vars @@ -224,6 +225,10 @@ export const FileSystemProvider = (props: WorkspaceProps) => { await createHelperScripts(script) } + const dispatchUpdateGitSubmodules = async () => { + await updateGitSubmodules() + } + useEffect(() => { dispatchInitWorkspace() }, []) @@ -341,7 +346,8 @@ export const FileSystemProvider = (props: WorkspaceProps) => { dispatchCreateSolidityGithubAction, dispatchCreateTsSolGithubAction, dispatchCreateSlitherGithubAction, - dispatchCreateHelperScripts + dispatchCreateHelperScripts, + dispatchUpdateGitSubmodules } return ( diff --git a/libs/remix-ui/workspace/src/lib/reducers/workspace.ts b/libs/remix-ui/workspace/src/lib/reducers/workspace.ts index adec39d281..93a0a34069 100644 --- a/libs/remix-ui/workspace/src/lib/reducers/workspace.ts +++ b/libs/remix-ui/workspace/src/lib/reducers/workspace.ts @@ -9,6 +9,7 @@ export interface BrowserState { workspaces: { name: string isGitRepo: boolean + hasGitSubmodules?: boolean branches?: { remote: any name: string @@ -807,6 +808,22 @@ export const browserReducer = (state = browserInitialState, action: Actions) => } } + case 'SET_CURRENT_WORKSPACE_HAS_GIT_SUBMODULES': { + const payload = action.payload + + return { + ...state, + browser: { + ...state.browser, + workspaces: state.browser.workspaces.map((workspace) => { + if (workspace.name === state.browser.currentWorkspace) + workspace.hasGitSubmodules = payload + return workspace + }) + } + } + } + case 'SET_GIT_CONFIG': { const payload = action.payload diff --git a/libs/remix-ui/workspace/src/lib/remix-ui-workspace.tsx b/libs/remix-ui/workspace/src/lib/remix-ui-workspace.tsx index 236f0be705..058238eba2 100644 --- a/libs/remix-ui/workspace/src/lib/remix-ui-workspace.tsx +++ b/libs/remix-ui/workspace/src/lib/remix-ui-workspace.tsx @@ -24,6 +24,7 @@ export function Workspace() { const [selectedWorkspace, setSelectedWorkspace] = useState<{ name: string isGitRepo: boolean + hasGitSubmodules?: boolean branches?: {remote: any; name: string}[] currentBranch?: string }>(null) @@ -139,7 +140,6 @@ export function Workspace() { useEffect(() => { const workspace = global.fs.browser.workspaces.find((workspace) => workspace.name === currentWorkspace) - setSelectedWorkspace(workspace) }, [currentWorkspace]) @@ -649,6 +649,14 @@ export function Workspace() { setShowBranches(isOpen) } + const updateSubModules = async () => { + try { + await global.dispatchUpdateGitSubmodules() + } catch (e) { + console.error(e) + } + } + const handleBranchFilterChange = (e: ChangeEvent) => { const branchFilter = e.target.value @@ -1122,6 +1130,12 @@ export function Workspace() {
GIT
+ {selectedWorkspace.hasGitSubmodules? +
+ {global.fs.browser.isRequestingCloning ?
updating submodules
: +
update submodules
} +
+ : null}
Date: Thu, 9 Nov 2023 15:59:24 +0100 Subject: [PATCH 013/163] add token --- libs/remix-ui/workspace/src/lib/actions/workspace.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/libs/remix-ui/workspace/src/lib/actions/workspace.ts b/libs/remix-ui/workspace/src/lib/actions/workspace.ts index 1bfcc59376..58ad6410cd 100644 --- a/libs/remix-ui/workspace/src/lib/actions/workspace.ts +++ b/libs/remix-ui/workspace/src/lib/actions/workspace.ts @@ -780,7 +780,10 @@ export const createHelperScripts = async (script: string) => { export const updateGitSubmodules = async () => { dispatch(cloneRepositoryRequest()) - await plugin.call('dGitProvider', 'updateSubmodules') + const config = plugin.registry.get('config').api + const token = config.get('settings/gist-access-token') + const repoConfig = { token } + await plugin.call('dGitProvider', 'updateSubmodules', repoConfig) dispatch(cloneRepositorySuccess()) } From 12d51f6710a5182c17f1c36d282e820ee8ecf400 Mon Sep 17 00:00:00 2001 From: filip mertens Date: Thu, 9 Nov 2023 15:51:22 +0100 Subject: [PATCH 014/163] support submodules --- apps/remix-ide/src/app/files/dgitProvider.js | 116 ++++++++++++++++-- apps/remix-ide/src/app/files/fileManager.ts | 9 +- .../workspace/src/lib/actions/payload.ts | 7 ++ .../workspace/src/lib/actions/workspace.ts | 19 ++- .../workspace/src/lib/contexts/index.ts | 1 + .../src/lib/providers/FileSystemProvider.tsx | 10 +- .../workspace/src/lib/reducers/workspace.ts | 17 +++ .../workspace/src/lib/remix-ui-workspace.tsx | 16 ++- .../remix-ui/workspace/src/lib/types/index.ts | 1 + package.json | 2 +- yarn.lock | 32 ++--- 11 files changed, 189 insertions(+), 41 deletions(-) diff --git a/apps/remix-ide/src/app/files/dgitProvider.js b/apps/remix-ide/src/app/files/dgitProvider.js index d4c78d8099..4988cffaf9 100644 --- a/apps/remix-ide/src/app/files/dgitProvider.js +++ b/apps/remix-ide/src/app/files/dgitProvider.js @@ -21,7 +21,7 @@ const profile = { description: 'Decentralized git provider', icon: 'assets/img/fileManager.webp', version: '0.0.1', - methods: ['init', 'localStorageUsed', 'addremote', 'delremote', 'remotes', 'fetch', 'clone', 'export', 'import', 'status', 'log', 'commit', 'add', 'remove', 'rm', 'lsfiles', 'readblob', 'resolveref', 'branches', 'branch', 'checkout', 'currentbranch', 'push', 'pin', 'pull', 'pinList', 'unPin', 'setIpfsConfig', 'zip', 'setItem', 'getItem'], + methods: ['init', 'localStorageUsed', 'addremote', 'delremote', 'remotes', 'fetch', 'clone', 'export', 'import', 'status', 'log', 'commit', 'add', 'remove', 'rm', 'lsfiles', 'readblob', 'resolveref', 'branches', 'branch', 'checkout', 'currentbranch', 'push', 'pin', 'pull', 'pinList', 'unPin', 'setIpfsConfig', 'zip', 'setItem', 'getItem', 'updateSubmodules'], kind: 'file-system' } class DGitProvider extends Plugin { @@ -48,13 +48,13 @@ class DGitProvider extends Plugin { this.ipfsSources = [this.remixIPFS, this.globalIPFSConfig, this.ipfsconfig] } - async getGitConfig () { + async getGitConfig (dir = '') { const workspace = await this.call('filePanel', 'getCurrentWorkspace') if (!workspace) return return { fs: window.remixFileSystemCallback, - dir: addSlash(workspace.absolutePath) + dir: addSlash(path.join(workspace.absolutePath, dir || '')), } } @@ -105,15 +105,37 @@ class DGitProvider extends Plugin { } async checkout (cmd, refresh = true) { + const gitmodules = await this.parseGitmodules() || [] await git.checkout({ ...await this.getGitConfig(), ...cmd }) - if (refresh) { + const newgitmodules = await this.parseGitmodules() || [] + // find the difference between the two gitmodule versions + const toRemove = gitmodules.filter((module) => { + return !newgitmodules.find((newmodule) => { + return newmodule.name === module.name + }) + }) + + for (const module of toRemove) { + const path = (await this.getGitConfig(module.path)).dir + if (await window.remixFileSystem.exists(path)) { + const stat = await window.remixFileSystem.stat(path) + try { + if (stat.isDirectory()) { + await window.remixFileSystem.unlink((await this.getGitConfig(module.path)).dir) + } + } catch (e) { + } + } + } + + if (refresh) setTimeout(async () => { await this.call('fileManager', 'refresh') }, 1000) - } + this.emit('checkout') } @@ -150,19 +172,19 @@ class DGitProvider extends Plugin { } async currentbranch (config) { - try{ + try { const defaultConfig = await this.getGitConfig() const cmd = config ? defaultConfig ? { ...defaultConfig, ...config } : config : defaultConfig const name = await git.currentBranch(cmd) return name - }catch(e){ + } catch (e) { return '' } } async branches (config) { - try{ + try { const defaultConfig = await this.getGitConfig() const cmd = config ? defaultConfig ? { ...defaultConfig, ...config } : config : defaultConfig const remotes = await this.remotes(config) @@ -174,7 +196,7 @@ class DGitProvider extends Plugin { branches = [...branches, ...remotebranches] } return branches - }catch(e){ + } catch (e) { return [] } } @@ -261,6 +283,7 @@ class DGitProvider extends Plugin { } const result = await git.clone(cmd) + await this.updateSubmodules(input) if (!workspaceExists) { setTimeout(async () => { await this.call('fileManager', 'refresh') @@ -270,7 +293,80 @@ class DGitProvider extends Plugin { return result } - async push (input) { + async parseGitmodules () { + try { + const gitmodules = await this.call('fileManager', 'readFile', '.gitmodules') + if (gitmodules) { + const lines = gitmodules.split('\n') + let currentModule = {} + let modules = [] + for (let line of lines) { + line = line.trim() + if (line.startsWith('[')) { + if (currentModule.path) { + modules.push(currentModule) + } + currentModule = {} + currentModule.name = line.replace('[submodule "', '').replace('"]', '') + } else if (line.startsWith('url')) { + currentModule.url = line.replace('url = ', '') + } else if (line.startsWith('path')) { + currentModule.path = line.replace('path = ', '') + } + } + if (currentModule.path) { + modules.push(currentModule) + } + return modules + } + } catch (e) { + // do nothing + } + } + + async updateSubmodules(input) { + try { + const gitmodules = await this.parseGitmodules() + //parse gitmodules + if (gitmodules) { + for (let module of gitmodules) { + const path = (await this.getGitConfig(module.path)).dir + if (await window.remixFileSystem.exists(path)) { + const stat = await window.remixFileSystem.stat(path) + try { + if (stat.isDirectory()) { + await window.remixFileSystem.unlink((await this.getGitConfig(module.path)).dir) + } + } catch (e) { + } + } + } + for (let module of gitmodules) { + try { + const cmd = { + url: module.url, + singleBranch: true, + depth: 1, + ...await this.parseInput(input), + ...await this.getGitConfig(module.path) + } + await git.clone(cmd) + } catch (e) { + console.log(e) + + } + } + setTimeout(async () => { + await this.call('fileManager', 'refresh') + }, 1000) + } + } catch (e) { + console.log(e) + // do nothing + } + } + + async push(input) { const cmd = { force: input.force, ref: input.ref, diff --git a/apps/remix-ide/src/app/files/fileManager.ts b/apps/remix-ide/src/app/files/fileManager.ts index 154e571bb0..9b80a5fcf7 100644 --- a/apps/remix-ide/src/app/files/fileManager.ts +++ b/apps/remix-ide/src/app/files/fileManager.ts @@ -25,7 +25,7 @@ const profile = { methods: ['closeAllFiles', 'closeFile', 'file', 'exists', 'open', 'writeFile', 'writeMultipleFiles', 'writeFileNoRewrite', 'readFile', 'copyFile', 'copyDir', 'rename', 'mkdir', 'readdir', 'dirList', 'fileList', 'remove', 'getCurrentFile', 'getFile', 'getFolder', 'setFile', 'switchFile', 'refresh', 'getProviderOf', 'getProviderByName', 'getPathFromUrl', 'getUrlFromPath', - 'saveCurrentFile', 'setBatchFiles', 'isGitRepo', 'isFile', 'isDirectory' + 'saveCurrentFile', 'setBatchFiles', 'isGitRepo', 'isFile', 'isDirectory', 'hasGitSubmodule' ], kind: 'file-system' } @@ -919,6 +919,13 @@ class FileManager extends Plugin { return exists } + async hasGitSubmodules(): Promise { + const path = '.gitmodules' + const exists = await this.exists(path) + + return exists + } + async moveFileIsAllowed (src: string, dest: string) { try { diff --git a/libs/remix-ui/workspace/src/lib/actions/payload.ts b/libs/remix-ui/workspace/src/lib/actions/payload.ts index 6f5d5793cb..e023c4eaf7 100644 --- a/libs/remix-ui/workspace/src/lib/actions/payload.ts +++ b/libs/remix-ui/workspace/src/lib/actions/payload.ts @@ -294,6 +294,13 @@ export const setCurrentWorkspaceIsGitRepo = (isRepo: boolean): Action<'SET_CURRE } } +export const setCurrentWorkspaceHasGitSubmodules = (hasGitSubmodules: boolean): Action<'SET_CURRENT_WORKSPACE_HAS_GIT_SUBMODULES'> => { + return { + type: 'SET_CURRENT_WORKSPACE_HAS_GIT_SUBMODULES', + payload: hasGitSubmodules + } +} + export const setGitConfig = (config: {username: string, token: string, email: string}): Action<'SET_GIT_CONFIG'> => { return { type: 'SET_GIT_CONFIG', diff --git a/libs/remix-ui/workspace/src/lib/actions/workspace.ts b/libs/remix-ui/workspace/src/lib/actions/workspace.ts index b4307250c1..8a521e9ee1 100644 --- a/libs/remix-ui/workspace/src/lib/actions/workspace.ts +++ b/libs/remix-ui/workspace/src/lib/actions/workspace.ts @@ -25,6 +25,7 @@ import { setRenameWorkspace, setCurrentWorkspaceIsGitRepo, setGitConfig, + setCurrentWorkspaceHasGitSubmodules, } from './payload' import { addSlash, checkSlash, checkSpecialChars } from '@remix-ui/helper' @@ -423,7 +424,7 @@ export const switchToWorkspace = async (name: string) => { await plugin.fileProviders.workspace.setWorkspace(name) await plugin.setWorkspace({ name, isLocalhost: false }) const isGitRepo = await plugin.fileManager.isGitRepo() - + const hasGitSubmodule = await plugin.fileManager.hasGitSubmodules() if (isGitRepo) { const isActive = await plugin.call('manager', 'isActive', 'dgit') if (!isActive) await plugin.call('manager', 'activatePlugin', 'dgit') @@ -513,9 +514,9 @@ export const uploadFolder = async (target, targetFolder: string, cb?: (err: Erro } } -export const getWorkspaces = async (): Promise<{ name: string; isGitRepo: boolean; branches?: { remote: any; name: string }[]; currentBranch?: string }[]> | undefined => { +export const getWorkspaces = async (): Promise<{ name: string; isGitRepo: boolean; hasGitSubmodules: boolean; branches?: { remote: any; name: string }[]; currentBranch?: string }[]> | undefined => { try { - const workspaces: { name: string; isGitRepo: boolean; branches?: { remote: any; name: string }[]; currentBranch?: string }[] = await new Promise((resolve, reject) => { + const workspaces: { name: string; isGitRepo: boolean; hasGitSubmodules: boolean; branches?: { remote: any; name: string }[]; currentBranch?: string }[] = await new Promise((resolve, reject) => { const workspacesPath = plugin.fileProviders.workspace.workspacesPath plugin.fileProviders.browser.resolveDirectory('/' + workspacesPath, (error, items) => { @@ -527,7 +528,7 @@ export const getWorkspaces = async (): Promise<{ name: string; isGitRepo: boolea .filter((item) => items[item].isDirectory) .map(async (folder) => { const isGitRepo: boolean = await plugin.fileProviders.browser.exists('/' + folder + '/.git') - + const hasGitSubmodules: boolean = await plugin.fileProviders.browser.exists('/' + folder + '/.gitmodules') if (isGitRepo) { let branches = [] let currentBranch = null @@ -539,11 +540,13 @@ export const getWorkspaces = async (): Promise<{ name: string; isGitRepo: boolea isGitRepo, branches, currentBranch, + hasGitSubmodules } } else { return { name: folder.replace(workspacesPath + '/', ''), isGitRepo, + hasGitSubmodules } } }) @@ -608,7 +611,9 @@ export const cloneRepository = async (url: string) => { export const checkGit = async () => { const isGitRepo = await plugin.fileManager.isGitRepo() + const hasGitSubmodule = await plugin.fileManager.hasGitSubmodules() dispatch(setCurrentWorkspaceIsGitRepo(isGitRepo)) + dispatch(setCurrentWorkspaceHasGitSubmodules(hasGitSubmodule)) await refreshBranches() const currentBranch = await plugin.call('dGitProvider', 'currentbranch') dispatch(setCurrentWorkspaceCurrentBranch(currentBranch)) @@ -773,6 +778,12 @@ export const createHelperScripts = async (script: string) => { plugin.call('notification', 'toast', 'scripts added in the "scripts" folder') } +export const updateGitSubmodules = async () => { + dispatch(cloneRepositoryRequest()) + await plugin.call('dGitProvider', 'updateSubmodules') + dispatch(cloneRepositorySuccess()) +} + export const checkoutRemoteBranch = async (branch: string, remote: string) => { const localChanges = await hasLocalChanges() diff --git a/libs/remix-ui/workspace/src/lib/contexts/index.ts b/libs/remix-ui/workspace/src/lib/contexts/index.ts index d0b578d85e..23337569a6 100644 --- a/libs/remix-ui/workspace/src/lib/contexts/index.ts +++ b/libs/remix-ui/workspace/src/lib/contexts/index.ts @@ -46,6 +46,7 @@ export const FileSystemContext = createContext<{ dispatchCreateTsSolGithubAction: () => Promise, dispatchCreateSlitherGithubAction: () => Promise dispatchCreateHelperScripts: (script: string) => Promise + dispatchUpdateGitSubmodules: () => Promise }>(null) \ No newline at end of file diff --git a/libs/remix-ui/workspace/src/lib/providers/FileSystemProvider.tsx b/libs/remix-ui/workspace/src/lib/providers/FileSystemProvider.tsx index 13adb71235..0ddbe42ac9 100644 --- a/libs/remix-ui/workspace/src/lib/providers/FileSystemProvider.tsx +++ b/libs/remix-ui/workspace/src/lib/providers/FileSystemProvider.tsx @@ -45,7 +45,8 @@ import { createSolidityGithubAction, createTsSolGithubAction, createSlitherGithubAction, - createHelperScripts + createHelperScripts, + updateGitSubmodules } from '../actions' import {Modal, WorkspaceProps, WorkspaceTemplate} from '../types' // eslint-disable-next-line @typescript-eslint/no-unused-vars @@ -224,6 +225,10 @@ export const FileSystemProvider = (props: WorkspaceProps) => { await createHelperScripts(script) } + const dispatchUpdateGitSubmodules = async () => { + await updateGitSubmodules() + } + useEffect(() => { dispatchInitWorkspace() }, []) @@ -341,7 +346,8 @@ export const FileSystemProvider = (props: WorkspaceProps) => { dispatchCreateSolidityGithubAction, dispatchCreateTsSolGithubAction, dispatchCreateSlitherGithubAction, - dispatchCreateHelperScripts + dispatchCreateHelperScripts, + dispatchUpdateGitSubmodules } return ( diff --git a/libs/remix-ui/workspace/src/lib/reducers/workspace.ts b/libs/remix-ui/workspace/src/lib/reducers/workspace.ts index adec39d281..93a0a34069 100644 --- a/libs/remix-ui/workspace/src/lib/reducers/workspace.ts +++ b/libs/remix-ui/workspace/src/lib/reducers/workspace.ts @@ -9,6 +9,7 @@ export interface BrowserState { workspaces: { name: string isGitRepo: boolean + hasGitSubmodules?: boolean branches?: { remote: any name: string @@ -807,6 +808,22 @@ export const browserReducer = (state = browserInitialState, action: Actions) => } } + case 'SET_CURRENT_WORKSPACE_HAS_GIT_SUBMODULES': { + const payload = action.payload + + return { + ...state, + browser: { + ...state.browser, + workspaces: state.browser.workspaces.map((workspace) => { + if (workspace.name === state.browser.currentWorkspace) + workspace.hasGitSubmodules = payload + return workspace + }) + } + } + } + case 'SET_GIT_CONFIG': { const payload = action.payload diff --git a/libs/remix-ui/workspace/src/lib/remix-ui-workspace.tsx b/libs/remix-ui/workspace/src/lib/remix-ui-workspace.tsx index b5fb03ea39..c1e5f9baab 100644 --- a/libs/remix-ui/workspace/src/lib/remix-ui-workspace.tsx +++ b/libs/remix-ui/workspace/src/lib/remix-ui-workspace.tsx @@ -24,6 +24,7 @@ export function Workspace() { const [selectedWorkspace, setSelectedWorkspace] = useState<{ name: string isGitRepo: boolean + hasGitSubmodules?: boolean branches?: {remote: any; name: string}[] currentBranch?: string }>(null) @@ -139,7 +140,6 @@ export function Workspace() { useEffect(() => { const workspace = global.fs.browser.workspaces.find((workspace) => workspace.name === currentWorkspace) - setSelectedWorkspace(workspace) }, [currentWorkspace]) @@ -649,6 +649,14 @@ export function Workspace() { setShowBranches(isOpen) } + const updateSubModules = async () => { + try { + await global.dispatchUpdateGitSubmodules() + } catch (e) { + console.error(e) + } + } + const handleBranchFilterChange = (e: ChangeEvent) => { const branchFilter = e.target.value @@ -1125,6 +1133,12 @@ export function Workspace() {
GIT
+ {selectedWorkspace.hasGitSubmodules? +
+ {global.fs.browser.isRequestingCloning ?
updating submodules
: +
update submodules
} +
+ : null}
Date: Thu, 9 Nov 2023 15:59:24 +0100 Subject: [PATCH 015/163] add token --- libs/remix-ui/workspace/src/lib/actions/workspace.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/libs/remix-ui/workspace/src/lib/actions/workspace.ts b/libs/remix-ui/workspace/src/lib/actions/workspace.ts index 8a521e9ee1..98440cb5e3 100644 --- a/libs/remix-ui/workspace/src/lib/actions/workspace.ts +++ b/libs/remix-ui/workspace/src/lib/actions/workspace.ts @@ -780,7 +780,10 @@ export const createHelperScripts = async (script: string) => { export const updateGitSubmodules = async () => { dispatch(cloneRepositoryRequest()) - await plugin.call('dGitProvider', 'updateSubmodules') + const config = plugin.registry.get('config').api + const token = config.get('settings/gist-access-token') + const repoConfig = { token } + await plugin.call('dGitProvider', 'updateSubmodules', repoConfig) dispatch(cloneRepositorySuccess()) } From b260d6b5648ac4b74d4a931427d45487522c6202 Mon Sep 17 00:00:00 2001 From: filip mertens Date: Thu, 9 Nov 2023 16:09:41 +0100 Subject: [PATCH 016/163] lint --- apps/remix-ide/src/app/files/dgitProvider.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/apps/remix-ide/src/app/files/dgitProvider.js b/apps/remix-ide/src/app/files/dgitProvider.js index 4988cffaf9..590916f4f0 100644 --- a/apps/remix-ide/src/app/files/dgitProvider.js +++ b/apps/remix-ide/src/app/files/dgitProvider.js @@ -127,6 +127,7 @@ class DGitProvider extends Plugin { await window.remixFileSystem.unlink((await this.getGitConfig(module.path)).dir) } } catch (e) { + // do nothing } } } @@ -338,6 +339,7 @@ class DGitProvider extends Plugin { await window.remixFileSystem.unlink((await this.getGitConfig(module.path)).dir) } } catch (e) { + // do nothing } } } From 46cc60ad60da2a9de6e98cde574701e87a87ff39 Mon Sep 17 00:00:00 2001 From: filip mertens Date: Thu, 9 Nov 2023 16:20:08 +0100 Subject: [PATCH 017/163] fix test --- apps/remix-ide-e2e/src/tests/plugin_api.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/remix-ide-e2e/src/tests/plugin_api.ts b/apps/remix-ide-e2e/src/tests/plugin_api.ts index c0bbb316e9..203e8898bf 100644 --- a/apps/remix-ide-e2e/src/tests/plugin_api.ts +++ b/apps/remix-ide-e2e/src/tests/plugin_api.ts @@ -295,7 +295,7 @@ module.exports = { }, null, '/') }, 'Should get all workspaces #group2': async function (browser: NightwatchBrowser) { - await clickAndCheckLog(browser, 'filePanel:getWorkspaces', [{name:"default_workspace",isGitRepo:false}, {name:"emptyworkspace",isGitRepo:false}, {name:"testspace",isGitRepo:false}], null, null) + await clickAndCheckLog(browser, 'filePanel:getWorkspaces', [{name:"default_workspace",isGitRepo:false,hasGitSubmodules:false}, {name:"emptyworkspace",isGitRepo:false,hasGitSubmodules:false,has}, {name:"testspace",isGitRepo:false,hasGitSubmodules:false}], null, null) }, 'Should have set workspace event #group2': async function (browser: NightwatchBrowser) { await clickAndCheckLog(browser, 'filePanel:createWorkspace', null, { event: 'setWorkspace', args: [{ name: 'newspace', isLocalhost: false }] }, 'newspace') @@ -309,11 +309,11 @@ module.exports = { 'Should rename workspace #group2': async function (browser: NightwatchBrowser) { await clickAndCheckLog(browser, 'filePanel:renameWorkspace', null, null, ['default_workspace', 'renamed']) - await clickAndCheckLog(browser, 'filePanel:getWorkspaces', [{name:"emptyworkspace",isGitRepo:false},{name:"testspace",isGitRepo:false},{name:"newspace",isGitRepo:false},{name:"renamed",isGitRepo:false}], null, null) + await clickAndCheckLog(browser, 'filePanel:getWorkspaces', [{name:"emptyworkspace",isGitRepo:false,hasGitSubmodules:false},{name:"testspace",isGitRepo:false,hasGitSubmodules:false},{name:"newspace",isGitRepo:false,hasGitSubmodules:false},{name:"renamed",isGitRepo:false,hasGitSubmodules:false}], null, null) }, 'Should delete workspace #group2': async function (browser: NightwatchBrowser) { await clickAndCheckLog(browser, 'filePanel:deleteWorkspace', null, null, ['testspace']) - await clickAndCheckLog(browser, 'filePanel:getWorkspaces', [{name:"emptyworkspace",isGitRepo:false},{name:"newspace",isGitRepo:false},{name:"renamed",isGitRepo:false}], null, null) + await clickAndCheckLog(browser, 'filePanel:getWorkspaces', [{name:"emptyworkspace",isGitRepo:false,hasGitSubmodules:false},{name:"newspace",isGitRepo:false,hasGitSubmodules:false},{name:"renamed",isGitRepo:false,hasGitSubmodules:false}], null, null) }, // DGIT 'Should have changes on new workspace #group3': async function (browser: NightwatchBrowser) { From 54c1ef855d3559ab1b5cc27e8425f7f76fb379eb Mon Sep 17 00:00:00 2001 From: filip mertens Date: Thu, 9 Nov 2023 16:24:25 +0100 Subject: [PATCH 018/163] test --- apps/remix-ide-e2e/src/tests/plugin_api.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/remix-ide-e2e/src/tests/plugin_api.ts b/apps/remix-ide-e2e/src/tests/plugin_api.ts index 203e8898bf..adcc378f5d 100644 --- a/apps/remix-ide-e2e/src/tests/plugin_api.ts +++ b/apps/remix-ide-e2e/src/tests/plugin_api.ts @@ -295,7 +295,7 @@ module.exports = { }, null, '/') }, 'Should get all workspaces #group2': async function (browser: NightwatchBrowser) { - await clickAndCheckLog(browser, 'filePanel:getWorkspaces', [{name:"default_workspace",isGitRepo:false,hasGitSubmodules:false}, {name:"emptyworkspace",isGitRepo:false,hasGitSubmodules:false,has}, {name:"testspace",isGitRepo:false,hasGitSubmodules:false}], null, null) + await clickAndCheckLog(browser, 'filePanel:getWorkspaces', [{name:"default_workspace",isGitRepo:false,hasGitSubmodules:false}, {name:"emptyworkspace",isGitRepo:false,hasGitSubmodules:false}, {name:"testspace",isGitRepo:false,hasGitSubmodules:false}], null, null) }, 'Should have set workspace event #group2': async function (browser: NightwatchBrowser) { await clickAndCheckLog(browser, 'filePanel:createWorkspace', null, { event: 'setWorkspace', args: [{ name: 'newspace', isLocalhost: false }] }, 'newspace') From 2b6de0ecb060ef02e53023f17a09cf4085acb80d Mon Sep 17 00:00:00 2001 From: filip mertens Date: Thu, 9 Nov 2023 17:36:27 +0100 Subject: [PATCH 019/163] rm unused --- libs/remix-ui/workspace/src/lib/actions/workspace.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/libs/remix-ui/workspace/src/lib/actions/workspace.ts b/libs/remix-ui/workspace/src/lib/actions/workspace.ts index 98440cb5e3..67a456ca6d 100644 --- a/libs/remix-ui/workspace/src/lib/actions/workspace.ts +++ b/libs/remix-ui/workspace/src/lib/actions/workspace.ts @@ -424,7 +424,6 @@ export const switchToWorkspace = async (name: string) => { await plugin.fileProviders.workspace.setWorkspace(name) await plugin.setWorkspace({ name, isLocalhost: false }) const isGitRepo = await plugin.fileManager.isGitRepo() - const hasGitSubmodule = await plugin.fileManager.hasGitSubmodules() if (isGitRepo) { const isActive = await plugin.call('manager', 'isActive', 'dgit') if (!isActive) await plugin.call('manager', 'activatePlugin', 'dgit') From 290e7a29f340aeea8d25af2afb175a3c2b4f2af8 Mon Sep 17 00:00:00 2001 From: lianahus Date: Thu, 9 Nov 2023 18:27:40 +0100 Subject: [PATCH 020/163] fixed react errors and icons for licenses --- .../circuit-compiler/src/app/components/container.tsx | 11 ++++++++--- .../solidity-compiler/src/lib/compiler-container.tsx | 2 +- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/apps/circuit-compiler/src/app/components/container.tsx b/apps/circuit-compiler/src/app/components/container.tsx index 854ac3d611..c38d7adaa1 100644 --- a/apps/circuit-compiler/src/app/components/container.tsx +++ b/apps/circuit-compiler/src/app/components/container.tsx @@ -53,11 +53,16 @@ export function Container () {
-
+
+
+
+ +
+
+
+
+ + +
+
+
+
+ +
+
+
+
+ + +
+
+
+
+ +
+
+ ) + const ipfsSettings = () => (
@@ -481,6 +554,7 @@ export const RemixUiSettings = (props: RemixUiSettingsProps) => { {ipfsSettings()} + {copilotSettings()}
) } diff --git a/libs/remix-ui/settings/src/lib/settingsAction.ts b/libs/remix-ui/settings/src/lib/settingsAction.ts index 87ecd3c0d3..36ec1cbf0b 100644 --- a/libs/remix-ui/settings/src/lib/settingsAction.ts +++ b/libs/remix-ui/settings/src/lib/settingsAction.ts @@ -24,6 +24,21 @@ export const personal = (config, checked, dispatch) => { dispatch({ type: 'personal', payload: { isChecked: checked, textClass: checked ? textDark : textSecondary } }) } +export const copilotActivate = (config, checked, dispatch) => { + config.set('settings/copilot/suggest/activate', checked) + dispatch({ type: 'copilot/suggest/activate', payload: { isChecked: checked, textClass: checked ? textDark : textSecondary } }) +} + +export const copilotMaxNewToken = (config, checked, dispatch) => { + config.set('settings/copilot/suggest/max_new_tokens', checked) + dispatch({ type: 'copilot/suggest/max_new_tokens', payload: { isChecked: checked, textClass: checked ? textDark : textSecondary } }) +} + +export const copilotTemperature = (config, checked, dispatch) => { + config.set('settings/copilot/suggest/temperature', checked) + dispatch({ type: 'copilot/suggest/temperature', payload: { isChecked: checked, textClass: checked ? textDark : textSecondary } }) +} + export const useMatomoAnalytics = (config, checked, dispatch) => { config.set('settings/matomo-analytics', checked) dispatch({ type: 'useMatomoAnalytics', payload: { isChecked: checked, textClass: checked ? textDark : textSecondary } }) diff --git a/libs/remix-ui/settings/src/lib/settingsReducer.ts b/libs/remix-ui/settings/src/lib/settingsReducer.ts index 4c1db50ad2..abad510431 100644 --- a/libs/remix-ui/settings/src/lib/settingsReducer.ts +++ b/libs/remix-ui/settings/src/lib/settingsReducer.ts @@ -41,6 +41,21 @@ export const initialState = { name: 'displayErrors', isChecked: true, textClass: textSecondary + }, + { + name: 'copilot/suggest/activate', + isChecked: false, + textClass: textSecondary + }, + { + name: 'copilot/suggest/max_new_tokens', + value: 5, + textClass: textSecondary + }, + { + name: 'copilot/suggest/temperature', + value: 0.5, + textClass: textSecondary } ] } @@ -128,6 +143,36 @@ export const settingReducer = (state, action) => { return { ...state } + case 'copilot/suggest/activate': + state.elementState.map(element => { + if (element.name === 'copilot/suggest/activate') { + element.isChecked = action.payload.isChecked + element.textClass = action.payload.textClass + } + }) + return { + ...state + } + case 'copilot/suggest/max_new_tokens': + state.elementState.map(element => { + if (element.name === 'copilot/suggest/max_new_tokens') { + element.value = action.payload.value + element.textClass = action.payload.textClass + } + }) + return { + ...state + } + case 'copilot/suggest/temperature': + state.elementState.map(element => { + if (element.name === 'useShowGasInEditor') { + element.value = action.payload.value + element.textClass = action.payload.textClass + } + }) + return { + ...state + } default: return initialState } From 0a031d2123a80988157c6ba2be73cfa68739ef2f Mon Sep 17 00:00:00 2001 From: yann300 Date: Wed, 8 Nov 2023 09:40:25 +0100 Subject: [PATCH 035/163] rollback yarn.lock --- apps/remix-ide/src/app.js | 4 ++-- libs/remix-ui/settings/src/lib/remix-ui-settings.tsx | 8 ++++---- yarn.lock | 8 ++++---- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/apps/remix-ide/src/app.js b/apps/remix-ide/src/app.js index d2c9d21bc6..f6e5e1c214 100644 --- a/apps/remix-ide/src/app.js +++ b/apps/remix-ide/src/app.js @@ -56,7 +56,7 @@ const remixLib = require('@remix-project/remix-lib') import {QueryParams} from '@remix-project/remix-lib' import {SearchPlugin} from './app/tabs/search' -import { SuggestionService } from './app/plugins/copilot/suggestion-service/suggestion-service' +import { CopilotSuggestion } from './app/plugins/copilot/suggestion-service/copilot-suggestion' const Storage = remixLib.Storage const RemixDProvider = require('./app/files/remixDProvider') @@ -189,7 +189,7 @@ class AppComponent { // ----------------- AI -------------------------------------- const openaigpt = new OpenAIGpt() - const copilotSuggestion = new SuggestionService() + const copilotSuggestion = new CopilotSuggestion() // ----------------- import content service ------------------------ const contentImport = new CompilerImports() diff --git a/libs/remix-ui/settings/src/lib/remix-ui-settings.tsx b/libs/remix-ui/settings/src/lib/remix-ui-settings.tsx index bc1e4c6508..844cc2643f 100644 --- a/libs/remix-ui/settings/src/lib/remix-ui-settings.tsx +++ b/libs/remix-ui/settings/src/lib/remix-ui-settings.tsx @@ -404,7 +404,7 @@ export const RemixUiSettings = (props: RemixUiSettingsProps) => {
- +
@@ -413,7 +413,7 @@ export const RemixUiSettings = (props: RemixUiSettingsProps) => {
@@ -426,7 +426,7 @@ export const RemixUiSettings = (props: RemixUiSettingsProps) => {
@@ -439,7 +439,7 @@ export const RemixUiSettings = (props: RemixUiSettingsProps) => {
diff --git a/yarn.lock b/yarn.lock index 08af35a06f..ed285010d5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5628,7 +5628,7 @@ resolved "https://registry.yarnpkg.com/@types/long/-/long-4.0.2.tgz#b74129719fc8d11c01868010082d483b7545591a" integrity sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA== -"@types/lru-cache@^5.1.0": +"@types/lru-cache@5.1.1", "@types/lru-cache@^5.1.0": version "5.1.1" resolved "https://registry.yarnpkg.com/@types/lru-cache/-/lru-cache-5.1.1.tgz#c48c2e27b65d2a153b19bfc1a317e30872e01eef" integrity sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw== @@ -5685,9 +5685,9 @@ integrity sha512-jRHfWsvyMtXdbhnz5CVHxaBgnV6duZnPlQuRSo/dm/GnmikNcmZhxIES4E9OZjUmQ8C+HCl4KJux+cXN/ErGDQ== "@types/node@>=13.7.0": - version "20.8.9" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.8.9.tgz#646390b4fab269abce59c308fc286dcd818a2b08" - integrity sha512-UzykFsT3FhHb1h7yD4CA4YhBHq545JC0YnEz41xkipN88eKQtL6rSgocL5tbAP6Ola9Izm/Aw4Ora8He4x0BHg== + version "20.9.0" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.9.0.tgz#bfcdc230583aeb891cf51e73cfdaacdd8deae298" + integrity sha512-nekiGu2NDb1BcVofVcEKMIwzlx4NjHlcjhoxxKBNLtz15Y1z7MYf549DFvkHSId02Ax6kGwWntIBPC3l/JZcmw== dependencies: undici-types "~5.26.4" From 763e84ccf21e4674e5c521a8c862879f643dffb9 Mon Sep 17 00:00:00 2001 From: yann300 Date: Thu, 9 Nov 2023 11:17:48 +0100 Subject: [PATCH 036/163] set and use settings --- .../suggestion-service/copilot-suggestion.ts | 13 ++++++--- .../settings/src/lib/remix-ui-settings.tsx | 29 ++++++++++--------- 2 files changed, 24 insertions(+), 18 deletions(-) diff --git a/apps/remix-ide/src/app/plugins/copilot/suggestion-service/copilot-suggestion.ts b/apps/remix-ide/src/app/plugins/copilot/suggestion-service/copilot-suggestion.ts index 1d1c3caa49..2c326e7115 100644 --- a/apps/remix-ide/src/app/plugins/copilot/suggestion-service/copilot-suggestion.ts +++ b/apps/remix-ide/src/app/plugins/copilot/suggestion-service/copilot-suggestion.ts @@ -6,7 +6,7 @@ const profile = { name: 'copilot-suggestion', displayName: 'copilot-suggestion', description: 'copilot-suggestion', - methods: ['suggest'] + methods: ['suggest', 'init', 'uninstall'] } export class CopilotSuggestion extends Plugin { @@ -26,11 +26,16 @@ export class CopilotSuggestion extends Plugin { } async suggest(content: string) { + if (!await this.call('settings', 'get', 'settings/copilot/suggest/activate')) return { output: [{ generated_text: ''}]} + + const max_new_tokens = await this.call('settings', 'get', 'settings/copilot/suggest/max_new_tokens') + const temperature = await this.call('settings', 'get', 'settings/copilot/suggest/temperature') + console.log('suggest', max_new_tokens, temperature) const options: SuggestOptions = { do_sample: false, top_k: 0, - temperature: await this.call('settings', 'get', 'settings/copilot/suggest/temperature'), - max_new_tokens: await this.call('settings', 'get', 'settings/copilot/suggest/max_new_tokens') + temperature, + max_new_tokens } return this.service.suggest(content, options) } @@ -40,5 +45,5 @@ export class CopilotSuggestion extends Plugin { } async uninstall() { - } + } } \ No newline at end of file diff --git a/libs/remix-ui/settings/src/lib/remix-ui-settings.tsx b/libs/remix-ui/settings/src/lib/remix-ui-settings.tsx index 844cc2643f..83c6feacdb 100644 --- a/libs/remix-ui/settings/src/lib/remix-ui-settings.tsx +++ b/libs/remix-ui/settings/src/lib/remix-ui-settings.tsx @@ -135,11 +135,11 @@ export const RemixUiSettings = (props: RemixUiSettingsProps) => { } const onchangeCopilotMaxNewToken = (event) => { - copilotMaxNewToken(props.config, event.target.value, dispatch) + copilotMaxNewToken(props.config, parseInt(event.target.value), dispatch) } const onchangeCopilotTemperature = (event) => { - copilotTemperature(props.config, event.target.value, dispatch) + copilotTemperature(props.config, parseInt(event.target.value) / 100, dispatch) } const onchangePersonal = (event) => { @@ -399,12 +399,13 @@ export const RemixUiSettings = (props: RemixUiSettingsProps) => { const isCopilotActivated = props.config.get('settings/copilot/suggest/activate') || false const copilotMaxnewToken = props.config.get('settings/copilot/suggest/max_new_tokens') || 5 - const copilotTemperatureValue = props.config.get('settings/copilot/suggest/temperature') || 0.5 + const copilotTemperatureValue = (props.config.get('settings/copilot/suggest/temperature') || 0.5) * 100 + if (isCopilotActivated) props.plugin.call('copilot-suggestion', 'init') const copilotSettings = () => (
- +
@@ -423,11 +424,11 @@ export const RemixUiSettings = (props: RemixUiSettingsProps) => {
-
- -
@@ -436,11 +437,11 @@ export const RemixUiSettings = (props: RemixUiSettingsProps) => {
-
- -
@@ -528,6 +529,7 @@ export const RemixUiSettings = (props: RemixUiSettingsProps) => {
{state.message ? : null} {generalConfig()} + {copilotSettings()} { saveTokenToast(props.config, dispatchToast, githubToken, 'gist-access-token') @@ -553,8 +555,7 @@ export const RemixUiSettings = (props: RemixUiSettingsProps) => { {swarmSettings()} {ipfsSettings()} - - {copilotSettings()} +
) } From 5d1f7534a8fba87b872f1bcbd2a9ea3b8027788b Mon Sep 17 00:00:00 2001 From: yann300 Date: Thu, 9 Nov 2023 11:18:24 +0100 Subject: [PATCH 037/163] cancel suggestion --- .../src/lib/providers/inlineCompletionProvider.ts | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/libs/remix-ui/editor/src/lib/providers/inlineCompletionProvider.ts b/libs/remix-ui/editor/src/lib/providers/inlineCompletionProvider.ts index ed7c68bda5..59c8420ca4 100644 --- a/libs/remix-ui/editor/src/lib/providers/inlineCompletionProvider.ts +++ b/libs/remix-ui/editor/src/lib/providers/inlineCompletionProvider.ts @@ -20,6 +20,12 @@ export class RemixInLineCompletionProvider implements monacoTypes.languages.Inli endColumn: position.column, }); + // abort if there is a signal + if (token.isCancellationRequested) { + console.log('aborted') + return { items: [] }; + } + const result = await this.props.plugin.call('copilot-suggestion', 'suggest', word) const generatedText = (result as any).output[0].generated_text as string console.log(word, result) @@ -31,12 +37,12 @@ export class RemixInLineCompletionProvider implements monacoTypes.languages.Inli snippet: clean } }; - + // abort if there is a signal if (token.isCancellationRequested) { console.log('aborted') return { items: [] }; - } + } return { items: [item] } From 74a654b9b3b87a70e34d4a82fc1706e5c273139f Mon Sep 17 00:00:00 2001 From: yann300 Date: Thu, 9 Nov 2023 11:18:36 +0100 Subject: [PATCH 038/163] labels --- apps/remix-ide/src/app/tabs/locales/en/settings.json | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/apps/remix-ide/src/app/tabs/locales/en/settings.json b/apps/remix-ide/src/app/tabs/locales/en/settings.json index 2752f19f75..d5496259a0 100644 --- a/apps/remix-ide/src/app/tabs/locales/en/settings.json +++ b/apps/remix-ide/src/app/tabs/locales/en/settings.json @@ -36,5 +36,9 @@ "settings.port": "PORT", "settings.projectID": "PROJECT ID", "settings.projectSecret": "PROJECT SECRET", - "settings.analyticsInRemix": "Analytics in Remix IDE" + "settings.analyticsInRemix": "Analytics in Remix IDE", + "settings.copilot": "Solidity copilot - Alpha", + "settings.copilot.activate": "Load & Activate copilot", + "settings.copilot.max_new_tokens": "Maximum amount of new words to generate", + "settings.copilot.temperature": "Temperature" } From 403e7a3f6837b808909caab2e7d36ea4bbff14be Mon Sep 17 00:00:00 2001 From: yann300 Date: Thu, 9 Nov 2023 12:58:52 +0100 Subject: [PATCH 039/163] linting --- .../suggestion-service/copilot-suggestion.ts | 2 +- .../suggestion-service/suggestion-service.ts | 70 +++++----- .../copilot/suggestion-service/worker.js | 128 +++++++++--------- 3 files changed, 100 insertions(+), 100 deletions(-) diff --git a/apps/remix-ide/src/app/plugins/copilot/suggestion-service/copilot-suggestion.ts b/apps/remix-ide/src/app/plugins/copilot/suggestion-service/copilot-suggestion.ts index 2c326e7115..e3d46db7ad 100644 --- a/apps/remix-ide/src/app/plugins/copilot/suggestion-service/copilot-suggestion.ts +++ b/apps/remix-ide/src/app/plugins/copilot/suggestion-service/copilot-suggestion.ts @@ -41,7 +41,7 @@ export class CopilotSuggestion extends Plugin { } async init() { - return this.service.init() + return this.service.init() } async uninstall() { diff --git a/apps/remix-ide/src/app/plugins/copilot/suggestion-service/suggestion-service.ts b/apps/remix-ide/src/app/plugins/copilot/suggestion-service/suggestion-service.ts index 374b4434fe..305cf4bd6f 100644 --- a/apps/remix-ide/src/app/plugins/copilot/suggestion-service/suggestion-service.ts +++ b/apps/remix-ide/src/app/plugins/copilot/suggestion-service/suggestion-service.ts @@ -8,7 +8,7 @@ export class SuggestionService { events: EventEmitter constructor() { this.worker = new Worker(new URL('./worker.js', import.meta.url), { - type: 'module' + type: 'module' }); this.events = new EventEmitter() this.responses = [] @@ -17,46 +17,46 @@ export class SuggestionService { async init() { const onMessageReceived = (e) => { switch (e.data.status) { - case 'initiate': - console.log(e.data) - this.events.emit(e.data.status, e.data) - // Model file start load: add a new progress item to the list. - break; + case 'initiate': + console.log(e.data) + this.events.emit(e.data.status, e.data) + // Model file start load: add a new progress item to the list. + break; - case 'progress': - this.events.emit(e.data.status, e.data) - console.log(e.data) - // Model file progress: update one of the progress items. - break; + case 'progress': + this.events.emit(e.data.status, e.data) + console.log(e.data) + // Model file progress: update one of the progress items. + break; - case 'done': - this.events.emit(e.data.status, e.data) - console.log(e.data) - // Model file loaded: remove the progress item from the list. - break; + case 'done': + this.events.emit(e.data.status, e.data) + console.log(e.data) + // Model file loaded: remove the progress item from the list. + break; - case 'ready': - this.events.emit(e.data.status, e.data) - console.log(e.data) - // Pipeline ready: the worker is ready to accept messages. - break; + case 'ready': + this.events.emit(e.data.status, e.data) + console.log(e.data) + // Pipeline ready: the worker is ready to accept messages. + break; - case 'update': - this.events.emit(e.data.status, e.data) - console.log(e.data) - // Generation update: update the output text. - break; + case 'update': + this.events.emit(e.data.status, e.data) + console.log(e.data) + // Generation update: update the output text. + break; - case 'complete': - console.log(e.data) - if (this.responses[e.data.id]) { - this.responses[e.data.id](null, e.data) - } else { - console.log('no callback for', e.data) - } + case 'complete': + console.log(e.data) + if (this.responses[e.data.id]) { + this.responses[e.data.id](null, e.data) + } else { + console.log('no callback for', e.data) + } - // Generation complete: re-enable the "Generate" button - break; + // Generation complete: re-enable the "Generate" button + break; } }; diff --git a/apps/remix-ide/src/app/plugins/copilot/suggestion-service/worker.js b/apps/remix-ide/src/app/plugins/copilot/suggestion-service/worker.js index b70758f232..3b6524b03c 100644 --- a/apps/remix-ide/src/app/plugins/copilot/suggestion-service/worker.js +++ b/apps/remix-ide/src/app/plugins/copilot/suggestion-service/worker.js @@ -8,82 +8,82 @@ const instance = null * This class uses the Singleton pattern to ensure that only one instance of the pipeline is loaded. */ class CodeCompletionPipeline { - static task = 'text-generation'; - static model = null - static instance = null; + static task = 'text-generation'; + static model = null + static instance = null; - static async getInstance(progress_callback = null) { - if (this.instance === null) { - this.instance = pipeline(this.task, this.model, { progress_callback }); - } - - return this.instance; + static async getInstance(progress_callback = null) { + if (this.instance === null) { + this.instance = pipeline(this.task, this.model, { progress_callback }); } + + return this.instance; + } } // Listen for messages from the main thread self.addEventListener('message', async (event) => { - const { - id, model, text, max_new_tokens, cmd, + const { + id, model, text, max_new_tokens, cmd, - // Generation parameters - temperature, - top_k, - do_sample, - } = event.data; + // Generation parameters + temperature, + top_k, + do_sample, + } = event.data; - if (cmd === 'init') { - // Retrieve the code-completion pipeline. When called for the first time, - // this will load the pipeline and save it for future use. - CodeCompletionPipeline.model = model - await CodeCompletionPipeline.getInstance(x => { - // We also add a progress callback to the pipeline so that we can - // track model loading. - self.postMessage(x); - }); - return - } + if (cmd === 'init') { + // Retrieve the code-completion pipeline. When called for the first time, + // this will load the pipeline and save it for future use. + CodeCompletionPipeline.model = model + await CodeCompletionPipeline.getInstance(x => { + // We also add a progress callback to the pipeline so that we can + // track model loading. + self.postMessage(x); + }); + return + } - if (!CodeCompletionPipeline.instance) { - // Send the output back to the main thread - self.postMessage({ - id, - status: 'error', - message: 'model not yet loaded' - }); - } + if (!CodeCompletionPipeline.instance) { + // Send the output back to the main thread + self.postMessage({ + id, + status: 'error', + message: 'model not yet loaded' + }); + } - if (cmd === 'suggest') { - // Retrieve the code-completion pipeline. When called for the first time, - // this will load the pipeline and save it for future use. - let generator = await CodeCompletionPipeline.getInstance(x => { - // We also add a progress callback to the pipeline so that we can - // track model loading. - self.postMessage(x); - }); + if (cmd === 'suggest') { + // Retrieve the code-completion pipeline. When called for the first time, + // this will load the pipeline and save it for future use. + let generator = await CodeCompletionPipeline.getInstance(x => { + // We also add a progress callback to the pipeline so that we can + // track model loading. + self.postMessage(x); + }); - // Actually perform the code-completion - let output = await generator(text, { - max_new_tokens, - temperature, - top_k, - do_sample, + // Actually perform the code-completion + let output = await generator(text, { + max_new_tokens, + temperature, + top_k, + do_sample, - // Allows for partial output - callback_function: x => { - self.postMessage({ - id, - status: 'update', - output: generator.tokenizer.decode(x[0].output_token_ids, { skip_special_tokens: true }) - }); - } + // Allows for partial output + callback_function: x => { + self.postMessage({ + id, + status: 'update', + output: generator.tokenizer.decode(x[0].output_token_ids, { skip_special_tokens: true }) }); + } + }); - // Send the output back to the main thread - self.postMessage({ - id, - status: 'complete', - output: output, - }); - } + // Send the output back to the main thread + self.postMessage({ + id, + status: 'complete', + output: output, + }); + } }); \ No newline at end of file From 144b5440c818fe848bb2d74e8c6eeb0ac39ebc03 Mon Sep 17 00:00:00 2001 From: yann300 Date: Thu, 9 Nov 2023 17:10:47 +0100 Subject: [PATCH 040/163] improve suggestionProvider --- .../editor/src/lib/providers/inlineCompletionProvider.ts | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/libs/remix-ui/editor/src/lib/providers/inlineCompletionProvider.ts b/libs/remix-ui/editor/src/lib/providers/inlineCompletionProvider.ts index 59c8420ca4..85155e72e4 100644 --- a/libs/remix-ui/editor/src/lib/providers/inlineCompletionProvider.ts +++ b/libs/remix-ui/editor/src/lib/providers/inlineCompletionProvider.ts @@ -12,6 +12,10 @@ export class RemixInLineCompletionProvider implements monacoTypes.languages.Inli } async provideInlineCompletions(model: monacoTypes.editor.ITextModel, position: monacoTypes.Position, context: monacoTypes.languages.InlineCompletionContext, token: monacoTypes.CancellationToken): Promise> { + if (context.selectedSuggestionInfo) { + console.log('return empty from provideInlineCompletions') + return; + } // get text before the position of the completion const word = model.getValueInRange({ startLineNumber: 1, @@ -44,7 +48,8 @@ export class RemixInLineCompletionProvider implements monacoTypes.languages.Inli return { items: [] }; } return { - items: [item] + items: [item], + enableForwardStability: true } } From 607aa25f210ab345df9eb1098b49c5e611933d88 Mon Sep 17 00:00:00 2001 From: yann300 Date: Thu, 9 Nov 2023 18:02:13 +0100 Subject: [PATCH 041/163] try getting some content --- .../suggestion-service/copilot-suggestion.ts | 22 +++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/apps/remix-ide/src/app/plugins/copilot/suggestion-service/copilot-suggestion.ts b/apps/remix-ide/src/app/plugins/copilot/suggestion-service/copilot-suggestion.ts index e3d46db7ad..179f8865ac 100644 --- a/apps/remix-ide/src/app/plugins/copilot/suggestion-service/copilot-suggestion.ts +++ b/apps/remix-ide/src/app/plugins/copilot/suggestion-service/copilot-suggestion.ts @@ -11,9 +11,11 @@ const profile = { export class CopilotSuggestion extends Plugin { service: SuggestionService + context: string constructor() { super(profile) this.service = new SuggestionService() + this.context = '' this.service.events.on('progress', (data) => { this.call('terminal', 'log', {type: 'info', value: `loading Solidity copilot: ${(data.loaded / data.total) * 100}% done.` }) }) @@ -22,7 +24,7 @@ export class CopilotSuggestion extends Plugin { }) this.service.events.on('ready', (data) => { this.call('terminal', 'log', { type: 'info', value: `Solidity copilot ready to use.`}) - }) + }) } async suggest(content: string) { @@ -37,13 +39,25 @@ export class CopilotSuggestion extends Plugin { temperature, max_new_tokens } - return this.service.suggest(content, options) + return this.service.suggest(this.context ? this.context + '\n\n' + content : content, options) + } + + async loadModeContent() { + let importsContent = '' + const imports = await this.call('codeParser', 'getImports') + for (const imp of imports.modules) { + try { + importsContent += '\n\n' + (await this.call('contentImport', 'resolve', imp)).content + } catch (e) { + console.log(e) + } + } + return importsContent } async init() { return this.service.init() } - async uninstall() { - } + async uninstall() {} } \ No newline at end of file From a52d538304e0e804178cad9bbaef14fa66c8ea85 Mon Sep 17 00:00:00 2001 From: yann300 Date: Thu, 9 Nov 2023 22:42:10 +0100 Subject: [PATCH 042/163] use timespan instead of array && abort --- .../suggestion-service/suggestion-service.ts | 23 ++++++++++++++----- 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/apps/remix-ide/src/app/plugins/copilot/suggestion-service/suggestion-service.ts b/apps/remix-ide/src/app/plugins/copilot/suggestion-service/suggestion-service.ts index 305cf4bd6f..becdd6ba47 100644 --- a/apps/remix-ide/src/app/plugins/copilot/suggestion-service/suggestion-service.ts +++ b/apps/remix-ide/src/app/plugins/copilot/suggestion-service/suggestion-service.ts @@ -4,14 +4,16 @@ export type SuggestOptions = { max_new_tokens: number, temperature: number, top_ export class SuggestionService { worker: Worker - responses: Array + responses: { [key: number]: Function } events: EventEmitter + current: number constructor() { this.worker = new Worker(new URL('./worker.js', import.meta.url), { type: 'module' }); this.events = new EventEmitter() - this.responses = [] + this.responses = {} + this.current } async init() { @@ -50,7 +52,13 @@ export class SuggestionService { case 'complete': console.log(e.data) if (this.responses[e.data.id]) { - this.responses[e.data.id](null, e.data) + if (this.current === e.data.id) { + this.responses[e.data.id](null, e.data) + } else { + this.responses[e.data.id]('aborted') + } + delete this.responses[e.data.id] + this.current = null } else { console.log('no callback for', e.data) } @@ -71,8 +79,11 @@ export class SuggestionService { suggest (content: string, options: SuggestOptions) { return new Promise((resolve, reject) => { + if (this.current) return reject(new Error('already running')) + const timespan = Date.now() + this.current = timespan this.worker.postMessage({ - id: this.responses.length, + id: timespan, cmd: 'suggest', text: content, max_new_tokens: options.max_new_tokens, @@ -80,10 +91,10 @@ export class SuggestionService { top_k: options.top_k, do_sample: options.do_sample }) - this.responses.push((error, result) => { + this.responses[timespan] = (error, result) => { if (error) return reject(error) resolve(result) - }) + } }) } } \ No newline at end of file From 6f898cd37b04d62c8cf5e3223b41d863a3ecfbba Mon Sep 17 00:00:00 2001 From: yann300 Date: Thu, 9 Nov 2023 22:42:29 +0100 Subject: [PATCH 043/163] comment update event --- .../src/app/plugins/copilot/suggestion-service/worker.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/remix-ide/src/app/plugins/copilot/suggestion-service/worker.js b/apps/remix-ide/src/app/plugins/copilot/suggestion-service/worker.js index 3b6524b03c..a5affc48b1 100644 --- a/apps/remix-ide/src/app/plugins/copilot/suggestion-service/worker.js +++ b/apps/remix-ide/src/app/plugins/copilot/suggestion-service/worker.js @@ -71,11 +71,12 @@ self.addEventListener('message', async (event) => { // Allows for partial output callback_function: x => { - self.postMessage({ + /*self.postMessage({ id, status: 'update', output: generator.tokenizer.decode(x[0].output_token_ids, { skip_special_tokens: true }) }); + */ } }); From 932b75db13c3d2e0e7dbe64be3ab0e5624f0b612 Mon Sep 17 00:00:00 2001 From: yann300 Date: Thu, 9 Nov 2023 22:43:07 +0100 Subject: [PATCH 044/163] use trigger char --- .../lib/providers/inlineCompletionProvider.ts | 27 ++++++++++++------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/libs/remix-ui/editor/src/lib/providers/inlineCompletionProvider.ts b/libs/remix-ui/editor/src/lib/providers/inlineCompletionProvider.ts index 85155e72e4..2e4c96142c 100644 --- a/libs/remix-ui/editor/src/lib/providers/inlineCompletionProvider.ts +++ b/libs/remix-ui/editor/src/lib/providers/inlineCompletionProvider.ts @@ -24,28 +24,37 @@ export class RemixInLineCompletionProvider implements monacoTypes.languages.Inli endColumn: position.column, }); + if (!word.endsWith(' ') && !word.endsWith('\n') && !word.endsWith(';')) { + console.log('not a trigger char') + return; + } + // abort if there is a signal if (token.isCancellationRequested) { console.log('aborted') - return { items: [] }; - } + return + } - const result = await this.props.plugin.call('copilot-suggestion', 'suggest', word) + let result + try { + result = await this.props.plugin.call('copilot-suggestion', 'suggest', word) + } catch (err) { + return + } + const generatedText = (result as any).output[0].generated_text as string - console.log(word, result) + // console.log(word, result) const clean = generatedText.replace(word, '') - console.log(clean) + console.log('suggest result', clean) const item: monacoTypes.languages.InlineCompletion = { - insertText: { - snippet: clean - } + insertText: clean }; // abort if there is a signal if (token.isCancellationRequested) { console.log('aborted') - return { items: [] }; + return } return { items: [item], From 6699e1cae35a19db7c577592daf22afd110582a0 Mon Sep 17 00:00:00 2001 From: yann300 Date: Thu, 9 Nov 2023 22:48:14 +0100 Subject: [PATCH 045/163] linting --- .../editor/src/lib/providers/inlineCompletionProvider.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/remix-ui/editor/src/lib/providers/inlineCompletionProvider.ts b/libs/remix-ui/editor/src/lib/providers/inlineCompletionProvider.ts index 2e4c96142c..93e2a258d7 100644 --- a/libs/remix-ui/editor/src/lib/providers/inlineCompletionProvider.ts +++ b/libs/remix-ui/editor/src/lib/providers/inlineCompletionProvider.ts @@ -13,7 +13,7 @@ export class RemixInLineCompletionProvider implements monacoTypes.languages.Inli async provideInlineCompletions(model: monacoTypes.editor.ITextModel, position: monacoTypes.Position, context: monacoTypes.languages.InlineCompletionContext, token: monacoTypes.CancellationToken): Promise> { if (context.selectedSuggestionInfo) { - console.log('return empty from provideInlineCompletions') + console.log('return empty from provideInlineCompletions') return; } // get text before the position of the completion From da63ad58348863cf44b65376b294ebc9966938b8 Mon Sep 17 00:00:00 2001 From: yann300 Date: Fri, 10 Nov 2023 09:03:45 +0100 Subject: [PATCH 046/163] add a trigger char --- .../editor/src/lib/providers/inlineCompletionProvider.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/remix-ui/editor/src/lib/providers/inlineCompletionProvider.ts b/libs/remix-ui/editor/src/lib/providers/inlineCompletionProvider.ts index 93e2a258d7..e8895fef73 100644 --- a/libs/remix-ui/editor/src/lib/providers/inlineCompletionProvider.ts +++ b/libs/remix-ui/editor/src/lib/providers/inlineCompletionProvider.ts @@ -24,7 +24,7 @@ export class RemixInLineCompletionProvider implements monacoTypes.languages.Inli endColumn: position.column, }); - if (!word.endsWith(' ') && !word.endsWith('\n') && !word.endsWith(';')) { + if (!word.endsWith(' ') && !word.endsWith('\n') && !word.endsWith(';') && !word.endsWith('.')) { console.log('not a trigger char') return; } From 33875911900f2195bc14dfda0af7b847a420e9f4 Mon Sep 17 00:00:00 2001 From: yann300 Date: Fri, 10 Nov 2023 14:09:19 +0100 Subject: [PATCH 047/163] fix the generated text removing a space from the input & linting --- .../plugins/copilot/suggestion-service/suggestion-service.ts | 1 + .../editor/src/lib/providers/inlineCompletionProvider.ts | 5 ++--- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/remix-ide/src/app/plugins/copilot/suggestion-service/suggestion-service.ts b/apps/remix-ide/src/app/plugins/copilot/suggestion-service/suggestion-service.ts index becdd6ba47..bfe8b872ee 100644 --- a/apps/remix-ide/src/app/plugins/copilot/suggestion-service/suggestion-service.ts +++ b/apps/remix-ide/src/app/plugins/copilot/suggestion-service/suggestion-service.ts @@ -4,6 +4,7 @@ export type SuggestOptions = { max_new_tokens: number, temperature: number, top_ export class SuggestionService { worker: Worker + // eslint-disable-next-line @typescript-eslint/ban-types responses: { [key: number]: Function } events: EventEmitter current: number diff --git a/libs/remix-ui/editor/src/lib/providers/inlineCompletionProvider.ts b/libs/remix-ui/editor/src/lib/providers/inlineCompletionProvider.ts index e8895fef73..5ef8d7f07c 100644 --- a/libs/remix-ui/editor/src/lib/providers/inlineCompletionProvider.ts +++ b/libs/remix-ui/editor/src/lib/providers/inlineCompletionProvider.ts @@ -43,9 +43,8 @@ export class RemixInLineCompletionProvider implements monacoTypes.languages.Inli } const generatedText = (result as any).output[0].generated_text as string - // console.log(word, result) - - const clean = generatedText.replace(word, '') + // the generated text remove a space from the context. that why we need to remove all the spaces + const clean = generatedText.replace(/ /g, '').replace(word.replace(/ /g, ''), '') console.log('suggest result', clean) const item: monacoTypes.languages.InlineCompletion = { insertText: clean From e1c46a9bfb2fda0212d0262f48410038a6f45b6d Mon Sep 17 00:00:00 2001 From: yann300 Date: Fri, 10 Nov 2023 21:38:52 +0100 Subject: [PATCH 048/163] linting --- .../editor/src/lib/providers/inlineCompletionProvider.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/libs/remix-ui/editor/src/lib/providers/inlineCompletionProvider.ts b/libs/remix-ui/editor/src/lib/providers/inlineCompletionProvider.ts index 5ef8d7f07c..3e42da252b 100644 --- a/libs/remix-ui/editor/src/lib/providers/inlineCompletionProvider.ts +++ b/libs/remix-ui/editor/src/lib/providers/inlineCompletionProvider.ts @@ -14,8 +14,8 @@ export class RemixInLineCompletionProvider implements monacoTypes.languages.Inli async provideInlineCompletions(model: monacoTypes.editor.ITextModel, position: monacoTypes.Position, context: monacoTypes.languages.InlineCompletionContext, token: monacoTypes.CancellationToken): Promise> { if (context.selectedSuggestionInfo) { console.log('return empty from provideInlineCompletions') - return; - } + return; + } // get text before the position of the completion const word = model.getValueInRange({ startLineNumber: 1, @@ -26,7 +26,7 @@ export class RemixInLineCompletionProvider implements monacoTypes.languages.Inli if (!word.endsWith(' ') && !word.endsWith('\n') && !word.endsWith(';') && !word.endsWith('.')) { console.log('not a trigger char') - return; + return; } // abort if there is a signal @@ -43,7 +43,7 @@ export class RemixInLineCompletionProvider implements monacoTypes.languages.Inli } const generatedText = (result as any).output[0].generated_text as string - // the generated text remove a space from the context. that why we need to remove all the spaces + // the generated text remove a space from the context. that why we need to remove all the spaces const clean = generatedText.replace(/ /g, '').replace(word.replace(/ /g, ''), '') console.log('suggest result', clean) const item: monacoTypes.languages.InlineCompletion = { From 34417a1fc33f36a6da6a0736f67ef5d4f3540e14 Mon Sep 17 00:00:00 2001 From: yann300 Date: Mon, 13 Nov 2023 14:41:00 +0100 Subject: [PATCH 049/163] improve settings (add modal) --- .../suggestion-service/copilot-suggestion.ts | 16 ++++-- .../suggestion-service/suggestion-service.ts | 7 +++ .../app/src/lib/remix-app/interface/index.ts | 2 +- .../settings/src/lib/remix-ui-settings.tsx | 51 ++++++++++++++++--- 4 files changed, 64 insertions(+), 12 deletions(-) diff --git a/apps/remix-ide/src/app/plugins/copilot/suggestion-service/copilot-suggestion.ts b/apps/remix-ide/src/app/plugins/copilot/suggestion-service/copilot-suggestion.ts index 179f8865ac..c8cfc0a9be 100644 --- a/apps/remix-ide/src/app/plugins/copilot/suggestion-service/copilot-suggestion.ts +++ b/apps/remix-ide/src/app/plugins/copilot/suggestion-service/copilot-suggestion.ts @@ -6,27 +6,31 @@ const profile = { name: 'copilot-suggestion', displayName: 'copilot-suggestion', description: 'copilot-suggestion', - methods: ['suggest', 'init', 'uninstall'] + methods: ['suggest', 'init', 'uninstall', 'status'] } export class CopilotSuggestion extends Plugin { service: SuggestionService context: string + ready: boolean constructor() { super(profile) this.service = new SuggestionService() this.context = '' this.service.events.on('progress', (data) => { - this.call('terminal', 'log', {type: 'info', value: `loading Solidity copilot: ${(data.loaded / data.total) * 100}% done.` }) + this.emit('loading', data) }) this.service.events.on('done', (data) => { - this.call('terminal', 'log', { type: 'info', value: `Solidity copilot loaded.`}) }) this.service.events.on('ready', (data) => { - this.call('terminal', 'log', { type: 'info', value: `Solidity copilot ready to use.`}) + this.ready = true }) } + status () { + return this.ready + } + async suggest(content: string) { if (!await this.call('settings', 'get', 'settings/copilot/suggest/activate')) return { output: [{ generated_text: ''}]} @@ -59,5 +63,7 @@ export class CopilotSuggestion extends Plugin { return this.service.init() } - async uninstall() {} + async uninstall() { + this.service.terminate() + } } \ No newline at end of file diff --git a/apps/remix-ide/src/app/plugins/copilot/suggestion-service/suggestion-service.ts b/apps/remix-ide/src/app/plugins/copilot/suggestion-service/suggestion-service.ts index bfe8b872ee..a6970144f1 100644 --- a/apps/remix-ide/src/app/plugins/copilot/suggestion-service/suggestion-service.ts +++ b/apps/remix-ide/src/app/plugins/copilot/suggestion-service/suggestion-service.ts @@ -17,6 +17,13 @@ export class SuggestionService { this.current } + terminate(): void { + this.worker.terminate() + this.worker = new Worker(new URL('./worker.js', import.meta.url), { + type: 'module' + }); + } + async init() { const onMessageReceived = (e) => { switch (e.data.status) { diff --git a/libs/remix-ui/app/src/lib/remix-app/interface/index.ts b/libs/remix-ui/app/src/lib/remix-app/interface/index.ts index 3ab21c7cc4..fcee9ef693 100644 --- a/libs/remix-ui/app/src/lib/remix-app/interface/index.ts +++ b/libs/remix-ui/app/src/lib/remix-app/interface/index.ts @@ -15,7 +15,7 @@ export interface AppModal { message: string | JSX.Element okLabel: string | JSX.Element okFn?: (value?:any) => void - cancelLabel: string | JSX.Element + cancelLabel?: string | JSX.Element cancelFn?: () => void, modalType?: ModalTypes, defaultValue?: string diff --git a/libs/remix-ui/settings/src/lib/remix-ui-settings.tsx b/libs/remix-ui/settings/src/lib/remix-ui-settings.tsx index 83c6feacdb..99c38e82a2 100644 --- a/libs/remix-ui/settings/src/lib/remix-ui-settings.tsx +++ b/libs/remix-ui/settings/src/lib/remix-ui-settings.tsx @@ -1,6 +1,7 @@ import {ViewPlugin} from '@remixproject/engine-web' -import React, {useState, useReducer, useEffect, useCallback} from 'react' // eslint-disable-line +import React, {useState, useRef, useReducer, useEffect, useCallback} from 'react' // eslint-disable-line +import {AppModal, AlertModal, ModalTypes} from '@remix-ui/app' import {labels, textDark, textSecondary} from './constants' import './remix-ui-settings.css' @@ -52,6 +53,8 @@ export const RemixUiSettings = (props: RemixUiSettingsProps) => { const [ipfsProtocol, setipfsProtocol] = useState('') const [ipfsProjectId, setipfsProjectId] = useState('') const [ipfsProjectSecret, setipfsProjectSecret] = useState('') + const copilotDownload = useRef(null) + const intl = useIntl() const initValue = () => { const metadataConfig = props.config.get('settings/generate-contract-metadata') @@ -126,12 +129,45 @@ export const RemixUiSettings = (props: RemixUiSettingsProps) => { textWrapEventAction(props.config, props.editor, event.target.checked, dispatch) } - const onchangeCopilotActivate = (event) => { + const onchangeCopilotActivate = (event) => { copilotActivate(props.config, event.target.checked, dispatch) - if (event.target.checked) props.plugin.call('copilot-suggestion', 'init') - else { + if (!event.target.checked) { + copilotActivate(props.config, event.target.checked, dispatch) props.plugin.call('copilot-suggestion', 'uninstall') + return + } + const message =
Please wait while the copilot is downloaded. 0/100 .
+ copilotActivate(props.config, event.target.checked, dispatch) + const modalActivate: AppModal = { + id: 'loadcopilotActivate', + title: 'Downloading Solidity copilot', + modalType: ModalTypes.default, + okLabel: 'Close', + message, + okFn: async() => { + props.plugin.off('copilot-suggestion', 'loading') + if (await props.plugin.call('copilot-suggestion', 'status')) { + copilotActivate(props.config, true, dispatch) + } else { + props.plugin.call('copilot-suggestion', 'uninstall') + copilotActivate(props.config, false, dispatch) + } + }, + hideFn: async () => { + props.plugin.off('copilot-suggestion', 'loading') + if (await props.plugin.call('copilot-suggestion', 'status')) { + copilotActivate(props.config, true, dispatch) + } else { + props.plugin.call('copilot-suggestion', 'uninstall') + copilotActivate(props.config, false, dispatch) + } + } } + props.plugin.call('notification', 'modal', modalActivate) + props.plugin.on('copilot-suggestion', 'loading', (data) => { + if (!copilotDownload.current) return + copilotDownload.current.innerText = (data.loaded / data.total) * 100 + }) } const onchangeCopilotMaxNewToken = (event) => { @@ -398,8 +434,11 @@ export const RemixUiSettings = (props: RemixUiSettingsProps) => { } const isCopilotActivated = props.config.get('settings/copilot/suggest/activate') || false - const copilotMaxnewToken = props.config.get('settings/copilot/suggest/max_new_tokens') || 5 - const copilotTemperatureValue = (props.config.get('settings/copilot/suggest/temperature') || 0.5) * 100 + const copilotMaxnewToken = props.config.get('settings/copilot/suggest/max_new_tokens') + if (!copilotMaxnewToken) props.config.set('settings/copilot/suggest/max_new_tokens', 5) + const copilotTemperatureValue = (props.config.get('settings/copilot/suggest/temperature')) * 100 + if (!copilotTemperatureValue) props.config.set('settings/copilot/suggest/temperature', 0.5) + if (isCopilotActivated) props.plugin.call('copilot-suggestion', 'init') const copilotSettings = () => (
From 837be8503d9acf1ab19f17fa1dcabce197696361 Mon Sep 17 00:00:00 2001 From: yann300 Date: Mon, 13 Nov 2023 15:04:20 +0100 Subject: [PATCH 050/163] improve settings behavior --- .../settings/src/lib/remix-ui-settings.tsx | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/libs/remix-ui/settings/src/lib/remix-ui-settings.tsx b/libs/remix-ui/settings/src/lib/remix-ui-settings.tsx index 99c38e82a2..c415a078bd 100644 --- a/libs/remix-ui/settings/src/lib/remix-ui-settings.tsx +++ b/libs/remix-ui/settings/src/lib/remix-ui-settings.tsx @@ -129,15 +129,19 @@ export const RemixUiSettings = (props: RemixUiSettingsProps) => { textWrapEventAction(props.config, props.editor, event.target.checked, dispatch) } - const onchangeCopilotActivate = (event) => { - copilotActivate(props.config, event.target.checked, dispatch) + const onchangeCopilotActivate = async (event) => { if (!event.target.checked) { copilotActivate(props.config, event.target.checked, dispatch) props.plugin.call('copilot-suggestion', 'uninstall') return } const message =
Please wait while the copilot is downloaded. 0/100 .
- copilotActivate(props.config, event.target.checked, dispatch) + props.plugin.on('copilot-suggestion', 'loading', (data) => { + if (!copilotDownload.current) return + const loaded = ((data.loaded / data.total) * 100).toString() + const dot = loaded.match(/(.*)\./g) + copilotDownload.current.innerText = dot ? dot[0].replace('.', '') : loaded + }) const modalActivate: AppModal = { id: 'loadcopilotActivate', title: 'Downloading Solidity copilot', @@ -163,11 +167,9 @@ export const RemixUiSettings = (props: RemixUiSettingsProps) => { } } } + props.plugin.call('copilot-suggestion', 'init') props.plugin.call('notification', 'modal', modalActivate) - props.plugin.on('copilot-suggestion', 'loading', (data) => { - if (!copilotDownload.current) return - copilotDownload.current.innerText = (data.loaded / data.total) * 100 - }) + } const onchangeCopilotMaxNewToken = (event) => { From 4925ccd6f365f543e536434aeafc6d3009ba5fdd Mon Sep 17 00:00:00 2001 From: yann300 Date: Mon, 13 Nov 2023 15:07:15 +0100 Subject: [PATCH 051/163] show current value --- libs/remix-ui/settings/src/lib/remix-ui-settings.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libs/remix-ui/settings/src/lib/remix-ui-settings.tsx b/libs/remix-ui/settings/src/lib/remix-ui-settings.tsx index c415a078bd..a24a943d31 100644 --- a/libs/remix-ui/settings/src/lib/remix-ui-settings.tsx +++ b/libs/remix-ui/settings/src/lib/remix-ui-settings.tsx @@ -467,7 +467,7 @@ export const RemixUiSettings = (props: RemixUiSettingsProps) => {
@@ -480,7 +480,7 @@ export const RemixUiSettings = (props: RemixUiSettingsProps) => {
From 065123fc213d3fedda4a52338157154ea1e993fb Mon Sep 17 00:00:00 2001 From: filip mertens Date: Sat, 11 Nov 2023 16:47:33 +0100 Subject: [PATCH 052/163] walking --- apps/remix-ide/src/app/files/dgitProvider.js | 35 + apps/remix-ide/src/assets/list.json | 1177 ++++++++++++++++++ 2 files changed, 1212 insertions(+) create mode 100644 apps/remix-ide/src/assets/list.json diff --git a/apps/remix-ide/src/app/files/dgitProvider.js b/apps/remix-ide/src/app/files/dgitProvider.js index 921e579c75..e781a321bf 100644 --- a/apps/remix-ide/src/app/files/dgitProvider.js +++ b/apps/remix-ide/src/app/files/dgitProvider.js @@ -217,10 +217,22 @@ class DGitProvider extends Plugin { } async lsfiles (cmd) { + console.log('lsfiles') const filesInStaging = await git.listFiles({ ...await this.getGitConfig(), ...cmd }) + console.log(await git.resolveRef({ + ...await this.getGitConfig(), + ref: 'HEAD' + })) + console.log(await git.readTree({ + ...await this.getGitConfig(), + oid: await git.resolveRef({ + ...await this.getGitConfig(), + ref: 'HEAD' + }) + })) return filesInStaging } @@ -362,6 +374,26 @@ class DGitProvider extends Plugin { this.call('terminal', 'logHtml', `Cloning submodule ${dir}...`) await git.clone(cmd) this.call('terminal', 'logHtml', `Cloned successfully submodule ${dir}...`) + console.log('checkout the commit of the submodule ', currentDir, module.path) + + console.log(await git.readTree({ + ...await this.getGitConfig(currentDir), + oid: await git.resolveRef({ + ...await this.getGitConfig(currentDir), + ref: 'HEAD' + }) + })) + + const treeWalker = new git.TreeWalker(await git.readTree({ + ...await this.getGitConfig(currentDir), + oid: await git.resolveRef({ + ...await this.getGitConfig(currentDir), + ref: 'HEAD' + })})) + + console.log(treeWalker) + + await this.updateSubmodules({ ...input, dir @@ -370,6 +402,9 @@ class DGitProvider extends Plugin { this.call('terminal', 'log', { type: 'error', value: `[Cloning]: Error occured! ${e}` }) console.log(e) } + } + for (let module of gitmodules) { + } setTimeout(async () => { await this.call('fileManager', 'refresh') diff --git a/apps/remix-ide/src/assets/list.json b/apps/remix-ide/src/assets/list.json new file mode 100644 index 0000000000..7c75a856e5 --- /dev/null +++ b/apps/remix-ide/src/assets/list.json @@ -0,0 +1,1177 @@ +{ + "builds": [ + { + "path": "soljson-v0.3.6+commit.3fc68da5.js", + "version": "0.3.6", + "build": "commit.3fc68da5", + "longVersion": "0.3.6+commit.3fc68da5", + "keccak256": "0x4a1c2a6a4896edefd3a4178a6c3ed8f1de625bd7c00dd7cc5781a9f36236e7db", + "sha256": "0xee7ba01680ed3a1c1cda236189a51c1e6ff99f6dca602a580e5b16441772b50b", + "urls": [ + "bzzr://83e99aa35ae67e71bf77040e5b4686aeb3558919f172b6c28213a4dcd8d79e91", + "dweb:/ipfs/Qme9brfZS3XhbiRbbNDKhBpgFknyD92omMmYa7XSf56bJP" + ] + }, + { + "path": "soljson-v0.4.0+commit.acd334c9.js", + "version": "0.4.0", + "build": "commit.acd334c9", + "longVersion": "0.4.0+commit.acd334c9", + "keccak256": "0x07994ad8c59c498bf44ca8e84914e27b79be964d98a9556226db377819d67387", + "sha256": "0xb83d2025e0bbc7f7f0dc9e47f5aa22eacb548b42c55add8f5f6822c105163500", + "urls": [ + "bzzr://414fc715062f91971c8e0d9fbdf470dd24a8a35f4f96df0ba79980cdb0ae7eaa", + "dweb:/ipfs/QmcBZ6Q2iHmrf9omvD7Jyy8kgrqyPmZFwvKWqvVDaxo1Ta" + ] + }, + { + "path": "soljson-v0.4.1+commit.4fc6fc2c.js", + "version": "0.4.1", + "build": "commit.4fc6fc2c", + "longVersion": "0.4.1+commit.4fc6fc2c", + "keccak256": "0x4c358c2e90447ad9e7c1816b5be8edde1172f67dedf16755a6c7373ede46b245", + "sha256": "0x9825565e1f199dbed6de01d27e10f83a9180300acab80f8469bf427e3cf92e96", + "urls": [ + "bzzr://6ecbe30c4c8530b82d55ed6bec12e63efbab1cb16868b020d65399a8793599a6", + "dweb:/ipfs/QmcEK5gvWNeHUtjsF3B6j5AXb9uNoG3aHbPrCMJDx7C8TM" + ] + }, + { + "path": "soljson-v0.4.2+commit.af6afb04.js", + "version": "0.4.2", + "build": "commit.af6afb04", + "longVersion": "0.4.2+commit.af6afb04", + "keccak256": "0xb67df5c37e8255e0de7918b6d3261f0f29e277d121bf5f414b66157a5b1070cd", + "sha256": "0x67f8a94b60278cfb80d505c47a1a5e67ec2caf20167ef85f2bdf2a80a692bd1b", + "urls": [ + "bzzr://7ba69a10a4585d0a36e5843603476061e8b02878331fa580d5c2509ef01ddaa6", + "dweb:/ipfs/QmVumPvgQVFLZvDvQddcDGcdxjbVWTTzxoQvJAECBBZ6Ju" + ] + }, + { + "path": "soljson-v0.4.3+commit.2353da71.js", + "version": "0.4.3", + "build": "commit.2353da71", + "longVersion": "0.4.3+commit.2353da71", + "keccak256": "0x62a65d0a951617f022524fc844ca11d90266f64e693343a2f41107183bf364c1", + "sha256": "0x66da311056ec26c9c3fb501350ee22187c30e79c41bf2713eeff7d84479948c5", + "urls": [ + "bzzr://ccf4f1e05d942946bcca929e9263c541b2749bf1faf6dc6c211b4bf700344d71", + "dweb:/ipfs/QmXf2cKYJ26tXAU6A6tmUk2dn4tuX3CWNaXJVnGLuoe15y" + ] + }, + { + "path": "soljson-v0.4.4+commit.4633f3de.js", + "version": "0.4.4", + "build": "commit.4633f3de", + "longVersion": "0.4.4+commit.4633f3de", + "keccak256": "0x06afcb6dc23efb1482545b63c5e3983dded0c383ecc46c3ae319f7b868201e47", + "sha256": "0x9e386edb2ee759ad65792f7d62c10ae7edf65c5b874a5451f1e695e586b69eea", + "urls": [ + "bzzr://e93e97b9989cd59673bb1fd64a0f940e8729c3c40b819593b8590480cba24bea", + "dweb:/ipfs/QmSJFaZhpXQ2EPF2koyiTNAiiuJRykv1Q8yubhkmBhvYyu" + ] + }, + { + "path": "soljson-v0.4.5+commit.b318366e.js", + "version": "0.4.5", + "build": "commit.b318366e", + "longVersion": "0.4.5+commit.b318366e", + "keccak256": "0xcdf7c4d4c6b9331b755170fa927692019c94088f87f100d2c3c920bcc3740d0b", + "sha256": "0x7184dae0b761485a5dce66b50075e17857c5b55fe3fa71fe22d4d5acc0839741", + "urls": [ + "bzzr://e21d2bd58112fb165fa2c253504bf49ceca661ac1009d270a31cb996560cfa34", + "dweb:/ipfs/QmYJuZgMbeMiotHAFNWEXdxjTa5yi7GaV4UkgBYABomFpj" + ] + }, + { + "path": "soljson-v0.4.6+commit.2dabbdf0.js", + "version": "0.4.6", + "build": "commit.2dabbdf0", + "longVersion": "0.4.6+commit.2dabbdf0", + "keccak256": "0x52ca702b8ed4b1e6d43d8a006b3d27f6dba611bac118c523711bfd209fb1cc9d", + "sha256": "0x8db9466df3b91c52e3412cebd13176ea9fe16d3239d000828a081c34ce899337", + "urls": [ + "bzzr://24dc5536a4771b2336fa304f3cd38d5203b6ab49c78a3057ec578991f3fcf265", + "dweb:/ipfs/QmZZ9hNntBxJw3G7LGW3e8nXtnGxLnaSMM44K4BbLrkELs" + ] + }, + { + "path": "soljson-v0.4.7+commit.822622cf.js", + "version": "0.4.7", + "build": "commit.822622cf", + "longVersion": "0.4.7+commit.822622cf", + "keccak256": "0xcd8a6a8b2626de75ef6ff73fb724f3ad5693a8902f86e88290f048b56182e7cc", + "sha256": "0xd28a58fbc3ce56ff650d4daf3a1d8092e25cadf2a5b2769fd333b321dfc6a22d", + "urls": [ + "bzzr://6a5d22e366c35f184d5203f3e062131018d8a4d09cf770a0720cfaf4d7b49705", + "dweb:/ipfs/QmfHjv4nYKuv3yFpWZqBYyiYEYmkQGydQmFT5b6mJkFpWp" + ] + }, + { + "path": "soljson-v0.4.8+commit.60cc1668.js", + "version": "0.4.8", + "build": "commit.60cc1668", + "longVersion": "0.4.8+commit.60cc1668", + "keccak256": "0x43c96fc79cf288cecda12b23a17f30b1cf0427a19dc7c1c094bb461eabefe0df", + "sha256": "0x9af176f42b63eaec838999a07e80484f92f41a0fc497adefa65baf88d8fbecaf", + "urls": [ + "bzzr://fc0e644a61e43592754b66f8d911c91312538debb89da29ffda3d3fd81ff70d9", + "dweb:/ipfs/Qmf7WYJJ8y6oHr4RQ7HC4tXgFPGvsnp3Qf6TrMBdK52Y5Z" + ] + }, + { + "path": "soljson-v0.4.9+commit.364da425.js", + "version": "0.4.9", + "build": "commit.364da425", + "longVersion": "0.4.9+commit.364da425", + "keccak256": "0xbe94ff397be2a951cbeb6c9c1a60ddf531d0ce76f45d51755386b6fa42cc2e2c", + "sha256": "0x6ff1683eb76dc58c31043fea474be6da8535ec625d1cd8331a3daead84fd5564", + "urls": [ + "bzzr://6e134aa89a00a18d930924fc2fad2aa434f80b6a71085ff2ab379e3672c812e7", + "dweb:/ipfs/QmeBWFbK1aAxnB6muXWStZJWndrFvMJt4xfAzEJD7AqaY3" + ] + }, + { + "path": "soljson-v0.4.10+commit.f0d539ae.js", + "version": "0.4.10", + "build": "commit.f0d539ae", + "longVersion": "0.4.10+commit.f0d539ae", + "keccak256": "0x178e51ad0c6a350ec4ed6fd07675dfd4d2581ee07b14b4954dd0b0f6d8633ca5", + "sha256": "0xd70ca2f656a88a9be7a3f7d602f03b30149b3bda0d1057cfa3a3c5e3d6e07453", + "urls": [ + "bzzr://6e43013ff973198d7fcc4a43910041f2f07d0099f4252737a2a2545443b11105", + "dweb:/ipfs/QmarthW41sfbrdkMmCK6jicXFZDGgvALzdgzygtUqEauae" + ] + }, + { + "path": "soljson-v0.4.11+commit.68ef5810.js", + "version": "0.4.11", + "build": "commit.68ef5810", + "longVersion": "0.4.11+commit.68ef5810", + "keccak256": "0xb8c3f5654b323cea016c0cc1a4584069714cdf796489efe2496a13f8f83a0e63", + "sha256": "0xdeb3c274f8b840d657e2f9b1dba602e89f58b1bf3fd7178c48c9033310a1f006", + "urls": [ + "bzzr://084452a20ae520bba965ba0b863f3d6de0516d1f92ddb512a138fb787d841c55", + "dweb:/ipfs/QmNUf8dTW9xANAvJmV1ho279AyWSCCvDp6bXet1QTcS2z5" + ] + }, + { + "path": "soljson-v0.4.12+commit.194ff033.js", + "version": "0.4.12", + "build": "commit.194ff033", + "longVersion": "0.4.12+commit.194ff033", + "keccak256": "0x598af6fec02a6783d6a438a6bb0f7d3012716d003f7bf6c9ac5a4d2bc911941b", + "sha256": "0xd522b307a014a32ed5815b05045c4396abc047e70c8a53c1e3ef92e14daa61c6", + "urls": [ + "bzzr://cef259b97217a7526819155f6dd513768be5f8718324ec3a63c315071e2f7c70", + "dweb:/ipfs/QmWGK9FbQiNWNeqysvCNCBw3q7cR1dzpnD1EKtNija2zyK" + ] + }, + { + "path": "soljson-v0.4.13+commit.0fb4cb1a.js", + "version": "0.4.13", + "build": "commit.0fb4cb1a", + "longVersion": "0.4.13+commit.0fb4cb1a", + "keccak256": "0x93f7046d6e0ea2492ec5229936821b3b020dbe9eb2e1193953389293d64a190b", + "sha256": "0x68ace74ca809ff47b09449d4054c77907d9412f14f6003d5475b60f4fec13709", + "urls": [ + "bzzr://8943b9e6d4ec52bda1b8fbd65509168ba3388651a30cb495d5280cfbf35614d7", + "dweb:/ipfs/Qmco9fGHM6mdaPVYqeDQ11GB3BrCbwRcEzM5XzHpAdAVWc" + ] + }, + { + "path": "soljson-v0.4.14+commit.c2215d46.js", + "version": "0.4.14", + "build": "commit.c2215d46", + "longVersion": "0.4.14+commit.c2215d46", + "keccak256": "0x7def3c264883cbe6ffbfc54894e48f9a0d2984ddbd1145eb898758d2a41d1559", + "sha256": "0x54f3dc64f2ff5a5350410f6157a537d96fb4aeec90476e90a951ddfbd1fe4bca", + "urls": [ + "bzzr://3428015c422bb223c3fe8c3a85615081981c47ead375564c16701b261948f0f1", + "dweb:/ipfs/QmXyyuEWhexuez2rzAeFjunpiAhncD1AfcXitGNHxpRWha" + ] + }, + { + "path": "soljson-v0.4.15+commit.bbb8e64f.js", + "version": "0.4.15", + "build": "commit.bbb8e64f", + "longVersion": "0.4.15+commit.bbb8e64f", + "keccak256": "0x9ffa9ee890ec483580c0b4ed72270b16e92eb0b7a8a97fb00c257f8809aa4023", + "sha256": "0x3e64525797e0b2d9abaeb022688cc02d63fc5820327e382fc6574a7de650dc97", + "urls": [ + "bzzr://395f2d903c162ddc9b6ebd76db450ca6cb9cf8bb276c3d705aa462ae560d23ab", + "dweb:/ipfs/QmW2rPbEtiVAbWJxtizzDqTjwpRpXCxkpSR696g9GxAYKT" + ] + }, + { + "path": "soljson-v0.4.16+commit.d7661dd9.js", + "version": "0.4.16", + "build": "commit.d7661dd9", + "longVersion": "0.4.16+commit.d7661dd9", + "keccak256": "0xf0a6c32af3eaa2f8c6d9e6c8b90f3bac5e775c7f1c90a61c1e72b593fbb1528d", + "sha256": "0x0e6d842e941cd8b76280c59f28f6d020af1afdea8e4be9d9da677ac5dbe860c6", + "urls": [ + "bzzr://f44b067fda20d169321fd3616f68633fd7a4277b6340f42f74203f33dad4a472", + "dweb:/ipfs/QmSwumWbYwYe4xLcqpi38VNtw7xCgbNaUkRhiZro9EnqLt" + ] + }, + { + "path": "soljson-v0.4.17+commit.bdeb9e52.js", + "version": "0.4.17", + "build": "commit.bdeb9e52", + "longVersion": "0.4.17+commit.bdeb9e52", + "keccak256": "0xeb8c3c474b5fa792f9b1b2ac6be945c32f835ccdc059deb562da4e99a031eab9", + "sha256": "0x7fe677e8214d0486fa7164f797862fae0a0fefb7b72cf6ad8e728faa54f12b60", + "urls": [ + "bzzr://37026d0ee2865c52fff8f6311b67b94f96dbb52ce8af3f84c3a9aeb47b12bf47", + "dweb:/ipfs/QmbgEAtdmSoxH4cfRJXj7mVpKv9rT5Cq2YmXmAnjgsyqBC" + ] + }, + { + "path": "soljson-v0.4.18+commit.9cf6e910.js", + "version": "0.4.18", + "build": "commit.9cf6e910", + "longVersion": "0.4.18+commit.9cf6e910", + "keccak256": "0xf824e695e8e66079b4b6063622c7dd80ed056d29969c8c3babac4fb572f3dfec", + "sha256": "0x5bb50839ba5116bf31669f3de8dad72eaec298ba32a643be7d0dc2d1392c54d6", + "urls": [ + "bzzr://d847bc8f5d43cd348346c5bb253269de36f00810c2e189ca64a4becdb9e9312f", + "dweb:/ipfs/Qmf5RrLbWeMykvWJbCyyThCLQ9YVmU8uWagMdSp9nNzZMc" + ] + }, + { + "path": "soljson-v0.4.19+commit.c4cbbb05.js", + "version": "0.4.19", + "build": "commit.c4cbbb05", + "longVersion": "0.4.19+commit.c4cbbb05", + "keccak256": "0xa60eadfddbfda0daebb8a1b883b89d33b800cff7ce7e12458170ea17cd5ede58", + "sha256": "0x8c2a69fbab9bdf503538028c697e09e51a7e699323ae7100c375cb35c415a819", + "urls": [ + "bzzr://87e29a7298d49b8b52ed01d6146b05aa41c11a85d1b805dd48181ac2ed5e9b22", + "dweb:/ipfs/QmSZEQEGuVJ7hudg8FzfDMXKVtn5AVGKaxbhSSDXwpX73K" + ] + }, + { + "path": "soljson-v0.4.20+commit.3155dd80.js", + "version": "0.4.20", + "build": "commit.3155dd80", + "longVersion": "0.4.20+commit.3155dd80", + "keccak256": "0x6c6dfa967526b7060634474ef730761711e5be662abf5ee02dc05985abfadec9", + "sha256": "0x9852ad94048600cc5a1458b4a7ab625996844c809b314422693bdc81d953fcc0", + "urls": [ + "bzzr://3edc1542fb719d3e08138b492a5db06333fb36055a434c3b071b2dcb69e54fbc", + "dweb:/ipfs/QmcsCpg6kfp7Vea4y9qPtfDXcaQJbDidb65n3t9f2MFDpR" + ] + }, + { + "path": "soljson-v0.4.21+commit.dfe3193c.js", + "version": "0.4.21", + "build": "commit.dfe3193c", + "longVersion": "0.4.21+commit.dfe3193c", + "keccak256": "0xd0f9a689670184ad874ca6a2cb40dfe57e9cf539d9330ca3f2501951478eace8", + "sha256": "0x4197bb1cb0ea7e637ed8a0e7810f1bfe32c90d0151d6f423bb3dfeef9f6777c4", + "urls": [ + "bzzr://1abbc4967f3c6c5124f8876abe521d508c71b0d0d64dc066c1e7a1bfe6ba596d", + "dweb:/ipfs/QmY7UN95hdfFSD1jwFANegze5eLX8PgP5BfWFH1usTB8Sw" + ] + }, + { + "path": "soljson-v0.4.22+commit.4cb486ee.js", + "version": "0.4.22", + "build": "commit.4cb486ee", + "longVersion": "0.4.22+commit.4cb486ee", + "keccak256": "0x50972c5b966188341d133aa58fbf895c54655d7bd733fb5ad58852e85f9f9444", + "sha256": "0x73458d16a3e34fc7b489d2399b3680cccfc968d01abc9f1b61e438b6fb0c24a1", + "urls": [ + "bzzr://9eab5a9c94bde3d90eb76a1189febd5ae4d6c7bbc63cc1d76e8871e14e6e9b89", + "dweb:/ipfs/QmPUJNa1LYaThwLQsw6fF5DMYyDfEg57gmD5wCsazkLS8c" + ] + }, + { + "path": "soljson-v0.4.23+commit.124ca40d.js", + "version": "0.4.23", + "build": "commit.124ca40d", + "longVersion": "0.4.23+commit.124ca40d", + "keccak256": "0x74f927b4f520d8d31863996a100ebc7827f919c77f777f6d4d416c6e613a03c7", + "sha256": "0x98c350cc41f873af84a78d1e24cbc8449045ee54923af0a39440e4d84600dc50", + "urls": [ + "bzzr://a052dbfe589a766af66d85d4d797829241e867e0ead93fbf3d5e492c71b6434f", + "dweb:/ipfs/QmZbo5YkSbcenWrUDjiCvUZdQe4UrNBw9vtx9nbgcMdRAs" + ] + }, + { + "path": "soljson-v0.4.24+commit.e67f0147.js", + "version": "0.4.24", + "build": "commit.e67f0147", + "longVersion": "0.4.24+commit.e67f0147", + "keccak256": "0x4cc2bb4c8894ad4349a88f330ba74d7ea643030d3f68037d1c94c370b6a25dd7", + "sha256": "0xf83e8f7014ad6b8bc801dc3684c644e372673ed678425c35aea5d4b4fe37e922", + "urls": [ + "bzzr://2aae73578e361285488b6319e8e7b27e23b2736eeee3953cd65f1207cd849395", + "dweb:/ipfs/QmauztXLDUdwJitA4Uc9MQYCTttUcivR5foTZYgwt4aAeC" + ] + }, + { + "path": "soljson-v0.4.25+commit.59dbf8f1.js", + "version": "0.4.25", + "build": "commit.59dbf8f1", + "longVersion": "0.4.25+commit.59dbf8f1", + "keccak256": "0x92b9c5de10bd908527e9cfba3f04bbe637163b4a5313c5a69179ccddd5fa6685", + "sha256": "0x782a999d3e1227c86854e7e29954ee856c6ae684124b9facf09f4f1724dc4e85", + "urls": [ + "bzzr://fb1e9b951ce8abe575f8514bff6baa01417a988a399fab1dd27a252e7812d1bc", + "dweb:/ipfs/QmUtwmzqqCftcubfyGwAefLBQ8ffp8EFhW7HCEQfhaviFs" + ] + }, + { + "path": "soljson-v0.4.26+commit.4563c3fc.js", + "version": "0.4.26", + "build": "commit.4563c3fc", + "longVersion": "0.4.26+commit.4563c3fc", + "keccak256": "0xc9c60203789ef778b9104ae7a39e9090b3d1256b24983d49e40e7d1e3c3ed65d", + "sha256": "0x264d0d25e31cb32f4369f82ba3ad0b6a84a8a1975b10bd738123ddf947618840", + "urls": [ + "bzzr://335a6b94d26623dcaa4590ccd6d7529db1e153b65af3bf7def45fffaf9ee256a", + "dweb:/ipfs/QmRd1uRbHRvpybQk5TQ11zyqmG4wQqHnefgvYdJ14V5D8x" + ] + }, + { + "path": "soljson-v0.5.0+commit.1d4f565a.js", + "version": "0.5.0", + "build": "commit.1d4f565a", + "longVersion": "0.5.0+commit.1d4f565a", + "keccak256": "0x2921f518cf5a0627d96e07e8c3d2b5482dbbf14d7dc6bbb055481c46d98903f3", + "sha256": "0xaf811843add541705ff65f0c20fd864bd0387116544524fa1830cf67a14af6c4", + "urls": [ + "bzzr://31231abb33dc43d0478f03a4c8b15b161b172097c884307cf6cf64aeb83a6dc9", + "dweb:/ipfs/QmYLhaeGbq3tFdCUC2pvtA8QdGnCbA8kn24z3C741k5TUE" + ] + }, + { + "path": "soljson-v0.5.1+commit.c8a2cb62.js", + "version": "0.5.1", + "build": "commit.c8a2cb62", + "longVersion": "0.5.1+commit.c8a2cb62", + "keccak256": "0x1980cf8a81c6bd2b371bf7d9145c819a7fb2d72e9aa462aaff0c10b4eccd595c", + "sha256": "0x69cb1300b5f72eb128604507991d9ada97180d31afde7c59aa3fa3ae9ad5200d", + "urls": [ + "bzzr://7f35988e2c32ed2f3f1885fb81ace357b1555964d23085940980cacd29023da6", + "dweb:/ipfs/QmPfxPYsYysRR8HFkWr47FMQ8ardmfmtrmdYc2ogT9Gfp9" + ] + }, + { + "path": "soljson-v0.5.2+commit.1df8f40c.js", + "version": "0.5.2", + "build": "commit.1df8f40c", + "longVersion": "0.5.2+commit.1df8f40c", + "keccak256": "0x3efd0585a3c00a1a2c62e590e22a69aa981d1b5148af2ebdbe1610dff93cea78", + "sha256": "0xaff4ca62ac0b03cb4b9c50f8250e2e7307b5c75fefc9847f269bd05c20367148", + "urls": [ + "bzzr://e30e085b875fc291e5ee46ed7c88c28ec8e8c540ad8c799b106c365a52df9e97", + "dweb:/ipfs/QmaZrQSg8njYzFXH2PzwxHDLKxkBhKmYmLm43DJWnurPeJ" + ] + }, + { + "path": "soljson-v0.5.3+commit.10d17f24.js", + "version": "0.5.3", + "build": "commit.10d17f24", + "longVersion": "0.5.3+commit.10d17f24", + "keccak256": "0x9b7a39606c3c27a8619b3eb493efca512cbd26c5ab7fc95489564239aab32a50", + "sha256": "0x24b4cbc28d68bde8455c14a46b55e4f292c3c295271e09991b2176a487cb4487", + "urls": [ + "bzzr://3bccb9b8cee48b99b39f2f1296f7353bcd39c1ae61b1e19e5add7cedd0256cb2", + "dweb:/ipfs/QmQmkd5FGiKKg8eRmo3L7Cn62nuV1M6GRDUGiq5bAx4AWx" + ] + }, + { + "path": "soljson-v0.5.4+commit.9549d8ff.js", + "version": "0.5.4", + "build": "commit.9549d8ff", + "longVersion": "0.5.4+commit.9549d8ff", + "keccak256": "0x4a6244b03de1968f0a48800e75640921d62b7602d0301093e1c5c318d1effb36", + "sha256": "0x91ed0cf4390f33174a4aaf49d1ce7cd9c72e28b95d2f9422314a29b2144b2042", + "urls": [ + "bzzr://a5ab50564d82e6d55b462f4f85284d3fac294c78f2699b680544bc7efde2fb16", + "dweb:/ipfs/QmRPchg1b5ofkLnLTPuunfSMKnxbXcZyzSR4NkyJAYUTrR" + ] + }, + { + "path": "soljson-v0.5.5+commit.47a71e8f.js", + "version": "0.5.5", + "build": "commit.47a71e8f", + "longVersion": "0.5.5+commit.47a71e8f", + "keccak256": "0xf46cb35b3aefb9b3d59a1fb4c151eb23a0f0a05387b379b3e7fbed1c01c861df", + "sha256": "0xaf812445476c101ae5ef92941c79eaebf57b39d455bdfb54a6a86b4ab6ca498c", + "urls": [ + "bzzr://2e72b599d5a700cbd03d9f7ca082464b4823dbaabfc5e1031075b9631c005d35", + "dweb:/ipfs/QmPYEmgLWDjk7kPGovojurz7fzdGv8Ti3H66nEzRzdiGwh" + ] + }, + { + "path": "soljson-v0.5.6+commit.b259423e.js", + "version": "0.5.6", + "build": "commit.b259423e", + "longVersion": "0.5.6+commit.b259423e", + "keccak256": "0x66669372d2d958bfeb5129a387dbc3882a96e260fc12e2910a7eb148b8ea5dd6", + "sha256": "0x9ffc04d0aee2c817ae6a897b1ba5aaca2bcd860416aaddfaa4de553fc1ad6e8e", + "urls": [ + "bzzr://5f5dbf4ebe3be5dbe3e917a2de3908b3a9ed24207a6406a6e434e6f041e993c4", + "dweb:/ipfs/QmYWL8Z3yXfCuhrprimdLhYFkjR74TjFHULxcABbUipetv" + ] + }, + { + "path": "soljson-v0.5.7+commit.6da8b019.js", + "version": "0.5.7", + "build": "commit.6da8b019", + "longVersion": "0.5.7+commit.6da8b019", + "keccak256": "0x27e324f75dd52eb180569e7a8865048253e5fcdaacc52e7c998ecaeb78dcdabd", + "sha256": "0xfd7c4e652d5891c84d93b28c90b8ac58c9253d2a3677935883a337ee96087b8f", + "urls": [ + "bzzr://764a91ca290bfa564d890f3c1a5a88067b04e96398f223576cbdd17bbc1faee2", + "dweb:/ipfs/QmdEr1zJrD2UYawZzeE6zPuYiYaSHdpLtKeHYixHgRp9ko" + ] + }, + { + "path": "soljson-v0.5.8+commit.23d335f2.js", + "version": "0.5.8", + "build": "commit.23d335f2", + "longVersion": "0.5.8+commit.23d335f2", + "keccak256": "0x05c00863784c63220704197d8446ac1e277fe53c42b5264093960b7bb70b9792", + "sha256": "0x25cfdd733e9c780ab85373268fde7bfa2e4b22093af57422ca3b586c7af7cd60", + "urls": [ + "bzzr://18fc5b15154aef1640559c31bbd91ae267def62a2b86e434564184b6d3d283ce", + "dweb:/ipfs/QmSUakgiWEffZ82RrN7hgLaemdqtLSCD7pfGAKxGhDUJxB" + ] + }, + { + "path": "soljson-v0.5.9+commit.e560f70d.js", + "version": "0.5.9", + "build": "commit.e560f70d", + "longVersion": "0.5.9+commit.e560f70d", + "keccak256": "0x7c967d9dc0fdca0db88a7cee22cf5886f65e8fa8b4a145eccd910fc81a1c949d", + "sha256": "0x7d40c6325c0aa4635babdb8913626b7c4bac6a4f41e1c383de5f398e1fc98e1b", + "urls": [ + "bzzr://c1f03890d82592751d779ea2da8a690e15b0ccc5667314bf634c1f16ff4ed322", + "dweb:/ipfs/QmZcHLPfa2Dz8M3justKYyDmDnaNo4pseTgAeQbtJNYywe" + ] + }, + { + "path": "soljson-v0.5.10+commit.5a6ea5b1.js", + "version": "0.5.10", + "build": "commit.5a6ea5b1", + "longVersion": "0.5.10+commit.5a6ea5b1", + "keccak256": "0x012ae146ebdd510b31c1e44a8d60071a66cdebc77f0e743a6ebc2fe68e67d297", + "sha256": "0x566601442deff058d393359df59ed72b41e1f6a65b0aa371fab7f903c189b59d", + "urls": [ + "bzzr://47c24a09321abb781b5dbc05fffae84ece6844e41a295847dd68ad69633f60a4", + "dweb:/ipfs/Qmej9jEnSsD2LqGnL4jgbUvHTxTwiFiHqeMpqyuPLaX1uw" + ] + }, + { + "path": "soljson-v0.5.11+commit.c082d0b4.js", + "version": "0.5.11", + "build": "commit.c082d0b4", + "longVersion": "0.5.11+commit.c082d0b4", + "keccak256": "0x4ba5500559a9ad03e4c1d3866ba9d915cdb5d7f2e326b4cb1fa0fe7bdf90dc27", + "sha256": "0x89978dcef86244b8e7af95298abe26aaf4825df819d6c556e4323dc152c988ad", + "urls": [ + "bzzr://c609e5725e607a4d853f33c8d46064e0ab11b489f7a585134cfca570e29f447a", + "dweb:/ipfs/QmdgDj3bPSKU1xKMY8FRHj8E6z9BQefeuaVuF27RpvZMXJ" + ] + }, + { + "path": "soljson-v0.5.12+commit.7709ece9.js", + "version": "0.5.12", + "build": "commit.7709ece9", + "longVersion": "0.5.12+commit.7709ece9", + "keccak256": "0xcda83fe69ce2a319d0caa20c98b53ff36ea1886054ab3dab23fa80ede3dcdea0", + "sha256": "0x1784f89fcfffccddaa94273a58e452682f61dea05d142406775f099c6ef5d61f", + "urls": [ + "bzzr://5eacd00f2f132ea8fbb308baed9753579ade721a44e94067debb602e193b7ae2", + "dweb:/ipfs/QmPA1Uf4iwkr2ouguzxxFepVxaRg36XFXxiwqYUuwafQzQ" + ] + }, + { + "path": "soljson-v0.5.13+commit.5b0b510c.js", + "version": "0.5.13", + "build": "commit.5b0b510c", + "longVersion": "0.5.13+commit.5b0b510c", + "keccak256": "0x432dd5d662d88c2316b4df503f693ae9e6e8ed4216726db2fdb3e7f628523fe5", + "sha256": "0x6e095eefc48dfc21fec18d0b63f229e929f881b5d6e8a999e1622c6b707a7f54", + "urls": [ + "bzzr://1b3ef14eabfe47ff614c088337dfdf163c695612c193aeab9ac5a2af69d30334", + "dweb:/ipfs/QmSgJ8Ru6vraz9CyCDPMifVxpckkoooVSBj9vYcQqG4wG4" + ] + }, + { + "path": "soljson-v0.5.14+commit.01f1aaa4.js", + "version": "0.5.14", + "build": "commit.01f1aaa4", + "longVersion": "0.5.14+commit.01f1aaa4", + "keccak256": "0x98e1027fbf3acb279f740c3b38df69d79ad3f2e6171414508d50604dc2dfc13e", + "sha256": "0x43b85bc9941814b018065da5c6c8d40e2af49264d0d1f06bdefbfbe628e65ff8", + "urls": [ + "bzzr://b6283a40a65b321a0e88f61594fc8bed00fb21a53c7ac1bf5ae421706a372d01", + "dweb:/ipfs/QmeXatGB9MdWA2NBLSNQbcKvuZpa4Sxem51vCrqyQGfXnU" + ] + }, + { + "path": "soljson-v0.5.15+commit.6a57276f.js", + "version": "0.5.15", + "build": "commit.6a57276f", + "longVersion": "0.5.15+commit.6a57276f", + "keccak256": "0x6f9251f86fd798a3ae25688307ffc7a9984dcf0d809a1aef54f5c68b6cf9fb6a", + "sha256": "0x0d34e4ed048bbf67daacdf36cd5ce0f553a32962967b52edab6afccaa071878b", + "urls": [ + "bzzr://e866e6bdb31fea0646b44a8e57acc9505932ffe813028ce1330ca49fe3edc4d0", + "dweb:/ipfs/Qmdx3AHUB8bN6ZZs1XsTV3Gz9FV3gAB7x7JbYeUsn43Azu" + ] + }, + { + "path": "soljson-v0.5.16+commit.9c3226ce.js", + "version": "0.5.16", + "build": "commit.9c3226ce", + "longVersion": "0.5.16+commit.9c3226ce", + "keccak256": "0x6abf17bdb1b934d072739e0e083ecfd579c523d200d45184b8d3987924ca0454", + "sha256": "0xa09c9cc2672678d461dc71100600bb58802db87be4de9424769241712ccbec03", + "urls": [ + "bzzr://9b51780766b138ee36e2796cee7bdd4cb494da5d925c36cc6101202818d37e42", + "dweb:/ipfs/QmQjodGav6KhMDjuoyJ1ag8osgKLBsFC1E9LmaGP7qCRZ2" + ] + }, + { + "path": "soljson-v0.5.17+commit.d19bba13.js", + "version": "0.5.17", + "build": "commit.d19bba13", + "longVersion": "0.5.17+commit.d19bba13", + "keccak256": "0x936e6bfbf4ea9ac32997adb893b0aeecd050cfef8b475f297dca1add0a1ff934", + "sha256": "0x7fd1d3f1fddc615e117f7fb7586acabd60c649c390cf110c8fdc5ce159fa5734", + "urls": [ + "bzzr://949bfec63a83091f5d08d6d8df36fa34e674d75206e8a6476cc0ae18f3c57bb4", + "dweb:/ipfs/QmNrRJwVHaJSZ3aAQZWZKjV9o8BqWKFP3RPYL6hKU65PAE" + ] + }, + { + "path": "soljson-v0.6.0+commit.26b70077.js", + "version": "0.6.0", + "build": "commit.26b70077", + "longVersion": "0.6.0+commit.26b70077", + "keccak256": "0xea559c55bf7046cb48378fe9b43eaab6e345700aa22d701fcf946a42ec6b1008", + "sha256": "0xf22c63511a85230f7640ff5a77433db643d8d32be8b7c7f1dc24c1301a5158e9", + "urls": [ + "bzzr://471b0435c47963835dd0f70d67ec069fab5daadbe6c8bf760d2e50adfb839461", + "dweb:/ipfs/QmTQPQb6br2VEzKTiXBEE6z69xRXEk24xi2R2gn8EsvGD9" + ] + }, + { + "path": "soljson-v0.6.1+commit.e6f7d5a4.js", + "version": "0.6.1", + "build": "commit.e6f7d5a4", + "longVersion": "0.6.1+commit.e6f7d5a4", + "keccak256": "0xb2657b5ce7a9b405a65e4a88845a51216cd7371e8f84861eef9cb0cb20d78081", + "sha256": "0x3628fdefd6971ea9cc16acbf91e5f6d6cfb2079181784b47e4d24f4c5d92e4e4", + "urls": [ + "bzzr://7bc2dc95d81092991a4122b45aad03f9cc62bc98fa455f03fc9286445ef9de8e", + "dweb:/ipfs/QmYWAkYAJo59kc5dHWaLuQqEm7xusESdu5meDzjpxnyXKt" + ] + }, + { + "path": "soljson-v0.6.2+commit.bacdbe57.js", + "version": "0.6.2", + "build": "commit.bacdbe57", + "longVersion": "0.6.2+commit.bacdbe57", + "keccak256": "0x7dc96455c864b49abc7dd5f38ba6a47904709ad132ea36babbfce98d42e962e6", + "sha256": "0x25f564cbecc5bfe95d6d358e0e7543c31ece0ab1332c555ff323ca163711bd2b", + "urls": [ + "bzzr://f61230aa01565c8c24aa2ed50eec7dfd26195be35f5bbe4445c6a3efceaa4b7d", + "dweb:/ipfs/QmaLUM18c7ecA911ig5u2HY6fAu4AiUbhJpnZwwCMc9cWi" + ] + }, + { + "path": "soljson-v0.6.3+commit.8dda9521.js", + "version": "0.6.3", + "build": "commit.8dda9521", + "longVersion": "0.6.3+commit.8dda9521", + "keccak256": "0x39ae8b2f3ba05ed7d4a7c16f0a9f4f5118180a209379cfc9bdd2d4fb5d015dff", + "sha256": "0xf89514dedd8cfb3c4d351580ff80b8444acde702f8be0e5fad710fe6e906c687", + "urls": [ + "bzzr://1d6deff5623d883b8d0b3a3a5539e4604925ce4c1677defb86e0e37838ea70c5", + "dweb:/ipfs/Qmd9JfFpUXsUQrJad1u2QDuMxBMeVrcG8mrpfJVV9jiBXB" + ] + }, + { + "path": "soljson-v0.6.4+commit.1dca32f3.js", + "version": "0.6.4", + "build": "commit.1dca32f3", + "longVersion": "0.6.4+commit.1dca32f3", + "keccak256": "0x435820544c2598d4ffbfb6f11003364c883a0766c8ac2a03215dd73022b34679", + "sha256": "0xa4fd5bb021259cdde001b03dac0e66353a3b066b47eb2476acb58b2610a224ca", + "urls": [ + "bzzr://62ef2a9bf7dbb8fd596b7c6ca6848d9b1a6c8562d10239659f0a56ee27c110ce", + "dweb:/ipfs/QmTxzbPN4HwcK5YX7n3PNkb1BzKFiRwStsmBfgC9VwrtFt" + ] + }, + { + "path": "soljson-v0.6.5+commit.f956cc89.js", + "version": "0.6.5", + "build": "commit.f956cc89", + "longVersion": "0.6.5+commit.f956cc89", + "keccak256": "0x6262768243c1ceaf91418e52dc6f52d2ce94d19c6e1065d54499b7bc4d6e14dc", + "sha256": "0xf8f83757e73f33f44389d1fa72d013fb266454a8dd9bb6897c7776f8fc3b0231", + "urls": [ + "bzzr://ed91c1114615572c10a34f0ab28a3a159d2d433fabbcec9eae7253c25ecac8b4", + "dweb:/ipfs/QmRUoBQeA5zpun1NK7BvBhQk6pTT4uZw7Jn2wZnWQETH9W" + ] + }, + { + "path": "soljson-v0.6.6+commit.6c089d02.js", + "version": "0.6.6", + "build": "commit.6c089d02", + "longVersion": "0.6.6+commit.6c089d02", + "keccak256": "0x3c9cfccc78bf352f4c7901d7af76757bd228f93af2634af4cd16b4916c13e44e", + "sha256": "0x09f6098026622c5c334c7798c3ad2b8f7c0ebc62f87846c7d5e7e725c3d1cbc2", + "urls": [ + "bzzr://ab23bd0e01952ee485f0426c9c4e47fcf6a508bc4919e83be31c0f9ea6e396ca", + "dweb:/ipfs/QmRj2pxXxvmJ96i57maVjLMfs4DUtCuptM8vSVvvDweJ74" + ] + }, + { + "path": "soljson-v0.6.7+commit.b8d736ae.js", + "version": "0.6.7", + "build": "commit.b8d736ae", + "longVersion": "0.6.7+commit.b8d736ae", + "keccak256": "0xb463b6a61fc027247655a32cbfd50bf543eafa3a6b42ceacdda7293e3ada8866", + "sha256": "0xb795f1b20f065a0aee492c24071fc1efa1633c3caab77cff20278a9ae822f04e", + "urls": [ + "bzzr://c82fea785ae31fb4847f5640e6305edc05d1a5b0b47552f60325c25cce280f75", + "dweb:/ipfs/QmShUrNZf1dZFjziorJYE8fMGNUSMFsbaR3ipSvsCMvExM" + ] + }, + { + "path": "soljson-v0.6.8+commit.0bbfe453.js", + "version": "0.6.8", + "build": "commit.0bbfe453", + "longVersion": "0.6.8+commit.0bbfe453", + "keccak256": "0x537cefc0579dd9631ec952cae951b3df0a50a3e557b5638107a67275f7aacc07", + "sha256": "0x3e8b01cbd194e40971b41017ada7c8b2fa941b0458cb701bdfb6a82257ca971b", + "urls": [ + "bzzr://130bff47eed9546c6a4d019c6281896186cf2368b766b16bc49b3d489b6cdb92", + "dweb:/ipfs/Qmdq9AfwdmKfEGP8u7H9E4VYrKLVinRZPZD1EWRnXSn1oe" + ] + }, + { + "path": "soljson-v0.6.9+commit.3e3065ac.js", + "version": "0.6.9", + "build": "commit.3e3065ac", + "longVersion": "0.6.9+commit.3e3065ac", + "keccak256": "0xa2d4d3ebe5d52bfa7ddf1a1fcd9bfed81eaa8678e6a1dd5a1c84954dd064422c", + "sha256": "0xf1724fd46b7a353561b3f8d473b0dc8c855b6d84b5af559d7e3326ac79b9d758", + "urls": [ + "bzzr://2c5fff6b816edb78adb2220f175591c9f4f6d38cfd27a83afb1849191cf9a524", + "dweb:/ipfs/Qmad6iesaR5FQ45RRtMrt2Fa1EYDuq1oGoMJJB6beMHESn" + ] + }, + { + "path": "soljson-v0.6.10+commit.00c0fcaf.js", + "version": "0.6.10", + "build": "commit.00c0fcaf", + "longVersion": "0.6.10+commit.00c0fcaf", + "keccak256": "0x620163da7ee7b2622c9ee48b06110a52739f633189555148a3b5ecf767e60cfb", + "sha256": "0xfa27ce9d23bddaa76a4aefbafa48e48affde9a1ee7c8a5e8784cf8d4c390f655", + "urls": [ + "bzzr://823b4efe3ca2964d660348214fd1a44579e13e1e8ce69a81f447372a11d60316", + "dweb:/ipfs/QmUinsRZvs2zFNG6FMWy7ngTYUnZccXq7MRtgpj1dPfxu4" + ] + }, + { + "path": "soljson-v0.6.11+commit.5ef660b1.js", + "version": "0.6.11", + "build": "commit.5ef660b1", + "longVersion": "0.6.11+commit.5ef660b1", + "keccak256": "0xf0abd02c495a0b4c5c9a7ff20de8b932e11fc3066d0b754422035ecd96fcdbbc", + "sha256": "0x9778e4a7667d5fd7632caf3ef3791d390a7cc217f94f96e919a31e3be332386a", + "urls": [ + "bzzr://9f9244a3605543a67f5ff35f21e3d6d3331a6e1361f09b271c37f396b5b89bd5", + "dweb:/ipfs/QmXyjgFNMyFD4fdf8wt9uvUU92MGdDVGmcPdMZhNEo1g8N" + ] + }, + { + "path": "soljson-v0.6.12+commit.27d51765.js", + "version": "0.6.12", + "build": "commit.27d51765", + "longVersion": "0.6.12+commit.27d51765", + "keccak256": "0xe1412d909a0dae79b13c0066b9bf08831c522daec00b273bbc19a799af213d6a", + "sha256": "0x3e1956c550ca48e289044c7c0bd892403081b4b5e17e77ce707c815ce6c4228f", + "urls": [ + "bzzr://b69ab6704a1e42fddb326e91f331e35fdf071b158e8754e2c887c0e607aee7b0", + "dweb:/ipfs/QmTs8PnAGr1ijXtWvMjoWraefAtVv2Y5ZnwkArz6NqJ93w" + ] + }, + { + "path": "soljson-v0.7.0+commit.9e61f92b.js", + "version": "0.7.0", + "build": "commit.9e61f92b", + "longVersion": "0.7.0+commit.9e61f92b", + "keccak256": "0x0c7a4386781683c327fde95363535f377941e14feffad5bb1134c7aa7eba726f", + "sha256": "0xe7e1be3d0a67469f6a37cd676a22314c4faa8a22ff9d5ebde11302db754453eb", + "urls": [ + "bzzr://65dc33e3d9ef94defff1b24e66f093d9d15a92c59778c8eb26e76fd8b64bd3da", + "dweb:/ipfs/QmQFhTptWdDzhemjGpa7Q65HKWGphs4nKKS13nzkcVE8pM" + ] + }, + { + "path": "soljson-v0.7.1+commit.f4a555be.js", + "version": "0.7.1", + "build": "commit.f4a555be", + "longVersion": "0.7.1+commit.f4a555be", + "keccak256": "0x3502cf7933fbce9f1fe1d87a83d5b9df12eee36c03997c3b9821493ce03fcf3e", + "sha256": "0x7fcc983c5149840a47b946fc51fc14f1c21cda07c01d650e4a1f814319cb1423", + "urls": [ + "bzzr://617dff84fd7dc06b476f93a95c015a561662d9ff1d3356ac6a3e5f5b09a636f0", + "dweb:/ipfs/Qmdw9c3usmqgdV2w4JoNWJqscHzscKNVWsWtos1engJa1o" + ] + }, + { + "path": "soljson-v0.7.2+commit.51b20bc0.js", + "version": "0.7.2", + "build": "commit.51b20bc0", + "longVersion": "0.7.2+commit.51b20bc0", + "keccak256": "0x0c80a0bf9e17700249a04a80d7729ccb012a55a82cb0f9e412fa32cc14b09c2b", + "sha256": "0xdfa3f2bb4589bdc9c054292173c82ee70e65af8d1971598f6e13b9b79ba94185", + "urls": [ + "bzzr://a45264806fb74fd38c19704070c83053972270b63bf7b09ddff3c3e15cd1baa0", + "dweb:/ipfs/QmTNWY4vkVLgtNdfGXyH6CY8URmzr33VzMJNN37z5dsAgu" + ] + }, + { + "path": "soljson-v0.7.3+commit.9bfce1f6.js", + "version": "0.7.3", + "build": "commit.9bfce1f6", + "longVersion": "0.7.3+commit.9bfce1f6", + "keccak256": "0xcf099e7057d6c3d5acac1f4e349798ad5a581b6cb7ffcebdf5b37b86eac4872d", + "sha256": "0xcaf4b1f3e01fcf946aad2d22bbe046b9dc4fd50049a05c3458ff239e2c93a785", + "urls": [ + "bzzr://2f8ec45d2d7298ab1fa49f3568ada6c6e030c7dd7f490a1505ed9d4713d86dc8", + "dweb:/ipfs/QmQMH2o7Nz3DaQ31hNYyHVAgejqTyZouvA35Zzzwe2UBPt" + ] + }, + { + "path": "soljson-v0.7.4+commit.3f05b770.js", + "version": "0.7.4", + "build": "commit.3f05b770", + "longVersion": "0.7.4+commit.3f05b770", + "keccak256": "0x300330ecd127756b824aa13e843cb1f43c473cb22eaf3750d5fb9c99279af8c3", + "sha256": "0x2b55ed5fec4d9625b6c7b3ab1abd2b7fb7dd2a9c68543bf0323db2c7e2d55af2", + "urls": [ + "bzzr://16c5f09109c793db99fe35f037c6092b061bd39260ee7a677c8a97f18c955ab1", + "dweb:/ipfs/QmTLs5MuLEWXQkths41HiACoXDiH8zxyqBHGFDRSzVE5CS" + ] + }, + { + "path": "soljson-v0.7.5+commit.eb77ed08.js", + "version": "0.7.5", + "build": "commit.eb77ed08", + "longVersion": "0.7.5+commit.eb77ed08", + "keccak256": "0xfe223dd264421f9b96c3dd3c835a3d0d4d9cfa4c61f75ca0761860c9ae8906ca", + "sha256": "0x2ee1c6434a32a40b137ac28be12ceeba64701bfad5e80239690803d9c139908e", + "urls": [ + "bzzr://d67cf500345ceca523e9bbe55dab9399e27321fd9005704a5b16bab82185260c", + "dweb:/ipfs/Qmf5fpJmeHdwgmSjQPqdu25XtA9akTotakkNmrh4axgo8N" + ] + }, + { + "path": "soljson-v0.7.6+commit.7338295f.js", + "version": "0.7.6", + "build": "commit.7338295f", + "longVersion": "0.7.6+commit.7338295f", + "keccak256": "0xc68517effed7163db0c7f4559931a4c5530fe6f2a8a20596361640d9d7eff655", + "sha256": "0xb94e69dfb056b3e26080f805ab43b668afbc0ac70bf124bfb7391ecfc0172ad2", + "urls": [ + "bzzr://523852f3e01b02ce947771e0279ffb6154d12700f809ba3606d908ba6271431c", + "dweb:/ipfs/QmWjG6PLzF5M6kxkHujhEMg5znQCgf2m1cM1UptKA719Hy" + ] + }, + { + "path": "soljson-v0.8.0+commit.c7dfd78e.js", + "version": "0.8.0", + "build": "commit.c7dfd78e", + "longVersion": "0.8.0+commit.c7dfd78e", + "keccak256": "0x08dd57a5cf5fd59accbd5b601909ffa22d28da756b5367c29b523ff17bbc2f99", + "sha256": "0xc596765f9b3dce486cf596ea35676f37124d54f3ada0fcbc02f094c392066a59", + "urls": [ + "bzzr://7047ade6879aab4c825594dab0914b8ec673bb907eecc6dfbd68f63086e5a36e", + "dweb:/ipfs/QmYh5C2rgDAx452f7HyHA8soLhnoL1GeeNNEWEuw9jKY8w" + ] + }, + { + "path": "soljson-v0.8.1+commit.df193b15.js", + "version": "0.8.1", + "build": "commit.df193b15", + "longVersion": "0.8.1+commit.df193b15", + "keccak256": "0x84a0e9282047512eeec499d55c83dbb6981430b08692d81d6c09730bb18e6cd8", + "sha256": "0xf77f141e5fed9594b28342e2c630ac6d48f2a724e4383a457881acd7fa62b1cf", + "urls": [ + "bzzr://da8c5ea3f2ecd33d3f83ac2c276871f4ee41370fb55ae62c6c29835c9376bdec", + "dweb:/ipfs/QmQ6W5VedQpZAwuGTtp1BhmNkvVheLnJq4xwN9Qmt9bAbH" + ] + }, + { + "path": "soljson-v0.8.2+commit.661d1103.js", + "version": "0.8.2", + "build": "commit.661d1103", + "longVersion": "0.8.2+commit.661d1103", + "keccak256": "0xd0c15275c5b0d03871332719def9b0f17e8860c7db60e0e71f18b971458a7391", + "sha256": "0x015e83fb0b72ccdafb0c217961b21a0321adb2d3f2ad992f5e79635c2086e6dd", + "urls": [ + "bzzr://629ae5ad84c45c248144b5eec7827a9cd5b2f2779ef84ab251c8cd876347a098", + "dweb:/ipfs/QmdfVfa2mhyosaJVeV7rbfnvQ95GTHPeRPzmvxcds7RYej" + ] + }, + { + "path": "soljson-v0.8.3+commit.8d00100c.js", + "version": "0.8.3", + "build": "commit.8d00100c", + "longVersion": "0.8.3+commit.8d00100c", + "keccak256": "0x51777116af58223a41aa3016d0bf733bbb0f78ad9ba4bcc36487eba175f65015", + "sha256": "0xb5cedfa8de5f9421fbdaccf9fd5038652c2632344b3b68e5278de81e9aeac210", + "urls": [ + "bzzr://c7d43da1bc5529d2cc311e00579c36dcff258c42b8ed240b6c4e97bd85492a64", + "dweb:/ipfs/QmWbNMzJryhiZmyifLDQteGPwN4aTgXQB6barBvXYVw975" + ] + }, + { + "path": "soljson-v0.8.4+commit.c7e474f2.js", + "version": "0.8.4", + "build": "commit.c7e474f2", + "longVersion": "0.8.4+commit.c7e474f2", + "keccak256": "0x7e0bca960d11fb095798ff65d029436f23358ac060b25a0938acfcb4652da2ec", + "sha256": "0x4a14c7bcaf0d988a829db2174b8f7731898aa8633216490603ad74bff64eca3c", + "urls": [ + "bzzr://7f33fe204160253c7ec23cb0ac83224bde3aca9f91a7a686cb67d99248c5fbb6", + "dweb:/ipfs/QmPYDf4qYtZLNEAicW7hcvpUJ69FoHiXmUypipDpTKo9hU" + ] + }, + { + "path": "soljson-v0.8.5+commit.a4f2e591.js", + "version": "0.8.5", + "build": "commit.a4f2e591", + "longVersion": "0.8.5+commit.a4f2e591", + "keccak256": "0x6d6d75b033717aae0a728e527005d8d2cc7dbd0a835c8873c630a2a9689a2976", + "sha256": "0x4af595f976235d33a22ffe223e9e3210b4ca510f6a93f153b3daed60f2b11fbc", + "urls": [ + "bzzr://d501ee8c460db75379b5716bcb5ae10e3e32625d6c9b08e319822a110f178906", + "dweb:/ipfs/QmNWkyirqXy3gDHNXpPuVUbExMGWjMqPR82Xzs64RzgQzy" + ] + }, + { + "path": "soljson-v0.8.6+commit.11564f7e.js", + "version": "0.8.6", + "build": "commit.11564f7e", + "longVersion": "0.8.6+commit.11564f7e", + "keccak256": "0x070e41c7f761ff1a8383a2c0d54c22aab0f115ca8c3790ecea27d6dde11611ca", + "sha256": "0x06a671efd8865a6ecc0ad648076177b35abcd06a7059888ea65111272e33a57f", + "urls": [ + "bzzr://e4f8176cdb3a0f3ba0b7061079dd9d3495f6a2288bd724780337cacd96515148", + "dweb:/ipfs/QmQre11ZPgWSx79Jzca1tkTYFyMbXz8H4kcrhfpWSj4qs8" + ] + }, + { + "path": "soljson-v0.8.7+commit.e28d00a7.js", + "version": "0.8.7", + "build": "commit.e28d00a7", + "longVersion": "0.8.7+commit.e28d00a7", + "keccak256": "0x8d6be9e58c33d265b5a8b1132a27fce126067419f3f4f15d3ef6b7147593b61d", + "sha256": "0x663ba99f7c7ee907f0f03227502d48a78256c3c292ace3b79a5d3eb510665306", + "urls": [ + "bzzr://0bdbad1bdcc3a9775f16f20a35556be4baa0e6c9a9b9d820e8e2cdea80667c6a", + "dweb:/ipfs/QmYv3Rsi9pL6PZAtc4XLHezPqti8yCRGEdDBqzEsQv57GV" + ] + }, + { + "path": "soljson-v0.8.8+commit.dddeac2f.js", + "version": "0.8.8", + "build": "commit.dddeac2f", + "longVersion": "0.8.8+commit.dddeac2f", + "keccak256": "0x56cb2f6978bf1213982ef217ee76b39dc97b6e66c92a7be7a1b44079c0236e5c", + "sha256": "0x534b7d4079d13bb4cd10b7559dc105c2adec625df4105f20ebce47e6da60bfda", + "urls": [ + "bzzr://7543aa16521848b06a1359afcb9dbd7be1dd09a36f4ca53edd3ed3a512a475e9", + "dweb:/ipfs/QmZaSrn3TPvPVoShtjSonQLFd3BV6RdgRMqw8GTzhnKYpm" + ] + }, + { + "path": "soljson-v0.8.9+commit.e5eed63a.js", + "version": "0.8.9", + "build": "commit.e5eed63a", + "longVersion": "0.8.9+commit.e5eed63a", + "keccak256": "0xbc470ab3442e78bb4d3f16c01c39b2f160f4f34eb4373efed11c234e1c7f6ca0", + "sha256": "0x5b25f987aae32a0275fdc6c1be36cc47cf126024a04dafd8e4be39a1d1d1422c", + "urls": [ + "bzzr://83bf64f11a09845a6eb732da08283a58f877e9227190f489c9852f790c81d0c4", + "dweb:/ipfs/QmfFq3MvisCSUJy8N8EVsBribgPbdpTZb7tQ2eHYw7dwag" + ] + }, + { + "path": "soljson-v0.8.10+commit.fc410830.js", + "version": "0.8.10", + "build": "commit.fc410830", + "longVersion": "0.8.10+commit.fc410830", + "keccak256": "0x3820aae0de50f10f62819d65f0b5a236ccffed11ab465a3295a5408fa47e24f5", + "sha256": "0x5eaee3240a06891abf5ac70c75caf9a0c33ebe9a2736abdaa22a337f86c22933", + "urls": [ + "bzzr://5124a21890d6b0ae70bfd031f741d7edc74cff70a26ca74750d446b15a8efb06", + "dweb:/ipfs/QmcsfYpEWbPXfVptzi1YvGokxi2FYCUzUr8rQYJCc5fEiB" + ] + }, + { + "path": "soljson-v0.8.11+commit.d7f03943.js", + "version": "0.8.11", + "build": "commit.d7f03943", + "longVersion": "0.8.11+commit.d7f03943", + "keccak256": "0x798b23086ce1339e3d47b3648a1f3ae40561e2c9f66ffcc98e71fc14a7f77584", + "sha256": "0x64117d4b13bfc5bc6e5f80823519b140e753a0c09e99edd756772dc3029bc1f8", + "urls": [ + "bzzr://0fd1c8db6338b2143ab0e49a33edaa133108ba77f1238408018b5b2a0ecdeb62", + "dweb:/ipfs/QmNQTFQmfnjxnDmbguVSnZ5DiHGFQHCsffccW5c2DMcSsT" + ] + }, + { + "path": "soljson-v0.8.12+commit.f00d7308.js", + "version": "0.8.12", + "build": "commit.f00d7308", + "longVersion": "0.8.12+commit.f00d7308", + "keccak256": "0xdd4ae95607655404b769fab5f949ac95c6a1a506330f512aef0d92974c390431", + "sha256": "0xc2c4738c96ad329cbb9baea615ed50ffb5a53d93fed8e00785e47242581d3c60", + "urls": [ + "bzzr://38f396377d5a5a60d0b9d8c4dc1343485517ff31bcd281d531f98534dc79d811", + "dweb:/ipfs/QmVdW2ygaT2vecoSUog3HUn8hZqXU4XXQZvuRSdpV6DJPL" + ] + }, + { + "path": "soljson-v0.8.13+commit.abaa5c0e.js", + "version": "0.8.13", + "build": "commit.abaa5c0e", + "longVersion": "0.8.13+commit.abaa5c0e", + "keccak256": "0x9afa714859d1c8f8ed2fded497b83a7a420474282494d25d4c9f592667729f21", + "sha256": "0x387343bcf8f2b77fe4cdcddcaa84361fabf8e1c3508f874fbbcbb9c313542f56", + "urls": [ + "bzzr://ade0fd040981c4e8c7adfe366296e452687c7bb6421de8546a0678be4add016a", + "dweb:/ipfs/Qma9V9dJwmkim98H6DQX4f7RH395vsUuqHCDxbKetcbj18" + ] + }, + { + "path": "soljson-v0.8.14+commit.80d49f37.js", + "version": "0.8.14", + "build": "commit.80d49f37", + "longVersion": "0.8.14+commit.80d49f37", + "keccak256": "0xb0f7f19a8590e5c0aaf779019c1deaafed170d8c26bec9bfd782d212e097619e", + "sha256": "0x7c3b3d0066fd381283b1d8d9a86153b2ddb5c01da14a1ae015c05cfa484e81b6", + "urls": [ + "bzzr://fa438d41ed52c9e0cca556efee61486fc77e60df06081921abb0a0f19b602d35", + "dweb:/ipfs/QmcM1TcDB4ta8ttNLWZ4d24M4Qs35rc91sQkdNmJMNbuvV" + ] + }, + { + "path": "soljson-v0.8.15+commit.e14f2714.js", + "version": "0.8.15", + "build": "commit.e14f2714", + "longVersion": "0.8.15+commit.e14f2714", + "keccak256": "0x4f6cdc0f25e734bcb977bb6a3e22fa41d8a82cbd5f220a2e4238c2d233526d1a", + "sha256": "0x71135e459d691767ce3453bab4564ef4a640dd50182da36517cbc1f96c1d4c7c", + "urls": [ + "bzzr://ac5baefba32f4779a03d1207d9f1ed69365280c702fd73002a729b7a3d52c425", + "dweb:/ipfs/QmPiBrYZxxpNZPQ98GNyL7Xa1F9Dq7uHtdt9ESwhPNkHhc" + ] + }, + { + "path": "soljson-v0.8.16+commit.07a7930e.js", + "version": "0.8.16", + "build": "commit.07a7930e", + "longVersion": "0.8.16+commit.07a7930e", + "keccak256": "0x331f4bc6de3d44d87b68629e83f711105325b482da7e9ca9bdbdd01371fee438", + "sha256": "0x27b2820ef93805a65c76b7945a49432582d306fd17a28985709a51e6403677c2", + "urls": [ + "bzzr://af0d70945c85865298732ac2bfdacdf2774fb4daf793c94fafe135b839a60a5c", + "dweb:/ipfs/QmWzBJ8gdccvRSSB5YsMKiF2qt3RFmAP2X25QEWqqQnR4y" + ] + }, + { + "path": "soljson-v0.8.17+commit.8df45f5f.js", + "version": "0.8.17", + "build": "commit.8df45f5f", + "longVersion": "0.8.17+commit.8df45f5f", + "keccak256": "0x3f2be218cf4545b4d2e380417c6da1e008fdc4255ab38c9ee12f64c0e3f55ea9", + "sha256": "0x617828e63be485c7cc2dbcbdd5a22b582b40fafaa41016ad595637b83c90656c", + "urls": [ + "bzzr://fe8da5b2531d31e4b67acdce09c81eccba1100550a7222722152ffdb16ea85ef", + "dweb:/ipfs/QmTedx1wBKSUaLatuqXYngjfKQLD2cGqPKjdLYCnbMYwiz" + ] + }, + { + "path": "soljson-v0.8.18+commit.87f61d96.js", + "version": "0.8.18", + "build": "commit.87f61d96", + "longVersion": "0.8.18+commit.87f61d96", + "keccak256": "0x9a8fa4183ef95496045189b80dfb39f745db89a903b398e40131f500953e5d57", + "sha256": "0xd82bdcba2c386d60b33aca148a9cfdf097551f68c5e45d8ec01aebbafacf5075", + "urls": [ + "bzzr://338117c2130fcb6bce3006330712b6e7ee99875b56ce4bb6182312f76e4a6bac", + "dweb:/ipfs/QmcKzrqRBy7PeFQxzJDs1AZZzNHKaKbJces6zUDysXZofJ" + ] + }, + { + "path": "soljson-v0.8.19+commit.7dd6d404.js", + "version": "0.8.19", + "build": "commit.7dd6d404", + "longVersion": "0.8.19+commit.7dd6d404", + "keccak256": "0x6be35b86f5656c06ae897ef311c28da375bdcbded68c4a81e124f2cb36adf830", + "sha256": "0xe0b74e0a16e783a35169f74d1a615ecb48d07c30f97346b83cd587949268681e", + "urls": [ + "bzzr://434c17a0cc3bf371e5b9baa7f804b37ffd2dc141a98c59b2ba6021fc419a39c0", + "dweb:/ipfs/QmPnhNtzrEBeWWQMXdAByQTDPoKXXV9NFXLk3YL4QbghMP" + ] + }, + { + "path": "soljson-v0.8.20+commit.a1b79de6.js", + "version": "0.8.20", + "build": "commit.a1b79de6", + "longVersion": "0.8.20+commit.a1b79de6", + "keccak256": "0x3a420fa9963772eee5b9221ebb8cf9548eea8f88b09537390960ea9b440f333c", + "sha256": "0x5c509f760dc110a695c8b39bbc21e08c17dee431aa14d606f59e623d7c3cc657", + "urls": [ + "bzzr://fdc05062e4c7ec85ed18ab17b6f04f3274a4b7caf0be483eb86007d708825fb0", + "dweb:/ipfs/QmciAxUX2kfuoxitmMdkKSfWn2SfxQdieLRa3S5S2munot" + ] + }, + { + "path": "soljson-v0.8.21+commit.d9974bed.js", + "version": "0.8.21", + "build": "commit.d9974bed", + "longVersion": "0.8.21+commit.d9974bed", + "keccak256": "0x370efd28e2d28b6d0ba55e20d8994f3d286c3772552ed63586b5fe157c0d3c57", + "sha256": "0x45bea352b41d04039e19439962ddef1d3e10cf2bc9526feba39f2cc79e3c5a17", + "urls": [ + "bzzr://5e66947c220c91a6cd39bc22965dcf861015b8613a6e09aa7fb7dc10f367b5d7", + "dweb:/ipfs/QmXLgy6oexvCBWYS5pTpJWohsDNGqgdNFLRKX7JrE3NxYt" + ] + }, + { + "path": "soljson-v0.8.22+commit.4fc1097e.js", + "version": "0.8.22", + "build": "commit.4fc1097e", + "longVersion": "0.8.22+commit.4fc1097e", + "keccak256": "0x907eeba6e6e0d6977ac5a8f50e4dd2762539ca827ceab1afb1f5a4f0f3ce3e0c", + "sha256": "0x92d283c545395b91a656fa1ec94d567a464bca55aebcdbb99debf42b43026845", + "urls": [ + "bzzr://63ec828814e2b57db2a7a146061a96cc39797ba39a0063a7b664421a48f21c00", + "dweb:/ipfs/Qma6o4e57YtWj8cQLQs12r2Enx9qmRA7VHtupCauXjYTAk" + ] + }, + { + "path": "soljson-v0.8.23+commit.f704f362.js", + "version": "0.8.23", + "build": "commit.f704f362", + "longVersion": "0.8.23+commit.f704f362", + "keccak256": "0x743aaafac24d9740a0b71215f55a132f89336a662487944767ca4bfd66400769", + "sha256": "0x9c681b165c8647867589c0a5ecdc8692637a935928a2b1bbea2ff4a1f4976985", + "urls": [ + "bzzr://6e70fe6bfe8c3fc63f8a3eba733731aab129e6e58828b78058e53bb50440709b", + "dweb:/ipfs/QmZy5ho8W943FMGwppXZFS1WFrVwV3UXhUUwcD7oH5vrYe" + ] + } + ], + "releases": { + "0.8.23": "soljson-v0.8.23+commit.f704f362.js", + "0.8.22": "soljson-v0.8.22+commit.4fc1097e.js", + "0.8.21": "soljson-v0.8.21+commit.d9974bed.js", + "0.8.20": "soljson-v0.8.20+commit.a1b79de6.js", + "0.8.19": "soljson-v0.8.19+commit.7dd6d404.js", + "0.8.18": "soljson-v0.8.18+commit.87f61d96.js", + "0.8.17": "soljson-v0.8.17+commit.8df45f5f.js", + "0.8.16": "soljson-v0.8.16+commit.07a7930e.js", + "0.8.15": "soljson-v0.8.15+commit.e14f2714.js", + "0.8.14": "soljson-v0.8.14+commit.80d49f37.js", + "0.8.13": "soljson-v0.8.13+commit.abaa5c0e.js", + "0.8.12": "soljson-v0.8.12+commit.f00d7308.js", + "0.8.11": "soljson-v0.8.11+commit.d7f03943.js", + "0.8.10": "soljson-v0.8.10+commit.fc410830.js", + "0.8.9": "soljson-v0.8.9+commit.e5eed63a.js", + "0.8.8": "soljson-v0.8.8+commit.dddeac2f.js", + "0.8.7": "soljson-v0.8.7+commit.e28d00a7.js", + "0.8.6": "soljson-v0.8.6+commit.11564f7e.js", + "0.8.5": "soljson-v0.8.5+commit.a4f2e591.js", + "0.8.4": "soljson-v0.8.4+commit.c7e474f2.js", + "0.8.3": "soljson-v0.8.3+commit.8d00100c.js", + "0.8.2": "soljson-v0.8.2+commit.661d1103.js", + "0.8.1": "soljson-v0.8.1+commit.df193b15.js", + "0.8.0": "soljson-v0.8.0+commit.c7dfd78e.js", + "0.7.6": "soljson-v0.7.6+commit.7338295f.js", + "0.7.5": "soljson-v0.7.5+commit.eb77ed08.js", + "0.7.4": "soljson-v0.7.4+commit.3f05b770.js", + "0.7.3": "soljson-v0.7.3+commit.9bfce1f6.js", + "0.7.2": "soljson-v0.7.2+commit.51b20bc0.js", + "0.7.1": "soljson-v0.7.1+commit.f4a555be.js", + "0.7.0": "soljson-v0.7.0+commit.9e61f92b.js", + "0.6.12": "soljson-v0.6.12+commit.27d51765.js", + "0.6.11": "soljson-v0.6.11+commit.5ef660b1.js", + "0.6.10": "soljson-v0.6.10+commit.00c0fcaf.js", + "0.6.9": "soljson-v0.6.9+commit.3e3065ac.js", + "0.6.8": "soljson-v0.6.8+commit.0bbfe453.js", + "0.6.7": "soljson-v0.6.7+commit.b8d736ae.js", + "0.6.6": "soljson-v0.6.6+commit.6c089d02.js", + "0.6.5": "soljson-v0.6.5+commit.f956cc89.js", + "0.6.4": "soljson-v0.6.4+commit.1dca32f3.js", + "0.6.3": "soljson-v0.6.3+commit.8dda9521.js", + "0.6.2": "soljson-v0.6.2+commit.bacdbe57.js", + "0.6.1": "soljson-v0.6.1+commit.e6f7d5a4.js", + "0.6.0": "soljson-v0.6.0+commit.26b70077.js", + "0.5.17": "soljson-v0.5.17+commit.d19bba13.js", + "0.5.16": "soljson-v0.5.16+commit.9c3226ce.js", + "0.5.15": "soljson-v0.5.15+commit.6a57276f.js", + "0.5.14": "soljson-v0.5.14+commit.01f1aaa4.js", + "0.5.13": "soljson-v0.5.13+commit.5b0b510c.js", + "0.5.12": "soljson-v0.5.12+commit.7709ece9.js", + "0.5.11": "soljson-v0.5.11+commit.c082d0b4.js", + "0.5.10": "soljson-v0.5.10+commit.5a6ea5b1.js", + "0.5.9": "soljson-v0.5.9+commit.e560f70d.js", + "0.5.8": "soljson-v0.5.8+commit.23d335f2.js", + "0.5.7": "soljson-v0.5.7+commit.6da8b019.js", + "0.5.6": "soljson-v0.5.6+commit.b259423e.js", + "0.5.5": "soljson-v0.5.5+commit.47a71e8f.js", + "0.5.4": "soljson-v0.5.4+commit.9549d8ff.js", + "0.5.3": "soljson-v0.5.3+commit.10d17f24.js", + "0.5.2": "soljson-v0.5.2+commit.1df8f40c.js", + "0.5.1": "soljson-v0.5.1+commit.c8a2cb62.js", + "0.5.0": "soljson-v0.5.0+commit.1d4f565a.js", + "0.4.26": "soljson-v0.4.26+commit.4563c3fc.js", + "0.4.25": "soljson-v0.4.25+commit.59dbf8f1.js", + "0.4.24": "soljson-v0.4.24+commit.e67f0147.js", + "0.4.23": "soljson-v0.4.23+commit.124ca40d.js", + "0.4.22": "soljson-v0.4.22+commit.4cb486ee.js", + "0.4.21": "soljson-v0.4.21+commit.dfe3193c.js", + "0.4.20": "soljson-v0.4.20+commit.3155dd80.js", + "0.4.19": "soljson-v0.4.19+commit.c4cbbb05.js", + "0.4.18": "soljson-v0.4.18+commit.9cf6e910.js", + "0.4.17": "soljson-v0.4.17+commit.bdeb9e52.js", + "0.4.16": "soljson-v0.4.16+commit.d7661dd9.js", + "0.4.15": "soljson-v0.4.15+commit.bbb8e64f.js", + "0.4.14": "soljson-v0.4.14+commit.c2215d46.js", + "0.4.13": "soljson-v0.4.13+commit.0fb4cb1a.js", + "0.4.12": "soljson-v0.4.12+commit.194ff033.js", + "0.4.11": "soljson-v0.4.11+commit.68ef5810.js", + "0.4.10": "soljson-v0.4.10+commit.f0d539ae.js", + "0.4.9": "soljson-v0.4.9+commit.364da425.js", + "0.4.8": "soljson-v0.4.8+commit.60cc1668.js", + "0.4.7": "soljson-v0.4.7+commit.822622cf.js", + "0.4.6": "soljson-v0.4.6+commit.2dabbdf0.js", + "0.4.5": "soljson-v0.4.5+commit.b318366e.js", + "0.4.4": "soljson-v0.4.4+commit.4633f3de.js", + "0.4.3": "soljson-v0.4.3+commit.2353da71.js", + "0.4.2": "soljson-v0.4.2+commit.af6afb04.js", + "0.4.1": "soljson-v0.4.1+commit.4fc6fc2c.js", + "0.4.0": "soljson-v0.4.0+commit.acd334c9.js", + "0.3.6": "soljson-v0.3.6+commit.3fc68da5.js" + }, + "latestRelease": "0.8.23" +} \ No newline at end of file From 538a9c8c2358ca087452b6e6ddb9572db0fdc152 Mon Sep 17 00:00:00 2001 From: filip mertens Date: Sat, 11 Nov 2023 17:51:54 +0100 Subject: [PATCH 053/163] get the commits --- apps/remix-ide/src/app/files/dgitProvider.js | 58 ++++++++++---------- apps/remix-ide/src/remixEngine.js | 1 + 2 files changed, 31 insertions(+), 28 deletions(-) diff --git a/apps/remix-ide/src/app/files/dgitProvider.js b/apps/remix-ide/src/app/files/dgitProvider.js index e781a321bf..104a71ded1 100644 --- a/apps/remix-ide/src/app/files/dgitProvider.js +++ b/apps/remix-ide/src/app/files/dgitProvider.js @@ -217,22 +217,10 @@ class DGitProvider extends Plugin { } async lsfiles (cmd) { - console.log('lsfiles') const filesInStaging = await git.listFiles({ ...await this.getGitConfig(), ...cmd }) - console.log(await git.resolveRef({ - ...await this.getGitConfig(), - ref: 'HEAD' - })) - console.log(await git.readTree({ - ...await this.getGitConfig(), - oid: await git.resolveRef({ - ...await this.getGitConfig(), - ref: 'HEAD' - }) - })) return filesInStaging } @@ -367,32 +355,46 @@ class DGitProvider extends Plugin { const cmd = { url: module.url, singleBranch: true, - depth: 1, + depth: 5000, // this is needed because we need the history to find the commit hash ...await this.parseInput(input), ...await this.getGitConfig(dir) } this.call('terminal', 'logHtml', `Cloning submodule ${dir}...`) await git.clone(cmd) this.call('terminal', 'logHtml', `Cloned successfully submodule ${dir}...`) - console.log('checkout the commit of the submodule ', currentDir, module.path) - - console.log(await git.readTree({ + + const commitHash = await git.resolveRef({ ...await this.getGitConfig(currentDir), - oid: await git.resolveRef({ - ...await this.getGitConfig(currentDir), - ref: 'HEAD' - }) - })) + ref: 'HEAD' + }) - const treeWalker = new git.TreeWalker(await git.readTree({ + const result = await git.walk({ ...await this.getGitConfig(currentDir), - oid: await git.resolveRef({ - ...await this.getGitConfig(currentDir), - ref: 'HEAD' - })})) + trees: [git.TREE({ ref: commitHash })], + map: async function (filepath, [A]) { + //console.log(filepath, await A.oid()) + if(filepath === module.path) { + return await A.oid() + } + } + }) + if(result && result.length) { + this.call('terminal', 'logHtml', `Checking out submodule ${dir} to ${result[0]} in directory ${dir}`) + await git.fetch({ + ...await this.getGitConfig(dir), + ...await this.parseInput(input), + }) + const status = await git.log({ + ...await this.getGitConfig(dir), + ...cmd + }) - console.log(treeWalker) - + await git.checkout({ + ...await this.getGitConfig(dir), + ref: result[0] + }) + this.call('terminal', 'logHtml',`Checked out submodule ${dir} to ${result[0]}`) + } await this.updateSubmodules({ ...input, diff --git a/apps/remix-ide/src/remixEngine.js b/apps/remix-ide/src/remixEngine.js index 4c2b708bfe..039b33e50d 100644 --- a/apps/remix-ide/src/remixEngine.js +++ b/apps/remix-ide/src/remixEngine.js @@ -21,6 +21,7 @@ export class RemixEngine extends Engine { if (name === 'walletconnect') return { queueTimeout: 60000 * 4 } if (name === 'udapp') return { queueTimeout: 60000 * 4 } if (name === 'circuit-compiler') return { queueTimeout: 60000 * 4 } + if (name === 'filePanel') return { queueTimeout: 60000 * 10 } return { queueTimeout: 10000 } } From bef191c2ff47b64fe03d194f498436dcce801f7e Mon Sep 17 00:00:00 2001 From: filip mertens Date: Sat, 11 Nov 2023 17:53:06 +0100 Subject: [PATCH 054/163] timeout --- apps/remix-ide/src/remixEngine.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/remix-ide/src/remixEngine.js b/apps/remix-ide/src/remixEngine.js index 039b33e50d..46baa7f6c9 100644 --- a/apps/remix-ide/src/remixEngine.js +++ b/apps/remix-ide/src/remixEngine.js @@ -21,7 +21,7 @@ export class RemixEngine extends Engine { if (name === 'walletconnect') return { queueTimeout: 60000 * 4 } if (name === 'udapp') return { queueTimeout: 60000 * 4 } if (name === 'circuit-compiler') return { queueTimeout: 60000 * 4 } - if (name === 'filePanel') return { queueTimeout: 60000 * 10 } + if (name === 'filePanel') return { queueTimeout: 60000 * 20 } return { queueTimeout: 10000 } } From 23abea9d3ede82e3d515efd9e31af77e7ccf3aec Mon Sep 17 00:00:00 2001 From: bunsenstraat Date: Sat, 11 Nov 2023 17:55:05 +0100 Subject: [PATCH 055/163] Delete apps/remix-ide/src/assets/list.json --- apps/remix-ide/src/assets/list.json | 1177 --------------------------- 1 file changed, 1177 deletions(-) delete mode 100644 apps/remix-ide/src/assets/list.json diff --git a/apps/remix-ide/src/assets/list.json b/apps/remix-ide/src/assets/list.json deleted file mode 100644 index 7c75a856e5..0000000000 --- a/apps/remix-ide/src/assets/list.json +++ /dev/null @@ -1,1177 +0,0 @@ -{ - "builds": [ - { - "path": "soljson-v0.3.6+commit.3fc68da5.js", - "version": "0.3.6", - "build": "commit.3fc68da5", - "longVersion": "0.3.6+commit.3fc68da5", - "keccak256": "0x4a1c2a6a4896edefd3a4178a6c3ed8f1de625bd7c00dd7cc5781a9f36236e7db", - "sha256": "0xee7ba01680ed3a1c1cda236189a51c1e6ff99f6dca602a580e5b16441772b50b", - "urls": [ - "bzzr://83e99aa35ae67e71bf77040e5b4686aeb3558919f172b6c28213a4dcd8d79e91", - "dweb:/ipfs/Qme9brfZS3XhbiRbbNDKhBpgFknyD92omMmYa7XSf56bJP" - ] - }, - { - "path": "soljson-v0.4.0+commit.acd334c9.js", - "version": "0.4.0", - "build": "commit.acd334c9", - "longVersion": "0.4.0+commit.acd334c9", - "keccak256": "0x07994ad8c59c498bf44ca8e84914e27b79be964d98a9556226db377819d67387", - "sha256": "0xb83d2025e0bbc7f7f0dc9e47f5aa22eacb548b42c55add8f5f6822c105163500", - "urls": [ - "bzzr://414fc715062f91971c8e0d9fbdf470dd24a8a35f4f96df0ba79980cdb0ae7eaa", - "dweb:/ipfs/QmcBZ6Q2iHmrf9omvD7Jyy8kgrqyPmZFwvKWqvVDaxo1Ta" - ] - }, - { - "path": "soljson-v0.4.1+commit.4fc6fc2c.js", - "version": "0.4.1", - "build": "commit.4fc6fc2c", - "longVersion": "0.4.1+commit.4fc6fc2c", - "keccak256": "0x4c358c2e90447ad9e7c1816b5be8edde1172f67dedf16755a6c7373ede46b245", - "sha256": "0x9825565e1f199dbed6de01d27e10f83a9180300acab80f8469bf427e3cf92e96", - "urls": [ - "bzzr://6ecbe30c4c8530b82d55ed6bec12e63efbab1cb16868b020d65399a8793599a6", - "dweb:/ipfs/QmcEK5gvWNeHUtjsF3B6j5AXb9uNoG3aHbPrCMJDx7C8TM" - ] - }, - { - "path": "soljson-v0.4.2+commit.af6afb04.js", - "version": "0.4.2", - "build": "commit.af6afb04", - "longVersion": "0.4.2+commit.af6afb04", - "keccak256": "0xb67df5c37e8255e0de7918b6d3261f0f29e277d121bf5f414b66157a5b1070cd", - "sha256": "0x67f8a94b60278cfb80d505c47a1a5e67ec2caf20167ef85f2bdf2a80a692bd1b", - "urls": [ - "bzzr://7ba69a10a4585d0a36e5843603476061e8b02878331fa580d5c2509ef01ddaa6", - "dweb:/ipfs/QmVumPvgQVFLZvDvQddcDGcdxjbVWTTzxoQvJAECBBZ6Ju" - ] - }, - { - "path": "soljson-v0.4.3+commit.2353da71.js", - "version": "0.4.3", - "build": "commit.2353da71", - "longVersion": "0.4.3+commit.2353da71", - "keccak256": "0x62a65d0a951617f022524fc844ca11d90266f64e693343a2f41107183bf364c1", - "sha256": "0x66da311056ec26c9c3fb501350ee22187c30e79c41bf2713eeff7d84479948c5", - "urls": [ - "bzzr://ccf4f1e05d942946bcca929e9263c541b2749bf1faf6dc6c211b4bf700344d71", - "dweb:/ipfs/QmXf2cKYJ26tXAU6A6tmUk2dn4tuX3CWNaXJVnGLuoe15y" - ] - }, - { - "path": "soljson-v0.4.4+commit.4633f3de.js", - "version": "0.4.4", - "build": "commit.4633f3de", - "longVersion": "0.4.4+commit.4633f3de", - "keccak256": "0x06afcb6dc23efb1482545b63c5e3983dded0c383ecc46c3ae319f7b868201e47", - "sha256": "0x9e386edb2ee759ad65792f7d62c10ae7edf65c5b874a5451f1e695e586b69eea", - "urls": [ - "bzzr://e93e97b9989cd59673bb1fd64a0f940e8729c3c40b819593b8590480cba24bea", - "dweb:/ipfs/QmSJFaZhpXQ2EPF2koyiTNAiiuJRykv1Q8yubhkmBhvYyu" - ] - }, - { - "path": "soljson-v0.4.5+commit.b318366e.js", - "version": "0.4.5", - "build": "commit.b318366e", - "longVersion": "0.4.5+commit.b318366e", - "keccak256": "0xcdf7c4d4c6b9331b755170fa927692019c94088f87f100d2c3c920bcc3740d0b", - "sha256": "0x7184dae0b761485a5dce66b50075e17857c5b55fe3fa71fe22d4d5acc0839741", - "urls": [ - "bzzr://e21d2bd58112fb165fa2c253504bf49ceca661ac1009d270a31cb996560cfa34", - "dweb:/ipfs/QmYJuZgMbeMiotHAFNWEXdxjTa5yi7GaV4UkgBYABomFpj" - ] - }, - { - "path": "soljson-v0.4.6+commit.2dabbdf0.js", - "version": "0.4.6", - "build": "commit.2dabbdf0", - "longVersion": "0.4.6+commit.2dabbdf0", - "keccak256": "0x52ca702b8ed4b1e6d43d8a006b3d27f6dba611bac118c523711bfd209fb1cc9d", - "sha256": "0x8db9466df3b91c52e3412cebd13176ea9fe16d3239d000828a081c34ce899337", - "urls": [ - "bzzr://24dc5536a4771b2336fa304f3cd38d5203b6ab49c78a3057ec578991f3fcf265", - "dweb:/ipfs/QmZZ9hNntBxJw3G7LGW3e8nXtnGxLnaSMM44K4BbLrkELs" - ] - }, - { - "path": "soljson-v0.4.7+commit.822622cf.js", - "version": "0.4.7", - "build": "commit.822622cf", - "longVersion": "0.4.7+commit.822622cf", - "keccak256": "0xcd8a6a8b2626de75ef6ff73fb724f3ad5693a8902f86e88290f048b56182e7cc", - "sha256": "0xd28a58fbc3ce56ff650d4daf3a1d8092e25cadf2a5b2769fd333b321dfc6a22d", - "urls": [ - "bzzr://6a5d22e366c35f184d5203f3e062131018d8a4d09cf770a0720cfaf4d7b49705", - "dweb:/ipfs/QmfHjv4nYKuv3yFpWZqBYyiYEYmkQGydQmFT5b6mJkFpWp" - ] - }, - { - "path": "soljson-v0.4.8+commit.60cc1668.js", - "version": "0.4.8", - "build": "commit.60cc1668", - "longVersion": "0.4.8+commit.60cc1668", - "keccak256": "0x43c96fc79cf288cecda12b23a17f30b1cf0427a19dc7c1c094bb461eabefe0df", - "sha256": "0x9af176f42b63eaec838999a07e80484f92f41a0fc497adefa65baf88d8fbecaf", - "urls": [ - "bzzr://fc0e644a61e43592754b66f8d911c91312538debb89da29ffda3d3fd81ff70d9", - "dweb:/ipfs/Qmf7WYJJ8y6oHr4RQ7HC4tXgFPGvsnp3Qf6TrMBdK52Y5Z" - ] - }, - { - "path": "soljson-v0.4.9+commit.364da425.js", - "version": "0.4.9", - "build": "commit.364da425", - "longVersion": "0.4.9+commit.364da425", - "keccak256": "0xbe94ff397be2a951cbeb6c9c1a60ddf531d0ce76f45d51755386b6fa42cc2e2c", - "sha256": "0x6ff1683eb76dc58c31043fea474be6da8535ec625d1cd8331a3daead84fd5564", - "urls": [ - "bzzr://6e134aa89a00a18d930924fc2fad2aa434f80b6a71085ff2ab379e3672c812e7", - "dweb:/ipfs/QmeBWFbK1aAxnB6muXWStZJWndrFvMJt4xfAzEJD7AqaY3" - ] - }, - { - "path": "soljson-v0.4.10+commit.f0d539ae.js", - "version": "0.4.10", - "build": "commit.f0d539ae", - "longVersion": "0.4.10+commit.f0d539ae", - "keccak256": "0x178e51ad0c6a350ec4ed6fd07675dfd4d2581ee07b14b4954dd0b0f6d8633ca5", - "sha256": "0xd70ca2f656a88a9be7a3f7d602f03b30149b3bda0d1057cfa3a3c5e3d6e07453", - "urls": [ - "bzzr://6e43013ff973198d7fcc4a43910041f2f07d0099f4252737a2a2545443b11105", - "dweb:/ipfs/QmarthW41sfbrdkMmCK6jicXFZDGgvALzdgzygtUqEauae" - ] - }, - { - "path": "soljson-v0.4.11+commit.68ef5810.js", - "version": "0.4.11", - "build": "commit.68ef5810", - "longVersion": "0.4.11+commit.68ef5810", - "keccak256": "0xb8c3f5654b323cea016c0cc1a4584069714cdf796489efe2496a13f8f83a0e63", - "sha256": "0xdeb3c274f8b840d657e2f9b1dba602e89f58b1bf3fd7178c48c9033310a1f006", - "urls": [ - "bzzr://084452a20ae520bba965ba0b863f3d6de0516d1f92ddb512a138fb787d841c55", - "dweb:/ipfs/QmNUf8dTW9xANAvJmV1ho279AyWSCCvDp6bXet1QTcS2z5" - ] - }, - { - "path": "soljson-v0.4.12+commit.194ff033.js", - "version": "0.4.12", - "build": "commit.194ff033", - "longVersion": "0.4.12+commit.194ff033", - "keccak256": "0x598af6fec02a6783d6a438a6bb0f7d3012716d003f7bf6c9ac5a4d2bc911941b", - "sha256": "0xd522b307a014a32ed5815b05045c4396abc047e70c8a53c1e3ef92e14daa61c6", - "urls": [ - "bzzr://cef259b97217a7526819155f6dd513768be5f8718324ec3a63c315071e2f7c70", - "dweb:/ipfs/QmWGK9FbQiNWNeqysvCNCBw3q7cR1dzpnD1EKtNija2zyK" - ] - }, - { - "path": "soljson-v0.4.13+commit.0fb4cb1a.js", - "version": "0.4.13", - "build": "commit.0fb4cb1a", - "longVersion": "0.4.13+commit.0fb4cb1a", - "keccak256": "0x93f7046d6e0ea2492ec5229936821b3b020dbe9eb2e1193953389293d64a190b", - "sha256": "0x68ace74ca809ff47b09449d4054c77907d9412f14f6003d5475b60f4fec13709", - "urls": [ - "bzzr://8943b9e6d4ec52bda1b8fbd65509168ba3388651a30cb495d5280cfbf35614d7", - "dweb:/ipfs/Qmco9fGHM6mdaPVYqeDQ11GB3BrCbwRcEzM5XzHpAdAVWc" - ] - }, - { - "path": "soljson-v0.4.14+commit.c2215d46.js", - "version": "0.4.14", - "build": "commit.c2215d46", - "longVersion": "0.4.14+commit.c2215d46", - "keccak256": "0x7def3c264883cbe6ffbfc54894e48f9a0d2984ddbd1145eb898758d2a41d1559", - "sha256": "0x54f3dc64f2ff5a5350410f6157a537d96fb4aeec90476e90a951ddfbd1fe4bca", - "urls": [ - "bzzr://3428015c422bb223c3fe8c3a85615081981c47ead375564c16701b261948f0f1", - "dweb:/ipfs/QmXyyuEWhexuez2rzAeFjunpiAhncD1AfcXitGNHxpRWha" - ] - }, - { - "path": "soljson-v0.4.15+commit.bbb8e64f.js", - "version": "0.4.15", - "build": "commit.bbb8e64f", - "longVersion": "0.4.15+commit.bbb8e64f", - "keccak256": "0x9ffa9ee890ec483580c0b4ed72270b16e92eb0b7a8a97fb00c257f8809aa4023", - "sha256": "0x3e64525797e0b2d9abaeb022688cc02d63fc5820327e382fc6574a7de650dc97", - "urls": [ - "bzzr://395f2d903c162ddc9b6ebd76db450ca6cb9cf8bb276c3d705aa462ae560d23ab", - "dweb:/ipfs/QmW2rPbEtiVAbWJxtizzDqTjwpRpXCxkpSR696g9GxAYKT" - ] - }, - { - "path": "soljson-v0.4.16+commit.d7661dd9.js", - "version": "0.4.16", - "build": "commit.d7661dd9", - "longVersion": "0.4.16+commit.d7661dd9", - "keccak256": "0xf0a6c32af3eaa2f8c6d9e6c8b90f3bac5e775c7f1c90a61c1e72b593fbb1528d", - "sha256": "0x0e6d842e941cd8b76280c59f28f6d020af1afdea8e4be9d9da677ac5dbe860c6", - "urls": [ - "bzzr://f44b067fda20d169321fd3616f68633fd7a4277b6340f42f74203f33dad4a472", - "dweb:/ipfs/QmSwumWbYwYe4xLcqpi38VNtw7xCgbNaUkRhiZro9EnqLt" - ] - }, - { - "path": "soljson-v0.4.17+commit.bdeb9e52.js", - "version": "0.4.17", - "build": "commit.bdeb9e52", - "longVersion": "0.4.17+commit.bdeb9e52", - "keccak256": "0xeb8c3c474b5fa792f9b1b2ac6be945c32f835ccdc059deb562da4e99a031eab9", - "sha256": "0x7fe677e8214d0486fa7164f797862fae0a0fefb7b72cf6ad8e728faa54f12b60", - "urls": [ - "bzzr://37026d0ee2865c52fff8f6311b67b94f96dbb52ce8af3f84c3a9aeb47b12bf47", - "dweb:/ipfs/QmbgEAtdmSoxH4cfRJXj7mVpKv9rT5Cq2YmXmAnjgsyqBC" - ] - }, - { - "path": "soljson-v0.4.18+commit.9cf6e910.js", - "version": "0.4.18", - "build": "commit.9cf6e910", - "longVersion": "0.4.18+commit.9cf6e910", - "keccak256": "0xf824e695e8e66079b4b6063622c7dd80ed056d29969c8c3babac4fb572f3dfec", - "sha256": "0x5bb50839ba5116bf31669f3de8dad72eaec298ba32a643be7d0dc2d1392c54d6", - "urls": [ - "bzzr://d847bc8f5d43cd348346c5bb253269de36f00810c2e189ca64a4becdb9e9312f", - "dweb:/ipfs/Qmf5RrLbWeMykvWJbCyyThCLQ9YVmU8uWagMdSp9nNzZMc" - ] - }, - { - "path": "soljson-v0.4.19+commit.c4cbbb05.js", - "version": "0.4.19", - "build": "commit.c4cbbb05", - "longVersion": "0.4.19+commit.c4cbbb05", - "keccak256": "0xa60eadfddbfda0daebb8a1b883b89d33b800cff7ce7e12458170ea17cd5ede58", - "sha256": "0x8c2a69fbab9bdf503538028c697e09e51a7e699323ae7100c375cb35c415a819", - "urls": [ - "bzzr://87e29a7298d49b8b52ed01d6146b05aa41c11a85d1b805dd48181ac2ed5e9b22", - "dweb:/ipfs/QmSZEQEGuVJ7hudg8FzfDMXKVtn5AVGKaxbhSSDXwpX73K" - ] - }, - { - "path": "soljson-v0.4.20+commit.3155dd80.js", - "version": "0.4.20", - "build": "commit.3155dd80", - "longVersion": "0.4.20+commit.3155dd80", - "keccak256": "0x6c6dfa967526b7060634474ef730761711e5be662abf5ee02dc05985abfadec9", - "sha256": "0x9852ad94048600cc5a1458b4a7ab625996844c809b314422693bdc81d953fcc0", - "urls": [ - "bzzr://3edc1542fb719d3e08138b492a5db06333fb36055a434c3b071b2dcb69e54fbc", - "dweb:/ipfs/QmcsCpg6kfp7Vea4y9qPtfDXcaQJbDidb65n3t9f2MFDpR" - ] - }, - { - "path": "soljson-v0.4.21+commit.dfe3193c.js", - "version": "0.4.21", - "build": "commit.dfe3193c", - "longVersion": "0.4.21+commit.dfe3193c", - "keccak256": "0xd0f9a689670184ad874ca6a2cb40dfe57e9cf539d9330ca3f2501951478eace8", - "sha256": "0x4197bb1cb0ea7e637ed8a0e7810f1bfe32c90d0151d6f423bb3dfeef9f6777c4", - "urls": [ - "bzzr://1abbc4967f3c6c5124f8876abe521d508c71b0d0d64dc066c1e7a1bfe6ba596d", - "dweb:/ipfs/QmY7UN95hdfFSD1jwFANegze5eLX8PgP5BfWFH1usTB8Sw" - ] - }, - { - "path": "soljson-v0.4.22+commit.4cb486ee.js", - "version": "0.4.22", - "build": "commit.4cb486ee", - "longVersion": "0.4.22+commit.4cb486ee", - "keccak256": "0x50972c5b966188341d133aa58fbf895c54655d7bd733fb5ad58852e85f9f9444", - "sha256": "0x73458d16a3e34fc7b489d2399b3680cccfc968d01abc9f1b61e438b6fb0c24a1", - "urls": [ - "bzzr://9eab5a9c94bde3d90eb76a1189febd5ae4d6c7bbc63cc1d76e8871e14e6e9b89", - "dweb:/ipfs/QmPUJNa1LYaThwLQsw6fF5DMYyDfEg57gmD5wCsazkLS8c" - ] - }, - { - "path": "soljson-v0.4.23+commit.124ca40d.js", - "version": "0.4.23", - "build": "commit.124ca40d", - "longVersion": "0.4.23+commit.124ca40d", - "keccak256": "0x74f927b4f520d8d31863996a100ebc7827f919c77f777f6d4d416c6e613a03c7", - "sha256": "0x98c350cc41f873af84a78d1e24cbc8449045ee54923af0a39440e4d84600dc50", - "urls": [ - "bzzr://a052dbfe589a766af66d85d4d797829241e867e0ead93fbf3d5e492c71b6434f", - "dweb:/ipfs/QmZbo5YkSbcenWrUDjiCvUZdQe4UrNBw9vtx9nbgcMdRAs" - ] - }, - { - "path": "soljson-v0.4.24+commit.e67f0147.js", - "version": "0.4.24", - "build": "commit.e67f0147", - "longVersion": "0.4.24+commit.e67f0147", - "keccak256": "0x4cc2bb4c8894ad4349a88f330ba74d7ea643030d3f68037d1c94c370b6a25dd7", - "sha256": "0xf83e8f7014ad6b8bc801dc3684c644e372673ed678425c35aea5d4b4fe37e922", - "urls": [ - "bzzr://2aae73578e361285488b6319e8e7b27e23b2736eeee3953cd65f1207cd849395", - "dweb:/ipfs/QmauztXLDUdwJitA4Uc9MQYCTttUcivR5foTZYgwt4aAeC" - ] - }, - { - "path": "soljson-v0.4.25+commit.59dbf8f1.js", - "version": "0.4.25", - "build": "commit.59dbf8f1", - "longVersion": "0.4.25+commit.59dbf8f1", - "keccak256": "0x92b9c5de10bd908527e9cfba3f04bbe637163b4a5313c5a69179ccddd5fa6685", - "sha256": "0x782a999d3e1227c86854e7e29954ee856c6ae684124b9facf09f4f1724dc4e85", - "urls": [ - "bzzr://fb1e9b951ce8abe575f8514bff6baa01417a988a399fab1dd27a252e7812d1bc", - "dweb:/ipfs/QmUtwmzqqCftcubfyGwAefLBQ8ffp8EFhW7HCEQfhaviFs" - ] - }, - { - "path": "soljson-v0.4.26+commit.4563c3fc.js", - "version": "0.4.26", - "build": "commit.4563c3fc", - "longVersion": "0.4.26+commit.4563c3fc", - "keccak256": "0xc9c60203789ef778b9104ae7a39e9090b3d1256b24983d49e40e7d1e3c3ed65d", - "sha256": "0x264d0d25e31cb32f4369f82ba3ad0b6a84a8a1975b10bd738123ddf947618840", - "urls": [ - "bzzr://335a6b94d26623dcaa4590ccd6d7529db1e153b65af3bf7def45fffaf9ee256a", - "dweb:/ipfs/QmRd1uRbHRvpybQk5TQ11zyqmG4wQqHnefgvYdJ14V5D8x" - ] - }, - { - "path": "soljson-v0.5.0+commit.1d4f565a.js", - "version": "0.5.0", - "build": "commit.1d4f565a", - "longVersion": "0.5.0+commit.1d4f565a", - "keccak256": "0x2921f518cf5a0627d96e07e8c3d2b5482dbbf14d7dc6bbb055481c46d98903f3", - "sha256": "0xaf811843add541705ff65f0c20fd864bd0387116544524fa1830cf67a14af6c4", - "urls": [ - "bzzr://31231abb33dc43d0478f03a4c8b15b161b172097c884307cf6cf64aeb83a6dc9", - "dweb:/ipfs/QmYLhaeGbq3tFdCUC2pvtA8QdGnCbA8kn24z3C741k5TUE" - ] - }, - { - "path": "soljson-v0.5.1+commit.c8a2cb62.js", - "version": "0.5.1", - "build": "commit.c8a2cb62", - "longVersion": "0.5.1+commit.c8a2cb62", - "keccak256": "0x1980cf8a81c6bd2b371bf7d9145c819a7fb2d72e9aa462aaff0c10b4eccd595c", - "sha256": "0x69cb1300b5f72eb128604507991d9ada97180d31afde7c59aa3fa3ae9ad5200d", - "urls": [ - "bzzr://7f35988e2c32ed2f3f1885fb81ace357b1555964d23085940980cacd29023da6", - "dweb:/ipfs/QmPfxPYsYysRR8HFkWr47FMQ8ardmfmtrmdYc2ogT9Gfp9" - ] - }, - { - "path": "soljson-v0.5.2+commit.1df8f40c.js", - "version": "0.5.2", - "build": "commit.1df8f40c", - "longVersion": "0.5.2+commit.1df8f40c", - "keccak256": "0x3efd0585a3c00a1a2c62e590e22a69aa981d1b5148af2ebdbe1610dff93cea78", - "sha256": "0xaff4ca62ac0b03cb4b9c50f8250e2e7307b5c75fefc9847f269bd05c20367148", - "urls": [ - "bzzr://e30e085b875fc291e5ee46ed7c88c28ec8e8c540ad8c799b106c365a52df9e97", - "dweb:/ipfs/QmaZrQSg8njYzFXH2PzwxHDLKxkBhKmYmLm43DJWnurPeJ" - ] - }, - { - "path": "soljson-v0.5.3+commit.10d17f24.js", - "version": "0.5.3", - "build": "commit.10d17f24", - "longVersion": "0.5.3+commit.10d17f24", - "keccak256": "0x9b7a39606c3c27a8619b3eb493efca512cbd26c5ab7fc95489564239aab32a50", - "sha256": "0x24b4cbc28d68bde8455c14a46b55e4f292c3c295271e09991b2176a487cb4487", - "urls": [ - "bzzr://3bccb9b8cee48b99b39f2f1296f7353bcd39c1ae61b1e19e5add7cedd0256cb2", - "dweb:/ipfs/QmQmkd5FGiKKg8eRmo3L7Cn62nuV1M6GRDUGiq5bAx4AWx" - ] - }, - { - "path": "soljson-v0.5.4+commit.9549d8ff.js", - "version": "0.5.4", - "build": "commit.9549d8ff", - "longVersion": "0.5.4+commit.9549d8ff", - "keccak256": "0x4a6244b03de1968f0a48800e75640921d62b7602d0301093e1c5c318d1effb36", - "sha256": "0x91ed0cf4390f33174a4aaf49d1ce7cd9c72e28b95d2f9422314a29b2144b2042", - "urls": [ - "bzzr://a5ab50564d82e6d55b462f4f85284d3fac294c78f2699b680544bc7efde2fb16", - "dweb:/ipfs/QmRPchg1b5ofkLnLTPuunfSMKnxbXcZyzSR4NkyJAYUTrR" - ] - }, - { - "path": "soljson-v0.5.5+commit.47a71e8f.js", - "version": "0.5.5", - "build": "commit.47a71e8f", - "longVersion": "0.5.5+commit.47a71e8f", - "keccak256": "0xf46cb35b3aefb9b3d59a1fb4c151eb23a0f0a05387b379b3e7fbed1c01c861df", - "sha256": "0xaf812445476c101ae5ef92941c79eaebf57b39d455bdfb54a6a86b4ab6ca498c", - "urls": [ - "bzzr://2e72b599d5a700cbd03d9f7ca082464b4823dbaabfc5e1031075b9631c005d35", - "dweb:/ipfs/QmPYEmgLWDjk7kPGovojurz7fzdGv8Ti3H66nEzRzdiGwh" - ] - }, - { - "path": "soljson-v0.5.6+commit.b259423e.js", - "version": "0.5.6", - "build": "commit.b259423e", - "longVersion": "0.5.6+commit.b259423e", - "keccak256": "0x66669372d2d958bfeb5129a387dbc3882a96e260fc12e2910a7eb148b8ea5dd6", - "sha256": "0x9ffc04d0aee2c817ae6a897b1ba5aaca2bcd860416aaddfaa4de553fc1ad6e8e", - "urls": [ - "bzzr://5f5dbf4ebe3be5dbe3e917a2de3908b3a9ed24207a6406a6e434e6f041e993c4", - "dweb:/ipfs/QmYWL8Z3yXfCuhrprimdLhYFkjR74TjFHULxcABbUipetv" - ] - }, - { - "path": "soljson-v0.5.7+commit.6da8b019.js", - "version": "0.5.7", - "build": "commit.6da8b019", - "longVersion": "0.5.7+commit.6da8b019", - "keccak256": "0x27e324f75dd52eb180569e7a8865048253e5fcdaacc52e7c998ecaeb78dcdabd", - "sha256": "0xfd7c4e652d5891c84d93b28c90b8ac58c9253d2a3677935883a337ee96087b8f", - "urls": [ - "bzzr://764a91ca290bfa564d890f3c1a5a88067b04e96398f223576cbdd17bbc1faee2", - "dweb:/ipfs/QmdEr1zJrD2UYawZzeE6zPuYiYaSHdpLtKeHYixHgRp9ko" - ] - }, - { - "path": "soljson-v0.5.8+commit.23d335f2.js", - "version": "0.5.8", - "build": "commit.23d335f2", - "longVersion": "0.5.8+commit.23d335f2", - "keccak256": "0x05c00863784c63220704197d8446ac1e277fe53c42b5264093960b7bb70b9792", - "sha256": "0x25cfdd733e9c780ab85373268fde7bfa2e4b22093af57422ca3b586c7af7cd60", - "urls": [ - "bzzr://18fc5b15154aef1640559c31bbd91ae267def62a2b86e434564184b6d3d283ce", - "dweb:/ipfs/QmSUakgiWEffZ82RrN7hgLaemdqtLSCD7pfGAKxGhDUJxB" - ] - }, - { - "path": "soljson-v0.5.9+commit.e560f70d.js", - "version": "0.5.9", - "build": "commit.e560f70d", - "longVersion": "0.5.9+commit.e560f70d", - "keccak256": "0x7c967d9dc0fdca0db88a7cee22cf5886f65e8fa8b4a145eccd910fc81a1c949d", - "sha256": "0x7d40c6325c0aa4635babdb8913626b7c4bac6a4f41e1c383de5f398e1fc98e1b", - "urls": [ - "bzzr://c1f03890d82592751d779ea2da8a690e15b0ccc5667314bf634c1f16ff4ed322", - "dweb:/ipfs/QmZcHLPfa2Dz8M3justKYyDmDnaNo4pseTgAeQbtJNYywe" - ] - }, - { - "path": "soljson-v0.5.10+commit.5a6ea5b1.js", - "version": "0.5.10", - "build": "commit.5a6ea5b1", - "longVersion": "0.5.10+commit.5a6ea5b1", - "keccak256": "0x012ae146ebdd510b31c1e44a8d60071a66cdebc77f0e743a6ebc2fe68e67d297", - "sha256": "0x566601442deff058d393359df59ed72b41e1f6a65b0aa371fab7f903c189b59d", - "urls": [ - "bzzr://47c24a09321abb781b5dbc05fffae84ece6844e41a295847dd68ad69633f60a4", - "dweb:/ipfs/Qmej9jEnSsD2LqGnL4jgbUvHTxTwiFiHqeMpqyuPLaX1uw" - ] - }, - { - "path": "soljson-v0.5.11+commit.c082d0b4.js", - "version": "0.5.11", - "build": "commit.c082d0b4", - "longVersion": "0.5.11+commit.c082d0b4", - "keccak256": "0x4ba5500559a9ad03e4c1d3866ba9d915cdb5d7f2e326b4cb1fa0fe7bdf90dc27", - "sha256": "0x89978dcef86244b8e7af95298abe26aaf4825df819d6c556e4323dc152c988ad", - "urls": [ - "bzzr://c609e5725e607a4d853f33c8d46064e0ab11b489f7a585134cfca570e29f447a", - "dweb:/ipfs/QmdgDj3bPSKU1xKMY8FRHj8E6z9BQefeuaVuF27RpvZMXJ" - ] - }, - { - "path": "soljson-v0.5.12+commit.7709ece9.js", - "version": "0.5.12", - "build": "commit.7709ece9", - "longVersion": "0.5.12+commit.7709ece9", - "keccak256": "0xcda83fe69ce2a319d0caa20c98b53ff36ea1886054ab3dab23fa80ede3dcdea0", - "sha256": "0x1784f89fcfffccddaa94273a58e452682f61dea05d142406775f099c6ef5d61f", - "urls": [ - "bzzr://5eacd00f2f132ea8fbb308baed9753579ade721a44e94067debb602e193b7ae2", - "dweb:/ipfs/QmPA1Uf4iwkr2ouguzxxFepVxaRg36XFXxiwqYUuwafQzQ" - ] - }, - { - "path": "soljson-v0.5.13+commit.5b0b510c.js", - "version": "0.5.13", - "build": "commit.5b0b510c", - "longVersion": "0.5.13+commit.5b0b510c", - "keccak256": "0x432dd5d662d88c2316b4df503f693ae9e6e8ed4216726db2fdb3e7f628523fe5", - "sha256": "0x6e095eefc48dfc21fec18d0b63f229e929f881b5d6e8a999e1622c6b707a7f54", - "urls": [ - "bzzr://1b3ef14eabfe47ff614c088337dfdf163c695612c193aeab9ac5a2af69d30334", - "dweb:/ipfs/QmSgJ8Ru6vraz9CyCDPMifVxpckkoooVSBj9vYcQqG4wG4" - ] - }, - { - "path": "soljson-v0.5.14+commit.01f1aaa4.js", - "version": "0.5.14", - "build": "commit.01f1aaa4", - "longVersion": "0.5.14+commit.01f1aaa4", - "keccak256": "0x98e1027fbf3acb279f740c3b38df69d79ad3f2e6171414508d50604dc2dfc13e", - "sha256": "0x43b85bc9941814b018065da5c6c8d40e2af49264d0d1f06bdefbfbe628e65ff8", - "urls": [ - "bzzr://b6283a40a65b321a0e88f61594fc8bed00fb21a53c7ac1bf5ae421706a372d01", - "dweb:/ipfs/QmeXatGB9MdWA2NBLSNQbcKvuZpa4Sxem51vCrqyQGfXnU" - ] - }, - { - "path": "soljson-v0.5.15+commit.6a57276f.js", - "version": "0.5.15", - "build": "commit.6a57276f", - "longVersion": "0.5.15+commit.6a57276f", - "keccak256": "0x6f9251f86fd798a3ae25688307ffc7a9984dcf0d809a1aef54f5c68b6cf9fb6a", - "sha256": "0x0d34e4ed048bbf67daacdf36cd5ce0f553a32962967b52edab6afccaa071878b", - "urls": [ - "bzzr://e866e6bdb31fea0646b44a8e57acc9505932ffe813028ce1330ca49fe3edc4d0", - "dweb:/ipfs/Qmdx3AHUB8bN6ZZs1XsTV3Gz9FV3gAB7x7JbYeUsn43Azu" - ] - }, - { - "path": "soljson-v0.5.16+commit.9c3226ce.js", - "version": "0.5.16", - "build": "commit.9c3226ce", - "longVersion": "0.5.16+commit.9c3226ce", - "keccak256": "0x6abf17bdb1b934d072739e0e083ecfd579c523d200d45184b8d3987924ca0454", - "sha256": "0xa09c9cc2672678d461dc71100600bb58802db87be4de9424769241712ccbec03", - "urls": [ - "bzzr://9b51780766b138ee36e2796cee7bdd4cb494da5d925c36cc6101202818d37e42", - "dweb:/ipfs/QmQjodGav6KhMDjuoyJ1ag8osgKLBsFC1E9LmaGP7qCRZ2" - ] - }, - { - "path": "soljson-v0.5.17+commit.d19bba13.js", - "version": "0.5.17", - "build": "commit.d19bba13", - "longVersion": "0.5.17+commit.d19bba13", - "keccak256": "0x936e6bfbf4ea9ac32997adb893b0aeecd050cfef8b475f297dca1add0a1ff934", - "sha256": "0x7fd1d3f1fddc615e117f7fb7586acabd60c649c390cf110c8fdc5ce159fa5734", - "urls": [ - "bzzr://949bfec63a83091f5d08d6d8df36fa34e674d75206e8a6476cc0ae18f3c57bb4", - "dweb:/ipfs/QmNrRJwVHaJSZ3aAQZWZKjV9o8BqWKFP3RPYL6hKU65PAE" - ] - }, - { - "path": "soljson-v0.6.0+commit.26b70077.js", - "version": "0.6.0", - "build": "commit.26b70077", - "longVersion": "0.6.0+commit.26b70077", - "keccak256": "0xea559c55bf7046cb48378fe9b43eaab6e345700aa22d701fcf946a42ec6b1008", - "sha256": "0xf22c63511a85230f7640ff5a77433db643d8d32be8b7c7f1dc24c1301a5158e9", - "urls": [ - "bzzr://471b0435c47963835dd0f70d67ec069fab5daadbe6c8bf760d2e50adfb839461", - "dweb:/ipfs/QmTQPQb6br2VEzKTiXBEE6z69xRXEk24xi2R2gn8EsvGD9" - ] - }, - { - "path": "soljson-v0.6.1+commit.e6f7d5a4.js", - "version": "0.6.1", - "build": "commit.e6f7d5a4", - "longVersion": "0.6.1+commit.e6f7d5a4", - "keccak256": "0xb2657b5ce7a9b405a65e4a88845a51216cd7371e8f84861eef9cb0cb20d78081", - "sha256": "0x3628fdefd6971ea9cc16acbf91e5f6d6cfb2079181784b47e4d24f4c5d92e4e4", - "urls": [ - "bzzr://7bc2dc95d81092991a4122b45aad03f9cc62bc98fa455f03fc9286445ef9de8e", - "dweb:/ipfs/QmYWAkYAJo59kc5dHWaLuQqEm7xusESdu5meDzjpxnyXKt" - ] - }, - { - "path": "soljson-v0.6.2+commit.bacdbe57.js", - "version": "0.6.2", - "build": "commit.bacdbe57", - "longVersion": "0.6.2+commit.bacdbe57", - "keccak256": "0x7dc96455c864b49abc7dd5f38ba6a47904709ad132ea36babbfce98d42e962e6", - "sha256": "0x25f564cbecc5bfe95d6d358e0e7543c31ece0ab1332c555ff323ca163711bd2b", - "urls": [ - "bzzr://f61230aa01565c8c24aa2ed50eec7dfd26195be35f5bbe4445c6a3efceaa4b7d", - "dweb:/ipfs/QmaLUM18c7ecA911ig5u2HY6fAu4AiUbhJpnZwwCMc9cWi" - ] - }, - { - "path": "soljson-v0.6.3+commit.8dda9521.js", - "version": "0.6.3", - "build": "commit.8dda9521", - "longVersion": "0.6.3+commit.8dda9521", - "keccak256": "0x39ae8b2f3ba05ed7d4a7c16f0a9f4f5118180a209379cfc9bdd2d4fb5d015dff", - "sha256": "0xf89514dedd8cfb3c4d351580ff80b8444acde702f8be0e5fad710fe6e906c687", - "urls": [ - "bzzr://1d6deff5623d883b8d0b3a3a5539e4604925ce4c1677defb86e0e37838ea70c5", - "dweb:/ipfs/Qmd9JfFpUXsUQrJad1u2QDuMxBMeVrcG8mrpfJVV9jiBXB" - ] - }, - { - "path": "soljson-v0.6.4+commit.1dca32f3.js", - "version": "0.6.4", - "build": "commit.1dca32f3", - "longVersion": "0.6.4+commit.1dca32f3", - "keccak256": "0x435820544c2598d4ffbfb6f11003364c883a0766c8ac2a03215dd73022b34679", - "sha256": "0xa4fd5bb021259cdde001b03dac0e66353a3b066b47eb2476acb58b2610a224ca", - "urls": [ - "bzzr://62ef2a9bf7dbb8fd596b7c6ca6848d9b1a6c8562d10239659f0a56ee27c110ce", - "dweb:/ipfs/QmTxzbPN4HwcK5YX7n3PNkb1BzKFiRwStsmBfgC9VwrtFt" - ] - }, - { - "path": "soljson-v0.6.5+commit.f956cc89.js", - "version": "0.6.5", - "build": "commit.f956cc89", - "longVersion": "0.6.5+commit.f956cc89", - "keccak256": "0x6262768243c1ceaf91418e52dc6f52d2ce94d19c6e1065d54499b7bc4d6e14dc", - "sha256": "0xf8f83757e73f33f44389d1fa72d013fb266454a8dd9bb6897c7776f8fc3b0231", - "urls": [ - "bzzr://ed91c1114615572c10a34f0ab28a3a159d2d433fabbcec9eae7253c25ecac8b4", - "dweb:/ipfs/QmRUoBQeA5zpun1NK7BvBhQk6pTT4uZw7Jn2wZnWQETH9W" - ] - }, - { - "path": "soljson-v0.6.6+commit.6c089d02.js", - "version": "0.6.6", - "build": "commit.6c089d02", - "longVersion": "0.6.6+commit.6c089d02", - "keccak256": "0x3c9cfccc78bf352f4c7901d7af76757bd228f93af2634af4cd16b4916c13e44e", - "sha256": "0x09f6098026622c5c334c7798c3ad2b8f7c0ebc62f87846c7d5e7e725c3d1cbc2", - "urls": [ - "bzzr://ab23bd0e01952ee485f0426c9c4e47fcf6a508bc4919e83be31c0f9ea6e396ca", - "dweb:/ipfs/QmRj2pxXxvmJ96i57maVjLMfs4DUtCuptM8vSVvvDweJ74" - ] - }, - { - "path": "soljson-v0.6.7+commit.b8d736ae.js", - "version": "0.6.7", - "build": "commit.b8d736ae", - "longVersion": "0.6.7+commit.b8d736ae", - "keccak256": "0xb463b6a61fc027247655a32cbfd50bf543eafa3a6b42ceacdda7293e3ada8866", - "sha256": "0xb795f1b20f065a0aee492c24071fc1efa1633c3caab77cff20278a9ae822f04e", - "urls": [ - "bzzr://c82fea785ae31fb4847f5640e6305edc05d1a5b0b47552f60325c25cce280f75", - "dweb:/ipfs/QmShUrNZf1dZFjziorJYE8fMGNUSMFsbaR3ipSvsCMvExM" - ] - }, - { - "path": "soljson-v0.6.8+commit.0bbfe453.js", - "version": "0.6.8", - "build": "commit.0bbfe453", - "longVersion": "0.6.8+commit.0bbfe453", - "keccak256": "0x537cefc0579dd9631ec952cae951b3df0a50a3e557b5638107a67275f7aacc07", - "sha256": "0x3e8b01cbd194e40971b41017ada7c8b2fa941b0458cb701bdfb6a82257ca971b", - "urls": [ - "bzzr://130bff47eed9546c6a4d019c6281896186cf2368b766b16bc49b3d489b6cdb92", - "dweb:/ipfs/Qmdq9AfwdmKfEGP8u7H9E4VYrKLVinRZPZD1EWRnXSn1oe" - ] - }, - { - "path": "soljson-v0.6.9+commit.3e3065ac.js", - "version": "0.6.9", - "build": "commit.3e3065ac", - "longVersion": "0.6.9+commit.3e3065ac", - "keccak256": "0xa2d4d3ebe5d52bfa7ddf1a1fcd9bfed81eaa8678e6a1dd5a1c84954dd064422c", - "sha256": "0xf1724fd46b7a353561b3f8d473b0dc8c855b6d84b5af559d7e3326ac79b9d758", - "urls": [ - "bzzr://2c5fff6b816edb78adb2220f175591c9f4f6d38cfd27a83afb1849191cf9a524", - "dweb:/ipfs/Qmad6iesaR5FQ45RRtMrt2Fa1EYDuq1oGoMJJB6beMHESn" - ] - }, - { - "path": "soljson-v0.6.10+commit.00c0fcaf.js", - "version": "0.6.10", - "build": "commit.00c0fcaf", - "longVersion": "0.6.10+commit.00c0fcaf", - "keccak256": "0x620163da7ee7b2622c9ee48b06110a52739f633189555148a3b5ecf767e60cfb", - "sha256": "0xfa27ce9d23bddaa76a4aefbafa48e48affde9a1ee7c8a5e8784cf8d4c390f655", - "urls": [ - "bzzr://823b4efe3ca2964d660348214fd1a44579e13e1e8ce69a81f447372a11d60316", - "dweb:/ipfs/QmUinsRZvs2zFNG6FMWy7ngTYUnZccXq7MRtgpj1dPfxu4" - ] - }, - { - "path": "soljson-v0.6.11+commit.5ef660b1.js", - "version": "0.6.11", - "build": "commit.5ef660b1", - "longVersion": "0.6.11+commit.5ef660b1", - "keccak256": "0xf0abd02c495a0b4c5c9a7ff20de8b932e11fc3066d0b754422035ecd96fcdbbc", - "sha256": "0x9778e4a7667d5fd7632caf3ef3791d390a7cc217f94f96e919a31e3be332386a", - "urls": [ - "bzzr://9f9244a3605543a67f5ff35f21e3d6d3331a6e1361f09b271c37f396b5b89bd5", - "dweb:/ipfs/QmXyjgFNMyFD4fdf8wt9uvUU92MGdDVGmcPdMZhNEo1g8N" - ] - }, - { - "path": "soljson-v0.6.12+commit.27d51765.js", - "version": "0.6.12", - "build": "commit.27d51765", - "longVersion": "0.6.12+commit.27d51765", - "keccak256": "0xe1412d909a0dae79b13c0066b9bf08831c522daec00b273bbc19a799af213d6a", - "sha256": "0x3e1956c550ca48e289044c7c0bd892403081b4b5e17e77ce707c815ce6c4228f", - "urls": [ - "bzzr://b69ab6704a1e42fddb326e91f331e35fdf071b158e8754e2c887c0e607aee7b0", - "dweb:/ipfs/QmTs8PnAGr1ijXtWvMjoWraefAtVv2Y5ZnwkArz6NqJ93w" - ] - }, - { - "path": "soljson-v0.7.0+commit.9e61f92b.js", - "version": "0.7.0", - "build": "commit.9e61f92b", - "longVersion": "0.7.0+commit.9e61f92b", - "keccak256": "0x0c7a4386781683c327fde95363535f377941e14feffad5bb1134c7aa7eba726f", - "sha256": "0xe7e1be3d0a67469f6a37cd676a22314c4faa8a22ff9d5ebde11302db754453eb", - "urls": [ - "bzzr://65dc33e3d9ef94defff1b24e66f093d9d15a92c59778c8eb26e76fd8b64bd3da", - "dweb:/ipfs/QmQFhTptWdDzhemjGpa7Q65HKWGphs4nKKS13nzkcVE8pM" - ] - }, - { - "path": "soljson-v0.7.1+commit.f4a555be.js", - "version": "0.7.1", - "build": "commit.f4a555be", - "longVersion": "0.7.1+commit.f4a555be", - "keccak256": "0x3502cf7933fbce9f1fe1d87a83d5b9df12eee36c03997c3b9821493ce03fcf3e", - "sha256": "0x7fcc983c5149840a47b946fc51fc14f1c21cda07c01d650e4a1f814319cb1423", - "urls": [ - "bzzr://617dff84fd7dc06b476f93a95c015a561662d9ff1d3356ac6a3e5f5b09a636f0", - "dweb:/ipfs/Qmdw9c3usmqgdV2w4JoNWJqscHzscKNVWsWtos1engJa1o" - ] - }, - { - "path": "soljson-v0.7.2+commit.51b20bc0.js", - "version": "0.7.2", - "build": "commit.51b20bc0", - "longVersion": "0.7.2+commit.51b20bc0", - "keccak256": "0x0c80a0bf9e17700249a04a80d7729ccb012a55a82cb0f9e412fa32cc14b09c2b", - "sha256": "0xdfa3f2bb4589bdc9c054292173c82ee70e65af8d1971598f6e13b9b79ba94185", - "urls": [ - "bzzr://a45264806fb74fd38c19704070c83053972270b63bf7b09ddff3c3e15cd1baa0", - "dweb:/ipfs/QmTNWY4vkVLgtNdfGXyH6CY8URmzr33VzMJNN37z5dsAgu" - ] - }, - { - "path": "soljson-v0.7.3+commit.9bfce1f6.js", - "version": "0.7.3", - "build": "commit.9bfce1f6", - "longVersion": "0.7.3+commit.9bfce1f6", - "keccak256": "0xcf099e7057d6c3d5acac1f4e349798ad5a581b6cb7ffcebdf5b37b86eac4872d", - "sha256": "0xcaf4b1f3e01fcf946aad2d22bbe046b9dc4fd50049a05c3458ff239e2c93a785", - "urls": [ - "bzzr://2f8ec45d2d7298ab1fa49f3568ada6c6e030c7dd7f490a1505ed9d4713d86dc8", - "dweb:/ipfs/QmQMH2o7Nz3DaQ31hNYyHVAgejqTyZouvA35Zzzwe2UBPt" - ] - }, - { - "path": "soljson-v0.7.4+commit.3f05b770.js", - "version": "0.7.4", - "build": "commit.3f05b770", - "longVersion": "0.7.4+commit.3f05b770", - "keccak256": "0x300330ecd127756b824aa13e843cb1f43c473cb22eaf3750d5fb9c99279af8c3", - "sha256": "0x2b55ed5fec4d9625b6c7b3ab1abd2b7fb7dd2a9c68543bf0323db2c7e2d55af2", - "urls": [ - "bzzr://16c5f09109c793db99fe35f037c6092b061bd39260ee7a677c8a97f18c955ab1", - "dweb:/ipfs/QmTLs5MuLEWXQkths41HiACoXDiH8zxyqBHGFDRSzVE5CS" - ] - }, - { - "path": "soljson-v0.7.5+commit.eb77ed08.js", - "version": "0.7.5", - "build": "commit.eb77ed08", - "longVersion": "0.7.5+commit.eb77ed08", - "keccak256": "0xfe223dd264421f9b96c3dd3c835a3d0d4d9cfa4c61f75ca0761860c9ae8906ca", - "sha256": "0x2ee1c6434a32a40b137ac28be12ceeba64701bfad5e80239690803d9c139908e", - "urls": [ - "bzzr://d67cf500345ceca523e9bbe55dab9399e27321fd9005704a5b16bab82185260c", - "dweb:/ipfs/Qmf5fpJmeHdwgmSjQPqdu25XtA9akTotakkNmrh4axgo8N" - ] - }, - { - "path": "soljson-v0.7.6+commit.7338295f.js", - "version": "0.7.6", - "build": "commit.7338295f", - "longVersion": "0.7.6+commit.7338295f", - "keccak256": "0xc68517effed7163db0c7f4559931a4c5530fe6f2a8a20596361640d9d7eff655", - "sha256": "0xb94e69dfb056b3e26080f805ab43b668afbc0ac70bf124bfb7391ecfc0172ad2", - "urls": [ - "bzzr://523852f3e01b02ce947771e0279ffb6154d12700f809ba3606d908ba6271431c", - "dweb:/ipfs/QmWjG6PLzF5M6kxkHujhEMg5znQCgf2m1cM1UptKA719Hy" - ] - }, - { - "path": "soljson-v0.8.0+commit.c7dfd78e.js", - "version": "0.8.0", - "build": "commit.c7dfd78e", - "longVersion": "0.8.0+commit.c7dfd78e", - "keccak256": "0x08dd57a5cf5fd59accbd5b601909ffa22d28da756b5367c29b523ff17bbc2f99", - "sha256": "0xc596765f9b3dce486cf596ea35676f37124d54f3ada0fcbc02f094c392066a59", - "urls": [ - "bzzr://7047ade6879aab4c825594dab0914b8ec673bb907eecc6dfbd68f63086e5a36e", - "dweb:/ipfs/QmYh5C2rgDAx452f7HyHA8soLhnoL1GeeNNEWEuw9jKY8w" - ] - }, - { - "path": "soljson-v0.8.1+commit.df193b15.js", - "version": "0.8.1", - "build": "commit.df193b15", - "longVersion": "0.8.1+commit.df193b15", - "keccak256": "0x84a0e9282047512eeec499d55c83dbb6981430b08692d81d6c09730bb18e6cd8", - "sha256": "0xf77f141e5fed9594b28342e2c630ac6d48f2a724e4383a457881acd7fa62b1cf", - "urls": [ - "bzzr://da8c5ea3f2ecd33d3f83ac2c276871f4ee41370fb55ae62c6c29835c9376bdec", - "dweb:/ipfs/QmQ6W5VedQpZAwuGTtp1BhmNkvVheLnJq4xwN9Qmt9bAbH" - ] - }, - { - "path": "soljson-v0.8.2+commit.661d1103.js", - "version": "0.8.2", - "build": "commit.661d1103", - "longVersion": "0.8.2+commit.661d1103", - "keccak256": "0xd0c15275c5b0d03871332719def9b0f17e8860c7db60e0e71f18b971458a7391", - "sha256": "0x015e83fb0b72ccdafb0c217961b21a0321adb2d3f2ad992f5e79635c2086e6dd", - "urls": [ - "bzzr://629ae5ad84c45c248144b5eec7827a9cd5b2f2779ef84ab251c8cd876347a098", - "dweb:/ipfs/QmdfVfa2mhyosaJVeV7rbfnvQ95GTHPeRPzmvxcds7RYej" - ] - }, - { - "path": "soljson-v0.8.3+commit.8d00100c.js", - "version": "0.8.3", - "build": "commit.8d00100c", - "longVersion": "0.8.3+commit.8d00100c", - "keccak256": "0x51777116af58223a41aa3016d0bf733bbb0f78ad9ba4bcc36487eba175f65015", - "sha256": "0xb5cedfa8de5f9421fbdaccf9fd5038652c2632344b3b68e5278de81e9aeac210", - "urls": [ - "bzzr://c7d43da1bc5529d2cc311e00579c36dcff258c42b8ed240b6c4e97bd85492a64", - "dweb:/ipfs/QmWbNMzJryhiZmyifLDQteGPwN4aTgXQB6barBvXYVw975" - ] - }, - { - "path": "soljson-v0.8.4+commit.c7e474f2.js", - "version": "0.8.4", - "build": "commit.c7e474f2", - "longVersion": "0.8.4+commit.c7e474f2", - "keccak256": "0x7e0bca960d11fb095798ff65d029436f23358ac060b25a0938acfcb4652da2ec", - "sha256": "0x4a14c7bcaf0d988a829db2174b8f7731898aa8633216490603ad74bff64eca3c", - "urls": [ - "bzzr://7f33fe204160253c7ec23cb0ac83224bde3aca9f91a7a686cb67d99248c5fbb6", - "dweb:/ipfs/QmPYDf4qYtZLNEAicW7hcvpUJ69FoHiXmUypipDpTKo9hU" - ] - }, - { - "path": "soljson-v0.8.5+commit.a4f2e591.js", - "version": "0.8.5", - "build": "commit.a4f2e591", - "longVersion": "0.8.5+commit.a4f2e591", - "keccak256": "0x6d6d75b033717aae0a728e527005d8d2cc7dbd0a835c8873c630a2a9689a2976", - "sha256": "0x4af595f976235d33a22ffe223e9e3210b4ca510f6a93f153b3daed60f2b11fbc", - "urls": [ - "bzzr://d501ee8c460db75379b5716bcb5ae10e3e32625d6c9b08e319822a110f178906", - "dweb:/ipfs/QmNWkyirqXy3gDHNXpPuVUbExMGWjMqPR82Xzs64RzgQzy" - ] - }, - { - "path": "soljson-v0.8.6+commit.11564f7e.js", - "version": "0.8.6", - "build": "commit.11564f7e", - "longVersion": "0.8.6+commit.11564f7e", - "keccak256": "0x070e41c7f761ff1a8383a2c0d54c22aab0f115ca8c3790ecea27d6dde11611ca", - "sha256": "0x06a671efd8865a6ecc0ad648076177b35abcd06a7059888ea65111272e33a57f", - "urls": [ - "bzzr://e4f8176cdb3a0f3ba0b7061079dd9d3495f6a2288bd724780337cacd96515148", - "dweb:/ipfs/QmQre11ZPgWSx79Jzca1tkTYFyMbXz8H4kcrhfpWSj4qs8" - ] - }, - { - "path": "soljson-v0.8.7+commit.e28d00a7.js", - "version": "0.8.7", - "build": "commit.e28d00a7", - "longVersion": "0.8.7+commit.e28d00a7", - "keccak256": "0x8d6be9e58c33d265b5a8b1132a27fce126067419f3f4f15d3ef6b7147593b61d", - "sha256": "0x663ba99f7c7ee907f0f03227502d48a78256c3c292ace3b79a5d3eb510665306", - "urls": [ - "bzzr://0bdbad1bdcc3a9775f16f20a35556be4baa0e6c9a9b9d820e8e2cdea80667c6a", - "dweb:/ipfs/QmYv3Rsi9pL6PZAtc4XLHezPqti8yCRGEdDBqzEsQv57GV" - ] - }, - { - "path": "soljson-v0.8.8+commit.dddeac2f.js", - "version": "0.8.8", - "build": "commit.dddeac2f", - "longVersion": "0.8.8+commit.dddeac2f", - "keccak256": "0x56cb2f6978bf1213982ef217ee76b39dc97b6e66c92a7be7a1b44079c0236e5c", - "sha256": "0x534b7d4079d13bb4cd10b7559dc105c2adec625df4105f20ebce47e6da60bfda", - "urls": [ - "bzzr://7543aa16521848b06a1359afcb9dbd7be1dd09a36f4ca53edd3ed3a512a475e9", - "dweb:/ipfs/QmZaSrn3TPvPVoShtjSonQLFd3BV6RdgRMqw8GTzhnKYpm" - ] - }, - { - "path": "soljson-v0.8.9+commit.e5eed63a.js", - "version": "0.8.9", - "build": "commit.e5eed63a", - "longVersion": "0.8.9+commit.e5eed63a", - "keccak256": "0xbc470ab3442e78bb4d3f16c01c39b2f160f4f34eb4373efed11c234e1c7f6ca0", - "sha256": "0x5b25f987aae32a0275fdc6c1be36cc47cf126024a04dafd8e4be39a1d1d1422c", - "urls": [ - "bzzr://83bf64f11a09845a6eb732da08283a58f877e9227190f489c9852f790c81d0c4", - "dweb:/ipfs/QmfFq3MvisCSUJy8N8EVsBribgPbdpTZb7tQ2eHYw7dwag" - ] - }, - { - "path": "soljson-v0.8.10+commit.fc410830.js", - "version": "0.8.10", - "build": "commit.fc410830", - "longVersion": "0.8.10+commit.fc410830", - "keccak256": "0x3820aae0de50f10f62819d65f0b5a236ccffed11ab465a3295a5408fa47e24f5", - "sha256": "0x5eaee3240a06891abf5ac70c75caf9a0c33ebe9a2736abdaa22a337f86c22933", - "urls": [ - "bzzr://5124a21890d6b0ae70bfd031f741d7edc74cff70a26ca74750d446b15a8efb06", - "dweb:/ipfs/QmcsfYpEWbPXfVptzi1YvGokxi2FYCUzUr8rQYJCc5fEiB" - ] - }, - { - "path": "soljson-v0.8.11+commit.d7f03943.js", - "version": "0.8.11", - "build": "commit.d7f03943", - "longVersion": "0.8.11+commit.d7f03943", - "keccak256": "0x798b23086ce1339e3d47b3648a1f3ae40561e2c9f66ffcc98e71fc14a7f77584", - "sha256": "0x64117d4b13bfc5bc6e5f80823519b140e753a0c09e99edd756772dc3029bc1f8", - "urls": [ - "bzzr://0fd1c8db6338b2143ab0e49a33edaa133108ba77f1238408018b5b2a0ecdeb62", - "dweb:/ipfs/QmNQTFQmfnjxnDmbguVSnZ5DiHGFQHCsffccW5c2DMcSsT" - ] - }, - { - "path": "soljson-v0.8.12+commit.f00d7308.js", - "version": "0.8.12", - "build": "commit.f00d7308", - "longVersion": "0.8.12+commit.f00d7308", - "keccak256": "0xdd4ae95607655404b769fab5f949ac95c6a1a506330f512aef0d92974c390431", - "sha256": "0xc2c4738c96ad329cbb9baea615ed50ffb5a53d93fed8e00785e47242581d3c60", - "urls": [ - "bzzr://38f396377d5a5a60d0b9d8c4dc1343485517ff31bcd281d531f98534dc79d811", - "dweb:/ipfs/QmVdW2ygaT2vecoSUog3HUn8hZqXU4XXQZvuRSdpV6DJPL" - ] - }, - { - "path": "soljson-v0.8.13+commit.abaa5c0e.js", - "version": "0.8.13", - "build": "commit.abaa5c0e", - "longVersion": "0.8.13+commit.abaa5c0e", - "keccak256": "0x9afa714859d1c8f8ed2fded497b83a7a420474282494d25d4c9f592667729f21", - "sha256": "0x387343bcf8f2b77fe4cdcddcaa84361fabf8e1c3508f874fbbcbb9c313542f56", - "urls": [ - "bzzr://ade0fd040981c4e8c7adfe366296e452687c7bb6421de8546a0678be4add016a", - "dweb:/ipfs/Qma9V9dJwmkim98H6DQX4f7RH395vsUuqHCDxbKetcbj18" - ] - }, - { - "path": "soljson-v0.8.14+commit.80d49f37.js", - "version": "0.8.14", - "build": "commit.80d49f37", - "longVersion": "0.8.14+commit.80d49f37", - "keccak256": "0xb0f7f19a8590e5c0aaf779019c1deaafed170d8c26bec9bfd782d212e097619e", - "sha256": "0x7c3b3d0066fd381283b1d8d9a86153b2ddb5c01da14a1ae015c05cfa484e81b6", - "urls": [ - "bzzr://fa438d41ed52c9e0cca556efee61486fc77e60df06081921abb0a0f19b602d35", - "dweb:/ipfs/QmcM1TcDB4ta8ttNLWZ4d24M4Qs35rc91sQkdNmJMNbuvV" - ] - }, - { - "path": "soljson-v0.8.15+commit.e14f2714.js", - "version": "0.8.15", - "build": "commit.e14f2714", - "longVersion": "0.8.15+commit.e14f2714", - "keccak256": "0x4f6cdc0f25e734bcb977bb6a3e22fa41d8a82cbd5f220a2e4238c2d233526d1a", - "sha256": "0x71135e459d691767ce3453bab4564ef4a640dd50182da36517cbc1f96c1d4c7c", - "urls": [ - "bzzr://ac5baefba32f4779a03d1207d9f1ed69365280c702fd73002a729b7a3d52c425", - "dweb:/ipfs/QmPiBrYZxxpNZPQ98GNyL7Xa1F9Dq7uHtdt9ESwhPNkHhc" - ] - }, - { - "path": "soljson-v0.8.16+commit.07a7930e.js", - "version": "0.8.16", - "build": "commit.07a7930e", - "longVersion": "0.8.16+commit.07a7930e", - "keccak256": "0x331f4bc6de3d44d87b68629e83f711105325b482da7e9ca9bdbdd01371fee438", - "sha256": "0x27b2820ef93805a65c76b7945a49432582d306fd17a28985709a51e6403677c2", - "urls": [ - "bzzr://af0d70945c85865298732ac2bfdacdf2774fb4daf793c94fafe135b839a60a5c", - "dweb:/ipfs/QmWzBJ8gdccvRSSB5YsMKiF2qt3RFmAP2X25QEWqqQnR4y" - ] - }, - { - "path": "soljson-v0.8.17+commit.8df45f5f.js", - "version": "0.8.17", - "build": "commit.8df45f5f", - "longVersion": "0.8.17+commit.8df45f5f", - "keccak256": "0x3f2be218cf4545b4d2e380417c6da1e008fdc4255ab38c9ee12f64c0e3f55ea9", - "sha256": "0x617828e63be485c7cc2dbcbdd5a22b582b40fafaa41016ad595637b83c90656c", - "urls": [ - "bzzr://fe8da5b2531d31e4b67acdce09c81eccba1100550a7222722152ffdb16ea85ef", - "dweb:/ipfs/QmTedx1wBKSUaLatuqXYngjfKQLD2cGqPKjdLYCnbMYwiz" - ] - }, - { - "path": "soljson-v0.8.18+commit.87f61d96.js", - "version": "0.8.18", - "build": "commit.87f61d96", - "longVersion": "0.8.18+commit.87f61d96", - "keccak256": "0x9a8fa4183ef95496045189b80dfb39f745db89a903b398e40131f500953e5d57", - "sha256": "0xd82bdcba2c386d60b33aca148a9cfdf097551f68c5e45d8ec01aebbafacf5075", - "urls": [ - "bzzr://338117c2130fcb6bce3006330712b6e7ee99875b56ce4bb6182312f76e4a6bac", - "dweb:/ipfs/QmcKzrqRBy7PeFQxzJDs1AZZzNHKaKbJces6zUDysXZofJ" - ] - }, - { - "path": "soljson-v0.8.19+commit.7dd6d404.js", - "version": "0.8.19", - "build": "commit.7dd6d404", - "longVersion": "0.8.19+commit.7dd6d404", - "keccak256": "0x6be35b86f5656c06ae897ef311c28da375bdcbded68c4a81e124f2cb36adf830", - "sha256": "0xe0b74e0a16e783a35169f74d1a615ecb48d07c30f97346b83cd587949268681e", - "urls": [ - "bzzr://434c17a0cc3bf371e5b9baa7f804b37ffd2dc141a98c59b2ba6021fc419a39c0", - "dweb:/ipfs/QmPnhNtzrEBeWWQMXdAByQTDPoKXXV9NFXLk3YL4QbghMP" - ] - }, - { - "path": "soljson-v0.8.20+commit.a1b79de6.js", - "version": "0.8.20", - "build": "commit.a1b79de6", - "longVersion": "0.8.20+commit.a1b79de6", - "keccak256": "0x3a420fa9963772eee5b9221ebb8cf9548eea8f88b09537390960ea9b440f333c", - "sha256": "0x5c509f760dc110a695c8b39bbc21e08c17dee431aa14d606f59e623d7c3cc657", - "urls": [ - "bzzr://fdc05062e4c7ec85ed18ab17b6f04f3274a4b7caf0be483eb86007d708825fb0", - "dweb:/ipfs/QmciAxUX2kfuoxitmMdkKSfWn2SfxQdieLRa3S5S2munot" - ] - }, - { - "path": "soljson-v0.8.21+commit.d9974bed.js", - "version": "0.8.21", - "build": "commit.d9974bed", - "longVersion": "0.8.21+commit.d9974bed", - "keccak256": "0x370efd28e2d28b6d0ba55e20d8994f3d286c3772552ed63586b5fe157c0d3c57", - "sha256": "0x45bea352b41d04039e19439962ddef1d3e10cf2bc9526feba39f2cc79e3c5a17", - "urls": [ - "bzzr://5e66947c220c91a6cd39bc22965dcf861015b8613a6e09aa7fb7dc10f367b5d7", - "dweb:/ipfs/QmXLgy6oexvCBWYS5pTpJWohsDNGqgdNFLRKX7JrE3NxYt" - ] - }, - { - "path": "soljson-v0.8.22+commit.4fc1097e.js", - "version": "0.8.22", - "build": "commit.4fc1097e", - "longVersion": "0.8.22+commit.4fc1097e", - "keccak256": "0x907eeba6e6e0d6977ac5a8f50e4dd2762539ca827ceab1afb1f5a4f0f3ce3e0c", - "sha256": "0x92d283c545395b91a656fa1ec94d567a464bca55aebcdbb99debf42b43026845", - "urls": [ - "bzzr://63ec828814e2b57db2a7a146061a96cc39797ba39a0063a7b664421a48f21c00", - "dweb:/ipfs/Qma6o4e57YtWj8cQLQs12r2Enx9qmRA7VHtupCauXjYTAk" - ] - }, - { - "path": "soljson-v0.8.23+commit.f704f362.js", - "version": "0.8.23", - "build": "commit.f704f362", - "longVersion": "0.8.23+commit.f704f362", - "keccak256": "0x743aaafac24d9740a0b71215f55a132f89336a662487944767ca4bfd66400769", - "sha256": "0x9c681b165c8647867589c0a5ecdc8692637a935928a2b1bbea2ff4a1f4976985", - "urls": [ - "bzzr://6e70fe6bfe8c3fc63f8a3eba733731aab129e6e58828b78058e53bb50440709b", - "dweb:/ipfs/QmZy5ho8W943FMGwppXZFS1WFrVwV3UXhUUwcD7oH5vrYe" - ] - } - ], - "releases": { - "0.8.23": "soljson-v0.8.23+commit.f704f362.js", - "0.8.22": "soljson-v0.8.22+commit.4fc1097e.js", - "0.8.21": "soljson-v0.8.21+commit.d9974bed.js", - "0.8.20": "soljson-v0.8.20+commit.a1b79de6.js", - "0.8.19": "soljson-v0.8.19+commit.7dd6d404.js", - "0.8.18": "soljson-v0.8.18+commit.87f61d96.js", - "0.8.17": "soljson-v0.8.17+commit.8df45f5f.js", - "0.8.16": "soljson-v0.8.16+commit.07a7930e.js", - "0.8.15": "soljson-v0.8.15+commit.e14f2714.js", - "0.8.14": "soljson-v0.8.14+commit.80d49f37.js", - "0.8.13": "soljson-v0.8.13+commit.abaa5c0e.js", - "0.8.12": "soljson-v0.8.12+commit.f00d7308.js", - "0.8.11": "soljson-v0.8.11+commit.d7f03943.js", - "0.8.10": "soljson-v0.8.10+commit.fc410830.js", - "0.8.9": "soljson-v0.8.9+commit.e5eed63a.js", - "0.8.8": "soljson-v0.8.8+commit.dddeac2f.js", - "0.8.7": "soljson-v0.8.7+commit.e28d00a7.js", - "0.8.6": "soljson-v0.8.6+commit.11564f7e.js", - "0.8.5": "soljson-v0.8.5+commit.a4f2e591.js", - "0.8.4": "soljson-v0.8.4+commit.c7e474f2.js", - "0.8.3": "soljson-v0.8.3+commit.8d00100c.js", - "0.8.2": "soljson-v0.8.2+commit.661d1103.js", - "0.8.1": "soljson-v0.8.1+commit.df193b15.js", - "0.8.0": "soljson-v0.8.0+commit.c7dfd78e.js", - "0.7.6": "soljson-v0.7.6+commit.7338295f.js", - "0.7.5": "soljson-v0.7.5+commit.eb77ed08.js", - "0.7.4": "soljson-v0.7.4+commit.3f05b770.js", - "0.7.3": "soljson-v0.7.3+commit.9bfce1f6.js", - "0.7.2": "soljson-v0.7.2+commit.51b20bc0.js", - "0.7.1": "soljson-v0.7.1+commit.f4a555be.js", - "0.7.0": "soljson-v0.7.0+commit.9e61f92b.js", - "0.6.12": "soljson-v0.6.12+commit.27d51765.js", - "0.6.11": "soljson-v0.6.11+commit.5ef660b1.js", - "0.6.10": "soljson-v0.6.10+commit.00c0fcaf.js", - "0.6.9": "soljson-v0.6.9+commit.3e3065ac.js", - "0.6.8": "soljson-v0.6.8+commit.0bbfe453.js", - "0.6.7": "soljson-v0.6.7+commit.b8d736ae.js", - "0.6.6": "soljson-v0.6.6+commit.6c089d02.js", - "0.6.5": "soljson-v0.6.5+commit.f956cc89.js", - "0.6.4": "soljson-v0.6.4+commit.1dca32f3.js", - "0.6.3": "soljson-v0.6.3+commit.8dda9521.js", - "0.6.2": "soljson-v0.6.2+commit.bacdbe57.js", - "0.6.1": "soljson-v0.6.1+commit.e6f7d5a4.js", - "0.6.0": "soljson-v0.6.0+commit.26b70077.js", - "0.5.17": "soljson-v0.5.17+commit.d19bba13.js", - "0.5.16": "soljson-v0.5.16+commit.9c3226ce.js", - "0.5.15": "soljson-v0.5.15+commit.6a57276f.js", - "0.5.14": "soljson-v0.5.14+commit.01f1aaa4.js", - "0.5.13": "soljson-v0.5.13+commit.5b0b510c.js", - "0.5.12": "soljson-v0.5.12+commit.7709ece9.js", - "0.5.11": "soljson-v0.5.11+commit.c082d0b4.js", - "0.5.10": "soljson-v0.5.10+commit.5a6ea5b1.js", - "0.5.9": "soljson-v0.5.9+commit.e560f70d.js", - "0.5.8": "soljson-v0.5.8+commit.23d335f2.js", - "0.5.7": "soljson-v0.5.7+commit.6da8b019.js", - "0.5.6": "soljson-v0.5.6+commit.b259423e.js", - "0.5.5": "soljson-v0.5.5+commit.47a71e8f.js", - "0.5.4": "soljson-v0.5.4+commit.9549d8ff.js", - "0.5.3": "soljson-v0.5.3+commit.10d17f24.js", - "0.5.2": "soljson-v0.5.2+commit.1df8f40c.js", - "0.5.1": "soljson-v0.5.1+commit.c8a2cb62.js", - "0.5.0": "soljson-v0.5.0+commit.1d4f565a.js", - "0.4.26": "soljson-v0.4.26+commit.4563c3fc.js", - "0.4.25": "soljson-v0.4.25+commit.59dbf8f1.js", - "0.4.24": "soljson-v0.4.24+commit.e67f0147.js", - "0.4.23": "soljson-v0.4.23+commit.124ca40d.js", - "0.4.22": "soljson-v0.4.22+commit.4cb486ee.js", - "0.4.21": "soljson-v0.4.21+commit.dfe3193c.js", - "0.4.20": "soljson-v0.4.20+commit.3155dd80.js", - "0.4.19": "soljson-v0.4.19+commit.c4cbbb05.js", - "0.4.18": "soljson-v0.4.18+commit.9cf6e910.js", - "0.4.17": "soljson-v0.4.17+commit.bdeb9e52.js", - "0.4.16": "soljson-v0.4.16+commit.d7661dd9.js", - "0.4.15": "soljson-v0.4.15+commit.bbb8e64f.js", - "0.4.14": "soljson-v0.4.14+commit.c2215d46.js", - "0.4.13": "soljson-v0.4.13+commit.0fb4cb1a.js", - "0.4.12": "soljson-v0.4.12+commit.194ff033.js", - "0.4.11": "soljson-v0.4.11+commit.68ef5810.js", - "0.4.10": "soljson-v0.4.10+commit.f0d539ae.js", - "0.4.9": "soljson-v0.4.9+commit.364da425.js", - "0.4.8": "soljson-v0.4.8+commit.60cc1668.js", - "0.4.7": "soljson-v0.4.7+commit.822622cf.js", - "0.4.6": "soljson-v0.4.6+commit.2dabbdf0.js", - "0.4.5": "soljson-v0.4.5+commit.b318366e.js", - "0.4.4": "soljson-v0.4.4+commit.4633f3de.js", - "0.4.3": "soljson-v0.4.3+commit.2353da71.js", - "0.4.2": "soljson-v0.4.2+commit.af6afb04.js", - "0.4.1": "soljson-v0.4.1+commit.4fc6fc2c.js", - "0.4.0": "soljson-v0.4.0+commit.acd334c9.js", - "0.3.6": "soljson-v0.3.6+commit.3fc68da5.js" - }, - "latestRelease": "0.8.23" -} \ No newline at end of file From 5a89256270562ae2fed816da523d42e43f26ded3 Mon Sep 17 00:00:00 2001 From: filip mertens Date: Sat, 11 Nov 2023 17:59:20 +0100 Subject: [PATCH 056/163] rm --- apps/remix-ide/src/app/files/dgitProvider.js | 9 --------- 1 file changed, 9 deletions(-) diff --git a/apps/remix-ide/src/app/files/dgitProvider.js b/apps/remix-ide/src/app/files/dgitProvider.js index 104a71ded1..18c9c20cd4 100644 --- a/apps/remix-ide/src/app/files/dgitProvider.js +++ b/apps/remix-ide/src/app/files/dgitProvider.js @@ -380,15 +380,6 @@ class DGitProvider extends Plugin { }) if(result && result.length) { this.call('terminal', 'logHtml', `Checking out submodule ${dir} to ${result[0]} in directory ${dir}`) - await git.fetch({ - ...await this.getGitConfig(dir), - ...await this.parseInput(input), - }) - const status = await git.log({ - ...await this.getGitConfig(dir), - ...cmd - }) - await git.checkout({ ...await this.getGitConfig(dir), ref: result[0] From 6f9dbf17fe7ba488154e0f4f6575269906f8bec0 Mon Sep 17 00:00:00 2001 From: filip mertens Date: Sat, 11 Nov 2023 18:00:23 +0100 Subject: [PATCH 057/163] cleanup --- apps/remix-ide/src/app/files/dgitProvider.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/apps/remix-ide/src/app/files/dgitProvider.js b/apps/remix-ide/src/app/files/dgitProvider.js index 18c9c20cd4..7d42f5f697 100644 --- a/apps/remix-ide/src/app/files/dgitProvider.js +++ b/apps/remix-ide/src/app/files/dgitProvider.js @@ -396,9 +396,7 @@ class DGitProvider extends Plugin { console.log(e) } } - for (let module of gitmodules) { - } setTimeout(async () => { await this.call('fileManager', 'refresh') }, 1000) From c068e017186f3c524cf2d9894c389ccbfc0396f7 Mon Sep 17 00:00:00 2001 From: filip mertens Date: Sat, 11 Nov 2023 18:01:34 +0100 Subject: [PATCH 058/163] rm --- apps/remix-ide/src/app/files/dgitProvider.js | 1 - 1 file changed, 1 deletion(-) diff --git a/apps/remix-ide/src/app/files/dgitProvider.js b/apps/remix-ide/src/app/files/dgitProvider.js index 7d42f5f697..1a592c1ee1 100644 --- a/apps/remix-ide/src/app/files/dgitProvider.js +++ b/apps/remix-ide/src/app/files/dgitProvider.js @@ -372,7 +372,6 @@ class DGitProvider extends Plugin { ...await this.getGitConfig(currentDir), trees: [git.TREE({ ref: commitHash })], map: async function (filepath, [A]) { - //console.log(filepath, await A.oid()) if(filepath === module.path) { return await A.oid() } From 7c536876ce51299ee427051c9627be41d8470a71 Mon Sep 17 00:00:00 2001 From: bunsenstraat Date: Tue, 14 Nov 2023 08:41:50 +0300 Subject: [PATCH 059/163] fix fetch --- apps/remix-ide/src/app/files/dgitProvider.js | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/apps/remix-ide/src/app/files/dgitProvider.js b/apps/remix-ide/src/app/files/dgitProvider.js index 1a592c1ee1..40c0cb1b6c 100644 --- a/apps/remix-ide/src/app/files/dgitProvider.js +++ b/apps/remix-ide/src/app/files/dgitProvider.js @@ -355,7 +355,7 @@ class DGitProvider extends Plugin { const cmd = { url: module.url, singleBranch: true, - depth: 5000, // this is needed because we need the history to find the commit hash + depth: 1, ...await this.parseInput(input), ...await this.getGitConfig(dir) } @@ -379,10 +379,19 @@ class DGitProvider extends Plugin { }) if(result && result.length) { this.call('terminal', 'logHtml', `Checking out submodule ${dir} to ${result[0]} in directory ${dir}`) + await git.fetch({ + ...await this.parseInput(input), + ...await this.getGitConfig(dir), + singleBranch: true, + ref: result[0] + }) + + await git.checkout({ ...await this.getGitConfig(dir), ref: result[0] }) + this.call('terminal', 'logHtml',`Checked out submodule ${dir} to ${result[0]}`) } From 825da193c4fda6a776978fc17a39f7fc72bfe82d Mon Sep 17 00:00:00 2001 From: bunsenstraat Date: Tue, 14 Nov 2023 08:52:36 +0300 Subject: [PATCH 060/163] check oid --- apps/remix-ide/src/app/files/dgitProvider.js | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/apps/remix-ide/src/app/files/dgitProvider.js b/apps/remix-ide/src/app/files/dgitProvider.js index 40c0cb1b6c..05be292244 100644 --- a/apps/remix-ide/src/app/files/dgitProvider.js +++ b/apps/remix-ide/src/app/files/dgitProvider.js @@ -386,13 +386,22 @@ class DGitProvider extends Plugin { ref: result[0] }) - await git.checkout({ ...await this.getGitConfig(dir), ref: result[0] }) - this.call('terminal', 'logHtml',`Checked out submodule ${dir} to ${result[0]}`) + const log = await git.log({ + ...await this.getGitConfig(dir), + }) + + if(log[0].oid !== result[0]) { + this.call('terminal', 'log', { + type: 'error', + value: `Could not checkout submodule to ${result[0]}` + })} else { + this.call('terminal', 'logHtml',`Checked out submodule ${dir} to ${result[0]}`) + } } await this.updateSubmodules({ From 0f26d8d24d8e10ca5dda0c83cd70ffef178d441f Mon Sep 17 00:00:00 2001 From: yann300 Date: Tue, 14 Nov 2023 07:48:26 +0100 Subject: [PATCH 061/163] fix linting --- apps/remix-ide/src/app/files/dgitProvider.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/remix-ide/src/app/files/dgitProvider.js b/apps/remix-ide/src/app/files/dgitProvider.js index 05be292244..6738c52ddf 100644 --- a/apps/remix-ide/src/app/files/dgitProvider.js +++ b/apps/remix-ide/src/app/files/dgitProvider.js @@ -399,7 +399,7 @@ class DGitProvider extends Plugin { this.call('terminal', 'log', { type: 'error', value: `Could not checkout submodule to ${result[0]}` - })} else { + })} else { this.call('terminal', 'logHtml',`Checked out submodule ${dir} to ${result[0]}`) } } From 25c33ffc0b0fdcc52622d72234158d04f9cd4065 Mon Sep 17 00:00:00 2001 From: ioedeveloper Date: Tue, 14 Nov 2023 12:12:09 +0100 Subject: [PATCH 062/163] Modify dependency resolver to exclude duplicate contents --- .../src/app/services/circomPluginClient.ts | 53 +++++++++++++------ apps/circuit-compiler/src/app/types/index.ts | 7 +++ 2 files changed, 43 insertions(+), 17 deletions(-) diff --git a/apps/circuit-compiler/src/app/services/circomPluginClient.ts b/apps/circuit-compiler/src/app/services/circomPluginClient.ts index e97609fbac..0eccddb281 100644 --- a/apps/circuit-compiler/src/app/services/circomPluginClient.ts +++ b/apps/circuit-compiler/src/app/services/circomPluginClient.ts @@ -4,7 +4,7 @@ import EventManager from 'events' import pathModule from 'path' import { parse, compile, generate_witness, generate_r1cs, compiler_list } from 'circom_wasm' import { extractNameFromKey, extractParentFromKey } from '@remix-ui/helper' -import { CompilationConfig, CompilerReport } from '../types' +import { CompilationConfig, CompilerReport, ResolverOutput } from '../types' export class CircomPluginClient extends PluginClient { public internalEvents: EventManager @@ -37,10 +37,7 @@ export class CircomPluginClient extends PluginClient { // @ts-ignore fileContent = await this.call('fileManager', 'readFile', path) } - this.lastParsedFiles = { - [path]: fileContent, - } - this.lastParsedFiles = await this.resolveDependencies(path, fileContent, this.lastParsedFiles) + this.lastParsedFiles = await this.resolveDependencies(path, fileContent, { [path]: { content: fileContent, parent: null } }) const parsedOutput = parse(path, this.lastParsedFiles) try { @@ -211,14 +208,13 @@ export class CircomPluginClient extends PluginClient { this.internalEvents.emit('circuit_computing_witness_done') } - async resolveDependencies(filePath: string, fileContent: string, output = {}, depPath: string = '', blackPath: string[] = []): Promise> { + async resolveDependencies(filePath: string, fileContent: string, output: ResolverOutput = {}, depPath: string = '', parent: string = ''): Promise> { // extract all includes const includes = (fileContent.match(/include ['"].*['"]/g) || []).map((include) => include.replace(/include ['"]/g, '').replace(/['"]/g, '')) await Promise.all( includes.map(async (include) => { // fix for endless recursive includes - if (blackPath.includes(include)) return let dependencyContent = '' let path = include // @ts-ignore @@ -268,20 +264,43 @@ export class CircomPluginClient extends PluginClient { } } } - // extract all includes from the dependency content - const dependencyIncludes = (dependencyContent.match(/include ['"].*['"]/g) || []).map((include) => include.replace(/include ['"]/g, '').replace(/['"]/g, '')) - - blackPath.push(include) - // recursively resolve all dependencies of the dependency - if (dependencyIncludes.length > 0) { - await this.resolveDependencies(filePath, dependencyContent, output, path, blackPath) - output[include] = dependencyContent + const fileNameToInclude = extractNameFromKey(include) + const similarFile = Object.keys(output).find(path => { + return path.indexOf(fileNameToInclude) > -1 + }) + const isDuplicateContent = similarFile && output[similarFile] ? output[similarFile].content === dependencyContent : false + + if (output[include] && output[include].parent) { + // if include import already exists, remove the include import from the parent file + const regexPattern = new RegExp(`include ['"]${include}['"];`, 'g') + + output[output[include].parent].content = output[output[include].parent].content.replace(regexPattern, "") + } else if (isDuplicateContent) { + // if include import has the same content as another file, replace the include import with the file name of the other file (similarFile) + if (output[similarFile].parent) output[output[similarFile].parent].content = output[output[similarFile].parent].content.replace(similarFile, include) + if (include !== similarFile) { + output[include] = output[similarFile] + delete output[similarFile] + } } else { - output[include] = dependencyContent + // extract all includes from the dependency content + const dependencyIncludes = (dependencyContent.match(/include ['"].*['"]/g) || []).map((include) => include.replace(/include ['"]/g, '').replace(/['"]/g, '')) + + output[include] = { + content: dependencyContent, + parent + } + // recursively resolve all dependencies of the dependency + if (dependencyIncludes.length > 0) await this.resolveDependencies(filePath, dependencyContent, output, path, include) } }) ) - return output + const result: Record = {} + + Object.keys(output).forEach((key) => { + result[key] = output[key].content + }) + return result } async resolveReportPath (path: string): Promise { diff --git a/apps/circuit-compiler/src/app/types/index.ts b/apps/circuit-compiler/src/app/types/index.ts index 029b8bea9e..71e1dbfced 100644 --- a/apps/circuit-compiler/src/app/types/index.ts +++ b/apps/circuit-compiler/src/app/types/index.ts @@ -84,4 +84,11 @@ export type CompileOptionsProps = { setCircuitHideWarnings: (value: boolean) => void, autoCompile: boolean, hideWarnings: boolean +} + +export type ResolverOutput = { + [name: string]: { + content: string, + parent: string + } } \ No newline at end of file From 9b07be9aa81d937a961d6e842039042c17a9128f Mon Sep 17 00:00:00 2001 From: ioedeveloper Date: Tue, 14 Nov 2023 12:48:21 +0100 Subject: [PATCH 063/163] RLN template --- .../src/app/tabs/locales/en/filePanel.json | 1 + .../workspace/src/lib/actions/workspace.ts | 2 +- .../workspace/src/lib/remix-ui-workspace.tsx | 3 + .../remix-ui/workspace/src/lib/types/index.ts | 2 +- .../workspace/src/lib/utils/constants.ts | 3 +- libs/remix-ws-templates/src/index.ts | 1 + .../src/templates/rln/LICENSE-APACHE | 201 ++++++++++++++++++ .../src/templates/rln/LICENSE-MIT | 21 ++ .../src/templates/rln/README.md | 26 +++ .../src/templates/rln/circuits/rln.circom | 40 ++++ .../src/templates/rln/circuits/utils.circom | 45 ++++ .../templates/rln/circuits/withdraw.circom | 15 ++ .../src/templates/rln/index.ts | 20 ++ .../src/templates/rln/scripts/run_setup.ts | 59 +++++ .../rln/templates/groth16_verifier.sol.ejs | 165 ++++++++++++++ 15 files changed, 601 insertions(+), 3 deletions(-) create mode 100644 libs/remix-ws-templates/src/templates/rln/LICENSE-APACHE create mode 100644 libs/remix-ws-templates/src/templates/rln/LICENSE-MIT create mode 100644 libs/remix-ws-templates/src/templates/rln/README.md create mode 100644 libs/remix-ws-templates/src/templates/rln/circuits/rln.circom create mode 100644 libs/remix-ws-templates/src/templates/rln/circuits/utils.circom create mode 100644 libs/remix-ws-templates/src/templates/rln/circuits/withdraw.circom create mode 100644 libs/remix-ws-templates/src/templates/rln/index.ts create mode 100644 libs/remix-ws-templates/src/templates/rln/scripts/run_setup.ts create mode 100644 libs/remix-ws-templates/src/templates/rln/templates/groth16_verifier.sol.ejs diff --git a/apps/remix-ide/src/app/tabs/locales/en/filePanel.json b/apps/remix-ide/src/app/tabs/locales/en/filePanel.json index 6b3b8524d0..a645dfc06c 100644 --- a/apps/remix-ide/src/app/tabs/locales/en/filePanel.json +++ b/apps/remix-ide/src/app/tabs/locales/en/filePanel.json @@ -105,6 +105,7 @@ "filePanel.pausable": "Pausable", "filePanel.semaphore": "Semaphore", "filePanel.hashchecker": "Hash Checker", + "filePanel.rln": "Rate-Limiting Nullifier", "filePanel.transparent": "Transparent", "filePanel.initGitRepoTitle": "Check option to initialize workspace as a new git repository", "filePanel.switchToBranchTitle1": "Checkout new branch from remote branch", diff --git a/libs/remix-ui/workspace/src/lib/actions/workspace.ts b/libs/remix-ui/workspace/src/lib/actions/workspace.ts index e2d4ed4658..84adb0741d 100644 --- a/libs/remix-ui/workspace/src/lib/actions/workspace.ts +++ b/libs/remix-ui/workspace/src/lib/actions/workspace.ts @@ -176,7 +176,7 @@ export const createWorkspace = async ( const isActive = await plugin.call('manager', 'isActive', 'dgit') if (!isActive) await plugin.call('manager', 'activatePlugin', 'dgit') } - if (workspaceTemplateName === 'semaphore' || workspaceTemplateName === 'hashchecker') { + if (workspaceTemplateName === 'semaphore' || workspaceTemplateName === 'hashchecker' || workspaceTemplateName === 'rln') { const isCircomActive = await plugin.call('manager', 'isActive', 'circuit-compiler') if (!isCircomActive) await plugin.call('manager', 'activatePlugin', 'circuit-compiler') } diff --git a/libs/remix-ui/workspace/src/lib/remix-ui-workspace.tsx b/libs/remix-ui/workspace/src/lib/remix-ui-workspace.tsx index 1e203d994d..ba0ab4c3da 100644 --- a/libs/remix-ui/workspace/src/lib/remix-ui-workspace.tsx +++ b/libs/remix-ui/workspace/src/lib/remix-ui-workspace.tsx @@ -753,6 +753,9 @@ export function Workspace() { + diff --git a/libs/remix-ui/workspace/src/lib/types/index.ts b/libs/remix-ui/workspace/src/lib/types/index.ts index b49fd94aba..0129232331 100644 --- a/libs/remix-ui/workspace/src/lib/types/index.ts +++ b/libs/remix-ui/workspace/src/lib/types/index.ts @@ -17,7 +17,7 @@ export interface JSONStandardInput { } } export type MenuItems = action[] -export type WorkspaceTemplate = 'gist-template' | 'code-template' | 'remixDefault' | 'blank' | 'ozerc20' | 'zeroxErc20' | 'ozerc721' | 'playground' | 'semaphore' | 'hashchecker' +export type WorkspaceTemplate = 'gist-template' | 'code-template' | 'remixDefault' | 'blank' | 'ozerc20' | 'zeroxErc20' | 'ozerc721' | 'playground' | 'semaphore' | 'hashchecker' | 'rln' export interface WorkspaceProps { plugin: FilePanelType } diff --git a/libs/remix-ui/workspace/src/lib/utils/constants.ts b/libs/remix-ui/workspace/src/lib/utils/constants.ts index 716652df6d..df0265fd26 100644 --- a/libs/remix-ui/workspace/src/lib/utils/constants.ts +++ b/libs/remix-ui/workspace/src/lib/utils/constants.ts @@ -83,5 +83,6 @@ export const TEMPLATE_NAMES = { 'gnosisSafeMultisig': 'Gnosis Safe', 'playground': 'Playground', 'semaphore': 'Semaphore', - 'hashchecker': 'Hash Checker' + 'hashchecker': 'Hash Checker', + 'rln': 'Rate-Limiting Nullifier' } diff --git a/libs/remix-ws-templates/src/index.ts b/libs/remix-ws-templates/src/index.ts index 1dab217e0a..2955f961db 100644 --- a/libs/remix-ws-templates/src/index.ts +++ b/libs/remix-ws-templates/src/index.ts @@ -8,6 +8,7 @@ export { default as gnosisSafeMultisig } from './templates/gnosisSafeMultisig' export { default as playground } from './templates/playground' export { default as semaphore } from './templates/semaphore' export { default as hashchecker } from './templates/hashchecker' +export { default as rln } from './templates/rln' export { contractDeployerScripts } from './script-templates/contract-deployer' export { etherscanScripts } from './script-templates/etherscan' diff --git a/libs/remix-ws-templates/src/templates/rln/LICENSE-APACHE b/libs/remix-ws-templates/src/templates/rln/LICENSE-APACHE new file mode 100644 index 0000000000..261eeb9e9f --- /dev/null +++ b/libs/remix-ws-templates/src/templates/rln/LICENSE-APACHE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/libs/remix-ws-templates/src/templates/rln/LICENSE-MIT b/libs/remix-ws-templates/src/templates/rln/LICENSE-MIT new file mode 100644 index 0000000000..489fcb5103 --- /dev/null +++ b/libs/remix-ws-templates/src/templates/rln/LICENSE-MIT @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2023 Rate-Limiting Nullifier (RLN) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/libs/remix-ws-templates/src/templates/rln/README.md b/libs/remix-ws-templates/src/templates/rln/README.md new file mode 100644 index 0000000000..0b0bdf6ff9 --- /dev/null +++ b/libs/remix-ws-templates/src/templates/rln/README.md @@ -0,0 +1,26 @@ +

Rate-Limiting Nullifier circuits in Circom

+

+ +

+ +
+ +*The project was audited by Veridise, yAcademy fellows and internally.* + +
+ +___ + +## What's RLN? + +RLN is a zero-knowledge gadget that enables spam +prevention in anonymous environments. + +The core parts of RLN are: +* zk-circuits in Circom (this repo); +* [registry smart-contract](https://github.com/Rate-Limiting-Nullifier/rln-contract); +* set of libraries to build app with RLN ([rlnjs](https://github.com/Rate-Limiting-Nullifier/rlnjs), [zerokit](https://github.com/vacp2p/zerokit)). + +--- + +To learn more on RLN and how it works - check out [documentation](https://rate-limiting-nullifier.github.io/rln-docs/). diff --git a/libs/remix-ws-templates/src/templates/rln/circuits/rln.circom b/libs/remix-ws-templates/src/templates/rln/circuits/rln.circom new file mode 100644 index 0000000000..94fc59024f --- /dev/null +++ b/libs/remix-ws-templates/src/templates/rln/circuits/rln.circom @@ -0,0 +1,40 @@ +pragma circom 2.1.0; + +include "./utils.circom"; +include "circomlib/poseidon.circom"; + +template RLN(DEPTH, LIMIT_BIT_SIZE) { + // Private signals + signal input identitySecret; + signal input userMessageLimit; + signal input messageId; + signal input pathElements[DEPTH]; + signal input identityPathIndex[DEPTH]; + + // Public signals + signal input x; + signal input externalNullifier; + + // Outputs + signal output y; + signal output root; + signal output nullifier; + + signal identityCommitment <== Poseidon(1)([identitySecret]); + signal rateCommitment <== Poseidon(2)([identityCommitment, userMessageLimit]); + + // Membership check + root <== MerkleTreeInclusionProof(DEPTH)(rateCommitment, identityPathIndex, pathElements); + + // messageId range check + RangeCheck(LIMIT_BIT_SIZE)(messageId, userMessageLimit); + + // SSS share calculations + signal a1 <== Poseidon(3)([identitySecret, externalNullifier, messageId]); + y <== identitySecret + a1 * x; + + // nullifier calculation + nullifier <== Poseidon(1)([a1]); +} + +component main { public [x, externalNullifier] } = RLN(20, 16); \ No newline at end of file diff --git a/libs/remix-ws-templates/src/templates/rln/circuits/utils.circom b/libs/remix-ws-templates/src/templates/rln/circuits/utils.circom new file mode 100644 index 0000000000..788e3a4987 --- /dev/null +++ b/libs/remix-ws-templates/src/templates/rln/circuits/utils.circom @@ -0,0 +1,45 @@ +pragma circom 2.1.0; + +include "circomlib/poseidon.circom"; +include "circomlib/mux1.circom"; +include "circomlib/bitify.circom"; +include "circomlib/comparators.circom"; + +template MerkleTreeInclusionProof(DEPTH) { + signal input leaf; + signal input pathIndex[DEPTH]; + signal input pathElements[DEPTH]; + + signal output root; + + signal mux[DEPTH][2]; + signal levelHashes[DEPTH + 1]; + + levelHashes[0] <== leaf; + for (var i = 0; i < DEPTH; i++) { + pathIndex[i] * (pathIndex[i] - 1) === 0; + + mux[i] <== MultiMux1(2)( + [ + [levelHashes[i], pathElements[i]], + [pathElements[i], levelHashes[i]] + ], + pathIndex[i] + ); + + levelHashes[i + 1] <== Poseidon(2)([mux[i][0], mux[i][1]]); + } + + root <== levelHashes[DEPTH]; +} + +template RangeCheck(LIMIT_BIT_SIZE) { + assert(LIMIT_BIT_SIZE < 253); + + signal input messageId; + signal input limit; + + signal bitCheck[LIMIT_BIT_SIZE] <== Num2Bits(LIMIT_BIT_SIZE)(messageId); + signal rangeCheck <== LessThan(LIMIT_BIT_SIZE)([messageId, limit]); + rangeCheck === 1; +} \ No newline at end of file diff --git a/libs/remix-ws-templates/src/templates/rln/circuits/withdraw.circom b/libs/remix-ws-templates/src/templates/rln/circuits/withdraw.circom new file mode 100644 index 0000000000..3eae931e1d --- /dev/null +++ b/libs/remix-ws-templates/src/templates/rln/circuits/withdraw.circom @@ -0,0 +1,15 @@ +pragma circom 2.1.0; + +include "circomlib/poseidon.circom"; + +template Withdraw() { + signal input identitySecret; + signal input address; + + signal output identityCommitment <== Poseidon(1)([identitySecret]); + + // Dummy constraint to prevent compiler optimizing it + signal addressSquared <== address * address; +} + +component main { public [address] } = Withdraw(); diff --git a/libs/remix-ws-templates/src/templates/rln/index.ts b/libs/remix-ws-templates/src/templates/rln/index.ts new file mode 100644 index 0000000000..03231f7e66 --- /dev/null +++ b/libs/remix-ws-templates/src/templates/rln/index.ts @@ -0,0 +1,20 @@ +export default async () => { + return { + // @ts-ignore + 'circuits/rln.circom': (await import('raw-loader!./circuits/rln.circom')).default, + // @ts-ignore + 'circuits/utils.circom': (await import('!!raw-loader!./circuits/utils.circom')).default, + // @ts-ignore + 'circuits/withdraw.circom': (await import('!!raw-loader!./circuits/withdraw.circom')).default, + // @ts-ignore + 'scripts/run_setup.ts': (await import('!!raw-loader!./scripts/run_setup.ts')).default, + // @ts-ignore + 'templates/groth16_verifier.sol.ejs': (await import('!!raw-loader!./templates/groth16_verifier.sol.ejs')).default, + // @ts-ignore + 'LICENSE-APACHE': (await import('!!raw-loader!./LICENSE-APACHE')).default, + // @ts-ignore + 'LICENSE-MIT': (await import('!!raw-loader!./LICENSE-MIT')).default, + // @ts-ignore + 'README.md': (await import('raw-loader!./README.md')).default + } +} \ No newline at end of file diff --git a/libs/remix-ws-templates/src/templates/rln/scripts/run_setup.ts b/libs/remix-ws-templates/src/templates/rln/scripts/run_setup.ts new file mode 100644 index 0000000000..2f9e9684cf --- /dev/null +++ b/libs/remix-ws-templates/src/templates/rln/scripts/run_setup.ts @@ -0,0 +1,59 @@ +// eslint-disable-next-line @typescript-eslint/no-var-requires +const snarkjs = require('snarkjs'); + +const logger = { + info: (...args) => console.log(...args), + debug: (...args) => console.log(...args) +}; + +(async () => { + try { + // @ts-ignore + await remix.call('circuit-compiler', 'generateR1cs', 'circuits/rln.circom'); + + const ptau_final = "https://ipfs-cluster.ethdevops.io/ipfs/QmTiT4eiYz5KF7gQrDsgfCSTRv3wBPYJ4bRN1MmTRshpnW"; + // @ts-ignore + const r1csBuffer = await remix.call('fileManager', 'readFile', 'circuits/.bin/rln.r1cs', true); + // @ts-ignore + const r1cs = new Uint8Array(r1csBuffer); + const zkey_0 = { type: "mem" }; + const zkey_1 = { type: "mem" }; + const zkey_final = { type: "mem" }; + + console.log('newZkey') + await snarkjs.zKey.newZKey(r1cs, ptau_final, zkey_0); + + console.log('contribute') + await snarkjs.zKey.contribute(zkey_0, zkey_1, "p2_C1", "pa_Entropy1"); + + console.log('beacon') + await snarkjs.zKey.beacon(zkey_1, zkey_final, "B3", "0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20", 10); + + console.log('verifyFromR1cs') + const verifyFromR1csResult = await snarkjs.zKey.verifyFromR1cs(r1cs, ptau_final, zkey_final); + console.assert(verifyFromR1csResult); + + console.log('verifyFromInit') + const verifyFromInit = await snarkjs.zKey.verifyFromInit(zkey_0, ptau_final, zkey_final); + console.assert(verifyFromInit); + + console.log('exportVerificationKey') + const vKey = await snarkjs.zKey.exportVerificationKey(zkey_final) + await remix.call('fileManager', 'writeFile', './zk/build/verification_key.json', JSON.stringify(vKey)) + + const templates = { + groth16: await remix.call('fileManager', 'readFile', 'templates/groth16_verifier.sol.ejs') + } + const solidityContract = await snarkjs.zKey.exportSolidityVerifier(zkey_final, templates) + + await remix.call('fileManager', 'writeFile', './zk/build/zk_verifier.sol', solidityContract) + + console.log('buffer', (zkey_final as any).data.length) + await remix.call('fileManager', 'writeFile', './zk/build/zk_setup.txt', JSON.stringify(Array.from(((zkey_final as any).data)))) + + console.log('setup done.') + + } catch (e) { + console.error(e.message) + } +})() \ No newline at end of file diff --git a/libs/remix-ws-templates/src/templates/rln/templates/groth16_verifier.sol.ejs b/libs/remix-ws-templates/src/templates/rln/templates/groth16_verifier.sol.ejs new file mode 100644 index 0000000000..692aedf612 --- /dev/null +++ b/libs/remix-ws-templates/src/templates/rln/templates/groth16_verifier.sol.ejs @@ -0,0 +1,165 @@ +// SPDX-License-Identifier: GPL-3.0 +/* + Copyright 2021 0KIMS association. + + This file is generated with [snarkJS](https://github.com/iden3/snarkjs). + + snarkJS is a free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + snarkJS is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + License for more details. + + You should have received a copy of the GNU General Public License + along with snarkJS. If not, see . +*/ + +pragma solidity >=0.7.0 <0.9.0; + +contract Groth16Verifier { + // Scalar field size + uint256 constant r = 21888242871839275222246405745257275088548364400416034343698204186575808495617; + // Base field size + uint256 constant q = 21888242871839275222246405745257275088696311157297823662689037894645226208583; + + // Verification Key data + uint256 constant alphax = <%= vk_alpha_1[0] %>; + uint256 constant alphay = <%= vk_alpha_1[1] %>; + uint256 constant betax1 = <%= vk_beta_2[0][1] %>; + uint256 constant betax2 = <%= vk_beta_2[0][0] %>; + uint256 constant betay1 = <%= vk_beta_2[1][1] %>; + uint256 constant betay2 = <%= vk_beta_2[1][0] %>; + uint256 constant gammax1 = <%= vk_gamma_2[0][1] %>; + uint256 constant gammax2 = <%= vk_gamma_2[0][0] %>; + uint256 constant gammay1 = <%= vk_gamma_2[1][1] %>; + uint256 constant gammay2 = <%= vk_gamma_2[1][0] %>; + uint256 constant deltax1 = <%= vk_delta_2[0][1] %>; + uint256 constant deltax2 = <%= vk_delta_2[0][0] %>; + uint256 constant deltay1 = <%= vk_delta_2[1][1] %>; + uint256 constant deltay2 = <%= vk_delta_2[1][0] %>; + + <% for (let i=0; i + uint256 constant IC<%=i%>x = <%=IC[i][0]%>; + uint256 constant IC<%=i%>y = <%=IC[i][1]%>; + <% } %> + + // Memory data + uint16 constant pVk = 0; + uint16 constant pPairing = 128; + + uint16 constant pLastMem = 896; + + function verifyProof(uint[2] calldata _pA, uint[2][2] calldata _pB, uint[2] calldata _pC, uint[<%=IC.length-1%>] calldata _pubSignals) public view returns (bool) { + assembly { + function checkField(v) { + if iszero(lt(v, q)) { + mstore(0, 0) + return(0, 0x20) + } + } + + // G1 function to multiply a G1 value(x,y) to value in an address + function g1_mulAccC(pR, x, y, s) { + let success + let mIn := mload(0x40) + mstore(mIn, x) + mstore(add(mIn, 32), y) + mstore(add(mIn, 64), s) + + success := staticcall(sub(gas(), 2000), 7, mIn, 96, mIn, 64) + + if iszero(success) { + mstore(0, 0) + return(0, 0x20) + } + + mstore(add(mIn, 64), mload(pR)) + mstore(add(mIn, 96), mload(add(pR, 32))) + + success := staticcall(sub(gas(), 2000), 6, mIn, 128, pR, 64) + + if iszero(success) { + mstore(0, 0) + return(0, 0x20) + } + } + + function checkPairing(pA, pB, pC, pubSignals, pMem) -> isOk { + let _pPairing := add(pMem, pPairing) + let _pVk := add(pMem, pVk) + + mstore(_pVk, IC0x) + mstore(add(_pVk, 32), IC0y) + + // Compute the linear combination vk_x + <% for (let i = 1; i <= nPublic; i++) { %> + g1_mulAccC(_pVk, IC<%=i%>x, IC<%=i%>y, calldataload(add(pubSignals, <%=(i-1)*32%>))) + <% } %> + + // -A + mstore(_pPairing, calldataload(pA)) + mstore(add(_pPairing, 32), mod(sub(q, calldataload(add(pA, 32))), q)) + + // B + mstore(add(_pPairing, 64), calldataload(pB)) + mstore(add(_pPairing, 96), calldataload(add(pB, 32))) + mstore(add(_pPairing, 128), calldataload(add(pB, 64))) + mstore(add(_pPairing, 160), calldataload(add(pB, 96))) + + // alpha1 + mstore(add(_pPairing, 192), alphax) + mstore(add(_pPairing, 224), alphay) + + // beta2 + mstore(add(_pPairing, 256), betax1) + mstore(add(_pPairing, 288), betax2) + mstore(add(_pPairing, 320), betay1) + mstore(add(_pPairing, 352), betay2) + + // vk_x + mstore(add(_pPairing, 384), mload(add(pMem, pVk))) + mstore(add(_pPairing, 416), mload(add(pMem, add(pVk, 32)))) + + + // gamma2 + mstore(add(_pPairing, 448), gammax1) + mstore(add(_pPairing, 480), gammax2) + mstore(add(_pPairing, 512), gammay1) + mstore(add(_pPairing, 544), gammay2) + + // C + mstore(add(_pPairing, 576), calldataload(pC)) + mstore(add(_pPairing, 608), calldataload(add(pC, 32))) + + // delta2 + mstore(add(_pPairing, 640), deltax1) + mstore(add(_pPairing, 672), deltax2) + mstore(add(_pPairing, 704), deltay1) + mstore(add(_pPairing, 736), deltay2) + + + let success := staticcall(sub(gas(), 2000), 8, _pPairing, 768, _pPairing, 0x20) + + isOk := and(success, mload(_pPairing)) + } + + let pMem := mload(0x40) + mstore(0x40, add(pMem, pLastMem)) + + // Validate that all evaluations ∈ F + <% for (let i=0; i + checkField(calldataload(add(_pubSignals, <%=i*32%>))) + <% } %> + + // Validate all evaluations + let isValid := checkPairing(_pA, _pB, _pC, _pubSignals, pMem) + + mstore(0, isValid) + return(0, 0x20) + } + } + } \ No newline at end of file From f5801c039b6bf1149fdef631dc67c67fefab0613 Mon Sep 17 00:00:00 2001 From: Liana Husikyan Date: Thu, 16 Nov 2023 16:28:57 +0100 Subject: [PATCH 064/163] Update homeTablangOptions.tsx for light theme --- .../remix-ui/home-tab/src/lib/components/homeTablangOptions.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/remix-ui/home-tab/src/lib/components/homeTablangOptions.tsx b/libs/remix-ui/home-tab/src/lib/components/homeTablangOptions.tsx index dd8b1153af..0b47e649b8 100644 --- a/libs/remix-ui/home-tab/src/lib/components/homeTablangOptions.tsx +++ b/libs/remix-ui/home-tab/src/lib/components/homeTablangOptions.tsx @@ -28,7 +28,7 @@ export function LanguageOptions({ plugin }: { plugin: any }) { <>
- + {langOptions} From 65265b5cad5bdd5c9bbbaec563466efb09825261 Mon Sep 17 00:00:00 2001 From: yann300 Date: Thu, 16 Nov 2023 23:39:58 +0100 Subject: [PATCH 065/163] add run_verificatiion --- .../src/templates/rln/index.ts | 2 + .../templates/rln/scripts/run_verification.ts | 141 ++++++++++++++++++ 2 files changed, 143 insertions(+) create mode 100644 libs/remix-ws-templates/src/templates/rln/scripts/run_verification.ts diff --git a/libs/remix-ws-templates/src/templates/rln/index.ts b/libs/remix-ws-templates/src/templates/rln/index.ts index 03231f7e66..92e290ccc3 100644 --- a/libs/remix-ws-templates/src/templates/rln/index.ts +++ b/libs/remix-ws-templates/src/templates/rln/index.ts @@ -9,6 +9,8 @@ export default async () => { // @ts-ignore 'scripts/run_setup.ts': (await import('!!raw-loader!./scripts/run_setup.ts')).default, // @ts-ignore + 'scripts/run_verification.ts': (await import('!!raw-loader!./scripts/run_verification.ts')).default, + // @ts-ignore 'templates/groth16_verifier.sol.ejs': (await import('!!raw-loader!./templates/groth16_verifier.sol.ejs')).default, // @ts-ignore 'LICENSE-APACHE': (await import('!!raw-loader!./LICENSE-APACHE')).default, diff --git a/libs/remix-ws-templates/src/templates/rln/scripts/run_verification.ts b/libs/remix-ws-templates/src/templates/rln/scripts/run_verification.ts new file mode 100644 index 0000000000..61771faad8 --- /dev/null +++ b/libs/remix-ws-templates/src/templates/rln/scripts/run_verification.ts @@ -0,0 +1,141 @@ +import { ethers, BigNumber } from 'ethers' +import { IncrementalMerkleTree } from "@zk-kit/incremental-merkle-tree" +import { poseidon } from "circomlibjs" // v0.0.8 + +import { ZqField } from 'ffjavascript' +const SNARK_FIELD_SIZE = BigInt('21888242871839275222246405745257275088548364400416034343698204186575808495617') + +// Creates the finite field +const Fq = new ZqField(SNARK_FIELD_SIZE) + +// eslint-disable-next-line @typescript-eslint/no-var-requires +const snarkjs = require('snarkjs'); + +const logger = { + info: (...args) => console.log(...args), + debug: (...args) => console.log(...args), + error: (...args) => console.error(...args), +} + +/** + * Recovers secret from two shares + * @param x1 signal hash of first message + * @param x2 signal hash of second message + * @param y1 yshare of first message + * @param y2 yshare of second message + * @returns identity secret + */ +function shamirRecovery(x1: bigint, x2: bigint, y1: bigint, y2: bigint): bigint { + const slope = Fq.div(Fq.sub(y2, y1), Fq.sub(x2, x1)) + const privateKey = Fq.sub(y1, Fq.mul(slope, x1)) + + return Fq.normalize(privateKey) +} + +function hash(message: any): bigint { + message = BigNumber.from(message).toTwos(256).toHexString() + message = ethers.utils.zeroPad(message, 32) + return BigInt(ethers.utils.keccak256(message)) >> BigInt(8) +} + +function hashNullifier(message: any): bigint { + return BigInt(ethers.utils.keccak256(message)) >> BigInt(8) +} + +async function prove (signals, wasm, wtns, r1cs, zkey_final, vKey) { + console.log('calculate') + await snarkjs.wtns.calculate(signals, wasm, wtns); + + console.log('check') + await snarkjs.wtns.check(r1cs, wtns, logger); + + console.log('prove') + const { proof, publicSignals } = await snarkjs.groth16.prove(zkey_final, wtns); + + const verified = await snarkjs.groth16.verify(vKey, publicSignals, proof, logger); + console.log('zk proof validity', verified); + return { + proof, + x: publicSignals[3], + y: publicSignals[0] + } +} + +(async () => { + try { + // @ts-ignore + const r1csBuffer = await remix.call('fileManager', 'readFile', 'circuits/.bin/rln.r1cs', true); + // @ts-ignore + const r1cs = new Uint8Array(r1csBuffer); + // @ts-ignore + const wasmBuffer = await remix.call('fileManager', 'readFile', 'circuits/.bin/rln.wasm', true); + // @ts-ignore + const wasm = new Uint8Array(wasmBuffer); + + const zkey_final = { + type: "mem", + data: new Uint8Array(JSON.parse(await remix.call('fileManager', 'readFile', './zk/build/zk_setup.txt'))) + } + const wtns = { type: "mem" }; + + const vKey = JSON.parse(await remix.call('fileManager', 'readFile', './zk/build/verification_key.json')) + + // build list of identity commitments + const secrets = [] + const identityCommitments = [] + const rateCommitments = [] + const userMessageLimit = 0x2 + for (let k = 0; k < 2; k++) { + const identitySecret = BigInt(ethers.utils.hexlify(ethers.utils.randomBytes(32))) + secrets.push(identitySecret) + + const identityCommitment = poseidon([identitySecret]) + const rateCommitment = poseidon([identityCommitment, userMessageLimit]) + identityCommitments.push(identityCommitment) + rateCommitments.push(rateCommitment) + } + + let tree + + try { + tree = new IncrementalMerkleTree(poseidon, 20, BigInt(0), 2, rateCommitments) // Binary tree. + } catch (e) { + console.error(e.message) + return + } + + const merkleproof1 = tree.createProof(0) + + const appId = 0xa + const epoch = 0x1 + + const signals1 = { + identitySecret: secrets[0], + userMessageLimit, + messageId: 0x0, + pathElements: merkleproof1.siblings, + identityPathIndex: merkleproof1.pathIndices, + x: 0xabcd, // hash(message) + externalNullifier: 0xa // hash(epoch, appId) + } + const proof1 = await prove(signals1, wasm, wtns, r1cs, zkey_final, vKey) + + const signals2 = { + identitySecret: secrets[0], + userMessageLimit, + messageId: 0x0, + pathElements: merkleproof1.siblings, + identityPathIndex: merkleproof1.pathIndices, + x: 0xabce, // hash(message) + externalNullifier: 0xa // hash(epoch, appId) + } + const proof2 = await prove(signals2, wasm, wtns, r1cs, zkey_final, vKey) + + const secret = shamirRecovery(BigInt(proof1.x), BigInt(proof2.x), BigInt(proof1.y), BigInt(proof2.y)) + + console.log(secret.toString(10)) + console.log(Fq.normalize(secrets[0])) + } catch (e) { + console.error(e.message) + } +})() \ No newline at end of file From 146bd4579ecad109737a3fb3593d54472a3c29a4 Mon Sep 17 00:00:00 2001 From: yann300 Date: Fri, 17 Nov 2023 22:50:48 +0100 Subject: [PATCH 066/163] show error message --- apps/remix-ide/src/app/plugins/openaigpt.tsx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/apps/remix-ide/src/app/plugins/openaigpt.tsx b/apps/remix-ide/src/app/plugins/openaigpt.tsx index e95babe00a..9785fce43e 100644 --- a/apps/remix-ide/src/app/plugins/openaigpt.tsx +++ b/apps/remix-ide/src/app/plugins/openaigpt.tsx @@ -39,6 +39,8 @@ export class OpenAIGpt extends Plugin { if (result && result.choices && result.choices.length) { this.call('terminal', 'log', { type: 'typewritersuccess', value: result.choices[0].message.content }) + } else if (result.error) { + this.call('terminal', 'log', { type: 'typewritersuccess', value: result.error }) } else { this.call('terminal', 'log', { type: 'typewritersuccess', value: 'No response...' }) } From 0192b36d20b9135afda1da3cc5bea5848d730f3a Mon Sep 17 00:00:00 2001 From: drafish Date: Wed, 15 Nov 2023 14:59:24 +0800 Subject: [PATCH 067/163] support log transaction from iframe plugin --- libs/remix-lib/src/execution/typeConversion.ts | 2 ++ libs/remix-ui/terminal/src/lib/remix-ui-terminal.tsx | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/libs/remix-lib/src/execution/typeConversion.ts b/libs/remix-lib/src/execution/typeConversion.ts index 5d7bf97084..c05e9873ec 100644 --- a/libs/remix-lib/src/execution/typeConversion.ts +++ b/libs/remix-lib/src/execution/typeConversion.ts @@ -24,6 +24,8 @@ function convertToString (v) { return ret } else if (BN.isBN(v) || (v.constructor && v.constructor.name === 'BigNumber') || isBigInt(v)) { return v.toString(10) + } else if (v._isBigNumber) { + return toInt(v._hex) } else if (v._isBuffer) { return bufferToHex(v) } else if (typeof v === 'object') { diff --git a/libs/remix-ui/terminal/src/lib/remix-ui-terminal.tsx b/libs/remix-ui/terminal/src/lib/remix-ui-terminal.tsx index 74b9999a2f..617b8e36dc 100644 --- a/libs/remix-ui/terminal/src/lib/remix-ui-terminal.tsx +++ b/libs/remix-ui/terminal/src/lib/remix-ui-terminal.tsx @@ -116,7 +116,7 @@ export const RemixUiTerminal = (props: RemixUiTerminalProps) => { } scriptRunnerDispatch({ type: message.type ? message.type : 'log', - payload: { message: [message.value] }, + payload: { message: [message.value], provider: message.provider }, }) }, }) From 7ad1b68aa92af6239d03fea7f8f1e9a078cf2f7f Mon Sep 17 00:00:00 2001 From: drafish Date: Sun, 19 Nov 2023 09:11:38 +0800 Subject: [PATCH 068/163] default behavior when provider is not present --- libs/remix-ui/terminal/src/lib/components/Context.tsx | 2 +- libs/remix-ui/terminal/src/lib/remix-ui-terminal.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/libs/remix-ui/terminal/src/lib/components/Context.tsx b/libs/remix-ui/terminal/src/lib/components/Context.tsx index 197d022750..60a4baa00b 100644 --- a/libs/remix-ui/terminal/src/lib/components/Context.tsx +++ b/libs/remix-ui/terminal/src/lib/components/Context.tsx @@ -16,7 +16,7 @@ const Context = ({opts, provider}: {opts; provider: string}) => { const i = data.receipt ? data.transactionIndex : data.transactionIndex const value = val ? typeConversion.toInt(val) : 0 - if (provider.startsWith('vm')) { + if (provider && provider.startsWith('vm')) { return (
diff --git a/libs/remix-ui/terminal/src/lib/remix-ui-terminal.tsx b/libs/remix-ui/terminal/src/lib/remix-ui-terminal.tsx index 617b8e36dc..74b9999a2f 100644 --- a/libs/remix-ui/terminal/src/lib/remix-ui-terminal.tsx +++ b/libs/remix-ui/terminal/src/lib/remix-ui-terminal.tsx @@ -116,7 +116,7 @@ export const RemixUiTerminal = (props: RemixUiTerminalProps) => { } scriptRunnerDispatch({ type: message.type ? message.type : 'log', - payload: { message: [message.value], provider: message.provider }, + payload: { message: [message.value] }, }) }, }) From 22fc80172e023a92c52334274fc6ee6421614e44 Mon Sep 17 00:00:00 2001 From: lianahus Date: Thu, 16 Nov 2023 16:43:09 +0100 Subject: [PATCH 069/163] refactored UI of templates on hometab --- .../css/themes/bootstrap-cyborg.min.css | 10 ++++----- .../src/assets/img/gnosissafeLogo.png | Bin 0 -> 17341 bytes .../src/assets/img/openzeppelinLogo.png | Bin 0 -> 919 bytes .../src/assets/img/oxprojectLogo.png | Bin 0 -> 56908 bytes .../src/assets/img/remixverticaltextLogo.png | Bin 0 -> 3392 bytes .../src/lib/components/homeTabGetStarted.tsx | 18 ++++++++++----- .../src/lib/components/workspaceTemplate.tsx | 21 +++++++++++++----- .../home-tab/src/lib/remix-ui-home-tab.css | 4 ++-- 8 files changed, 35 insertions(+), 18 deletions(-) create mode 100644 apps/remix-ide/src/assets/img/gnosissafeLogo.png create mode 100644 apps/remix-ide/src/assets/img/openzeppelinLogo.png create mode 100644 apps/remix-ide/src/assets/img/oxprojectLogo.png create mode 100644 apps/remix-ide/src/assets/img/remixverticaltextLogo.png diff --git a/apps/remix-ide/src/assets/css/themes/bootstrap-cyborg.min.css b/apps/remix-ide/src/assets/css/themes/bootstrap-cyborg.min.css index 136e53ff42..47c7fa9b91 100644 --- a/apps/remix-ide/src/assets/css/themes/bootstrap-cyborg.min.css +++ b/apps/remix-ide/src/assets/css/themes/bootstrap-cyborg.min.css @@ -284,19 +284,19 @@ template { color:#fff } .h1,h1 { - font-size:4rem + font-size:3rem } .h2,h2 { - font-size:3rem + font-size:2.5rem } .h3,h3 { - font-size:2.5rem + font-size:2rem } .h4,h4 { - font-size:2rem + font-size:1.6rem } .h5,h5 { - font-size:1.5rem + font-size:1.3rem } .h6,h6 { font-size:.875rem diff --git a/apps/remix-ide/src/assets/img/gnosissafeLogo.png b/apps/remix-ide/src/assets/img/gnosissafeLogo.png new file mode 100644 index 0000000000000000000000000000000000000000..cd0e7ffcb6783e98d0e7d79b49757c492d7efac7 GIT binary patch literal 17341 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 Vx!1?=SNuan{fV}6`Qv91{|7h=OcMYA literal 0 HcmV?d00001 diff --git a/apps/remix-ide/src/assets/img/openzeppelinLogo.png b/apps/remix-ide/src/assets/img/openzeppelinLogo.png new file mode 100644 index 0000000000000000000000000000000000000000..6123132cdb3ab3bbd1ffac70b4fe348733186af1 GIT binary patch literal 919 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 createWorkspace("gnosisSafeMultisig")} /> createWorkspace("zeroxErc20")} /> createWorkspace('ozerc20')} /> createWorkspace("ozerc721")} /> createWorkspace("ozerc1155")} /> createWorkspace("remixDefault")} /> diff --git a/libs/remix-ui/home-tab/src/lib/components/workspaceTemplate.tsx b/libs/remix-ui/home-tab/src/lib/components/workspaceTemplate.tsx index 2a1d78da58..ee48f5d83c 100644 --- a/libs/remix-ui/home-tab/src/lib/components/workspaceTemplate.tsx +++ b/libs/remix-ui/home-tab/src/lib/components/workspaceTemplate.tsx @@ -1,23 +1,34 @@ /* eslint-disable @typescript-eslint/no-unused-vars */ import React, {useContext} from 'react' +import {CustomTooltip} from '@remix-ui/helper' +import {ThemeContext} from '../themeContext' + interface WorkspaceTemplateProps { gsID: string workspaceTitle: string + projectLogo: string callback: any description: string } -function WorkspaceTemplate({gsID, workspaceTitle, description, callback}: WorkspaceTemplateProps) { +function WorkspaceTemplate({gsID, workspaceTitle, description, projectLogo, callback}: WorkspaceTemplateProps) { + const themeFilter = useContext(ThemeContext) + + console.log("theme ", themeFilter) return (

diff --git a/libs/remix-ui/home-tab/src/lib/remix-ui-home-tab.css b/libs/remix-ui/home-tab/src/lib/remix-ui-home-tab.css index 3a8e7d6a06..a7fa9b4da4 100644 --- a/libs/remix-ui/home-tab/src/lib/remix-ui-home-tab.css +++ b/libs/remix-ui/home-tab/src/lib/remix-ui-home-tab.css @@ -76,8 +76,8 @@ text-align: left; } .remixui_home_cursorStyle { - cursor: pointer; - font-size: 0.8rem; + cursor: pointer; + font-weight: 900; } .remixui_home_envButton { width: 220px; From 21f9f64a86113968192754d5441cb92870b275d8 Mon Sep 17 00:00:00 2001 From: lianahus Date: Sun, 19 Nov 2023 10:16:11 +0100 Subject: [PATCH 070/163] adding default value for ignoreGasPricing and fixinf cookboox activation from hometab --- apps/remix-ide/src/blockchain/execution-context.js | 2 +- libs/ghaction-helper/src/methods.ts | 2 +- .../home-tab/src/lib/components/homeTabFeaturedPlugins.tsx | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/apps/remix-ide/src/blockchain/execution-context.js b/apps/remix-ide/src/blockchain/execution-context.js index 7c33bb4f27..7a37c0aac6 100644 --- a/apps/remix-ide/src/blockchain/execution-context.js +++ b/apps/remix-ide/src/blockchain/execution-context.js @@ -7,7 +7,7 @@ const _paq = window._paq = window._paq || [] let web3 -const config = { defaultTransactionType: '0x0' } +const config = { defaultTransactionType: '0x0', ignoreGasPricing: true } if (typeof window !== 'undefined' && typeof window.ethereum !== 'undefined') { var injectedProvider = window.ethereum web3 = new Web3(injectedProvider) diff --git a/libs/ghaction-helper/src/methods.ts b/libs/ghaction-helper/src/methods.ts index 9bfa470033..16c5a5f2d4 100644 --- a/libs/ghaction-helper/src/methods.ts +++ b/libs/ghaction-helper/src/methods.ts @@ -11,7 +11,7 @@ const providerConfig = { blockNumber: global.blockNumber || null } -const config = { defaultTransactionType: '0x0' } +const config = { defaultTransactionType: '0x0', ignoreGasPricing: true } global.remixProvider = new Provider(providerConfig) global.remixProvider.init() global.web3Provider = new ethers.providers.Web3Provider(global.remixProvider) diff --git a/libs/remix-ui/home-tab/src/lib/components/homeTabFeaturedPlugins.tsx b/libs/remix-ui/home-tab/src/lib/components/homeTabFeaturedPlugins.tsx index fc83101850..74a439979b 100644 --- a/libs/remix-ui/home-tab/src/lib/components/homeTabFeaturedPlugins.tsx +++ b/libs/remix-ui/home-tab/src/lib/components/homeTabFeaturedPlugins.tsx @@ -74,8 +74,8 @@ function HomeTabFeaturedPlugins({plugin}: HomeTabFeaturedPluginsProps) { } const startCookbook = async () => { await plugin.appManager.activatePlugin(['cookbookdev']) - plugin.verticalIcons.select('cookbook.dev') - _paq.push(['trackEvent', 'hometabActivate', 'userActivate', 'cookbook.dev']) + plugin.verticalIcons.select('cookbookdev') + _paq.push(['trackEvent', 'hometabActivate', 'userActivate', 'cookbookdev']) } const startSolidityUnitTesting = async () => { await plugin.appManager.activatePlugin(['solidity', 'solidityUnitTesting']) From d3b8470f28eaa040c58bc611b85fd8ff23c94cc8 Mon Sep 17 00:00:00 2001 From: bunsenstraat Date: Mon, 20 Nov 2023 05:11:57 +0000 Subject: [PATCH 071/163] add semver to url resolver --- libs/remix-url-resolver/package.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/libs/remix-url-resolver/package.json b/libs/remix-url-resolver/package.json index c21d81ac0f..b3f6f456ed 100644 --- a/libs/remix-url-resolver/package.json +++ b/libs/remix-url-resolver/package.json @@ -25,6 +25,7 @@ "dependencies": { "@erebos/bzz-node": "^0.13.0", "axios": "1.2.2", + "semver": "^7.5.4", "url": "^0.11.0", "valid-url": "^1.0.9" }, @@ -41,4 +42,4 @@ }, "typings": "src/index.d.ts", "gitHead": "b8606fe2db170b6ef7cdd19b498db74cf2fb14b1" -} \ No newline at end of file +} From 69bd19c9eccec0eba5e0f8722f119b73dc51b139 Mon Sep 17 00:00:00 2001 From: yann300 Date: Tue, 21 Nov 2023 13:00:14 +0100 Subject: [PATCH 072/163] add require to global type --- libs/remix-ui/editor/src/lib/web-types.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/libs/remix-ui/editor/src/lib/web-types.ts b/libs/remix-ui/editor/src/lib/web-types.ts index 9d95f1440e..ae8253f65f 100644 --- a/libs/remix-ui/editor/src/lib/web-types.ts +++ b/libs/remix-ui/editor/src/lib/web-types.ts @@ -215,6 +215,7 @@ export const loadTypes = async (monaco) => { declare global { const remix: PluginClient; const web3Provider; + const require; } ` monaco.languages.typescript.typescriptDefaults.addExtraLib(indexRemixApi) @@ -230,4 +231,4 @@ export const loadTypes = async (monaco) => { const loadedElement = document.createElement('span') loadedElement.setAttribute('data-id', 'typesloaded') document.body.appendChild(loadedElement) -} \ No newline at end of file +} From 1695e00fda718427c6badae7b446342cf7d17861 Mon Sep 17 00:00:00 2001 From: yann300 Date: Thu, 23 Nov 2023 12:10:28 +0100 Subject: [PATCH 073/163] fix hashchecker issue --- .../src/templates/hashchecker/circuits/calculate_hash.circom | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/remix-ws-templates/src/templates/hashchecker/circuits/calculate_hash.circom b/libs/remix-ws-templates/src/templates/hashchecker/circuits/calculate_hash.circom index edbd8aaea2..770b266798 100644 --- a/libs/remix-ws-templates/src/templates/hashchecker/circuits/calculate_hash.circom +++ b/libs/remix-ws-templates/src/templates/hashchecker/circuits/calculate_hash.circom @@ -38,4 +38,4 @@ template HashChecker() { } -component main {public [value1, value2, value3, value4]} = HashChecker(); \ No newline at end of file +component main {public [hash]} = HashChecker(); From 2510a1bcc68ceb89a7d0d9e1750705d2aa610df0 Mon Sep 17 00:00:00 2001 From: ioedeveloper Date: Tue, 21 Nov 2023 16:36:56 +0100 Subject: [PATCH 074/163] Add full config for proxy bytecode compilation --- libs/remix-core-plugin/src/lib/constants/uups.ts | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/libs/remix-core-plugin/src/lib/constants/uups.ts b/libs/remix-core-plugin/src/lib/constants/uups.ts index 3a07dfdc8d..936d6ad440 100644 --- a/libs/remix-core-plugin/src/lib/constants/uups.ts +++ b/libs/remix-core-plugin/src/lib/constants/uups.ts @@ -1,16 +1,24 @@ export const UUPS = 'UUPSUpgradeable' -// https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.8.0/contracts/proxy/ERC1967/ERC1967Proxy.sol -// solidity 0.8.7 export const UUPSBytecode = '608060405260405162000c6638038062000c6683398181016040528101906200002991906200041e565b6200003d828260006200004560201b60201c565b5050620007e2565b62000056836200008860201b60201c565b600082511180620000645750805b156200008357620000818383620000df60201b620000371760201c565b505b505050565b62000099816200011560201b60201c565b8073ffffffffffffffffffffffffffffffffffffffff167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b60405160405180910390a250565b60606200010d838360405180606001604052806027815260200162000c3f60279139620001eb60201b60201c565b905092915050565b6200012b816200027d60201b620000641760201c565b6200016d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620001649062000587565b60405180910390fd5b80620001a77f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b620002a060201b620000871760201c565b60000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60606000808573ffffffffffffffffffffffffffffffffffffffff16856040516200021791906200054a565b600060405180830381855af49150503d806000811462000254576040519150601f19603f3d011682016040523d82523d6000602084013e62000259565b606091505b50915091506200027286838387620002aa60201b60201c565b925050509392505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000819050919050565b606083156200031b576000835114156200031257620002cf856200027d60201b60201c565b62000311576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200030890620005a9565b60405180910390fd5b5b8290506200032e565b6200032d83836200033660201b60201c565b5b949350505050565b6000825111156200034a5781518083602001fd5b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000380919062000563565b60405180910390fd5b6000620003a06200039a84620005f4565b620005cb565b905082815260208101848484011115620003bf57620003be62000730565b5b620003cc84828562000690565b509392505050565b600081519050620003e581620007c8565b92915050565b600082601f8301126200040357620004026200072b565b5b81516200041584826020860162000389565b91505092915050565b600080604083850312156200043857620004376200073a565b5b60006200044885828601620003d4565b925050602083015167ffffffffffffffff8111156200046c576200046b62000735565b5b6200047a85828601620003eb565b9150509250929050565b600062000491826200062a565b6200049d818562000640565b9350620004af81856020860162000690565b80840191505092915050565b6000620004c88262000635565b620004d481856200064b565b9350620004e681856020860162000690565b620004f1816200073f565b840191505092915050565b60006200050b602d836200064b565b9150620005188262000750565b604082019050919050565b600062000532601d836200064b565b91506200053f826200079f565b602082019050919050565b600062000558828462000484565b915081905092915050565b600060208201905081810360008301526200057f8184620004bb565b905092915050565b60006020820190508181036000830152620005a281620004fc565b9050919050565b60006020820190508181036000830152620005c48162000523565b9050919050565b6000620005d7620005ea565b9050620005e58282620006c6565b919050565b6000604051905090565b600067ffffffffffffffff821115620006125762000611620006fc565b5b6200061d826200073f565b9050602081019050919050565b600081519050919050565b600081519050919050565b600081905092915050565b600082825260208201905092915050565b6000620006698262000670565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60005b83811015620006b057808201518184015260208101905062000693565b83811115620006c0576000848401525b50505050565b620006d1826200073f565b810181811067ffffffffffffffff82111715620006f357620006f2620006fc565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60008201527f6f74206120636f6e747261637400000000000000000000000000000000000000602082015250565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b620007d3816200065c565b8114620007df57600080fd5b50565b61044d80620007f26000396000f3fe6080604052366100135761001161001d565b005b61001b61001d565b005b610025610091565b610035610030610093565b6100a2565b565b606061005c83836040518060600160405280602781526020016103f1602791396100c8565b905092915050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000819050919050565b565b600061009d61014e565b905090565b3660008037600080366000845af43d6000803e80600081146100c3573d6000f35b3d6000fd5b60606000808573ffffffffffffffffffffffffffffffffffffffff16856040516100f291906102f8565b600060405180830381855af49150503d806000811461012d576040519150601f19603f3d011682016040523d82523d6000602084013e610132565b606091505b5091509150610143868383876101a5565b925050509392505050565b600061017c7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b610087565b60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060831561020857600083511415610200576101c085610064565b6101ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101f690610331565b60405180910390fd5b5b829050610213565b610212838361021b565b5b949350505050565b60008251111561022e5781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610262919061030f565b60405180910390fd5b600061027682610351565b6102808185610367565b9350610290818560208601610383565b80840191505092915050565b60006102a78261035c565b6102b18185610372565b93506102c1818560208601610383565b6102ca816103b6565b840191505092915050565b60006102e2601d83610372565b91506102ed826103c7565b602082019050919050565b6000610304828461026b565b915081905092915050565b60006020820190508181036000830152610329818461029c565b905092915050565b6000602082019050818103600083015261034a816102d5565b9050919050565b600081519050919050565b600081519050919050565b600081905092915050565b600082825260208201905092915050565b60005b838110156103a1578082015181840152602081019050610386565b838111156103b0576000848401525b50505050565b6000601f19601f8301169050919050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060008201525056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a264697066735822122055b27d4c39ab82b8890fc1565c3858a1b7f1e0f5780871061f908d7503dcf94e64736f6c63430008070033416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564' export const UUPSBytecodeV5 = '60806040526040516106ae3803806106ae833981810160405281019061002591906104f2565b610035828261003c60201b60201c565b50506105ce565b61004b826100c060201b60201c565b8173ffffffffffffffffffffffffffffffffffffffff167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b60405160405180910390a25f815111156100ad576100a7828261018f60201b60201c565b506100bc565b6100bb61021560201b60201c565b5b5050565b5f8173ffffffffffffffffffffffffffffffffffffffff163b0361011b57806040517f4c9c8ce3000000000000000000000000000000000000000000000000000000008152600401610112919061055b565b60405180910390fd5b8061014d7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b61025160201b60201c565b5f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60605f808473ffffffffffffffffffffffffffffffffffffffff16846040516101b891906105b8565b5f60405180830381855af49150503d805f81146101f0576040519150601f19603f3d011682016040523d82523d5f602084013e6101f5565b606091505b509150915061020b85838361025a60201b60201c565b9250505092915050565b5f34111561024f576040517fb398979f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b5f819050919050565b60608261027557610270826102ed60201b60201c565b6102e5565b5f825114801561029b57505f8473ffffffffffffffffffffffffffffffffffffffff163b145b156102dd57836040517f9996b3150000000000000000000000000000000000000000000000000000000081526004016102d4919061055b565b60405180910390fd5b8190506102e6565b5b9392505050565b5f815111156102ff5780518082602001fd5b6040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f604051905090565b5f80fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61036b82610342565b9050919050565b61037b81610361565b8114610385575f80fd5b50565b5f8151905061039681610372565b92915050565b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6103ea826103a4565b810181811067ffffffffffffffff82111715610409576104086103b4565b5b80604052505050565b5f61041b610331565b905061042782826103e1565b919050565b5f67ffffffffffffffff821115610446576104456103b4565b5b61044f826103a4565b9050602081019050919050565b5f5b8381101561047957808201518184015260208101905061045e565b5f8484015250505050565b5f6104966104918461042c565b610412565b9050828152602081018484840111156104b2576104b16103a0565b5b6104bd84828561045c565b509392505050565b5f82601f8301126104d9576104d861039c565b5b81516104e9848260208601610484565b91505092915050565b5f80604083850312156105085761050761033a565b5b5f61051585828601610388565b925050602083015167ffffffffffffffff8111156105365761053561033e565b5b610542858286016104c5565b9150509250929050565b61055581610361565b82525050565b5f60208201905061056e5f83018461054c565b92915050565b5f81519050919050565b5f81905092915050565b5f61059282610574565b61059c818561057e565b93506105ac81856020860161045c565b80840191505092915050565b5f6105c38284610588565b915081905092915050565b60d4806105da5f395ff3fe6080604052600a600c565b005b60186014601a565b6026565b565b5f60216044565b905090565b365f80375f80365f845af43d5f803e805f81146040573d5ff35b3d5ffd5b5f606e7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b6095565b5f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b5f81905091905056fea26469706673582212202e577dc05daa509bce6e6a86e29397d40b31118aea9fcd0aa88768ad25c610f964736f6c63430008150033' export const UUPSDeployedByteCode = '6080604052366100135761001161001d565b005b61001b61001d565b005b610025610091565b610035610030610093565b6100a2565b565b606061005c83836040518060600160405280602781526020016103f1602791396100c8565b905092915050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000819050919050565b565b600061009d61014e565b905090565b3660008037600080366000845af43d6000803e80600081146100c3573d6000f35b3d6000fd5b60606000808573ffffffffffffffffffffffffffffffffffffffff16856040516100f291906102f8565b600060405180830381855af49150503d806000811461012d576040519150601f19603f3d011682016040523d82523d6000602084013e610132565b606091505b5091509150610143868383876101a5565b925050509392505050565b600061017c7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b610087565b60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060831561020857600083511415610200576101c085610064565b6101ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101f690610331565b60405180910390fd5b5b829050610213565b610212838361021b565b5b949350505050565b60008251111561022e5781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610262919061030f565b60405180910390fd5b600061027682610351565b6102808185610367565b9350610290818560208601610383565b80840191505092915050565b60006102a78261035c565b6102b18185610372565b93506102c1818560208601610383565b6102ca816103b6565b840191505092915050565b60006102e2601d83610372565b91506102ed826103c7565b602082019050919050565b6000610304828461026b565b915081905092915050565b60006020820190508181036000830152610329818461029c565b905092915050565b6000602082019050818103600083015261034a816102d5565b9050919050565b600081519050919050565b600081519050919050565b600081905092915050565b600082825260208201905092915050565b60005b838110156103a1578082015181840152602081019050610386565b838111156103b0576000848401525b50505050565b6000601f19601f8301169050919050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060008201525056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a264697066735822122055b27d4c39ab82b8890fc1565c3858a1b7f1e0f5780871061f908d7503dcf94e64736f6c63430008070033' export const UUPSDeployedByteCodeV5 = '6080604052600a600c565b005b60186014601a565b6026565b565b5f60216044565b905090565b365f80375f80365f845af43d5f803e805f81146040573d5ff35b3d5ffd5b5f606e7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b6095565b5f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b5f81905091905056fea26469706673582212202e577dc05daa509bce6e6a86e29397d40b31118aea9fcd0aa88768ad25c610f964736f6c63430008150033' + +// OZ v4.8.0 bytecode compilation config +export const UUPSProxyContractCode = 'https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.8.0/contracts/proxy/ERC1967/ERC1967Proxy.sol' export const UUPSCompilerVersion = 'soljson-v0.8.7+commit.e28d00a7.js' -export const UUPSCompilerVersionV5 = 'soljson-v0.8.21+commit.d9974bed.js' export const UUPSLanguage = 'Solidity' export const UUPSOptimize = false export const UUPSRuns = 0 export const UUPSEvmVersion = null + +// OZ v5.0.0 bytecode compilation config +export const UUPSProxyContractCodeV5 = 'https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v5.0.0/contracts/proxy/ERC1967/ERC1967Proxy.sol' +export const UUPSCompilerVersionV5 = 'soljson-v0.8.21+commit.d9974bed.js' +export const UUPSLanguagev5 = 'Solidity' +export const UUPSOptimizev5 = false +export const UUPSRunsv5 = 0 +export const UUPSEvmVersionv5 = null export const UUPSABI = [ { "inputs": [ From 2c6f07b7bad40e10f62c38c8e75760e9cddbcb48 Mon Sep 17 00:00:00 2001 From: yann300 Date: Tue, 21 Nov 2023 15:07:02 +0100 Subject: [PATCH 075/163] fix using checkRevertBeforeSending and ignoreGasPricing --- apps/remix-ide/src/app/plugins/solidity-script.tsx | 4 ++-- apps/remix-ide/src/blockchain/execution-context.js | 2 +- apps/remix-ide/src/blockchain/providers/vm.ts | 1 + libs/ghaction-helper/src/methods.ts | 2 +- libs/remix-debug/test/vmCall.ts | 2 +- libs/remix-lib/src/execution/txRunnerWeb3.ts | 4 ++-- libs/remix-simulator/src/VmProxy.ts | 3 +++ 7 files changed, 11 insertions(+), 7 deletions(-) diff --git a/apps/remix-ide/src/app/plugins/solidity-script.tsx b/apps/remix-ide/src/app/plugins/solidity-script.tsx index 4da5425a34..36a287689e 100644 --- a/apps/remix-ide/src/app/plugins/solidity-script.tsx +++ b/apps/remix-ide/src/app/plugins/solidity-script.tsx @@ -73,13 +73,13 @@ export class SolidityScript extends Plugin { from: accounts[0], data: bytecode } - const receipt = await web3.eth.sendTransaction(tx) + const receipt = await web3.eth.sendTransaction(tx, null, { checkRevertBeforeSending: false, ignoreGasPricing: true }) tx = { from: accounts[0], to: receipt.contractAddress, data: '0x69d4394b' // function remixRun() public } - const receiptCall = await web3.eth.sendTransaction(tx) + const receiptCall = await web3.eth.sendTransaction(tx, null, { checkRevertBeforeSending: false, ignoreGasPricing: true }) const hhlogs = await web3.remix.getHHLogsForTx(receiptCall.transactionHash) diff --git a/apps/remix-ide/src/blockchain/execution-context.js b/apps/remix-ide/src/blockchain/execution-context.js index 7a37c0aac6..7c33bb4f27 100644 --- a/apps/remix-ide/src/blockchain/execution-context.js +++ b/apps/remix-ide/src/blockchain/execution-context.js @@ -7,7 +7,7 @@ const _paq = window._paq = window._paq || [] let web3 -const config = { defaultTransactionType: '0x0', ignoreGasPricing: true } +const config = { defaultTransactionType: '0x0' } if (typeof window !== 'undefined' && typeof window.ethereum !== 'undefined') { var injectedProvider = window.ethereum web3 = new Web3(injectedProvider) diff --git a/apps/remix-ide/src/blockchain/providers/vm.ts b/apps/remix-ide/src/blockchain/providers/vm.ts index 913bfad2a8..3ae7f6a154 100644 --- a/apps/remix-ide/src/blockchain/providers/vm.ts +++ b/apps/remix-ide/src/blockchain/providers/vm.ts @@ -62,6 +62,7 @@ export class VMProvider { } } this.web3 = new Web3(this.provider as LegacySendAsyncProvider) + this.web3.setConfig({ defaultTransactionType: '0x0' }) extend(this.web3) this.executionContext.setWeb3(this.executionContext.getProvider(), this.web3) resolve({}) diff --git a/libs/ghaction-helper/src/methods.ts b/libs/ghaction-helper/src/methods.ts index 16c5a5f2d4..9bfa470033 100644 --- a/libs/ghaction-helper/src/methods.ts +++ b/libs/ghaction-helper/src/methods.ts @@ -11,7 +11,7 @@ const providerConfig = { blockNumber: global.blockNumber || null } -const config = { defaultTransactionType: '0x0', ignoreGasPricing: true } +const config = { defaultTransactionType: '0x0' } global.remixProvider = new Provider(providerConfig) global.remixProvider.init() global.web3Provider = new ethers.providers.Web3Provider(global.remixProvider) diff --git a/libs/remix-debug/test/vmCall.ts b/libs/remix-debug/test/vmCall.ts index b00a506983..e9d6e28012 100644 --- a/libs/remix-debug/test/vmCall.ts +++ b/libs/remix-debug/test/vmCall.ts @@ -23,7 +23,7 @@ async function sendTx (web3, from, to, value, data, cb) { value, data, gas: 7000000 - }) + }, null, { checkRevertBeforeSending: false, ignoreGasPricing: true }) cb(null, receipt.transactionHash) return receipt.transactionHash } catch (e) { diff --git a/libs/remix-lib/src/execution/txRunnerWeb3.ts b/libs/remix-lib/src/execution/txRunnerWeb3.ts index a7f1cce7ac..02d343b475 100644 --- a/libs/remix-lib/src/execution/txRunnerWeb3.ts +++ b/libs/remix-lib/src/execution/txRunnerWeb3.ts @@ -65,7 +65,7 @@ export class TxRunnerWeb3 { promptCb( async (value) => { try { - const res = await (this.getWeb3() as any).eth.personal.sendTransaction({...tx, value}) + const res = await (this.getWeb3() as any).eth.personal.sendTransaction({...tx, value}, { checkRevertBeforeSending: false, ignoreGasPricing: true }) cb(null, res.transactionHash) } catch (e) { console.log(`Send transaction failed: ${e.message} . if you use an injected provider, please check it is properly unlocked. `) @@ -81,7 +81,7 @@ export class TxRunnerWeb3 { ) } else { try { - const res = await this.getWeb3().eth.sendTransaction(tx, null, { checkRevertBeforeSending: false }) + const res = await this.getWeb3().eth.sendTransaction(tx, null, { checkRevertBeforeSending: false, ignoreGasPricing: true}) cb(null, res.transactionHash) } catch (e) { console.log(`Send transaction failed: ${e.message} . if you use an injected provider, please check it is properly unlocked. `) diff --git a/libs/remix-simulator/src/VmProxy.ts b/libs/remix-simulator/src/VmProxy.ts index d0a5e634e2..99f102023f 100644 --- a/libs/remix-simulator/src/VmProxy.ts +++ b/libs/remix-simulator/src/VmProxy.ts @@ -123,6 +123,7 @@ export class VmProxy { this.stateCopy = await this.vm.stateManager.copy() this.incr++ this.processingHash = bufferToHex(data.hash()) + console.log('txWillProcess', this.processingHash ) this.vmTraces[this.processingHash] = { gas: '0x0', return: '0x0', @@ -158,6 +159,7 @@ export class VmProxy { } async txProcessed (data: AfterTxEvent) { + console.log('txProcessed', this.processingHash) if (this.flagDoNotRecordEVMSteps) { this.flagDoNotRecordEVMSteps = false return @@ -260,6 +262,7 @@ export class VmProxy { this.vmTraces[this.processingHash].structLogs.push(step) // Track hardhat console.log call if (step.op === 'STATICCALL' && toHexPaddedString(step.stack[step.stack.length - 2]) === '0x000000000000000000000000000000000000000000636f6e736f6c652e6c6f67') { + console.log('STATICCALL', this.processingHash) const payloadStart = parseInt(toHexPaddedString(step.stack[step.stack.length - 3]), 16) const memory = formatMemory(data.memory) const memoryStr = memory.join('') From 7ea52cb35cc0741aa6bb1d7597cafcebdb3a4ca6 Mon Sep 17 00:00:00 2001 From: yann300 Date: Tue, 21 Nov 2023 15:21:05 +0100 Subject: [PATCH 076/163] add e2e --- .../commands/waitForElementNotContainsText.ts | 28 +++++++++++++++++++ apps/remix-ide-e2e/src/tests/terminal.test.ts | 2 ++ apps/remix-ide-e2e/src/types/index.d.ts | 1 + 3 files changed, 31 insertions(+) create mode 100644 apps/remix-ide-e2e/src/commands/waitForElementNotContainsText.ts diff --git a/apps/remix-ide-e2e/src/commands/waitForElementNotContainsText.ts b/apps/remix-ide-e2e/src/commands/waitForElementNotContainsText.ts new file mode 100644 index 0000000000..e482a627f1 --- /dev/null +++ b/apps/remix-ide-e2e/src/commands/waitForElementNotContainsText.ts @@ -0,0 +1,28 @@ +import { NightwatchBrowser } from 'nightwatch' +import EventEmitter from 'events' + +class WaitForElementNotContainsText extends EventEmitter { + command (this: NightwatchBrowser, id: string, value: string, timeout = 10000): NightwatchBrowser { + let waitId // eslint-disable-line + let currentValue + const runid = setInterval(() => { + this.api.getText(id, (result) => { + currentValue = result.value + if (typeof result.value === 'string' && result.value.indexOf(value) !== -1) { + clearInterval(runid) + clearTimeout(waitId) + this.api.assert.ok(false, `WaitForElementContainsText ${id} contains ${value} . It should not`) + this.emit('complete') + } + }) + }, 200) + + waitId = setTimeout(() => { + clearInterval(runid) + this.api.assert.fail(`TimeoutError: An error occurred while running .waitForElementContainsText() command on ${id} after ${timeout} milliseconds. expected: ${value} - got: ${currentValue}`) + }, timeout) + return this + } +} + +module.exports = WaitForElementNotContainsText diff --git a/apps/remix-ide-e2e/src/tests/terminal.test.ts b/apps/remix-ide-e2e/src/tests/terminal.test.ts index a611600e30..eb54b471f6 100644 --- a/apps/remix-ide-e2e/src/tests/terminal.test.ts +++ b/apps/remix-ide-e2e/src/tests/terminal.test.ts @@ -356,6 +356,8 @@ module.exports = { }) .useCss() .waitForElementContainsText('*[data-id="terminalJournal"]', 'test running free function', 120000) + .WaitForElementNotContainsText('*[data-id="terminalJournal"]', `test running free function + test running free function`) } } diff --git a/apps/remix-ide-e2e/src/types/index.d.ts b/apps/remix-ide-e2e/src/types/index.d.ts index 4c356ca76f..0a793a9b7a 100644 --- a/apps/remix-ide-e2e/src/types/index.d.ts +++ b/apps/remix-ide-e2e/src/types/index.d.ts @@ -69,6 +69,7 @@ declare module 'nightwatch' { switchWorkspace: (workspaceName: string) => NightwatchBrowser switchEnvironment: (provider: string) => NightwatchBrowser connectToExternalHttpProvider: (url: string, identifier: string) => NightwatchBrowser + WaitForElementNotContainsText: (id: string, value: string, timeout: number = 10000) => NightwatchBrowser } export interface NightwatchBrowser { From 487e5d8eeb8e23880b7053894fd14d979bec7b76 Mon Sep 17 00:00:00 2001 From: yann300 Date: Thu, 23 Nov 2023 11:16:58 +0100 Subject: [PATCH 077/163] remove uneeded logs --- libs/remix-simulator/src/VmProxy.ts | 3 --- 1 file changed, 3 deletions(-) diff --git a/libs/remix-simulator/src/VmProxy.ts b/libs/remix-simulator/src/VmProxy.ts index 99f102023f..d0a5e634e2 100644 --- a/libs/remix-simulator/src/VmProxy.ts +++ b/libs/remix-simulator/src/VmProxy.ts @@ -123,7 +123,6 @@ export class VmProxy { this.stateCopy = await this.vm.stateManager.copy() this.incr++ this.processingHash = bufferToHex(data.hash()) - console.log('txWillProcess', this.processingHash ) this.vmTraces[this.processingHash] = { gas: '0x0', return: '0x0', @@ -159,7 +158,6 @@ export class VmProxy { } async txProcessed (data: AfterTxEvent) { - console.log('txProcessed', this.processingHash) if (this.flagDoNotRecordEVMSteps) { this.flagDoNotRecordEVMSteps = false return @@ -262,7 +260,6 @@ export class VmProxy { this.vmTraces[this.processingHash].structLogs.push(step) // Track hardhat console.log call if (step.op === 'STATICCALL' && toHexPaddedString(step.stack[step.stack.length - 2]) === '0x000000000000000000000000000000000000000000636f6e736f6c652e6c6f67') { - console.log('STATICCALL', this.processingHash) const payloadStart = parseInt(toHexPaddedString(step.stack[step.stack.length - 3]), 16) const memory = formatMemory(data.memory) const memoryStr = memory.join('') From c073cb5b4fa3587c2ab43b5d6e91309ce2237c00 Mon Sep 17 00:00:00 2001 From: yann300 Date: Thu, 23 Nov 2023 13:08:30 +0100 Subject: [PATCH 078/163] fix E2E --- .../remix-ide-e2e/src/commands/waitForElementNotContainsText.ts | 2 +- apps/remix-ide-e2e/src/tests/terminal.test.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/remix-ide-e2e/src/commands/waitForElementNotContainsText.ts b/apps/remix-ide-e2e/src/commands/waitForElementNotContainsText.ts index e482a627f1..595897fcdb 100644 --- a/apps/remix-ide-e2e/src/commands/waitForElementNotContainsText.ts +++ b/apps/remix-ide-e2e/src/commands/waitForElementNotContainsText.ts @@ -19,7 +19,7 @@ class WaitForElementNotContainsText extends EventEmitter { waitId = setTimeout(() => { clearInterval(runid) - this.api.assert.fail(`TimeoutError: An error occurred while running .waitForElementContainsText() command on ${id} after ${timeout} milliseconds. expected: ${value} - got: ${currentValue}`) + this.api.assert.ok(true, `"${value}" wasn't found.`) }, timeout) return this } diff --git a/apps/remix-ide-e2e/src/tests/terminal.test.ts b/apps/remix-ide-e2e/src/tests/terminal.test.ts index eb54b471f6..29413a7da0 100644 --- a/apps/remix-ide-e2e/src/tests/terminal.test.ts +++ b/apps/remix-ide-e2e/src/tests/terminal.test.ts @@ -357,7 +357,7 @@ module.exports = { .useCss() .waitForElementContainsText('*[data-id="terminalJournal"]', 'test running free function', 120000) .WaitForElementNotContainsText('*[data-id="terminalJournal"]', `test running free function - test running free function`) + test running free function`, 2000) } } From f78605697417727bb5568f11a8b592db17f9f3a5 Mon Sep 17 00:00:00 2001 From: yann300 Date: Thu, 23 Nov 2023 13:49:45 +0100 Subject: [PATCH 079/163] fix E2E --- .../src/commands/waitForElementNotContainsText.ts | 4 ++-- apps/remix-ide-e2e/src/tests/terminal.test.ts | 2 +- apps/remix-ide-e2e/src/types/index.d.ts | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/apps/remix-ide-e2e/src/commands/waitForElementNotContainsText.ts b/apps/remix-ide-e2e/src/commands/waitForElementNotContainsText.ts index 595897fcdb..8f4696c431 100644 --- a/apps/remix-ide-e2e/src/commands/waitForElementNotContainsText.ts +++ b/apps/remix-ide-e2e/src/commands/waitForElementNotContainsText.ts @@ -1,7 +1,7 @@ import { NightwatchBrowser } from 'nightwatch' import EventEmitter from 'events' -class WaitForElementNotContainsText extends EventEmitter { +class waitForElementNotContainsText extends EventEmitter { command (this: NightwatchBrowser, id: string, value: string, timeout = 10000): NightwatchBrowser { let waitId // eslint-disable-line let currentValue @@ -25,4 +25,4 @@ class WaitForElementNotContainsText extends EventEmitter { } } -module.exports = WaitForElementNotContainsText +module.exports = waitForElementNotContainsText diff --git a/apps/remix-ide-e2e/src/tests/terminal.test.ts b/apps/remix-ide-e2e/src/tests/terminal.test.ts index 29413a7da0..c0b6b52c25 100644 --- a/apps/remix-ide-e2e/src/tests/terminal.test.ts +++ b/apps/remix-ide-e2e/src/tests/terminal.test.ts @@ -356,7 +356,7 @@ module.exports = { }) .useCss() .waitForElementContainsText('*[data-id="terminalJournal"]', 'test running free function', 120000) - .WaitForElementNotContainsText('*[data-id="terminalJournal"]', `test running free function + .waitForElementNotContainsText('*[data-id="terminalJournal"]', `test running free function test running free function`, 2000) } } diff --git a/apps/remix-ide-e2e/src/types/index.d.ts b/apps/remix-ide-e2e/src/types/index.d.ts index 0a793a9b7a..ada7b9cca9 100644 --- a/apps/remix-ide-e2e/src/types/index.d.ts +++ b/apps/remix-ide-e2e/src/types/index.d.ts @@ -69,7 +69,7 @@ declare module 'nightwatch' { switchWorkspace: (workspaceName: string) => NightwatchBrowser switchEnvironment: (provider: string) => NightwatchBrowser connectToExternalHttpProvider: (url: string, identifier: string) => NightwatchBrowser - WaitForElementNotContainsText: (id: string, value: string, timeout: number = 10000) => NightwatchBrowser + waitForElementNotContainsText: (id: string, value: string, timeout: number = 10000) => NightwatchBrowser } export interface NightwatchBrowser { From fbc8784a8c0b0c20662fce2b33791815cee388d0 Mon Sep 17 00:00:00 2001 From: aniket-engg Date: Thu, 23 Nov 2023 16:31:57 +0530 Subject: [PATCH 080/163] added e2e to verify remappings --- apps/remix-ide-e2e/src/tests/ballot.test.ts | 45 +++++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/apps/remix-ide-e2e/src/tests/ballot.test.ts b/apps/remix-ide-e2e/src/tests/ballot.test.ts index d06f2f6f98..37291f5eac 100644 --- a/apps/remix-ide-e2e/src/tests/ballot.test.ts +++ b/apps/remix-ide-e2e/src/tests/ballot.test.ts @@ -92,6 +92,25 @@ module.exports = { }) }, + 'Compile Ballot with remappings set in remappings.txt file #group1': function (browser: NightwatchBrowser) { + browser + .clickLaunchIcon('filePanel') + .click('*[data-id="workspacesMenuDropdown"]') + .click('*[data-id="workspacecreate"]') + .waitForElementVisible('*[data-id="modalDialogCustomPromptTextCreate"]') + .waitForElementVisible('[data-id="fileSystemModalDialogModalFooter-react"] > button') + // eslint-disable-next-line dot-notation + .execute(function () { document.querySelector('*[data-id="modalDialogCustomPromptTextCreate"]')['value'] = 'workspace_remix_default' }) + .waitForElementPresent('[data-id="fileSystemModalDialogModalFooter-react"] .modal-ok') + .execute(function () { (document.querySelector('[data-id="fileSystemModalDialogModalFooter-react"] .modal-ok') as HTMLElement).click() }) + .pause(1000) + .waitForElementVisible('*[data-id="treeViewLitreeViewItemcontracts"]') + .addFile('contracts/lib/storage/src/Storage.sol', { content: retrieverContract }) + .addFile('remappings.txt', { content: 'storage=contracts/lib/storage/src' }) + .addFile('contracts/Retreiver.sol', { content: storageContract }) + .verifyContracts(['Retreiver', 'Storage']) + }, + 'Deploy and use Ballot using external web3 #group2': function (browser: NightwatchBrowser) { browser .openFile('Untitled.sol') @@ -510,4 +529,30 @@ object "Contract" { } } } +` + +const storageContract = ` +pragma solidity >=0.8.2 <0.9.0; + +contract Storage { + + uint256 public number; + + function store(uint256 num) public { + number = num; + } +} +` + +const retrieverContract = ` +pragma solidity >=0.8.2 <0.9.0; + +import "storage/store.sol"; + +contract Retriever is Storage { + + function retrieve() public view returns (uint256){ + return number; + } +} ` \ No newline at end of file From e63a7a6c5ff880646ca19ba9d551fdc633a296ae Mon Sep 17 00:00:00 2001 From: aniket-engg Date: Thu, 23 Nov 2023 22:59:37 +0530 Subject: [PATCH 081/163] fix names --- apps/remix-ide-e2e/src/tests/ballot.test.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/remix-ide-e2e/src/tests/ballot.test.ts b/apps/remix-ide-e2e/src/tests/ballot.test.ts index 37291f5eac..4c76dad9dd 100644 --- a/apps/remix-ide-e2e/src/tests/ballot.test.ts +++ b/apps/remix-ide-e2e/src/tests/ballot.test.ts @@ -105,10 +105,10 @@ module.exports = { .execute(function () { (document.querySelector('[data-id="fileSystemModalDialogModalFooter-react"] .modal-ok') as HTMLElement).click() }) .pause(1000) .waitForElementVisible('*[data-id="treeViewLitreeViewItemcontracts"]') - .addFile('contracts/lib/storage/src/Storage.sol', { content: retrieverContract }) + .addFile('contracts/lib/storage/src/Storage.sol', { content: storageContract}) .addFile('remappings.txt', { content: 'storage=contracts/lib/storage/src' }) - .addFile('contracts/Retreiver.sol', { content: storageContract }) - .verifyContracts(['Retreiver', 'Storage']) + .addFile('contracts/Retriever.sol', { content: retrieverContract }) + .verifyContracts(['Retriever', 'Storage']) }, 'Deploy and use Ballot using external web3 #group2': function (browser: NightwatchBrowser) { From 8f0bc3591eeba9615216189208abf3e97aef951b Mon Sep 17 00:00:00 2001 From: aniket-engg Date: Thu, 23 Nov 2023 23:00:25 +0530 Subject: [PATCH 082/163] fix test name --- apps/remix-ide-e2e/src/tests/ballot.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/remix-ide-e2e/src/tests/ballot.test.ts b/apps/remix-ide-e2e/src/tests/ballot.test.ts index 4c76dad9dd..8ab7948930 100644 --- a/apps/remix-ide-e2e/src/tests/ballot.test.ts +++ b/apps/remix-ide-e2e/src/tests/ballot.test.ts @@ -92,7 +92,7 @@ module.exports = { }) }, - 'Compile Ballot with remappings set in remappings.txt file #group1': function (browser: NightwatchBrowser) { + 'Compile with remappings set in remappings.txt file #group1': function (browser: NightwatchBrowser) { browser .clickLaunchIcon('filePanel') .click('*[data-id="workspacesMenuDropdown"]') From 161c3268d378031397feea97ede014262c855a20 Mon Sep 17 00:00:00 2001 From: aniket-engg Date: Fri, 24 Nov 2023 13:23:35 +0530 Subject: [PATCH 083/163] fix import --- apps/remix-ide-e2e/src/tests/ballot.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/remix-ide-e2e/src/tests/ballot.test.ts b/apps/remix-ide-e2e/src/tests/ballot.test.ts index 8ab7948930..7e9c51e43f 100644 --- a/apps/remix-ide-e2e/src/tests/ballot.test.ts +++ b/apps/remix-ide-e2e/src/tests/ballot.test.ts @@ -547,7 +547,7 @@ contract Storage { const retrieverContract = ` pragma solidity >=0.8.2 <0.9.0; -import "storage/store.sol"; +import "storage/Storage.sol"; contract Retriever is Storage { From 4f65cb524f15d49a38a332aa119a72b61a813eb8 Mon Sep 17 00:00:00 2001 From: yann300 Date: Sun, 19 Nov 2023 12:46:29 +0100 Subject: [PATCH 084/163] use current provider for running script --- apps/remix-ide/src/app/plugins/solidity-script.tsx | 2 +- apps/remix-ide/src/blockchain/blockchain.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/remix-ide/src/app/plugins/solidity-script.tsx b/apps/remix-ide/src/app/plugins/solidity-script.tsx index 36a287689e..66b2366b4f 100644 --- a/apps/remix-ide/src/app/plugins/solidity-script.tsx +++ b/apps/remix-ide/src/app/plugins/solidity-script.tsx @@ -62,7 +62,7 @@ export class SolidityScript extends Plugin { return } const bytecode = '0x' + contract.object.evm.bytecode.object - const web3 = await this.call('blockchain', 'web3VM') + const web3 = await this.call('blockchain', 'web3') const accounts = await this.call('blockchain', 'getAccounts') if (!accounts || accounts.length === 0) { throw new Error('no account available') diff --git a/apps/remix-ide/src/blockchain/blockchain.tsx b/apps/remix-ide/src/blockchain/blockchain.tsx index 69e9035526..779ea27f0a 100644 --- a/apps/remix-ide/src/blockchain/blockchain.tsx +++ b/apps/remix-ide/src/blockchain/blockchain.tsx @@ -23,7 +23,7 @@ const profile = { name: 'blockchain', displayName: 'Blockchain', description: 'Blockchain - Logic', - methods: ['getCode', 'getTransactionReceipt', 'addProvider', 'removeProvider', 'getCurrentFork', 'getAccounts', 'web3VM', 'getProvider'], + methods: ['getCode', 'getTransactionReceipt', 'addProvider', 'removeProvider', 'getCurrentFork', 'getAccounts', 'web3VM', 'web3', 'getProvider'], version: packageJson.version } From 7e18d33da940bc4ba33872f4ee05fcf054bf25ea Mon Sep 17 00:00:00 2001 From: yann300 Date: Sun, 19 Nov 2023 17:25:16 +0100 Subject: [PATCH 085/163] add debugging support --- .../src/app/plugins/solidity-script.tsx | 19 +++++++++++++++++-- .../src/lib/compiler-artefacts.ts | 6 +++++- 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/apps/remix-ide/src/app/plugins/solidity-script.tsx b/apps/remix-ide/src/app/plugins/solidity-script.tsx index 66b2366b4f..5ea9bdaf8c 100644 --- a/apps/remix-ide/src/app/plugins/solidity-script.tsx +++ b/apps/remix-ide/src/app/plugins/solidity-script.tsx @@ -55,6 +55,7 @@ export class SolidityScript extends Plugin { }) } + await this.call('compilerArtefacts', 'saveCompilerAbstract', 'script.sol', compilation) // get the contract const contract = compilation.getContract('SolidityScript') if (!contract) { @@ -73,13 +74,27 @@ export class SolidityScript extends Plugin { from: accounts[0], data: bytecode } - const receipt = await web3.eth.sendTransaction(tx, null, { checkRevertBeforeSending: false, ignoreGasPricing: true }) + let receipt + try { + receipt = await web3.eth.sendTransaction(tx, null, { checkRevertBeforeSending: false, ignoreGasPricing: true }) + } catch (e) { + this.call('terminal', 'logHtml', e.message) + return + } + tx = { from: accounts[0], to: receipt.contractAddress, data: '0x69d4394b' // function remixRun() public } - const receiptCall = await web3.eth.sendTransaction(tx, null, { checkRevertBeforeSending: false, ignoreGasPricing: true }) + let receiptCall + + try { + receiptCall = await web3.eth.sendTransaction(tx, null, { checkRevertBeforeSending: false, ignoreGasPricing: true }) + } catch (e) { + this.call('terminal', 'logHtml', e.message) + return + } const hhlogs = await web3.remix.getHHLogsForTx(receiptCall.transactionHash) diff --git a/libs/remix-core-plugin/src/lib/compiler-artefacts.ts b/libs/remix-core-plugin/src/lib/compiler-artefacts.ts index c37e3a7dab..698b03c0d3 100644 --- a/libs/remix-core-plugin/src/lib/compiler-artefacts.ts +++ b/libs/remix-core-plugin/src/lib/compiler-artefacts.ts @@ -5,7 +5,7 @@ import { CompilerAbstract } from '@remix-project/remix-solidity' const profile = { name: 'compilerArtefacts', - methods: ['get', 'addResolvedContract', 'getCompilerAbstract', 'getAllContractDatas', 'getLastCompilationResult', 'getArtefactsByContractName', 'getContractDataFromAddress', 'getContractDataFromByteCode'], + methods: ['get', 'addResolvedContract', 'getCompilerAbstract', 'getAllContractDatas', 'getLastCompilationResult', 'getArtefactsByContractName', 'getContractDataFromAddress', 'getContractDataFromByteCode', 'saveCompilerAbstract'], events: [], version: '0.0.1' } @@ -24,6 +24,10 @@ export class CompilerArtefacts extends Plugin { this.compilersArtefactsPerFile = {} } + saveCompilerAbstract (file: string, compilerAbstract: CompilerAbstract) { + this.compilersArtefactsPerFile[file] = compilerAbstract + } + onActivation () { const saveCompilationPerFileResult = (file, source, languageVersion, data, input?) => { this.compilersArtefactsPerFile[file] = new CompilerAbstract(languageVersion, data, source, input) From 3b91dfd2ce7e20b1f258c0a926e615c5ab01cc8f Mon Sep 17 00:00:00 2001 From: yann300 Date: Thu, 23 Nov 2023 11:14:12 +0100 Subject: [PATCH 086/163] add E2E --- apps/remix-ide-e2e/src/tests/terminal.test.ts | 43 ++++++++++++++++++- .../editor/src/lib/remix-ui-editor.tsx | 4 +- 2 files changed, 44 insertions(+), 3 deletions(-) diff --git a/apps/remix-ide-e2e/src/tests/terminal.test.ts b/apps/remix-ide-e2e/src/tests/terminal.test.ts index c0b6b52c25..312e71a372 100644 --- a/apps/remix-ide-e2e/src/tests/terminal.test.ts +++ b/apps/remix-ide-e2e/src/tests/terminal.test.ts @@ -342,7 +342,7 @@ module.exports = { .addFile('test.sol', { content: script }) .scrollToLine(3) const path = "//*[@class='view-line' and contains(.,'runSomething') and contains(.,'view')]//span//span[contains(.,'(')]" - const pathRunFunction = `//li//*[@aria-label='Run the free function "runSomething" in the Remix VM']` + const pathRunFunction = `//li//*[@aria-label='Run the free function "runSomething".']` browser.waitForElementVisible('#editorView') .useXpath() .click(path) @@ -358,6 +358,47 @@ module.exports = { .waitForElementContainsText('*[data-id="terminalJournal"]', 'test running free function', 120000) .waitForElementNotContainsText('*[data-id="terminalJournal"]', `test running free function test running free function`, 2000) + }, + + 'Should run a free function while being connected to mainnet #group10': function (browser: NightwatchBrowser) { + const script = ` + import "https://github.com/ensdomains/ens-contracts/blob/master/contracts/utils/NameEncoder.sol"; + import "hardhat/console.sol"; + + abstract contract ENS { + function resolver(bytes32 node) public virtual view returns (Resolver); + } + + abstract contract Resolver { + function addr(bytes32 node) public virtual view returns (address); + } + + function resolve() public view returns(address) { + // Same address for Mainet, Ropsten, Rinkerby, Gorli and other networks; + ENS ens = ENS(0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e); + (,bytes32 node) = NameEncoder.dnsEncodeName("vitalik.eth"); + Resolver resolver = ens.resolver(node); + console.log(resolver.addr(node)); + } + ` + browser + .addFile('test_mainnet.sol', { content: script }) + .scrollToLine(15) + const path = "//*[@class='view-line' and contains(.,'resolve') and contains(.,'view')]//span//span[contains(.,'(')]" + const pathRunFunction = `//li//*[@aria-label='Run the free function "resolve".']` + browser.waitForElementVisible('#editorView') + .useXpath() + .click(path) + .pause(3000) // the parser need to parse the code + .perform(function () { + const actions = this.actions({ async: true }); + return actions + .keyDown(this.Keys.SHIFT) + .keyDown(this.Keys.ALT) + .sendKeys('r') + }) + .useCss() + .waitForElementContainsText('*[data-id="terminalJournal"]', '0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045', 120000) } } diff --git a/libs/remix-ui/editor/src/lib/remix-ui-editor.tsx b/libs/remix-ui/editor/src/lib/remix-ui-editor.tsx index 95a5bb7ff3..cc2638efa4 100644 --- a/libs/remix-ui/editor/src/lib/remix-ui-editor.tsx +++ b/libs/remix-ui/editor/src/lib/remix-ui-editor.tsx @@ -734,7 +734,7 @@ export const EditorUI = (props: EditorUIProps) => { let freeFunctionAction const executeFreeFunctionAction = { id: 'executeFreeFunction', - label: 'Run a free function in the Remix VM', + label: 'Run a free function', contextMenuOrder: 0, // choose the order contextMenuGroupId: 'execute', // create a new grouping precondition: 'freeFunctionCondition', @@ -792,7 +792,7 @@ export const EditorUI = (props: EditorUIProps) => { const { nodesAtPosition } = await retrieveNodesAtPosition(props.editorAPI, props.plugin) const freeFunctionNode = nodesAtPosition.find((node) => node.kind === 'freeFunction') if (freeFunctionNode) { - executeFreeFunctionAction.label = `Run the free function "${freeFunctionNode.name}" in the Remix VM` + executeFreeFunctionAction.label = `Run the free function "${freeFunctionNode.name}"` freeFunctionAction = editor.addAction(executeFreeFunctionAction) } const functionImpl = nodesAtPosition.find((node) => node.kind === 'function') From f59280a4d0934c03e68379e4b67add5196746359 Mon Sep 17 00:00:00 2001 From: yann300 Date: Thu, 23 Nov 2023 11:36:44 +0100 Subject: [PATCH 087/163] fix e2e --- apps/remix-ide-e2e/src/tests/terminal.test.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/remix-ide-e2e/src/tests/terminal.test.ts b/apps/remix-ide-e2e/src/tests/terminal.test.ts index 312e71a372..a9db2b5ba4 100644 --- a/apps/remix-ide-e2e/src/tests/terminal.test.ts +++ b/apps/remix-ide-e2e/src/tests/terminal.test.ts @@ -342,7 +342,7 @@ module.exports = { .addFile('test.sol', { content: script }) .scrollToLine(3) const path = "//*[@class='view-line' and contains(.,'runSomething') and contains(.,'view')]//span//span[contains(.,'(')]" - const pathRunFunction = `//li//*[@aria-label='Run the free function "runSomething".']` + const pathRunFunction = `//li//*[@aria-label='Run the free function "runSomething"']` browser.waitForElementVisible('#editorView') .useXpath() .click(path) @@ -385,7 +385,7 @@ module.exports = { .addFile('test_mainnet.sol', { content: script }) .scrollToLine(15) const path = "//*[@class='view-line' and contains(.,'resolve') and contains(.,'view')]//span//span[contains(.,'(')]" - const pathRunFunction = `//li//*[@aria-label='Run the free function "resolve".']` + const pathRunFunction = `//li//*[@aria-label='Run the free function "resolve"']` browser.waitForElementVisible('#editorView') .useXpath() .click(path) From f4fbb114157ab6e1fb057931c863be5e83c59373 Mon Sep 17 00:00:00 2001 From: yann300 Date: Thu, 23 Nov 2023 14:45:20 +0100 Subject: [PATCH 088/163] e2e: change group --- apps/remix-ide-e2e/src/tests/terminal.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/remix-ide-e2e/src/tests/terminal.test.ts b/apps/remix-ide-e2e/src/tests/terminal.test.ts index a9db2b5ba4..1a40d0b747 100644 --- a/apps/remix-ide-e2e/src/tests/terminal.test.ts +++ b/apps/remix-ide-e2e/src/tests/terminal.test.ts @@ -360,7 +360,7 @@ module.exports = { test running free function`, 2000) }, - 'Should run a free function while being connected to mainnet #group10': function (browser: NightwatchBrowser) { + 'Should run a free function while being connected to mainnet #group11': function (browser: NightwatchBrowser) { const script = ` import "https://github.com/ensdomains/ens-contracts/blob/master/contracts/utils/NameEncoder.sol"; import "hardhat/console.sol"; From 566634810418e1826c774f067cdf969261bd71f3 Mon Sep 17 00:00:00 2001 From: yann300 Date: Thu, 23 Nov 2023 15:50:15 +0100 Subject: [PATCH 089/163] fix e2e --- apps/remix-ide-e2e/src/tests/terminal.test.ts | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/apps/remix-ide-e2e/src/tests/terminal.test.ts b/apps/remix-ide-e2e/src/tests/terminal.test.ts index 1a40d0b747..df65afaec8 100644 --- a/apps/remix-ide-e2e/src/tests/terminal.test.ts +++ b/apps/remix-ide-e2e/src/tests/terminal.test.ts @@ -373,7 +373,7 @@ module.exports = { function addr(bytes32 node) public virtual view returns (address); } - function resolve() public view returns(address) { + function resolveENS() view { // Same address for Mainet, Ropsten, Rinkerby, Gorli and other networks; ENS ens = ENS(0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e); (,bytes32 node) = NameEncoder.dnsEncodeName("vitalik.eth"); @@ -382,14 +382,19 @@ module.exports = { } ` browser + .clickLaunchIcon('udapp') + .switchEnvironment('vm-mainnet-fork') + .clickLaunchIcon('filePanel') .addFile('test_mainnet.sol', { content: script }) - .scrollToLine(15) - const path = "//*[@class='view-line' and contains(.,'resolve') and contains(.,'view')]//span//span[contains(.,'(')]" - const pathRunFunction = `//li//*[@aria-label='Run the free function "resolve"']` - browser.waitForElementVisible('#editorView') + + const path = "//*[@class='view-line' and contains(.,'resolveENS') and contains(.,'view')]//span//span[contains(.,'(')]" + const pathRunFunction = `//li//*[@aria-label='Run the free function "resolveENS"']` + browser.waitForElementVisible('#editorView') + //.waitForElementPresent(pathRunFunction) + .pause(10000) // the parser need to parse the code .useXpath() + .scrollToLine(16) .click(path) - .pause(3000) // the parser need to parse the code .perform(function () { const actions = this.actions({ async: true }); return actions From ea05ffbbcb8c35d99e768dea64879d8b7f9c71e0 Mon Sep 17 00:00:00 2001 From: yann300 Date: Thu, 23 Nov 2023 17:16:28 +0100 Subject: [PATCH 090/163] fix e2e --- apps/remix-ide-e2e/src/tests/terminal.test.ts | 76 +++++++++---------- 1 file changed, 38 insertions(+), 38 deletions(-) diff --git a/apps/remix-ide-e2e/src/tests/terminal.test.ts b/apps/remix-ide-e2e/src/tests/terminal.test.ts index df65afaec8..4889e293e2 100644 --- a/apps/remix-ide-e2e/src/tests/terminal.test.ts +++ b/apps/remix-ide-e2e/src/tests/terminal.test.ts @@ -301,17 +301,13 @@ module.exports = { }) .executeScriptInTerminal(`web3.eth.getCode('0x180587b00c8642e2c7ac3a758712d97e6f7bdcc7')`) // mainnet contract .waitForElementContainsText('*[data-id="terminalJournal"]', '0x608060405260043610601f5760003560e01c80635c60da1b14603157602b565b36602b576029605f565b005b6029605f565b348015603c57600080fd5b5060436097565b6040516001600160a01b03909116815260200160405180910390f35b609560917f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b60d1565b565b600060c97f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b90565b3660008037600080366000845af43d6000803e80801560ef573d6000f35b3d6000fdfea2646970667358221220969dbb4b1d8aec2bb348e26488dc1a33b6bcf0190f567d161312ab7ca9193d8d64736f6c63430008110033', 120000) + .click('*[data-id="terminalClearConsole"]') }, 'Should connect to the sepolia fork and run web3.eth.getCode in the terminal #group9': function (browser: NightwatchBrowser) { browser - .switchEnvironment('vm-custom-fork') - .waitForElementPresent({ - locateStrategy: 'css selector', - selector: 'select[data-id="runTabSelectAccount"] option[value="0xdD870fA1b7C4700F2BD7f44238821C26f7392148"]', - timeout: 240000 - }) - .waitForElementPresent('[data-id="vm-custom-fork-modal-footer-ok-react"]') + .switchEnvironment('vm-custom-fork') + .waitForElementVisible('[data-id="vm-custom-fork-modal-footer-ok-react"]') .execute(() => { (document.querySelector('*[data-id="vm-custom-forkModalDialogContainer-react"] input[data-id="CustomForkNodeUrl"]') as any).focus() }, [], () => { }) @@ -326,41 +322,18 @@ module.exports = { .click('*[data-id="CustomForkEvmType"] [value="merge"]') .pause(5000) .modalFooterOKClick('vm-custom-fork') + .waitForElementPresent({ + locateStrategy: 'css selector', + selector: 'select[data-id="runTabSelectAccount"] option[value="0xdD870fA1b7C4700F2BD7f44238821C26f7392148"]', + timeout: 240000 + }) .pause(5000) .executeScriptInTerminal(`web3.eth.getCode('0x75F509A4eDA030470272DfBAf99A47D587E76709')`) // sepolia contract .waitForElementContainsText('*[data-id="terminalJournal"]', byteCodeInSepolia, 120000) - }, - - 'Should run free function which logs in the terminal #group10': function (browser: NightwatchBrowser) { - const script = `import "hardhat/console.sol"; + .click('*[data-id="terminalClearConsole"]') + }, - function runSomething () view { - console.log("test running free function"); - } - ` - browser - .addFile('test.sol', { content: script }) - .scrollToLine(3) - const path = "//*[@class='view-line' and contains(.,'runSomething') and contains(.,'view')]//span//span[contains(.,'(')]" - const pathRunFunction = `//li//*[@aria-label='Run the free function "runSomething"']` - browser.waitForElementVisible('#editorView') - .useXpath() - .click(path) - .pause(3000) // the parser need to parse the code - .perform(function () { - const actions = this.actions({ async: true }); - return actions - .keyDown(this.Keys.SHIFT) - .keyDown(this.Keys.ALT) - .sendKeys('r') - }) - .useCss() - .waitForElementContainsText('*[data-id="terminalJournal"]', 'test running free function', 120000) - .waitForElementNotContainsText('*[data-id="terminalJournal"]', `test running free function - test running free function`, 2000) - }, - - 'Should run a free function while being connected to mainnet #group11': function (browser: NightwatchBrowser) { + 'Should run a free function while being connected to mainnet #group9': function (browser: NightwatchBrowser) { const script = ` import "https://github.com/ensdomains/ens-contracts/blob/master/contracts/utils/NameEncoder.sol"; import "hardhat/console.sol"; @@ -404,6 +377,33 @@ module.exports = { }) .useCss() .waitForElementContainsText('*[data-id="terminalJournal"]', '0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045', 120000) + }, + + 'Should run free function which logs in the terminal #group10': function (browser: NightwatchBrowser) { + const script = `import "hardhat/console.sol"; + + function runSomething () view { + console.log("test running free function"); + } + ` + browser + .addFile('test.sol', { content: script }) + .scrollToLine(3) + const path = "//*[@class='view-line' and contains(.,'runSomething') and contains(.,'view')]//span//span[contains(.,'(')]" + const pathRunFunction = `//li//*[@aria-label='Run the free function "runSomething"']` + browser.waitForElementVisible('#editorView') + .useXpath() + .click(path) + .pause(3000) // the parser need to parse the code + .perform(function () { + const actions = this.actions({ async: true }); + return actions + .keyDown(this.Keys.SHIFT) + .keyDown(this.Keys.ALT) + .sendKeys('r') + }) + .useCss() + .waitForElementContainsText('*[data-id="terminalJournal"]', 'test running free function', 120000) } } From 8dbf8e1bad9c927686ea082eb45d5d1e098e9de8 Mon Sep 17 00:00:00 2001 From: yann300 Date: Fri, 24 Nov 2023 15:11:07 +0100 Subject: [PATCH 091/163] update rpc nodes url --- apps/remix-ide-e2e/src/tests/terminal.test.ts | 6 +++--- .../remix-ide/src/app/providers/goerli-vm-fork-provider.tsx | 2 +- .../src/app/providers/sepolia-vm-fork-provider.tsx | 2 +- libs/remix-debug/src/init.ts | 5 +++-- 4 files changed, 8 insertions(+), 7 deletions(-) diff --git a/apps/remix-ide-e2e/src/tests/terminal.test.ts b/apps/remix-ide-e2e/src/tests/terminal.test.ts index 4889e293e2..7cf68f8b10 100644 --- a/apps/remix-ide-e2e/src/tests/terminal.test.ts +++ b/apps/remix-ide-e2e/src/tests/terminal.test.ts @@ -306,12 +306,12 @@ module.exports = { 'Should connect to the sepolia fork and run web3.eth.getCode in the terminal #group9': function (browser: NightwatchBrowser) { browser - .switchEnvironment('vm-custom-fork') + .switchEnvironment('vm-custom-fork') .waitForElementVisible('[data-id="vm-custom-fork-modal-footer-ok-react"]') .execute(() => { (document.querySelector('*[data-id="vm-custom-forkModalDialogContainer-react"] input[data-id="CustomForkNodeUrl"]') as any).focus() }, [], () => { }) - .clearValue('*[data-id="CustomForkNodeUrl"]').pause(1000).setValue('*[data-id="CustomForkNodeUrl"]', 'https://remix-sepolia.ethdevops.io') + .clearValue('*[data-id="CustomForkNodeUrl"]').pause(1000).setValue('*[data-id="CustomForkNodeUrl"]', 'https://go.getblock.io/ee42d0a88f314707be11dd799b122cb9') .execute(() => { (document.querySelector('*[data-id="vm-custom-forkModalDialogContainer-react"] input[data-id="CustomForkBlockNumber"]') as any).focus() }, [], () => { }) @@ -355,7 +355,7 @@ module.exports = { } ` browser - .clickLaunchIcon('udapp') + // .clickLaunchIcon('udapp') .switchEnvironment('vm-mainnet-fork') .clickLaunchIcon('filePanel') .addFile('test_mainnet.sol', { content: script }) diff --git a/apps/remix-ide/src/app/providers/goerli-vm-fork-provider.tsx b/apps/remix-ide/src/app/providers/goerli-vm-fork-provider.tsx index 21f7845d33..c78aca825e 100644 --- a/apps/remix-ide/src/app/providers/goerli-vm-fork-provider.tsx +++ b/apps/remix-ide/src/app/providers/goerli-vm-fork-provider.tsx @@ -18,7 +18,7 @@ export class GoerliForkVMProvider extends BasicVMProvider { ) this.blockchain = blockchain this.fork = 'shanghai' - this.nodeUrl = 'https://remix-sepolia.ethdevops.io' + this.nodeUrl = 'https://remix-goerli.ethdevops.io' this.blockNumber = 'latest' } diff --git a/apps/remix-ide/src/app/providers/sepolia-vm-fork-provider.tsx b/apps/remix-ide/src/app/providers/sepolia-vm-fork-provider.tsx index 03d7248adb..b88b4a4439 100644 --- a/apps/remix-ide/src/app/providers/sepolia-vm-fork-provider.tsx +++ b/apps/remix-ide/src/app/providers/sepolia-vm-fork-provider.tsx @@ -18,7 +18,7 @@ export class SepoliaForkVMProvider extends BasicVMProvider { ) this.blockchain = blockchain this.fork = 'shanghai' - this.nodeUrl = 'https://remix-sepolia.ethdevops.io' + this.nodeUrl = 'https://go.getblock.io/ee42d0a88f314707be11dd799b122cb9' this.blockNumber = 'latest' } diff --git a/libs/remix-debug/src/init.ts b/libs/remix-debug/src/init.ts index 2cd616226d..29ba602d87 100644 --- a/libs/remix-debug/src/init.ts +++ b/libs/remix-debug/src/init.ts @@ -21,11 +21,12 @@ export function setProvider (web3, url) { export function web3DebugNode (network) { const web3DebugNodes = { - Main: 'https://eth.getblock.io/68069907-1d3c-466e-a533-a943afd935c6/mainnet', + Main: 'https://go.getblock.io/56f8bc5187aa4ac696348f67545acf38', + Holesky: 'https://go.getblock.io/7b91c53809fb49c787087e02ef84820b', Rinkeby: 'https://remix-rinkeby.ethdevops.io', Ropsten: 'https://remix-ropsten.ethdevops.io', Goerli: 'https://remix-goerli.ethdevops.io', - Sepolia: 'https://remix-sepolia.ethdevops.io' + Sepolia: 'https://go.getblock.io/ee42d0a88f314707be11dd799b122cb9' } if (web3DebugNodes[network]) { return loadWeb3(web3DebugNodes[network]) From ce22c26a34a678d526820037cd0078c35c8d39e0 Mon Sep 17 00:00:00 2001 From: yann300 Date: Fri, 24 Nov 2023 17:47:29 +0100 Subject: [PATCH 092/163] fix e2e --- apps/remix-ide-e2e/src/tests/terminal.test.ts | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/apps/remix-ide-e2e/src/tests/terminal.test.ts b/apps/remix-ide-e2e/src/tests/terminal.test.ts index 7cf68f8b10..0127b830ef 100644 --- a/apps/remix-ide-e2e/src/tests/terminal.test.ts +++ b/apps/remix-ide-e2e/src/tests/terminal.test.ts @@ -216,7 +216,7 @@ module.exports = { .execute(() => { (document.querySelector('*[data-id="basic-http-providerModalDialogContainer-react"] input[data-id="modalDialogCustomPromp"]') as any).focus() }, [], () => { }) - .setValue('[data-id="modalDialogCustomPromp"]', 'https://remix-goerli.ethdevops.io') + .setValue('[data-id="modalDialogCustomPromp"]', 'https://go.getblock.io/ee42d0a88f314707be11dd799b122cb9') .modalFooterOKClick('basic-http-provider') .clickLaunchIcon('filePanel') .openFile('README.txt') @@ -224,11 +224,11 @@ module.exports = { .pause(1000) .executeScriptInTerminal('remix.execute(\'scripts/log_tx_block.js\')') // check if the input of the transaction is being logged (web3 call) - .waitForElementContainsText('*[data-id="terminalJournal"]', '0x775526410000000000000000000000000000000000000000000000000000000000000060464c0335b2f1609abd9de25141c0a3b49db516fc7375970dc737c32b986e88e3000000000000000000000000000000000000000000000000000000000000039e000000000000000000000000000000000000000000000000000000000000000602926b30b10e7a514d92bc71e085f5bff2687fac2856ae43ef7621bf1756fa370516d310bec5727543089be9a4d5f68471174ee528e95a2520b0ca36c2b6c6eb0000000000000000000000000000000000000000000000000000000000046f49036f5e4ea4dd042801c8841e3db8e654124305da0f11824fc1db60c405dbb39f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', 120000) + .waitForElementContainsText('*[data-id="terminalJournal"]', '0x2b0006fa00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004e9e0000000000000000000000000000000000000000000000000000000000004ea373ded44d6900b8b479935bee9c82176261653e334586e0fd282f569357c0777bd9d084474837ac94bf96f2e26590222a2b8e46545657c7cf06ce2833d267bd6f131b5b3fd36cb1ca3e07cf422224df0766d1a677bbdb7ee4cc0d634efa5367a302a94dac422a16b9b8d5c10fe0555924f8189f6b498bef507b1d32e7915bd4df184f51e6d79ae6a1b11d5745ce7d625cecc3bd0dc50af4f999ffb927225f5e5c019b499f5e1fdcbc70c45df61df76013d1b0d45cdf6a267dac1b4620c0db2efd251f6548509c9c69f5bd9d1ee38ac0df0c73be2774f7d2e1fb7ef5129010f29d091e3c48aed0f035fc29804c99927d33ff2a19ff526979355ac50b2542bc5d8f2d41e4f850d5981e0420807469e828b03173b96b757fbaeacda335e11b3ab8b02a48456fab35d41ca26abde751d5fca8ef5e7ba5295278b6e46ce2aab6c10b3d185a6137d3e5c28bb8dd3a797feaf35520fcb949ea074e1869e0011ef01f8162135e44bb797d3d6215ff74ffbee972c97264fc15d11c840e6a7e796dc1a418572f6dbcc842594a558e1a9e3cb7a159284e16fec758bbc303d13edc28fb6d8bb110c3a398e4ded1748da9854eb84679ad0c99bc59bea7956b521db3ed0a9057510cc11365858704989690f0d891af81b213b1f2e91e41e4998a467656eac87e7025ac2840c17f2b106df7d32a0139036bdf5d87344ca37e9ce770e0dbeb5e021d03a7d496a6695eb06d3de9258b43f3883ce155767962b52083504b19d6d609090a2f96e9724902bf1adbf57359ac1dda48a8ffe596b8d95cac1429378769a6ec2ff1c8a9c0bc343b0a6468f36696bfb202cde9f6cd5241b814096d777751b44f0cc2ac9e7ba142227e8d5f2dd8da62573953540da1abce82c59287b2f7a87a111851758c2505d8c1ded6c42a49fc5577451ee56126d2275da490baa645c3bcac0c31dabee7aa35e6cdffb56ac0d952c2583c6f50f906dfb96f5a98c49a5919031cff880bffbe371a50162a7bd0fa0398a5898eaf6ad6db868a7d807846a3592325bb4207d67ad96bac76435368962ba8944d0201c2f620fb29373a6f35c815d101af98111e9b4cc61e8ae77fc63ce375068328ec8d05b49486666fb0f756f99d2fe747c95b2a553965f304a324879393897315d310841f0a200cd156f6ca4ed2', 120000) // check if the logsBloom is being logged (web3 call) - .waitForElementContainsText('*[data-id="terminalJournal"]', '0x00000000000000000000000000100000000000000000020000000000002000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000040000000060000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000100000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000001', 120000) + .waitForElementContainsText('*[data-id="terminalJournal"]', '0x0fbbd94c448fe6949f848380a1d145a974f386624b4b10aa40f9afb212b3ddeb', 120000) // hash of 4757766 // check if the logsBloom is being logged (ethers.js call) - .waitForElementContainsText('*[data-id="terminalJournal"]', '"hex":"0x025cd8"', 120000) + .waitForElementContainsText('*[data-id="terminalJournal"]', '0x9db899cb75888a630ba50a1644c243b83d2eb38525eb828a06a5e8bb5663c0b0', 120000) // hash of 4757767 }, 'Should listen on all transactions #group8': function (browser: NightwatchBrowser) { @@ -817,10 +817,10 @@ const scriptBlockAndTransaction = ` // Right click on the script name and hit "Run" to execute (async () => { try { - web3.eth.getTransaction('0x022ccd55747677ac50f8d9dfd1bf5b843fa2f36438a28c1d0a0958e057bb3e2a').then(console.log) - web3.eth.getBlock(7367447).then(console.log); - let ethersProvider = new ethers.providers.Web3Provider(web3Provider) - ethersProvider.getBlock(7367447).then(console.log) + web3.eth.getTransaction('0x0d2baaed96425861677e87dcf6961d34e2b73ad9a0929c32a05607ca94f98d17').then(console.log).catch(console.error) + web3.eth.getBlock(4757766).then(console.log).catch(console.error) + let ethersProvider = new ethers.providers.Web3Provider(web3Provider) + ethersProvider.getBlock(4757767).then(console.log).catch(console.error) } catch (e) { console.log(e.message) } From 9a9af6f0c93e8e71dc3985c97d6be9209f975a8d Mon Sep 17 00:00:00 2001 From: yann300 Date: Fri, 24 Nov 2023 17:47:48 +0100 Subject: [PATCH 093/163] fix using BigNum --- libs/remix-debug/src/init.ts | 3 ++- libs/remix-lib/src/init.ts | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/libs/remix-debug/src/init.ts b/libs/remix-debug/src/init.ts index 29ba602d87..44ab725769 100644 --- a/libs/remix-debug/src/init.ts +++ b/libs/remix-debug/src/init.ts @@ -1,5 +1,6 @@ 'use strict' import Web3, { Web3PluginBase } from 'web3' +import {toHex} from 'web3-utils' export function extendWeb3 (web3) { if(!web3.debug){ @@ -58,7 +59,7 @@ class Web3DebugPlugin extends Web3PluginBase { public storageRangeAt(txBlockHash, txIndex, address, start, maxSize, cb) { this.requestManager.send({ method: 'debug_storageRangeAt', - params: [txBlockHash, txIndex, address, start, maxSize] + params: [txBlockHash, toHex(txIndex), address, start, maxSize] }) .then(result => cb(null, result)) .catch(error => cb(error)) diff --git a/libs/remix-lib/src/init.ts b/libs/remix-lib/src/init.ts index c3e30f269d..534eabbf47 100644 --- a/libs/remix-lib/src/init.ts +++ b/libs/remix-lib/src/init.ts @@ -1,5 +1,6 @@ 'use strict' import Web3, { Web3PluginBase } from 'web3' +import {toHex} from 'web3-utils' export function extendWeb3 (web3) { if(!web3.debug){ @@ -38,7 +39,7 @@ class Web3DebugPlugin extends Web3PluginBase { public storageRangeAt(txBlockHash, txIndex, address, start, maxSize, cb) { this.requestManager.send({ method: 'debug_storageRangeAt', - params: [txBlockHash, txIndex, address, start, maxSize] + params: [txBlockHash, toHex(txIndex), address, start, maxSize] }) .then(result => cb(null, result)) .catch(error => cb(error)) From cbedfc359713b06924ce9099ea73566f3ae7b7c8 Mon Sep 17 00:00:00 2001 From: yann300 Date: Fri, 24 Nov 2023 17:55:41 +0100 Subject: [PATCH 094/163] use toNumber --- libs/remix-debug/src/init.ts | 4 ++-- libs/remix-lib/src/init.ts | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/libs/remix-debug/src/init.ts b/libs/remix-debug/src/init.ts index 44ab725769..28923df9d0 100644 --- a/libs/remix-debug/src/init.ts +++ b/libs/remix-debug/src/init.ts @@ -1,6 +1,6 @@ 'use strict' import Web3, { Web3PluginBase } from 'web3' -import {toHex} from 'web3-utils' +import {toNumber} from 'web3-utils' export function extendWeb3 (web3) { if(!web3.debug){ @@ -59,7 +59,7 @@ class Web3DebugPlugin extends Web3PluginBase { public storageRangeAt(txBlockHash, txIndex, address, start, maxSize, cb) { this.requestManager.send({ method: 'debug_storageRangeAt', - params: [txBlockHash, toHex(txIndex), address, start, maxSize] + params: [txBlockHash, toNumber(txIndex), address, start, maxSize] }) .then(result => cb(null, result)) .catch(error => cb(error)) diff --git a/libs/remix-lib/src/init.ts b/libs/remix-lib/src/init.ts index 534eabbf47..511534b3f8 100644 --- a/libs/remix-lib/src/init.ts +++ b/libs/remix-lib/src/init.ts @@ -1,6 +1,6 @@ 'use strict' import Web3, { Web3PluginBase } from 'web3' -import {toHex} from 'web3-utils' +import {toNumber} from 'web3-utils' export function extendWeb3 (web3) { if(!web3.debug){ @@ -39,7 +39,7 @@ class Web3DebugPlugin extends Web3PluginBase { public storageRangeAt(txBlockHash, txIndex, address, start, maxSize, cb) { this.requestManager.send({ method: 'debug_storageRangeAt', - params: [txBlockHash, toHex(txIndex), address, start, maxSize] + params: [txBlockHash, toNumber(txIndex), address, start, maxSize] }) .then(result => cb(null, result)) .catch(error => cb(error)) From 2fb4a4bd7f71829cf13a61d3d70ceef215aa3799 Mon Sep 17 00:00:00 2001 From: yann300 Date: Fri, 24 Nov 2023 21:30:43 +0100 Subject: [PATCH 095/163] fix blockNumber --- libs/remix-lib/src/execution/txRunnerVM.ts | 4 ++-- libs/remix-simulator/src/methods/transactions.ts | 4 ++-- libs/remix-simulator/src/provider.ts | 2 +- libs/remix-simulator/src/vm-context.ts | 1 + 4 files changed, 6 insertions(+), 5 deletions(-) diff --git a/libs/remix-lib/src/execution/txRunnerVM.ts b/libs/remix-lib/src/execution/txRunnerVM.ts index c71f8778a0..7604bee0b2 100644 --- a/libs/remix-lib/src/execution/txRunnerVM.ts +++ b/libs/remix-lib/src/execution/txRunnerVM.ts @@ -31,13 +31,13 @@ export class TxRunnerVM { nextNonceForCall: number getVMObject: () => any - constructor (vmaccounts, api, getVMObject) { + constructor (vmaccounts, api, getVMObject, blockNumber) { this.event = new EventManager() this.logsManager = new LogsManager() // has a default for now for backwards compatibility this.getVMObject = getVMObject this.commonContext = this.getVMObject().common - this.blockNumber = 0 + this.blockNumber = blockNumber || 0 this.pendingTxs = {} this.vmaccounts = vmaccounts this.queusTxs = [] diff --git a/libs/remix-simulator/src/methods/transactions.ts b/libs/remix-simulator/src/methods/transactions.ts index 088ad3bf8f..e9600e706c 100644 --- a/libs/remix-simulator/src/methods/transactions.ts +++ b/libs/remix-simulator/src/methods/transactions.ts @@ -32,7 +32,7 @@ export class Transactions { this.tags = {} } - init (accounts) { + init (accounts, blockNumber) { this.accounts = accounts const api = { logMessage: (msg) => { @@ -55,7 +55,7 @@ export class Transactions { } } - this.txRunnerVMInstance = new TxRunnerVM(accounts, api, _ => this.vmContext.vmObject()) + this.txRunnerVMInstance = new TxRunnerVM(accounts, api, _ => this.vmContext.vmObject(), blockNumber) this.txRunnerInstance = new TxRunner(this.txRunnerVMInstance, {}) this.txRunnerInstance.vmaccounts = accounts } diff --git a/libs/remix-simulator/src/provider.ts b/libs/remix-simulator/src/provider.ts index 2d2da213f1..59066c0ab6 100644 --- a/libs/remix-simulator/src/provider.ts +++ b/libs/remix-simulator/src/provider.ts @@ -60,7 +60,7 @@ export class Provider { this.pendingRequests = [] await this.vmContext.init() await this.Accounts.resetAccounts() - this.Transactions.init(this.Accounts.accounts) + this.Transactions.init(this.Accounts.accounts, this.vmContext.blockNumber) this.initialized = true if (this.pendingRequests.length > 0) { this.pendingRequests.map((req) => { diff --git a/libs/remix-simulator/src/vm-context.ts b/libs/remix-simulator/src/vm-context.ts index 09665db83d..605a3bf971 100644 --- a/libs/remix-simulator/src/vm-context.ts +++ b/libs/remix-simulator/src/vm-context.ts @@ -313,6 +313,7 @@ export class VMContext { provider: this.nodeUrl, blockTag: '0x' + block.toString(16) }) + this.blockNumber = block } else { stateManager = new CustomEthersStateManager({ provider: this.nodeUrl, From a6acfb962ab5d834680526d9204be5fecebde210 Mon Sep 17 00:00:00 2001 From: yann300 Date: Mon, 27 Nov 2023 17:09:38 +0100 Subject: [PATCH 096/163] first check the revert reason --- libs/remix-simulator/src/methods/transactions.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/libs/remix-simulator/src/methods/transactions.ts b/libs/remix-simulator/src/methods/transactions.ts index e9600e706c..6018f9fc99 100644 --- a/libs/remix-simulator/src/methods/transactions.ts +++ b/libs/remix-simulator/src/methods/transactions.ts @@ -158,10 +158,7 @@ export class Transactions { this.vmContext.web3().flagNextAsDoNotRecordEvmSteps() processTx(this.txRunnerInstance, payload, true, (error, value: VMexecutionResult) => { if (error) return cb(error) - const result: any = value.result - if (result.execResult && result.execResult.exceptionError && result.execResult.exceptionError.errorType === 'EvmError') { - return cb(result.execResult.exceptionError.error) - } + const result: any = value.result if ((result as any).receipt?.status === '0x0' || (result as any).receipt?.status === 0) { try { const msg = `0x${result.execResult.returnValue.toString('hex') || '0'}` @@ -172,6 +169,9 @@ export class Transactions { return cb(e.message) } } + if (result.execResult && result.execResult.exceptionError && result.execResult.exceptionError.errorType === 'EvmError') { + return cb(result.execResult.exceptionError.error) + } let gasUsed = Number(toNumber(result.execResult.executionGasUsed)) if (result.execResult.gasRefund) { gasUsed += Number(toNumber(result.execResult.gasRefund)) From b4991a05941f6f097872d688e9cea13441615152 Mon Sep 17 00:00:00 2001 From: yann300 Date: Tue, 28 Nov 2023 15:38:15 +0100 Subject: [PATCH 097/163] disable cookie setting matomo --- apps/remix-ide/src/assets/js/loader.js | 1 - .../remix-ui/app/src/lib/remix-app/components/modals/matomo.tsx | 2 -- libs/remix-ui/settings/src/lib/settingsAction.ts | 2 -- 3 files changed, 5 deletions(-) diff --git a/apps/remix-ide/src/assets/js/loader.js b/apps/remix-ide/src/assets/js/loader.js index 8db5546da5..894b38a5d7 100644 --- a/apps/remix-ide/src/assets/js/loader.js +++ b/apps/remix-ide/src/assets/js/loader.js @@ -17,7 +17,6 @@ if (domains[window.location.hostname]) { /* tracker methods like "setCustomDimension" should be called before "trackPageView" */ _paq.push(["setExcludedQueryParams", ["code","gist"]]); _paq.push(["setExcludedReferrers", ["etherscan.io"]]); - _paq.push(['disableCookies']); _paq.push(['enableJSErrorTracking']); _paq.push(['trackPageView']); _paq.push(['enableLinkTracking']); diff --git a/libs/remix-ui/app/src/lib/remix-app/components/modals/matomo.tsx b/libs/remix-ui/app/src/lib/remix-app/components/modals/matomo.tsx index 86777b5a6c..2e0c25d934 100644 --- a/libs/remix-ui/app/src/lib/remix-app/components/modals/matomo.tsx +++ b/libs/remix-ui/app/src/lib/remix-app/components/modals/matomo.tsx @@ -67,8 +67,6 @@ const MatomoDialog = (props) => { const handleModalOkClick = async () => { _paq.push(['forgetUserOptOut']) - // @TODO remove next line when https://github.com/matomo-org/matomo/commit/9e10a150585522ca30ecdd275007a882a70c6df5 is used - document.cookie = 'mtm_consent_removed=; expires=Thu, 01 Jan 1970 00:00:01 GMT;' settings.updateMatomoAnalyticsChoice(true) appManager.call('walkthrough', 'start') setVisible(false) diff --git a/libs/remix-ui/settings/src/lib/settingsAction.ts b/libs/remix-ui/settings/src/lib/settingsAction.ts index 36ec1cbf0b..cc5b096ee0 100644 --- a/libs/remix-ui/settings/src/lib/settingsAction.ts +++ b/libs/remix-ui/settings/src/lib/settingsAction.ts @@ -44,8 +44,6 @@ export const useMatomoAnalytics = (config, checked, dispatch) => { dispatch({ type: 'useMatomoAnalytics', payload: { isChecked: checked, textClass: checked ? textDark : textSecondary } }) if (checked) { _paq.push(['forgetUserOptOut']) - // @TODO remove next line when https://github.com/matomo-org/matomo/commit/9e10a150585522ca30ecdd275007a882a70c6df5 is used - document.cookie = 'mtm_consent_removed=; expires=Thu, 01 Jan 1970 00:00:01 GMT;' } else { _paq.push(['optUserOut']) } From fb61693f231cdceab578e38d1e5b9ec6bce627af Mon Sep 17 00:00:00 2001 From: yann300 Date: Wed, 29 Nov 2023 12:35:00 +0100 Subject: [PATCH 098/163] reenable disableCookies --- apps/remix-ide/src/assets/js/loader.js | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/remix-ide/src/assets/js/loader.js b/apps/remix-ide/src/assets/js/loader.js index 894b38a5d7..8db5546da5 100644 --- a/apps/remix-ide/src/assets/js/loader.js +++ b/apps/remix-ide/src/assets/js/loader.js @@ -17,6 +17,7 @@ if (domains[window.location.hostname]) { /* tracker methods like "setCustomDimension" should be called before "trackPageView" */ _paq.push(["setExcludedQueryParams", ["code","gist"]]); _paq.push(["setExcludedReferrers", ["etherscan.io"]]); + _paq.push(['disableCookies']); _paq.push(['enableJSErrorTracking']); _paq.push(['trackPageView']); _paq.push(['enableLinkTracking']); From 08b953365e4d0d2ade253ed9999196451921402e Mon Sep 17 00:00:00 2001 From: yann300 Date: Wed, 29 Nov 2023 13:00:52 +0100 Subject: [PATCH 099/163] set default value for returnData --- libs/remix-lib/src/execution/txExecution.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/remix-lib/src/execution/txExecution.ts b/libs/remix-lib/src/execution/txExecution.ts index e7eb879c74..3682d6c1db 100644 --- a/libs/remix-lib/src/execution/txExecution.ts +++ b/libs/remix-lib/src/execution/txExecution.ts @@ -89,7 +89,7 @@ export function checkError (execResult, compiledContracts) { msg = '\tThe transaction ran out of gas. Please increase the Gas Limit.\n' ret.error = true } else if (exceptionError === errorCode.REVERT || exceptionError === 'execution reverted') { - const returnData = execResult.errorData + const returnData = execResult.errorData || '0x00000000' const returnDataHex = returnData.slice(2, 10) let customError if (compiledContracts) { From d79cb9340028c85d12527c568e728474ae1bbecc Mon Sep 17 00:00:00 2001 From: yann300 Date: Tue, 28 Nov 2023 10:59:26 +0100 Subject: [PATCH 100/163] add missing matomo keys --- libs/remix-ui/editor/src/lib/remix-ui-editor.tsx | 3 +++ libs/remix-ui/renderer/src/lib/renderer.tsx | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/libs/remix-ui/editor/src/lib/remix-ui-editor.tsx b/libs/remix-ui/editor/src/lib/remix-ui-editor.tsx index cc2638efa4..f53567cb79 100644 --- a/libs/remix-ui/editor/src/lib/remix-ui-editor.tsx +++ b/libs/remix-ui/editor/src/lib/remix-ui-editor.tsx @@ -20,6 +20,7 @@ import './remix-ui-editor.css' import { circomLanguageConfig, circomTokensProvider } from './syntaxes/circom' import { IPosition } from 'monaco-editor' import { RemixInLineCompletionProvider } from './providers/inlineCompletionProvider' +const _paq = (window._paq = window._paq || []) enum MarkerSeverity { Hint = 1, @@ -709,6 +710,7 @@ export const EditorUI = (props: EditorUIProps) => { Generate the documentation for the function ${currentFunction.current} using the Doxygen style syntax ` await props.plugin.call('openaigpt', 'message', message) + _paq.push(['trackEvent', 'ai', 'openai', 'generateDocumentation']) }, } @@ -727,6 +729,7 @@ export const EditorUI = (props: EditorUIProps) => { Explain the function ${currentFunction.current} ` await props.plugin.call('openaigpt', 'message', message) + _paq.push(['trackEvent', 'ai', 'openai', 'explainFunction']) }, } diff --git a/libs/remix-ui/renderer/src/lib/renderer.tsx b/libs/remix-ui/renderer/src/lib/renderer.tsx index 34b956ee7f..f79cec142f 100644 --- a/libs/remix-ui/renderer/src/lib/renderer.tsx +++ b/libs/remix-ui/renderer/src/lib/renderer.tsx @@ -78,7 +78,7 @@ export const Renderer = ({message, opt = {}, plugin}: RendererProps) => { explain why the error occurred and how to fix it. ` await plugin.call('openaigpt', 'message', message) - _paq.push(['trackEvent', 'GPTSupport', 'askGPT']) + _paq.push(['trackEvent', 'ai', 'openai', 'explainSolidityError']) } catch (err) { console.error('unable to askGtp') console.error(err) From b8353be68720b311dd83abac551a0e2343c1abd9 Mon Sep 17 00:00:00 2001 From: yann300 Date: Tue, 28 Nov 2023 12:53:06 +0100 Subject: [PATCH 101/163] use gpt from the terminal --- apps/remix-ide/src/app/plugins/openaigpt.tsx | 6 +++--- apps/remix-ide/src/remixEngine.js | 1 + libs/remix-ui/terminal/src/lib/remix-ui-terminal.tsx | 5 +++++ libs/remix-ui/terminal/src/lib/utils/wrapScript.ts | 2 +- 4 files changed, 10 insertions(+), 4 deletions(-) diff --git a/apps/remix-ide/src/app/plugins/openaigpt.tsx b/apps/remix-ide/src/app/plugins/openaigpt.tsx index 9785fce43e..9d1e121722 100644 --- a/apps/remix-ide/src/app/plugins/openaigpt.tsx +++ b/apps/remix-ide/src/app/plugins/openaigpt.tsx @@ -38,11 +38,11 @@ export class OpenAIGpt extends Plugin { } if (result && result.choices && result.choices.length) { - this.call('terminal', 'log', { type: 'typewritersuccess', value: result.choices[0].message.content }) + this.call('terminal', 'log', { type: 'typewriterwarning', value: result.choices[0].message.content }) } else if (result.error) { - this.call('terminal', 'log', { type: 'typewritersuccess', value: result.error }) + this.call('terminal', 'log', { type: 'typewriterwarning', value: result.error }) } else { - this.call('terminal', 'log', { type: 'typewritersuccess', value: 'No response...' }) + this.call('terminal', 'log', { type: 'typewriterwarning', value: 'No response...' }) } return result.data } diff --git a/apps/remix-ide/src/remixEngine.js b/apps/remix-ide/src/remixEngine.js index 46baa7f6c9..83c043c059 100644 --- a/apps/remix-ide/src/remixEngine.js +++ b/apps/remix-ide/src/remixEngine.js @@ -22,6 +22,7 @@ export class RemixEngine extends Engine { if (name === 'udapp') return { queueTimeout: 60000 * 4 } if (name === 'circuit-compiler') return { queueTimeout: 60000 * 4 } if (name === 'filePanel') return { queueTimeout: 60000 * 20 } + if (name === 'openaigpt') return { queueTimeout: 60000 * 2 } return { queueTimeout: 10000 } } diff --git a/libs/remix-ui/terminal/src/lib/remix-ui-terminal.tsx b/libs/remix-ui/terminal/src/lib/remix-ui-terminal.tsx index 74b9999a2f..f726aef84a 100644 --- a/libs/remix-ui/terminal/src/lib/remix-ui-terminal.tsx +++ b/libs/remix-ui/terminal/src/lib/remix-ui-terminal.tsx @@ -28,6 +28,7 @@ import RenderKnownTransactions from './components/RenderKnownTransactions' // es import parse from 'html-react-parser' import { EMPTY_BLOCK, KNOWN_TRANSACTION, RemixUiTerminalProps, UNKNOWN_TRANSACTION } from './types/terminalTypes' import { wrapScript } from './utils/wrapScript' +const _paq = (window._paq = window._paq || []) /* eslint-disable-next-line */ export interface ClipboardEvent extends SyntheticEvent { @@ -229,6 +230,10 @@ export const RemixUiTerminal = (props: RemixUiTerminalProps) => { try { if (script.trim().startsWith('git')) { // await this.call('git', 'execute', script) code might be used in the future + } else if (script.trim().startsWith('gpt')) { + call('terminal', 'log',{ type: 'warn', value: `> ${script}` }) + await call('openaigpt', 'message', script) + _paq.push(['trackEvent', 'ai', 'openai', 'askFromTerminal']) } else { await call('scriptRunner', 'execute', script) } diff --git a/libs/remix-ui/terminal/src/lib/utils/wrapScript.ts b/libs/remix-ui/terminal/src/lib/utils/wrapScript.ts index 75b1972869..26ded2f581 100644 --- a/libs/remix-ui/terminal/src/lib/utils/wrapScript.ts +++ b/libs/remix-ui/terminal/src/lib/utils/wrapScript.ts @@ -1,5 +1,5 @@ export const wrapScript = (script) => { - const isKnownScript = ['remix.', 'console.', 'git'].some(prefix => script.trim().startsWith(prefix)) + const isKnownScript = ['remix.', 'console.', 'git', 'gpt'].some(prefix => script.trim().startsWith(prefix)) if (isKnownScript) return script return ` try { From 19e84f51e096420942565280c551df0958ac9c70 Mon Sep 17 00:00:00 2001 From: yann300 Date: Tue, 28 Nov 2023 14:43:55 +0100 Subject: [PATCH 102/163] add explanation to the terminal --- libs/remix-ui/terminal/src/lib/terminalWelcome.tsx | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/libs/remix-ui/terminal/src/lib/terminalWelcome.tsx b/libs/remix-ui/terminal/src/lib/terminalWelcome.tsx index cfb456f020..95d4412c5c 100644 --- a/libs/remix-ui/terminal/src/lib/terminalWelcome.tsx +++ b/libs/remix-ui/terminal/src/lib/terminalWelcome.tsx @@ -46,7 +46,7 @@ const TerminalWelcomeMessage = ({packageJson, storage}) => {
  • - web3 version 1.5.2 + web3.js
  • @@ -54,7 +54,9 @@ const TerminalWelcomeMessage = ({packageJson, storage}) => { ethers.js {' '}
  • -
  • remix
  • +
  • + gpt - start a sentence with "gpt" {' '} +
. From 23d8aa88f840baa0cd02f8bf557c08bcbea43e04 Mon Sep 17 00:00:00 2001 From: yann300 Date: Tue, 28 Nov 2023 15:03:10 +0100 Subject: [PATCH 103/163] update label --- libs/remix-ui/terminal/src/lib/terminalWelcome.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/remix-ui/terminal/src/lib/terminalWelcome.tsx b/libs/remix-ui/terminal/src/lib/terminalWelcome.tsx index 95d4412c5c..0dae23fd0b 100644 --- a/libs/remix-ui/terminal/src/lib/terminalWelcome.tsx +++ b/libs/remix-ui/terminal/src/lib/terminalWelcome.tsx @@ -55,7 +55,7 @@ const TerminalWelcomeMessage = ({packageJson, storage}) => { {' '}
  • - gpt - start a sentence with "gpt" {' '} + gpt your question {' '}
  • From ffde11c8dc5c49064b7626a5b400e352bc967eb5 Mon Sep 17 00:00:00 2001 From: yann300 Date: Sun, 19 Nov 2023 09:45:43 +0100 Subject: [PATCH 104/163] fix stripping input/output --- .../editor/src/lib/providers/inlineCompletionProvider.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/libs/remix-ui/editor/src/lib/providers/inlineCompletionProvider.ts b/libs/remix-ui/editor/src/lib/providers/inlineCompletionProvider.ts index 3e42da252b..9cb25c4fa9 100644 --- a/libs/remix-ui/editor/src/lib/providers/inlineCompletionProvider.ts +++ b/libs/remix-ui/editor/src/lib/providers/inlineCompletionProvider.ts @@ -43,8 +43,9 @@ export class RemixInLineCompletionProvider implements monacoTypes.languages.Inli } const generatedText = (result as any).output[0].generated_text as string - // the generated text remove a space from the context. that why we need to remove all the spaces - const clean = generatedText.replace(/ /g, '').replace(word.replace(/ /g, ''), '') + // the generated text remove a space from the context... + let clean = generatedText.replace('@custom:dev-run-script', '@custom:dev-run-script ').replace(word, '') + clean = clean.replace(/_s_/g, ' ') console.log('suggest result', clean) const item: monacoTypes.languages.InlineCompletion = { insertText: clean From b9327b4cae009de1839402b733e147a77ea494dc Mon Sep 17 00:00:00 2001 From: yann300 Date: Sun, 19 Nov 2023 10:25:22 +0100 Subject: [PATCH 105/163] use llm --- .../src/lib/providers/inlineCompletionProvider.ts | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/libs/remix-ui/editor/src/lib/providers/inlineCompletionProvider.ts b/libs/remix-ui/editor/src/lib/providers/inlineCompletionProvider.ts index 9cb25c4fa9..916a48be69 100644 --- a/libs/remix-ui/editor/src/lib/providers/inlineCompletionProvider.ts +++ b/libs/remix-ui/editor/src/lib/providers/inlineCompletionProvider.ts @@ -1,4 +1,5 @@ import { EditorUIProps, monacoTypes } from '@remix-ui/editor'; +import axios, {AxiosResponse} from 'axios' const controller = new AbortController(); const { signal } = controller; const result: string = '' @@ -29,12 +30,26 @@ export class RemixInLineCompletionProvider implements monacoTypes.languages.Inli return; } + const generativeComment = word.match(/\/\/(.*)\n /) + if (generativeComment[1]) { + // use the code generation model + const {data} = await axios.post('https://llm.remix-project.org', {comment: generativeComment[1]}) + const item: monacoTypes.languages.InlineCompletion = { + insertText: data + }; + return { + items: [item], + enableForwardStability: true + } + } + // abort if there is a signal if (token.isCancellationRequested) { console.log('aborted') return } + console.log(word) let result try { result = await this.props.plugin.call('copilot-suggestion', 'suggest', word) From 7b40a99f791e7944ac097650c5f2fc06d0a3b3a2 Mon Sep 17 00:00:00 2001 From: yann300 Date: Sun, 19 Nov 2023 12:34:02 +0100 Subject: [PATCH 106/163] removed uneeded --- .../editor/src/lib/providers/inlineCompletionProvider.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/libs/remix-ui/editor/src/lib/providers/inlineCompletionProvider.ts b/libs/remix-ui/editor/src/lib/providers/inlineCompletionProvider.ts index 916a48be69..fac024eb50 100644 --- a/libs/remix-ui/editor/src/lib/providers/inlineCompletionProvider.ts +++ b/libs/remix-ui/editor/src/lib/providers/inlineCompletionProvider.ts @@ -60,7 +60,6 @@ export class RemixInLineCompletionProvider implements monacoTypes.languages.Inli const generatedText = (result as any).output[0].generated_text as string // the generated text remove a space from the context... let clean = generatedText.replace('@custom:dev-run-script', '@custom:dev-run-script ').replace(word, '') - clean = clean.replace(/_s_/g, ' ') console.log('suggest result', clean) const item: monacoTypes.languages.InlineCompletion = { insertText: clean @@ -91,4 +90,4 @@ export class RemixInLineCompletionProvider implements monacoTypes.languages.Inli toString?(): string { throw new Error('Method not implemented.'); } -} \ No newline at end of file +} From 7dfad0b6e836c48ec8273c1c8adce5d569d4938b Mon Sep 17 00:00:00 2001 From: Joseph Izang Date: Sun, 19 Nov 2023 18:56:48 +0100 Subject: [PATCH 107/163] Update inlineCompletionProvider.ts change url of gpt endpoint --- .../editor/src/lib/providers/inlineCompletionProvider.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/remix-ui/editor/src/lib/providers/inlineCompletionProvider.ts b/libs/remix-ui/editor/src/lib/providers/inlineCompletionProvider.ts index fac024eb50..eab2b72250 100644 --- a/libs/remix-ui/editor/src/lib/providers/inlineCompletionProvider.ts +++ b/libs/remix-ui/editor/src/lib/providers/inlineCompletionProvider.ts @@ -33,7 +33,7 @@ export class RemixInLineCompletionProvider implements monacoTypes.languages.Inli const generativeComment = word.match(/\/\/(.*)\n /) if (generativeComment[1]) { // use the code generation model - const {data} = await axios.post('https://llm.remix-project.org', {comment: generativeComment[1]}) + const {data} = await axios.post('https://gpt-chat.remixproject.org', {comment: generativeComment[1]}) const item: monacoTypes.languages.InlineCompletion = { insertText: data }; From 7533ad575ec10a58daca160968a369e1087e5e25 Mon Sep 17 00:00:00 2001 From: Joseph Izang Date: Sun, 19 Nov 2023 19:04:54 +0100 Subject: [PATCH 108/163] update gpt endpoint for monaco --- .../editor/src/lib/providers/inlineCompletionProvider.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/remix-ui/editor/src/lib/providers/inlineCompletionProvider.ts b/libs/remix-ui/editor/src/lib/providers/inlineCompletionProvider.ts index eab2b72250..a36ce60191 100644 --- a/libs/remix-ui/editor/src/lib/providers/inlineCompletionProvider.ts +++ b/libs/remix-ui/editor/src/lib/providers/inlineCompletionProvider.ts @@ -33,7 +33,7 @@ export class RemixInLineCompletionProvider implements monacoTypes.languages.Inli const generativeComment = word.match(/\/\/(.*)\n /) if (generativeComment[1]) { // use the code generation model - const {data} = await axios.post('https://gpt-chat.remixproject.org', {comment: generativeComment[1]}) + const {data} = await axios.post('https://gpt-chat.remixproject.org/infer', {comment: generativeComment[1]}) const item: monacoTypes.languages.InlineCompletion = { insertText: data }; From a8c0caccc763cf21c4b849a65e6a35e2c8745f81 Mon Sep 17 00:00:00 2001 From: yann300 Date: Sun, 19 Nov 2023 09:45:43 +0100 Subject: [PATCH 109/163] fix stripping input/output --- .../src/lib/providers/inlineCompletionProvider.ts | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/libs/remix-ui/editor/src/lib/providers/inlineCompletionProvider.ts b/libs/remix-ui/editor/src/lib/providers/inlineCompletionProvider.ts index a36ce60191..64037d31b3 100644 --- a/libs/remix-ui/editor/src/lib/providers/inlineCompletionProvider.ts +++ b/libs/remix-ui/editor/src/lib/providers/inlineCompletionProvider.ts @@ -9,7 +9,7 @@ export class RemixInLineCompletionProvider implements monacoTypes.languages.Inli monaco: any constructor(props: any, monaco: any) { this.props = props - this.monaco = monaco + this.monaco = monaco } async provideInlineCompletions(model: monacoTypes.editor.ITextModel, position: monacoTypes.Position, context: monacoTypes.languages.InlineCompletionContext, token: monacoTypes.CancellationToken): Promise> { @@ -53,18 +53,19 @@ export class RemixInLineCompletionProvider implements monacoTypes.languages.Inli let result try { result = await this.props.plugin.call('copilot-suggestion', 'suggest', word) - } catch (err) { + } catch (err) { return } - + const generatedText = (result as any).output[0].generated_text as string // the generated text remove a space from the context... let clean = generatedText.replace('@custom:dev-run-script', '@custom:dev-run-script ').replace(word, '') + clean = clean.replace(/_s_/g, ' ') console.log('suggest result', clean) const item: monacoTypes.languages.InlineCompletion = { insertText: clean }; - + // abort if there is a signal if (token.isCancellationRequested) { console.log('aborted') @@ -77,13 +78,13 @@ export class RemixInLineCompletionProvider implements monacoTypes.languages.Inli } handleItemDidShow?(completions: monacoTypes.languages.InlineCompletions, item: monacoTypes.languages.InlineCompletion, updatedInsertText: string): void { - + } handlePartialAccept?(completions: monacoTypes.languages.InlineCompletions, item: monacoTypes.languages.InlineCompletion, acceptedCharacters: number): void { } freeInlineCompletions(completions: monacoTypes.languages.InlineCompletions): void { - + } groupId?: string; yieldsToGroupIds?: string[]; From 72feb52095b0247a1536dc6269bc88e03c7117b0 Mon Sep 17 00:00:00 2001 From: yann300 Date: Sun, 19 Nov 2023 12:34:02 +0100 Subject: [PATCH 110/163] removed uneeded --- .../editor/src/lib/providers/inlineCompletionProvider.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/libs/remix-ui/editor/src/lib/providers/inlineCompletionProvider.ts b/libs/remix-ui/editor/src/lib/providers/inlineCompletionProvider.ts index 64037d31b3..c57f8810e9 100644 --- a/libs/remix-ui/editor/src/lib/providers/inlineCompletionProvider.ts +++ b/libs/remix-ui/editor/src/lib/providers/inlineCompletionProvider.ts @@ -60,7 +60,6 @@ export class RemixInLineCompletionProvider implements monacoTypes.languages.Inli const generatedText = (result as any).output[0].generated_text as string // the generated text remove a space from the context... let clean = generatedText.replace('@custom:dev-run-script', '@custom:dev-run-script ').replace(word, '') - clean = clean.replace(/_s_/g, ' ') console.log('suggest result', clean) const item: monacoTypes.languages.InlineCompletion = { insertText: clean From 7b422c2a53d4fbd8156e8fc602e49d1b7a162d23 Mon Sep 17 00:00:00 2001 From: yann300 Date: Mon, 20 Nov 2023 08:18:30 +0100 Subject: [PATCH 111/163] fix using regex --- .../editor/src/lib/providers/inlineCompletionProvider.ts | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/libs/remix-ui/editor/src/lib/providers/inlineCompletionProvider.ts b/libs/remix-ui/editor/src/lib/providers/inlineCompletionProvider.ts index c57f8810e9..b3dd48a7e9 100644 --- a/libs/remix-ui/editor/src/lib/providers/inlineCompletionProvider.ts +++ b/libs/remix-ui/editor/src/lib/providers/inlineCompletionProvider.ts @@ -29,11 +29,12 @@ export class RemixInLineCompletionProvider implements monacoTypes.languages.Inli console.log('not a trigger char') return; } - - const generativeComment = word.match(/\/\/(.*)\n /) - if (generativeComment[1]) { + let regex = new RegExp('\/\/(.*)\n ', 'g') + + const generativeComment = [...p.matchAll(regex)] + if (generativeComment && generativeComment.length) { // use the code generation model - const {data} = await axios.post('https://gpt-chat.remixproject.org/infer', {comment: generativeComment[1]}) + const {data} = await axios.post('https://gpt-chat.remixproject.org/infer', {comment: generativeComment[generativeComment.length - 1]}) const item: monacoTypes.languages.InlineCompletion = { insertText: data }; From cb9e4a90155c3642bffb9a33f027d7daad64156f Mon Sep 17 00:00:00 2001 From: yann300 Date: Tue, 21 Nov 2023 10:16:37 +0100 Subject: [PATCH 112/163] fix wrong var name --- .../editor/src/lib/providers/inlineCompletionProvider.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/remix-ui/editor/src/lib/providers/inlineCompletionProvider.ts b/libs/remix-ui/editor/src/lib/providers/inlineCompletionProvider.ts index b3dd48a7e9..525248b82f 100644 --- a/libs/remix-ui/editor/src/lib/providers/inlineCompletionProvider.ts +++ b/libs/remix-ui/editor/src/lib/providers/inlineCompletionProvider.ts @@ -31,7 +31,7 @@ export class RemixInLineCompletionProvider implements monacoTypes.languages.Inli } let regex = new RegExp('\/\/(.*)\n ', 'g') - const generativeComment = [...p.matchAll(regex)] + const generativeComment = [...word.matchAll(regex)] if (generativeComment && generativeComment.length) { // use the code generation model const {data} = await axios.post('https://gpt-chat.remixproject.org/infer', {comment: generativeComment[generativeComment.length - 1]}) From 4944c93dafe13784a3dc60a4d8148bd6e509b732 Mon Sep 17 00:00:00 2001 From: Joseph Izang Date: Thu, 23 Nov 2023 13:57:03 +0100 Subject: [PATCH 113/163] fix eslint issues --- .../editor/src/lib/providers/inlineCompletionProvider.ts | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/libs/remix-ui/editor/src/lib/providers/inlineCompletionProvider.ts b/libs/remix-ui/editor/src/lib/providers/inlineCompletionProvider.ts index 525248b82f..2ebd5e4478 100644 --- a/libs/remix-ui/editor/src/lib/providers/inlineCompletionProvider.ts +++ b/libs/remix-ui/editor/src/lib/providers/inlineCompletionProvider.ts @@ -1,3 +1,4 @@ +/* eslint-disable no-control-regex */ import { EditorUIProps, monacoTypes } from '@remix-ui/editor'; import axios, {AxiosResponse} from 'axios' const controller = new AbortController(); @@ -29,8 +30,9 @@ export class RemixInLineCompletionProvider implements monacoTypes.languages.Inli console.log('not a trigger char') return; } - let regex = new RegExp('\/\/(.*)\n ', 'g') - + // eslint-disable-next-line no-useless-escape + const regex = new RegExp('\/\/(.*)\n ', 'g') + const generativeComment = [...word.matchAll(regex)] if (generativeComment && generativeComment.length) { // use the code generation model @@ -60,7 +62,7 @@ export class RemixInLineCompletionProvider implements monacoTypes.languages.Inli const generatedText = (result as any).output[0].generated_text as string // the generated text remove a space from the context... - let clean = generatedText.replace('@custom:dev-run-script', '@custom:dev-run-script ').replace(word, '') + const clean = generatedText.replace('@custom:dev-run-script', '@custom:dev-run-script ').replace(word, '') console.log('suggest result', clean) const item: monacoTypes.languages.InlineCompletion = { insertText: clean From 405ba952f57bcbef5cd2bf3471960fa8f5e31038 Mon Sep 17 00:00:00 2001 From: Joseph Izang Date: Mon, 27 Nov 2023 18:29:15 +0100 Subject: [PATCH 114/163] patch inlineCompletionProvider --- .../editor/src/lib/providers/inlineCompletionProvider.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/remix-ui/editor/src/lib/providers/inlineCompletionProvider.ts b/libs/remix-ui/editor/src/lib/providers/inlineCompletionProvider.ts index 2ebd5e4478..6ffaba5aa5 100644 --- a/libs/remix-ui/editor/src/lib/providers/inlineCompletionProvider.ts +++ b/libs/remix-ui/editor/src/lib/providers/inlineCompletionProvider.ts @@ -36,7 +36,7 @@ export class RemixInLineCompletionProvider implements monacoTypes.languages.Inli const generativeComment = [...word.matchAll(regex)] if (generativeComment && generativeComment.length) { // use the code generation model - const {data} = await axios.post('https://gpt-chat.remixproject.org/infer', {comment: generativeComment[generativeComment.length - 1]}) + const {data} = await axios.post('https://gpt-chat.remixproject.org/infer', {comment: generativeComment[generativeComment.length - 1][1]}) const item: monacoTypes.languages.InlineCompletion = { insertText: data }; From c978488416f85d1a4cb40eb9bde888bdae7d128a Mon Sep 17 00:00:00 2001 From: yann300 Date: Tue, 28 Nov 2023 10:08:58 +0100 Subject: [PATCH 115/163] do not call the api if the feature isn't activated --- .../copilot/suggestion-service/copilot-suggestion.ts | 11 ++++++++++- .../src/lib/providers/inlineCompletionProvider.ts | 8 ++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/apps/remix-ide/src/app/plugins/copilot/suggestion-service/copilot-suggestion.ts b/apps/remix-ide/src/app/plugins/copilot/suggestion-service/copilot-suggestion.ts index c8cfc0a9be..3b28938732 100644 --- a/apps/remix-ide/src/app/plugins/copilot/suggestion-service/copilot-suggestion.ts +++ b/apps/remix-ide/src/app/plugins/copilot/suggestion-service/copilot-suggestion.ts @@ -6,7 +6,7 @@ const profile = { name: 'copilot-suggestion', displayName: 'copilot-suggestion', description: 'copilot-suggestion', - methods: ['suggest', 'init', 'uninstall', 'status'] + methods: ['suggest', 'init', 'uninstall', 'status', 'isActivate'] } export class CopilotSuggestion extends Plugin { @@ -31,6 +31,15 @@ export class CopilotSuggestion extends Plugin { return this.ready } + async isActivate () { + try { + return await this.call('settings', 'get', 'settings/copilot/suggest/activate') + } catch (e) { + console.error(e) + return false + } + } + async suggest(content: string) { if (!await this.call('settings', 'get', 'settings/copilot/suggest/activate')) return { output: [{ generated_text: ''}]} diff --git a/libs/remix-ui/editor/src/lib/providers/inlineCompletionProvider.ts b/libs/remix-ui/editor/src/lib/providers/inlineCompletionProvider.ts index 6ffaba5aa5..814a56bd1d 100644 --- a/libs/remix-ui/editor/src/lib/providers/inlineCompletionProvider.ts +++ b/libs/remix-ui/editor/src/lib/providers/inlineCompletionProvider.ts @@ -30,6 +30,14 @@ export class RemixInLineCompletionProvider implements monacoTypes.languages.Inli console.log('not a trigger char') return; } + + try { + const isActivate = await this.props.plugin.call('copilot-suggestion', 'isActivate') + if (!isActivate) return + } catch (err) { + return; + } + // eslint-disable-next-line no-useless-escape const regex = new RegExp('\/\/(.*)\n ', 'g') From bdd386b068faacb7f3b837287a10a34f3d6cfe4e Mon Sep 17 00:00:00 2001 From: yann300 Date: Wed, 29 Nov 2023 10:17:13 +0100 Subject: [PATCH 116/163] remove logs --- .../editor/src/lib/providers/inlineCompletionProvider.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/libs/remix-ui/editor/src/lib/providers/inlineCompletionProvider.ts b/libs/remix-ui/editor/src/lib/providers/inlineCompletionProvider.ts index 814a56bd1d..58b926dc2f 100644 --- a/libs/remix-ui/editor/src/lib/providers/inlineCompletionProvider.ts +++ b/libs/remix-ui/editor/src/lib/providers/inlineCompletionProvider.ts @@ -60,7 +60,6 @@ export class RemixInLineCompletionProvider implements monacoTypes.languages.Inli return } - console.log(word) let result try { result = await this.props.plugin.call('copilot-suggestion', 'suggest', word) @@ -71,7 +70,6 @@ export class RemixInLineCompletionProvider implements monacoTypes.languages.Inli const generatedText = (result as any).output[0].generated_text as string // the generated text remove a space from the context... const clean = generatedText.replace('@custom:dev-run-script', '@custom:dev-run-script ').replace(word, '') - console.log('suggest result', clean) const item: monacoTypes.languages.InlineCompletion = { insertText: clean }; From 392f003c49ba0457e1f7e96f377aa1a25b76f101 Mon Sep 17 00:00:00 2001 From: Joseph Izang Date: Wed, 29 Nov 2023 16:11:33 +0100 Subject: [PATCH 117/163] fix gpt response in editor --- .../editor/src/lib/providers/inlineCompletionProvider.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/libs/remix-ui/editor/src/lib/providers/inlineCompletionProvider.ts b/libs/remix-ui/editor/src/lib/providers/inlineCompletionProvider.ts index 58b926dc2f..a947f79af2 100644 --- a/libs/remix-ui/editor/src/lib/providers/inlineCompletionProvider.ts +++ b/libs/remix-ui/editor/src/lib/providers/inlineCompletionProvider.ts @@ -45,8 +45,9 @@ export class RemixInLineCompletionProvider implements monacoTypes.languages.Inli if (generativeComment && generativeComment.length) { // use the code generation model const {data} = await axios.post('https://gpt-chat.remixproject.org/infer', {comment: generativeComment[generativeComment.length - 1][1]}) + const parsedData = JSON.parse(data) const item: monacoTypes.languages.InlineCompletion = { - insertText: data + insertText: parsedData }; return { items: [item], From 8779bcbe5bc37b19ab94cf23465e5250ac5fa792 Mon Sep 17 00:00:00 2001 From: Joseph Izang Date: Wed, 29 Nov 2023 17:03:29 +0100 Subject: [PATCH 118/163] updates --- .../editor/src/lib/providers/inlineCompletionProvider.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/libs/remix-ui/editor/src/lib/providers/inlineCompletionProvider.ts b/libs/remix-ui/editor/src/lib/providers/inlineCompletionProvider.ts index a947f79af2..ac2594876a 100644 --- a/libs/remix-ui/editor/src/lib/providers/inlineCompletionProvider.ts +++ b/libs/remix-ui/editor/src/lib/providers/inlineCompletionProvider.ts @@ -39,13 +39,14 @@ export class RemixInLineCompletionProvider implements monacoTypes.languages.Inli } // eslint-disable-next-line no-useless-escape - const regex = new RegExp('\/\/(.*)\n ', 'g') + const regex = new RegExp('\/\/\/(.*)\n ', 'g') const generativeComment = [...word.matchAll(regex)] if (generativeComment && generativeComment.length) { // use the code generation model const {data} = await axios.post('https://gpt-chat.remixproject.org/infer', {comment: generativeComment[generativeComment.length - 1][1]}) - const parsedData = JSON.parse(data) + const parsedData = JSON.parse(data).trimStart() + console.log('parsedData', parsedData) const item: monacoTypes.languages.InlineCompletion = { insertText: parsedData }; From b6966cd5c0a67cf65a6720f432911a4d7a1f2ff7 Mon Sep 17 00:00:00 2001 From: yann300 Date: Wed, 29 Nov 2023 18:08:07 +0100 Subject: [PATCH 119/163] update model input --- .../src/lib/providers/inlineCompletionProvider.ts | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/libs/remix-ui/editor/src/lib/providers/inlineCompletionProvider.ts b/libs/remix-ui/editor/src/lib/providers/inlineCompletionProvider.ts index ac2594876a..dbe5d06065 100644 --- a/libs/remix-ui/editor/src/lib/providers/inlineCompletionProvider.ts +++ b/libs/remix-ui/editor/src/lib/providers/inlineCompletionProvider.ts @@ -19,7 +19,7 @@ export class RemixInLineCompletionProvider implements monacoTypes.languages.Inli return; } // get text before the position of the completion - const word = model.getValueInRange({ + let word = model.getValueInRange({ startLineNumber: 1, startColumn: 1, endLineNumber: position.lineNumber, @@ -38,13 +38,12 @@ export class RemixInLineCompletionProvider implements monacoTypes.languages.Inli return; } - // eslint-disable-next-line no-useless-escape - const regex = new RegExp('\/\/\/(.*)\n ', 'g') - - const generativeComment = [...word.matchAll(regex)] - if (generativeComment && generativeComment.length) { + word = word.split('\n') + if (!word.length) return + const ask = word[word.length - 2].trimStart() + if (word[word.length - 1] === '' && ask.startsWith('///')) { // use the code generation model - const {data} = await axios.post('https://gpt-chat.remixproject.org/infer', {comment: generativeComment[generativeComment.length - 1][1]}) + const {data} = await axios.post('https://gpt-chat.remixproject.org/infer', {comment: ask.replace('///', ''}) const parsedData = JSON.parse(data).trimStart() console.log('parsedData', parsedData) const item: monacoTypes.languages.InlineCompletion = { @@ -55,7 +54,7 @@ export class RemixInLineCompletionProvider implements monacoTypes.languages.Inli enableForwardStability: true } } - + // abort if there is a signal if (token.isCancellationRequested) { console.log('aborted') From 4411dc2fcd451d88d04e52090b5958abd2a2a392 Mon Sep 17 00:00:00 2001 From: yann300 Date: Wed, 29 Nov 2023 18:24:27 +0100 Subject: [PATCH 120/163] fix parsing model input --- .../lib/providers/inlineCompletionProvider.ts | 36 ++++++++++--------- 1 file changed, 20 insertions(+), 16 deletions(-) diff --git a/libs/remix-ui/editor/src/lib/providers/inlineCompletionProvider.ts b/libs/remix-ui/editor/src/lib/providers/inlineCompletionProvider.ts index dbe5d06065..0a3c17888d 100644 --- a/libs/remix-ui/editor/src/lib/providers/inlineCompletionProvider.ts +++ b/libs/remix-ui/editor/src/lib/providers/inlineCompletionProvider.ts @@ -19,7 +19,7 @@ export class RemixInLineCompletionProvider implements monacoTypes.languages.Inli return; } // get text before the position of the completion - let word = model.getValueInRange({ + const word = model.getValueInRange({ startLineNumber: 1, startColumn: 1, endLineNumber: position.lineNumber, @@ -38,22 +38,26 @@ export class RemixInLineCompletionProvider implements monacoTypes.languages.Inli return; } - word = word.split('\n') - if (!word.length) return - const ask = word[word.length - 2].trimStart() - if (word[word.length - 1] === '' && ask.startsWith('///')) { - // use the code generation model - const {data} = await axios.post('https://gpt-chat.remixproject.org/infer', {comment: ask.replace('///', ''}) - const parsedData = JSON.parse(data).trimStart() - console.log('parsedData', parsedData) - const item: monacoTypes.languages.InlineCompletion = { - insertText: parsedData - }; - return { - items: [item], - enableForwardStability: true + try { + const split = word.split('\n') + if (!split.length) return + const ask = split[split.length - 2].trimStart() + if (split[split.length - 1].trim() === '' && ask.startsWith('///')) { + // use the code generation model + const {data} = await axios.post('https://gpt-chat.remixproject.org/infer', {comment: ask.replace('///', '')}) + const parsedData = JSON.parse(data).trimStart() + console.log('parsedData', parsedData) + const item: monacoTypes.languages.InlineCompletion = { + insertText: parsedData + }; + return { + items: [item], + enableForwardStability: true + } } - } + } catch (e) { + console.error(e) + } // abort if there is a signal if (token.isCancellationRequested) { From 95dd2e56afbfa627e99267dd7cf3056cd98147aa Mon Sep 17 00:00:00 2001 From: aniket-engg Date: Fri, 24 Nov 2023 14:48:30 +0530 Subject: [PATCH 121/163] Add slide to release highlights --- .../tabs/locales/en/homeReleaseDetails.json | 8 ++++++ .../src/app/tabs/locales/en/index.js | 2 ++ .../src/lib/components/homeTabFeatured.tsx | 26 +++++++++++++++++++ 3 files changed, 36 insertions(+) create mode 100644 apps/remix-ide/src/app/tabs/locales/en/homeReleaseDetails.json diff --git a/apps/remix-ide/src/app/tabs/locales/en/homeReleaseDetails.json b/apps/remix-ide/src/app/tabs/locales/en/homeReleaseDetails.json new file mode 100644 index 0000000000..c10a3df3c4 --- /dev/null +++ b/apps/remix-ide/src/app/tabs/locales/en/homeReleaseDetails.json @@ -0,0 +1,8 @@ +{ + "homeReleaseDetails.title": "RELEASE HIGHLIGHTS:", + "homeReleaseDetails.highlight1": "Highlight 1", + "homeReleaseDetails.highlight2": "Highlight 2", + "homeReleaseDetails.highlight3": "Highlight 3", + "homeReleaseDetails.highlight4": "Highlight 4", + "homeReleaseDetails.more": "See Full Changelog" +} diff --git a/apps/remix-ide/src/app/tabs/locales/en/index.js b/apps/remix-ide/src/app/tabs/locales/en/index.js index 1b3d8cd97c..6cf6798601 100644 --- a/apps/remix-ide/src/app/tabs/locales/en/index.js +++ b/apps/remix-ide/src/app/tabs/locales/en/index.js @@ -1,6 +1,7 @@ import debuggerJson from './debugger.json'; import filePanelJson from './filePanel.json'; import homeJson from './home.json'; +import homeReleaseDetailsJson from './homeReleaseDetails.json'; import panelJson from './panel.json'; import pluginManagerJson from './pluginManager.json'; import searchJson from './search.json'; @@ -19,6 +20,7 @@ export default { ...debuggerJson, ...filePanelJson, ...homeJson, + ...homeReleaseDetailsJson, ...panelJson, ...pluginManagerJson, ...searchJson, diff --git a/libs/remix-ui/home-tab/src/lib/components/homeTabFeatured.tsx b/libs/remix-ui/home-tab/src/lib/components/homeTabFeatured.tsx index 29aa86aad4..b71c97fb25 100644 --- a/libs/remix-ui/home-tab/src/lib/components/homeTabFeatured.tsx +++ b/libs/remix-ui/home-tab/src/lib/components/homeTabFeatured.tsx @@ -40,6 +40,32 @@ function HomeTabFeatured() { autoPlaySpeed={15000} dotListClass="position-relative mt-2" > +
    From 0b67a6a92a568e055c6439861be3eb4c448fdbd5 Mon Sep 17 00:00:00 2001 From: aniket-engg Date: Mon, 27 Nov 2023 18:04:30 +0530 Subject: [PATCH 122/163] update release process --- release-process.md | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/release-process.md b/release-process.md index fe0df91b28..91d78bc477 100644 --- a/release-process.md +++ b/release-process.md @@ -17,10 +17,16 @@ Once feature freeze is done, `remix_beta` should be updated latest to the master - `git push -f origin remix_beta` ## Testing -Testing is performed after the Feature Freeze on `remix-beta.ethereum.org`. `build-qa-doc.js` script can be used to generate the list of QA tasks. Instructions to use the file are given in the file itself: https://github.com/ethereum/remix-project/blob/master/build-qa-doc.js#L18 . +Testing is performed after the Feature Freeze on `remix-beta.ethereum.org`. `build-qa-doc.js` script can be used to generate the list of QA tasks. Instructions to use the file are given in the file itself: https://github.com/ethereum/remix-project/blob/master/build-qa-doc.js#L18 Once ready to run, it can be run using the Node.js: `node build-qa-doc.js` +Find out the four release highlights and update in this file: `remix-project/apps/remix-ide/src/app/tabs/locales/en/homeReleaseDetails.json` + +Update the GitHub release link in this file: `remix-project/libs/remix-ui/home-tab/src/lib/components/homeTabFeatured.tsx` at line 44 & 63 + +This will set latest release details in the first slide of `Featured` section. + ## remixd NPM release Once testing is completed, release will start by publishing `remixd`.if required, `remixd` can be also released individually @@ -41,7 +47,9 @@ This command uses `lerna` and is solely responsible for publishing all the remix Once this command has been run, the versions for each remix library will be updated to latest in the libs' package.json file. - Create and merge bump PR to master -## Remix IDE Release +## Remix IDE Release +Make sure release highlights and full changelog link is updated to show them on Home tab. + ### Part 1. Bump the version and update Beta #### Make sure `remix_beta` is up-to-date with `master` branch: @@ -64,8 +72,7 @@ Once this command has been run, the versions for each remix library will be upda - `git pull origin remix_beta` - Create tag: `git tag v`, `` should be same as in package.json of `remix_beta` branch - Push tag: `git push --tags` - - Generate changelog using `build-changelog.js` script as described in the script itself - - Publish a release in GitHub using the generated changelog + - Publish a new release on GitHub and generate automated changelog by selecting the appropriate tag ### Part 2. Update the Remix Live From 7109f445bc3b843329770d717975c2f4ae8402a0 Mon Sep 17 00:00:00 2001 From: aniket-engg Date: Tue, 28 Nov 2023 18:31:00 +0530 Subject: [PATCH 123/163] add previous release details --- .../src/app/tabs/locales/en/homeReleaseDetails.json | 13 ++++++++----- .../home-tab/src/lib/components/homeTabFeatured.tsx | 4 ++-- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/apps/remix-ide/src/app/tabs/locales/en/homeReleaseDetails.json b/apps/remix-ide/src/app/tabs/locales/en/homeReleaseDetails.json index c10a3df3c4..3730e87da7 100644 --- a/apps/remix-ide/src/app/tabs/locales/en/homeReleaseDetails.json +++ b/apps/remix-ide/src/app/tabs/locales/en/homeReleaseDetails.json @@ -1,8 +1,11 @@ { - "homeReleaseDetails.title": "RELEASE HIGHLIGHTS:", - "homeReleaseDetails.highlight1": "Highlight 1", - "homeReleaseDetails.highlight2": "Highlight 2", - "homeReleaseDetails.highlight3": "Highlight 3", - "homeReleaseDetails.highlight4": "Highlight 4", + "homeReleaseDetails.title": "RELEASE HIGHLIGHTS", + "homeReleaseDetails.highlight1": "Circom plugin and ZKP Circom Semaphore template", + "homeReleaseDetails.highlight2": "ERC auto-complete will load the file", + "homeReleaseDetails.highlight3": "The Remix UI now translated into Spanish, French, Italian, and Simplified Chinese", + "homeReleaseDetails.highlight4": "Load Recent Workspaces & Start Coding Button", "homeReleaseDetails.more": "See Full Changelog" } + + + diff --git a/libs/remix-ui/home-tab/src/lib/components/homeTabFeatured.tsx b/libs/remix-ui/home-tab/src/lib/components/homeTabFeatured.tsx index b71c97fb25..dabb4c1d98 100644 --- a/libs/remix-ui/home-tab/src/lib/components/homeTabFeatured.tsx +++ b/libs/remix-ui/home-tab/src/lib/components/homeTabFeatured.tsx @@ -41,7 +41,7 @@ function HomeTabFeatured() { dotListClass="position-relative mt-2" >
    - +
    @@ -60,7 +60,7 @@ function HomeTabFeatured() { className="remixui_home_text btn-sm btn-secondary mt-2 text-decoration-none mb-3" onClick={() => _paq.push(['trackEvent', 'hometab', 'featuredSection', 'seeFullChangelog'])} target="__blank" - href="https://github.com/ethereum/remix-project/releases" + href="https://github.com/ethereum/remix-project/releases/tag/v0.37.0" > From d94d70272b3a535e9ce2c829809ec4b40da4123b Mon Sep 17 00:00:00 2001 From: aniket-engg Date: Tue, 28 Nov 2023 18:38:48 +0530 Subject: [PATCH 124/163] add padding --- .../home-tab/src/lib/components/homeTabFeatured.tsx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/libs/remix-ui/home-tab/src/lib/components/homeTabFeatured.tsx b/libs/remix-ui/home-tab/src/lib/components/homeTabFeatured.tsx index dabb4c1d98..daf3746cf9 100644 --- a/libs/remix-ui/home-tab/src/lib/components/homeTabFeatured.tsx +++ b/libs/remix-ui/home-tab/src/lib/components/homeTabFeatured.tsx @@ -50,10 +50,10 @@ function HomeTabFeatured() {
      -
    • -
    • -
    • -
    • +
    • +
    • +
    • +
    Date: Wed, 29 Nov 2023 13:12:03 +0530 Subject: [PATCH 125/163] update link to medium blog --- libs/remix-ui/home-tab/src/lib/components/homeTabFeatured.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libs/remix-ui/home-tab/src/lib/components/homeTabFeatured.tsx b/libs/remix-ui/home-tab/src/lib/components/homeTabFeatured.tsx index daf3746cf9..de01ce126a 100644 --- a/libs/remix-ui/home-tab/src/lib/components/homeTabFeatured.tsx +++ b/libs/remix-ui/home-tab/src/lib/components/homeTabFeatured.tsx @@ -41,7 +41,7 @@ function HomeTabFeatured() { dotListClass="position-relative mt-2" >
    - +
    @@ -60,7 +60,7 @@ function HomeTabFeatured() { className="remixui_home_text btn-sm btn-secondary mt-2 text-decoration-none mb-3" onClick={() => _paq.push(['trackEvent', 'hometab', 'featuredSection', 'seeFullChangelog'])} target="__blank" - href="https://github.com/ethereum/remix-project/releases/tag/v0.37.0" + href="https://medium.com/remix-ide/remix-release-v0-37-0-dbc750f7ab15" > From 83b37d12847842a77563f510ead05b4231c17de9 Mon Sep 17 00:00:00 2001 From: aniket-engg Date: Wed, 29 Nov 2023 13:22:00 +0530 Subject: [PATCH 126/163] image update --- .../src/assets/img/ht-latest-features.webp | Bin 0 -> 15600 bytes .../src/lib/components/homeTabFeatured.tsx | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 apps/remix-ide/src/assets/img/ht-latest-features.webp diff --git a/apps/remix-ide/src/assets/img/ht-latest-features.webp b/apps/remix-ide/src/assets/img/ht-latest-features.webp new file mode 100644 index 0000000000000000000000000000000000000000..2f0768d4c2029bfda000e0549af6f706d3253386 GIT binary patch literal 15600 zcmVvDp~#f}XFAVzdXNyxs;JlPLAO79Wy+7=4+9kP%%=qi9H?F^i?b@|{cl#&pxA&jj zf0rvC_3!L|*?-o15$hkOzK}j4e1G&m_`ltM#Qxy?^ZyP0U)cBOkNE%JzkmLKe@g$~ z|8@UU`$6!v{>S>Sxo_`Z?*G?*s{8@|qy8iI$KGfAPyPSyp636_f3Wrg{@4DG|F>Ze zp!e<9|NmVd+^>aS>mTnwZ9WLUWIy|R0Du4X(f$Gd|Exc(zs&y%KWu$Sew+Ny@elS} z`%j?noc?S0gZ+Q}ulK)b4w&!he;_^2{u%U}=s(u~y?;&q$Nua558|)n|GEA;en5M- zzzgu7;or|ctp1+=V*g?O58J=_597W4+IRV%@;;zml>B@8xAxE0@9uy4f5Lrx`Y-kG z#h-iry#Jf`0sbNUi~Aq;&)9GAzx95Q{`LLi#rN-@N?TB=#p@OSw&i^*_ z`?dW_a}d2h7paV*u1R@aRd6ED&WE|rdzBXtZT4c3ab82C@R!ThB0nU36%0~^YXsT4 zE~L6RotHmGHCx$1mgj(vxS*5N9BAZu_a^++k(GlW!0Tc|B6!pH%HUrOux;D+1Upt~ zvSx{4o?|wE6LBY>#|=j2khye}wIil+A%^B`IOR#7`GMaQj906lWdgc!0M!b@Cx@cS z2uhsQ6Gj+SMwQ*nN6@iGD5&+U5`g;Qg~p8=*vXb8#+xo#vWMf~FBV^okS%Ay6Mhj# z6OE5SrOQ(+B6!P2cJCW8e%JICoUZ* zY2~{d^_oNnuF(0~uYC2}LEX12H*W`eF!;9}994f1&X4-N-GhG~`TzD_!ZAHQWbmf} zL1~c$Sv)Q_;*tlkknSvKM)OKL29nWaTp28%?m0dIZ=V#wG ziH$aMx3W}h{AN4(Yi7et-%QbrjNHKbXD(LIl?V-UsD-GDo)63!=jPD2JwTaQ9CQcMkurPi&d75Ega>pyi zn?$L~cF~KBNsTsddcow6nOP@{umJx5x)?5hr{DQ_OToo{a1#=#*c~{|W?=QVPoKrD zZ*DoXux@c`Zn!xTznnZ{wTMN4TU7o5L8xgij*a0aULRH2U5UDZSPyF9neU~c$bjF|A=DujK4n7~J-OM3D?$X;Z%YYQ$@DE@M3lm=U zygRh7)W7ISdwvWX-n1&_-m4Y&SB;8&o1&YJ8m^^&O!7P26h&mffuJ?xi2M*b1422O zVyJX;w-AL0D|oKl%3U2Z_DD(ER@3F3ltWAt5 zP>rxPoGfkML{5EeZH(NzfiVdLjnp!f-(K|)1AKj`AlzB8n1OcXnlJ6=PW^Rhb4wDq z&tVSzyP>72-UCJ_>i{i{7Er^KCNtL@`#xu!$Wg*Z! z*Db~pT9g#>t(V?(p+`7m0u&Ue%^)`ovkR;V9^}vc1CeKzq%FdSy^5bFme?j&l`bmk z^Sw8MsL@-w{^RmU3>K(Dh>pzEnds?A4Ssn$Ix#v{)O`wJNhk}h<5x{ z??~Svu=%+wvu!2s22`!7K}}4*10JOHBI3k!q=+?vlNErj4H0+)Yv;7Y|8l-;;W>^B zP0lPjAFz)>jAYkD7MGtWaD-@?=CG4(b^UbHKT;ze{1`CV_l`C8-=}w@cR#wDApN^Q zEk|F$_T$wX7U|V2zfZ_ZW3Maxi!;kKz{vp}kT9YXAAaUne7uf;BAnE0Sk%TuTzIxj zU_M9ry6VGXyv125OK_XI-#5bL!&WZtvTfX*C_VP|bCSd1b@ebLp}>@uauqlT=)}DP zPqEfPmgT?vY-+{;hMKK$36R17Pz-<)EiDOHj-BP_-!K|?E%3bXjWMC}{4HdvcJrUsS{eC1^*~z3?V%! z3LlxnSjm&5*9csG;2b~U@Ob7|dzrluZHf}jg+bJjv+hR!S?F`YiaQRWlo(n|x{5Im z4rWY7@S7jHA&B2pt=G@-HtDFsHuvl~;vJ}PZGtBd@=K3&35@0ab~ju+dL_FUVlhL( zh6sG-H1pGCdvD}l2Cenzq)v^kI(zF6Y6&~=&bX4S>PnUQRWH^RY(DI^4^W<|ugoBG z6WaU@dJ*v-HldA*?GE>)@37DkRV#_VJQzc$mldO;swnCkZ60;$2hEyOf@%e0Whj^b4u6v`@1W_ADn_Ft)BxFf@05(AydS?WC+KBOx z-U?gMuO%Y@%M4j~LrdtQIOFNw?_BhGAjIiTIDBHVVwm}Gq2f-4Htw>kJ>To^z*K2^ zT*@H3QZv4#6ZJLlgZG;+$2=D0Qd`F0U|d#fk^)ScxSzoQVfWZf@1+J7?`bX?FB8*r z?W4IX6@+UaWgB~?DJsG~W)xy+GU-~$V@nx|t0>pA8f?N{^{ih?{t~b3uKh-GRSlp% z-=(>*^ef>PGYjzPB(Xx{WNyf&)ux(Ef?ahilpNJy5-h&cNy5{$sbd81M2d*?0*ez3!$AGJI~x;!|avH$Bky& zm-jzQK_-uO{2??*klZWi;nKk*FZ(cN1y+G#-Nd#BMb{Ix_$N2CDib!<&VX{0&feqT zi8`%M$@MK}*ZUj9FEI7kh2rrh{dwMsL$$F#c;fgdb{zR9dvM%1nnc`Dx*P<6i}FH8 zd2)|Yhf%iNklGO&oq<^gn@8;lbNhP)?Ch|?f9NWl3T$qs8oT3i6t7tO@tO@gGvv@r zXE_Z=gEenyvjisu-Z}e4)fYNz4sNBREVV=PJEbq;{>AHGu5D56JXNd=zPsLflZ^n~ zWi^3e1&iG+ZVj>emc088PCGt|Ss42_Ngr+Esry zj~50q>w4aKUe4kTLe?8NdtDpFur$0A`I?$C9uzazdfbWe{P z2|A>j!VW{}jOo3;U2G9UzqCG}5Tdi9V+NKGGUFM+3%e^w3qj;^QIU_4;ab>Ht z#5jg=Bu@KTs1<8ZkFN9#nzW<3!qgNP1;kQSIFfV7vnxn;HQx3;=!RQ{^QqB4DMt+UjPCMR#NkB=32)_TaSjQKP=#; zc=~JfmR2_|hO*GGX)6&Ubsc6iyzilr5|5GP?w0Cs_%R2|I(CCa(Fufj=n+F~-paPOAP>CZ0 z|4^apzY=;L8_a1EMu$9(033OA#4ej~7>-PJt;NmpPbueK4hT0v?=xwtx5z+^R483}u!382v+{zo%^`SL%{0AGy#^>eTGn zWva_nryW35Ok_;2;h|X*`^8nJ-WUR8(rLZSoMb6A*rn4>gnm1V95LWHiaQqbBbiC+ za8UZfmI>FCzKX`DtD_sZ*4iOJQLy8H0&GkF0xc?eV0BN4Vg{ey`-JQVa4*2bhM#dt zCPENXlNuEw%N=c00029aa47Ih5heXuO(FdCtUPGYiFWUzp}Jv| zbuKJXrNX`8Eq=F3A{1>YP9bQM$k7On1Rcx#`)k;!=Gj>m5&PHH;##L@ETu-ko(dRA z$T1B!twAsaMXCcVUa#0e%DI;gwlgLb?JtS@ryp!v&|=_=T2cUh?%Ot5O^U_#e+9W zO}5`f`1K~-2$>_ebt;Qel=5zYqxE^3UO@MDRd--%(J~6#dOjn@{~Xi{MG@ZuEXzNB zVQKv=`06@>w-)bkyFlxw&D$RiM3;)S0Qf*wT5wi5yBaD_hQ+%Y>vl#!wkKSm#ws47@v0_ne~RWiJ$*+(*?`a(42&1@iZaz# z3tGYisWU(EH(%D(dKAvbvmFZO<9^W)gvfy_J( z+%B^s;_(&FeXiKom5U2jXT|=-?dQXYr5WBzqsJW{>RfrXiYFBhGfi7je#4#(aJ{7X zdM$rOmkeZ{p1S;%Xjc>50*QY|MsT~Y!(iQe4+M-z=c7R{RyT${lk@Hqm z`q64`O@W9HzI0#gb-fKB<-_Wk^%~kbLm!57axQ`f2?8kbO3hQ~*1REKe+%T%El4F-yHwI!ls6wgd2>e=VH;lsdP9A#s!_V|meC0?3F?il!8 zZ)1cHY6ud;zjoJh!twc^ki_QgJ&zmluMTDIHwDF5*#HFQ4=@C!o%K9`6XDG=Z>Eg; z?%@DOmd7S}BcLMaJScVRc7E-1K%S1E`Ii4j4Td26^YpcRw;of$sV;RWq?O?QDX8ME z19#Nd@L8Tm3#%$^gN0WLfKNo$N#=OyCk@`rgAGl(h?zRd3iKO<~6ECI_1QK*;6J4q(lwUID{-Dc<^HC z=r2#^^Z(%f{Z!uJQmmm%&Y4uInYEN=wpcwzkvOsl*t3sDWDgr({An!X2pisR`pD?j z+%+Pnw8fR;sn^<1ZwGr&+T`Qiq-<>M1LmyFRw&&cAL<`wkwnLKo-35?F|kgjVqMOZ zK`n1V7&8~}g!flBI88oCEZ|I<{g*CS%w~}goOi;xbs?WVn+{=9_GaBi=hRc7-keV36PUDs(>3p|??)T)g3_*ng+ibOS{=7LF4FtF(R z$44?6fU5`R7wR&1BLLI(yS3hSbFF!OCoWVC1=D_a3&jbbPx=cB>&1ijYQAOsUPEmu zMA(1hb@KG(sa)s@d!j*D{0JFFSJFPT(Y?ITENXixHeE-0g4{zR$_QqzV&15f=~QRU zsx=Tb!qMZGqr%bNpddyzq#@HJfaL*LY&Xk7%{%|wV<-{-=Gqf^l|J>$cp@*D_YhE3 z`P{jh%@vlIf}rf@k=o>VcmX2{Rb6IkB2`E;3Kr=4Vl6oL=|RV zY4&;Wf;p=mE-_PLbA_ZG?_`ikr3xSl2&9K8-U{#l00yJv@Tcpg3~8vLGkxp9a~MFo z1UOq*t)P6q-6&gRNnzflIpdJS+CG2F_<+U|EWWu#H-8&jIIgh&Q_fv36D7lnttJD{ zimoQGbL@`L&YfoB8k(rDd*qQ>o;N;P;4eUS^%7Ay;Yz7O%nz zn$BvHZ{;pAAKF2+5otEnTAr`!nvWkJRS z60!4fu-4tEJ-2*!2x>c+&LRejrR!06SyTvr5XFC~SheVL>xt}M%96{(FW^(H5Z}1o zVfj*^@!qnYoC9qYe8qalxUq8~&r~U-2F-@wQPB+j0m%VU9|$zZX|2#}UhQlx(2xgs z1@$Ra^KhDTgc*aZrGbBpl2p0KUu|KLYy*Doa}ybr$K= zwS4OxXlPIN_L|Pl^B_2W7?R}C57#|ACVj*acS#hGh8nr@QmHonpkCI|{iC7EWj$Z* zLfztVYcy_`Qga%mhcUl4yMWJP-I_N=ZQ?MV3Y=u>8;$&%gQMxWr&Rxn;7v-RiJ4&h zj2{7lBVzGD0MG*905d2we+T(u&}kv;4f!hjpb&##10C~=KFfov0}S}{l}JAu`~WKx zphZ}n&i?CknZvA0#h{~Bm-IZo+Q9{PJVdUHG^Y8u;X$)<-tAMmMhx2J&S^I$VEYTb zCY3#-mOsTUdK&<65OZ+Mx`femmTU&N*o3s?1cSi2NRex$J))H!(p?d887E1NvnqNG zux0xGMI1mZCHiV}ucVx+6ZkaIK~gHspyzt6lWktE=WST; zxV6Rk2dBAAQGcpa7+Za<({rT(H!AKI@#d4M2l|Ga@&iNRp$vS%5Ry&N^^s(lIw{xxW0u^%yWCNTpl&^MvjV-Gm|vk!#k>>8e&)K4r%>0=+Hcd# zAu$N!^Y!un-R}?PJnv_<56=}MPVtA-cv7dpWBsxRlZ@L~j}Fdvetuvpbu60NtnLR5 z(SD6sP@4pRHm z7j;(Wmb;;CpEVV6C9R`D*5xpwy<~l#YgqSD$gQ}csEM&Jw^%Xa1mLLZv6eI3O``|{ zQ=mPVI}^%Xe@PxY~nu8`f0ZoGu7JkbY*7nBF6EhcsiyOhL(R z*`Mnzg<&QV_t3x0=wp_WA^?(>v#abSJYY^MWczFutGTXL53YQuB}nsjBR>X*X92lC zLPpD?H3QwlU^ODL`IZ?hsPaZ=3>3Z;`pre#1{H{(LX!|qWjuf@gqz})%y(qX_snPW8 zS9&1huWh4-&c=KHlqv0v*HhWyO|jyICBs=rw# zxCNlm>fM(v^i!%39i@UerD7Lzg6UEYZ?d5+ecA7)_E^C3B6-28BL|Sl`nYlw4H`@- z*b-ZTd*YVcIuGGn2^b=@TzFjG=|btG94zYuu+E7Pu~qXH_kmJND+09}6LARoQeQ)+ zrbe6+Ct@pnm)`pCd6qnjH| ziV2+H_NsY(EGYZx^3n@DGM|-Y&qzz}OaOogJOf+AQrH*xqw<@s1U(b$4}_tb=+O}Q z7bQF7Sfp@No(dh0T(j@Ab0<30Q)-zqYxl`|aiJowoX}s(D6r^KLTP8!r01N_qW0Pf zwMB@fLI4>7sacZ(x!G0uVP#h=!j&WGnA1rcc$s|mPaK~wOK*0I=8}^wt;_S5ESw&m zJSshVTBhIHQv{cQ<5k?y)Z*=#yDUeYsdo8T>D;WE{9Ell7Z>?#w!fcNTCjB*>9UOs z(Si|VA6=r7V~{b~LFMS#ThtaL+v6^RMR(Bl`(R7OcXtQ1LVX~nV?kd@oEdth!E&Se zhBn%MD_7^X7Q7Bx!*l@-)}}qd@e-dVFc8=!<715ry7S!ZFct@vVh9FGO6j-Z8iVT$ z_Q=8%F4eg%IYpeGr{K9rxov48aJfO0Ea+}ViQi&(bm#QNvQATvS7R=6M&c;Fg??PNY206?xz9Yf6bm#f6+pmLt(ZHJ{_`ST)}LYTv{fw-fH=o4=) z)qWV#Tj^xlq3^MM$tMt$x!F*_e~grPtssNUMtsKdYnD=`Usd78^`;v|_n-<}HDCa2 zI>a*^2oebIDnl>gO}aM7VJ*TMpt2fB0V60?tNrFqzD{R@QnTL%xq_267e;Eos5b{hf|~Y#*mZ9aZKaVYArq^7&BZSF~`wzT=wIv02*?BDHJI z_9MD(d=z0FzLd}b{~Os`EsDYQ*Q3XDD$ESsaI9g{{fajerDr= zIhY~XizI4ov#J^Ah$|eke{sIiR(-_WuxZcPTO77y(MdHq#7(?`$FCTHvHmZJNJsQP zl#_3ALEv+DvZ5LddxqE6j- zCxz&ewMUBm2M1|xl#)CgZC88!sC&+HqmImwJ8P}T9?aVs!PIz`n*rI{LAlcacVpAi z__ofc!C6SCn0NP5^8b`2aT7YHKjve128tVlZ?Lk`^^;0>p=Uk8uv*$YZ^c0pl$#K} zt4QQL@pgeZ$*Vx}e!cSCb3CmbV>xBTRF&7wefrTcP-6au`pLBCso&6b^02w`Qw0dg z`D6fev?z{x91CecOJl8CLyC7%_BJtw{}jXo>~^g@GB!(aizS!^Vxp@U+W_$ zM@OR5VdR&C8*a^g-oN@=#o9U71(pq8aJaxPa->zif=FGY`CgmPwn4J+BH%19znDwE z(`o?di-tTA)?zXm<$*3vKBIP;S}`VP#)g<0`>&gz-IcS*@N+DS*HY;E7&%6e=N!w; zMhRUh7}3&`ge;wR+WZ)#dkoE{}>` z^MuX&n8rL5&dHQ26v_xU8D}j=ui-MqFb1Q!qg7PzTY%g4oG8%5bz(V*#PJ!#v2T@f zM6$d*MC4tEVd50X<%t%&JRv!zQnmq|G*7kjrx;SB93CkRgSPhYvJNJmTL11($dohg z>DbhAA&mq7$+ecw3WOovru7-usT&n6&?gh40x^V~+GTs(HHBB`o*&OX4$X?!8LBy~ z{kB<_Ex{02n3Jxqe-~x~8akl`Y~w>#44N{v(wb&>PA}0380R9DycS~aMit~&JXU26 zi~xzLl?UqLJ@7MJN_7)@H@X*@`=|Xa+Sd{eU}B$xQE)RRutG4zdYQ#*4_(o?m($Re z2wFnv6I*fwG+YQBxcUtnFlTcqYeqTU{*1G?9-cDzjEPWUvxRa1KYO%8=qt+Zgv6af zt77bz6h#XXb7|+g&os-$@O9UYZOFbofzSLNeQD%;8u(V=J4_OWoF~A80)E>FKTF`W zQwsPFCTk*zMs&&Za&RU%1}$Ky22hlm4pn_X<4%P#XvpF{KsCFAR`=MPQj~l80YuSX z$EW)#&5V662FM|q^FQ_F+I%a^@-xC<-Lfdl{0aO)pRqGQ6%+#nbZXR{%kolINdWy{ zijc?;BCdIA%Kk0o$=y_wy9y)dg64U$Za5rLcCY-^JpX$cRchAfiiQn;7`epc;#1(N z#u-%z-j9s#!Tq@9@jL<}IhxQO&h4|&n%VGLD7@Tacx*7=IyX^G`XD@>b*9fJKjQSY z)BlGctWTYuG1{lqlcso=(oDdo>W?yIe6gn3B|h3F&{`#_x;;M4wI*~nqLa=n%hW5G zT^eF(SAgxJWwUAck)Z#V7`;HgPxJ~%>EIU-UwLPf+geDDmXkgTHAe|Jyx}(lj_@lir&7L&yZ?AwR+vLFuCQC|BNA7Yi17!xH7bG| z&yXSy6O+!Mna2iTb%c`$Ta4Tj(=q3j}DE=P1P>_|I6h&xa-@R?j z{>TSZ0)fkLHZqu&9R_4kY3~C6843u<>Yviy0x~OXS@u%dFN*ZueljZqTnqThPge+8 zEvj_h4_*hvte9PY;0XS^@L@VSDb^B}r{Dj6isUyok+eplq@#lW!Nk=F-#J+q46+BI zB!bnK{e!qR2vc{wRISS3ckiyO2SO6a;+Fi}lUTm8{URiw?k@!L6k~&uCH<;IWwc5w z@YI6k8yZ<`~QjSBW|BBmi5O&|I zli#zRCdpCXFUeb=$52>JV$DX!XnCQY;M~b-H=+P_XoxoFq{#1b&VH;WWuIO>r@q2I z2`E7ZhCT*s!Y*&!HEy@G1Q@{Ay8ZSe14Fs;{2%SFJ`Eg~ef+{tmF8^ zgN=S2@9O-dOy1ukNP>IW2!%1D`$27qTJsBQYsj;fSYG-vO?@G;Q(dv;uTS#oQ>T0S z=HZVL`@0Te%<|g4jFBQ=4s*+XGH{qcg{sE@N{=rWP1wHj%%T{W!v_lb!P4+7<)Ky! z`fH)a@LAf z>G59q5xy;g(=a{3-sQtIz;oJeSG@Wqyyo# znoVZ~kBWBh^SY zQQUJ_oj7{lWw#(%AjQ-Ip1%`ovUr!SZ3TXLi#!a^><&K)jtiipt=lZYeCgO=6l;Bh zCl<@(xM$kJE@67U*uH6B*{tZ}T{`^W^g z`B;qiiYqr&5H)@|(s!OT=ve^sls_rdCjJ_z3*;b}C|SCD4q1o&IiICP6BzTeTg~00 z{{EbPeS(?^BhgEAgl4bnJnES`YhGo}*{|8`8p&mgb<6YZFQ6YKrc|XCz=85tpR=31 zQ(5OD@U-EqEZ|jE*Z4xm`I@f-D8kc=RJ@Z}iK~?LXxuD=a)&0JX7vw2MR~UNA!XDT zf%Ig2n!UOK(};6;T_Aq_kEAk7l6(|mHLRDVtjF_Q{~k&6TO2=1kY&eWf(^LUnKDYXsaCj#r|*Vlz}9uWj<$p)q4yOaf@j@`L4fLMRX0|=vu&w<;Ojv(_5 z7k*DlIGcr>-bHSKxEW{HS*LM?W34IVCb+uwsOs|>tx{o(+}kYy9*qgP8pqZhyJjjw zjiNgkv1(5GMYQhvVor!g4tLKLwcekeh9udm(4qb@RrS232YH~ZE{u{IjEM>A_pK(T zP3}jAgWO5E-8Jk#{dN}%-o(r~L_LNQhc&l@56QBQ-KEDhR_4}&MkttJjX?uPdv>$W zSvHAOdz|yR!W8BYNT!H2i=k0SwTL1RbrX!$10X}@>MJRO~0j6{Ml1MGO_?{ zwlP9&SD=CO~X;6u+exT0R#Bu60+A6jk6<`wCZ-|Zu_QzT+iA; z>)%@R29-l7g!07iVm-l8z^J&%${0sVr}ZHfTnA553#XJ}s-^N+BAL<6VAk&p0U;w! z)3y%89>4U_Gbe2!GY9u2Sr5J9fgjQ`Mk&9(5BM7^oF(=s=cGad+IvBRM!u0gxvhWKfmK{?=6r&=m|2!_5}dz^-|A;PlR1$U=`@rK6z(vY=)u_$uB zOkxxgr3~6ia@4dOvG%x~jXf@pV8OJDpOd8!pXV7{o!paO|NDft1dr}a;_mG!Fi0z~ zy}&&X|6mzUa?9p+)#9U~#iBDTyvgfwi|C!1%9)Z<- z9P;UQo+OI0sMrRm%ZQHLD+?VTHi%UCBmk8Q|TOE zE=`QgL0%~4TlVb8_5Y~v3Q}_x23t#!8|0=pP_o_?)yTCB1JWaS-s$M~+Y3v7r51OM z;pA-Jg^WfzC8&sMIs-_NMCXg()AIt128h_WIv%h|@T%wrv_GB_OTN@Uej)msfpxoM zT?-TgV&t@b_J08>fUxD}d>{Y${h^q%S^dOYzR|91Aweg~U*i3+)x>Z{z5V#t-Cvj! zGi6Hysl^j+Jhqw*U)q4|b;B80rEH`JBv4yes|NOI3db*Re*L~kI~**EN>d2hRSivo znOA=&S=v^$GokCO_cx;Qx-`WG)##f+dL$aQ^e40&wVhO)m00#MKHEH(K*L|76k6&@ zWpt#b-9>`=Mt&hY&jK0O$13cMQDt7HB_ZtK0H%n$hK5MCeh2RmYmzuPF-168duJ1m zY&3z17C4|-7^`ulml{oLUDupqxAS#eXjsf91I0HF2dZY>CoE6czPesT7sV4%3*EMl zzV{s`1xS)j79e|ltrNB;XZz9$!8H{pn2)YEMdC8_1iYc)kXU8pGat#aM^~kdpAlUW zb&&VVhNbD_JVyrG53U8u3ABiJe-W4bZ2s)~tQ4oaNz{&Ll3vN-ZgngC;lLP-aJiA& z56Um6pp#}XjNU}W$!Mx|G?dU`I20Fjo8N@4^RQF#hJ>#bKGWs*rVqj8+ zRQ%hUE>_+91$WiHS@IeUY=RlPHN(*^K*vY+Bwq%TiPtrmmU`Y=2N)h2O$7I|dTa5% zYOwHJC4M0)nIlv-8k6iOwVId5D;Z;;KJfi^7RU ztTi(asDhX7`ruCu^vDpv8b)=eUI+U&_qW;gGFDM3+%PgnsY%{eUlMUT5wWpdEM*As zi9$(-kYp$&lLz!tpKAtGOU zVzIQ^PA>Iv?YU10QzAbDoW6Nq8)$;Pc}+PjDli#`kVa-ND=I;KCCbMk%}5lsYZfL| z<{tk&m=$LH)m{L^e#7WiT+3b3FZ>nwM{w`Z)v1t=R#e`iIATCu+*0OCFsD`o%1XGT zZ?|Bkbm=t&3-h_5eJGUlUyddoN2OU)>}rnAlvby` zC;m@k8stTb>xU6OAO@AJTn*nVLFMw=Q^oY&r6?egeD71_PQ4Dbe~dAhR&?>n);1ja zGXOgQGfUri4lKD!w-4^gtylVc`*LW|htSu5I=|J;_`OD}(t~8;Kgqv`Di;vC#)D86 zncgC1gtq*$TJ{n*PZ2cKKDB({saEIq@V-ep4KFnt6q_ZEtpTjt!l5QILeP@PIlLJzVir!d1|8JGbHH7@DeA%kEXgoDF@@BA^4*fA&=#nbns39JZrmoV zH;^AHVA8jGSQ|;jZDL)!EBUJ;Ihe&Z4*}*H*Z$Nd)#aOH*Q2&e)fykDma^wmdR>x} zc>I+W3`B(?Ea;yTMocP|FT)f)^mhj!?2c?kbzLmO35t$7yXP;S48IMzH>2F(*vR!{ z?JR5MmJV))xDZ{3pK31vy`=6zoWqEi&tR9Rbz_r z7tX#FE-%oXN8(WbMUg7U0?d{!Y6%vDjbryz7qrHiNbD9jd8OsHp209u|=*1OYuhN_z`P+vlJ6h zQKKdr5pGTB-mjhkU!Wo&!yShNNpp3Dxb6IVX~AUfXkKFZ8QwRk%iHi-W6P_bHiJjl z-wtF~h72#t(LyIwb$NgH#C5_X{)ms zDa!i;MW4W4pYC-CDBnUnkp)_ppPJk6zG)uR#3jPQ$0zkZjBQ`mF!TUE!!$e9@{B~` zeEi^?OEYhw;mvwK(VjEYO^_zKJlLfq98hBd83sr6XNK;G?#Vb%C{%NU{Ru&ADRh@{jH=J47_z`6r9fTe7F8zLKibaOI-N+ zUrZtyUYn+!bVnV|7Q>&g^vUg+B7WSYdCkPSmT&(u{Gc~M4t`+%!mLrubim>JA^-Oa z^U0l(U`leYqb2ULgwz{BkYR!56I56hH?1quS;?ZdSv|;{ASlxeiMp7Td0H-nQ5VmT zEk(W_-1>&(b{IW+CKRJ}>}_G%tC1o0ie4jdx;?pW&HT5m84+_k9#s4tP^Go^5bK@@ z>H6-5aF$>IisDl(D*QLaoIXT1E)oH)q!SdRX6!&3SAnmgt6tmQwy|tF-qjSQZuKTK zf^!lBeVA3Sz@eX>m$@`Y&pb3fzSgyu{6%tD0MB|#0Nk(S%LKu) zhBwmHPPk%aIun6hzec%(XCi)ds+=XXc@XCvLeSsbR-K>RkpCp(WYF>0EAw=Wx?T~i zC9QkoGhSg|WUxJXXzIiUEUW$A^2Ec!^{ljmqX7LLrH5+^X}%PmcdU#bPL61Qk%&cT z$BJqyYYrCSnMx#ZKB4N3?{~o}>E{82MR2~tz2@<3%D!Qk5FY|&)H1ldO1k{!QnF7$ zCztqEv^>#mk-?m-MpQ2U#!j0eROs{9Ypi)DLNJWPqdWaVM@B`kTY2ArsUuzTG1>`3 zo0iQb54QrICU;zXt(KLfV3R^FjXNJtrd9V^H<#QyZ4o&oR+m*J#N}Hg2^Oe+g}xW_ zOO_KabQ&JN&s|yyDz2Dj?TK~sY|Z(0lmN11D`;yd0?TLm*sAoW+>zZCDr>_nlcA<0 zj-!(8@NYytpx2cqC&Fx(dh?B6FMOpd$srWv^T0PZ$|68y=H*7uq3-Ew@S1M#dK)u} zVA!(2)A{bpWE*Zg20HtPOir^R3K3UTBf>vEm2=K}rqa8Al&O62aVs5mg@l;X~N zmh$ufg*heI^78%%{TUiUD5JB~qg6__G4M;!!nn)<24Du`Yvm^2uAI)O4lF@<%pxg6 zVQv`BtJsnk#D3g&@YMQTk8C~?T-^OoN3`xlE2e#OIx%#ob6&>$_I1j|WPzmTNu$5Z Kys{U8zyJVi{HGWI literal 0 HcmV?d00001 diff --git a/libs/remix-ui/home-tab/src/lib/components/homeTabFeatured.tsx b/libs/remix-ui/home-tab/src/lib/components/homeTabFeatured.tsx index de01ce126a..0a54faca9e 100644 --- a/libs/remix-ui/home-tab/src/lib/components/homeTabFeatured.tsx +++ b/libs/remix-ui/home-tab/src/lib/components/homeTabFeatured.tsx @@ -42,7 +42,7 @@ function HomeTabFeatured() { >
    - +
    From ccbc9d825c5a31c22ac697902d11b5447f5925d5 Mon Sep 17 00:00:00 2001 From: aniket-engg Date: Wed, 29 Nov 2023 13:24:01 +0530 Subject: [PATCH 127/163] details update --- .../remix-ide/src/app/tabs/locales/en/homeReleaseDetails.json | 4 ++-- release-process.md | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/remix-ide/src/app/tabs/locales/en/homeReleaseDetails.json b/apps/remix-ide/src/app/tabs/locales/en/homeReleaseDetails.json index 3730e87da7..87415085bb 100644 --- a/apps/remix-ide/src/app/tabs/locales/en/homeReleaseDetails.json +++ b/apps/remix-ide/src/app/tabs/locales/en/homeReleaseDetails.json @@ -1,10 +1,10 @@ { - "homeReleaseDetails.title": "RELEASE HIGHLIGHTS", + "homeReleaseDetails.title": "v0.37.0 RELEASE HIGHLIGHTS", "homeReleaseDetails.highlight1": "Circom plugin and ZKP Circom Semaphore template", "homeReleaseDetails.highlight2": "ERC auto-complete will load the file", "homeReleaseDetails.highlight3": "The Remix UI now translated into Spanish, French, Italian, and Simplified Chinese", "homeReleaseDetails.highlight4": "Load Recent Workspaces & Start Coding Button", - "homeReleaseDetails.more": "See Full Changelog" + "homeReleaseDetails.more": "Know More" } diff --git a/release-process.md b/release-process.md index 91d78bc477..a427255efc 100644 --- a/release-process.md +++ b/release-process.md @@ -21,7 +21,7 @@ Testing is performed after the Feature Freeze on `remix-beta.ethereum.org`. `bui Once ready to run, it can be run using the Node.js: `node build-qa-doc.js` -Find out the four release highlights and update in this file: `remix-project/apps/remix-ide/src/app/tabs/locales/en/homeReleaseDetails.json` +Find out the four release highlights and update in this file: `remix-project/apps/remix-ide/src/app/tabs/locales/en/homeReleaseDetails.json` along with the version in `title` string Update the GitHub release link in this file: `remix-project/libs/remix-ui/home-tab/src/lib/components/homeTabFeatured.tsx` at line 44 & 63 From 0f4b1cc73b57f2ee94512ced7719ef1270058cfc Mon Sep 17 00:00:00 2001 From: aniket-engg Date: Thu, 30 Nov 2023 13:36:31 +0530 Subject: [PATCH 128/163] update image for hometab slide --- .../src/assets/img/remi_drums_whatsnew.webp | Bin 0 -> 23158 bytes .../src/lib/components/homeTabFeatured.tsx | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 apps/remix-ide/src/assets/img/remi_drums_whatsnew.webp diff --git a/apps/remix-ide/src/assets/img/remi_drums_whatsnew.webp b/apps/remix-ide/src/assets/img/remi_drums_whatsnew.webp new file mode 100644 index 0000000000000000000000000000000000000000..78b628bd4798e07056f0d62c223c515336bd5bad GIT binary patch literal 23158 zcmV(xKgjX-YONRR~Ce$2pq`3F3`*EPEd zMD%|G_(8pA1w1FPmDqX%Bw((O{xKdtdoJ48yLD#prhN#Vwcg>!Xq#?qx9!M^3Xz}f z8nFx1cYU|XKy9G4TieMRNC0|!&v_e?phpa#qm^8jq}pb$kxOlFcX!$q=h8=PpMmY} zt{^f&tY;Ds$12b*+YSx(z5b7{S)Vi{si3x6DpE(JwndU=C@lqC3QP#*7rByb zt9CQ%gkp~M2{QbD;FQ^po^cnDtI&;#S= zpW*Y*CD>TKe*GK3P@mggcmOQ@1{+x#Q2_wJVXCEe$LF>nZXBM4O;o9(es^Zyd2E4&A8)JesDn5ycfgY*0 zKn2xzEpazb5tAl$cS|Xymjb{F6D{7igwVF`+d6pvwg+LH0x4wy0L3Jr8$$zp1CW!A zoM7Kc_JJn_NX`1AE);b+v7A&E{E2a47yvM{zp~Vy731&1ys(lB|4NtgB2EY>;-&=z z00QE|KmC;eF8p6mmhN$xWCpEQoQ*Sh->!4AhV_Y=7!Ey|7jRzO;x0f(T(fiyX69Hx z2q9GvhALiM8hU_}Oh2865JE^KQYAtm63CZ^IKfi@z{igfHPfSTNF)-W_~_<%UjX)B z7;n>0r7kic;bN!r)_ zd=dFYlx=g|Hh+W7GLmJaR*l;BRDZ+9P&1p6Dp+qOK(?rp>XL2Pm(jg21^ zNfWS@?y%|jr5o%Hq-^YN+5kHVTbhkdfw7UR?~?`Fwv2OI;)km@fF`2VSP znr+*E_KuT~1PG)MgCI#Eid1Ne)m>?k3Ubz6;BUM9NV_dZSTFbS68p@is$Lhij0Wri`o5EFTdKh9ouf()_&e^ zv2AB|NlR1~psYd3N>uU^+74~o3jes+b}1F%@Be>spLA^7R&6VN?(^N<{r^yKsDhKz z$Q_~=;d1LjF@8o!1t52Kx$o>LR}=t(s!q1+6Ry4^Z+(Jod%IiK)?8Dg?Rw_s_a@tx z1=)7nHW!dCO%z=)2tX8qbortzZJXN4`CF1@k(qrAhlXbk<1jNbFDFbp=46>0NM)PM zHaC)6$OUA@iG8T6Y*|+S>aLpQZ<}@`Ns4UCqh=3W#=rac>4c*2dqOjGQEVj1ktCVt z^H=?tg0IQ%RKTrmTU9l2cZev#p#ma{se~S=g#z@azXR<+LwCCm8g1J;s&!s(V_fVb z`AV1iX-T#%MUtfV%-w^kagNiTGVP(((2RR#X6}xN%ybnoRsH{~y5#)XSK5&zNwyV_ zI@{ZR(E$O_871K)gf@~SNsj6RbNt!;8L%MPZQIc02_OJL4$J~I=NBk`EKyGUcjCVj z|NRd?K78#c>n&Cv%|Eqv_%NDs?BK&zAJx&?s}ym9(ovW@limz;Nseq7+AE_!OY z4t)#3H3wDZ-wt!i&X!{eyfDljOo7MR<6v0K zPe*qfBGAg9$4r2`M?0POj;OMAaATQn~$4> zVSNNPfRx4#;saE7 ziU&NhyAMBlq^Cg*FcV(m{x;i|cIt;_Q0oa3K{6KnKBwDmm@|&d3_WoW1@ZuQhgirk zyZ0U+Q`kMY9uuJe$Ze)q$CP5MRuG#U1k9xU3Re#>@!aX3zWV!F^- zN&+$`mI7h8*(D8X5(2mv(cP)jPi*!+m?&mr+rI@un|tqecNdC5RM;8+vm;VKKOTd^ zv^yCBx`>(JZUpxZmGbO!etQ8VWq>#s^?Ll+Gdy1 zU|Gmj!Cgu7y+$zD_e19O9~IIIUAPm^V6>2zkB7BsqNun6#WRFuOsjj{(QjuaaxGde z2v%})Q`CZ6PUw<0V$yT;U>(BOmXab~ZT-pVQVG{)E6`$jjsQLGzC8h>ni;I*V6&wT zJo2F3G^oM{WT{eCk)BfWS4^v$qz$|< zW43-CU(7B*76}#1GT{vj^_>uMd8Pd{B0)7jlftz7EzL#}oA|T3U78u|0Qh9X5BA4| z63w2cf&_aCD24sLw)Vt)k+bx~OHrRsb);y45g;8K>t=tfH7Djqqu{6I#6&IXJX2)? z?0|vUFh2BfW;(WtNCE?Z_km_woe=hk8Yb4w`DsO#v8VsKvk3kc0e{iR)f?rJ4_~t1 z{Z4NlwG2%%+7#gZfaVL@&t;5GMuT2iOJWT#*KXEsuv~zqT0rQzdcviiQjq8L;;{uf zb}ZNeyf2Ws%Zt=)?v3M}ydB8&E9+scK3bWj8XU*SFndEv;Msc01sG$<+YB#vSew>S z*CvD%C@M^w+v$LRf+5b2TMH39ml-~~$5q@-So1Xy{T!yKzl-hyAeUn)41*UOs%nNy;H$0esPsr57+< zo&os3BMwNU&t*^n2urnu%28o?>7fCp$$iX?_oxes%cE@&oT2NrjR4WuWO04AuHN2Ely3NWuB)>(I32ar@}P2dvE-Y79qbpS|Ke8!{EBjHuUAu4rviloAo8#;NM4F zA}vQ+fYJ_UwT>Ysi@2j0_NL0vhp!iJ3e(=u^L+SvaTSKSz4znZMHA6k9^0~6t;sZ8B5jcv5S~AHSOG|De@Ar) z>vEr=4!y>vDZ?ew5}9c#mQZPIFmC`Ssk=MH6CT>yd#}A9Cxx*@{uh~16$htmZGZfa zK0#d`JT_-!M#+XqTMIM8WoqXlGgJz|+0byD`c~(i*|ehr_Nwi+Qd0)8PpA9ofcNl^hCiYh6J#0O;8M?!oJ=8`CmTgd49g;ezcrj=S zHMqdHt=GHy9@)Jk7j40xEc>v!uk?r87LHrP8MyOP5@s6hs7Pt&IX`e*u9 z|B!ldrA;kT(^+v~*kIn~{HHB9jj&C*hs8TV7r_t=f2x$wkX@MDrwHkjgGt~J94Z{DIohi3 z*1tXV21wg@la-?eJHvsy0eaqE7=dBk1?PTdbQ?J)M zAiMymLcjv5jN#QFV1692Bhj`ULCgSey{@zy|SJ*hV`aMn?42NKq ztqzF)FhCJF0&G)0;`}EyLLc>QC=Z4jn!tY&th;~YdCx6X>-Qqmfl$XTpySp4#PaE| zG8zb8!x~ZtAVVAi7^sM{8Uz+}kU~i0yM=t&huLHeOvs=W7flrG9(Wtk=xq!d7O-4TGP%2N-Tg=nlOJuDBY z1?8a|t7xayYK7IT-6{aZl%Wo~waRo1TPn0w?y{!6jZ z#C2L&t2cMW04WCC0Y5;Z97!gwn-UX%;3Zw`07 zHq)A|Or)Cy<7?FUJJ%KAO3@tIkDD@FUY?()44;86@b?w`H27=59JmEr0LF0FN7|-c za;ce>2@izg*?@D;2b&~*X?ISKxzTgqA~nNR6LOX8s6%FC6T>gx`mt#yxfl`Wz}I*9 zkHEEN+p(d+7Vdg$D>O3~>D)lZ-JN3M4)q#7@Us`7hV;P|(xiQc7}5Ch^S8c^7B8a< z{BSjXq~Io%8?en5=kY)V*2dTRKzKo6ACUfix7$MY zPde+^wrGx;iPYNXKt!>JvOcq>!0E!ywc?Dr712kPv1(*9vDP0lkaCN3pJ_3KaZ3P! zMr$$%!CQmXXA2uJ0W8{DCj@^b1gcVlU}SSzW7L#_2jFE1lq(rY;2!w&NeOMBO6D>R z=_;%*>tCz8Ax1bSPiA7MM8Fw4xSy9qM^2Uyw(z!3PWS{eL4~b=oid8uuh?lkvCSaT z5LKy-8H6zOVGe(+0K||0h$*xm+HejifxP9feXpQFC?@eWzKN^o2*JwNd!%7Hz8K1p zcmsA;0Qca17D6hU^r5X+R0wRxJ=G9nD^$BsTw+aJ6Iz*6Z@nhBj~gjmW+YdMgae0=HYpS zN8r&%*VgkI)Rw*WDh)J1M8)TDtYXohMQz6l+L6PM%mw|y%f4t}1MpaztV~27sP)ig zE^iF^Wv_kr7E_stOKh2q{cOzvi;=@V%xPyHHULpVNp7C;Nh&asOOIVb2lFOP0W3M8 z%oq!@vSSe=h-SJlhGvZofW1(WYZUsx%_KW_W;MZD;W4zA?sg<$H8o|7isdUGeJ{-f zz)Ilc3SkMAc|P^}D}_yJwy&;%)Hx$-E#BL>GBQC$@!lJ0m;e|MEx9zT;cJ$Uzwv6% z&Wr>zEqsGVZSef?EL?%#$>s#u;k(v`R471-tq{Gp&qF$fiEVY zW+NIIUELjcFpwt0%0ODwe3h}N7ztCkv2)(6(L6jDdeCA5s=m$rEKPK^C(T&Y7P_yr z0*oRd<8<$v?o%eh1Q>nc`hTYaVFF$Ah5|s=m98(|BhRe9mvL83F?>AZo=7{+Ph}hCIpu%*=S6QuBDCj;1I8RveQGiX9a?Nwf13b#$XwZ8W_`1h zfq@o?hD;MQUc6Mh`UDxV#il>>YmdaNd>th6kldp{YQ9?6xj33`vu{%!zubnG2_~Y#XXPe@ zEkFZ+1`I!NO zs#-&#K?)3BxbiP+_WpDAAtZ6-RTfPYOY{5os8a8R8lj%N-^NS742?B?rIM%PUOWiw zP!UKWiIlH)S0pXJ+H6TL0BOiK)01&eHS!mpSYjf!0H{QPw!zMo|9k6?AxZiBo8C0f z%>VK)@xE@<2*F&fVrbrx@1SUaadaA-b~6+h zc%EMmQ~jl%LZ?2^Q8eC^{LkDu1(#7n*LEtwLMA_N0#snf2O;r#GvoQH9CD*b>PB_{&(A zir@6SEhDA_J3Vow{n)ePi+ew^;{sjAU0dR-6U-m=tG4*SU$1t7%Kq`RAS2KA!5WnK zo$a5Uz~@=UKq!DqBVO3>_=s00b(jpK;Q*bA-`w42ZsT=`PY4zO2`idfm-^p)ZJcuz z1sPu{_{#+DKq@&h>?hRu%O;peD+}v*bahErfF#qO0m~RN2B^YBm?z4^ViuDyMZ9DP zm!jO=EW#6?0oY(DYH-P}2gbJ-A3OAf&>#jrCis*$z$F3nhm0Li3aEThLH2sb=v}8V zoVnuV*2S*Eru{`cIC&+}I!e$wn4~wiuzpTDc=f*~SF}jryDA;e8Oj$_#*xzx3HB zm4C_5ZNoW4oUmBF@pa#P_|Nwz{}9x>VSQ-CazbEOdPx#)?4B8X^Z!p^{~U z(gxu0S4~8Yhc*?Epf`VJ@EIR(xJM_hi#`g;wFVPZa|en`T~q3H=#jLC_Cn-k8BTrg zzbpEpuRd3mXeUe=00gu+cR$}U`J#wCfph#67{*C58m(zK|BRTA}K5Q zR%!J_N;Cf;_~eDT)H3WkY!<5P|{{?rZhzTwljo6_82{qc(!$$m{k+8irOjWho>(EMhgH4pr2|ou9yr$2w;Rt zINbbc$J5|IB8ikh$gA`+e}M)X54LYuPzqvxSEWd~i`vr+mEur5s_tx6V+cY)!q=ka zb0tTBZr47_Oh#U3#Ry1L1@VPu|6ZSy*{gq7N_tWJZCv5EX*P6KdD-CDd)ZyM zy4`|tCw9Qyf9I2Tj;=O7R?`A*!&3=Kw7H5}1Xp#ft++*q1rP{Bw2IbUB>+IcvHgqJ zd#?X_^S!s8G!MoXpvBV=#o%C!n`JFEJQa&rhF?02**}Hssd`q08)t140jLU-aKzTl z%^4=5oEpmruq*zErQiqj(z6|2%m?_XemsLDI&q%}Zt%p7Q+ECxyYX(+eX53aQFLEk z=Md5mVu)Q%fAX76U9)z?MnJxou{~Wu!fKA-bKkSH!U?G9*qMm&)ARAGYHUyZ_K#Wz zWv1yo%K#&rnYjGaCZ}>|{{=*!LxGeD#qM0hL%3$qI(c>aT=9JwG_R ze572uJj?ThpWpSw^tEBs!W>mVBQ_GDb$xl;2*#?tY_JHTxS`{L1>?pN5cjit5qqG; zEoIT9ExUK>B{W@W>L8e@Pk86MkI4@Y3jn+w?e-zA;V~6Cw=JIgE_^rX6Xl-~<(GCm z<%zzZh@r^|NT~L7kp#a)sGIQG6PnXqF~$DtU8NnyYALpU(Yx=c_wSjp{q!(HEfYPWa|HCAAWGkKbi^6&)@c^28Pse{b^<&$ceAM zbHq&$fNDKQR@B(*_+5&5Y(8uljmsMjfEc~+eESm(Rzo)+!>@e&-Rgu5sK&=0{B9T9 zW+1MrdWMw7;fC-lgqBHWQ94P@E-eq^Ge^KXzwYff*YyWl0#|mv?&6LEyY+Opv}b~2YWNO4bc@RjdO_@q*LIC*SdnviS1rN3X!&VbQ~sb zGYc!QhXpMH&YkbSr>aknj$N;rfny5O>W)Wlxd)=uJ*|~%BGFiilVjq4Dl~(*x!x$l zeE6Q5=wA0w{_6Q>%h7i65ho!GLob3lliUpYCfv>Wb)t56zHu4fz^Hl8x4iY{tK+v= zx}Pu&FAfq>S$}iQn-v8S=&aFwX$-{krp9vyD}XP>7bvi`$Dai27a#eKxuMlhP>7FH ziT7`G^M7oBtSL0Y>}KEC71ENNEL)>GtQq%Vy<(Yx|Mt;`RD6V0To@_U__N{WcKi^< z^o?pPX>uZMG8(@t_Up5oX<-F-dyVLyd*r*4r8%5dU7Z4e6D43@(RN1N zV&s5q&r{y95am_ah)+?RKC?~l?DolK&nsu(6sG^vw|?-M`40jDZfzEsZe9wi#?5dk zh0#_CdxiR$hrjEDG;xX7UI|ZlSkdpF1>qSdI(;VNncBBK$&kH}>ntfM1msC@RaD}LkpL_g03cA?&4F&)O z(T_b-wEzYHrYImhY<)O8P-(0(N^AmOe5|H8ES2y{Q};UG`qAgIUmot%Clt;Sxd<>( ztuY#XTs{ZyAr%?^H@}kf$@J5Ye5Z}@8YuBGg%c+k!~aJ;icL#Kwr3zkW}N#URh^>OXz+S%&-AAs{;oW%MfsHN!IrwqlEE%T(zaQPo|%K*gGC8u8D*}mcbV@T)?GC^!Ex?>geN}-TIHaw|qrfN1l4h zF=w5%-;sxuODeN#)C>U%&Shc+##T!9zWVRqJp1kUUjF50>;C(Pwg36U{PurUdso0E z7w&k&r90kp#g2b{JctP3@0X}4&uD%RKmM?HsWoOTOpC{${CURzhgog6UZ(-i7Sd5Y z^)7HT)58qlKfRvG|<6LtlAA~g-XGs!_U3Ct!Ai`u=V?txZm^INx&9?^QUJBD?p40dVI)f(ixf@Ps~ZuBpnXc@n%N2 zPz}!ocdw|fo-#OhkLCSIb-7Mcl;Y1D`1(h6!BQaVrzpoggMus4+S@G7*ag6qPp@rH&?QDv z80StGHsNI&A4~iei`Cde`6v$v9=z=9cb{9*6<&H|g@qmd@7U%vR(67BaXy67(;(D< ziG!`niTq`lG`T71-H8#Vgu~fNu1Tw_Qjkeo2Y7FyR_!JUWH|>BZ0ogqt87b53yO>* z>Z-YNN}nYaL|;waHhXt5N@D{ z$BbtOYSu2y(7Se4!s7Uy0we9xiVYq0TV8xTe+sWIWi%AXKEs}64bFKNOqJfh^a+EJ zlhtX><%cT_MUw6{g1 zPbr-4m_bb+7ZQK06KS5oM)wN-urHcMo>5lYizL7JvdJ;3t+Z}0@)q)Wo@Zy%TnS~q z<4?NMVZ;z)TP|C9e}X8>pSIU&I|*V|4ngNl1h;Dr{PXUXdu2h6Ml{a? zm4CTF_+Ov>e^is41xh@J>YK3Dt6t#OC8+|GkyvZ?_#}ljXzh09Hy70aK;rb1n~&rY zSXp1KKyUZv-Q?tJQeO5c;b;d+8%|Kqs^&K=VaD zc_~p`ny9P)69&l1=ehOdE&${-pW5$PJ6JU1%jzkVf}DYMNf09r-FfvR`K1+1I)uaU z*0Qp4PjpWMNT5G=mTmLHPN2FtkwYa5qN+LXO~zIbea9UJl+QnL{fiUe{U((_ENTtk zAY{4xIa&I`-)iGy$L2o03jmky^OTGCc~l-BQ3@v?#V|;N7!ze+Vm*KTqwK43yx}tf z0v_AB3jjsuWgf5f~^E&A!Azk+2MyzJowSt<8ATP zRd7{UC?@uB2o0oiBUUKN0Fg418E5_b8*0AZ zQ0fXf?|9vMb35~R3xgyu&69#36xhv;+(6L=G1knJpBaZA+97cz5d-$ZK0tK~%t4ZV z@RrX>zvo|{fANF2e9r#I_kXJYFtW-@-~rAbjsLl>*iR}E7pEb8*jhbU@XSd&M?Rv(z9-P z?b#KReXY6Bm4dmKG1@eRnmTSvrc_h`abUWW^~>8|C(fT%s2I-UGs)sxB>8KC4}Y9C z;FCAD`C?_G!5X+dh!(c=aNvTX57^G&`hNnv1n?Ukmfx{!O)DFcl~h}RBEa1b z4+a1A4hRc~heKCfSifW`NGsL~rQ{VuM2x{%Z#*;op=MAmHxH}`4lm$Tmv^9cXmuzZ zi)$LF%yj4*GakazC=37z0=Cnw+rJCoYtG+zzw&I@+n_j0*#s()G!Ok6?)`2fvF0CT z7v$9XJBbNe=Y3wsfSJOPWo|(mUYb7CvvL-+%wwF*h9qBv53;TG-x4H%ANBlBBK$;x|A_+>o*6^c$!Pp*j0{>A6xLyJNI^S5>WZKSig=> zbt7k>d==u&&SMLh`>)oJp5RV}|hYdB`mJI0|v0z<% z!3%pPcu5qOy9?`J4bPO4)`&+IEp<(URyiig1|SF1apmN^XU`IOdG7sT@W9U?5ktxr zxK+jdJ+d0NvPbMI3pD@p^PBZEM6dwR`psji(O3=1#NY;~NqRyu;FXIzS5BrQv?ZN` z|9EF%au3AEpD@@?8!YIr-1Ji@fM_|??Y87vj{zhYE^WpIV|eMQ<=mCmG?2(#6m%J6 zK@w0O?j0^dXeE7VZ{ghg0t#w)h-;XIR->ShhUbllbS3Af?^;1h!`|GRcng5|9Hikf zpD-eG>T+ch!F*0!C~_E9<=&p<5Zzt6_0x-%$Nxq*^3-*AC({WE>%JbXGU=5>NaL*H z`Wz=3w09@*T(Sh%Azv zlRinZZsm+(xLBD0O~uRJa7{K*V&EdK!vWgoSsUlHp%37H{nG8NYFr1nD#Y$8st>^K z`jCl~@TGDpimw1+oR!Vhi7q74FUIpnCOLQIH4S#|OcX>O=gtrR=;ym1iY7XamOD;L z@GOdX0YU)o{#P$sKBufpEc`=F3-|%3e}RfEbpHtBoa&tEup;mc!ZW^pv7}gOGn229)-+VvcMbe{(D<=zq>Jm;YY(L~LU%ZTx%+rZDD$(`X_i9tE zDMvBaE!YCo+2fHe*qF(Cfs0EI;m0VcLLAPeGcwp0g3W+Rpmj&nYI z`PS<`88EW|uj^aKeBM7j?WfrqpEcl7FizISz^T}>!5S!<_nw9vdy44zT!%I*N?14h zGnT?Wd+Ejt?NE_T&gQig-X|ZInRaluIXF zqOCoM$3RZdtxE-+<9IcLH7X7{`rfB6ocY(Q)f%DE7opj7%^|1(c9aTWXf&-^&{wIh z#V?41H~A;xEANS4h#8~uK>A!Q+fklX=&D^I4#!FJ@2$R~wGBZyQX99008KB# z-uTvJKolB((Vu`8fBF*l!MiSsZg?p+jse7;*Pk%{93e!!=xbdo>E-VFxanS`hRgE0 z_z!sW?5w&Kff?&cEf#_Kg?RJqK8`11K!w!IK_U|O9O44`)wvlgo6_|uEWRlL-oS<< zeJ?)uZk!t;#%Pu{5AM1)e%YLV=}5tvPz_DT%V81e?Pv>k; zu0HDuN?YX*=*D9}Pn%-FaHVb*rW#k3B>HIKuOIkg-z)$7ULoSlx=erEYoD>54Uk%E zFALfTt18z-ZULP4_;n-+Y-l~-@;*-1+HGZ`7C;fp`(v7=+7a5*QMC64iPFS0XOVLd z=5_j^CV*o|8v0=AWzAv3W5{9OEwTUIm&9EJj73b-;$Hd%X2Z_;>*tSs3oos04(qXS z-^%pvn$KwndwAAjabcORF_V`(M^(LKCKgFDAv!0E*1ScycBFi7KIh2wNOy}OeG zsk*LNXvCrr7{!=$KLJqAGAH`eBmI0k5anpHJENPIwJNjYF({3fPiF#?wdw`Vh-^|G zfJ(`mbeer_@vFq#yB8(yCnO7NT}>Tgvu53kw}yQ5se`%XWDVAtkd~%n!!50+H)Vb> z>kD;-35Nij8L>HY4PSKuVn$Vo4(WSlnacp{%unN1V#)Rlw8p=rq6%Z9BxXi+fl{^(5UU?c5=F8Dt^sm|>@##)`~~HB4EXu1Kb1L10JSR6 zwa$u(+=mS%_voHSPuqacX(}`ieOEFkHmgmHC}Jao>?^Uk!Hos;M!B@RwiV?A1aOW`oG zf#ZZ+B)H%SHUsLm3;;Y}v6P8t zCEvJO^--D#KI5bvE>PyiNa{?}4#_YV?8gw?6hJ(DF5W=&@UNHMPCfhY-@Ox-#bXfT z4JOcBuX*$!fe=waN-oI8b*v8tH0TQPIlNG_-$Km^yxp@kW^swl8Q^O}h)qB{Zf?ky zHWM{~40dRfz^>7y1d{#M&Fhtp#$@F>5IZ1}9H(;sD3xO~3A8T+8!PxY?OSX5{TdU> zyl(ar=akeR0hrKW7+cBN?@ONgr%y|I`TE~q zcW(s9I!0?q09%v5Ex~lHRS9gs)ywtpHU2TE0>1j+f4=$DpL1_C=Hlyf!SVQ|FN*qM z^MXv9YGIX9N?`>}qnumPbHkO;ARL)rI>mkdd6T9lS>+C_Tl3BSIwvQXqg4 z4Tt%kN}c_EU$y^>{50jWfBp5L!AMArS;fosdn!v9fGNS0w)2}~hL0eg_~?I-K`qUS zefR0V`0V~tNEtWYoXi8mq6pXx667{k$_Df>TiSa^%b$JcZHKkjPpv=;ZeE{`ys%p6 z(S%)xT?^|_tanD(phxttLQv5D>h(q-0OPmI%>RAqmA`w?HXXFd*#ZF}U9gaz@FOJ#*okpE5G@qJ0WQLwCTUx zFGzG)1*4@49|9K-i@i4cTCO0qoPw$vkd|q!1WhE_rn|jDOo$Py{Brq|f8Blj|9${; zXjnx%i#)7`B$g&U9s$vy(DWdpA!m1KR$6*{1|OapWfut}p;WBCWUvvb$8zoI)9 zEp^E$ZQE8`Ld-(Nq8&jLw|QKTgpNKVkavxW6?XsK?T!1n=5(^Il8PdOrp>g*iXb$$ z6F!h_pP!n7iYeiehb3Oj32$G9Hu@ey)@00w$L0BV|y zn2gxQcVL|@)Ex|i?s&kcF@0pU+0=6$HtS5KYxQ{ac$}_B9~Wl?E6o1xml|4$x_(1C zXa|b|c3CNzxrr{658)0q1G-okbgCppBA@{xtulq0!B;D3p%o$SDNLYy3QSms{L&qa zf3Qs6>q1x4OWE^Q>hkL0WxMRRB9-)4%3$t&JoKD?snk??00Y`z!36=q8pG%Ujg{IT zl7N^x_526D@k400U+04I0hTX}DiFa=xLwPAfC4e_`pPA4rw5e z+OCJU`+=I7u z{pC+gbX>rUu68KR+o-C;C^`Zrm`f>M|Ne__e*WlNh2SpGf`Qhqw?SJjfepZchdy?A z*3B6puFEoiy-y%6I|r`&(8?3{7N~LJCofM=Ke~V00?MwrCs_&RwKg-%1S&Hg;C7F?JX)zv-39O1in z1WtfWOru8tBev!WH)LyB^>U}=)fnM&2e#LHZ~d2GuEjdl6C}5Qgp8Q!3S|0#GJPP? zGAk<4%%usXpn>(+-v<8-BoSMKk;?z>zgY)?sIXn67~eui;8tgLGpsts;igmq$*eJa zSoeeWPUk?RixeZRhM2uk(1l>B!&V_;EUK7gr({??mKyv+xO$LjfWDN4N_d`7?R}m_ z2+){_bB@3@(3|b%KFL727iCg@S79_g37sV%zg-%|6&_42h+3hwoYiMa(7?hfHL{xU zces8rHS1_4XJfcDzUIexE(p~KGs#H+vRB6eJ8K=Am4XY>b72%i&Lw+&WN#^i{2F~?K6~P zbOcF|OID38Q>^(}*2opzGIOd^KOWo@3Qy-DBturUkKtPiz{p)p#Cs&MC4rbal!Yp> z`h$kItq5sKFKO3U+Y6D#5eSUXWX45S7BKd!W%@$Uh+~?7N-jSd>@k*4`2OILP;U2Y z;|lq;@0@LgSdiu;z*HS?NW)xV;>`h!c`sxh*#n8~UDuX~rn?phkVs7=Dr1-;YXtw! z-1HPaw&q8Bqd#E@;Oh=E74rum#l0WUG7AygLz#Qe^(h|MJZGsg0nTC;A=ZJI%4U>00RP!%5gfi-m=KK={ zid>HdXba1~*%NoKF+4DKy=WP@#;TKvl$PYq5icZ`m;-0PRV8F8ICGhKe5Xr$Sk#m{ zw1oNcgFW&58pAUv){C_S+~fadCJ`$P0&l<;fo_8sE3(_c zD{FqZhb;}D2=H7MEd&qA{~2OLqbT?XMwvH&(7MT(q;iQQOU$-21287X*piVV2{uun zf>+kW6CfiCNJkr_0I#~#v}puo<3hi;$bnqnIdCMKWaT?ew{|3F z{{E_OJ0~uqcc2qwHaMQCv4f7r1eo>DIwy4Vk8tP&E{}Hj_uj~ww5HAYY!9)UK+_Zf z5&MivDJW{at#v=Ry-fOjBcYj6q8ZnBoEwe*&OnMh<@L820YI<~Ue zJ2bM=D5D36-3Fi*eL)G0d^O^5o2MmFrO~D-FTUla8RNw^C3_#65!iUKlAsts?U8k;F6%jAOv5(E0YQ@5GPp%Lx+2kB-2Vu+O9dLcFt8VJoXd1_RA z(zA>M%GuoV4Vu7+{$??2jmHAHbKrU%@JvDP&%;_W1qG|hJ73QUwuBLA{vUc!3a~^0 zZt*`N>e&l^t2jn25o20~M?hwS5`$8*K&fZmtB)`%2|-}bdfVqA4E0bM0}^1l^8Afm zm61|T1_^20S3w7|8lBGi_ZC1ADo`d3qf!W82EU0n4qtc98tMTO`rR#OW<9$Ng`6yp z_TY*jsxkJ~rPTk!OWw0jWl%(UV~7Zccx_IxwaWBxbPC^g=VsWLGeR~m&E4SEf{e8? zwmScxf2SEbv_;Cl0l;)d)kI1{55AF?`~1Q&-en6?MBt{=DXq59a`RjQf7}Z%J5Ljl zuZ2?K-}+m79}h0kqKI+HMVJDX{?&QW=Vx;QF+VS}4n}NuUbi-A6H1RrSLO-dz43WB zc-Vsd)QeUTcIwKX7Lf~5n+ak7b2}|tq)rDLTHJfwHEoXQ8*J)HSdk1^-?VsmY4!P44 z_jxcDDfL><^TKa`dG)V<%xv4LTLAspsz}02j=I9gK6)XNpz!$S?f3JlNo`+)QC6>~ljL72enFvwUoqm0>^d5ICv8_Zb65doKl3HF+K2v0RIX)Fya1!6-q z0E*d;WTv-Kw2XrSKv_CQI#Z@%L}r*o4P4JaEiY%z zS#nemHbZ#kBflUx19{P_)EQMXf%m{{$6YyzV3nalSiU1tw9Yb=peYQHY{AZl3{@O4 zi8Zwp_Mmvvl+k!|i)p44h~Xm47|;9D(Z@7IMc^1g)g;THY<-~_P>h|4j2R>gCTnKN z3ywL^*0#2>(+`0MNgyBkf}wF6$O0It)S7e5MNwEVL*xKxGV9=z43PW*T~lVSc{e3H zU4ahR4AdrT3(BYdcwvyBsdB)Wpi$wIK^R~iBMG+T25l0f%`UGT&^6RQ234>OC_2=d z5KX;je3W8LQ^kOOa;(d$2P)?}wm$((|HREJ86hxksS`-X8}0}>szkjy8y?!BtY|J2mKZNM z1G{81ex>iJdt)S1k`UDC3qQ3@4`?=3M;M(Bn-@cKM-^G(fq;@#6EJ&6O1L7;G+G8p zGIr2Lz=pLIaWO%d0RoD@vHqV4L04Oy9hxt_W|el#!)Ey`aQU-7IL*w6;fPBjE<{Hi z%c|RgY+krH-g*B2AhOjJ_|e3kF2&7MuTUPaUd;qWzFa1R!o)G;f z7lm)l(%KWa09%!jGw)iChu~)!tS05B)~B7gnu2yk=ZGw$J=u?a$aEkRJc}E`4&Y1T z508y?0`Yir|3T2FG$a{@E2w#FI26SyETb5pvKr4UWvk~2f@!$kw{g=qcOW%(z;!oP z0a=EHVbFzWBn{V--Vq|X71l0U+o-ABwpfNR0dbhNrJ zBW1WmDJ%qIk6wi}+RfIeN7}{*pv`EC#0$VI=)f3l?FR*JuL57e^o4)AjHa@!6H(l7 zRivQoP?lAp6sA9cIY45JUtX&aj29H=j?`@)Dm{b)d;?gl00B21nrE~M;)ctKszchD zk$}+vsh-5ZLU4;Ukccb~WZ-XC?4b={vofw(J`E`#u3p2;L9e4cqam^Z7_fz7KxXty zs0oc2F6gpg!vpw6JCFYL2F^kC5WrI{1&7WH)2L0FHd-kgCZEn8wgEdkK!wQL&j*$j<51%Od`RNo{t(J%HP=CzAc$leF@jVTjaK_V%?HF&hFQrcC<_=(HC! zU_cvZ_++*-h}(Ie<#ZQ~Gqg2dx$h(_WT*NFAwVj_2!kA}xDgCxKllsea% zYwDoX+(Z8`Zf#hyIkZ2PjF&}30cu8_J+!*n^w0l%Ywsv9{bX)GCZKW%3}|s7!ZcA= zjOs{ar(k`HB`a8AQ0pJ7z0MLuY9Ubk>Be4a;({b95%ot(G40bGhV6E~pRfZdq~lMN zs+=Y$OtQeh8oQlb*;uv3A~1k4;c#J^5M-6p@~2_9!bM-%KmETUAa=8P_p=_G`?QSg zlrrIUq)K*T9!b*nMjg3B z=Zz^G1uHjVs3c^`n5}YPijxu9MsJ()e&qREKELltfJJ+f^xvDai~wv0F@!NN+pr1Q z2=pw|VD86e4d&eR=?3^dk`e&70B+KrBt7e0oiIpWSTYU!AYoPoXgRC|pH*ryW25o_ zhUi@3ombhP|E3jo*Z&_wXfKH%)PJt4x3r4hE7jA#pO@-A;0`h4gK6a;C!|`p zi&(DgOP*^_14>?cK+gTw2_ zpynCXbXp3B-Nn1r5Uxh0lLimeuVO8djDkwARctk4n7|7wD+yjgagJyV+9rdzYWWs<27l=68yw}C;t0?|M|Z? z3Dl0*q*tW=i-CS_ynWhy&n+eYxn&^VxxHHuC~Q_6o~HHNISw~9sp9!F?oW;IqvOZ8 z8j0)uMV`UtY@JYE^O>HDLwNN{0X074BQ~eA+=PTg&_+?l#$JWsDH>zWRJ0L1ug#8) zjWxEzf7v#^hCqT&L&rfC1weD)H3w3M!{GL8t9wC`V+7DpA)?7M1h6j$Tb{B=;mT%t z+S)x3K!L%qQ@!0C0yDVp^gfa{*^{#!ZOD4FAOKJ*o-*WcRh5vpP0W396 zv@E5wHq(@3h94m#O03PfWp&i zCGlC|2H^cp?X271?Q#hv*`KzyKM6`C*DMlOEC#AJ_B0S~D>*WnHjW)5AOcg{SpC~4 zPMI5k((oR8E?100&An2kd((h}c{I<^8(BfLR%=z`hhtyfFp7rXWbOHR`}tW8 z!5`rCB4E|M ztt(o1c=k2aH0NW5S+8WN625i!xa#~E8~dtdctTg5pZ4^_Iovnwb=AYSKoNNG_@17B z|0chjT%l!CDLJso4RVYRHhp$#XAEw4wBLUCtQwq%6Y6^=42H|^9(9YCSCpG?pATb| zyH##lV@S{i4LBalec@#W^c6dB$GCEOeaA}Uf;VRWL~mFXQGB-+yOftIShx{D5e&sG z0BldEn1`KxnONxw5f()0VcEQB!blYnr|Gg6v`V3TPB8jd1Np)E&AG%>Je{Vim1L|j z8>PcXl41$VU^S;(0IYgo+&}A%q z@M&|@X8vXq0yx-!rLB_ea-(Q~QlUw$i49M2aCH4(C#qx#uhef_0$7=A_EPz4yTs%) zjJoU0KTfX+MIe}mQ4&s^4o3mNufuRLecIZ&U9A3gdQFW|-AK#%`u*v3|LJ44+-|W` z79E3RgIg@kAR4pDw^d?30xU9O-m-A zUi(`cC5fgmML>w)u&Qj9@gyj%2q3Xii>cd`Cs0m$)gaik7jwbqeCzfNz;nl!X%}dA z9piE$^N!ZCNfErAmUKB8*n^$Hm{6zBTW3rGzw7_ko!3I(r6p5nxT^zgy$BS>so0ck zG9`kogFr~&@Wb?s9B3P4hY}F7qh-}gO`Z_sUq(aW&UA4adUNLaEf@m7J-+6b=_)OX zO?7!k1OWEMV+7yW%cgnT5))pX6AX~T!>2C-maSZK`*8aF0(JKJ`#m8#Rfj~pX2{vWqvl6G3KFMTvg5PLp+5Ut zM+ZWKDQ~i=U#*hzB8J>nrCZx$lW(A52KwIzZ5KSPs-CmUG_~E;qd*+y#0aws7>4cn z#`!@2ewK7QXPevj1rMi4w+J*!mQYwsNm?vm<~CkV zj&ukqnU?GT$lS(@KdKp!+&@KFW)fMb`pZ zXk324M%;G__QUoAE5#I3gTM1fr44N=2A2ZWx2vxgb3uyag@%nImF%oIr0GjQt!wi>Z259g1j9a5siyg=+sYU zzmi_cAOxnrht21w+@lU4hWuvvwz$h9tsCUW)~g@X(=iB}k{FHtQMPj!KxeiEa?^Lg zMqnNh5GayOFeM2cJV2}*M;S^XmA?V3LtZ>}@@`~BS9{Ctb4N*y)6_~Pp~AQD+EoBt zFK!+cd;o^>RQnX2VMHY8nFPuc(sN=6;6?3kb#!7ZGGJt)m2H%2Y;g;OYhDOMY999H z4FuRe+bIHJE0CR~#?kVY3 zjgdXsi3)*G!ci8fe2U3T6sBonNmmsK#3p~oGg`JSB7n1XlkvgjS8T=XO&LX$q^*^z z6~CE0Az9}@0B=;CG{hT+^~v0{{J;&zGz#-~Y$`JlVp}=`%omhi^y1d`$dW<`hjUNM zRxbj%i`n6xw@LMyG8|8SJmZstKmm!m&iDYsmIT`}!EEKl*|$4Z5qPhyo%KZHn#4dL z5Zx}m_y9m7#~Bw=vzw>_`coOHrc*EgV0OmEDZ_?RA=wi$I5Le?K$RX2cU$?prB)jH zmsW}LjO{IeMJ57pJez9sSiIT(q9tI}C-Q^@T@(Nx+M42-ViL>g^SHsy1!3fEQqM?H zfN{xM4u0}?fXeh|tNKD9TG=5&hsnu+_RyL#$^E9Rqb$9tDXBxG@YkFl1W=DR0#_^8D983hWeyDK6)&Jnl?3E8fxN>i?MIP$Yidi;5e0yDdC9L@?|xO{F{}vz z6sZJW%Hjc_som^$s&PT#j7_cmJpGY9O6{d6mDm&t2r(S*P4ycv7k{`1d9DZ?XkVRm z1mu->Bw|yMyG}2zljMg1&@mC4o*)MA_}2LWAhA4Bc#ftBz&(R!i7N#F3A*$6F=fV_ z%q?Da=m+7dEoqrBOW>2)>ciR;%!U$-E64E>R_U^$+;Zv%05X&)@5nBj+I-xqb;`x? z+2uzzr3#o4fmH-P=483xA9GghHCrt8T7SOVWV^iDX?F$A`ttZ$CjdyBetP_pDwe^# z+P)VCANdV{ogpw`HodrkfOQ*ycx7%th~WqZK%V$a3xL;04;-zi>I3*WcbH|8sK_@{ zF9%?6F&FeR=Or2nabGKsMpx|HJb(z+(?^#bpXr900p{Mu3z(eC~ja{(w48)TukK&$6P;&`le5 z&X$K?SXx$V(9Hei@%^HD#+nON266G#mcuDX6ov>brmNj+E)jj(36FQ~>C<6`?mPX^ z+dlC>x39I#VE}vOL#J7Oo#}sG|MS#_P_EYPWx(Itw`W_$lQ#ANHQ$HShgKgdEAi{v zM=Q-k&L~gvbn?!bu!q|Ia`p`Xr0U_*i_!6iyc{X0F??~c^TOfirVkB#&~eDvj%hTV z8_o!s3E{b*(_5?n9tU;y#Y=5*+aMr1?Yco$d z#;DhHdn#wQvS;lbJrF2E|m78-a?8ggF2TS^SxqQ|F#>hn{rl!8K#o3wm*n}&M z)R}oIG}EP#RGXpzNY}B&{TMi%GXT8+xY0_uR=M;_PB&SGRXbM1h?TMv+ZO+xon33fEmj^{v4%(?o{E*-dYbY2Hkku-WmZmebH~X zz}g;uuyxSs5Skmc2(o@+beXQ}n;cofsHXG|yDRtM60Sydbz`^Lk0r{9|4#gO)CXf$ hMT`!+pt2kDI-zb-!ne-IA9hd;Y(JJLC;t0iJrH#zeVYIP literal 0 HcmV?d00001 diff --git a/libs/remix-ui/home-tab/src/lib/components/homeTabFeatured.tsx b/libs/remix-ui/home-tab/src/lib/components/homeTabFeatured.tsx index 0a54faca9e..70c3321b68 100644 --- a/libs/remix-ui/home-tab/src/lib/components/homeTabFeatured.tsx +++ b/libs/remix-ui/home-tab/src/lib/components/homeTabFeatured.tsx @@ -42,7 +42,7 @@ function HomeTabFeatured() { >
    - +
    From cb6c52e7814d53659d95b468fe0d72bff2258e5b Mon Sep 17 00:00:00 2001 From: aniket-engg Date: Thu, 30 Nov 2023 14:26:24 +0530 Subject: [PATCH 129/163] update details for 0.38.0 --- .../src/app/tabs/locales/en/homeReleaseDetails.json | 12 ++++++------ .../home-tab/src/lib/components/homeTabFeatured.tsx | 12 ++++++------ 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/apps/remix-ide/src/app/tabs/locales/en/homeReleaseDetails.json b/apps/remix-ide/src/app/tabs/locales/en/homeReleaseDetails.json index 87415085bb..06a2f565d7 100644 --- a/apps/remix-ide/src/app/tabs/locales/en/homeReleaseDetails.json +++ b/apps/remix-ide/src/app/tabs/locales/en/homeReleaseDetails.json @@ -1,10 +1,10 @@ { - "homeReleaseDetails.title": "v0.37.0 RELEASE HIGHLIGHTS", - "homeReleaseDetails.highlight1": "Circom plugin and ZKP Circom Semaphore template", - "homeReleaseDetails.highlight2": "ERC auto-complete will load the file", - "homeReleaseDetails.highlight3": "The Remix UI now translated into Spanish, French, Italian, and Simplified Chinese", - "homeReleaseDetails.highlight4": "Load Recent Workspaces & Start Coding Button", - "homeReleaseDetails.more": "Know More" + "homeReleaseDetails.title": "v0.38.0 RELEASE HIGHLIGHTS", + "homeReleaseDetails.highlight1": "Alpha release for Solidity co-pilot", + "homeReleaseDetails.highlight2": "Define Solidity remappings in remappings.txt file", + "homeReleaseDetails.highlight3": "Run free function for any selected environment", + "homeReleaseDetails.highlight4": "New Circom ZKP templates: Hash Checker & Rate Limiting Nullifier", + "homeReleaseDetails.more": "Read More" } diff --git a/libs/remix-ui/home-tab/src/lib/components/homeTabFeatured.tsx b/libs/remix-ui/home-tab/src/lib/components/homeTabFeatured.tsx index 70c3321b68..d34028381e 100644 --- a/libs/remix-ui/home-tab/src/lib/components/homeTabFeatured.tsx +++ b/libs/remix-ui/home-tab/src/lib/components/homeTabFeatured.tsx @@ -41,7 +41,7 @@ function HomeTabFeatured() { dotListClass="position-relative mt-2" >
    - +
    @@ -50,17 +50,17 @@ function HomeTabFeatured() {
      -
    • -
    • -
    • -
    • +
    • +
    • +
    • +
    _paq.push(['trackEvent', 'hometab', 'featuredSection', 'seeFullChangelog'])} target="__blank" - href="https://medium.com/remix-ide/remix-release-v0-37-0-dbc750f7ab15" + href="https://medium.com/remix-ide/remix-release-v0-38-0-dccd551b6f1e" > From 48ca98d5c588a1f10ecd70604c7f52a95c53632f Mon Sep 17 00:00:00 2001 From: aniket-engg Date: Thu, 30 Nov 2023 14:31:12 +0530 Subject: [PATCH 130/163] remove old image --- .../src/assets/img/ht-latest-features.webp | Bin 15600 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 apps/remix-ide/src/assets/img/ht-latest-features.webp diff --git a/apps/remix-ide/src/assets/img/ht-latest-features.webp b/apps/remix-ide/src/assets/img/ht-latest-features.webp deleted file mode 100644 index 2f0768d4c2029bfda000e0549af6f706d3253386..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15600 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 Kys{U8zyJVi{HGWI From a5e99c0ddad7dd7f2d813bb7e18f9607ab7c7902 Mon Sep 17 00:00:00 2001 From: lianahus Date: Thu, 30 Nov 2023 11:08:19 +0100 Subject: [PATCH 131/163] move tooltips to the bottom because circuit is an iframe plugin --- apps/circuit-compiler/src/app/components/container.tsx | 2 +- .../solidity-compiler/src/lib/compiler-container.tsx | 9 +++++++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/apps/circuit-compiler/src/app/components/container.tsx b/apps/circuit-compiler/src/app/components/container.tsx index f07af0ff35..63215775ed 100644 --- a/apps/circuit-compiler/src/app/components/container.tsx +++ b/apps/circuit-compiler/src/app/components/container.tsx @@ -57,7 +57,7 @@ export function Container () { { } > promptCompiler()}> - }> + } + > showCompilerLicense()}> @@ -479,7 +479,7 @@ export const RemixUiSettings = (props: RemixUiSettingsProps) => {
    -