From 9704d3a32c89643b92bf0a1f3a72b40751a2c521 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 6a09edc9519550cf762b24100ce3efc6eaf15373 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 ec9b14d57d911ba8828726f6904db47056907d78 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 4924fd658b7df978a7bb0cc313d77e4cd3210aa0 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 d986899834719cc19b82b3ca623255fb66189e6b 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 54e44c65d32dbe920d5186481c4852c7819368a2 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 d9aec9aa6a7eab4228e04838bd4c59f38749c97b 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 184c76682fde170be67dbed34e5a2b5683ee1861 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 4cbf6a362c81e36686df26ee49ebc6e699ba744e 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 5687198f62708459b0e9b3838e42b3ca88d39c6c 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 bad2f3b76c6a52b2a32690f33b6029a379577619 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 851622f7aadc70d0587106568c4251ae0a37d48e 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 81c7e42738493dde0a3c4a57fff019b20172c101 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 38fe05ac65e6050d032d1d10d2bd7b66343e9a3c 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 e1f843e7ec727f64d5874cd7e1c550b1de2fe387 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 4b022de8d057fea5a591ee24beef12ac1da8f15c 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 f9a57d396dc600a1e4124f98afde8c430ded9aa6 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 19a9445fe876351d2a5b7fdf0c66a8d0e4c4f0e8 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 7fb1cd12b81f3d37393d87f00859f252c824952f 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 e5aedc242b11014c8cbe39124ae2ff16789dcf8b 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 280d7cbfc0e969736df25ec96f295579a477f7bd 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 90e13ada15437f4251c78b6897f1ba0ad92ef762 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 1183faed94fc243c8753a94ceb2b6560a442f15e 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 0f00e44456b643f0cb3aea2c48e5d35afd9bb804 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 4042f5b91e192fbde1b135c6b4053e29fb75d996 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 a2a8e028203659dc2ef2352e1e232039dd5a3559 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 20c28b9d14667e890aa6f6d254baa555bf5e34ac 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 18672619249e339560ee97a50b06edb6999dfddd 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 83caab85617ca3e3b6b88c4d97361e4eb3b846de 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 23944bbe0a2a061432f4fadf9af4ba4dd1dfac84 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 81a6c6b521521fcfd2f9e36aa9b5b408c9b924ed 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 b22e611aac71d98ffaf9dbc3971c70988b8dbe0b 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 19668ef3e8bf7736670c98fb28f6e78cebbc6cb7 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 537f1ca453b8ec21c0f39f228e4a38b1d61d6e31 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 efe362b5ec2e83343ad7426b57d35082bc7f579d 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 1294ce52717b4a65fecfa892475fd519b267a728 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 305bfd7b3797dd25ce06841a50f0f2802e92c3a5 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 b72c591fc2bc7332018ad1a5dba2b45c1061a7a9 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 6e2734cf850b96c67aad371bb62a5209fab6c763 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 97670eff043b28374505a23261280975da6b9c73 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 53560f17791e463395705702e6942331bb77ba69 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 a6a26fe821f45d1073ec2e3e4ca8cdb3172d8b77 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 a32c58a6a25715eb14ef9826f0489c7b1673c0f9 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 cae0209fe093e20ee86aa15c03cb27ebe00f14a2 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 d19da44e4252515b477b381d1f865110c87e5aab 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 4294fb978569b285d5bfd2ee3dc8537efa059085 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 c78f4881c46b2c86bb7de5965a1dd0b51539826b 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 da24fb53a93b984a9e5b428be04b01a09a8cf1a8 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 e2a0372de755954550018a15068ab19e81d4cdab 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 e36bf507c84bb7a71091f248fc53d859926bf007 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 eb7ed1ee00edc526389962c82bd7cede7ad7a948 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 68ed1c3591cb65dd40002cd77c96422b8def5450 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 7231eee82726dd88b7bdfed676444110f44d2699 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 zcmcJ1cRZWz_i*abp`M~fsokPPj8YUeOO4nowG~yH+SJyn8nG&NP(&!PLv1xHYOB~< zgxVFWvGV45^!xk%-v8hC`h197_qor$ult_s`EIKxQ@*Y4VbnzUpH@`5@~W=?l5NqLv~6P?bP= zYJC|1P|{adRy6d#v^6K6HLFs$u)E;&(8_Ja#p!{4zNmdf^?-6@{IwP`y{UmKF+mUX zGHTqOP(68a2yJATidVB61lSFJ8OVm7$b9=W#_BsH)_7^Wq~mB$X4Ns7ImRJRmoNL6 z_Y#Tf|AP^O=e@*1X@73cdx0$PCAV%rqwlT@D0y(1oo~V(;gQ zg)R9D(qUzZ3W7?xG-&R%)vIl-_e7-Y>Lay;(D$ zqWkFHbp>*9sXgB~qISAFp~=53_R->qgJ0Ej?t_anQCfik^Q$^XIm-j}|T|PZz7YjH7|)e*h`Z9L694Jh#(mP>aQe ze*hoYW`Ze@9&{QH|sa|BM$ml^1K5 z{}%+4bG8ug^cngeCnJrQS7?#_T7?sT)b`R4k*?f-XG&F*5tTkceF1aYR2d7!gYh@V zdcoZK7b>iLxe&c}+_mP=T^n)%B`~~a(QIVdCv(@rrOV+D*8*KAJb3{fsQKeG8?GVyoI zK+IS)_l0IiK==LyGXF17lGz0ic59Kcs*3(!mJ~d5fgFn5I#quwR+Y(<7L$KQGRBVl zBTw>t%rY<)2VYeCV=`{MJ?=;7_M-fC<5Xhaq~ovB3-Cl`DvI%MLg#m$W#sJ0hyFqG zVpTT$Ra5L!vQ*S`X!0N1q-U&>ulqIqetPNtH=&S)ZsN@g6fc&1=zv*urw{;Du_N1OtKSV>cq<=FiK;uV$`Syu zGQz8EwbtxNFxc?jeQk3WP51KcD@H$Z#W;2t3EzsHFao^@h(4087^t3l!u6uy5}?RB zddw?V9caUo6KoIK9EQl=A(-7j$jE5l^W>?>FyF{db;fROcsvLEHS=WK$?olNp z%W{c+kjE@vg(xWrBaVrnBcQAhJgOHqzrt(-`M+D7V zr780W%%kx9wd6^G#ucJ?U0^HUE6e2|hgyvD)*V3ml0bm;k(Uz>rxgspNmIWzBuu{C ziE-9GnluQHq{NiA(<)O~3rp?aJ+Z^CK;)1s32a;EO;;`fJn2*1_F1{~lHRulKYfh! z2l-M&g(}+JcszA2wqD;dGL;idVJUrDLch_K%)YN=!zDpW9yVJGKH2mKwzusVx}CUj zsUSLXY15)z-aILVJq_o1H=0i?Q=GCYR$h|N5N!zf63!E;FaIFj=&vDuLHmjXNbSP+ zUU0yi{3=N()6(Ya0*WcOSneRe+}a$m5Y3&dfQpFIS{%!zR`TwH$Fj2=z-f1Mm^aw$ zXne7y(gBUp%s0J<|iQLMZovSZ+$sAH=$v*4yz;sMzfHAEr3`a^)~E+ zjmt~}7$6aRvi#OgXeQ`=NNtn95I}(+b}GvvK{iU!fdtGkuBz|| zKu7|C6jRty_hFnx8#)Xik^D;leTU_}1_jS6Kx3pEDEH`1y+gOlT}>p3PG`gCV$`X7wSUl!fz+lG+SgA`IvhSe0w3mh1r`g$3uskxek3<0 z=61QgAgv?4%-X?OZbUL0qRSfHNL!$H>6wsauB&2uP}!EI*^X#kPJv)Rd$J~zhHk^y zY<)za0k^L6NadyGk6qLJw%1~AJic|D^At6?VNL2@K3ze~;#9oVWeR0Lu z`fr{gg~{u&m9U`9j4J55Idz7N-K7agff*QV)z_Cpkg>As?$!So>9H2QLWxVd4zwd5Nf z9hT1pdB5{J_pSnZ4ix2D=DULJ}i5@LrN{@ zn2}!f!7o;_uw8$+{!j6$*wb$|&zH?x8IMHY0(~l#d1;Gd=~A$FTgVl=B6rsa!LulQ zV-b130ifMjAZZyDA1eHeSrYD5ZQ_S#fRl}J_b!>K>*+lzA(((Z zJ<3mUX*_nDY*nMUh{er#hzzz`tmmG-@MTVW*f1sO-B)(QEC#*UFAw-GDj{3-o?2ia z0%({oD08(b6iX&VxBS{Qr0yF|x;y?&+YTw9I290x;khldPfkPb5m0%jv&Fyw^e)Jj z3(zjkkErN3yEInm`*1ZUFvNEOj2v-msB3ANsQ31>m19ZOxiTCVkvA!!9#9u!WTZEx|t)?%_YTK*K=fgmhX3nyv%uvEONp+xEj}kLQ(d+cn$*JabXp zlNV;WG?vjMBP_^#X-Tc+>$FPypp|z67y!2JGstRf{f3{#40SAj(nd;-{(u7jwj1=w z(V5ui!}~7x6uF);OPuiYad6P@d_LdH*uE++lhzha9c^(lo%^%-Bzb-9-IYg|?ZM1LC33t7djRPH=VdActck};v z6u}u23+}Jdx5TbwJ20qT{?=HYywv{Q6pPZae=S-jL`}A0Z7|&?IUG7>g=>zPfn!x6Sd&js)_1{(8=b8|@0!;Sih^RgQ~ zOY?jihloIGa@=*yMx)FvmhO{>4yF*{aXdPR66y{3#q~4f_?Lle7o_UUB(|hAJr`ym z?3&T(U%vJ&Q|R^+q(qUZQHJb8=1Wi2EW)Du3wChz&wn!AfCLT)8aqcZ@y$E&WNym7hkP)-`UReCWB8CpLX_9VQXX%71f5Y}%|v)o0WKePsEW)EJ)0$DRz|JxcUz#nq*pbf>-qb^=R*zO zDl~o$P`_$s4B(Q8C2=rTj4M6E@=+hoJGy>@g%Qw;a!+1tcFP_7_4ZSOsa>Tqg}Py` zo<40UjJOByyf#%u&enFXf|TFghnu!ehk|fi@3h?tJvLjc2OY>aPwm==u6&MlHyWg0 z2*Kc0$`DIXiv$$jKDv){!NsYm-oh9;4isAQ@L!mb;tXHc@c(r}jd5;B*Owhb3Rl7t zP5plbZZooaZJvw6D-9>K&maLm-+0M3V*~ExJ^%4}=MjUG8X0UkmAY=_tEt`E`(g=N z@oSbT$qK>11s97Fo_kbVt@Yd=gO5Wyjs2q-i>#r8T^|bj)3bBaec|D@9r=Z= z*JnP7d#ocpd ztg&OJgkh-s(H2qz;Z~7(=fGz;;9x}Xr;ZU_}(sCEDO9s{bdk)xua8#G+9C<+f!7W5k9~sjTW8SYq{vzsDkK$ z;#UrMkPMy%AlHnkpFufvk5Q?6nx)J2)~~e73=c=Oq`0*c=Hx*L^_TVFlQ|HAE@h!* zmj7Ph>z8qGjtcBHM6D!s=x7)=*pyrPrgyRzI*8?#l%vLqGGrz1v~c~pZ)ztE=$uge z@`F5$sm&pSwCcdYP)5vCp0-u=tv_^S7JvyVdZnUPn_ik2xWS*ay;~&! zKAU{kp6V>Qdp0>C1{jk?dO(TR%^4`@S#{)c@ z#1_`UeyI`u_jL|#Ffg!cwEEyt@v3JFI1Yc5ROWi6Uu-f8#w2MSX3kO|!=wZaL^>MOL(%BZ2|HlL$UP}Dx=bJg6> zAgzcc4K~og5(KxRZz>fU@0x<85afv%=Bsdqm^SO>G`rCZUvKybtJ`#mXMGRbGg@3? z20<`7!__mY^_bUlyrdMvO&AIp<1saLOx=0O&#xuyAO*jJN`GL5g1 zl1$C>wAy#anW-0qXtcR0_G`Y=^06R^Wh=)3E3)ky#-2<`W&DhwY~*4-jp!R2O*3bp7ub+aLK4D)lXSQE!SPqtf{^gxpd%5^xAwPYB4B zFy$a6e7u9(;c2BE`rwssbnJYj*{sIeB!qPm-x487*2BmeR6*Mh)&`ei&AJc4G*m5y zme}3QNlD4K|D(WN!~Edm`)=YNh6aCUu&UHHnyolr($%Q+J=m)*hdTA`|Rz zK}cpZV_i-PJaAe`hZ1b1jhu(dsn&jouX%OvT2#nrb&9V$dAH{re>`9LWtM=(2~Wcg z{bu^DFbY-6K^&yDJR73)Aj;?EPP6m#`G3^W$LZv6p3+4o#Wv@(KOS z%@-X6SFwu-Rrk8xZg6w{Zc#!^t{Nc{S4xY`%sp5B18%vzTtVF~w*e_k0 zqeG>Mo^wdQ?GB?EOpwo4z~rt^4e@~XirQs@X%-6;W#8DISZ1Duzcv}e-t_fe9fr%nh%2g*Z{7P+{!a|hp$tP zjdQ4aN#iBpj^k(yVH093!0C?#%E6IhiLq>ArEOqJ?1PaJxc6Hh6SFG z2?n*iV|-NDl8d(|O7d0MRJ)x9NMhnm(BWZ>s)OmQFC6X5-&Mfmp$2a)9bIirr}N#2T|=#RwiQ#t?AMEl;! zQW*d_G~bZp|4`4sb}1plSrErsMlxfsSd51K4+F)c=yB5!0Uuum3?$Zfklx9{!!o0T zdU@4PFC&L`S%Vi~TOxM;ZrgMm3EUr3d}OhzLHOmyQAclpJh2~Hjp-wT$JV?4h9Ui@ zWSmMT<2UFZnVg_!Rs}$Dl|h+vI*KmRzTn}r@$+%#!YfrWS21*5#p}SShPibzZr$+H z`yWL(%t6m&BqChC-t^TZX!KjQR#;R#@bT=Vy$ZQERI*VTY%Ilo@+l+!>=RJ6GPe^G zwe?Heq%X<>=}xa|dgVt-o^hI)J>+9`_x3VhlAr~{vKcb{%_&kYq;Bc~_Ry6AKSN>U z*m1*Y>$8XIS6W*wN2Mu9X1)1}7_@Ku4)sy>suvc6mCEE|wy2n>?NyUu+Yv7}b4*>j zr>%A4)Hhwgl!v!0(O8XYF9l3aXG~YU;!uX8*qp$!? zoR?uHc2YeS7|;~uDeV{L7o2d&(P&9ya4z%d8?J>2+z8B?4;=8Mh1(D|tOPb?$Zuey z*Cto5fqPX<{2I-X#*he`lby`!(Q8URG1y_t+Sk9*^9ZU1kj2L3^09y|z(%bmVRlE% zGUNO#nivAIdOMi!|J!e2lZ#I-$`TU=W{i7GT3P#{VZGn-KLDPkYl}?TLeoPsq2iB; zAB}ShbLOSrw0tS|k#%mqjO#8pL!NY52sz&arn4uFLYVYu&&wql?CIP1&%Wbhmv1G!KJ{*ZKe{!&Yp` zNJiBwj~P(qE}dmgMMW&W`f}KiQe8I@u+<20q$`$p&e1N;o2*)oHKfkC zFBj4}IKn#e^A);Cwnt>~?7YcxMu}tjXsT`WLJ*5y5tUqW+(>+>nE6NL9@e2Q(**3d z!-a^IgUMZgL9UjAH@yeOni&dPQ*FD(CzT966MR|$81bS;YDn@nYp=1ZC|$}^?G=?J zXM{=onW0#w>iSLqGGKcHZCZC zISJ|cZR_x^39#?G}q(!^nUFTJ0%P5NZMz!$cW{Neu=o1d?GmI9gTGlx2T ze}f%s!G5iR{1$GqKRg0}pxz=SiH?+r^b#pQ9B%_=q;HSsF zV|}c!*yp>4s>Y(*JNTy+R@F%+nB&%wplFe%wv)ih_Z25Mb)3a?OsYiSBGE9jE@Gl8b?f9ev%$Qjx~?f3?Arr7KTWOXS%~HRd&1ImYf7Q ziG`Y2ub&4^#IPA~*XBq}R9}S!t%(u6&^PVMxs@bB;E$2Da5qvuUFJRL_B!XiLU%Ji z!PI>)_Jc5lNk^N)(7hMa5?A7#S^r_FBSOLyUF zch@9%EDfb1qWAiTG=fpg-DK@egE;A^Fhw1(QxwRON zCO}84q!H4qS4pvofuM{bMMy@RT%WK>s`N+=7P@ZYo_p5f)jT-C-ud>H+k-?N+|MhOyI>CPSB^# z->FTmw!UA$GkMF8{@OanDyntcR<|(juN9ATrr4C8DDxYf>{vX2wIx%-PhG|*q7QVv zB%U7*(Cfz^2RW2_yEcueDy^Z__N;mDM_~(KhkJ46^yKMOh zKX!R~`$bHGrJld>pu&x`8pw|(lAAC?{Cw~gB*6^L=5)5|mHBrj(rz%}$BPaR1&+pV z$5`tRCQf6lf>S=$^iAhJ)Hxe&$Wrs^n02c1&2M1P$5e%5`_ed{$&{#8o|f-Nyxqf( zqEm+?zCl7Po8Ow3l2Qin5ryaswDHyoz7($?U9F$5y=xlsL2|2ctolaq5GDS@`ys6} zrpQcWp0|t~OFekCFQXuIBtTjuhCh;nfumf5LHV_aICWq02Nz}iL=L5*LNc8xe$4B=6W4bN#HmijAGE?PfSS_=i*ew1)XJ`6vO zN_;FR&!Sb>{&Q?!8n>E@N90l|$i_Ik!p?KP`dkmyeKpa)&{u(4+`WttfBrfVg%35U zwXHZB0oI+=**u?~JQmOP5+a@a!DwBNtnJ2VadmNK2%JA+k4}|x)oybLA@Bu=hxbVwPhVl_h-F$RM5|qG)@jrwLCZ2{4nD(mfuS$)wD`*AL7lI zfJ0*pL8-8iB_OHvL!iQHbBPyrBFF9>a#cb1)jW27yX$*>w*SxXy)7jCaS8*kZ*-DU z9z?L!kZ1FeEc@Ot91(6S{exC<%@wAa>|VOxds{4y&0W1fm!o=BRerScR{2OtnO-rq zQGQvFeQ!Zsw zRjMfI@o0;TOXJ7Jzt=urFAcE(eP_1Z?$Zv~9hMw$RBA<}D=&cuB@mm%V6xahfk$hRu zZ{TTy=luQ`+hFnMP~Pu%q(y`oQ|2LrU%E#`tUskyT9gkB-jt_O&s!0Dm2W5!Trh5N5V1I|rTELH zG$^2~f`2!$3nxuTG84si2B(cl?fr`I?-Q@lD>f5U)zyqMS(P42wJs|YaD1jl^Y1Fy zqnN6O*3ziQB*6N;l8Z}l$<%9a%yoI~-`*@HI2z8YNt8;4-0U-O_iSBlVLt&O>~Cz! z4=`!mW{?oqq4*SfT?vheimJZleVZi`T{|*;XkG;^@>G-ax3*hm5v(sG|6u4&k32MU zfu$kWEA#d}KR%GYbCp~7jBsL0^iU)70r^)!q|^;d#axzwH$p=_wewn&bQYqo^4zZ{ zL7UPd3|gg0Z;Da!?k?k!nv|m9t;Ik=9o^00-Qf?hYc34$i>0)-sPPqaVNY0+6}GyV zU2@7`p-NKkmP?+d$_x-fjvBu-@#q9NUixmb?b?D$C7t;~)$*yTCOqxcC%r>3V8TR9 zL5U~ds!P#>a&3UhL+)^=^qw7!f*=-oQcaO;zhmtY4F zgV#_$%_QGAC&25MF7>jQcvazQ4OAKZMiGe%;E~>V>rnd@iqPc3VDyb=(g$RP)5i8h zuC@P6@34x`leBZ@$z^zfkX%o>k{No4*X?N8CIlM)6$eahmyzLCJ}(OL_gCB$%R!}P zDWkPFz>;Y<=n0Se1wazl#jj~RW79AryjSuR<>UApLMF8LQ~xbV%tP902ANU@)q+jOPWVe3A%221)4O&hnYqy&K%BO+xCunZsNB zH+%n)!GR%i|NNtj4BbJ9kn|l83F})Q-80IVF%Orsw}u9hpgCS`&>dbL!EaTmJ8S-y zs&Rku+zFTdx(asx=sdx9uUA@7m8K?CXv87F4v|d6wd-GxsaXRXKkzL*z49c$KXrBV zv$2h;LrLlO-L#h&hW7&@K`eDQ5?t`|6$(iGTou24_AsuSrpP%drGnaFW7*R-FkLeqKMGS08h1&=}N1kMTdW1j9*^+mC z_+#}XFRf9)3}#>eOgdT8U^`(?1W{kM$w@u9GV836)p(cW{Sx8E=xEnbFtyU;sv znPb+IR75gNOE#X?g?{<7ujLs@ zZswVE1TA=&_wkzR+ui21QSp#uViMWF`Fn2u`$B>0n!!lC}!*$0BjZIhh> zhzvChldM6z(4>t^gMmFNm16=&SezfpNxYglH`6s=xl?~Tvw^K*_vP1lRX>PLn1Qx_ z0y(kov&eH?GVt_;AOKON(#HZ@L*s{w<9yHncNsA%!I4D*;@%h4yL<;|(pe0sd+kiV zv~11CJ2k-><=KyU_!zOL;yM#-m!)y}2lL!*`6cVQ32%dv!$heq%_b23>K{cu8x! zK1}+!Hf?PDw@THIL3-9_td^FI&D(F;msb(}ONP~`MFJsf@k_J0DoeHR*?wK4Feq3Q zZ4e@pP??oE$Cdi`4d#2BL`xy~_uT$8x5C_v*I0Y0zwYBxJZTJgrZ2xXf3F}YJ4Gg- zwRW@*34mr-bf?^ZCSXSR?nD1EEv;Pp{Jqv;S=qs^L#H<3T8DWZroPPB!l%Hlnrbtz zU%bfyN3<+m*6`~Ya>2cxy2LCe2*Y zQmnd}(N{i@dCsVRNFy!kVC(H9e;fH!vg)m(TB8s<9Hn5ww;@~2 zAu9Y_NGVSEbD%aY@W6XjDb*Wqm@9fLW`LW52^i1?-dwkO1FPv6vgX z;DBO!WR=OUYARtFv`I)(LXT5oMOt}w?h~^)-Y+hhZP*>!H{*4ff--@v$m!&3(4KE! z>`w-4tG8zL{BsUnm`HA&QnoqqxV&r=$@*nE70nPY^&#@fw<`Df>r|yxz58Ih+GpEq}-BFW)Ns^K7C4s*=KEizI6YB@l zQAJsqjvMMoNh~R$sVf@ z+;;?htR`Etllw-nf$>f&=G`=M#>vp`m!>p6#*%t%%)ejS5Zq(<{aSdK$ zr8cAKz2*@+eGWgw8j9*%_QVHMtq(ktvMLGkg&M$Dp(`8L>URhQg^!SW&gu0O@w+9T zzBNaj)^)mzwT>^KM{1j!vx?aD&X^vlg4pD@>oI)MruugyI8$$-Qu|-Uc{OM&l_Pns zIYH|W9dup3&k&~hhDe$8zxyOQ-6|nvu$_aldotzD9osW`YnKVZKdv)d`7AFu!hDxq zb*Eo>7xdRYU|T3D7DJhyV=!I_*;Np1NJ+oSNCs<*o?-vE+}8QXA^k;f zEn&eS2qo5El^dfnHlx<)MN^OG{kazZzAU*I8f5PBPpuTnZicU7!$-Y&E>y>PoRrZH zA1jNU!OWYI90pnl8JWwJwTrc~+0b z{bD%}Ct2cci|JjE{cYmxGVPK_YUzOCcVG7~h;2UM<;$^k zE(5{zGS9N|K?TYgQ9Emr-n zID%)E{N_S;qK=FQhdkpt%^K>K9O(Ni(b$R1co?CA;VQuVO{Ry!*A+vm` zF}31GmE4a2KeGr$mC30UQby|25HBy0h^+G60xxaG zY*`;IYtX4(xCGSx3v&Yy15Qjhh}Fnk2`SxQeg9k132IxgmH=bA^^n;LG~l_3%pYmC z1Z^F)+}kvnlzTVc>s^`@*Kp-yRStNAf_V#YDb8*4raX@csP&U>)Fs>o{fxi@1u%{v za6QxQO*l`I(_Gu8JA;Tz^7Len}(_3Ds?CNk8a9WxCO?;6~r3^e*P_> zhje5N6;dqteRoeE0LJnyTyYwlcbK(L;?a4%qPMm5Er~d>CI33e=J>ps<(d)ZVU+>c zgd+3h!x!c*U#V(Q_(>*OrVi=KO*s$QGnogZYSNF#_M76mTJqN!!sO%RWOW25qA#bm zPYZ1O{S=6U@9l`QXNmlJEJsez%E`1syFefjFXI=;H4Damzn1ckFHn}apAQa& zv_?;1Xv>&2U<|O57CH95#$wT>M9H_175t2SA_?ors;D`@X48jjzGY|kP9FoVkF5~1 zgumVhM(q07BwoWPueSeYwn$Qj^M_;j4BI)FZ*>~WzJSUk7b_6T!lx+=%s{@?37?Cs z-QRc}IKLFqqjAonw&sFqFkd5eihN|W_05yrH#N6S>CKt59h_Di|JmXD*^t7plY}fm zJ5H`eIak@vn^{+)3EOtFXxwo&UZ%*Fx@I~2hF5u#Sp@o@eiJ7rcoEy>!DJae817qL z$0V~wqB30cUw)`naxKes%5-xt*%hRPN(b8;B0a{XTchdXH)?0&6?B}JSMm%R>=1Mh zV)fU=2FA~#>hfFSMMVspn4wqh=^-`qm`SPQnvc!?8q=m7T-iHBS|oyLwZ@lH*lMY! z%NyxIF2WYbH$(3cy|v3ZAz7;d*t zzCQT~MaC3gxZuy+Ee(x&$}Zq>9O$&iHcNmtP-*#SVzaw2$E`_PR zr9NJ@4;P$EY!g!@`!?KpweWKbDK@UEkI{2F-!ITM5S!Gy0Ws9 z*haJDJ+cM;shrP%i&Vraq@9!5KwDgNQ~k;_AvjaXgR~GZ5u)}v2Q(4(o%tC*+MzI~ ze_K^!T0HZuxbJO2-yFowWWVR5)io>b0M*!oTL=9|%?J((jBFBhm^sPYTIKb7EE2-dK>@D$ZnkR2(HXOBgoZm=BJzjyN!* z3Y*^Otx5m$j%O{n#ZIRj9O`zOPnfYw^Z$U)y?w?G*m%?X@}JP*-}eCFmU8fcaT!dN z%_n6mCv&Xt-n;A$=F5t|INwnfRQ3B7cvH8TI<^u23AGN*#lWC<+R2@2EhaiNKCT?l zqA_rz1{18DR6s&aZ9Oz*D*03pGhk~6tiLf6foaLvc)io0?a%r@i?AL$GeTBp{%)`I zdNHY-%0J=@&!o>pF1UHtiq0J-;W1qbJCt!*?lpBBdcwuwBzS^&RWJ$MeuBbTQU@yf ze{e)6Z_}zEcEw1{Z;F@_8r{8acAac={(eHBn!d(g!R3AS{ZY|r$bSjS@sF(8R_R&) z)xU|5Ona|GBh{tytBf{!`~$8bnFBqVOD#MB4isW0+@weL&k6F$9Iadxboc&cHn0~l z{I76547JVG)i-NW${D);CNK5khkeemRQNArH z4TkQ)>Sz4&igAo62l~~!?|P0(Cix^@$d>CFfX*6rZBVtV`APDMxCLxU+6dEKhua4( z1q6~YEkIhG^Qscb+t=f5itbC((r=_g0$`EO`9>M)(Ro3+j0tlyB;)z~kMVFo2dN#n z6xu-e#ls+N#z@X)6~X0u?||*3g6SxWM0b*Synn=FFtk(>U%ld}n;}faGGJw22R?y= zv`Y0eqQ_y^Lo+l5icjliRr>vhieXrvTH9b3sd%3b+oqA^0%OPNXhJA#}jUC zYEpsN<-6D1t7tv#Z{(p<-)qkC`Q}~56+n)?R=WQ+95Di~GYcE%yun`(KgTyWJ_T`X z3q%Bv!;-uginARj8j1}eQ3ERd0!rv0dC*|6L%$ z+<#ChQT;6!HtIxjDZ|XCx*-yR;crqFk`cdX75PkbUD{DFoyXtUNu4#h_k)We(|e6c9L@+? zMkt=1-b!=JbY3dvJjY^M!)rJ=xzkp)wcdG@e~VC@qMf+#{3C1*wn(_MhD)%ZbEZV$ z9_Uq#ABVonn=I1uITM24sLomY9pC+5O_YOM?bjwBRb~~g>6gax$J#~pPu~I-^&@I zjyYP}Y4Rr(FJ1jG+KaW_ejZ^Fwcu^l+Ct(6NinYl>kK^d8X!LIJQ66e9>!2NR}!0-e_(-fmB&}7NHm4%qcJI^*DJ+ts*qSW=ujdy9??uWas;EPEr*$$2yf*{a2<@I?deGt%l@+(WA@AzeosmgCBNV0Fh!c%f*#{`dFPJY)A#) z#-w0kjL+ABRQOIBYTq9aNS(Bxstw6hq=CQ*x6TD^+CFP?C*jRS)M9N&o;UobGw9%Me{DB=j)+&ScWZ5`odA#^IK>N^rCfax&8wI zAeK*c2jXDMTs_pFzbgLd>^q&J=7yE0m`$VH1-V~^m9bVSPw@$#WF$_UsV*j;g@MZw zOkXY5{^2RCbo_1-c=3;Z+Y8qJZI6E((FMGKzh4R#xt*pon#k#K;V1y^o4!>L%f2o| z*NKIgjTheq9A^XPg!%z(mPPY)_k#;v0bU|$3-nj1SX_@yHOH=Az*XO*S4Fs`JQWp1 zPQDu{x|mcrjIhbyAvNLaCW~DN4Y*&Lmky{^env&1k^BeB_>DZpJbAazBf(bsM?FV! zn~MWNAv2*Nf7;gXi_jLI%VL8?zsaSEE>`QLpSKb>|LEpx9Jy0S4oBB2zinE8MyhX2 zfyTm?4T$y+=9gjQPPYXzNKNl0sfNLI#0Lq|-P~&&cTN6?ysDO$I*?pEL?!1=PlqCX z^p0=I3yL@ufQggDsi?DDpFfT#`k0Jih`p;*KD77|euLV^;EyL=i248R_pKkqzZBtr 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 054c93e64decd4f4a55622e5d299ab00eae6b1d0 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 5d5e73a04202d58a86bd1699d7e3d24ab55dc7f1 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 de23f5739e4228bdc5dac970a8906ca345491093 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 91af6f74f6ad007b625d87a8a349b0f79b95b4e1 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 f0c2189bd2934dafe1eab9ffc4728263a5acec9e 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 bcf37e9005fde47cb42a37a74b35e0b5af5ec741 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 00b31af001d3b68d392eb8f5ccd5d37717f6e266 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 1b5c4070ed5ad2d60e1da8b3d266774486c1556f 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 4048577b98c0c31d394532dc00c2f9a4582e7dc5 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 4d97f80d44e632ba43849cbffe1cf1ad6b72a1f7 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 bd8f9206476fb7edff8b0185123cbb1afb08d31e 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 4aa4b53e5b058e89180d8e7e40af98e9e7d1963d 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 a3f622678cfa94eca71872bb18e0b97ca0ddd079 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 c279da3bfa0efc01259361d8dcec21e81f086d7c 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 2a2d92a96f0ba621230c263ebea3697ecfa0ed22 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 80a8747f0c88603e77cc9d0a1339a52404f9fc7a 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 8b21971e7c9c1ec414c6531ef9efbee0b4dc993d 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 9d719f1e3029c6b735fea4b050247632d8972739 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 da160fc898647d2663f4fdca876b0bb9d9e6bb93 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 e4d47867f9358725f3855dbd04c35d20bbec7e78 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 576a07722521e3f2701e6d78d3fc4cc2ae563d82 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 bef969b4b82da797bedaec38e30bfef635c228ad 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 b1bd2b64ef3d312b88a5ea7135c0b527088d460f 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 a92f1e355e7b46e416d18f7a69f7c5d539833e4f 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 d7bf127e743303f61f0a0082875ce8b946b706e2 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 363e32cede1d5732b040a6b001308b1e8f65c8b6 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 a05cf82eb284fad872a503a59b3636b44958d779 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 ef571d9a9f9e26143a8a39463b1a30470a894bb1 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 37b242a288b9cb238177a0a607d7f6f58d12f8cd 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 ee76245bba07d33dcbbf7bf032be3205535c8e04 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 4dd37ad059bb9cd7552d4b28d1a1463788fdb513 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 c7e9442ffdfe88a345056adea6a2cf81cb98be43 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 f7d4880f783d7272bada03e3128add37565f7bf0 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 ec0c3e1450f0ea6f518ce94ecd0583747c008087 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 cf072a5536bc3a27d43017addaa700144d6c80c6 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 f5ac3ce64a01dd2aac6dec6aac7e42786256b538 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 07ee483295195d0896af478748dd6bc03c43faef 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 3507c21591885ef86964e63597ae04ece783290c 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 b2313486cec6c7e4abf9264044120fe18e9c9ce6 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 638c628588dcc5183d1a6d3c501f3eeec548cbc8 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 babd5d5cebaee4847e442d925fe449d9885ea291 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 ac3094d6a7b953b82dadcbad131889e2e572483f 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 f05dec5ba556871486b49a3dc033ad962eb779e6 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 f0ebde96203602c85cfe46831b811ca87a9e280a 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 03348970d8dba4d077b204ecdbc7b70d69ded63c 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 462a12f345ce0a3fceaaa1e062ac5de56de69f54 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 81892c4870dc89822f310ee0d069bc8e17f84ad8 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 dd139f76a768d76340ab9d0ba02d0f670d1425bf 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 e15be7a03295ae596a1462c2d39af31ce42b7216 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 cffcff6a958b26deea166462308cd7008f4802f0 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 c558c978d492f8c69653cbf941f38dc703756831 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 ea5eed344a563c65fdc0de8e0f4a281a4af170d7 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 673949d973436bff2053bf13f54456d7eacf7f35 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 d49c50f6c01335e9fe37dc63e398572e55e7c4bb 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 cae11b88872d61a085a41e258b0c36363fc6a426 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 2ab4969f6b560f6351c28714e8ca351fcf99f44e 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 0fb31e9fbed77ec2d67d34a7696599b2f6eaa1ae 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 9e5ad2b4a97bfc81a23938027f7f7fdbd41e4997 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 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 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 16db08357d98feb4a37da69acb2e6380af9f6eb2 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 86fb32d04beb19cacab7c10fb6c5efdc34d170fe 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 6f3143f1e74df8d33d9f73554634c19d989e063c 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) => {
    -