pull/5200/head
bunsenstraat 2 months ago
commit c8e7d149e4
  1. 2
      apps/etherscan/src/app/views/VerifyView.tsx
  2. 32
      apps/remix-ide/ci/downloadsoljson.sh
  3. 2
      apps/remix-ide/src/app/plugins/templates-selection/templates-selection-plugin.tsx
  4. 233
      apps/remix-ide/src/app/plugins/templates-selection/templates.ts
  5. 2
      apps/remix-ide/src/app/providers/injected-custom-provider.tsx
  6. 2
      apps/remix-ide/src/app/providers/injected-ephemery-testnet-provider.tsx
  7. 2
      apps/remix-ide/src/app/tabs/debugger-tab.js
  8. 6
      apps/remix-ide/src/app/tabs/locales/en/filePanel.json
  9. 7
      apps/remix-ide/src/app/tabs/locales/en/home.json
  10. 18
      apps/remix-ide/src/app/tabs/locales/en/settings.json
  11. BIN
      apps/remix-ide/src/assets/img/remi-prof.webp
  12. 1135
      apps/remix-ide/src/assets/list.json
  13. 2
      apps/remix-ide/src/blockchain/execution-context.js
  14. 2
      apps/remix-ide/src/blockchain/providers/injected.ts
  15. 2
      apps/remix-ide/src/blockchain/providers/node.ts
  16. 2
      apps/remix-ide/src/blockchain/providers/vm.ts
  17. 2
      libs/ghaction-helper/src/methods.ts
  18. 2
      libs/remix-debug/src/cmdline/index.ts
  19. 2
      libs/remix-debug/src/init.ts
  20. 2
      libs/remix-lib/src/execution/txRunnerWeb3.ts
  21. 2
      libs/remix-lib/src/init.ts
  22. 2
      libs/remix-simulator/test/accounts.ts
  23. 2
      libs/remix-simulator/test/blocks.ts
  24. 2
      libs/remix-simulator/test/events.ts
  25. 2
      libs/remix-simulator/test/misc.ts
  26. 2
      libs/remix-simulator/test/transactions.ts
  27. 2
      libs/remix-tests/src/deployer.ts
  28. 2
      libs/remix-tests/src/run.ts
  29. 2
      libs/remix-tests/src/runTestFiles.ts
  30. 2
      libs/remix-tests/src/runTestSources.ts
  31. 2
      libs/remix-tests/src/testRunner.ts
  32. 2
      libs/remix-tests/tests/testRunner.spec.ts
  33. 2
      libs/remix-ui/debugger-ui/src/lib/api/debugger-api.ts
  34. 4
      libs/remix-ui/grid-view/src/lib/remix-ui-grid-section.css
  35. 27
      libs/remix-ui/home-tab/src/lib/components/homeTabFeatured.tsx
  36. 27
      libs/remix-ui/home-tab/src/lib/components/homeTabFeaturedPlugins.tsx
  37. 2
      libs/remix-ui/home-tab/src/lib/remix-ui-home-tab.tsx
  38. 2
      libs/remix-ui/run-tab/src/lib/actions/deploy.ts
  39. 2
      libs/remix-ui/run-tab/src/lib/actions/events.ts
  40. 2
      libs/remix-ui/run-tab/src/lib/types/execution-context.d.ts
  41. 27
      libs/remix-ui/settings/src/lib/remix-ui-settings.tsx
  42. 51
      libs/remix-ui/workspace/src/lib/components/createModal.tsx
  43. 2
      libs/remix-ui/workspace/src/lib/components/workspace-hamburger-item.tsx
  44. 11
      libs/remix-ui/workspace/src/lib/components/workspace-hamburger.tsx
  45. 24
      libs/remix-ui/workspace/src/lib/remix-ui-workspace.tsx
  46. 12
      releaseDetails.json
  47. 6
      yarn.lock

@ -1,5 +1,5 @@
import React, {useEffect, useRef, useState} from 'react'
import Web3 from 'web3'
import { Web3 } from 'web3'
import {PluginClient} from '@remixproject/plugin'
import {CustomTooltip} from '@remix-ui/helper'

@ -4,7 +4,7 @@ echo "Downloading specified soljson.js version based on defaultVersion in packag
set -e
# Check if curl and jq are installed
# Check if curl is installed
if ! command -v curl &> /dev/null; then
echo "curl could not be found"
exit 1
@ -14,32 +14,38 @@ fi
defaultVersion=$(grep '"defaultVersion"' package.json | awk -F '"' '{print $4}')
echo "Specified version from package.json: $defaultVersion"
# Download the list.json file containing available versions
curl -s https://binaries.soliditylang.org/wasm/list.json > list.json
# Fetch the list.json from the Solidity binaries
listJson=$(curl -s --connect-timeout 5 --max-time 5 https://binaries.soliditylang.org/wasm/list.json)
# Check if the download was successful
if [ -z "$listJson" ]; then
echo "Failed to fetch version list. No internet connection or the connection is too slow."
exit 0 # Silently exit
fi
# Overwrite the local list.json with the fetched content
echo "$listJson" > ./apps/remix-ide/src/assets/list.json
# Check if the specified version exists in the list
check=$(echo "$listJson" | grep "\"$defaultVersion\"")
# Use jq to extract the path for the specified version from the builds array
check=$(grep "\"$defaultVersion\"" list.json)
if [ -z "$check" ]; then
echo "The specified version $defaultVersion could not be found in the list"
exit 1
fi
echo "Path for the specified version: $defaultVersion"
fullPath="https://binaries.soliditylang.org/bin/$defaultVersion"
echo "Download fullPath: $fullPath"
# Ensure the target directory exists
if [ ! -d "./apps/remix-ide/src/assets/js/soljson" ]; then
mkdir -p ./apps/remix-ide/src/assets/js/soljson
fi
# Download the file to ./apps/remix-ide/src/assets/js/soljson.js
echo "Downloading soljson.js from "$fullPath" to ./apps/remix-ide/src/assets/js/soljson.js"
# Download the soljson.js file to ./apps/remix-ide/src/assets/js/soljson.js
echo "Downloading soljson.js from $fullPath to ./apps/remix-ide/src/assets/js/soljson.js"
curl -s "$fullPath" > ./apps/remix-ide/src/assets/js/soljson.js
# Copy the downloaded soljson.js to the specific version directory
cp ./apps/remix-ide/src/assets/js/soljson.js "./apps/remix-ide/src/assets/js/soljson/$path"
cp list.json ./apps/remix-ide/src/assets/list.json
cp ./apps/remix-ide/src/assets/js/soljson.js "./apps/remix-ide/src/assets/js/soljson/$defaultVersion.js"
# Clean up by removing the list.json
rm list.json
echo "Download and setup of soljson.js complete"

@ -147,7 +147,7 @@ export class TemplatesSelectionPlugin extends ViewPlugin {
['ERC721', 'secondary'],
['ERC1155', 'primary'],
]}
title='Template explorer'
title='Workspace Templates'
description="Select a template to create a workspace or to add it to current workspace"
>
{

@ -3,7 +3,7 @@ export const templates = (intl, plugin) => {
{
name: "Generic",
items: [
{ value: "remixDefault", tagList: ["Solidity"], displayName: intl.formatMessage({ id: 'filePanel.basic' }), description: 'A default project' },
{ value: "remixDefault", tagList: ["Solidity"], displayName: intl.formatMessage({ id: 'filePanel.basic' }), description: 'The default project' },
{ value: "blank", displayName: intl.formatMessage({ id: 'filePanel.blank' }), IsArtefact: true, description: 'A blank project' }
]
},
@ -14,102 +14,102 @@ export const templates = (intl, plugin) => {
value: "ozerc20",
displayName: "ERC20",
tagList: ["ERC20", "Solidity"],
description: 'A simple ERC20 project'
description: 'A simple fungible token contract'
},
{
value: "ozerc721",
displayName: "ERC721 (NFT)",
tagList: ["ERC721", "Solidity"],
description: 'A simple ERC721 (aka NFT) project'
value: "ozerc20",
displayName: "ERC20",
description: "An ERC20 contract with:",
tagList: ["Solidity"],
opts: {
mintable: true
}
},
{
value: "ozerc1155",
tagList: ["Solidity"],
displayName: "ERC1155",
description: 'A simple ERC1155 (multi token) project'
value: "ozerc20",
displayName: "ERC20",
description: "An ERC20 contract with:",
tagList: ["Solidity", "ERC20"],
opts: {
mintable: true,
burnable: true
},
},
{
value: "ozerc20",
displayName: "ERC20",
description: "A standard interface for fungible tokens",
tagList: ["Solidity"],
description: "An ERC20 contract with:",
opts: {
mintable: true
}
mintable: true,
pausable: true
},
tagList: ["ERC20", "Solidity"]
},
{
value: "ozerc721",
displayName: "ERC721 (NFT)",
description: "Non-fungible Token Standard",
tagList: ["Solidity", "ERC721"],
opts: {
mintable: true
}
displayName: "ERC721",
tagList: ["ERC721", "Solidity"],
description: 'A simple non-fungible token (NFT) contract'
},
{
value: "ozerc1155",
displayName: "ERC1155",
tagList: ["Solidity"],
description: "A standard interface for contracts that manage multiple token types",
value: "ozerc721",
displayName: "ERC721",
description: "An ERC721 contract with:",
tagList: ["Solidity", "ERC721"],
opts: {
mintable: true
}
},
{
value: "ozerc20",
displayName: "ERC20",
description: "A standard interface for fungible tokens",
tagList: ["Solidity", "ERC20"],
value: "ozerc721",
displayName: "ERC721 (NFT)",
description: "An ERC721 contract with:",
opts: {
mintable: true,
burnable: true
},
tagList: ["ERC721", "Solidity"]
},
{
value: "ozerc721",
displayName: "ERC721 (NFT)",
description: "Non-fungible Token Standard",
description: "An ERC721 contract with:",
opts: {
mintable: true,
burnable: true
pausable: true
},
tagList: ["ERC721", "Solidity"]
},
{
value: "ozerc1155",
tagList: ["Solidity"],
displayName: "ERC1155",
description: "A standard interface for contracts that manage multiple token types",
opts: {
mintable: true,
burnable: true
},
tagList: ["ERC1155", "Solidity"]
description: 'A simple multi token contract'
},
{
value: "ozerc20",
displayName: "ERC20",
description: "A standard interface for fungible tokens",
value: "ozerc1155",
displayName: "ERC1155",
tagList: ["Solidity"],
description: "An ERC1155 contract with:",
opts: {
mintable: true,
pausable: true
},
tagList: ["ERC20", "Solidity"]
mintable: true
}
},
{
value: "ozerc721",
displayName: "ERC721 (NFT)",
description: "Non-fungible Token Standard",
value: "ozerc1155",
displayName: "ERC1155",
description: "An ERC1155 contract with:",
opts: {
mintable: true,
pausable: true
burnable: true
},
tagList: ["ERC721", "Solidity"]
tagList: ["ERC1155", "Solidity"]
},
{
value: "ozerc1155",
displayName: "ERC1155",
description: "A standard interface for contracts that manage multiple token types",
tagList: ["ERC20"],
description: "An ERC1155 contract with:",
tagList: ["ERC1155"],
opts: {
mintable: true,
pausable: true
@ -122,120 +122,120 @@ export const templates = (intl, plugin) => {
items: [
{
value: "ozerc20",
displayName: "ERC20",
description: "A standard interface for fungible tokens",
displayName: "UUPS ERC20",
description: "A simple ERC20 contract using the Universal Upgradeable Proxy Standard (UUPS) pattern",
opts: {
upgradeable: 'uups'
},
tagList: ["ERC20", "Solidity"]
},
{
value: "ozerc721",
displayName: "ERC721 (NFT)",
description: "Non-fungible Token Standard",
value: "ozerc20",
displayName: "UUPS ERC20",
description: "UUSP ERC20 contract with:",
opts: {
upgradeable: 'uups'
upgradeable: 'uups',
mintable: true
},
tagList: ["ERC721", "Solidity"]
tagList: ["ERC20", "Solidity"]
},
{
value: "ozerc1155",
displayName: "ERC1155",
description: "A standard interface for contracts that manage multiple token types",
value: "ozerc20",
displayName: "UUPS ERC20",
description: "UUSP ERC20 contract with:",
opts: {
upgradeable: 'uups'
upgradeable: 'uups',
mintable: true,
burnable: true
},
tagList: ["ERC1155", "Solidity"]
tagList: ["ERC20", "Solidity"]
},
{
value: "ozerc20",
displayName: "ERC20",
description: "A standard interface for fungible tokens",
displayName: "UUPS ERC20",
description: "UUSP ERC20 contract with:",
opts: {
upgradeable: 'uups',
mintable: true
mintable: true,
pausable: true
},
tagList: ["ERC20", "Solidity"]
},
{
value: "ozerc721",
displayName: "ERC721 (NFT)",
description: "Non-fungible Token Standard",
displayName: "UUPS ERC721",
description: "A simple UUPS ERC721 contract",
opts: {
upgradeable: 'uups',
mintable: true
upgradeable: 'uups'
},
tagList: ["ERC721", "Solidity"]
},
{
value: "ozerc1155",
displayName: "ERC1155",
description: "A standard interface for contracts that manage multiple token types",
value: "ozerc721",
displayName: "UUPS ERC721",
description: "UUPS ERC721 contract with:",
opts: {
upgradeable: 'uups',
mintable: true
},
tagList: ["ERC1155", "Solidity"]
tagList: ["ERC721", "Solidity"]
},
{
value: "ozerc20",
displayName: "ERC20",
description: "A standard interface for fungible tokens",
value: "ozerc721",
displayName: "UUPS ERC721 (NFT)",
description: "Non-fungible Token Standard",
opts: {
upgradeable: 'uups',
mintable: true,
burnable: true
},
tagList: ["ERC20", "Solidity"]
tagList: ["ERC721", "Solidity"]
},
{
value: "ozerc721",
displayName: "ERC721 (NFT)",
description: "Non-fungible Token Standard",
displayName: "UUPS ERC721 (NFT)",
description: "UUPS ERC721 with: ",
opts: {
upgradeable: 'uups',
mintable: true,
burnable: true
pausable: true
},
tagList: ["ERC721", "Solidity"]
},
{
value: "ozerc1155",
displayName: "ERC1155",
description: "A standard interface for contracts that manage multiple token types",
displayName: "UUPS ERC1155",
description: "A simple multi token contract using the UUPS pattern",
opts: {
upgradeable: 'uups',
mintable: true,
burnable: true
upgradeable: 'uups'
},
tagList: ["ERC1155", "Solidity"]
},
{
value: "ozerc20",
displayName: "ERC20",
description: "A standard interface for fungible tokens",
value: "ozerc1155",
displayName: "UUPS ERC1155",
description: "UUPS ERC1155 with:",
opts: {
upgradeable: 'uups',
mintable: true,
pausable: true
mintable: true
},
tagList: ["ERC20", "Solidity"]
tagList: ["ERC1155", "Solidity"]
},
{
value: "ozerc721",
displayName: "ERC721 (NFT)",
description: "Non-fungible Token Standard",
value: "ozerc1155",
displayName: "UUPS ERC1155",
description: "UUPS ERC1155 with:",
opts: {
upgradeable: 'uups',
mintable: true,
pausable: true
burnable: true
},
tagList: ["ERC721", "Solidity"]
tagList: ["ERC1155", "Solidity"]
},
{
value: "ozerc1155",
displayName: "ERC1155",
description: "A standard interface for contracts that manage multiple token types",
displayName: "UUPS ERC1155",
description: "UUPS ERC1155 with:",
opts: {
upgradeable: 'uups',
mintable: true,
@ -245,8 +245,8 @@ export const templates = (intl, plugin) => {
},
{
value: "ozerc1155",
displayName: "ERC1155",
description: "A standard interface for contracts that manage multiple token types",
displayName: "UUPS ERC1155",
description: "UUPS ERC1155 with:",
opts: {
upgradeable: 'uups',
mintable: true,
@ -259,12 +259,12 @@ export const templates = (intl, plugin) => {
},
{
name: "Cookbook",
tooltip: "Cookbook is a smart contract search tool. Click here to open cookbook and browse contracts.",
tooltip: "Cookbook is a Smart Contract Search Tool. Click here to open Cookbook and browse Contracts.",
onClick: async () => {
await plugin.call('manager', 'activatePlugin', 'cookbookdev')
plugin.call('menuicons', 'showContent', 'cookbookdev')
},
onClickLabel: 'Open cookbook plugin',
onClickLabel: 'Open Cookbook Plugin',
items: [
{ value: "token-sale", displayName: 'Token Sale' },
{ value: "simple-nft-sale", displayName: 'Simple Nft Sale' },
@ -274,27 +274,30 @@ export const templates = (intl, plugin) => {
{ value: "nft-staking-with-infinite-rewards", displayName: 'Nft Staking with infinite rewards' },
{ value: "basic-dao", displayName: 'Basic DAO' },
{ value: "soulbound-nft", displayName: 'Soulbound Nft' },
{ value: "multi-collection-nft-with-burnable-nfts-and-pausable-transfers", displayName: 'Multi collection nft with burnable nfts and pausable transfers' },
{ value: "multi-collection-nft-with-burnable-nfts-and-pausable-transfers", displayName: 'Multi collection NFT', description: "Multi collection NFT with:", opts: {
burnable: true,
pausable: true
}, },
]
},
{
name: "OxProject",
items: [
{ value: "zeroxErc20", displayName: "ERC20", tagList: ["ERC20", "Solidity"], description: "A standard interface for fungible tokens by 0xProject" }
{ value: "zeroxErc20", displayName: "ERC20", tagList: ["ERC20", "Solidity"], description: "A fungible token contract by 0xProject" }
]
},
{
name: "Gnosis Safe",
items: [
{ value: "gnosisSafeMultisig", tagList: ["Solidity"], displayName: intl.formatMessage({ id: 'filePanel.multiSigWallet' }), description: 'Deploy or Customize the Gnosis Safe.' }
{ value: "gnosisSafeMultisig", tagList: ["Solidity"], displayName: intl.formatMessage({ id: 'filePanel.multiSigWallet' }), description: 'Deploy or customize the Gnosis Safe.' }
]
},
{
name: "Circom ZKP",
items: [
{ value: "semaphore", tagList: ["ZKP"], displayName: intl.formatMessage({ id: 'filePanel.semaphore' }), description: 'Run a ZK Semaphore circom circuit.' },
{ value: "hashchecker", tagList: ["ZKP"], displayName: intl.formatMessage({ id: 'filePanel.hashchecker' }), description: 'Run a ZK Hash checker circom circuit.' },
{ value: "rln", tagList: ["ZKP"], displayName: intl.formatMessage({ id: 'filePanel.rln' }), description: 'Run a Rate Limiting Nullifier circom circuit.' }
{ value: "semaphore", tagList: ["ZKP"], displayName: intl.formatMessage({ id: 'filePanel.semaphore' }), description: 'Semaphore protocol for casting a message as a provable group member' },
{ value: "hashchecker", tagList: ["ZKP"], displayName: intl.formatMessage({ id: 'filePanel.hashchecker' }), description: 'Hash checker Circom circuit' },
{ value: "rln", tagList: ["ZKP"], displayName: intl.formatMessage({ id: 'filePanel.rln' }), description: 'Rate Limiting Nullifier Circom circuit' }
]
},
{
@ -304,7 +307,7 @@ export const templates = (intl, plugin) => {
value: "sindriScripts",
tagList: ["ZKP"],
displayName: intl.formatMessage({ id: 'filePanel.addscriptsindri' }),
description: 'Use the Sindri API to compile and generate proof.'
description: 'Use the Sindri API to compile and generate proofs'
},
],
},
@ -334,12 +337,12 @@ export const templates = (intl, plugin) => {
value: "contractCreate2Factory",
tagList: ["Solidity"],
displayName: intl.formatMessage({ id: 'filePanel.addcreate2solidityfactory' }),
description: 'Factory for deploying a Contract using the CREATE2 opcode.'
description: 'Factory for deploying a contract using the CREATE2 opcode'
},
{
value: "contractDeployerScripts",
displayName: intl.formatMessage({ id: 'filePanel.addscriptdeployer' }),
description: 'Script for deploying a Contract using the CREATE2 opcode.'
description: 'Script for deploying a contract using the CREATE2 opcode'
}
]
},
@ -358,19 +361,19 @@ export const templates = (intl, plugin) => {
items: [
{ value: "runJsTestAction",
displayName: intl.formatMessage({ id: 'filePanel.tssoltestghaction' }),
description: 'A Mocha Chai Test Workflow in a GitHub CI.'
description: 'A Mocha Chai test workflow in a GitHub CI.'
},
{ value: "runSolidityUnittestingAction",
displayName: intl.formatMessage({ id: 'filePanel.solghaction' }),
description: 'Run a Solidity Unittest Workflow in a GitHub CI.'
description: 'Run a Solidity unit test workflow in a GitHub CI.'
},
{
value: "runSlitherAction",
displayName: intl.formatMessage({ id: 'filePanel.slitherghaction' }),
description: 'Run a Slither Security Analysis in a GitHub CI.'
description: 'Run a Slither security analysis in a GitHub CI.'
}
],
IsArtefact: true
}
]
}
}

@ -1,4 +1,4 @@
import Web3 from 'web3'
import { Web3 } from 'web3'
import { InjectedProviderDefault } from './injected-provider-default'
export class InjectedCustomProvider extends InjectedProviderDefault {

@ -1,6 +1,6 @@
import * as packageJson from '../../../../../package.json'
import { InjectedCustomProvider } from './injected-custom-provider'
import Web3 from 'web3'
import { Web3 } from 'web3'
const profile = {
name: 'injected-ephemery-testnet-provider',

@ -1,4 +1,4 @@
import Web3 from 'web3'
import { Web3 } from 'web3'
import { DebuggerUI } from '@remix-ui/debugger-ui' // eslint-disable-line
import { DebuggerApiMixin } from '@remix-ui/debugger-ui'
import { ViewPlugin } from '@remixproject/engine-web'

@ -2,6 +2,9 @@
"filePanel.displayName": "File explorer",
"filePanel.workspace": "WORKSPACES",
"filePanel.create": "Create",
"filePanel.createLabel": "Create Using Template",
"filePanel.createBlank":"Create Blank",
"filePanel.create.desktop": "Create Project",
"filePanel.clone": "Clone",
"filePanel.download": "Download",
@ -9,7 +12,8 @@
"filePanel.restore": "Restore",
"filePanel.name": "Name",
"filePanel.save": "Save",
"filePanel.workspace.create": "Create Workspace",
"filePanel.workspace.create": "Create Workspace using template",
"filePanel.workspace.createBlank": "Create Blank Workspace",
"filePanel.workspace.create.desktop": "Create project in new folder",
"filePanel.workspace.rename": "Rename Workspace",
"filePanel.workspace.save_workspace": "Save Workspace",

@ -7,9 +7,9 @@
"home.learnMore": "Learn more",
"home.here": "more",
"home.featured": "Featured",
"home.jumpIntoWeb3": "JUMP INTO WEB3",
"home.jumpIntoWeb3More": "More",
"home.jumpIntoWeb3Text": "Remix IDE is part of the Remix Project, a rich toolset that can be used for the entire journey of contract development by users of any knowledge level. Learn more on the Remix Project website.",
"home.learnEthPromoTitle": "LearnEth: Tutorials inside Remix",
"home.learnEthPromoButton": "Start Learning",
"home.learnEthPromoText": "Check out tutorials on Remix, Solidity, and other Web3 projects. Great for all skill levels.",
"home.remixYouTube": "WATCH TO LEARN",
"home.remixYouTubeText1": "Video Tips from the Remix Team",
"home.remixYouTubeMore": "Watch",
@ -37,6 +37,7 @@
"home.ozerc1155TemplateDesc": "Create an ERC1155 token by importing OpenZeppelin library.",
"home.gnosisSafeMultisigTemplateDesc": "Create Multi-Signature wallets using this template.",
"home.zeroxErc20TemplateDesc": "Create an ERC20 token by importing 0xProject contract.",
"home.learnEthPluginDesc": "Learn about Remix, Solidity, and other Web3 projects.",
"home.learn": "Learn",
"home.learnEth1": "Remix Basics",
"home.learnEth1Desc": "An introduction to Remix's interface and basic operations.",

@ -1,16 +1,18 @@
{
"settings.displayName": "Settings",
"settings.reset": "Reset to Default settings",
"settings.general": "General settings",
"settings.generateContractMetadataText": "Generate contract metadata. Generate a JSON file in the contract folder. Allows to specify library addresses the contract depends on. If nothing is specified, Remix deploys libraries automatically.",
"settings.general": "General",
"settings.generateContractMetadataText": "Generate contract metadata",
"settings.generateContractMetadataTooltip": "Generate a JSON file in the contract folder. Allows to specify library addresses the contract depends on. If nothing is specified, Remix deploys libraries automatically.",
"settings.ethereunVMText": "Always use the Remix VM at load",
"settings.wordWrapText": "Word wrap in editor",
"settings.useAutoCompleteText": "Enable code completion in editor.",
"settings.useShowGasInEditorText": "Display gas estimates in editor.",
"settings.displayErrorsText": "Display errors in editor while typing.",
"settings.matomoAnalytics": "Enable Matomo Analytics. We do not collect personally identifiable information (PII). The info is used to improve the site’s UX & UI. See more about ",
"settings.enablePersonalModeText": " Enable Personal Mode for web3 provider. Transaction sent over Web3 will use the web3.personal API.\n",
"settings.warnText": "Be sure the endpoint is opened before enabling it. This mode allows a user to provide a passphrase in the Remix interface without having to unlock the account. Although this is very convenient, you should completely trust the backend you are connected to (Geth, Parity, ...). Remix never persists any passphrase",
"settings.useAutoCompleteText": "Enable code completion in editor",
"settings.useShowGasInEditorText": "Display gas estimates in editor",
"settings.displayErrorsText": "Display errors in editor while typing",
"settings.matomoAnalytics": "Enable Matomo Analytics. See",
"settings.matomoAnalyticsTooltip": "We do not collect personally identifiable information (PII). The info is used to improve the site’s UX & UI.",
"settings.enablePersonalModeText": " Enable Personal Mode for web3 provider",
"settings.enablePersonalModeTooltip": "Transaction sent over Web3 will use the web3.personal API. Be sure the endpoint is opened before enabling it. This mode allows a user to provide a passphrase in the Remix interface without having to unlock the account. Although this is very convenient, you should completely trust the backend you are connected to (Geth, Parity, ...). Remix never persists any passphrase",
"settings.gitAccessTokenTitle": "Github Credentials",
"settings.gitAccessTokenText": "The access token is used to publish a Gist and retrieve GitHub contents. You may need to input username/email.",
"settings.gitAccessTokenText2":"Go to github token page (link below) to create a new token and save it in Remix. Make sure this token has only 'create gist' permission",

Binary file not shown.

After

Width:  |  Height:  |  Size: 62 KiB

File diff suppressed because it is too large Load Diff

@ -1,6 +1,6 @@
/* global ethereum */
'use strict'
import Web3 from 'web3'
import { Web3 } from 'web3'
import { execution } from '@remix-project/remix-lib'
import EventManager from '../lib/events'
import { bytesToHex } from '@ethereumjs/util'

@ -1,4 +1,4 @@
import Web3 from 'web3'
import { Web3 } from 'web3'
import { hashPersonalMessage, isHexString, bytesToHex } from '@ethereumjs/util'
import { ExecutionContext } from '../execution-context'

@ -1,4 +1,4 @@
import Web3 from 'web3'
import { Web3 } from 'web3'
import { hashPersonalMessage, isHexString, bytesToHex } from '@ethereumjs/util'
import { Personal } from 'web3-eth-personal'
import { ExecutionContext } from '../execution-context'

@ -1,4 +1,4 @@
import Web3, { FMT_BYTES, FMT_NUMBER, LegacySendAsyncProvider } from 'web3'
import { Web3, FMT_BYTES, FMT_NUMBER, LegacySendAsyncProvider } from 'web3'
import { fromWei, toBigInt } from 'web3-utils'
import { privateToAddress, hashPersonalMessage, isHexString, bytesToHex } from '@ethereumjs/util'
import { extend, JSONRPCRequestPayload, JSONRPCResponseCallback } from '@remix-project/remix-simulator'

@ -3,7 +3,7 @@ import { ethers } from "ethers"
import { Provider } from '@remix-project/remix-simulator'
import { getArtifactsByContractName } from './artifacts-helper'
import { SignerWithAddress } from './signer'
import Web3 from "web3"
import { Web3 } from "web3"
const providerConfig = {
fork: global.fork || null,

@ -1,4 +1,4 @@
import Web3 from 'web3'
import { Web3 } from 'web3'
import { Debugger } from '../debugger/debugger'
import { EventEmitter } from 'events'

@ -1,5 +1,5 @@
'use strict'
import Web3, { Web3PluginBase } from 'web3'
import { Web3, Web3PluginBase } from 'web3'
import { toNumber } from 'web3-utils'
export function extendWeb3 (web3) {

@ -1,7 +1,7 @@
'use strict'
import { EventManager } from '../eventManager'
import type { Transaction as InternalTransaction } from './txRunner'
import Web3 from 'web3'
import { Web3 } from 'web3'
import { toBigInt, toHex } from 'web3-utils'
export class TxRunnerWeb3 {

@ -1,5 +1,5 @@
'use strict'
import Web3, { Web3PluginBase } from 'web3'
import { Web3, Web3PluginBase } from 'web3'
import { toNumber } from 'web3-utils'
export function extendWeb3 (web3) {

@ -1,5 +1,5 @@
/* global describe, before, it */
import Web3, { FMT_BYTES, FMT_NUMBER } from 'web3'
import { Web3, FMT_BYTES, FMT_NUMBER } from 'web3'
import { Provider } from '../src/index'
const web3 = new Web3()
import * as assert from 'assert'

@ -1,5 +1,5 @@
/* global describe, before, it */
import Web3 from 'web3'
import { Web3 } from 'web3'
import { Provider } from '../src/index'
const web3 = new Web3()
import * as assert from 'assert'

@ -1,5 +1,5 @@
/* global describe, before, it */
import Web3 from 'web3'
import { Web3 } from 'web3'
import { Provider } from '../src/index'
const web3 = new Web3()
import * as assert from 'assert'

@ -1,5 +1,5 @@
/* global describe, before, it */
import Web3 from 'web3'
import { Web3 } from 'web3'
import { Provider } from '../src/index'
const web3 = new Web3()
import * as assert from 'assert'

@ -1,5 +1,5 @@
/* global describe, before, it */
import Web3 from 'web3'
import { Web3 } from 'web3'
import { LegacyTransaction, FeeMarketEIP1559Transaction } from '@ethereumjs/tx'
import { Provider } from '../src/index'
const web3 = new Web3()

@ -1,6 +1,6 @@
import async from 'async'
import { execution } from '@remix-project/remix-lib'
import Web3, { FMT_BYTES, FMT_NUMBER } from 'web3'
import { Web3, FMT_BYTES, FMT_NUMBER } from 'web3'
import { compilationInterface } from './types'
/**

@ -1,5 +1,5 @@
import { Command } from 'commander';
import Web3 from 'web3'
import { Web3 } from 'web3'
import path from 'path'
import axios, { AxiosResponse } from 'axios'
import { runTestFiles } from './runTestFiles'

@ -3,7 +3,7 @@ import fs from './fileSystem'
import { runTest } from './testRunner'
import { TestResultInterface, ResultsInterface, CompilerConfiguration, compilationInterface, ASTInterface, Options, AstNode } from './types'
import colors from 'colors'
import Web3 from 'web3'
import { Web3 } from 'web3'
import { format } from 'util'
import { compileFileOrFiles } from './compiler'
import { deployAll } from './deployer'

@ -2,7 +2,7 @@ import async, { ErrorCallback } from 'async'
import { compileContractSources, writeTestAccountsContract } from './compiler'
import { deployAll } from './deployer'
import { runTest } from './testRunner'
import Web3 from 'web3'
import { Web3 } from 'web3'
import { EventEmitter } from 'events'
import { Provider, extend } from '@remix-project/remix-simulator'
import {

@ -1,6 +1,6 @@
import async from 'async'
import * as changeCase from 'change-case'
import Web3 from 'web3'
import { Web3 } from 'web3'
import assertionEvents from './assertionEvents'
import {
RunListInterface, TestCbInterface, TestResultInterface, ResultCbInterface,

@ -1,5 +1,5 @@
import * as async from 'async'
import Web3 from 'web3';
import { Web3 } from 'web3';
import * as assert from 'assert'
import { Provider, extend } from '@remix-project/remix-simulator'

@ -1,4 +1,4 @@
import Web3 from 'web3'
import { Web3 } from 'web3'
import { init , traceHelper, TransactionDebugger as Debugger } from '@remix-project/remix-debug'
import { CompilerAbstract } from '@remix-project/remix-solidity'
import { lineText } from '@remix-ui/editor'

@ -21,6 +21,6 @@
}
* {
scrollbar-width: thin;
scrollbar-width: 0.5rem;
scrollbar-color: var(--bg-dark) var(--bg-light);
}
}

@ -7,8 +7,11 @@ import 'react-multi-carousel/lib/styles.css'
import * as releaseDetails from './../../../../../../releaseDetails.json'
const _paq = (window._paq = window._paq || []) // eslint-disable-line
export type HomeTabFeaturedProps = {
plugin: any
}
function HomeTabFeatured() {
function HomeTabFeatured(props:HomeTabFeaturedProps) {
const themeFilter = useContext(ThemeContext)
return (
@ -64,23 +67,27 @@ function HomeTabFeatured() {
</div>
<div className="mr-1 pr-1 d-flex align-items-center justify-content-center h-100">
<a href="https://remix-project.org" target="__blank">
<img src={'assets/img/bgRemi_small.webp'} className="remixui_carouselImage" alt=""></img>
<img src={'assets/img/remi-prof.webp'} className="remixui_carouselImage" alt=""></img>
</a>
<div className="h6 w-50 p-2 pl-4 align-self-center" style={{ flex: '1' }}>
<h5>
<FormattedMessage id="home.jumpIntoWeb3" />
<FormattedMessage id="home.learnEthPromoTitle" />
</h5>
<div style={{ fontSize: '0.8rem', lineHeight: '1.25rem' }} className="mb-3">
<FormattedMessage id="home.jumpIntoWeb3Text" />
<FormattedMessage id="home.learnEthPromoText" />
</div>
<a
<span
className="remixui_home_text btn-sm btn-secondary mt-2 text-decoration-none mb-3"
onClick={() => _paq.push(['trackEvent', 'hometab', 'featuredSection', 'jumpIntoWeb3'])}
target="__blank"
href="https://remix-project.org/"
style={{ cursor: 'pointer' }}
onClick={async () => {
await props.plugin.appManager.activatePlugin(['LearnEth', 'solidityUnitTesting'])
props.plugin.verticalIcons.select('LearnEth')
await props.plugin.call('LearnEth', 'home')
}
}
>
<FormattedMessage id="home.jumpIntoWeb3More" />
</a>
<FormattedMessage id="home.learnEthPromoButton" />
</span>
</div>
</div>
<div className="mr-1 pr-1 d-flex align-items-center justify-content-center h-100">

@ -67,10 +67,10 @@ function HomeTabFeaturedPlugins({ plugin }: HomeTabFeaturedPluginsProps) {
plugin.verticalIcons.select('solidityStaticAnalysis')
_paq.push(['trackEvent', 'hometabActivate', 'userActivate', 'solidityStaticAnalysis'])
}
const startSourceVerify = async () => {
await plugin.appManager.activatePlugin(['solidity', 'sourcify'])
plugin.verticalIcons.select('sourcify')
_paq.push(['trackEvent', 'hometabActivate', 'userActivate', 'sourcify'])
const startLearnEth = async () => {
await plugin.appManager.activatePlugin(['LearnEth', 'solidity', 'solidityUnitTesting'])
plugin.verticalIcons.select('LearnEth')
_paq.push(['trackEvent', 'hometabActivate', 'userActivate', 'LearnEth'])
}
const startCookbook = async () => {
await plugin.appManager.activatePlugin(['cookbookdev'])
@ -109,7 +109,7 @@ function HomeTabFeaturedPlugins({ plugin }: HomeTabFeaturedPluginsProps) {
}
}}
renderButtonGroupOutside={true}
ssr={true} // means to render carousel on server-side.
ssr={false} // means to render carousel on server-side.
keyBoardControl={true}
containerClass="carousel-container"
deviceType={'desktop'}
@ -125,6 +125,16 @@ function HomeTabFeaturedPlugins({ plugin }: HomeTabFeaturedPluginsProps) {
remixMaintained={true}
callback={() => startCodeAnalyzer()}
/>
<PluginButton
imgPath="assets/img/learnEthLogo.webp"
envID="learnEthLogo"
envText="LearnEth Tutorials"
description={intl.formatMessage({
id: 'home.learnEthPluginDesc'
})}
remixMaintained={true}
callback={() => startLearnEth()}
/>
<PluginButton
imgPath="assets/img/cookbook.webp"
envID="cookbookLogo"
@ -141,13 +151,6 @@ function HomeTabFeaturedPlugins({ plugin }: HomeTabFeaturedPluginsProps) {
remixMaintained={true}
callback={() => startSolidity()}
/>
<PluginButton
imgPath="assets/img/sourcifyNewLogo.webp"
envID="sourcifyLogo"
envText="Sourcify"
description={intl.formatMessage({ id: 'home.sourcifyPluginDesc' })}
callback={() => startSourceVerify()}
/>
<PluginButton
imgPath="assets/img/unitTesting.webp"
envID="sUTLogo"

@ -86,7 +86,7 @@ export const RemixUiHomeTab = (props: RemixUiHomeTabProps) => {
</div>
<div className="pl-2 pr-3 justify-content-start d-flex flex-column" style={{ width: `${carouselWidth}%` }} id="remixUIHTRight">
<LanguageOptions plugin={plugin}/>
<HomeTabFeatured></HomeTabFeatured>
<HomeTabFeatured plugin={plugin}></HomeTabFeatured>
<HomeTabFeaturedPlugins plugin={plugin}></HomeTabFeaturedPlugins>
</div>
</div>

@ -9,7 +9,7 @@ import { DeployMode, MainnetPrompt } from "../types"
import { displayNotification, fetchProxyDeploymentsSuccess, setDecodedResponse, updateInstancesBalance } from "./payload"
import { addInstance } from "./actions"
import { addressToString, logBuilder } from "@remix-ui/helper"
import Web3 from "web3"
import { Web3 } from "web3"
declare global {
interface Window {

@ -6,7 +6,7 @@ import { addDeployOption, clearAllInstances, clearAllPinnedInstances, clearRecor
import { updateInstanceBalance } from './deploy'
import { CompilerAbstract } from '@remix-project/remix-solidity'
import BN from 'bn.js'
import Web3 from 'web3'
import { Web3 } from 'web3'
import { Plugin } from "@remixproject/engine"
import { getNetworkProxyAddresses } from "./deploy"
import { shortenAddress } from "@remix-ui/helper"

@ -1,4 +1,4 @@
import Web3 from 'web3'
import { Web3 } from 'web3'
export class ExecutionContext {
event: any;

@ -249,6 +249,13 @@ export const RemixUiSettings = (props: RemixUiSettingsProps) => {
htmlFor="generatecontractmetadata"
>
<FormattedMessage id="settings.generateContractMetadataText" />
<CustomTooltip
placement="auto"
tooltipId="settings-tooltip-metadata"
tooltipText={intl.formatMessage({ id: 'settings.generateContractMetadataTooltip' })}
>
<i className="ml-1 far fa-info-circle"></i>
</CustomTooltip>
</label>
</div>
<div className="mt-2 custom-control custom-checkbox mb-1">
@ -296,11 +303,14 @@ export const RemixUiSettings = (props: RemixUiSettingsProps) => {
<div className="custom-control custom-checkbox mb-1">
<input onChange={onchangePersonal} id="personal" type="checkbox" className="custom-control-input" checked={isPersonalChecked} />
<label className={`form-check-label custom-control-label align-middle ${getTextClass('settings/personal-mode')}`} htmlFor="personal">
<i className="fas fa-exclamation-triangle text-warning" aria-hidden="true"></i> <span> </span>
<span> </span>
<FormattedMessage id="settings.enablePersonalModeText" />
&nbsp;
<FormattedMessage id="settings.warnText" />
<CustomTooltip
placement="auto"
tooltipId="settings-tooltip-personalMode"
tooltipText={intl.formatMessage({ id: 'settings.enablePersonalModeTooltip' })}
>
<i className="ml-1 fas fa-exclamation-triangle text-warning" aria-hidden="true"></i>
</CustomTooltip>
</label>
</div>
<div className="custom-control custom-checkbox mb-1">
@ -309,7 +319,7 @@ export const RemixUiSettings = (props: RemixUiSettingsProps) => {
<span>
<FormattedMessage id="settings.matomoAnalytics" />
</span>
<a href="https://medium.com/p/66ef69e14931/" target="_blank">
<a href="https://medium.com/remix-ide/help-us-improve-remix-ide-66ef69e14931" target="_blank">
{' '}
<FormattedMessage id="settings.analyticsInRemix" />
</a>{' '}
@ -317,6 +327,13 @@ export const RemixUiSettings = (props: RemixUiSettingsProps) => {
<a target="_blank" href="https://matomo.org/free-software">
Matomo
</a>
<CustomTooltip
placement="auto"
tooltipId="settings-tooltip-matomo"
tooltipText={intl.formatMessage({ id: 'settings.matomoAnalyticsTooltip' })}
>
<i className="ml-1 far fa-info-circle"></i>
</CustomTooltip>
</label>
</div>
<div className="custom-control custom-checkbox mb-1">

@ -0,0 +1,51 @@
import React from 'react'
import { FormattedMessage } from 'react-intl'
export const createModalMessage = async (
defaultName: string,
gitConfigNotSet: boolean,
onChangeTemplateName: (name: string) => void,
onChangeInitGit: (name: string) => void) => {
return (
<>
<label id="wsName" className="form-check-label" style={{ fontWeight: 'bolder' }}>
<FormattedMessage id="filePanel.workspaceName" />
</label>
<input
type="text"
data-id="modalDialogCustomPromptTextCreate"
defaultValue={defaultName}
className="form-control"
onChange={(e) => onChangeTemplateName(e.target.value)}
onInput={(e) => onChangeTemplateName((e.target as any).value)}
/>
<div className="d-flex py-2 align-items-center custom-control custom-checkbox">
<input
id="initGitRepository"
data-id="initGitRepository"
className="form-check-input custom-control-input"
type="checkbox"
disabled={gitConfigNotSet}
onChange={(e) => onChangeInitGit(e.target.value)}
onInput={(e) => onChangeInitGit((e.target as any).value)}
/>
<label
htmlFor="initGitRepository"
data-id="initGitRepositoryLabel"
className="m-0 form-check-label custom-control-label udapp_checkboxAlign"
title={window._intl.formatMessage({ id: 'filePanel.initGitRepoTitle' })}
>
<FormattedMessage id="filePanel.initGitRepositoryLabel" />
</label>
</div>
{gitConfigNotSet ? (
<div className="text-warning">
<FormattedMessage id="filePanel.initGitRepositoryWarning" />
</div>
) : (
<></>
)}
</>
)
}

@ -32,7 +32,7 @@ export function HamburgerMenuItem(props: HamburgerMenuItemProps) {
>
<span hidden={hideOption} id={uid} data-id={uid} className={props.fa + ' pl-2'} style={{ width: '1.4rem' }}></span>
<span className="px-2">
<FormattedMessage id={'filePanel.' + props.kind} />
{props.kind === 'create' ? <FormattedMessage id={'filePanel.createLabel'} /> :<FormattedMessage id={'filePanel.' + props.kind} />}
</span>
</div>
</CustomTooltip>

@ -7,6 +7,7 @@ import { WorkspaceMetadata } from '../types'
export interface HamburgerMenuProps {
selectedWorkspace: WorkspaceMetadata
createWorkspace: () => void
createBlankWorkspace: () => Promise<void>
renameCurrentWorkspace: () => void
downloadCurrentWorkspace: () => void
deleteCurrentWorkspace: () => void
@ -26,6 +27,16 @@ export function HamburgerMenu(props: HamburgerMenuProps) {
const { showIconsMenu, hideWorkspaceOptions, hideLocalhostOptions, hideFileOperations, selectedWorkspace } = props
return (
<>
<HamburgerMenuItem
kind="createBlank"
fa="far fa-plus"
hideOption={hideWorkspaceOptions}
actionOnClick={() => {
props.createBlankWorkspace()
props.hideIconsMenu(!showIconsMenu)
}}
platforms={[appPlatformTypes.web]}
></HamburgerMenuItem>
<HamburgerMenuItem
kind="create"
fa="far fa-plus"

@ -17,8 +17,9 @@ import { customAction } from '@remixproject/plugin-api'
import { AppContext, appPlatformTypes, platformContext } from '@remix-ui/app'
import { ElectronMenu } from './components/electron-menu'
import { ElectronWorkspaceName } from './components/electron-workspace-name'
import { branch } from '@remix-api'
import { branch} from '@remix-api'
import { gitUIPanels } from '@remix-ui/git'
import { createModalMessage } from './components/createModal'
const _paq = (window._paq = window._paq || [])
@ -336,6 +337,26 @@ export function Workspace() {
)
}
const [counter, setCounter] = useState(1)
const createBlankWorkspace = async () => {
const username = await global.plugin.call('settings', 'get', 'settings/github-user-name')
const email = await global.plugin.call('settings', 'get', 'settings/github-email')
const gitNotSet = !username || !email
const defaultName = await global.plugin.call('filePanel', 'getAvailableWorkspaceName', 'blank')
let workspace = defaultName
let gitInit = false
setCounter((previous) => {
return previous + 1
})
global.modal(
intl.formatMessage({ id: 'filePanel.workspace.createBlank' }),
await createModalMessage(`blank - ${counter}`, gitNotSet, (value) => { workspace = value }, (value) => gitInit = false),
intl.formatMessage({ id: 'filePanel.ok' }),
() => global.dispatchCreateWorkspace(`blank - ${counter}`, 'blank', false),
intl.formatMessage({ id: 'filePanel.cancel' })
)
}
const saveSampleCodeWorkspace = () => {
const workspaceName = global.plugin.getAvailableWorkspaceName('code-sample')
global.modal(
@ -927,6 +948,7 @@ export function Workspace() {
<HamburgerMenu
selectedWorkspace={selectedWorkspace}
createWorkspace={createWorkspace}
createBlankWorkspace={createBlankWorkspace}
renameCurrentWorkspace={renameCurrentWorkspace}
downloadCurrentWorkspace={downloadCurrentWorkspace}
deleteCurrentWorkspace={deleteCurrentWorkspace}

@ -1,11 +1,13 @@
{
"version": "v0.53.0",
"version": "v0.54.0",
"title": "RELEASE HIGHLIGHTS",
"highlight1": "Keyboard shortcut for Cut-Copy-Paste files and folder",
"highlight2": "Interface to generate proof in Circom compiler plugin",
"highlight3": "Publish multi-selected files to Gist",
"highlight1": "Login to GitHub from 'File Explorer'",
"highlight2": "Added Cookbook workspace templates",
"highlight3": "Added 'sendRawTransaction' API to remix-simulator",
"highlight4": "",
"more": "Read More",
"moreLink": "https://medium.com/remix-ide/remix-release-v0-53-0-615d9e7c6c58?source=friends_link&sk=35e918e8487aaab02e79ea4dc557a7e7"
"moreLink": "https://medium.com/remix-ide/remix-release-v0-54-0-021575d54849?source=friends_link&sk=e3960ba90994b63993987b007ee3ac63"
}

@ -14099,9 +14099,9 @@ dotignore@~0.1.2:
minimatch "^3.0.4"
dset@^3.1.2:
version "3.1.3"
resolved "https://registry.yarnpkg.com/dset/-/dset-3.1.3.tgz#c194147f159841148e8e34ca41f638556d9542d2"
integrity sha512-20TuZZHCEZ2O71q9/+8BwKwZ0QtD9D8ObhrihJPr+vLLYlSuAU3/zL4cSlgbfeoGHTjCSJBa7NGcrF9/Bx/WJQ==
version "3.1.4"
resolved "https://registry.yarnpkg.com/dset/-/dset-3.1.4.tgz#f8eaf5f023f068a036d08cd07dc9ffb7d0065248"
integrity sha512-2QF/g9/zTaPDc3BjNcVTGoBbXBgYfMTTceLaYcFJ/W9kggFUkhxD/hMEeuLKbugyef9SqAx8cpgwlIP/jinUTA==
duplexer2@^0.1.2, duplexer2@~0.1.0, duplexer2@~0.1.2:
version "0.1.4"

Loading…
Cancel
Save