git4refactor
filip mertens 7 months ago
parent 7da0d585f3
commit 32d9abf089
  1. 6
      apps/remix-ide/src/app/components/hidden-panel.tsx
  2. 8
      apps/remix-ide/src/app/components/main-panel.tsx
  3. 2
      apps/remix-ide/src/app/components/panel.ts
  4. 18
      apps/remix-ide/src/app/components/preload.tsx
  5. 8
      apps/remix-ide/src/app/components/side-panel.tsx
  6. 10
      apps/remix-ide/src/app/components/vertical-icons.tsx
  7. 10
      apps/remix-ide/src/app/files/dgitProvider.ts
  8. 2
      apps/remix-ide/src/app/files/electronProvider.ts
  9. 27
      apps/remix-ide/src/app/files/fileManager.ts
  10. 3
      apps/remix-ide/src/app/files/fileProvider.ts
  11. 1
      apps/remix-ide/src/app/files/fileSystem.ts
  12. 2
      apps/remix-ide/src/app/files/filesystems/fileSystemUtility.ts
  13. 1
      apps/remix-ide/src/app/files/filesystems/indexedDB.ts
  14. 2
      apps/remix-ide/src/app/files/filesystems/localStorage.ts
  15. 6
      apps/remix-ide/src/app/panels/terminal.tsx
  16. 3
      apps/remix-ide/src/app/plugins/code-format.ts
  17. 1
      apps/remix-ide/src/app/plugins/code-format/parser.ts
  18. 2
      apps/remix-ide/src/app/plugins/compile-details.tsx
  19. 2
      apps/remix-ide/src/app/plugins/config.ts
  20. 8
      apps/remix-ide/src/app/plugins/contractFlattener.tsx
  21. 4
      apps/remix-ide/src/app/plugins/electron/compilerLoaderPlugin.ts
  22. 6
      apps/remix-ide/src/app/plugins/electron/fsPlugin.ts
  23. 4
      apps/remix-ide/src/app/plugins/file-decorator.ts
  24. 1
      apps/remix-ide/src/app/plugins/git.tsx
  25. 10
      apps/remix-ide/src/app/plugins/notification.tsx
  26. 8
      apps/remix-ide/src/app/plugins/openaigpt.tsx
  27. 5
      apps/remix-ide/src/app/plugins/parser/code-parser.tsx
  28. 17
      apps/remix-ide/src/app/plugins/parser/services/code-parser-antlr-service.ts
  29. 16
      apps/remix-ide/src/app/plugins/parser/services/code-parser-compiler.ts
  30. 9
      apps/remix-ide/src/app/plugins/parser/services/code-parser-gas-service.ts
  31. 14
      apps/remix-ide/src/app/plugins/parser/services/code-parser-imports.ts
  32. 10
      apps/remix-ide/src/app/plugins/parser/types/antlr-types.ts
  33. 20
      apps/remix-ide/src/app/plugins/permission-handler-plugin.tsx
  34. 46
      apps/remix-ide/src/app/plugins/remixGuide.tsx
  35. 24
      apps/remix-ide/src/app/plugins/remixd-handle.tsx
  36. 46
      apps/remix-ide/src/app/plugins/solcoderAI.tsx
  37. 18
      apps/remix-ide/src/app/plugins/solidity-script.tsx
  38. 28
      apps/remix-ide/src/app/plugins/solidity-umlgen.tsx
  39. 10
      apps/remix-ide/src/app/plugins/vyper-compilation-details.tsx
  40. 20
      apps/remix-ide/src/app/providers/abstract-provider.tsx
  41. 8
      apps/remix-ide/src/app/providers/custom-vm-fork-provider.tsx
  42. 6
      apps/remix-ide/src/app/providers/external-http-provider.tsx
  43. 4
      apps/remix-ide/src/app/providers/foundry-provider.tsx
  44. 4
      apps/remix-ide/src/app/providers/ganache-provider.tsx
  45. 2
      apps/remix-ide/src/app/providers/goerli-vm-fork-provider.tsx
  46. 4
      apps/remix-ide/src/app/providers/hardhat-provider.tsx
  47. 2
      apps/remix-ide/src/app/providers/injected-arbitrum-one-provider.tsx
  48. 12
      apps/remix-ide/src/app/providers/injected-custom-provider.tsx
  49. 6
      apps/remix-ide/src/app/providers/injected-ephemery-testnet-provider.tsx
  50. 2
      apps/remix-ide/src/app/providers/injected-optimism-provider.tsx
  51. 4
      apps/remix-ide/src/app/providers/injected-provider-default.tsx
  52. 2
      apps/remix-ide/src/app/providers/injected-provider-trustwallet.tsx
  53. 16
      apps/remix-ide/src/app/providers/injected-provider.tsx
  54. 6
      apps/remix-ide/src/app/providers/injected-skale-chaos-testnet-provider.tsx
  55. 2
      apps/remix-ide/src/app/providers/mainnet-vm-fork-provider.tsx
  56. 2
      apps/remix-ide/src/app/providers/sepolia-vm-fork-provider.tsx
  57. 8
      apps/remix-ide/src/app/providers/vm-provider.tsx
  58. 6
      apps/remix-ide/src/app/tabs/compile-and-run.ts
  59. 4
      apps/remix-ide/src/app/tabs/search.tsx
  60. 8
      apps/remix-ide/src/app/tabs/settings-tab.tsx
  61. 68
      apps/remix-ide/src/blockchain/blockchain.tsx
  62. 2
      apps/remix-ide/src/blockchain/helper.ts
  63. 7
      apps/remix-ide/src/blockchain/providers/vm.ts
  64. 14
      apps/remix-ide/src/blockchain/providers/worker-vm.ts
  65. 16
      apps/remix-ide/src/index.tsx

@ -1,9 +1,9 @@
// eslint-disable-next-line no-use-before-define // eslint-disable-next-line no-use-before-define
import React from 'react' import React from 'react'
import {AbstractPanel} from './panel' import { AbstractPanel } from './panel'
import * as packageJson from '../../../../../package.json' import * as packageJson from '../../../../../package.json'
import {RemixPluginPanel} from '@remix-ui/panel' import { RemixPluginPanel } from '@remix-ui/panel'
import {PluginViewWrapper} from '@remix-ui/helper' import { PluginViewWrapper } from '@remix-ui/helper'
const profile = { const profile = {
name: 'hiddenPanel', name: 'hiddenPanel',

@ -1,8 +1,8 @@
import React from 'react' // eslint-disable-line import React from 'react' // eslint-disable-line
import {AbstractPanel} from './panel' import { AbstractPanel } from './panel'
import {RemixPluginPanel} from '@remix-ui/panel' import { RemixPluginPanel } from '@remix-ui/panel'
import packageJson from '../../../../../package.json' import packageJson from '../../../../../package.json'
import {PluginViewWrapper} from '@remix-ui/helper' import { PluginViewWrapper } from '@remix-ui/helper'
const profile = { const profile = {
name: 'mainPanel', name: 'mainPanel',
@ -60,7 +60,7 @@ export class MainPanel extends AbstractPanel {
render() { render() {
return ( return (
<div style={{height: '100%', width: '100%'}} data-id="mainPanelPluginsContainer"> <div style={{ height: '100%', width: '100%' }} data-id="mainPanelPluginsContainer">
<PluginViewWrapper plugin={this} /> <PluginViewWrapper plugin={this} />
</div> </div>
) )

@ -49,7 +49,7 @@ export class AbstractPanel extends HostPlugin {
* @param {String} name The name of the plugin to display the content * @param {String} name The name of the plugin to display the content
*/ */
showContent (name) { showContent (name) {
if (!this.plugins[name]) throw new Error(`Plugin ${name} is not yet activated`) if (!this.plugins[name]) throw new Error(`Plugin ${name} is not yet activated`)
Object.values(this.plugins).forEach(plugin => { Object.values(this.plugins).forEach(plugin => {
plugin.active = false plugin.active = false
}) })

@ -1,12 +1,12 @@
import {RemixApp} from '@remix-ui/app' import { RemixApp } from '@remix-ui/app'
import axios from 'axios' import axios from 'axios'
import React, {useEffect, useRef, useState} from 'react' import React, { useEffect, useRef, useState } from 'react'
import { createRoot } from 'react-dom/client' import { createRoot } from 'react-dom/client'
import * as packageJson from '../../../../../package.json' import * as packageJson from '../../../../../package.json'
import {fileSystem, fileSystems} from '../files/fileSystem' import { fileSystem, fileSystems } from '../files/fileSystem'
import {indexedDBFileSystem} from '../files/filesystems/indexedDB' import { indexedDBFileSystem } from '../files/filesystems/indexedDB'
import {localStorageFS} from '../files/filesystems/localStorage' import { localStorageFS } from '../files/filesystems/localStorage'
import {fileSystemUtility, migrationTestData} from '../files/filesystems/fileSystemUtility' import { fileSystemUtility, migrationTestData } from '../files/filesystems/fileSystemUtility'
import './styles/preload.css' import './styles/preload.css'
import isElectron from 'is-electron' import isElectron from 'is-electron'
const _paq = (window._paq = window._paq || []) const _paq = (window._paq = window._paq || [])
@ -83,7 +83,7 @@ export const Preload = (props: any) => {
} }
useEffect (() => { useEffect (() => {
if(isElectron()){ if (isElectron()){
loadAppComponent() loadAppComponent()
return return
} }
@ -177,8 +177,8 @@ export const Preload = (props: any) => {
) : null} ) : null}
{supported && !error && !showDownloader ? ( {supported && !error && !showDownloader ? (
<div> <div>
<div className='text-center'> <div className='text-center'>
<i className="fas fa-spinner fa-spin fa-2x"></i> <i className="fas fa-spinner fa-spin fa-2x"></i>
</div> </div>
{ tip && <div className='remix_tips text-center mt-3'> { tip && <div className='remix_tips text-center mt-3'>
<div><b>DID YOU KNOW</b></div> <div><b>DID YOU KNOW</b></div>

@ -1,10 +1,10 @@
// eslint-disable-next-line no-use-before-define // eslint-disable-next-line no-use-before-define
import React from 'react' import React from 'react'
import {AbstractPanel} from './panel' import { AbstractPanel } from './panel'
import {RemixPluginPanel} from '@remix-ui/panel' import { RemixPluginPanel } from '@remix-ui/panel'
import packageJson from '../../../../../package.json' import packageJson from '../../../../../package.json'
import {RemixUIPanelHeader} from '@remix-ui/panel' import { RemixUIPanelHeader } from '@remix-ui/panel'
import {PluginViewWrapper} from '@remix-ui/helper' import { PluginViewWrapper } from '@remix-ui/helper'
// const csjs = require('csjs-inject') // const csjs = require('csjs-inject')
const sidePanel = { const sidePanel = {

@ -1,11 +1,11 @@
// eslint-disable-next-line no-use-before-define // eslint-disable-next-line no-use-before-define
import React from 'react' import React from 'react'
import packageJson from '../../../../../package.json' import packageJson from '../../../../../package.json'
import {Plugin} from '@remixproject/engine' import { Plugin } from '@remixproject/engine'
import {EventEmitter} from 'events' import { EventEmitter } from 'events'
import {IconRecord, RemixUiVerticalIconsPanel} from '@remix-ui/vertical-icons-panel' import { IconRecord, RemixUiVerticalIconsPanel } from '@remix-ui/vertical-icons-panel'
import {Profile} from '@remixproject/plugin-utils' import { Profile } from '@remixproject/plugin-utils'
import {PluginViewWrapper} from '@remix-ui/helper' import { PluginViewWrapper } from '@remix-ui/helper'
const profile = { const profile = {
name: 'menuicons', name: 'menuicons',

@ -27,7 +27,6 @@ declare global {
interface Window { remixFileSystemCallback: IndexedDBStorage; remixFileSystem: any; } interface Window { remixFileSystemCallback: IndexedDBStorage; remixFileSystem: any; }
} }
const profile: LibraryProfile = { const profile: LibraryProfile = {
name: 'dGitProvider', name: 'dGitProvider',
displayName: 'Decentralized git', displayName: 'Decentralized git',
@ -162,7 +161,6 @@ class DGitProvider extends Plugin {
return status return status
} }
const status = await git.statusMatrix({ const status = await git.statusMatrix({
...await this.addIsomorphicGitConfigFS(), ...await this.addIsomorphicGitConfigFS(),
...cmd ...cmd
@ -265,7 +263,6 @@ class DGitProvider extends Plugin {
return status return status
} }
const status = await git.log({ const status = await git.log({
...await this.addIsomorphicGitConfigFS(), ...await this.addIsomorphicGitConfigFS(),
...cmd, ...cmd,
@ -986,7 +983,7 @@ class DGitProvider extends Plugin {
// OCTOKIT FEATURES // OCTOKIT FEATURES
async remotebranches(input: { owner: string, repo: string, token: string, page: number, per_page: number }) { async remotebranches(input: { owner: string, repo: string, token: string, page: number, per_page: number }) {
console.log(input) console.log(input)
const octokit = new Octokit({ const octokit = new Octokit({
@ -1003,8 +1000,6 @@ class DGitProvider extends Plugin {
return data.data return data.data
} }
async getGitHubUser(input: { token: string }): Promise<{ async getGitHubUser(input: { token: string }): Promise<{
user: GitHubUser, user: GitHubUser,
ratelimit: RateLimit ratelimit: RateLimit
@ -1023,7 +1018,6 @@ class DGitProvider extends Plugin {
const localResetTime = ratelimit.data.rate.reset * 1000 const localResetTime = ratelimit.data.rate.reset * 1000
const localResetTimeString = new Date(localResetTime).toLocaleString() const localResetTimeString = new Date(localResetTime).toLocaleString()
console.log('rate limit', localResetTimeString) console.log('rate limit', localResetTimeString)
const user = await octokit.request('GET /user') const user = await octokit.request('GET /user')
@ -1118,13 +1112,11 @@ class DGitProvider extends Plugin {
'Accept': 'application/vnd.github.v3+json', // GitHub API v3 media type 'Accept': 'application/vnd.github.v3+json', // GitHub API v3 media type
}; };
const url = `${baseURL}?visibility=private,public&page=${page}&per_page=${perPage}&sort=${sort}&direction=${direction}`; const url = `${baseURL}?visibility=private,public&page=${page}&per_page=${perPage}&sort=${sort}&direction=${direction}`;
const response = await axios.get(url, { headers }); const response = await axios.get(url, { headers });
repositories.push(...response.data); repositories.push(...response.data);
return repositories return repositories
} }

@ -1,6 +1,5 @@
import FileProvider from "./fileProvider" import FileProvider from "./fileProvider"
declare global { declare global {
interface Window { interface Window {
remixFileSystem: any remixFileSystem: any
@ -50,7 +49,6 @@ export class ElectronProvider extends FileProvider {
} }
} }
// isDirectory is already included // isDirectory is already included
// this is a more efficient version of the default implementation // this is a more efficient version of the default implementation
async resolveDirectory(path, cb) { async resolveDirectory(path, cb) {

@ -4,7 +4,7 @@ import { saveAs } from 'file-saver'
import JSZip from 'jszip' import JSZip from 'jszip'
import { Plugin } from '@remixproject/engine' import { Plugin } from '@remixproject/engine'
import * as packageJson from '../../../../../package.json' import * as packageJson from '../../../../../package.json'
import {Registry} from '@remix-project/remix-lib' import { Registry } from '@remix-project/remix-lib'
import { fileChangedToastMsg, recursivePasteToastMsg, storageFullMessage } from '@remix-ui/helper' import { fileChangedToastMsg, recursivePasteToastMsg, storageFullMessage } from '@remix-ui/helper'
import helper from '../../lib/helper.js' import helper from '../../lib/helper.js'
import { RemixAppManager } from '../../remixAppManager' import { RemixAppManager } from '../../remixAppManager'
@ -252,7 +252,7 @@ class FileManager extends Plugin {
throw new Error(e) throw new Error(e)
} }
} }
/** /**
* Set the content of a specific file, does nnot rewrite file if it exists but creates a new unique name * Set the content of a specific file, does nnot rewrite file if it exists but creates a new unique name
* @param {string} path path of the file * @param {string} path path of the file
@ -266,11 +266,11 @@ class FileManager extends Plugin {
if (await this.exists(path)) { if (await this.exists(path)) {
const newPath = await helper.createNonClashingNameAsync(path, this) const newPath = await helper.createNonClashingNameAsync(path, this)
const content = await this.setFileContent(newPath, data) const content = await this.setFileContent(newPath, data)
return {newContent: content, newPath} return { newContent: content, newPath }
} else { } else {
const ret = await this.setFileContent(path, data) const ret = await this.setFileContent(path, data)
this.emit('fileAdded', path) this.emit('fileAdded', path)
return {newContent: ret, newpath: path} return { newContent: ret, newpath: path }
} }
} catch (e) { } catch (e) {
throw new Error(e) throw new Error(e)
@ -524,7 +524,7 @@ class FileManager extends Plugin {
this._deps.electronExplorer.event.on('fileRenamed', (oldName, newName, isFolder) => { this.fileRenamedEvent(oldName, newName, isFolder) }) this._deps.electronExplorer.event.on('fileRenamed', (oldName, newName, isFolder) => { this.fileRenamedEvent(oldName, newName, isFolder) })
this._deps.electronExplorer.event.on('fileRemoved', (path) => { this.fileRemovedEvent(path) }) this._deps.electronExplorer.event.on('fileRemoved', (path) => { this.fileRemovedEvent(path) })
this._deps.electronExplorer.event.on('fileAdded', (path) => { this.fileAddedEvent(path) }) this._deps.electronExplorer.event.on('fileAdded', (path) => { this.fileAddedEvent(path) })
this.getCurrentFile = this.file this.getCurrentFile = this.file
this.getFile = this.readFile this.getFile = this.readFile
this.getFolder = this.readdir this.getFolder = this.readdir
@ -709,7 +709,7 @@ class FileManager extends Plugin {
// TODO: Only keep `this.emit` (issue#2210) // TODO: Only keep `this.emit` (issue#2210)
this.emit('noFileSelected') this.emit('noFileSelected')
if(!change.readonly){ if (!change.readonly){
let file = this.normalize(change.path) let file = this.normalize(change.path)
const resolved = this.getPathFromUrl(file) const resolved = this.getPathFromUrl(file)
file = resolved.file file = resolved.file
@ -722,7 +722,7 @@ class FileManager extends Plugin {
} }
async closeDiff(change: commitChange) { async closeDiff(change: commitChange) {
if(!change.readonly){ if (!change.readonly){
const file = this.normalize(change.path) const file = this.normalize(change.path)
delete this.openedFiles[file] delete this.openedFiles[file]
if (!Object.keys(this.openedFiles).length) { if (!Object.keys(this.openedFiles).length) {
@ -734,7 +734,6 @@ class FileManager extends Plugin {
this.emit('closeDiff', change) this.emit('closeDiff', change)
} }
async openFile(file?: string) { async openFile(file?: string) {
if (!file) { if (!file) {
this.emit('noFileSelected') this.emit('noFileSelected')
@ -745,13 +744,12 @@ class FileManager extends Plugin {
await this.saveCurrentFile() await this.saveCurrentFile()
// we always open the file in the editor, even if it's the same as the current one if the editor is in diff mode // we always open the file in the editor, even if it's the same as the current one if the editor is in diff mode
if (this.currentFile() === file && !this.editor.isDiff) return if (this.currentFile() === file && !this.editor.isDiff) return
const provider = resolved.provider const provider = resolved.provider
this._deps.config.set('currentFile', file) this._deps.config.set('currentFile', file)
this.openedFiles[file] = file this.openedFiles[file] = file
let content = '' let content = ''
try { try {
content = await provider.get(file) content = await provider.get(file)
@ -761,7 +759,7 @@ class FileManager extends Plugin {
} }
try { try {
// This make sure dependencies are loaded in the editor context. // This make sure dependencies are loaded in the editor context.
// This ensure monaco is aware of deps artifacts, so it can provide basic features like "go to" symbols. // This ensure monaco is aware of deps artifacts, so it can provide basic features like "go to" symbols.
await this.editor.handleTypeScriptDependenciesOf(file, content, path => this.readFile(path), path => this.exists(path)) await this.editor.handleTypeScriptDependenciesOf(file, content, path => this.readFile(path), path => this.exists(path))
} catch (e) { } catch (e) {
console.log('unable to handle TypeScript dependencies of', file) console.log('unable to handle TypeScript dependencies of', file)
@ -963,7 +961,6 @@ class FileManager extends Plugin {
return exists return exists
} }
async moveFileIsAllowed (src: string, dest: string) { async moveFileIsAllowed (src: string, dest: string) {
try { try {
src = this.normalize(src) src = this.normalize(src)
@ -1006,7 +1003,7 @@ class FileManager extends Plugin {
if (provider.isSubDirectory(src, dest)) { if (provider.isSubDirectory(src, dest)) {
this.call('notification', 'toast', recursivePasteToastMsg()) this.call('notification', 'toast', recursivePasteToastMsg())
return false return false
} }
return true return true
} catch (e) { } catch (e) {
console.log(e) console.log(e)
@ -1069,7 +1066,7 @@ class FileManager extends Plugin {
if (provider.isSubDirectory(src, dest)) { if (provider.isSubDirectory(src, dest)) {
this.call('notification', 'toast', recursivePasteToastMsg()) this.call('notification', 'toast', recursivePasteToastMsg())
return false return false
} }
await this.inDepthCopy(src, dest, dirName) await this.inDepthCopy(src, dest, dirName)
await this.remove(src) await this.remove(src)
@ -1083,7 +1080,7 @@ class FileManager extends Plugin {
if (provider && provider.copyFolderToJson) { if (provider && provider.copyFolderToJson) {
return await provider.copyFolderToJson(folder) return await provider.copyFolderToJson(folder)
} }
throw new Error('copyFolderToJson not available') throw new Error('copyFolderToJson not available')
} }
} }

@ -5,7 +5,6 @@ import EventManager from 'events'
import { Storage } from '@remix-project/remix-lib' import { Storage } from '@remix-project/remix-lib'
import pathModule from 'path' import pathModule from 'path'
export default class FileProvider { export default class FileProvider {
event: any event: any
type: any type: any
@ -189,7 +188,7 @@ export default class FileProvider {
return await this.removeFile(path) return await this.removeFile(path)
} else { } else {
await window.remixFileSystem.unlink(path) await window.remixFileSystem.unlink(path)
this.event.emit('fileRemoved', this._normalizePath(path)) this.event.emit('fileRemoved', this._normalizePath(path))
} }
} catch (e) { } catch (e) {
console.log(e) console.log(e)

@ -67,6 +67,5 @@ export class fileSystems {
return null return null
} }
} }

@ -72,7 +72,6 @@ export class fileSystemUtility {
} }
} }
/** /**
* copy the folder recursively * copy the folder recursively
* @param {string} path is the folder to be copied over * @param {string} path is the folder to be copied over
@ -150,7 +149,6 @@ export class fileSystemUtility {
} }
} }
/* eslint-disable no-template-curly-in-string */ /* eslint-disable no-template-curly-in-string */
export const migrationTestData = { export const migrationTestData = {
'.workspaces': { '.workspaces': {

@ -47,7 +47,6 @@ export class IndexedDBStorage extends LightningFS {
} }
} }
export class indexedDBFileSystem extends fileSystem { export class indexedDBFileSystem extends fileSystem {
constructor() { constructor() {
super() super()

@ -48,7 +48,7 @@ export class localStorageFS extends fileSystem {
localStorage.setItem(test, test); localStorage.setItem(test, test);
localStorage.removeItem(test); localStorage.removeItem(test);
resolve(true) resolve(true)
} catch(e) { } catch (e) {
reject(e) reject(e)
} }
}) })

@ -3,7 +3,7 @@ import React from 'react' // eslint-disable-line
import { RemixUiTerminal, RemixUITerminalWrapper } from '@remix-ui/terminal' // eslint-disable-line import { RemixUiTerminal, RemixUITerminalWrapper } from '@remix-ui/terminal' // eslint-disable-line
import { Plugin } from '@remixproject/engine' import { Plugin } from '@remixproject/engine'
import * as packageJson from '../../../../../package.json' import * as packageJson from '../../../../../package.json'
import {Registry} from '@remix-project/remix-lib' import { Registry } from '@remix-project/remix-lib'
import { PluginViewWrapper } from '@remix-ui/helper' import { PluginViewWrapper } from '@remix-ui/helper'
import vm from 'vm' import vm from 'vm'
import EventManager from '../../lib/events' import EventManager from '../../lib/events'
@ -11,7 +11,6 @@ import EventManager from '../../lib/events'
import { CompilerImports } from '@remix-project/core-plugin' // eslint-disable-line import { CompilerImports } from '@remix-project/core-plugin' // eslint-disable-line
import { RemixUiXterminals } from '@remix-ui/xterm' import { RemixUiXterminals } from '@remix-ui/xterm'
const KONSOLES = [] const KONSOLES = []
function register(api) { KONSOLES.push(api) } function register(api) { KONSOLES.push(api) }
@ -113,7 +112,6 @@ class Terminal extends Plugin {
} }
onActivation() { onActivation() {
this.renderComponent() this.renderComponent()
} }
@ -142,7 +140,7 @@ class Terminal extends Plugin {
} }
updateComponent(state) { updateComponent(state) {
return( return (
<RemixUITerminalWrapper <RemixUITerminalWrapper
plugin={state.plugin} plugin={state.plugin}
onReady={state.onReady} onReady={state.onReady}

@ -210,8 +210,6 @@ export class CodeFormat extends Plugin {
this.call('notification', 'toast', `Error parsing prettier config file: ${prettierConfigFile}`) this.call('notification', 'toast', `Error parsing prettier config file: ${prettierConfigFile}`)
} }
// merge options // merge options
if (parsed) { if (parsed) {
options = { options = {
@ -251,7 +249,6 @@ export class CodeFormat extends Plugin {
} }
} }
const result = this.prettier.format(content, { const result = this.prettier.format(content, {
plugins: [sol as any, this.ts, this.babel, this.espree, this.yml], plugins: [sol as any, this.ts, this.babel, this.espree, this.yml],
parser: parserName, parser: parserName,

@ -194,4 +194,3 @@ export function parse(text, _parsers, options) {
return parsed; return parsed;
} }

@ -1,6 +1,6 @@
import React from 'react' import React from 'react'
import { ViewPlugin } from '@remixproject/engine-web' import { ViewPlugin } from '@remixproject/engine-web'
import {PluginViewWrapper} from '@remix-ui/helper' import { PluginViewWrapper } from '@remix-ui/helper'
import { RemixAppManager } from '../../remixAppManager' import { RemixAppManager } from '../../remixAppManager'
import { RemixUiCompileDetails } from '@remix-ui/solidity-compile-details' import { RemixUiCompileDetails } from '@remix-ui/solidity-compile-details'

@ -1,6 +1,6 @@
import { Plugin } from '@remixproject/engine' import { Plugin } from '@remixproject/engine'
import { QueryParams } from '@remix-project/remix-lib' import { QueryParams } from '@remix-project/remix-lib'
import {Registry} from '@remix-project/remix-lib' import { Registry } from '@remix-project/remix-lib'
const profile = { const profile = {
name: 'config', name: 'config',

@ -1,8 +1,8 @@
import React from 'react' import React from 'react'
import {Plugin} from '@remixproject/engine' import { Plugin } from '@remixproject/engine'
import {customAction} from '@remixproject/plugin-api' import { customAction } from '@remixproject/plugin-api'
import {concatSourceFiles, getDependencyGraph, normalizeContractPath} from '@remix-ui/solidity-compiler' import { concatSourceFiles, getDependencyGraph, normalizeContractPath } from '@remix-ui/solidity-compiler'
import type {CompilerInput, CompilationSource } from '@remix-project/remix-solidity' import type { CompilerInput, CompilationSource } from '@remix-project/remix-solidity'
const _paq = (window._paq = window._paq || []) const _paq = (window._paq = window._paq || [])

@ -1,7 +1,7 @@
import { ElectronPlugin } from '@remixproject/engine-electron'; import { ElectronPlugin } from '@remixproject/engine-electron';
import { Plugin } from '@remixproject/engine'; import { Plugin } from '@remixproject/engine';
import { baseURLBin, baseURLWasm } from '@remix-project/remix-solidity' import { baseURLBin, baseURLWasm } from '@remix-project/remix-solidity'
import axios, {AxiosResponse} from 'axios' import axios, { AxiosResponse } from 'axios'
import { iSolJsonBinData } from '@remix-project/remix-lib' import { iSolJsonBinData } from '@remix-project/remix-lib'
const profile = { const profile = {
@ -55,7 +55,7 @@ export class compilerLoaderPluginDesktop extends ElectronPlugin {
} }
async onActivation(): Promise<void> { async onActivation(): Promise<void> {
this.on('solidity', 'loadingCompiler', async (url) => { this.on('solidity', 'loadingCompiler', async (url) => {
await this.call('compilerloader', 'downloadCompiler', url) await this.call('compilerloader', 'downloadCompiler', url)
}) })

@ -78,7 +78,7 @@ export class fsPlugin extends ElectronPlugin {
try { try {
path = fixPath(path) path = fixPath(path)
const stat = await this.call('fs', 'stat', path) const stat = await this.call('fs', 'stat', path)
if(!stat) return undefined if (!stat) return undefined
stat.isDirectory = () => stat.isDirectoryValue stat.isDirectory = () => stat.isDirectoryValue
stat.isFile = () => !stat.isDirectoryValue stat.isFile = () => !stat.isDirectoryValue
return stat return stat
@ -90,7 +90,7 @@ export class fsPlugin extends ElectronPlugin {
try { try {
path = fixPath(path) path = fixPath(path)
const stat = await this.call('fs', 'lstat', path) const stat = await this.call('fs', 'lstat', path)
if(!stat) return undefined if (!stat) return undefined
stat.isDirectory = () => stat.isDirectoryValue stat.isDirectory = () => stat.isDirectoryValue
stat.isFile = () => !stat.isDirectoryValue stat.isFile = () => !stat.isDirectoryValue
return stat return stat
@ -116,7 +116,7 @@ export class fsPlugin extends ElectronPlugin {
await this.call('fileManager', 'refresh') await this.call('fileManager', 'refresh')
}) })
this.on('fs', 'error', async (error: string) => { this.on('fs', 'error', async (error: string) => {
if(error === 'ENOSPC'){ if (error === 'ENOSPC'){
this.call('notification', 'alert', { this.call('notification', 'alert', {
id: 'fsError', id: 'fsError',
message: 'Cannot watch file changes. There are too many files in your project.' message: 'Cannot watch file changes. There are too many files in your project.'

@ -55,8 +55,8 @@ export class FileDecorator extends Plugin {
if (!from) return if (!from) return
const filteredState = this._fileStates.filter((state) => { const filteredState = this._fileStates.filter((state) => {
if(state.owner != from) return true if (state.owner != from) return true
if(path && state.path != path) return true if (path && state.path != path) return true
}) })
const newState = [...filteredState].sort(sortByPath) const newState = [...filteredState].sort(sortByPath)

@ -13,7 +13,6 @@ const profile = {
icon: "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZD0iTTIxLjAwNyA4LjIyMTY4QzIxLjAxMDUgNy41Mjc5MiAyMC44MjA3IDYuODQ2ODkgMjAuNDU5MSA2LjI1NDg1QzIwLjA5NzQgNS42NjI4MSAxOS41NzggNS4xODMxNSAxOC45NTkyIDQuODY5NTdDMTguMzQwMyA0LjU1NiAxNy42NDYzIDQuNDIwOTEgMTYuOTU1MSA0LjQ3OTQxQzE2LjI2MzcgNC41Mzc5MyAxNS42MDI1IDQuNzg3NzMgMTUuMDQ1IDUuMjAwODVDMTQuNDg3NyA1LjYxMzk3IDE0LjA1NjMgNi4xNzQwOSAxMy43OTkzIDYuODE4NUMxMy41NDI0IDcuNDYyOSAxMy40Njk3IDguMTY2MTMgMTMuNTg5OCA4Ljg0OTQ0QzEzLjcwOTkgOS41MzI3NCAxNC4wMTc3IDEwLjE2OTIgMTQuNDc4OSAxMC42ODc0QzE0Ljk0MDIgMTEuMjA1NiAxNS41MzY3IDExLjU4NTIgMTYuMjAxNSAxMS43ODM2QzE1Ljk1NiAxMi4yODI0IDE1LjU3NjMgMTIuNzAzIDE1LjEwNDkgMTIuOTk3OUMxNC42MzM2IDEzLjI5MjkgMTQuMDg5NCAxMy40NTA1IDEzLjUzMzQgMTMuNDUzMkgxMC41NDRDOS40MzcyNiAxMy40NTcxIDguMzcxNjMgMTMuODcyNyA3LjU1NDUxIDE0LjYxOTFWNy4zOTgwOUM4LjQ2MTg0IDcuMjEyODggOS4yNjgwOCA2LjY5NzM3IDkuODE2OTIgNS45NTE1MUMxMC4zNjU4IDUuMjA1NjUgMTAuNjE4MSA0LjI4MjU2IDEwLjUyNSAzLjM2MTIxQzEwLjQzMTkgMi40Mzk4NyAxMC4wMDAxIDEuNTg1OSA5LjMxMzE2IDAuOTY0ODczQzguNjI2MjQgMC4zNDM4NDUgNy43MzMxOSAwIDYuODA3MTYgMEM1Ljg4MTEyIDAgNC45ODgwNyAwLjM0Mzg0NSA0LjMwMTE0IDAuOTY0ODczQzMuNjE0MjIgMS41ODU5IDMuMTgyMzYgMi40Mzk4NyAzLjA4OTI4IDMuMzYxMjFDMi45OTYyIDQuMjgyNTYgMy4yNDg1NSA1LjIwNTY1IDMuNzk3MzkgNS45NTE1MUM0LjM0NjIzIDYuNjk3MzcgNS4xNTI0NyA3LjIxMjg4IDYuMDU5OCA3LjM5ODA5VjE2LjUxNTlDNS4xNTQxOCAxNi42ODkxIDQuMzQzMjMgMTcuMTg3NyAzLjc3OTkzIDE3LjkxNzZDMy4yMTY2MyAxOC42NDc2IDIuOTM5OTIgMTkuNTU4NSAzLjAwMTk3IDIwLjQ3ODVDMy4wNjQwMyAyMS4zOTg0IDMuNDYwNTcgMjIuMjYzOSA0LjExNjggMjIuOTExNUM0Ljc3MzAzIDIzLjU1OTIgNS42NDM2IDIzLjk0NDQgNi41NjQyNyAyMy45OTQ0QzcuNDg0OTYgMjQuMDQ0NSA4LjM5MjExIDIzLjc1NTggOS4xMTQ2NCAyMy4xODNDOS44MzcxOCAyMi42MTAyIDEwLjMyNTEgMjEuNzkyOCAxMC40ODY1IDIwLjg4NUMxMC42NDc4IDE5Ljk3NzEgMTAuNDcxNCAxOS4wNDE3IDkuOTkwNDggMTguMjU1QzkuNTA5NTcgMTcuNDY4MyA4Ljc1NzQxIDE2Ljg4NDggNy44NzU4OCAxNi42MTQ1QzguMTIxNzYgMTYuMTE2MiA4LjUwMTY3IDE1LjY5NjMgOC45NzI5NiAxNS40MDE5QzkuNDQ0MjYgMTUuMTA3NCA5Ljk4ODI3IDE0Ljk1MDMgMTAuNTQ0IDE0Ljk0NzlIMTMuNTMzNEMxNC40NjYxIDE0Ljk0MzYgMTUuMzc0MiAxNC42NDg2IDE2LjEzMTMgMTQuMTAzOUMxNi44ODg0IDEzLjU1OTIgMTcuNDU2OCAxMi43OTIgMTcuNzU3NSAxMS45MDkxQzE4LjY1MzQgMTEuNzkxNCAxOS40NzYzIDExLjM1MjggMjAuMDczOCAxMC42NzQ4QzIwLjY3MTMgOS45OTY4IDIxLjAwMjggOS4xMjUzMyAyMS4wMDcgOC4yMjE2OFpNNC41NjUwOCAzLjczNzUyQzQuNTY1MDggMy4yOTQwOCA0LjY5NjU3IDIuODYwNiA0Ljk0MjkzIDIuNDkxOUM1LjE4OTMgMi4xMjMxOSA1LjUzOTQ3IDEuODM1ODEgNS45NDkxNSAxLjY2NjExQzYuMzU4ODQgMS40OTY0MiA2LjgwOTY1IDEuNDUyMDIgNy4yNDQ1NiAxLjUzODU0QzcuNjc5NDggMS42MjUwNCA4LjA3ODk4IDEuODM4NTcgOC4zOTI1NCAyLjE1MjE0QzguNzA2MTEgMi40NjU3IDguOTE5NjQgMi44NjUyIDkuMDA2MTUgMy4zMDAxMkM5LjA5MjY2IDMuNzM1MDQgOS4wNDgyNyA0LjE4NTg1IDguODc4NTcgNC41OTU1M0M4LjcwODg3IDUuMDA1MjEgOC40MjE0OSA1LjM1NTM5IDguMDUyNzggNS42MDE3NUM3LjY4NDA4IDUuODQ4MTEgNy4yNTA2IDUuOTc5NiA2LjgwNzE2IDUuOTc5NkM2LjIxMjUyIDUuOTc5NiA1LjY0MjI0IDUuNzQzMzkgNS4yMjE3NyA1LjMyMjkxQzQuODAxMjkgNC45MDI0NSA0LjU2NTA4IDQuMzMyMTYgNC41NjUwOCAzLjczNzUyWk05LjA0OTIzIDIwLjE3OTRDOS4wNDkyMyAyMC42MjI5IDguOTE3NzQgMjEuMDU2MyA4LjY3MTM4IDIxLjQyNUM4LjQyNTAxIDIxLjc5MzcgOC4wNzQ4NSAyMi4wODExIDcuNjY1MTYgMjIuMjUwOEM3LjI1NTQ3IDIyLjQyMDUgNi44MDQ2NiAyMi40NjQ5IDYuMzY5NzUgMjIuMzc4NEM1LjkzNDgzIDIyLjI5MiA1LjUzNTMzIDIyLjA3ODQgNS4yMjE3NyAyMS43NjQ4QzQuOTA4MjEgMjEuNDUxMiA0LjY5NDY3IDIxLjA1MTcgNC42MDgxNiAyMC42MTY5QzQuNTIxNjUgMjAuMTgxOSA0LjU2NjA1IDE5LjczMTEgNC43MzU3NSAxOS4zMjE0QzQuOTA1NDUgMTguOTExNyA1LjE5MjgyIDE4LjU2MTUgNS41NjE1MyAxOC4zMTUyQzUuOTMwMjMgMTguMDY4OSA2LjM2MzcxIDE3LjkzNzMgNi44MDcxNiAxNy45MzczQzcuNDAxNzkgMTcuOTM3MyA3Ljk3MjA3IDE4LjE3MzYgOC4zOTI1NCAxOC41OTRDOC44MTMwMiAxOS4wMTQ1IDkuMDQ5MjMgMTkuNTg0OCA5LjA0OTIzIDIwLjE3OTRaTTE3LjI3MDIgMTAuNDYzOEMxNi44MjY3IDEwLjQ2MzggMTYuMzkzMyAxMC4zMzIyIDE2LjAyNDYgMTAuMDg1OUMxNS42NTU5IDkuODM5NTQgMTUuMzY4NSA5LjQ4OTM3IDE1LjE5ODggOS4wNzk2OUMxNS4wMjkxIDguNjcgMTQuOTg0NyA4LjIxOTIgMTUuMDcxMiA3Ljc4NDI3QzE1LjE1NzYgNy4zNDkzNSAxNS4zNzEyIDYuOTQ5ODUgMTUuNjg0OCA2LjYzNjI5QzE1Ljk5ODQgNi4zMjI3MyAxNi4zOTc5IDYuMTA5MTkgMTYuODMyNyA2LjAyMjY4QzE3LjI2NzcgNS45MzYxNyAxNy43MTg1IDUuOTgwNTggMTguMTI4MSA2LjE1MDI3QzE4LjUzNzkgNi4zMTk5NyAxOC44ODgxIDYuNjA3MzQgMTkuMTM0NCA2Ljk3NjA1QzE5LjM4MDcgNy4zNDQ3NiAxOS41MTIzIDcuNzc4MjMgMTkuNTEyMyA4LjIyMTY4QzE5LjUxMjMgOC44MTYzMiAxOS4yNzYgOS4zODY2IDE4Ljg1NTYgOS44MDcwNkMxOC40MzUxIDEwLjIyNzUgMTcuODY0OCAxMC40NjM4IDE3LjI3MDIgMTAuNDYzOFoiIGZpbGw9IiM0MjQyNDIiLz4KPC9zdmc+Cg==" icon: "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZD0iTTIxLjAwNyA4LjIyMTY4QzIxLjAxMDUgNy41Mjc5MiAyMC44MjA3IDYuODQ2ODkgMjAuNDU5MSA2LjI1NDg1QzIwLjA5NzQgNS42NjI4MSAxOS41NzggNS4xODMxNSAxOC45NTkyIDQuODY5NTdDMTguMzQwMyA0LjU1NiAxNy42NDYzIDQuNDIwOTEgMTYuOTU1MSA0LjQ3OTQxQzE2LjI2MzcgNC41Mzc5MyAxNS42MDI1IDQuNzg3NzMgMTUuMDQ1IDUuMjAwODVDMTQuNDg3NyA1LjYxMzk3IDE0LjA1NjMgNi4xNzQwOSAxMy43OTkzIDYuODE4NUMxMy41NDI0IDcuNDYyOSAxMy40Njk3IDguMTY2MTMgMTMuNTg5OCA4Ljg0OTQ0QzEzLjcwOTkgOS41MzI3NCAxNC4wMTc3IDEwLjE2OTIgMTQuNDc4OSAxMC42ODc0QzE0Ljk0MDIgMTEuMjA1NiAxNS41MzY3IDExLjU4NTIgMTYuMjAxNSAxMS43ODM2QzE1Ljk1NiAxMi4yODI0IDE1LjU3NjMgMTIuNzAzIDE1LjEwNDkgMTIuOTk3OUMxNC42MzM2IDEzLjI5MjkgMTQuMDg5NCAxMy40NTA1IDEzLjUzMzQgMTMuNDUzMkgxMC41NDRDOS40MzcyNiAxMy40NTcxIDguMzcxNjMgMTMuODcyNyA3LjU1NDUxIDE0LjYxOTFWNy4zOTgwOUM4LjQ2MTg0IDcuMjEyODggOS4yNjgwOCA2LjY5NzM3IDkuODE2OTIgNS45NTE1MUMxMC4zNjU4IDUuMjA1NjUgMTAuNjE4MSA0LjI4MjU2IDEwLjUyNSAzLjM2MTIxQzEwLjQzMTkgMi40Mzk4NyAxMC4wMDAxIDEuNTg1OSA5LjMxMzE2IDAuOTY0ODczQzguNjI2MjQgMC4zNDM4NDUgNy43MzMxOSAwIDYuODA3MTYgMEM1Ljg4MTEyIDAgNC45ODgwNyAwLjM0Mzg0NSA0LjMwMTE0IDAuOTY0ODczQzMuNjE0MjIgMS41ODU5IDMuMTgyMzYgMi40Mzk4NyAzLjA4OTI4IDMuMzYxMjFDMi45OTYyIDQuMjgyNTYgMy4yNDg1NSA1LjIwNTY1IDMuNzk3MzkgNS45NTE1MUM0LjM0NjIzIDYuNjk3MzcgNS4xNTI0NyA3LjIxMjg4IDYuMDU5OCA3LjM5ODA5VjE2LjUxNTlDNS4xNTQxOCAxNi42ODkxIDQuMzQzMjMgMTcuMTg3NyAzLjc3OTkzIDE3LjkxNzZDMy4yMTY2MyAxOC42NDc2IDIuOTM5OTIgMTkuNTU4NSAzLjAwMTk3IDIwLjQ3ODVDMy4wNjQwMyAyMS4zOTg0IDMuNDYwNTcgMjIuMjYzOSA0LjExNjggMjIuOTExNUM0Ljc3MzAzIDIzLjU1OTIgNS42NDM2IDIzLjk0NDQgNi41NjQyNyAyMy45OTQ0QzcuNDg0OTYgMjQuMDQ0NSA4LjM5MjExIDIzLjc1NTggOS4xMTQ2NCAyMy4xODNDOS44MzcxOCAyMi42MTAyIDEwLjMyNTEgMjEuNzkyOCAxMC40ODY1IDIwLjg4NUMxMC42NDc4IDE5Ljk3NzEgMTAuNDcxNCAxOS4wNDE3IDkuOTkwNDggMTguMjU1QzkuNTA5NTcgMTcuNDY4MyA4Ljc1NzQxIDE2Ljg4NDggNy44NzU4OCAxNi42MTQ1QzguMTIxNzYgMTYuMTE2MiA4LjUwMTY3IDE1LjY5NjMgOC45NzI5NiAxNS40MDE5QzkuNDQ0MjYgMTUuMTA3NCA5Ljk4ODI3IDE0Ljk1MDMgMTAuNTQ0IDE0Ljk0NzlIMTMuNTMzNEMxNC40NjYxIDE0Ljk0MzYgMTUuMzc0MiAxNC42NDg2IDE2LjEzMTMgMTQuMTAzOUMxNi44ODg0IDEzLjU1OTIgMTcuNDU2OCAxMi43OTIgMTcuNzU3NSAxMS45MDkxQzE4LjY1MzQgMTEuNzkxNCAxOS40NzYzIDExLjM1MjggMjAuMDczOCAxMC42NzQ4QzIwLjY3MTMgOS45OTY4IDIxLjAwMjggOS4xMjUzMyAyMS4wMDcgOC4yMjE2OFpNNC41NjUwOCAzLjczNzUyQzQuNTY1MDggMy4yOTQwOCA0LjY5NjU3IDIuODYwNiA0Ljk0MjkzIDIuNDkxOUM1LjE4OTMgMi4xMjMxOSA1LjUzOTQ3IDEuODM1ODEgNS45NDkxNSAxLjY2NjExQzYuMzU4ODQgMS40OTY0MiA2LjgwOTY1IDEuNDUyMDIgNy4yNDQ1NiAxLjUzODU0QzcuNjc5NDggMS42MjUwNCA4LjA3ODk4IDEuODM4NTcgOC4zOTI1NCAyLjE1MjE0QzguNzA2MTEgMi40NjU3IDguOTE5NjQgMi44NjUyIDkuMDA2MTUgMy4zMDAxMkM5LjA5MjY2IDMuNzM1MDQgOS4wNDgyNyA0LjE4NTg1IDguODc4NTcgNC41OTU1M0M4LjcwODg3IDUuMDA1MjEgOC40MjE0OSA1LjM1NTM5IDguMDUyNzggNS42MDE3NUM3LjY4NDA4IDUuODQ4MTEgNy4yNTA2IDUuOTc5NiA2LjgwNzE2IDUuOTc5NkM2LjIxMjUyIDUuOTc5NiA1LjY0MjI0IDUuNzQzMzkgNS4yMjE3NyA1LjMyMjkxQzQuODAxMjkgNC45MDI0NSA0LjU2NTA4IDQuMzMyMTYgNC41NjUwOCAzLjczNzUyWk05LjA0OTIzIDIwLjE3OTRDOS4wNDkyMyAyMC42MjI5IDguOTE3NzQgMjEuMDU2MyA4LjY3MTM4IDIxLjQyNUM4LjQyNTAxIDIxLjc5MzcgOC4wNzQ4NSAyMi4wODExIDcuNjY1MTYgMjIuMjUwOEM3LjI1NTQ3IDIyLjQyMDUgNi44MDQ2NiAyMi40NjQ5IDYuMzY5NzUgMjIuMzc4NEM1LjkzNDgzIDIyLjI5MiA1LjUzNTMzIDIyLjA3ODQgNS4yMjE3NyAyMS43NjQ4QzQuOTA4MjEgMjEuNDUxMiA0LjY5NDY3IDIxLjA1MTcgNC42MDgxNiAyMC42MTY5QzQuNTIxNjUgMjAuMTgxOSA0LjU2NjA1IDE5LjczMTEgNC43MzU3NSAxOS4zMjE0QzQuOTA1NDUgMTguOTExNyA1LjE5MjgyIDE4LjU2MTUgNS41NjE1MyAxOC4zMTUyQzUuOTMwMjMgMTguMDY4OSA2LjM2MzcxIDE3LjkzNzMgNi44MDcxNiAxNy45MzczQzcuNDAxNzkgMTcuOTM3MyA3Ljk3MjA3IDE4LjE3MzYgOC4zOTI1NCAxOC41OTRDOC44MTMwMiAxOS4wMTQ1IDkuMDQ5MjMgMTkuNTg0OCA5LjA0OTIzIDIwLjE3OTRaTTE3LjI3MDIgMTAuNDYzOEMxNi44MjY3IDEwLjQ2MzggMTYuMzkzMyAxMC4zMzIyIDE2LjAyNDYgMTAuMDg1OUMxNS42NTU5IDkuODM5NTQgMTUuMzY4NSA5LjQ4OTM3IDE1LjE5ODggOS4wNzk2OUMxNS4wMjkxIDguNjcgMTQuOTg0NyA4LjIxOTIgMTUuMDcxMiA3Ljc4NDI3QzE1LjE1NzYgNy4zNDkzNSAxNS4zNzEyIDYuOTQ5ODUgMTUuNjg0OCA2LjYzNjI5QzE1Ljk5ODQgNi4zMjI3MyAxNi4zOTc5IDYuMTA5MTkgMTYuODMyNyA2LjAyMjY4QzE3LjI2NzcgNS45MzYxNyAxNy43MTg1IDUuOTgwNTggMTguMTI4MSA2LjE1MDI3QzE4LjUzNzkgNi4zMTk5NyAxOC44ODgxIDYuNjA3MzQgMTkuMTM0NCA2Ljk3NjA1QzE5LjM4MDcgNy4zNDQ3NiAxOS41MTIzIDcuNzc4MjMgMTkuNTEyMyA4LjIyMTY4QzE5LjUxMjMgOC44MTYzMiAxOS4yNzYgOS4zODY2IDE4Ljg1NTYgOS44MDcwNkMxOC40MzUxIDEwLjIyNzUgMTcuODY0OCAxMC40NjM4IDE3LjI3MDIgMTAuNDYzOFoiIGZpbGw9IiM0MjQyNDIiLz4KPC9zdmc+Cg=="
} }
export class GitPlugin extends ViewPlugin { export class GitPlugin extends ViewPlugin {
constructor() { constructor() {

@ -1,8 +1,8 @@
import {Plugin} from '@remixproject/engine' import { Plugin } from '@remixproject/engine'
import {LibraryProfile, MethodApi, StatusEvents} from '@remixproject/plugin-utils' import { LibraryProfile, MethodApi, StatusEvents } from '@remixproject/plugin-utils'
import {AppModal} from '@remix-ui/app' import { AppModal } from '@remix-ui/app'
import {AlertModal} from '@remix-ui/app' import { AlertModal } from '@remix-ui/app'
import {dispatchModalInterface} from '@remix-ui/app' import { dispatchModalInterface } from '@remix-ui/app'
interface INotificationApi { interface INotificationApi {
events: StatusEvents events: StatusEvents

@ -19,7 +19,7 @@ export class OpenAIGpt extends Plugin {
async message(prompt): Promise<CreateChatCompletionResponse> { async message(prompt): Promise<CreateChatCompletionResponse> {
this.call('layout', 'maximizeTerminal') this.call('layout', 'maximizeTerminal')
this.call('terminal', 'log', { type: 'aitypewriterwarning', value: 'Waiting for GPT answer...'}) this.call('terminal', 'log', { type: 'aitypewriterwarning', value: 'Waiting for GPT answer...' })
let result let result
try { try {
result = await ( result = await (
@ -36,10 +36,10 @@ export class OpenAIGpt extends Plugin {
this.call('terminal', 'log', { type: 'typewritererror', value: `Unable to get a response ${e.message}` }) this.call('terminal', 'log', { type: 'typewritererror', value: `Unable to get a response ${e.message}` })
return return
} }
if (result && result.choices && result.choices.length) { if (result && result.choices && result.choices.length) {
this.call('terminal', 'log', { type: 'aitypewriterwarning', value: result.choices[0].message.content }) this.call('terminal', 'log', { type: 'aitypewriterwarning', value: result.choices[0].message.content })
} else if (result.error) { } else if (result.error) {
this.call('terminal', 'log', { type: 'aitypewriterwarning', value: result.error }) this.call('terminal', 'log', { type: 'aitypewriterwarning', value: result.error })
} else { } else {
this.call('terminal', 'log', { type: 'aitypewriterwarning', value: 'No response...' }) this.call('terminal', 'log', { type: 'aitypewriterwarning', value: 'No response...' })

@ -524,8 +524,8 @@ export class CodeParser extends Plugin {
nodeDefinition.parser = parserNodeDefinition nodeDefinition.parser = parserNodeDefinition
} }
/* if the AST node name & type is the same as the parser node name & type, /* if the AST node name & type is the same as the parser node name & type,
/ then we can assume that the AST node is the definition, / then we can assume that the AST node is the definition,
/ because the parser will always return most nodes it can find even with an error in the code / because the parser will always return most nodes it can find even with an error in the code
*/ */
@ -544,7 +544,6 @@ export class CodeParser extends Plugin {
return nodeDefinition.ast return nodeDefinition.ast
} }
return nodeDefinition.parser return nodeDefinition.parser
} }

@ -4,7 +4,7 @@ import { AstNode } from "@remix-project/remix-solidity"
import { CodeParser } from "../code-parser" import { CodeParser } from "../code-parser"
import { antlr } from '../types' import { antlr } from '../types'
import { pathToFileURL } from 'url' import { pathToFileURL } from 'url'
import {Registry} from '@remix-project/remix-lib' import { Registry } from '@remix-project/remix-lib'
const SolidityParser = (window as any).SolidityParser = (window as any).SolidityParser || [] const SolidityParser = (window as any).SolidityParser = (window as any).SolidityParser || []
@ -117,8 +117,8 @@ export default class CodeParserAntlrService {
/** /**
* Tries to parse the current file or the given text and returns the AST * Tries to parse the current file or the given text and returns the AST
* If the parsing fails it returns the last successful AST for this file * If the parsing fails it returns the last successful AST for this file
* @param text * @param text
* @returns * @returns
*/ */
async setCurrentFileAST(text: string | null = null) { async setCurrentFileAST(text: string | null = null) {
try { try {
@ -149,7 +149,7 @@ export default class CodeParserAntlrService {
/** /**
* Lists the AST nodes from the current file parser * Lists the AST nodes from the current file parser
* These nodes need to be changed to match the node types returned by the compiler * These nodes need to be changed to match the node types returned by the compiler
* @returns * @returns
*/ */
async listAstNodes() { async listAstNodes() {
this.plugin.currentFile = await this.plugin.call('fileManager', 'file') this.plugin.currentFile = await this.plugin.call('fileManager', 'file')
@ -201,11 +201,10 @@ export default class CodeParserAntlrService {
return nodes return nodes
} }
/** /**
* *
* @param ast * @param ast
* @returns * @returns
*/ */
async getLastNodeInLine(ast: string) { async getLastNodeInLine(ast: string) {
let lastNode: any let lastNode: any
@ -247,7 +246,7 @@ export default class CodeParserAntlrService {
try { try {
const startTime = Date.now() const startTime = Date.now()
const blocks = (SolidityParser as any).parseBlock(fileContent, { loc: true, range: true, tolerant: true }) const blocks = (SolidityParser as any).parseBlock(fileContent, { loc: true, range: true, tolerant: true })
if(this.cache[this.plugin.currentFile] && this.cache[this.plugin.currentFile].blockDurations){ if (this.cache[this.plugin.currentFile] && this.cache[this.plugin.currentFile].blockDurations){
this.cache[this.plugin.currentFile].blockDurations = [...this.cache[this.plugin.currentFile].blockDurations.slice(-this.parserThresholdSampleAmount), Date.now() - startTime] this.cache[this.plugin.currentFile].blockDurations = [...this.cache[this.plugin.currentFile].blockDurations.slice(-this.parserThresholdSampleAmount), Date.now() - startTime]
this.setFileParsingState(this.plugin.currentFile) this.setFileParsingState(this.plugin.currentFile)
} }

@ -75,7 +75,6 @@ export default class CodeParserCompiler {
length: error.sourceLocation.end - error.sourceLocation.start length: error.sourceLocation.end - error.sourceLocation.start
}, lineBreaks) }, lineBreaks)
const filePath = error.sourceLocation.file const filePath = error.sourceLocation.file
const fileTarget = await this.plugin.call('fileManager', 'getUrlFromPath', filePath) const fileTarget = await this.plugin.call('fileManager', 'getUrlFromPath', filePath)
@ -103,24 +102,23 @@ export default class CodeParserCompiler {
if (data.sources && Object.keys(data.sources).length === 0) return if (data.sources && Object.keys(data.sources).length === 0) return
this.plugin.compilerAbstract = new CompilerAbstract('soljson', data, source, input) this.plugin.compilerAbstract = new CompilerAbstract('soljson', data, source, input)
this.errorState = false this.errorState = false
this.plugin.nodeIndex = { this.plugin.nodeIndex = {
declarations: {}, declarations: {},
flatReferences: {}, flatReferences: {},
nodesPerFile: {}, nodesPerFile: {},
} }
this.plugin._buildIndex(data, source) this.plugin._buildIndex(data, source)
// cast from the remix-plugin interface to the solidity one. Should be fixed when remix-plugin move to the remix-project repository // cast from the remix-plugin interface to the solidity one. Should be fixed when remix-plugin move to the remix-project repository
const extractedFiledNodes = this.plugin._extractFileNodes(this.plugin.currentFile, this.plugin.compilerAbstract as unknown as lastCompilationResult) const extractedFiledNodes = this.plugin._extractFileNodes(this.plugin.currentFile, this.plugin.compilerAbstract as unknown as lastCompilationResult)
if(extractedFiledNodes) { if (extractedFiledNodes) {
this.plugin.nodeIndex.nodesPerFile[this.plugin.currentFile] = extractedFiledNodes this.plugin.nodeIndex.nodesPerFile[this.plugin.currentFile] = extractedFiledNodes
} }
await this.plugin.gasService.showGasEstimates() await this.plugin.gasService.showGasEstimates()
this.plugin.emit('astFinished') this.plugin.emit('astFinished')
} }
this.compiler = new Compiler((url, cb) => this.plugin.call('contentImport', 'resolveAndSave', url, undefined).then((result) => cb(null, result)).catch((error) => cb(error.message))) this.compiler = new Compiler((url, cb) => this.plugin.call('contentImport', 'resolveAndSave', url, undefined).then((result) => cb(null, result)).catch((error) => cb(error.message)))
this.compiler.event.register('compilationFinished', this.onAstFinished) this.compiler.event.register('compilationFinished', this.onAstFinished)
} }
@ -128,8 +126,8 @@ export default class CodeParserCompiler {
// COMPILER // COMPILER
/** /**
* *
* @returns * @returns
*/ */
async compile() { async compile() {
try { try {
@ -149,7 +147,7 @@ export default class CodeParserCompiler {
} else { } else {
this.compiler.set('remappings', []) this.compiler.set('remappings', [])
} }
const configFileContent = { const configFileContent = {
"language": "Solidity", "language": "Solidity",
"settings": { "settings": {
@ -227,7 +225,7 @@ export default class CodeParserCompiler {
const fileTarget = await this.plugin.call('fileManager', 'getPathFromUrl', fileName) const fileTarget = await this.plugin.call('fileManager', 'getPathFromUrl', fileName)
await this.plugin.call('fileDecorator', 'clearFileDecorators', fileTarget.file) await this.plugin.call('fileDecorator', 'clearFileDecorators', fileTarget.file)
} }
if(decorators.length > 0) if (decorators.length > 0)
await this.plugin.call('fileDecorator', 'setFileDecorators', decorators) await this.plugin.call('fileDecorator', 'setFileDecorators', decorators)
await this.plugin.call('editor', 'clearErrorMarkers', filesWithOutErrors) await this.plugin.call('editor', 'clearErrorMarkers', filesWithOutErrors)

@ -33,17 +33,16 @@ export default class CodeParserGasService {
} }
async showGasEstimates() { async showGasEstimates() {
const showGasConfig = await this.plugin.call('config', 'getAppParameter', 'show-gas') const showGasConfig = await this.plugin.call('config', 'getAppParameter', 'show-gas')
if(!showGasConfig) { if (!showGasConfig) {
await this.plugin.call('editor', 'discardLineTexts') await this.plugin.call('editor', 'discardLineTexts')
return return
} }
this.plugin.currentFile = await this.plugin.call('fileManager', 'file') this.plugin.currentFile = await this.plugin.call('fileManager', 'file')
// cast from the remix-plugin interface to the solidity one. Should be fixed when remix-plugin move to the remix-project repository // cast from the remix-plugin interface to the solidity one. Should be fixed when remix-plugin move to the remix-project repository
const extractedFiledNodes = await this.plugin._extractFileNodes(this.plugin.currentFile, this.plugin.compilerAbstract as unknown as lastCompilationResult) const extractedFiledNodes = await this.plugin._extractFileNodes(this.plugin.currentFile, this.plugin.compilerAbstract as unknown as lastCompilationResult)
if(extractedFiledNodes) { if (extractedFiledNodes) {
this.plugin.nodeIndex.nodesPerFile[this.plugin.currentFile] = extractedFiledNodes this.plugin.nodeIndex.nodesPerFile[this.plugin.currentFile] = extractedFiledNodes
} }
@ -72,10 +71,8 @@ export default class CodeParserGasService {
this.plugin.call('editor', 'addLineText', linetext, estimate.range.fileName) this.plugin.call('editor', 'addLineText', linetext, estimate.range.fileName)
} }
} }
} }
} }

@ -1,5 +1,5 @@
'use strict' 'use strict'
import {Registry} from '@remix-project/remix-lib' import { Registry } from '@remix-project/remix-lib'
import { CodeParser } from "../code-parser"; import { CodeParser } from "../code-parser";
export type CodeParserImportsData = { export type CodeParserImportsData = {
@ -20,7 +20,7 @@ export default class CodeParserImports {
} }
async getImports(){ async getImports(){
if(!this.data || !this.data.files || !this.data.timestamp || this.data.timestamp != this.directoryUpdateCacheTimeStamp){ if (!this.data || !this.data.files || !this.data.timestamp || this.data.timestamp != this.directoryUpdateCacheTimeStamp){
await this.setFileTree() await this.setFileTree()
} }
return this.data return this.data
@ -33,13 +33,13 @@ export default class CodeParserImports {
.filter(x => x !== '') .filter(x => x !== '')
.map(x => x.replace('./node_modules/', '')) .map(x => x.replace('./node_modules/', ''))
.filter(x => { .filter(x => {
if(x.includes('@openzeppelin')) { if (x.includes('@openzeppelin')) {
return !x.includes('mock') return !x.includes('mock')
}else{ } else {
return true return true
} }
}) })
// get unique first words of the values in the array // get unique first words of the values in the array
this.data.packages = [...new Set(this.data.modules.map(x => x.split('/')[0]))] this.data.packages = [...new Set(this.data.modules.map(x => x.split('/')[0]))]
} }
@ -79,7 +79,7 @@ export default class CodeParserImports {
files = await this.plugin.call('fileManager', 'readdir', dir) files = await this.plugin.call('fileManager', 'readdir', dir)
} }
} catch (e) {} } catch (e) {}
const fileArray = this.normalize(files) const fileArray = this.normalize(files)
for (const fi of fileArray) { for (const fi of fileArray) {
if (fi) { if (fi) {

@ -24,7 +24,6 @@ interface Token {
} }
} }
interface Location { interface Location {
start: { start: {
line: number line: number
@ -594,7 +593,6 @@ export type Statement =
type ASTMap<U> = { [K in ASTNodeTypeString]: U extends { type: K } ? U : never } type ASTMap<U> = { [K in ASTNodeTypeString]: U extends { type: K } ? U : never }
type ASTTypeMap = ASTMap<ASTNode> type ASTTypeMap = ASTMap<ASTNode>
export const astNodeTypes = [ export const astNodeTypes = [
'SourceUnit', 'SourceUnit',
'PragmaDirective', 'PragmaDirective',
@ -673,9 +671,6 @@ export const astNodeTypes = [
'InvalidNode' 'InvalidNode'
] as const ] as const
export const binaryOpValues = [ export const binaryOpValues = [
'+', '+',
'-', '-',
@ -725,8 +720,3 @@ export const unaryOpValues = [
] as const ] as const
export type UnaryOp = typeof unaryOpValues[number] export type UnaryOp = typeof unaryOpValues[number]

@ -1,9 +1,9 @@
import React from 'react' // eslint-disable-line import React from 'react' // eslint-disable-line
import {FormattedMessage} from 'react-intl' import { FormattedMessage } from 'react-intl'
import {Plugin} from '@remixproject/engine' import { Plugin } from '@remixproject/engine'
import {AppModal} from '@remix-ui/app' import { AppModal } from '@remix-ui/app'
import {PermissionHandlerDialog, PermissionHandlerValue} from '@remix-ui/permission-handler' import { PermissionHandlerDialog, PermissionHandlerValue } from '@remix-ui/permission-handler'
import {Profile} from '@remixproject/plugin-utils' import { Profile } from '@remixproject/plugin-utils'
const profile = { const profile = {
name: 'permissionhandler', name: 'permissionhandler',
@ -89,7 +89,7 @@ export class PermissionHandlerPlugin extends Plugin {
if (!this.permissions[to.name][method][from.name]) return this.openPermission(from, to, method, message, sensitiveCall) if (!this.permissions[to.name][method][from.name]) return this.openPermission(from, to, method, message, sensitiveCall)
} }
const {allow, hash} = sensitiveCall ? this.sessionPermissions[to.name][method][from.name] : this.permissions[to.name][method][from.name] const { allow, hash } = sensitiveCall ? this.sessionPermissions[to.name][method][from.name] : this.permissions[to.name][method][from.name]
if (!allow) { if (!allow) {
const warning = this.notAllowWarning(from, to, method) const warning = this.notAllowWarning(from, to, method)
const warnEl = const warnEl =
@ -97,9 +97,9 @@ export class PermissionHandlerPlugin extends Plugin {
<span>{ warning }</span> <span>{ warning }</span>
<div className='d-flex flex-row'> <div className='d-flex flex-row'>
<span onClick={()=>{}}>To change the permission go to </span> <span onClick={()=>{}}>To change the permission go to </span>
<span className='px-2' style={{fontWeight: 'bolder'}}>Plugin Manager</span> <span className='px-2' style={{ fontWeight: 'bolder' }}>Plugin Manager</span>
<img alt="" id="permissionModalImagesFrom" src="/assets/img/pluginManager.webp" style={{height: '1rem', width: '1rem'}} /> <img alt="" id="permissionModalImagesFrom" src="/assets/img/pluginManager.webp" style={{ height: '1rem', width: '1rem' }} />
<span className='pl-1' style={{fontWeight: 'bolder'}}> / Permissions</span> <span className='pl-1' style={{ fontWeight: 'bolder' }}> / Permissions</span>
</div> </div>
</div> </div>
this.call('notification', 'toast', warnEl) this.call('notification', 'toast', warnEl)
@ -130,7 +130,7 @@ export class PermissionHandlerPlugin extends Plugin {
} }
const modal: AppModal = { const modal: AppModal = {
id: 'PermissionHandler', id: 'PermissionHandler',
title: <FormattedMessage id="permissionHandler.permissionNeededFor" values={{to: to.displayName || to.name}} />, title: <FormattedMessage id="permissionHandler.permissionNeededFor" values={{ to: to.displayName || to.name }} />,
message: <PermissionHandlerDialog plugin={this} theme={await this.getTheme()} value={value}></PermissionHandlerDialog>, message: <PermissionHandlerDialog plugin={this} theme={await this.getTheme()} value={value}></PermissionHandlerDialog>,
okLabel: <FormattedMessage id="permissionHandler.accept" />, okLabel: <FormattedMessage id="permissionHandler.accept" />,
cancelLabel: <FormattedMessage id="permissionHandler.decline" /> cancelLabel: <FormattedMessage id="permissionHandler.decline" />

@ -30,7 +30,7 @@ export class RemixGuidePlugin extends ViewPlugin {
super(profile) super(profile)
this.appManager = appManager this.appManager = appManager
this.element = document.createElement('div') this.element = document.createElement('div')
this.element.setAttribute('id', 'remixGuideEl') this.element.setAttribute('id', 'remixGuideEl')
} }
async onActivation() { async onActivation() {
@ -49,13 +49,13 @@ export class RemixGuidePlugin extends ViewPlugin {
this.profile.displayName = `${contractName[0]}` this.profile.displayName = `${contractName[0]}`
this.payload = sentPayload this.payload = sentPayload
const active = await this.call('theme', 'currentTheme') const active = await this.call('theme', 'currentTheme')
this.renderComponent() this.renderComponent()
} }
private handleThemeChange() { private handleThemeChange() {
this.on('theme', 'themeChanged', (theme: any) => { this.on('theme', 'themeChanged', (theme: any) => {
this.renderComponent() this.renderComponent()
}) })
} }
@ -114,7 +114,7 @@ export class RemixGuidePlugin extends ViewPlugin {
tagList={['L2', 'AI']} tagList={['L2', 'AI']}
logo='/assets/img/soliditySurvey2023.webp' logo='/assets/img/soliditySurvey2023.webp'
> >
<img src={'/assets/img/soliditySurvey2023.webp'} style={{height: '70px', width: '70px'}} alt=""></img> <img src={'/assets/img/soliditySurvey2023.webp'} style={{ height: '70px', width: '70px' }} alt=""></img>
</RemixUIGridCell> </RemixUIGridCell>
<RemixUIGridCell <RemixUIGridCell
plugin={this} plugin={this}
@ -122,55 +122,55 @@ export class RemixGuidePlugin extends ViewPlugin {
pinned={true} pinned={true}
tagList={['L2', 'plugins']} tagList={['L2', 'plugins']}
> >
<img src={'/assets/img/soliditySurvey2023.webp'} style={{height: '70px', width: '70px'}} alt=""></img> <img src={'/assets/img/soliditySurvey2023.webp'} style={{ height: '70px', width: '70px' }} alt=""></img>
</RemixUIGridCell> <RemixUIGridCell </RemixUIGridCell> <RemixUIGridCell
plugin={this} plugin={this}
title="something" title="something"
pinned={false} pinned={false}
tagList={['solidity', 'plugins']} tagList={['solidity', 'plugins']}
> >
<img src={'/assets/img/soliditySurvey2023.webp'} style={{height: '70px', width: '70px'}} alt=""></img> <img src={'/assets/img/soliditySurvey2023.webp'} style={{ height: '70px', width: '70px' }} alt=""></img>
</RemixUIGridCell> </RemixUIGridCell>
<RemixUIGridCell <RemixUIGridCell
plugin={this} plugin={this}
title="1" title="1"
tagList={['solidity']} tagList={['solidity']}
> >
<img src={'/assets/img/soliditySurvey2023.webp'} style={{height: '70px', width: '70px'}} alt=""></img> <img src={'/assets/img/soliditySurvey2023.webp'} style={{ height: '70px', width: '70px' }} alt=""></img>
</RemixUIGridCell> <RemixUIGridCell </RemixUIGridCell> <RemixUIGridCell
plugin={this} plugin={this}
title="1" title="1"
> >
<img src={'/assets/img/soliditySurvey2023.webp'} style={{height: '70px', width: '70px'}} alt=""></img> <img src={'/assets/img/soliditySurvey2023.webp'} style={{ height: '70px', width: '70px' }} alt=""></img>
</RemixUIGridCell> </RemixUIGridCell>
<RemixUIGridCell <RemixUIGridCell
plugin={this} plugin={this}
title="Something very very long" title="Something very very long"
> >
<img src={'/assets/img/soliditySurvey2023.webp'} style={{height: '70px', width: '70px'}} alt=""></img> <img src={'/assets/img/soliditySurvey2023.webp'} style={{ height: '70px', width: '70px' }} alt=""></img>
</RemixUIGridCell> <RemixUIGridCell </RemixUIGridCell> <RemixUIGridCell
plugin={this} plugin={this}
title="1" title="1"
> >
<img src={'/assets/img/soliditySurvey2023.webp'} style={{height: '70px', width: '70px'}} alt=""></img> <img src={'/assets/img/soliditySurvey2023.webp'} style={{ height: '70px', width: '70px' }} alt=""></img>
</RemixUIGridCell> </RemixUIGridCell>
<RemixUIGridCell <RemixUIGridCell
plugin={this} plugin={this}
title="1" title="1"
> >
<img src={'/assets/img/soliditySurvey2023.webp'} style={{height: '70px', width: '70px'}} alt=""></img> <img src={'/assets/img/soliditySurvey2023.webp'} style={{ height: '70px', width: '70px' }} alt=""></img>
</RemixUIGridCell> </RemixUIGridCell>
<RemixUIGridCell <RemixUIGridCell
plugin={this} plugin={this}
title="1" title="1"
> >
<img src={'/assets/img/soliditySurvey2023.webp'} style={{height: '70px', width: '70px'}} alt=""></img> <img src={'/assets/img/soliditySurvey2023.webp'} style={{ height: '70px', width: '70px' }} alt=""></img>
</RemixUIGridCell> </RemixUIGridCell>
<RemixUIGridCell <RemixUIGridCell
plugin={this} plugin={this}
title="1" title="1"
> >
<img src={'/assets/img/soliditySurvey2023.webp'} style={{height: '70px', width: '70px'}} alt=""></img> <img src={'/assets/img/soliditySurvey2023.webp'} style={{ height: '70px', width: '70px' }} alt=""></img>
</RemixUIGridCell> </RemixUIGridCell>
</RemixUIGridSection> </RemixUIGridSection>
<RemixUIGridSection <RemixUIGridSection
@ -183,58 +183,58 @@ export class RemixGuidePlugin extends ViewPlugin {
title="first item" title="first item"
logo='/assets/img/soliditySurvey2023.webp' logo='/assets/img/soliditySurvey2023.webp'
> >
<img src={'/assets/img/soliditySurvey2023.webp'} style={{height: '70px', width: '70px'}} alt=""></img> <img src={'/assets/img/soliditySurvey2023.webp'} style={{ height: '70px', width: '70px' }} alt=""></img>
</RemixUIGridCell> </RemixUIGridCell>
<RemixUIGridCell <RemixUIGridCell
plugin={this} plugin={this}
title="next" title="next"
> >
<img src={'/assets/img/soliditySurvey2023.webp'} style={{height: '70px', width: '70px'}} alt=""></img> <img src={'/assets/img/soliditySurvey2023.webp'} style={{ height: '70px', width: '70px' }} alt=""></img>
</RemixUIGridCell> <RemixUIGridCell </RemixUIGridCell> <RemixUIGridCell
plugin={this} plugin={this}
title="something" title="something"
> >
<img src={'/assets/img/soliditySurvey2023.webp'} style={{height: '70px', width: '70px'}} alt=""></img> <img src={'/assets/img/soliditySurvey2023.webp'} style={{ height: '70px', width: '70px' }} alt=""></img>
</RemixUIGridCell> </RemixUIGridCell>
<RemixUIGridCell <RemixUIGridCell
plugin={this} plugin={this}
title="1" title="1"
> >
<img src={'/assets/img/soliditySurvey2023.webp'} style={{height: '70px', width: '70px'}} alt=""></img> <img src={'/assets/img/soliditySurvey2023.webp'} style={{ height: '70px', width: '70px' }} alt=""></img>
</RemixUIGridCell> <RemixUIGridCell </RemixUIGridCell> <RemixUIGridCell
plugin={this} plugin={this}
title="1" title="1"
> >
<img src={'/assets/img/soliditySurvey2023.webp'} style={{height: '70px', width: '70px'}} alt=""></img> <img src={'/assets/img/soliditySurvey2023.webp'} style={{ height: '70px', width: '70px' }} alt=""></img>
</RemixUIGridCell> </RemixUIGridCell>
<RemixUIGridCell <RemixUIGridCell
plugin={this} plugin={this}
title="1" title="1"
> >
<img src={'/assets/img/soliditySurvey2023.webp'} style={{height: '70px', width: '70px'}} alt=""></img> <img src={'/assets/img/soliditySurvey2023.webp'} style={{ height: '70px', width: '70px' }} alt=""></img>
</RemixUIGridCell> <RemixUIGridCell </RemixUIGridCell> <RemixUIGridCell
plugin={this} plugin={this}
title="1" title="1"
> >
<img src={'/assets/img/soliditySurvey2023.webp'} style={{height: '70px', width: '70px'}} alt=""></img> <img src={'/assets/img/soliditySurvey2023.webp'} style={{ height: '70px', width: '70px' }} alt=""></img>
</RemixUIGridCell> </RemixUIGridCell>
<RemixUIGridCell <RemixUIGridCell
plugin={this} plugin={this}
title="1" title="1"
> >
<img src={'/assets/img/soliditySurvey2023.webp'} style={{height: '70px', width: '70px'}} alt=""></img> <img src={'/assets/img/soliditySurvey2023.webp'} style={{ height: '70px', width: '70px' }} alt=""></img>
</RemixUIGridCell> </RemixUIGridCell>
<RemixUIGridCell <RemixUIGridCell
plugin={this} plugin={this}
title="1" title="1"
> >
<img src={'/assets/img/soliditySurvey2023.webp'} style={{height: '70px', width: '70px'}} alt=""></img> <img src={'/assets/img/soliditySurvey2023.webp'} style={{ height: '70px', width: '70px' }} alt=""></img>
</RemixUIGridCell> </RemixUIGridCell>
<RemixUIGridCell <RemixUIGridCell
plugin={this} plugin={this}
title="1" title="1"
> >
<img src={'/assets/img/soliditySurvey2023.webp'} style={{height: '70px', width: '70px'}} alt=""></img> <img src={'/assets/img/soliditySurvey2023.webp'} style={{ height: '70px', width: '70px' }} alt=""></img>
</RemixUIGridCell> </RemixUIGridCell>
</RemixUIGridSection> </RemixUIGridSection>
</RemixUIGridView> </RemixUIGridView>

@ -1,13 +1,13 @@
/* eslint-disable no-unused-vars */ /* eslint-disable no-unused-vars */
import React, {useRef, useState, useEffect} from 'react' // eslint-disable-line import React, {useRef, useState, useEffect} from 'react' // eslint-disable-line
import {FormattedMessage} from 'react-intl' import { FormattedMessage } from 'react-intl'
import {WebsocketPlugin} from '@remixproject/engine-web' import { WebsocketPlugin } from '@remixproject/engine-web'
import * as packageJson from '../../../../../package.json' import * as packageJson from '../../../../../package.json'
// eslint-disable-next-line @nrwl/nx/enforce-module-boundaries // eslint-disable-next-line @nrwl/nx/enforce-module-boundaries
import {version as remixdVersion} from '../../../../../libs/remixd/package.json' import { version as remixdVersion } from '../../../../../libs/remixd/package.json'
import {PluginManager} from '@remixproject/engine' import { PluginManager } from '@remixproject/engine'
import {AppModal, AlertModal, appPlatformTypes} from '@remix-ui/app' import { AppModal, AlertModal, appPlatformTypes } from '@remix-ui/app'
import {Registry} from '@remix-project/remix-lib' import { Registry } from '@remix-project/remix-lib'
const LOCALHOST = ' - connect to localhost - ' const LOCALHOST = ' - connect to localhost - '
@ -85,7 +85,7 @@ export class RemixdHandle extends WebsocketPlugin {
console.log(error) console.log(error)
const alert: AlertModal = { const alert: AlertModal = {
id: 'connectionAlert', id: 'connectionAlert',
message: window._intl.formatMessage({id: 'remixd.connectionAlert1'}), message: window._intl.formatMessage({ id: 'remixd.connectionAlert1' }),
} }
this.call('notification', 'alert', alert) this.call('notification', 'alert', alert)
this.canceled() this.canceled()
@ -96,14 +96,14 @@ export class RemixdHandle extends WebsocketPlugin {
clearInterval(intervalId) clearInterval(intervalId)
const alert: AlertModal = { const alert: AlertModal = {
id: 'connectionAlert', id: 'connectionAlert',
message: window._intl.formatMessage({id: 'remixd.connectionAlert2'}), message: window._intl.formatMessage({ id: 'remixd.connectionAlert2' }),
} }
this.call('notification', 'alert', alert) this.call('notification', 'alert', alert)
this.canceled() this.canceled()
} }
}, 3000) }, 3000)
this.localhostProvider.init(() => { this.localhostProvider.init(() => {
this.call('filePanel', 'setWorkspace', {name: LOCALHOST, isLocalhost: true}, true) this.call('filePanel', 'setWorkspace', { name: LOCALHOST, isLocalhost: true }, true)
}) })
for (const plugin of this.dependentPlugins) { for (const plugin of this.dependentPlugins) {
await this.appManager.activatePlugin(plugin) await this.appManager.activatePlugin(plugin)
@ -116,10 +116,10 @@ export class RemixdHandle extends WebsocketPlugin {
// warn the user only if he/she is in the browser context // warn the user only if he/she is in the browser context
const mod: AppModal = { const mod: AppModal = {
id: 'remixdConnect', id: 'remixdConnect',
title: window._intl.formatMessage({id: 'remixd.remixdConnect'}), title: window._intl.formatMessage({ id: 'remixd.remixdConnect' }),
message: remixdDialog(), message: remixdDialog(),
okLabel: window._intl.formatMessage({id: 'remixd.connect'}), okLabel: window._intl.formatMessage({ id: 'remixd.connect' }),
cancelLabel: window._intl.formatMessage({id: 'remixd.cancel'}), cancelLabel: window._intl.formatMessage({ id: 'remixd.cancel' }),
} }
const result = await this.call('notification', 'modal', mod) const result = await this.call('notification', 'modal', mod)
if (result) { if (result) {

@ -1,11 +1,11 @@
import { Plugin } from '@remixproject/engine' import { Plugin } from '@remixproject/engine'
export type SuggestOptions = { export type SuggestOptions = {
max_new_tokens: number, max_new_tokens: number,
temperature: number, temperature: number,
do_sample:boolean do_sample:boolean
top_k: number, top_k: number,
top_p:number, top_p:number,
stream_result:boolean stream_result:boolean
} }
@ -41,18 +41,18 @@ export class SolCoder extends Plugin {
Accept: 'application/json', Accept: 'application/json',
'Content-Type': 'application/json', 'Content-Type': 'application/json',
}, },
body: JSON.stringify({"data":[prompt, "code_completion", "", false,1000,0.9,0.92,50]}), body: JSON.stringify({ "data":[prompt, "code_completion", "", false,1000,0.9,0.92,50]}),
}) })
).json() ).json()
if ("error" in result){ if ("error" in result){
this.call('terminal', 'log', { type: 'aitypewriterwarning', value: result.error }) this.call('terminal', 'log', { type: 'aitypewriterwarning', value: result.error })
return result return result
} }
return result.data return result.data
} catch (e) { } catch (e) {
this.call('terminal', 'log', { type: 'typewritererror', value: `Unable to get a response ${e.message}` }) this.call('terminal', 'log', { type: 'typewritererror', value: `Unable to get a response ${e.message}` })
return return
}finally { } finally {
this.emit("aiInferingDone") this.emit("aiInferingDone")
} }
} }
@ -69,18 +69,18 @@ export class SolCoder extends Plugin {
Accept: 'application/json', Accept: 'application/json',
'Content-Type': 'application/json', 'Content-Type': 'application/json',
}, },
body: JSON.stringify({"data":[prompt, "solidity_answer", false,1000,0.9,0.8,50]}), body: JSON.stringify({ "data":[prompt, "solidity_answer", false,1000,0.9,0.8,50]}),
}) })
).json() ).json()
} catch (e) { } catch (e) {
this.call('terminal', 'log', { type: 'typewritererror', value: `Unable to get a response ${e.message}` }) this.call('terminal', 'log', { type: 'typewritererror', value: `Unable to get a response ${e.message}` })
return return
}finally { } finally {
this.emit("aiInferingDone") this.emit("aiInferingDone")
} }
if (result) { if (result) {
this.call('terminal', 'log', { type: 'aitypewriterwarning', value: result.data[0]}) this.call('terminal', 'log', { type: 'aitypewriterwarning', value: result.data[0] })
} else if (result.error) { } else if (result.error) {
this.call('terminal', 'log', { type: 'aitypewriterwarning', value: "Error on request" }) this.call('terminal', 'log', { type: 'aitypewriterwarning', value: "Error on request" })
} }
@ -98,17 +98,17 @@ export class SolCoder extends Plugin {
Accept: 'application/json', Accept: 'application/json',
'Content-Type': 'application/json', 'Content-Type': 'application/json',
}, },
body: JSON.stringify({"data":[prompt, "code_explaining", false,2000,0.9,0.8,50, context]}), body: JSON.stringify({ "data":[prompt, "code_explaining", false,2000,0.9,0.8,50, context]}),
}) })
).json() ).json()
if (result) { if (result) {
this.call('terminal', 'log', { type: 'aitypewriterwarning', value: result.data[0]}) this.call('terminal', 'log', { type: 'aitypewriterwarning', value: result.data[0] })
} }
return result.data[0] return result.data[0]
} catch (e) { } catch (e) {
this.call('terminal', 'log', { type: 'typewritererror', value: `Unable to get a response ${e.message}` }) this.call('terminal', 'log', { type: 'typewritererror', value: `Unable to get a response ${e.message}` })
return return
}finally { } finally {
this.emit("aiInferingDone") this.emit("aiInferingDone")
} }
} }
@ -124,14 +124,14 @@ export class SolCoder extends Plugin {
Accept: 'application/json', Accept: 'application/json',
'Content-Type': 'application/json', 'Content-Type': 'application/json',
}, },
body: JSON.stringify({"data": !options? [ body: JSON.stringify({ "data": !options? [
prompt, // string in 'context_code' Textbox component prompt, // string in 'context_code' Textbox component
"code_completion", "code_completion",
"", // string in 'comment' Textbox component "", // string in 'comment' Textbox component
false, // boolean in 'stream_result' Checkbox component false, // boolean in 'stream_result' Checkbox component
30, // number (numeric value between 0 and 2000) in 'max_new_tokens' Slider component 30, // number (numeric value between 0 and 2000) in 'max_new_tokens' Slider component
0.9, // number (numeric value between 0.01 and 1) in 'temperature' Slider component 0.9, // number (numeric value between 0.01 and 1) in 'temperature' Slider component
0.90, // number (numeric value between 0 and 1) in 'top_p' Slider component 0.90, // number (numeric value between 0 and 1) in 'top_p' Slider component
50, // number (numeric value between 1 and 200) in 'top_k' Slider component 50, // number (numeric value between 1 and 200) in 'top_k' Slider component
] : [ ] : [
prompt, prompt,
@ -170,15 +170,15 @@ export class SolCoder extends Plugin {
Accept: 'application/json', Accept: 'application/json',
'Content-Type': 'application/json', 'Content-Type': 'application/json',
}, },
body: JSON.stringify({"data":[ body: JSON.stringify({ "data":[
msg_pfx, // Text before current cursor line msg_pfx, // Text before current cursor line
"code_insertion", "code_insertion",
msg_sfx, // Text after current cursor line msg_sfx, // Text after current cursor line
1024, 1024,
0.5, 0.5,
0.92, 0.92,
50 50
] }), ]}),
}) })
).json() ).json()
@ -195,6 +195,4 @@ export class SolCoder extends Plugin {
} }
} }
} }

@ -1,8 +1,8 @@
import React from 'react' // eslint-disable-line import React from 'react' // eslint-disable-line
import {format} from 'util' import { format } from 'util'
import {Plugin} from '@remixproject/engine' import { Plugin } from '@remixproject/engine'
import {compile} from '@remix-project/remix-solidity' import { compile } from '@remix-project/remix-solidity'
import {Transaction} from 'web3-types' import { Transaction } from 'web3-types'
const _paq = (window._paq = window._paq || []) //eslint-disable-line const _paq = (window._paq = window._paq || []) //eslint-disable-line
const profile = { const profile = {
@ -37,7 +37,7 @@ export class SolidityScript extends Plugin {
${functionName}(); ${functionName}();
} }
}` }`
const targets = {'script.sol': {content}} const targets = { 'script.sol': { content } }
// compile // compile
const compilation = await compile(targets, params, async (url, cb) => { const compilation = await compile(targets, params, async (url, cb) => {
@ -81,20 +81,20 @@ export class SolidityScript extends Plugin {
this.call('terminal', 'logHtml', e.message) this.call('terminal', 'logHtml', e.message)
return return
} }
tx = { tx = {
from: accounts[0], from: accounts[0],
to: receipt.contractAddress, to: receipt.contractAddress,
data: '0x69d4394b' // function remixRun() public data: '0x69d4394b' // function remixRun() public
} }
let receiptCall let receiptCall
try { try {
receiptCall = await web3.eth.sendTransaction(tx, null, { checkRevertBeforeSending: false, ignoreGasPricing: true }) receiptCall = await web3.eth.sendTransaction(tx, null, { checkRevertBeforeSending: false, ignoreGasPricing: true })
} catch (e) { } catch (e) {
this.call('terminal', 'logHtml', e.message) this.call('terminal', 'logHtml', e.message)
return return
} }
const hhlogs = await web3.remix.getHHLogsForTx(receiptCall.transactionHash) const hhlogs = await web3.remix.getHHLogsForTx(receiptCall.transactionHash)

@ -1,17 +1,17 @@
/* eslint-disable @nrwl/nx/enforce-module-boundaries */ /* eslint-disable @nrwl/nx/enforce-module-boundaries */
import {ViewPlugin} from '@remixproject/engine-web' import { ViewPlugin } from '@remixproject/engine-web'
import React from 'react' import React from 'react'
// eslint-disable-next-line @nrwl/nx/enforce-module-boundaries // eslint-disable-next-line @nrwl/nx/enforce-module-boundaries
import {RemixUiSolidityUmlGen} from '@remix-ui/solidity-uml-gen' import { RemixUiSolidityUmlGen } from '@remix-ui/solidity-uml-gen'
import {ISolidityUmlGen, ThemeQualityType, ThemeSummary} from 'libs/remix-ui/solidity-uml-gen/src/types' import { ISolidityUmlGen, ThemeQualityType, ThemeSummary } from 'libs/remix-ui/solidity-uml-gen/src/types'
import {RemixAppManager} from 'libs/remix-ui/plugin-manager/src/types' import { RemixAppManager } from 'libs/remix-ui/plugin-manager/src/types'
import {normalizeContractPath} from 'libs/remix-ui/solidity-compiler/src/lib/logic/flattenerUtilities' import { normalizeContractPath } from 'libs/remix-ui/solidity-compiler/src/lib/logic/flattenerUtilities'
import {convertAST2UmlClasses} from 'sol2uml/lib/converterAST2Classes' import { convertAST2UmlClasses } from 'sol2uml/lib/converterAST2Classes'
import vizRenderStringSync from '@aduh95/viz.js/sync' import vizRenderStringSync from '@aduh95/viz.js/sync'
import {PluginViewWrapper} from '@remix-ui/helper' import { PluginViewWrapper } from '@remix-ui/helper'
import {customAction} from '@remixproject/plugin-api' import { customAction } from '@remixproject/plugin-api'
import {ClassOptions} from 'sol2uml/lib/converterClass2Dot' import { ClassOptions } from 'sol2uml/lib/converterClass2Dot'
import type {CompilerInput} from '@remix-project/remix-solidity' import type { CompilerInput } from '@remix-project/remix-solidity'
const parser = (window as any).SolidityParser const parser = (window as any).SolidityParser
const _paq = (window._paq = window._paq || []) const _paq = (window._paq = window._paq || [])
@ -207,10 +207,10 @@ interface Sol2umlClassOptions extends ClassOptions {
textColor?: string textColor?: string
} }
import {dirname} from 'path' import { dirname } from 'path'
import {convertClass2Dot} from 'sol2uml/lib/converterClass2Dot' import { convertClass2Dot } from 'sol2uml/lib/converterClass2Dot'
import {Association, ClassStereotype, ReferenceType, UmlClass} from 'sol2uml/lib/umlClass' import { Association, ClassStereotype, ReferenceType, UmlClass } from 'sol2uml/lib/umlClass'
import {findAssociatedClass} from 'sol2uml/lib/associations' import { findAssociatedClass } from 'sol2uml/lib/associations'
// const debug = require('debug')('sol2uml') // const debug = require('debug')('sol2uml')

@ -1,6 +1,6 @@
import React from 'react' import React from 'react'
import { ViewPlugin } from '@remixproject/engine-web' import { ViewPlugin } from '@remixproject/engine-web'
import {PluginViewWrapper} from '@remix-ui/helper' import { PluginViewWrapper } from '@remix-ui/helper'
import { RemixAppManager } from '../../remixAppManager' import { RemixAppManager } from '../../remixAppManager'
import { RemixUiVyperCompileDetails } from '@remix-ui/vyper-compile-details' import { RemixUiVyperCompileDetails } from '@remix-ui/vyper-compile-details'
import { ThemeKeys, ThemeObject } from '@microlink/react-json-view' import { ThemeKeys, ThemeObject } from '@microlink/react-json-view'
@ -49,13 +49,13 @@ export class VyperCompilationDetailsPlugin extends ViewPlugin {
} }
async showDetails(sentPayload: any) { async showDetails(sentPayload: any) {
const contractName = Object.entries(sentPayload).find(([key, value]) => key ) const contractName = Object.entries(sentPayload).find(([key, value]) => key )
await this.call('tabs', 'focus', 'vyperCompilationDetails') await this.call('tabs', 'focus', 'vyperCompilationDetails')
this.profile.displayName = `${contractName[0]}` this.profile.displayName = `${contractName[0]}`
this.payload = sentPayload this.payload = sentPayload
const active = await this.call('theme', 'currentTheme') const active = await this.call('theme', 'currentTheme')
if (active.quality === 'dark') { if (active.quality === 'dark') {
switch(active.name) { switch (active.name) {
case 'HackerOwl': case 'HackerOwl':
this.theme = 'harmonic' this.theme = 'harmonic'
this.themeStyle = { backgroundColor: active.backgroundColor } this.themeStyle = { backgroundColor: active.backgroundColor }
@ -78,7 +78,7 @@ export class VyperCompilationDetailsPlugin extends ViewPlugin {
break break
} }
} else { } else {
switch(active.name) { switch (active.name) {
case 'Candy': case 'Candy':
this.theme = 'apathy:inverted' this.theme = 'apathy:inverted'
this.themeStyle = { backgroundColor: active.backgroundColor } this.themeStyle = { backgroundColor: active.backgroundColor }
@ -106,7 +106,7 @@ export class VyperCompilationDetailsPlugin extends ViewPlugin {
private handleThemeChange() { private handleThemeChange() {
this.on('theme', 'themeChanged', (theme: any) => { this.on('theme', 'themeChanged', (theme: any) => {
if (theme.quality === 'dark') { if (theme.quality === 'dark') {
switch(theme.name) { switch (theme.name) {
case 'HackerOwl': case 'HackerOwl':
this.theme = 'solarized' this.theme = 'solarized'
this.themeStyle = { backgroundColor: theme.backgroundColor } this.themeStyle = { backgroundColor: theme.backgroundColor }

@ -1,7 +1,7 @@
import {Plugin} from '@remixproject/engine' import { Plugin } from '@remixproject/engine'
import {AppModal, AlertModal, ModalTypes} from '@remix-ui/app' import { AppModal, AlertModal, ModalTypes } from '@remix-ui/app'
import {Blockchain} from '../../blockchain/blockchain' import { Blockchain } from '../../blockchain/blockchain'
import {ethers} from 'ethers' import { ethers } from 'ethers'
export type JsonDataRequest = { export type JsonDataRequest = {
id: number id: number
@ -66,7 +66,7 @@ export abstract class AbstractProvider extends Plugin implements IProvider {
okLabel: 'OK', okLabel: 'OK',
cancelLabel: 'Cancel', cancelLabel: 'Cancel',
validationFn: (value) => { validationFn: (value) => {
if (!value) return {valid: false, message: 'value is empty'} if (!value) return { valid: false, message: 'value is empty' }
if (value.startsWith('https://') || value.startsWith('http://')) { if (value.startsWith('https://') || value.startsWith('http://')) {
return { return {
valid: true, valid: true,
@ -102,7 +102,7 @@ export abstract class AbstractProvider extends Plugin implements IProvider {
sendAsync(data: JsonDataRequest): Promise<JsonDataResult> { sendAsync(data: JsonDataRequest): Promise<JsonDataResult> {
// eslint-disable-next-line no-async-promise-executor // eslint-disable-next-line no-async-promise-executor
return new Promise(async (resolve, reject) => { return new Promise(async (resolve, reject) => {
if (!this.provider) return reject({jsonrpc: '2.0', id: data.id, error: { message: 'provider node set', code: -32603 } } as JsonDataResult) if (!this.provider) return reject({ jsonrpc: '2.0', id: data.id, error: { message: 'provider node set', code: -32603 } } as JsonDataResult)
this.sendAsyncInternal(data, resolve, reject) this.sendAsyncInternal(data, resolve, reject)
}) })
} }
@ -119,7 +119,7 @@ export abstract class AbstractProvider extends Plugin implements IProvider {
} }
this.call('notification', 'alert', modalContent) this.call('notification', 'alert', modalContent)
} }
await this.call('udapp', 'setEnvironmentMode', {context: 'vm-cancun'}) await this.call('udapp', 'setEnvironmentMode', { context: 'vm-cancun' })
return return
} }
@ -127,17 +127,17 @@ export abstract class AbstractProvider extends Plugin implements IProvider {
if (this.provider) { if (this.provider) {
try { try {
const result = await this.provider.send(data.method, data.params) const result = await this.provider.send(data.method, data.params)
resolve({jsonrpc: '2.0', result, id: data.id}) resolve({ jsonrpc: '2.0', result, id: data.id })
} catch (error) { } catch (error) {
if (error && error.message && error.message.includes('net_version') && error.message.includes('SERVER_ERROR')) { if (error && error.message && error.message.includes('net_version') && error.message.includes('SERVER_ERROR')) {
this.switchAway(true) this.switchAway(true)
} }
error.code = -32603 error.code = -32603
reject({jsonrpc: '2.0', error, id: data.id}) reject({ jsonrpc: '2.0', error, id: data.id })
} }
} else { } else {
const result = data.method === 'net_listening' ? 'canceled' : [] const result = data.method === 'net_listening' ? 'canceled' : []
resolve({jsonrpc: '2.0', result: result, id: data.id}) resolve({ jsonrpc: '2.0', result: result, id: data.id })
} }
} }
} }

@ -1,9 +1,9 @@
import React, {useRef} from 'react' // eslint-disable-line import React, {useRef} from 'react' // eslint-disable-line
import {FormattedMessage} from 'react-intl' import { FormattedMessage } from 'react-intl'
import * as packageJson from '../../../../../package.json' import * as packageJson from '../../../../../package.json'
import {AppModal, ModalTypes} from '@remix-ui/app' import { AppModal, ModalTypes } from '@remix-ui/app'
import {BasicVMProvider} from './vm-provider' import { BasicVMProvider } from './vm-provider'
import {Hardfork} from '@ethereumjs/common' import { Hardfork } from '@ethereumjs/common'
export class CustomForkVMProvider extends BasicVMProvider { export class CustomForkVMProvider extends BasicVMProvider {
nodeUrl: string nodeUrl: string

@ -1,7 +1,7 @@
import * as packageJson from '../../../../../package.json' import * as packageJson from '../../../../../package.json'
import React from 'react' // eslint-disable-line import React from 'react' // eslint-disable-line
import {FormattedMessage} from 'react-intl' import { FormattedMessage } from 'react-intl'
import {AbstractProvider} from './abstract-provider' import { AbstractProvider } from './abstract-provider'
const profile = { const profile = {
name: 'basic-http-provider', name: 'basic-http-provider',
@ -49,7 +49,7 @@ export class ExternalHttpProvider extends AbstractProvider {
</div> </div>
<br /> <br />
<br /> <br />
<FormattedMessage id="udapp.externalHttpProviderText3" values={{b: (chunks) => <b><>{chunks}</></b>}} /> <FormattedMessage id="udapp.externalHttpProviderText3" values={{ b: (chunks) => <b><>{chunks}</></b> }} />
<br /> <br />
<br /> <br />
<FormattedMessage <FormattedMessage

@ -1,7 +1,7 @@
import * as packageJson from '../../../../../package.json' import * as packageJson from '../../../../../package.json'
import React from 'react' // eslint-disable-line import React from 'react' // eslint-disable-line
import {FormattedMessage} from 'react-intl' import { FormattedMessage } from 'react-intl'
import {AbstractProvider} from './abstract-provider' import { AbstractProvider } from './abstract-provider'
const profile = { const profile = {
name: 'foundry-provider', name: 'foundry-provider',

@ -1,7 +1,7 @@
import * as packageJson from '../../../../../package.json' import * as packageJson from '../../../../../package.json'
import React from 'react' // eslint-disable-line import React from 'react' // eslint-disable-line
import {FormattedMessage} from 'react-intl' import { FormattedMessage } from 'react-intl'
import {AbstractProvider} from './abstract-provider' import { AbstractProvider } from './abstract-provider'
const profile = { const profile = {
name: 'ganache-provider', name: 'ganache-provider',

@ -1,5 +1,5 @@
import * as packageJson from '../../../../../package.json' import * as packageJson from '../../../../../package.json'
import {BasicVMProvider} from './vm-provider' import { BasicVMProvider } from './vm-provider'
export class GoerliForkVMProvider extends BasicVMProvider { export class GoerliForkVMProvider extends BasicVMProvider {
nodeUrl: string nodeUrl: string

@ -1,7 +1,7 @@
import * as packageJson from '../../../../../package.json' import * as packageJson from '../../../../../package.json'
import React from 'react' // eslint-disable-line import React from 'react' // eslint-disable-line
import {FormattedMessage} from 'react-intl' import { FormattedMessage } from 'react-intl'
import {AbstractProvider} from './abstract-provider' import { AbstractProvider } from './abstract-provider'
const profile = { const profile = {
name: 'hardhat-provider', name: 'hardhat-provider',

@ -1,5 +1,5 @@
import * as packageJson from '../../../../../package.json' import * as packageJson from '../../../../../package.json'
import {InjectedCustomProvider} from './injected-custom-provider' import { InjectedCustomProvider } from './injected-custom-provider'
const profile = { const profile = {
name: 'injected-arbitrum-one-provider', name: 'injected-arbitrum-one-provider',

@ -1,5 +1,5 @@
import Web3 from 'web3' import Web3 from 'web3'
import {InjectedProviderDefault} from './injected-provider-default' import { InjectedProviderDefault } from './injected-provider-default'
export class InjectedCustomProvider extends InjectedProviderDefault { export class InjectedCustomProvider extends InjectedProviderDefault {
chainName: string chainName: string
@ -32,7 +32,7 @@ export const setCustomNetwork = async (chainName: string, chainId: string, rpcUr
try { try {
await (window as any).ethereum.request({ await (window as any).ethereum.request({
method: 'wallet_switchEthereumChain', method: 'wallet_switchEthereumChain',
params: [{chainId: chainId}] params: [{ chainId: chainId }]
}) })
} catch (switchError) { } catch (switchError) {
// This error code indicates that the chain has not been added to MetaMask. // This error code indicates that the chain has not been added to MetaMask.
@ -48,14 +48,14 @@ export const setCustomNetwork = async (chainName: string, chainId: string, rpcUr
if (blockExplorerUrls) paramsObj.blockExplorerUrls = blockExplorerUrls if (blockExplorerUrls) paramsObj.blockExplorerUrls = blockExplorerUrls
await (window as any).ethereum.request({ await (window as any).ethereum.request({
method: 'wallet_addEthereumChain', method: 'wallet_addEthereumChain',
params: [ paramsObj ] params: [paramsObj]
}) })
await (window as any).ethereum.request({ await (window as any).ethereum.request({
method: 'wallet_switchEthereumChain', method: 'wallet_switchEthereumChain',
params: [{chainId: chainId}] params: [{ chainId: chainId }]
}) })
} }
} catch (addError) { } catch (addError) {
// handle "add" error // handle "add" error
} }

@ -1,5 +1,5 @@
import * as packageJson from '../../../../../package.json' import * as packageJson from '../../../../../package.json'
import {InjectedCustomProvider} from './injected-custom-provider' import { InjectedCustomProvider } from './injected-custom-provider'
import Web3 from 'web3' import Web3 from 'web3'
const profile = { const profile = {
@ -13,7 +13,7 @@ const profile = {
export class InjectedEphemeryTestnetProvider extends InjectedCustomProvider { export class InjectedEphemeryTestnetProvider extends InjectedCustomProvider {
constructor() { constructor() {
super(profile, super(profile,
'Ephemery Testnet', 'Ephemery Testnet',
'', '',
['https://otter.bordel.wtf/erigon', 'https://eth.ephemeral.zeus.fyi'], ['https://otter.bordel.wtf/erigon', 'https://eth.ephemeral.zeus.fyi'],
@ -25,7 +25,7 @@ export class InjectedEphemeryTestnetProvider extends InjectedCustomProvider {
[ [
'https://otter.bordel.wtf/', 'https://otter.bordel.wtf/',
'https://explorer.ephemery.dev/' 'https://explorer.ephemery.dev/'
] ]
) )
} }

@ -1,5 +1,5 @@
import * as packageJson from '../../../../../package.json' import * as packageJson from '../../../../../package.json'
import {InjectedCustomProvider} from './injected-custom-provider' import { InjectedCustomProvider } from './injected-custom-provider'
const profile = { const profile = {
name: 'injected-optimism-provider', name: 'injected-optimism-provider',

@ -1,6 +1,6 @@
/* global ethereum */ /* global ethereum */
import * as packageJson from '../../../../../package.json' import * as packageJson from '../../../../../package.json'
import {InjectedProvider} from './injected-provider' import { InjectedProvider } from './injected-provider'
export class InjectedProviderDefaultBase extends InjectedProvider { export class InjectedProviderDefaultBase extends InjectedProvider {
constructor(profile) { constructor(profile) {
@ -34,7 +34,7 @@ const profile = {
} }
export class InjectedProviderDefault extends InjectedProviderDefaultBase { export class InjectedProviderDefault extends InjectedProviderDefaultBase {
provider: any provider: any
constructor(provider: any, name: string) { constructor(provider: any, name: string) {
super({ ...profile, ...{ name, displayName: name } }) super({ ...profile, ...{ name, displayName: name } })
this.provider = provider this.provider = provider

@ -1,6 +1,6 @@
/* global ethereum */ /* global ethereum */
import * as packageJson from '../../../../../package.json' import * as packageJson from '../../../../../package.json'
import {InjectedProvider} from './injected-provider' import { InjectedProvider } from './injected-provider'
const profile = { const profile = {
name: 'injected-trustwallet', name: 'injected-trustwallet',

@ -1,8 +1,8 @@
/* global ethereum */ /* global ethereum */
import React from 'react' // eslint-disable-line import React from 'react' // eslint-disable-line
import {Plugin} from '@remixproject/engine' import { Plugin } from '@remixproject/engine'
import {JsonDataRequest, RejectRequest, SuccessRequest} from '../providers/abstract-provider' import { JsonDataRequest, RejectRequest, SuccessRequest } from '../providers/abstract-provider'
import {IProvider} from './abstract-provider' import { IProvider } from './abstract-provider'
export abstract class InjectedProvider extends Plugin implements IProvider { export abstract class InjectedProvider extends Plugin implements IProvider {
options: {[id: string]: any} = {} options: {[id: string]: any} = {}
@ -45,7 +45,7 @@ export abstract class InjectedProvider extends Plugin implements IProvider {
askPermission(throwIfNoInjectedProvider) { askPermission(throwIfNoInjectedProvider) {
const web3Provider = this.getInjectedProvider() const web3Provider = this.getInjectedProvider()
if (typeof web3Provider !== 'undefined' && typeof web3Provider.request === 'function') { if (typeof web3Provider !== 'undefined' && typeof web3Provider.request === 'function') {
web3Provider.request({method: 'eth_requestAccounts'}) web3Provider.request({ method: 'eth_requestAccounts' })
} else if (throwIfNoInjectedProvider) { } else if (throwIfNoInjectedProvider) {
throw new Error(this.notFound()) throw new Error(this.notFound())
} }
@ -86,19 +86,19 @@ export abstract class InjectedProvider extends Plugin implements IProvider {
} }
try { try {
let resultData let resultData
if (web3Provider.request) resultData = await web3Provider.request({method: data.method, params: data.params}) if (web3Provider.request) resultData = await web3Provider.request({ method: data.method, params: data.params })
else if (web3Provider.send) resultData = await web3Provider.send(data.method, data.params) else if (web3Provider.send) resultData = await web3Provider.send(data.method, data.params)
else { else {
resolve({jsonrpc: '2.0', error: { message: 'provider not valid', code: -32603 }, id: data.id}) resolve({ jsonrpc: '2.0', error: { message: 'provider not valid', code: -32603 }, id: data.id })
return return
} }
if (resultData) { if (resultData) {
if (resultData.jsonrpc && resultData.jsonrpc === '2.0') { if (resultData.jsonrpc && resultData.jsonrpc === '2.0') {
resultData = resultData.result resultData = resultData.result
} }
resolve({jsonrpc: '2.0', result: resultData, id: data.id}) resolve({ jsonrpc: '2.0', result: resultData, id: data.id })
} else { } else {
resolve({jsonrpc: '2.0', result: null, id: data.id}) resolve({ jsonrpc: '2.0', result: null, id: data.id })
} }
} catch (error) { } catch (error) {
if (error.data && error.data.originalError && error.data.originalError.data) { if (error.data && error.data.originalError && error.data.originalError.data) {

@ -13,9 +13,9 @@ const profile = {
export class InjectedSKALEChaosTestnetProvider extends InjectedCustomProvider { export class InjectedSKALEChaosTestnetProvider extends InjectedCustomProvider {
constructor () { constructor () {
super(profile, super(profile,
'SKALE Chaos Testnet', 'SKALE Chaos Testnet',
'0x50877ed6', '0x50877ed6',
['https://staging-v3.skalenodes.com/v1/staging-fast-active-bellatrix'], ['https://staging-v3.skalenodes.com/v1/staging-fast-active-bellatrix'],
{ {
"name": "sFUEL", "name": "sFUEL",

@ -1,5 +1,5 @@
import * as packageJson from '../../../../../package.json' import * as packageJson from '../../../../../package.json'
import {BasicVMProvider} from './vm-provider' import { BasicVMProvider } from './vm-provider'
export class MainnetForkVMProvider extends BasicVMProvider { export class MainnetForkVMProvider extends BasicVMProvider {
nodeUrl: string nodeUrl: string

@ -1,5 +1,5 @@
import * as packageJson from '../../../../../package.json' import * as packageJson from '../../../../../package.json'
import {BasicVMProvider} from './vm-provider' import { BasicVMProvider } from './vm-provider'
export class SepoliaForkVMProvider extends BasicVMProvider { export class SepoliaForkVMProvider extends BasicVMProvider {
nodeUrl: string nodeUrl: string

@ -1,8 +1,8 @@
import React from 'react' // eslint-disable-line import React from 'react' // eslint-disable-line
import * as packageJson from '../../../../../package.json' import * as packageJson from '../../../../../package.json'
import {JsonDataRequest, RejectRequest, SuccessRequest} from '../providers/abstract-provider' import { JsonDataRequest, RejectRequest, SuccessRequest } from '../providers/abstract-provider'
import {Plugin} from '@remixproject/engine' import { Plugin } from '@remixproject/engine'
import {IProvider} from './abstract-provider' import { IProvider } from './abstract-provider'
export class BasicVMProvider extends Plugin implements IProvider { export class BasicVMProvider extends Plugin implements IProvider {
blockchain blockchain
@ -33,7 +33,7 @@ export class BasicVMProvider extends Plugin implements IProvider {
await this.blockchain.providers.vm.provider.sendAsync(data, (error, result) => { await this.blockchain.providers.vm.provider.sendAsync(data, (error, result) => {
if (error) return reject(error) if (error) return reject(error)
else { else {
resolve({jsonrpc: '2.0', result, id: data.id}) resolve({ jsonrpc: '2.0', result, id: data.id })
} }
}) })
} catch (error) { } catch (error) {

@ -26,7 +26,7 @@ export class CompileAndRun extends Plugin {
super(profile) super(profile)
this.executionListener = async (e) => { this.executionListener = async (e) => {
// ctrl+e or command+e // ctrl+e or command+e
if ((e.metaKey || e.ctrlKey) && e.shiftKey && e.keyCode === 83) { if ((e.metaKey || e.ctrlKey) && e.shiftKey && e.keyCode === 83) {
const file = await this.call('fileManager', 'file') const file = await this.call('fileManager', 'file')
if (file) { if (file) {
@ -51,7 +51,7 @@ export class CompileAndRun extends Plugin {
} }
async runScript (fileName, clearAllInstances) { async runScript (fileName, clearAllInstances) {
await this.call('terminal', 'log', { value: `running ${fileName} ...`, type: 'info' }) await this.call('terminal', 'log', { value: `running ${fileName} ...`, type: 'info' })
try { try {
const exists = await this.call('fileManager', 'exists', fileName) const exists = await this.call('fileManager', 'exists', fileName)
if (!exists) { if (!exists) {
@ -65,7 +65,7 @@ export class CompileAndRun extends Plugin {
await this.call('scriptRunner', 'execute', content, fileName) await this.call('scriptRunner', 'execute', content, fileName)
} catch (e) { } catch (e) {
this.call('notification', 'toast', e.message || e) this.call('notification', 'toast', e.message || e)
} }
} }
onActivation () { onActivation () {

@ -1,7 +1,7 @@
import {ViewPlugin} from '@remixproject/engine-web' import { ViewPlugin } from '@remixproject/engine-web'
import * as packageJson from '../../../../../package.json' import * as packageJson from '../../../../../package.json'
import React from 'react' // eslint-disable-line import React from 'react' // eslint-disable-line
import {SearchTab} from '@remix-ui/search' import { SearchTab } from '@remix-ui/search'
const profile = { const profile = {
name: 'search', name: 'search',
displayName: 'Search in files', displayName: 'Search in files',

@ -1,10 +1,10 @@
/* eslint-disable @typescript-eslint/no-explicit-any */ /* eslint-disable @typescript-eslint/no-explicit-any */
import React from 'react' // eslint-disable-line import React from 'react' // eslint-disable-line
import {ViewPlugin} from '@remixproject/engine-web' import { ViewPlugin } from '@remixproject/engine-web'
import * as packageJson from '../../../../../package.json' import * as packageJson from '../../../../../package.json'
import {RemixUiSettings} from '@remix-ui/settings' //eslint-disable-line import {RemixUiSettings} from '@remix-ui/settings' //eslint-disable-line
import {Registry} from '@remix-project/remix-lib' import { Registry } from '@remix-project/remix-lib'
import {PluginViewWrapper} from '@remix-ui/helper' import { PluginViewWrapper } from '@remix-ui/helper'
declare global { declare global {
interface Window { interface Window {
_paq: any _paq: any
@ -62,7 +62,7 @@ module.exports = class SettingsTab extends ViewPlugin {
onActivation(): void { onActivation(): void {
} }
render() { render() {
return ( return (
<div id="settingsTab"> <div id="settingsTab">

@ -1,20 +1,20 @@
import React from 'react' // eslint-disable-line import React from 'react' // eslint-disable-line
import {fromWei, toBigInt, toWei} from 'web3-utils' import { fromWei, toBigInt, toWei } from 'web3-utils'
import {Plugin} from '@remixproject/engine' import { Plugin } from '@remixproject/engine'
import {toBytes, addHexPrefix} from '@ethereumjs/util' import { toBytes, addHexPrefix } from '@ethereumjs/util'
import {EventEmitter} from 'events' import { EventEmitter } from 'events'
import {format} from 'util' import { format } from 'util'
import {ExecutionContext} from './execution-context' import { ExecutionContext } from './execution-context'
import Config from '../config' import Config from '../config'
import {VMProvider} from './providers/vm' import { VMProvider } from './providers/vm'
import {InjectedProvider} from './providers/injected' import { InjectedProvider } from './providers/injected'
import {NodeProvider} from './providers/node' import { NodeProvider } from './providers/node'
import {execution, EventManager, helpers} from '@remix-project/remix-lib' import { execution, EventManager, helpers } from '@remix-project/remix-lib'
import {etherScanLink} from './helper' import { etherScanLink } from './helper'
import {logBuilder, cancelUpgradeMsg, cancelProxyMsg, addressToString} from '@remix-ui/helper' import { logBuilder, cancelUpgradeMsg, cancelProxyMsg, addressToString } from '@remix-ui/helper'
const {txFormat, txExecution, typeConversion, txListener: Txlistener, TxRunner, TxRunnerWeb3, txHelper} = execution const { txFormat, txExecution, typeConversion, txListener: Txlistener, TxRunner, TxRunnerWeb3, txHelper } = execution
const {txResultHelper} = helpers const { txResultHelper } = helpers
const {resultToRemixTx} = txResultHelper const { resultToRemixTx } = txResultHelper
import * as packageJson from '../../../../package.json' import * as packageJson from '../../../../package.json'
const _paq = (window._paq = window._paq || []) //eslint-disable-line const _paq = (window._paq = window._paq || []) //eslint-disable-line
@ -91,7 +91,7 @@ export class Blockchain extends Plugin {
this.txRunner = new TxRunner(web3Runner, {}) this.txRunner = new TxRunner(web3Runner, {})
this.networkcallid = 0 this.networkcallid = 0
this.networkStatus = {network: {name: ' - ', id: ' - '}} this.networkStatus = { network: { name: ' - ', id: ' - ' } }
this.registeredPluginEvents = [] this.registeredPluginEvents = []
this.setupEvents() this.setupEvents()
this.setupProviders() this.setupProviders()
@ -110,7 +110,7 @@ export class Blockchain extends Plugin {
this.registeredPluginEvents.push(plugin.name) this.registeredPluginEvents.push(plugin.name)
this.on(plugin.name, 'chainChanged', () => { this.on(plugin.name, 'chainChanged', () => {
this.detectNetwork((error, network) => { this.detectNetwork((error, network) => {
this.networkStatus = {network, error} this.networkStatus = { network, error }
this._triggerEvent('networkStatus', [this.networkStatus]) this._triggerEvent('networkStatus', [this.networkStatus])
}) })
}) })
@ -131,7 +131,7 @@ export class Blockchain extends Plugin {
await this.loadContext(context) await this.loadContext(context)
this._triggerEvent('contextChanged', [context]) this._triggerEvent('contextChanged', [context])
this.detectNetwork((error, network) => { this.detectNetwork((error, network) => {
this.networkStatus = {network, error} this.networkStatus = { network, error }
this._triggerEvent('networkStatus', [this.networkStatus]) this._triggerEvent('networkStatus', [this.networkStatus])
}) })
}) })
@ -146,7 +146,7 @@ export class Blockchain extends Plugin {
setInterval(() => { setInterval(() => {
this.detectNetwork((error, network) => { this.detectNetwork((error, network) => {
this.networkStatus = {network, error} this.networkStatus = { network, error }
this._triggerEvent('networkStatus', [this.networkStatus]) this._triggerEvent('networkStatus', [this.networkStatus])
}) })
}, 30000) }, 30000)
@ -189,7 +189,7 @@ export class Blockchain extends Plugin {
} }
deployContractAndLibraries(selectedContract, args, contractMetadata, compilerContracts, callbacks, confirmationCb) { deployContractAndLibraries(selectedContract, args, contractMetadata, compilerContracts, callbacks, confirmationCb) {
const {continueCb, promptCb, statusCb, finalCb} = callbacks const { continueCb, promptCb, statusCb, finalCb } = callbacks
const constructor = selectedContract.getConstructorInterface() const constructor = selectedContract.getConstructorInterface()
txFormat.buildData( txFormat.buildData(
selectedContract.name, selectedContract.name,
@ -215,7 +215,7 @@ export class Blockchain extends Plugin {
} }
deployContractWithLibrary(selectedContract, args, contractMetadata, compilerContracts, callbacks, confirmationCb) { deployContractWithLibrary(selectedContract, args, contractMetadata, compilerContracts, callbacks, confirmationCb) {
const {continueCb, promptCb, statusCb, finalCb} = callbacks const { continueCb, promptCb, statusCb, finalCb } = callbacks
const constructor = selectedContract.getConstructorInterface() const constructor = selectedContract.getConstructorInterface()
txFormat.encodeConstructorCallAndLinkLibraries( txFormat.encodeConstructorCallAndLinkLibraries(
selectedContract.object, selectedContract.object,
@ -257,7 +257,7 @@ export class Blockchain extends Plugin {
} }
async runProxyTx(proxyData, implementationContractObject) { async runProxyTx(proxyData, implementationContractObject) {
const args = {useCall: false, data: proxyData} const args = { useCall: false, data: proxyData }
let networkInfo let networkInfo
const confirmationCb = (network, tx, gasEstimation, continueTxExecution, cancelCb) => { const confirmationCb = (network, tx, gasEstimation, continueTxExecution, cancelCb) => {
networkInfo = network networkInfo = network
@ -308,7 +308,7 @@ export class Blockchain extends Plugin {
} }
async runUpgradeTx(proxyAddress, data, newImplementationContractObject) { async runUpgradeTx(proxyAddress, data, newImplementationContractObject) {
const args = {useCall: false, data, to: proxyAddress} const args = { useCall: false, data, to: proxyAddress }
let networkInfo let networkInfo
const confirmationCb = (network, tx, gasEstimation, continueTxExecution, cancelCb) => { const confirmationCb = (network, tx, gasEstimation, continueTxExecution, cancelCb) => {
// continue using original authorization given by user // continue using original authorization given by user
@ -336,7 +336,7 @@ export class Blockchain extends Plugin {
} }
async saveDeployedContractStorageLayout(contractObject, proxyAddress, networkInfo) { async saveDeployedContractStorageLayout(contractObject, proxyAddress, networkInfo) {
const {contractName, implementationAddress} = contractObject const { contractName, implementationAddress } = contractObject
const networkName = networkInfo.name === 'custom' ? networkInfo.name + '-' + networkInfo.id : networkInfo.name const networkName = networkInfo.name === 'custom' ? networkInfo.name + '-' + networkInfo.id : networkInfo.name
const hasPreviousDeploys = await this.call('fileManager', 'exists', `.deploys/upgradeable-contracts/${networkName}/UUPS.json`) const hasPreviousDeploys = await this.call('fileManager', 'exists', `.deploys/upgradeable-contracts/${networkName}/UUPS.json`)
// TODO: make deploys folder read only. // TODO: make deploys folder read only.
@ -436,7 +436,7 @@ export class Blockchain extends Plugin {
data.contractABI = selectedContract.abi data.contractABI = selectedContract.abi
} }
this.runTx({data: data, useCall: false}, confirmationCb, continueCb, promptCb, (error, txResult, address) => { this.runTx({ data: data, useCall: false }, confirmationCb, continueCb, promptCb, (error, txResult, address) => {
if (error) { if (error) {
return finalCb(`creation of ${selectedContract.name} errored: ${error.message ? error.message : error}`) return finalCb(`creation of ${selectedContract.name} errored: ${error.message ? error.message : error}`)
} }
@ -578,7 +578,7 @@ export class Blockchain extends Plugin {
data.contract = contract data.contract = contract
} }
const useCall = funABI.stateMutability === 'view' || funABI.stateMutability === 'pure' const useCall = funABI.stateMutability === 'view' || funABI.stateMutability === 'pure'
this.runTx({to: address, data, useCall}, confirmationCb, continueCb, promptCb, (error, txResult, _address, returnValue) => { this.runTx({ to: address, data, useCall }, confirmationCb, continueCb, promptCb, (error, txResult, _address, returnValue) => {
if (error) { if (error) {
return logCallback(`${logMsg} errored: ${error.message ? error.message : error}`) return logCallback(`${logMsg} errored: ${error.message ? error.message : error}`)
} }
@ -629,13 +629,13 @@ export class Blockchain extends Plugin {
async loadContext(context: string) { async loadContext(context: string) {
const saveEvmState = this.config.get('settings/save-evm-state') const saveEvmState = this.config.get('settings/save-evm-state')
if (saveEvmState) { if (saveEvmState) {
const contextExists = await this.call('fileManager', 'exists', `.states/${context}/state.json`) const contextExists = await this.call('fileManager', 'exists', `.states/${context}/state.json`)
if (contextExists) { if (contextExists) {
const stateDb = await this.call('fileManager', 'readFile', `.states/${context}/state.json`) const stateDb = await this.call('fileManager', 'readFile', `.states/${context}/state.json`)
await this.getCurrentProvider().resetEnvironment(stateDb) await this.getCurrentProvider().resetEnvironment(stateDb)
} else { } else {
await this.getCurrentProvider().resetEnvironment() await this.getCurrentProvider().resetEnvironment()
@ -676,7 +676,7 @@ export class Blockchain extends Plugin {
view on etherscan view on etherscan
</a> </a>
) )
} }
}) })
}) })
this.txRunner = new TxRunner(web3Runner, {}) this.txRunner = new TxRunner(web3Runner, {})
@ -866,7 +866,7 @@ export class Blockchain extends Plugin {
const eventName = tx.useCall ? 'callExecuted' : 'transactionExecuted' const eventName = tx.useCall ? 'callExecuted' : 'transactionExecuted'
this._triggerEvent(eventName, [error, tx.from, tx.to, tx.data, tx.useCall, result, timestamp, payLoad]) this._triggerEvent(eventName, [error, tx.from, tx.to, tx.data, tx.useCall, result, timestamp, payLoad])
return resolve({result, tx}) return resolve({ result, tx })
}) })
} catch (err) { } catch (err) {
return reject(err) return reject(err)
@ -894,7 +894,7 @@ export class Blockchain extends Plugin {
this.call('fileManager', 'writeFile', `.states/${this.executionContext.getProvider()}/state.json`, state) this.call('fileManager', 'writeFile', `.states/${this.executionContext.getProvider()}/state.json`, state)
} catch (e) { } catch (e) {
console.error(e) console.error(e)
} }
} }
const hhlogs = await this.web3().remix.getHHLogsForTx(txResult.transactionHash) const hhlogs = await this.web3().remix.getHHLogsForTx(txResult.transactionHash)
@ -923,7 +923,7 @@ export class Blockchain extends Plugin {
this.call('terminal', 'logHtml', finalLogs) this.call('terminal', 'logHtml', finalLogs)
} }
execResult = await this.web3().remix.getExecutionResultFromSimulator(txResult.transactionHash) execResult = await this.web3().remix.getExecutionResultFromSimulator(txResult.transactionHash)
if (execResult) { if (execResult) {
// if it's not the VM, we don't have return value. We only have the transaction, and it does not contain the return value. // if it's not the VM, we don't have return value. We only have the transaction, and it does not contain the return value.
returnValue = execResult returnValue = execResult
@ -959,9 +959,9 @@ export class Blockchain extends Plugin {
cb((await buildError(errorMessage, errorData)).message) cb((await buildError(errorMessage, errorData)).message)
} else if (error.message || error.data) { } else if (error.message || error.data) {
errorMessage = error.message errorMessage = error.message
errorData = error.data errorData = error.data
cb((await buildError(errorMessage, errorData)).message) cb((await buildError(errorMessage, errorData)).message)
} else } else
cb(error) cb(error)
} }
} }

@ -6,7 +6,7 @@ const transactionDetailsLinks = {
Goerli: 'https://goerli.etherscan.io/tx/', Goerli: 'https://goerli.etherscan.io/tx/',
Sepolia: 'https://sepolia.etherscan.io/tx/' Sepolia: 'https://sepolia.etherscan.io/tx/'
} }
export function etherScanLink (network: string, hash: string): string { export function etherScanLink (network: string, hash: string): string {
if (transactionDetailsLinks[network]) { if (transactionDetailsLinks[network]) {
return transactionDetailsLinks[network] + hash return transactionDetailsLinks[network] + hash

@ -46,7 +46,7 @@ export class VMProvider {
stamps[msg.data.stamp].reject(msg.data.error) stamps[msg.data.stamp].reject(msg.data.error)
} else { } else {
stamps[msg.data.stamp].resolve(msg.data.result) stamps[msg.data.stamp].resolve(msg.data.result)
} }
} else if (msg.data.cmd === 'initiateResult') { } else if (msg.data.cmd === 'initiateResult') {
if (!msg.data.error) { if (!msg.data.error) {
this.provider = { this.provider = {
@ -55,7 +55,7 @@ export class VMProvider {
const stamp = Date.now() + incr const stamp = Date.now() + incr
incr++ incr++
stamps[stamp] = { callback, resolve, reject } stamps[stamp] = { callback, resolve, reject }
this.worker.postMessage({ cmd: 'sendAsync', query, stamp }) this.worker.postMessage({ cmd: 'sendAsync', query, stamp })
}) })
} }
} }
@ -102,7 +102,6 @@ export class VMProvider {
}) })
} }
// TODO: is still here because of the plugin API // TODO: is still here because of the plugin API
// can be removed later when we update the API // can be removed later when we update the API
createVMAccount (newAccount) { createVMAccount (newAccount) {
@ -134,5 +133,5 @@ export class VMProvider {
this.web3.eth.sign(message, account) this.web3.eth.sign(message, account)
.then(signedData => cb(null, bytesToHex(messageHash), signedData)) .then(signedData => cb(null, bytesToHex(messageHash), signedData))
.catch(error => cb(error)) .catch(error => cb(error))
} }
} }

@ -4,9 +4,9 @@ let provider: Provider = null
self.onmessage = (e: MessageEvent) => { self.onmessage = (e: MessageEvent) => {
const data = e.data const data = e.data
switch (data.cmd) { switch (data.cmd) {
case 'init': case 'init':
{ {
provider = new Provider({ fork: data.fork, nodeUrl: data.nodeUrl, blockNumber: data.blockNumber, stateDb: data.stateDb, blocks: data.blocks}) provider = new Provider({ fork: data.fork, nodeUrl: data.nodeUrl, blockNumber: data.blockNumber, stateDb: data.stateDb, blocks: data.blocks })
provider.init().then(() => { provider.init().then(() => {
self.postMessage({ self.postMessage({
cmd: 'initiateResult', cmd: 'initiateResult',
@ -40,7 +40,7 @@ self.onmessage = (e: MessageEvent) => {
stamp: data.stamp stamp: data.stamp
}) })
} }
break break
} }
case 'addAccount': case 'addAccount':
@ -48,7 +48,7 @@ self.onmessage = (e: MessageEvent) => {
if (provider) { if (provider) {
provider.Accounts._addAccount(data.privateKey, data.balance) provider.Accounts._addAccount(data.privateKey, data.balance)
} }
break break
} }
case 'newAccount': case 'newAccount':
@ -67,11 +67,11 @@ self.onmessage = (e: MessageEvent) => {
result: address, result: address,
stamp: data.stamp stamp: data.stamp
}) })
} }
}) })
} }
break break
} }
} }
} }

@ -1,11 +1,11 @@
// eslint-disable-next-line no-use-before-define // eslint-disable-next-line no-use-before-define
import React from 'react' import React from 'react'
import './index.css' import './index.css'
import {ThemeModule} from './app/tabs/theme-module' import { ThemeModule } from './app/tabs/theme-module'
import {Preload} from './app/components/preload' import { Preload } from './app/components/preload'
import Config from './config' import Config from './config'
import {Registry} from '@remix-project/remix-lib' import { Registry } from '@remix-project/remix-lib'
import {Storage} from '@remix-project/remix-lib' import { Storage } from '@remix-project/remix-lib'
import { createRoot } from 'react-dom/client' import { createRoot } from 'react-dom/client'
@ -13,14 +13,14 @@ import { createRoot } from 'react-dom/client'
try { try {
const configStorage = new Storage('config-v0.8:') const configStorage = new Storage('config-v0.8:')
const config = new Config(configStorage) const config = new Config(configStorage)
Registry.getInstance().put({api: config, name: 'config'}) Registry.getInstance().put({ api: config, name: 'config' })
} catch (e) {} } catch (e) {}
const theme = new ThemeModule() const theme = new ThemeModule()
theme.initTheme() theme.initTheme()
const container = document.getElementById('root'); const container = document.getElementById('root');
const root = createRoot(container) const root = createRoot(container)
if (container) { if (container) {
root.render(<Preload root={root} />); root.render(<Preload root={root} />);
} }
})() })()

Loading…
Cancel
Save