Merge branch 'master' into master

pull/5332/head
Tomer 3 days ago committed by GitHub
commit 69d2885303
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
  1. 6
      .github/workflows/pr-reminder.yml
  2. 9
      apps/circuit-compiler/src/app/components/container.tsx
  3. 7
      apps/quick-dapp/src/actions/index.ts
  4. 4
      apps/quick-dapp/src/components/DeployPanel/index.tsx
  5. 43
      apps/quick-dapp/src/components/ImageUpload/index.tsx
  6. 1
      apps/remix-dapp/src/assets/instance.json
  7. 2
      apps/remix-dapp/src/components/DappTop/index.tsx
  8. 4
      apps/remix-dapp/src/components/Home/mobile.tsx
  9. 4
      apps/remix-dapp/src/components/Home/pc.tsx
  10. 52
      apps/remix-ide-e2e/src/tests/ai_panel.test.ts
  11. 2
      apps/remix-ide-e2e/src/tests/metamask.test.ts
  12. 2
      apps/remix-ide-e2e/src/tests/runAndDeploy_injected.test.ts
  13. 2
      apps/remix-ide-e2e/src/tests/url.test.ts
  14. 7
      apps/remix-ide/src/app/plugins/remixAIPlugin.tsx
  15. 3
      apps/remix-ide/src/app/tabs/locales/en/quickDapp.json
  16. 2
      apps/remix-ide/src/app/tabs/locales/en/remixUiTabs.json
  17. 6
      apps/vyper/src/app/utils/remix-client.tsx
  18. 8
      libs/ghaction-helper/package.json
  19. 1
      libs/remix-ai-core/src/helpers/streamHandler.ts
  20. 18
      libs/remix-ai-core/src/inferencers/remote/remoteInference.ts
  21. 8
      libs/remix-analyzer/package.json
  22. 6
      libs/remix-astwalker/package.json
  23. 12
      libs/remix-debug/package.json
  24. 4
      libs/remix-lib/package.json
  25. 6
      libs/remix-simulator/package.json
  26. 6
      libs/remix-solidity/package.json
  27. 10
      libs/remix-tests/package.json
  28. 6
      libs/remix-ui/editor/src/lib/remix-ui-editor.tsx
  29. 2
      libs/remix-ui/remix-ai/src/lib/components/ModelSelection.tsx
  30. 6
      libs/remix-ui/renderer/src/lib/renderer.tsx
  31. 10
      libs/remix-ui/run-tab/src/lib/components/contractGUI.tsx
  32. 1
      libs/remix-ui/run-tab/src/lib/components/instanceContainerUI.tsx
  33. 2
      libs/remix-ui/run-tab/src/lib/components/universalDappUI.tsx
  34. 11
      libs/remix-ui/run-tab/src/lib/run-tab.tsx
  35. 2
      libs/remix-ui/run-tab/src/lib/types/index.ts
  36. 29
      libs/remix-ui/tabs/src/lib/remix-ui-tabs.tsx
  37. 2
      libs/remix-ui/workspace/src/lib/components/electron-menu.tsx
  38. 11
      libs/remix-ui/workspace/src/lib/components/electron-workspace-name.tsx
  39. 4
      libs/remix-ui/workspace/src/lib/remix-ui-workspace.tsx
  40. 4
      libs/remix-url-resolver/package.json
  41. 4
      libs/remix-ws-templates/package.json
  42. 2
      libs/remixd/package.json
  43. 2
      package.json
  44. 14
      releaseDetails.json

@ -3,7 +3,7 @@ name: PRs reviews reminder
on:
schedule:
- cron: "0 8 * * 1-5"
- cron: '58 9 * * 1-5'
- cron: '55 9 * * 1-5'
workflow_dispatch:
jobs:
@ -17,9 +17,9 @@ jobs:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
webhook-url: ${{ secrets.DISCORD_WEBHOOK_URL }}
freeze-date: '2024-11-04T18:00:00Z'
freeze-date: '2024-12-02T18:00:00Z'
- name: Reminder for standup
if: github.event.schedule == '58 9 * * 1-5'
if: github.event.schedule == '55 9 * * 1-5'
uses: Aniket-Engg/pr-reviews-reminder-action@master
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

@ -73,14 +73,20 @@ export function Container () {
full circom error: ${JSON.stringify(report, null, 2)}
explain why the error occurred and how to fix it.
`
await circuitApp.plugin.call('popupPanel' as any, 'showPopupPanel', true)
setTimeout(async () => {
await circuitApp.plugin.call('remixAI' as any, 'chatPipe', 'error_explaining', message)
}, 500)
} else {
const message = `
error message: ${error}
full circom error: ${JSON.stringify(report, null, 2)}
explain why the error occurred and how to fix it.
`
await circuitApp.plugin.call('popupPanel' as any, 'showPopupPanel', true)
setTimeout(async () => {
await circuitApp.plugin.call('remixAI' as any, 'chatPipe', 'error_explaining', message)
}, 500)
}
} else {
const error = report.message
@ -89,7 +95,10 @@ export function Container () {
full circom error: ${JSON.stringify(report, null, 2)}
explain why the error occurred and how to fix it.
`
await circuitApp.plugin.call('popupPanel' as any, 'showPopupPanel', true)
setTimeout(async () => {
await circuitApp.plugin.call('remixAI' as any, 'chatPipe', 'error_explaining', message)
}, 500)
}
}

@ -171,6 +171,7 @@ export const deploy = async (payload: any, callback: any) => {
...instance,
shortname: payload.shortname,
shareTo: payload.shareTo,
showLogo: !!logo,
})
const files: Record<string, string> = {
@ -192,7 +193,9 @@ export const deploy = async (payload: any, callback: any) => {
files[`dir/${path}`] = resp.data;
}
if (logo) {
files['dir/assets/logo.png'] = logo
}
files['dir/CORS'] = '*'
files['dir/index.html'] = files['dir/index.html'].replace(
'assets/css/themes/remix-dark_tvx1s2.css',
@ -341,7 +344,7 @@ export const initInstance = async ({
}
: { A: ids };
const logo = await axios.get('https://dev.remix-dapp.pages.dev/logo.png', { responseType: 'arraybuffer' })
// const logo = await axios.get('https://dev.remix-dapp.pages.dev/logo.png', { responseType: 'arraybuffer' })
await dispatch({
type: 'SET_INSTANCE',
@ -353,7 +356,7 @@ export const initInstance = async ({
natSpec,
solcVersion: getVersion(solcVersion),
...lowLevel,
logo: logo.data,
// logo: logo.data,
},
});
};

@ -51,6 +51,8 @@ function DeployPanel(): JSX.Element {
<div className="col-3 d-inline-block">
<h3 className="mb-3" data-id="quick-dapp-admin">QuickDapp <FormattedMessage id="quickDapp.admin" /></h3>
<Button
size="sm"
style={{ height: 32 }}
data-id="resetFunctions"
onClick={() => {
resetInstance();
@ -59,6 +61,8 @@ function DeployPanel(): JSX.Element {
<FormattedMessage id="quickDapp.resetFunctions" />
</Button>
<Button
size="sm"
style={{ height: 32, width: 100 }}
data-id="deleteDapp"
className="ml-3"
onClick={() => {

@ -29,20 +29,47 @@ const ImageUpload = () => {
}
return (
<div className="col-3 pr-0">
<div className="col-3 pr-0 my-2 d-flex justify-content-center align-items-center">
<input data-id="uploadLogo" className="d-none" type="file" accept="image/*" onChange={handleImageChange} id="upload-button" />
{logo ? (
<div className='position-absolute'>
<img src={preview} alt="preview" style={{ width: 95, height: 95 }} />
<CustomTooltip
placement="right"
tooltipText={intl.formatMessage({ id: 'quickDapp.uploadLogoTooltip' })}
tooltipText={intl.formatMessage({ id: 'quickDapp.deleteLogoTooltip' })}
>
<label htmlFor="upload-button" className="cursor_pointer d-flex justify-content-center align-items-center position-relative" style={{ height: 170 }}>
{logo ? (
<img src={preview} alt="preview" style={{ width: 120, height: 120 }} />
<span
className="btn position-absolute"
style={{
top: -30,
right: -30,
}}
onClick={(event) => {
event.preventDefault()
// @ts-expect-error
document.getElementById('upload-button').value = ''
dispatch({ type: 'SET_INSTANCE', payload: { logo: '' } })
}}
>
<i className="fas fa-times text-dark"></i>
</span>
</CustomTooltip>
</div>
) : (
<i className="fas fa-upload" style={{ fontSize: 120 }}></i>
)}
</label>
<div className="bg-light" style={{ height: 158.5, width: 158.5 }}>
<div style={{ padding: 15 }}>
<div className='mt-2' style={{ fontSize: 15, lineHeight: '18px' }}>A logo is optional and should be<br/> 95px 95px.</div>
<label htmlFor="upload-button" className='text-center d-block'>
<CustomTooltip
placement="right"
tooltipText={intl.formatMessage({ id: 'quickDapp.addLogoTooltip' })}
>
<div className='mt-4 btn btn-primary btn-sm' style={{ height: 32, width: 100, lineHeight: '22px' }}>Select Logo</div>
</CustomTooltip>
</label>
</div>
</div>
)}
</div>
)
}

@ -492,6 +492,7 @@
],
"noTerminal": false,
"verified": true,
"showLogo": true,
"solcVersion": {
"version": "0.8.26",
"canReceive": true

@ -30,7 +30,7 @@ const DappTop: React.FC = () => {
const shareTitle = encodeURIComponent('Hello everyone, this is my dapp!');
return (
<div className="col-10 p-3 bg-light w-auto d-flex justify-content-between">
<div className={`${instance.showLogo ? 'col-10' : 'col-12'} p-3 bg-light w-auto d-flex justify-content-between`}>
<div>
{title && <h1 data-id="dappTitle">{title}</h1>}
{details && <span data-id="dappInstructions">{details}</span>}

@ -18,9 +18,9 @@ const MobilePage: React.FC = () => {
} col-xl-9 col-lg-8 col-md-7 pr-0`}
>
<div className="mx-3 my-2 row">
<div className="col-2 text-center px-0 d-flex align-items-center">
{instance.showLogo && <div className="col-2 text-center px-0 d-flex align-items-center">
<img src="/assets/logo.png" style={{ width: 55, height: 55 }} />
</div>
</div>}
<DappTop />
</div>
<UniversalDappUI />

@ -24,9 +24,9 @@ const PCPage: React.FC = () => {
>
<div className="col-xl-9 col-lg-8 col-md-7 d-inline-block pr-0">
<div className="mx-3 my-2 row">
<div className="col-2 text-center">
{instance.showLogo && <div className="col-2 text-center">
<img src="/assets/logo.png" style={{ width: 95, height: 95 }} />
</div>
</div>}
<DappTop />
</div>
<UniversalDappUI />

@ -0,0 +1,52 @@
'use strict'
import { NightwatchBrowser } from 'nightwatch'
import init from '../helpers/init'
import examples from '../examples/example-contracts'
const sources = [
{ 'Untitled.sol': { content: examples.ballot.content } }
]
module.exports = {
before: function (browser: NightwatchBrowser, done: VoidFunction) {
init(browser, done)
},
'@sources': function () {
return sources
},
'Add Ballot': function (browser: NightwatchBrowser) {
browser
.addFile('Untitled.sol', sources[0]['Untitled.sol'])
},
'Explain the contract': function (browser: NightwatchBrowser) {
browser
.waitForElementVisible('*[data-id="explain-editor"]')
.click('*[data-id="explain-editor"]')
.waitForElementVisible('*[data-id="popupPanelPluginsContainer"]')
.waitForElementVisible('*[data-id="aichat-view"]')
.waitForElementVisible({
locateStrategy: 'xpath',
selector: '//*[@data-id="aichat-view" and contains(.,"Explain the current code")]'
})
},
'close the popup': function (browser: NightwatchBrowser) {
browser
.waitForElementVisible('*[data-id="popupPanelToggle"]')
.click('*[data-id="popupPanelToggle"]')
.waitForElementNotVisible('*[data-id="popupPanelPluginsContainer"]')
},
'Add a bad contract': function (browser: NightwatchBrowser) {
browser
.addFile('Bad.sol', { content: 'errors' })
.clickLaunchIcon('solidity')
.waitForElementVisible('.ask-remix-ai-button')
.click('.ask-remix-ai-button')
.waitForElementVisible('*[data-id="popupPanelPluginsContainer"]')
.waitForElementVisible('*[data-id="aichat-view"]')
.waitForElementVisible({
locateStrategy: 'xpath',
selector: '//*[@data-id="aichat-view" and contains(.,"Explain the error")]'
})
}
}

@ -222,7 +222,7 @@ const tests = {
.modalFooterCancelClick('udappNotify')
},
// debug transaction
'Should deploy Ballot to Sepolia using metamask #group1 #flaky': function (browser: NightwatchBrowser) {
'Should deploy Ballot to Sepolia using metamask #group1': function (browser: NightwatchBrowser) {
browser.waitForElementPresent('*[data-id="remixIdeSidePanel"]')
.switchBrowserTab(1)
.click('[data-testid="network-display"]')

@ -240,7 +240,7 @@ const tests = {
.journalLastChildIncludes('["0x76a3ABb5a12dcd603B52Ed22195dED17ee82708f"]')
},
'Test EIP 712 Signature with Injected Provider (Metamask) #group1 #flaky': function (browser: NightwatchBrowser) {
'Test EIP 712 Signature with Injected Provider (Metamask) #group1': function (browser: NightwatchBrowser) {
browser.waitForElementPresent('i[id="remixRunSignMsg"]')
.click('i[id="remixRunSignMsg"]')
.waitForElementVisible('*[data-id="signMessageTextarea"]', 120000)

@ -91,7 +91,7 @@ module.exports = {
})
},
'Should load Etherscan verified contracts from URL "address" param) #flaky #group1': function (browser: NightwatchBrowser) {
'Should load Etherscan verified contracts from URL "address" param) #group1': function (browser: NightwatchBrowser) {
browser
.url('http://127.0.0.1:8080/#address=0xdac17f958d2ee523a2206206994597c13d831ec7')
.refreshPage()

@ -121,6 +121,11 @@ export class RemixAIPlugin extends ViewPlugin {
this.call('terminal', 'log', { type: 'aitypewriterwarning', value: "RemixAI is already busy!" })
return
}
if (prompt.trimStart().startsWith('gpt') || prompt.trimStart().startsWith('sol-gpt')) {
params.terminal_output = true
params.stream_result = false
params.return_stream_response = false
}
const newPrompt = await this.agent.chatCommand(prompt)
let result
@ -130,6 +135,8 @@ export class RemixAIPlugin extends ViewPlugin {
result = await this.remoteInferencer.solidity_answer(newPrompt)
}
if (result && params.terminal_output) this.call('terminal', 'log', { type: 'aitypewriterwarning', value: result })
if (prompt.trimStart().startsWith('gpt') || prompt.trimStart().startsWith('sol-gpt')) params.terminal_output = false
return result
}

@ -32,7 +32,8 @@
"quickDapp.text4": "Deployed successfully!",
"quickDapp.text5": "Click the link below to view your dapp",
"quickDapp.text6": "Teardown successfully!",
"quickDapp.uploadLogoTooltip": "Click here to change logo",
"quickDapp.addLogoTooltip": "Click here to add a logo",
"quickDapp.deleteLogoTooltip": "Click here to delete the logo",
"quickDapp.dappTitle": "Dapp Title",
"quickDapp.dappInstructions": "Dapp Instructions",
"quickDapp.functionTitle": "Title of function",

@ -2,7 +2,7 @@
"remixUiTabs.tooltipText1": "Run script (CTRL + SHIFT + S)",
"remixUiTabs.tooltipText2": "Compile CTRL + S",
"remixUiTabs.tooltipText3": "Select .sol or .yul file to compile OR a .ts or .js file to run",
"remixUiTabs.tooltipText4": "To explain a contract, choose a .sol file",
"remixUiTabs.tooltipText4": "To explain a contract, choose a .sol, .vy or .circom file",
"remixUiTabs.tooltipText5": "Explain the contract(s) in current file [BETA]",
"remixUiTabs.tooltipText6": "Enable RemixAI Copilot [BETA]",
"remixUiTabs.tooltipText7": "Disable RemixAI Copilot [BETA]",

@ -71,7 +71,11 @@ export class RemixClient extends PluginClient<any, CustomRemixApi> {
const file = await this.client.call('fileManager', 'getCurrentFile')
const content = await this.client.call('fileManager', 'readFile', file)
const messageAI = `Vyper code: ${content}\n error message: ${message}\n explain why the error occurred and how to fix it.`
await this.client.call('remixAI' as any, 'chatPipe', 'error_explaining', messageAI)
await this.client.plugin.call('popupPanel', 'showPopupPanel', true)
setTimeout(async () => {
await this.client.plugin.call('remixAI' as any, 'chatPipe', 'error_explaining', messageAI)
}, 500)
} catch (err) {
console.error('unable to askGpt')
console.error(err)

@ -1,6 +1,6 @@
{
"name": "@remix-project/ghaction-helper",
"version": "0.1.39",
"version": "0.1.40",
"description": "Solidity Tests GitHub Action Helper",
"main": "src/index.js",
"scripts": {
@ -19,17 +19,17 @@
},
"homepage": "https://github.com/ethereum/remix-project#readme",
"devDependencies": {
"@remix-project/remix-solidity": "^0.5.45",
"@remix-project/remix-solidity": "^0.5.46",
"@types/chai": "^4.3.4",
"typescript": "^4.9.3"
},
"dependencies": {
"@ethereum-waffle/chai": "^3.4.4",
"@remix-project/remix-simulator": "^0.2.59",
"@remix-project/remix-simulator": "^0.2.60",
"chai": "^4.3.7",
"ethers": "^5.7.2",
"web3": "^4.1.1"
},
"types": "./src/index.d.ts",
"gitHead": "0875db01e67e48861e55a44fc8293e4c4bf58d91"
"gitHead": "bb66709c1db6c0f1c383f7075dd70fadf53a1caa"
}

@ -54,6 +54,7 @@ export const HandleStreamResponse = async (streamResponse,
}
catch (error) {
console.error('Error parsing JSON:', error);
return { 'generateText': '', 'isGenerating': false }
}
}

@ -27,7 +27,7 @@ export class RemoteInferencer implements ICompletions {
try {
const options = { headers: { 'Content-Type': 'application/json', } }
const result = await axios.post(`${requestURL}`, payload, options)
const result = await axios.post(requestURL, payload, options)
switch (rType) {
case AIRequestType.COMPLETION:
@ -56,7 +56,7 @@ export class RemoteInferencer implements ICompletions {
}
}
private async _streamInferenceRequest(endpoint, payload, rType:AIRequestType){
private async _streamInferenceRequest(payload, rType:AIRequestType){
let resultText = ""
try {
this.event.emit('onInference')
@ -122,26 +122,32 @@ export class RemoteInferencer implements ICompletions {
async code_generation(prompt, options:IParams=GenerationParams): Promise<any> {
const payload = { prompt, "endpoint":"code_completion", ...options }
if (options.stream_result) return this._streamInferenceRequest(payload.endpoint, payload, AIRequestType.COMPLETION)
if (options.stream_result) return this._streamInferenceRequest(payload, AIRequestType.COMPLETION)
else return this._makeRequest(payload, AIRequestType.COMPLETION)
}
async solidity_answer(prompt, options:IParams=GenerationParams): Promise<any> {
const main_prompt = buildSolgptPromt(prompt, this.model_op)
const payload = { 'prompt': main_prompt, "endpoint":"solidity_answer", ...options }
if (options.stream_result) return this._streamInferenceRequest(payload.endpoint, payload, AIRequestType.GENERAL)
if (options.stream_result) return this._streamInferenceRequest(payload, AIRequestType.GENERAL)
else return this._makeRequest(payload, AIRequestType.GENERAL)
}
async code_explaining(prompt, context:string="", options:IParams=GenerationParams): Promise<any> {
const payload = { prompt, "endpoint":"code_explaining", context, ...options }
if (options.stream_result) return this._streamInferenceRequest(payload.endpoint, payload, AIRequestType.GENERAL)
if (options.stream_result) return this._streamInferenceRequest(payload, AIRequestType.GENERAL)
else return this._makeRequest(payload, AIRequestType.GENERAL)
}
async error_explaining(prompt, options:IParams=GenerationParams): Promise<any> {
const payload = { prompt, "endpoint":"error_explaining", ...options }
if (options.stream_result) return this._streamInferenceRequest(payload.endpoint, payload, AIRequestType.GENERAL)
if (options.stream_result) return this._streamInferenceRequest(payload, AIRequestType.GENERAL)
else return this._makeRequest(payload, AIRequestType.GENERAL)
}
async vulnerability_check(prompt, options:IParams=GenerationParams): Promise<any> {
const payload = { prompt, "endpoint":"vulnerability_check", ...options }
if (options.stream_result) return this._streamInferenceRequest(payload, AIRequestType.GENERAL)
else return this._makeRequest(payload, AIRequestType.GENERAL)
}
}

@ -1,6 +1,6 @@
{
"name": "@remix-project/remix-analyzer",
"version": "0.5.68",
"version": "0.5.69",
"description": "Tool to perform static analysis on Solidity smart contracts",
"scripts": {
"test": "./../../node_modules/.bin/ts-node --project ../../tsconfig.base.json --require tsconfig-paths/register ./../../node_modules/.bin/tape ./test/tests.ts"
@ -25,8 +25,8 @@
"@ethereumjs/tx": "5.4.0",
"@ethereumjs/util": "9.1.0",
"@ethereumjs/vm": "8.1.1",
"@remix-project/remix-astwalker": "^0.0.89",
"@remix-project/remix-lib": "^0.5.66",
"@remix-project/remix-astwalker": "^0.0.90",
"@remix-project/remix-lib": "^0.5.67",
"async": "^2.6.2",
"ethers": "^5.4.2",
"ethjs-util": "^0.1.6",
@ -50,6 +50,6 @@
"typescript": "^3.7.5"
},
"typings": "src/index.d.ts",
"gitHead": "0875db01e67e48861e55a44fc8293e4c4bf58d91",
"gitHead": "bb66709c1db6c0f1c383f7075dd70fadf53a1caa",
"main": "./src/index.js"
}

@ -1,6 +1,6 @@
{
"name": "@remix-project/remix-astwalker",
"version": "0.0.89",
"version": "0.0.90",
"description": "Tool to walk through Solidity AST",
"main": "src/index.js",
"scripts": {
@ -37,7 +37,7 @@
"@ethereumjs/tx": "5.4.0",
"@ethereumjs/util": "9.1.0",
"@ethereumjs/vm": "8.1.1",
"@remix-project/remix-lib": "^0.5.66",
"@remix-project/remix-lib": "^0.5.67",
"@types/tape": "^4.2.33",
"async": "^2.6.2",
"ethers": "^5.4.2",
@ -53,6 +53,6 @@
"tap-spec": "^5.0.0"
},
"typings": "src/index.d.ts",
"gitHead": "0875db01e67e48861e55a44fc8293e4c4bf58d91",
"gitHead": "bb66709c1db6c0f1c383f7075dd70fadf53a1caa",
"types": "./src/index.d.ts"
}

@ -1,6 +1,6 @@
{
"name": "@remix-project/remix-debug",
"version": "0.5.59",
"version": "0.5.60",
"description": "Tool to debug Ethereum transactions",
"contributors": [
{
@ -26,10 +26,10 @@
"@ethereumjs/tx": "5.4.0",
"@ethereumjs/util": "9.1.0",
"@ethereumjs/vm": "8.1.1",
"@remix-project/remix-astwalker": "^0.0.89",
"@remix-project/remix-lib": "^0.5.66",
"@remix-project/remix-simulator": "^0.2.59",
"@remix-project/remix-solidity": "^0.5.45",
"@remix-project/remix-astwalker": "^0.0.90",
"@remix-project/remix-lib": "^0.5.67",
"@remix-project/remix-simulator": "^0.2.60",
"@remix-project/remix-solidity": "^0.5.46",
"ansi-gray": "^0.1.1",
"async": "^2.6.2",
"color-support": "^1.1.3",
@ -69,6 +69,6 @@
},
"homepage": "https://github.com/ethereum/remix-project/tree/master/libs/remix-debug#readme",
"typings": "src/index.d.ts",
"gitHead": "0875db01e67e48861e55a44fc8293e4c4bf58d91",
"gitHead": "bb66709c1db6c0f1c383f7075dd70fadf53a1caa",
"types": "./src/index.d.ts"
}

@ -1,6 +1,6 @@
{
"name": "@remix-project/remix-lib",
"version": "0.5.66",
"version": "0.5.67",
"description": "Library to various Remix tools",
"contributors": [
{
@ -55,6 +55,6 @@
},
"homepage": "https://github.com/ethereum/remix-project/tree/master/libs/remix-lib#readme",
"typings": "src/index.d.ts",
"gitHead": "0875db01e67e48861e55a44fc8293e4c4bf58d91",
"gitHead": "bb66709c1db6c0f1c383f7075dd70fadf53a1caa",
"types": "./src/index.d.ts"
}

@ -1,6 +1,6 @@
{
"name": "@remix-project/remix-simulator",
"version": "0.2.59",
"version": "0.2.60",
"description": "Ethereum IDE and tools for the web",
"contributors": [
{
@ -23,7 +23,7 @@
"@ethereumjs/util": "9.1.0",
"@ethereumjs/vm": "8.1.1",
"@metamask/eth-sig-util": "^7.0.2",
"@remix-project/remix-lib": "^0.5.66",
"@remix-project/remix-lib": "^0.5.67",
"ansi-gray": "^0.1.1",
"async": "^3.1.0",
"body-parser": "^1.18.2",
@ -71,6 +71,6 @@
},
"homepage": "https://github.com/ethereum/remix-project/tree/master/libs/remix-simulator#readme",
"typings": "src/index.d.ts",
"gitHead": "0875db01e67e48861e55a44fc8293e4c4bf58d91",
"gitHead": "bb66709c1db6c0f1c383f7075dd70fadf53a1caa",
"types": "./src/index.d.ts"
}

@ -1,6 +1,6 @@
{
"name": "@remix-project/remix-solidity",
"version": "0.5.45",
"version": "0.5.46",
"description": "Tool to load and run Solidity compiler",
"main": "src/index.js",
"types": "src/index.d.ts",
@ -19,7 +19,7 @@
"@ethereumjs/tx": "5.4.0",
"@ethereumjs/util": "9.1.0",
"@ethereumjs/vm": "8.1.1",
"@remix-project/remix-lib": "^0.5.66",
"@remix-project/remix-lib": "^0.5.67",
"async": "^2.6.2",
"eslint-scope": "^5.0.0",
"ethers": "^5.4.2",
@ -57,5 +57,5 @@
},
"homepage": "https://github.com/ethereum/remix-project/tree/master/libs/remix-solidity#readme",
"typings": "src/index.d.ts",
"gitHead": "0875db01e67e48861e55a44fc8293e4c4bf58d91"
"gitHead": "bb66709c1db6c0f1c383f7075dd70fadf53a1caa"
}

@ -1,6 +1,6 @@
{
"name": "@remix-project/remix-tests",
"version": "0.2.59",
"version": "0.2.60",
"description": "Tool to test Solidity smart contracts",
"main": "src/index.js",
"types": "./src/index.d.ts",
@ -41,9 +41,9 @@
"@ethereumjs/tx": "5.4.0",
"@ethereumjs/util": "9.1.0",
"@ethereumjs/vm": "8.1.1",
"@remix-project/remix-lib": "^0.5.66",
"@remix-project/remix-simulator": "^0.2.59",
"@remix-project/remix-solidity": "^0.5.45",
"@remix-project/remix-lib": "^0.5.67",
"@remix-project/remix-simulator": "^0.2.60",
"@remix-project/remix-solidity": "^0.5.46",
"@remix-project/remix-url-resolver": "^0.0.42",
"ansi-gray": "^0.1.1",
"async": "^2.6.0",
@ -89,5 +89,5 @@
"@ethereumjs/trie": "6.2.1"
},
"typings": "src/index.d.ts",
"gitHead": "0875db01e67e48861e55a44fc8293e4c4bf58d91"
"gitHead": "bb66709c1db6c0f1c383f7075dd70fadf53a1caa"
}

@ -829,7 +829,10 @@ export const EditorUI = (props: EditorUIProps) => {
const file = await props.plugin.call('fileManager', 'getCurrentFile')
const context = await props.plugin.call('fileManager', 'readFile', file)
const message = intl.formatMessage({ id: 'editor.explainFunctionByAI' }, { content:context, currentFunction: currentFunction.current })
await props.plugin.call('popupPanel', 'showPopupPanel', true)
setTimeout(async () => {
await props.plugin.call('remixAI' as any, 'chatPipe', 'code_explaining', message, context)
}, 500)
_paq.push(['trackEvent', 'ai', 'remixAI', 'explainFunction'])
},
}
@ -850,7 +853,10 @@ export const EditorUI = (props: EditorUIProps) => {
const selectedCode = editor.getModel().getValueInRange(editor.getSelection())
const pipeMessage = intl.formatMessage({ id: 'editor.ExplainPipeMessage' }, { content:selectedCode })
await props.plugin.call('popupPanel', 'showPopupPanel', true)
setTimeout(async () => {
await props.plugin.call('remixAI' as any, 'chatPipe', 'code_explaining', selectedCode, content, pipeMessage)
}, 500)
_paq.push(['trackEvent', 'ai', 'remixAI', 'explainFunction'])
},
}

@ -6,7 +6,7 @@
// The user can select a model from the dropdown list
// the panel controlling the model selection can be hidden or shown
// Once selected, the model is either loaded from the local storage or downloaded
// the remix ai desktop plugin provided the interface for storing the model in the local storage after downloading
// the RemixAI desktop plugin provided the interface for storing the model in the local storage after downloading
import React, { useState, useEffect } from 'react';
import { Select, Input, Button, Icon } from 'antd';

@ -90,7 +90,11 @@ export const Renderer = ({ message, opt, plugin, context }: RendererProps) => {
try {
const content = await plugin.call('fileManager', 'readFile', editorOptions.errFile)
const message = intl.formatMessage({ id: `${context || 'solidity' }.openaigptMessage` }, { content, messageText })
await plugin.call('popupPanel', 'showPopupPanel', true)
setTimeout(async () => {
await plugin.call('remixAI' as any, 'chatPipe', 'error_explaining', message)
}, 500)
_paq.push(['trackEvent', 'ai', 'remixAI', 'error_explaining_SolidityError'])
} catch (err) {
console.error('unable to askGtp')
@ -122,7 +126,7 @@ export const Renderer = ({ message, opt, plugin, context }: RendererProps) => {
>
</span>
<span
className="button border text-ai btn-sm"
className="button border ask-remix-ai-button text-ai btn-sm"
onClick={(event) => { event.preventDefault(); askGtp() }}
style={{ borderColor: "var(--ai)" }}
>

@ -32,6 +32,7 @@ export function ContractGUI(props: ContractGUIProps) {
const multiFields = useRef<Array<HTMLInputElement | null>>([])
const initializeFields = useRef<Array<HTMLInputElement | null>>([])
const basicInputRef = useRef<HTMLInputElement>()
const intl = useIntl()
useEffect(() => {
if (props.deployOption && Array.isArray(props.deployOption)) {
@ -226,16 +227,19 @@ export function ContractGUI(props: ContractGUIProps) {
const handleActionClick = async () => {
props.getVersion()
const compilerState = await props.plugin.call('solidity', 'getCompilerState')
if (props.runTabState.selectExEnv.toLowerCase().startsWith('vm-') || props.runTabState.selectExEnv.toLowerCase().includes('basic-http-provider')) {
await handleDeploy()
} else {
const status = await props.getCompilerDetails()
if (status === 'Failed') {
props.plugin.call('terminal', 'log', { type: 'log', value: 'Consider opening an issue to update our internal store with your desired chainId.' })
if (status === 'Not Found') {
await handleDeploy()
return
}
if (props.evmCheckComplete) {
const tabState = props.runTabState
const IsCompatible = isChainCompatible(compilerState.evmVersion ?? 'cancun', parseInt(tabState.chainId))
if (status === 'Passed' && IsCompatible) {
await handleDeploy()
}
}

@ -64,6 +64,7 @@ export function InstanceContainerUI(props: InstanceContainerProps) {
getVersion={props.getVersion}
getCompilerDetails={props.getCompilerDetails}
runTabState={props.runTabState}
evmCheckComplete={props.evmCheckComplete}
/>
)
})}

@ -327,7 +327,7 @@ export function UniversalDappUI(props: UdappProps) {
<ContractGUI
getVersion={props.getVersion}
getCompilerDetails={props.getCompilerDetails}
evmCheckComplete={false}
evmCheckComplete={props.evmCheckComplete}
plugin={props.plugin}
runTabState={props.runTabState}
funcABI={funcABI}

@ -58,7 +58,7 @@ import { ScenarioPrompt } from './components/scenario'
import { setIpfsCheckedState, setRemixDActivated } from './actions/payload'
import { ChainCompatibleInfo, getCompatibleChain, getCompatibleChains, HardFork, isChainCompatible, isChainCompatibleWithAnyFork } from './actions/evmmap'
export type CheckStatus = 'Passed' | 'Failed'
export type CheckStatus = 'Passed' | 'Failed' | 'Not Found'
export function RunTabUI(props: RunTabProps) {
const { plugin } = props
@ -138,9 +138,7 @@ export function RunTabUI(props: RunTabProps) {
const IsCompatible = isChainCompatible(ideDefault, targetChainId)
const chain = await returnCompatibleChain(ideDefault, targetChainId)
if (chain === undefined) {
//show modal
plugin.call('terminal', 'log', { type: 'log', value: 'No compatible chain found for the selected EVM version.' })
return 'Failed'
return 'Not Found'
} else {
if (!IsCompatible) {
//show modal
@ -161,9 +159,11 @@ export function RunTabUI(props: RunTabProps) {
okFn: () => checkEvmChainCompatibilityOkFunction(chain),
cancelFn: () => {}
})
return 'Failed'
} else {
return 'Passed'
}
}
return 'Passed'
}
}
@ -418,6 +418,7 @@ export function RunTabUI(props: RunTabProps) {
<InstanceContainerUI
plugin={plugin}
getCompilerDetails={getCompilerDetails}
evmCheckComplete={evmCheckComplete}
runTabState={runTab}
instances={runTab.instances}
clearInstances={removeInstances}

@ -303,6 +303,7 @@ export interface RecorderProps {
export interface InstanceContainerProps {
getCompilerDetails: () => Promise<CheckStatus>
evmCheckComplete?: boolean
runTabState: RunTabState
instances: {
instanceList: {
@ -430,6 +431,7 @@ export interface MainnetProps {
export interface UdappProps {
getCompilerDetails: () => Promise<CheckStatus>
evmCheckComplete?: boolean,
runTabState: RunTabState
instance: {
contractData?: ContractData,

@ -250,7 +250,7 @@ export const TabsUI = (props: TabsUIProps) => {
tooltipId="overlay-tooltip-explaination"
tooltipText={
<span>
{tabsState.currentExt === 'sol' ? (
{((tabsState.currentExt === 'sol') || (tabsState.currentExt === 'vy') || (tabsState.currentExt === 'circom')) ? (
<FormattedMessage id="remixUiTabs.tooltipText5" />
) : (
<FormattedMessage id="remixUiTabs.tooltipText4" />
@ -262,38 +262,17 @@ export const TabsUI = (props: TabsUIProps) => {
data-id="explain-editor"
id='explain_btn'
className='btn text-ai pl-2 pr-0 py-0'
disabled={!(tabsState.currentExt === 'sol') || explaining}
disabled={!((tabsState.currentExt === 'sol') || (tabsState.currentExt === 'vy') || (tabsState.currentExt === 'circom')) || explaining}
onClick={async () => {
const path = active().substr(active().indexOf('/') + 1, active().length)
const content = await props.plugin.call('fileManager', 'readFile', path)
if (tabsState.currentExt === 'sol') {
if ((tabsState.currentExt === 'sol') || (tabsState.currentExt === 'vy') || (tabsState.currentExt === 'circom')) {
setExplaining(true)
// if plugin is pinned,
if (await props.plugin.call('pinnedPanel', 'currentFocus') === 'remixAI'){
await props.plugin.call('remixAI', 'chatPipe', 'code_explaining', content)
}
else {
const profile = {
name: 'remixAI',
displayName: 'Remix AI',
methods: ['code_generation', 'code_completion',
"solidity_answer", "code_explaining",
"code_insertion", "error_explaining",
"initialize", 'chatPipe', 'ProcessChatRequestBuffer', 'isChatRequestPending'],
events: [],
icon: 'assets/img/remix-logo-blue.png',
description: 'RemixAI provides AI services to Remix IDE.',
kind: '',
location: 'sidePanel',
documentation: 'https://remix-ide.readthedocs.io/en/latest/remixai.html',
maintainedBy: 'Remix'
}
// await props.plugin.call('sidePanel', 'focus', 'remixAI')
await props.plugin.call('sidePanel', 'pinView', profile)
await props.plugin.call('popupPanel', 'showPopupPanel', true)
setTimeout(async () => {
await props.plugin.call('remixAI', 'chatPipe', 'code_explaining', content)
}, 500)
}
setExplaining(false)
_paq.push(['trackEvent', 'ai', 'remixAI', 'explain_file'])
}

@ -44,7 +44,7 @@ export const ElectronMenu = () => {
>
<div className="recentfolder pb-1">
<span onClick={async () => { await openFolderElectron(folder) }} className="pl-2 recentfolder_name pr-2">{lastFolderName(folder)}</span>
<span onClick={async () => { await openFolderElectron(folder) }} data-id={{ folder }} className="recentfolder_path pr-2">{folder}</span>
<span onClick={async () => { await openFolderElectron(folder) }} data-id={`recent_folder_${folder}`} className="recentfolder_path pr-2">{folder}</span>
<i
onClick={() => {
global.dispatchRemoveRecentFolder(folder)

@ -23,14 +23,21 @@ export const ElectronWorkspaceName = (props: ElectronWorkspaceNameProps) => {
return (
(dir === undefined || dir === '') ? <></> :
<div className="d-flex align-items-baseline">
<div className="d-flex align-items-baseline mt-2">
<CustomTooltip
placement="bottom"
tooltipId="workspace-name"
tooltipClasses="text-nowrap"
tooltipText={dir}
>
<div>{parsePath()}</div>
<div
style={{
overflow: 'hidden',
textOverflow: 'ellipsis',
flexGrow: 1,
}}
>{parsePath()}</div>
</CustomTooltip>
<CustomTooltip
placement="top"

@ -1060,7 +1060,7 @@ export function Workspace() {
<span className="d-flex">
<label className="pl-2 form-check-label" style={{ wordBreak: 'keep-all' }}>
{(platform == appPlatformTypes.desktop) ? (
<ElectronWorkspaceName plugin={global.plugin} path={global.fs.browser.currentLocalFilePath} />
null
) : <FormattedMessage id='filePanel.workspace' />}
</label>
{selectedWorkspace && selectedWorkspace.name === 'code-sample' && <CustomTooltip
@ -1143,7 +1143,7 @@ export function Workspace() {
)}
</Dropdown.Menu>
</Dropdown>
):null}
):<ElectronWorkspaceName plugin={global.plugin} path={global.fs.browser.currentLocalFilePath} />}
</div>
</div>
</header>

@ -1,6 +1,6 @@
{
"name": "@remix-project/remix-url-resolver",
"version": "0.0.88",
"version": "0.0.89",
"description": "Solidity import url resolver engine",
"main": "src/index.js",
"types": "src/index.d.ts",
@ -41,5 +41,5 @@
"typescript": "^3.1.6"
},
"typings": "src/index.d.ts",
"gitHead": "0875db01e67e48861e55a44fc8293e4c4bf58d91"
"gitHead": "bb66709c1db6c0f1c383f7075dd70fadf53a1caa"
}

@ -1,6 +1,6 @@
{
"name": "@remix-project/remix-ws-templates",
"version": "1.0.53",
"version": "1.0.54",
"description": "Create a Remix IDE workspace using different templates",
"main": "src/index.js",
"types": "src/index.d.ts",
@ -24,5 +24,5 @@
"ethers": "^5.4.2",
"web3": "^4.1.1"
},
"gitHead": "0875db01e67e48861e55a44fc8293e4c4bf58d91"
"gitHead": "bb66709c1db6c0f1c383f7075dd70fadf53a1caa"
}

@ -1,6 +1,6 @@
{
"name": "@remix-project/remixd",
"version": "0.6.39",
"version": "0.6.40",
"description": "remix server: allow accessing file system from remix.ethereum.org and start a dev environment (see help section)",
"main": "index.js",
"types": "./index.d.ts",

@ -1,6 +1,6 @@
{
"name": "remix-project",
"version": "0.57.0-dev",
"version": "0.58.0-dev",
"license": "MIT",
"description": "Ethereum Remix Monorepo",
"main": "index.js",

@ -1,15 +1,11 @@
{
"version": "v0.56.0",
"version": "v0.57.0",
"title": "RELEASE HIGHLIGHTS",
"highlight1": "Added new 'Contract Verification' plugin to verify contract on multiple platforms",
"highlight2": "Added new 'Remix Guide' plugin to learn using Remix IDE using videos",
"highlight3": "Added support for message signing using EIP712",
"highlight1": "RemixAI, the new Web3 AI Assistant",
"highlight2": "New Script Configuration plugin",
"highlight3": "Routescan added to the Contract Verification plugin",
"highlight4": "",
"more": "Read More",
"moreLink": "https://medium.com/remix-ide/remix-release-v0-56-0-574a5774f94c?source=friends_link&sk=af46111d5a9976306e5770ccc468ae28"
"moreLink": "https://medium.com/remix-ide/remix-release-v0-57-0-3c550f26f2d0?source=friends_link&sk=d713cd9ea5840454d8e8c03dbfb86f93"
}
Loading…
Cancel
Save