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. 15
      apps/circuit-compiler/src/app/components/container.tsx
  3. 9
      apps/quick-dapp/src/actions/index.ts
  4. 4
      apps/quick-dapp/src/components/DeployPanel/index.tsx
  5. 53
      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. 9
      apps/remix-ide/src/app/plugins/remixAIPlugin.tsx
  15. 3
      apps/remix-ide/src/app/tabs/locales/en/quickDapp.json
  16. 4
      apps/remix-ide/src/app/tabs/locales/en/remixUiTabs.json
  17. 2
      apps/remixdesktop/src/plugins/remixAIDektop.ts
  18. 6
      apps/vyper/src/app/utils/remix-client.tsx
  19. 8
      libs/ghaction-helper/package.json
  20. 1
      libs/remix-ai-core/src/helpers/streamHandler.ts
  21. 18
      libs/remix-ai-core/src/inferencers/remote/remoteInference.ts
  22. 8
      libs/remix-analyzer/package.json
  23. 6
      libs/remix-astwalker/package.json
  24. 12
      libs/remix-debug/package.json
  25. 4
      libs/remix-lib/package.json
  26. 6
      libs/remix-simulator/package.json
  27. 6
      libs/remix-solidity/package.json
  28. 10
      libs/remix-tests/package.json
  29. 10
      libs/remix-ui/editor/src/lib/remix-ui-editor.tsx
  30. 4
      libs/remix-ui/remix-ai/src/lib/components/Default.tsx
  31. 2
      libs/remix-ui/remix-ai/src/lib/components/ModelSelection.tsx
  32. 8
      libs/remix-ui/renderer/src/lib/renderer.tsx
  33. 10
      libs/remix-ui/run-tab/src/lib/components/contractGUI.tsx
  34. 1
      libs/remix-ui/run-tab/src/lib/components/instanceContainerUI.tsx
  35. 2
      libs/remix-ui/run-tab/src/lib/components/universalDappUI.tsx
  36. 11
      libs/remix-ui/run-tab/src/lib/run-tab.tsx
  37. 2
      libs/remix-ui/run-tab/src/lib/types/index.ts
  38. 33
      libs/remix-ui/tabs/src/lib/remix-ui-tabs.tsx
  39. 2
      libs/remix-ui/workspace/src/lib/components/electron-menu.tsx
  40. 11
      libs/remix-ui/workspace/src/lib/components/electron-workspace-name.tsx
  41. 4
      libs/remix-ui/workspace/src/lib/remix-ui-workspace.tsx
  42. 4
      libs/remix-url-resolver/package.json
  43. 4
      libs/remix-ws-templates/package.json
  44. 2
      libs/remixd/package.json
  45. 2
      package.json
  46. 14
      releaseDetails.json

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

@ -73,14 +73,20 @@ export function Container () {
full circom error: ${JSON.stringify(report, null, 2)} full circom error: ${JSON.stringify(report, null, 2)}
explain why the error occurred and how to fix it. explain why the error occurred and how to fix it.
` `
await circuitApp.plugin.call('remixAI' as any, 'chatPipe', 'error_explaining', message) await circuitApp.plugin.call('popupPanel' as any, 'showPopupPanel', true)
setTimeout(async () => {
await circuitApp.plugin.call('remixAI' as any, 'chatPipe', 'error_explaining', message)
}, 500)
} else { } else {
const message = ` const message = `
error message: ${error} error message: ${error}
full circom error: ${JSON.stringify(report, null, 2)} full circom error: ${JSON.stringify(report, null, 2)}
explain why the error occurred and how to fix it. explain why the error occurred and how to fix it.
` `
await circuitApp.plugin.call('remixAI' as any, 'chatPipe', 'error_explaining', message) await circuitApp.plugin.call('popupPanel' as any, 'showPopupPanel', true)
setTimeout(async () => {
await circuitApp.plugin.call('remixAI' as any, 'chatPipe', 'error_explaining', message)
}, 500)
} }
} else { } else {
const error = report.message const error = report.message
@ -89,7 +95,10 @@ export function Container () {
full circom error: ${JSON.stringify(report, null, 2)} full circom error: ${JSON.stringify(report, null, 2)}
explain why the error occurred and how to fix it. explain why the error occurred and how to fix it.
` `
await circuitApp.plugin.call('remixAI' as any, 'chatPipe', 'error_explaining', message) 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, ...instance,
shortname: payload.shortname, shortname: payload.shortname,
shareTo: payload.shareTo, shareTo: payload.shareTo,
showLogo: !!logo,
}) })
const files: Record<string, string> = { const files: Record<string, string> = {
@ -192,7 +193,9 @@ export const deploy = async (payload: any, callback: any) => {
files[`dir/${path}`] = resp.data; files[`dir/${path}`] = resp.data;
} }
files['dir/assets/logo.png'] = logo if (logo) {
files['dir/assets/logo.png'] = logo
}
files['dir/CORS'] = '*' files['dir/CORS'] = '*'
files['dir/index.html'] = files['dir/index.html'].replace( files['dir/index.html'] = files['dir/index.html'].replace(
'assets/css/themes/remix-dark_tvx1s2.css', 'assets/css/themes/remix-dark_tvx1s2.css',
@ -341,7 +344,7 @@ export const initInstance = async ({
} }
: { A: ids }; : { 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({ await dispatch({
type: 'SET_INSTANCE', type: 'SET_INSTANCE',
@ -353,7 +356,7 @@ export const initInstance = async ({
natSpec, natSpec,
solcVersion: getVersion(solcVersion), solcVersion: getVersion(solcVersion),
...lowLevel, ...lowLevel,
logo: logo.data, // logo: logo.data,
}, },
}); });
}; };

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

@ -29,20 +29,47 @@ const ImageUpload = () => {
} }
return ( 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" /> <input data-id="uploadLogo" className="d-none" type="file" accept="image/*" onChange={handleImageChange} id="upload-button" />
<CustomTooltip {logo ? (
placement="right" <div className='position-absolute'>
tooltipText={intl.formatMessage({ id: 'quickDapp.uploadLogoTooltip' })} <img src={preview} alt="preview" style={{ width: 95, height: 95 }} />
> <CustomTooltip
<label htmlFor="upload-button" className="cursor_pointer d-flex justify-content-center align-items-center position-relative" style={{ height: 170 }}> placement="right"
{logo ? ( tooltipText={intl.formatMessage({ id: 'quickDapp.deleteLogoTooltip' })}
<img src={preview} alt="preview" style={{ width: 120, height: 120 }} /> >
) : ( <span
<i className="fas fa-upload" style={{ fontSize: 120 }}></i> className="btn position-absolute"
)} style={{
</label> top: -30,
</CustomTooltip> 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>
) : (
<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> </div>
) )
} }

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

@ -30,7 +30,7 @@ const DappTop: React.FC = () => {
const shareTitle = encodeURIComponent('Hello everyone, this is my dapp!'); const shareTitle = encodeURIComponent('Hello everyone, this is my dapp!');
return ( 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> <div>
{title && <h1 data-id="dappTitle">{title}</h1>} {title && <h1 data-id="dappTitle">{title}</h1>}
{details && <span data-id="dappInstructions">{details}</span>} {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`} } col-xl-9 col-lg-8 col-md-7 pr-0`}
> >
<div className="mx-3 my-2 row"> <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 }} /> <img src="/assets/logo.png" style={{ width: 55, height: 55 }} />
</div> </div>}
<DappTop /> <DappTop />
</div> </div>
<UniversalDappUI /> <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="col-xl-9 col-lg-8 col-md-7 d-inline-block pr-0">
<div className="mx-3 my-2 row"> <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 }} /> <img src="/assets/logo.png" style={{ width: 95, height: 95 }} />
</div> </div>}
<DappTop /> <DappTop />
</div> </div>
<UniversalDappUI /> <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') .modalFooterCancelClick('udappNotify')
}, },
// debug transaction // 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"]') browser.waitForElementPresent('*[data-id="remixIdeSidePanel"]')
.switchBrowserTab(1) .switchBrowserTab(1)
.click('[data-testid="network-display"]') .click('[data-testid="network-display"]')

@ -240,7 +240,7 @@ const tests = {
.journalLastChildIncludes('["0x76a3ABb5a12dcd603B52Ed22195dED17ee82708f"]') .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"]') browser.waitForElementPresent('i[id="remixRunSignMsg"]')
.click('i[id="remixRunSignMsg"]') .click('i[id="remixRunSignMsg"]')
.waitForElementVisible('*[data-id="signMessageTextarea"]', 120000) .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 browser
.url('http://127.0.0.1:8080/#address=0xdac17f958d2ee523a2206206994597c13d831ec7') .url('http://127.0.0.1:8080/#address=0xdac17f958d2ee523a2206206994597c13d831ec7')
.refreshPage() .refreshPage()

@ -13,7 +13,7 @@ type chatRequestBufferT<T> = {
const profile = { const profile = {
name: 'remixAI', name: 'remixAI',
displayName: 'Remix AI', displayName: 'RemixAI',
methods: ['code_generation', 'code_completion', methods: ['code_generation', 'code_completion',
"solidity_answer", "code_explaining", "solidity_answer", "code_explaining",
"code_insertion", "error_explaining", "code_insertion", "error_explaining",
@ -121,6 +121,11 @@ export class RemixAIPlugin extends ViewPlugin {
this.call('terminal', 'log', { type: 'aitypewriterwarning', value: "RemixAI is already busy!" }) this.call('terminal', 'log', { type: 'aitypewriterwarning', value: "RemixAI is already busy!" })
return 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) const newPrompt = await this.agent.chatCommand(prompt)
let result let result
@ -130,6 +135,8 @@ export class RemixAIPlugin extends ViewPlugin {
result = await this.remoteInferencer.solidity_answer(newPrompt) result = await this.remoteInferencer.solidity_answer(newPrompt)
} }
if (result && params.terminal_output) this.call('terminal', 'log', { type: 'aitypewriterwarning', value: result }) 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 return result
} }

@ -32,7 +32,8 @@
"quickDapp.text4": "Deployed successfully!", "quickDapp.text4": "Deployed successfully!",
"quickDapp.text5": "Click the link below to view your dapp", "quickDapp.text5": "Click the link below to view your dapp",
"quickDapp.text6": "Teardown successfully!", "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.dappTitle": "Dapp Title",
"quickDapp.dappInstructions": "Dapp Instructions", "quickDapp.dappInstructions": "Dapp Instructions",
"quickDapp.functionTitle": "Title of function", "quickDapp.functionTitle": "Title of function",

@ -2,11 +2,11 @@
"remixUiTabs.tooltipText1": "Run script (CTRL + SHIFT + S)", "remixUiTabs.tooltipText1": "Run script (CTRL + SHIFT + S)",
"remixUiTabs.tooltipText2": "Compile CTRL + S", "remixUiTabs.tooltipText2": "Compile CTRL + S",
"remixUiTabs.tooltipText3": "Select .sol or .yul file to compile OR a .ts or .js file to run", "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.tooltipText5": "Explain the contract(s) in current file [BETA]",
"remixUiTabs.tooltipText6": "Enable RemixAI Copilot [BETA]", "remixUiTabs.tooltipText6": "Enable RemixAI Copilot [BETA]",
"remixUiTabs.tooltipText7": "Disable RemixAI Copilot [BETA]", "remixUiTabs.tooltipText7": "Disable RemixAI Copilot [BETA]",
"remixUiTabs.tooltipText8": "Remix AI Tools Documentation", "remixUiTabs.tooltipText8": "RemixAI Tools Documentation",
"remixUiTabs.tooltipText9": "Configure scripting dependencies", "remixUiTabs.tooltipText9": "Configure scripting dependencies",
"remixUiTabs.tooltipTextDisabledCopilot": "To use RemixAI Copilot, choose a .sol file", "remixUiTabs.tooltipTextDisabledCopilot": "To use RemixAI Copilot, choose a .sol file",
"remixUiTabs.zoomOut": "Zoom out", "remixUiTabs.zoomOut": "Zoom out",

@ -50,7 +50,7 @@ class RemixAIDesktopPluginClient extends ElectronBasePluginClient {
} }
async enable (){ async enable (){
console.log('Remix AI desktop plugin enabled') console.log('RemixAI desktop plugin enabled')
this.emit('enabled') this.emit('enabled')
} }

@ -71,7 +71,11 @@ export class RemixClient extends PluginClient<any, CustomRemixApi> {
const file = await this.client.call('fileManager', 'getCurrentFile') const file = await this.client.call('fileManager', 'getCurrentFile')
const content = await this.client.call('fileManager', 'readFile', file) 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.` 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) { } catch (err) {
console.error('unable to askGpt') console.error('unable to askGpt')
console.error(err) console.error(err)

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

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

@ -27,7 +27,7 @@ export class RemoteInferencer implements ICompletions {
try { try {
const options = { headers: { 'Content-Type': 'application/json', } } 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) { switch (rType) {
case AIRequestType.COMPLETION: 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 = "" let resultText = ""
try { try {
this.event.emit('onInference') this.event.emit('onInference')
@ -122,26 +122,32 @@ export class RemoteInferencer implements ICompletions {
async code_generation(prompt, options:IParams=GenerationParams): Promise<any> { async code_generation(prompt, options:IParams=GenerationParams): Promise<any> {
const payload = { prompt, "endpoint":"code_completion", ...options } 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) else return this._makeRequest(payload, AIRequestType.COMPLETION)
} }
async solidity_answer(prompt, options:IParams=GenerationParams): Promise<any> { async solidity_answer(prompt, options:IParams=GenerationParams): Promise<any> {
const main_prompt = buildSolgptPromt(prompt, this.model_op) const main_prompt = buildSolgptPromt(prompt, this.model_op)
const payload = { 'prompt': main_prompt, "endpoint":"solidity_answer", ...options } 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) else return this._makeRequest(payload, AIRequestType.GENERAL)
} }
async code_explaining(prompt, context:string="", options:IParams=GenerationParams): Promise<any> { async code_explaining(prompt, context:string="", options:IParams=GenerationParams): Promise<any> {
const payload = { prompt, "endpoint":"code_explaining", context, ...options } 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) else return this._makeRequest(payload, AIRequestType.GENERAL)
} }
async error_explaining(prompt, options:IParams=GenerationParams): Promise<any> { async error_explaining(prompt, options:IParams=GenerationParams): Promise<any> {
const payload = { prompt, "endpoint":"error_explaining", ...options } 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) else return this._makeRequest(payload, AIRequestType.GENERAL)
} }
} }

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

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

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

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

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

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

@ -1,6 +1,6 @@
{ {
"name": "@remix-project/remix-tests", "name": "@remix-project/remix-tests",
"version": "0.2.59", "version": "0.2.60",
"description": "Tool to test Solidity smart contracts", "description": "Tool to test Solidity smart contracts",
"main": "src/index.js", "main": "src/index.js",
"types": "./src/index.d.ts", "types": "./src/index.d.ts",
@ -41,9 +41,9 @@
"@ethereumjs/tx": "5.4.0", "@ethereumjs/tx": "5.4.0",
"@ethereumjs/util": "9.1.0", "@ethereumjs/util": "9.1.0",
"@ethereumjs/vm": "8.1.1", "@ethereumjs/vm": "8.1.1",
"@remix-project/remix-lib": "^0.5.66", "@remix-project/remix-lib": "^0.5.67",
"@remix-project/remix-simulator": "^0.2.59", "@remix-project/remix-simulator": "^0.2.60",
"@remix-project/remix-solidity": "^0.5.45", "@remix-project/remix-solidity": "^0.5.46",
"@remix-project/remix-url-resolver": "^0.0.42", "@remix-project/remix-url-resolver": "^0.0.42",
"ansi-gray": "^0.1.1", "ansi-gray": "^0.1.1",
"async": "^2.6.0", "async": "^2.6.0",
@ -89,5 +89,5 @@
"@ethereumjs/trie": "6.2.1" "@ethereumjs/trie": "6.2.1"
}, },
"typings": "src/index.d.ts", "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 file = await props.plugin.call('fileManager', 'getCurrentFile')
const context = await props.plugin.call('fileManager', 'readFile', file) const context = await props.plugin.call('fileManager', 'readFile', file)
const message = intl.formatMessage({ id: 'editor.explainFunctionByAI' }, { content:context, currentFunction: currentFunction.current }) const message = intl.formatMessage({ id: 'editor.explainFunctionByAI' }, { content:context, currentFunction: currentFunction.current })
await props.plugin.call('remixAI' as any, 'chatPipe', 'code_explaining', message, context) 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']) _paq.push(['trackEvent', 'ai', 'remixAI', 'explainFunction'])
}, },
} }
@ -850,7 +853,10 @@ export const EditorUI = (props: EditorUIProps) => {
const selectedCode = editor.getModel().getValueInRange(editor.getSelection()) const selectedCode = editor.getModel().getValueInRange(editor.getSelection())
const pipeMessage = intl.formatMessage({ id: 'editor.ExplainPipeMessage' }, { content:selectedCode }) const pipeMessage = intl.formatMessage({ id: 'editor.ExplainPipeMessage' }, { content:selectedCode })
await props.plugin.call('remixAI' as any, 'chatPipe', 'code_explaining', selectedCode, content, pipeMessage) 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']) _paq.push(['trackEvent', 'ai', 'remixAI', 'explainFunction'])
}, },
} }

@ -49,7 +49,7 @@ export const Default = (props) => {
const initialMessages: ChatItem[] = [ const initialMessages: ChatItem[] = [
{ {
role: 'assistant', role: 'assistant',
message: 'Welcome to Remix AI! How can I assist you today?' message: 'Welcome to RemixAI! How can I assist you today?'
} }
]; ];
const adapter = useAsStreamAdapter(send, []); const adapter = useAsStreamAdapter(send, []);
@ -60,7 +60,7 @@ export const Default = (props) => {
adapter={ adapter } adapter={ adapter }
personaOptions={{ personaOptions={{
assistant: { assistant: {
name: "Remix AI", name: "RemixAI",
tagline: "Your Web3 AI Assistant", tagline: "Your Web3 AI Assistant",
avatar: assistantAvatar avatar: assistantAvatar
}, },

@ -6,7 +6,7 @@
// The user can select a model from the dropdown list // The user can select a model from the dropdown list
// the panel controlling the model selection can be hidden or shown // the panel controlling the model selection can be hidden or shown
// Once selected, the model is either loaded from the local storage or downloaded // 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 React, { useState, useEffect } from 'react';
import { Select, Input, Button, Icon } from 'antd'; import { Select, Input, Button, Icon } from 'antd';

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

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

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

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

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

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

@ -250,7 +250,7 @@ export const TabsUI = (props: TabsUIProps) => {
tooltipId="overlay-tooltip-explaination" tooltipId="overlay-tooltip-explaination"
tooltipText={ tooltipText={
<span> <span>
{tabsState.currentExt === 'sol' ? ( {((tabsState.currentExt === 'sol') || (tabsState.currentExt === 'vy') || (tabsState.currentExt === 'circom')) ? (
<FormattedMessage id="remixUiTabs.tooltipText5" /> <FormattedMessage id="remixUiTabs.tooltipText5" />
) : ( ) : (
<FormattedMessage id="remixUiTabs.tooltipText4" /> <FormattedMessage id="remixUiTabs.tooltipText4" />
@ -262,38 +262,17 @@ export const TabsUI = (props: TabsUIProps) => {
data-id="explain-editor" data-id="explain-editor"
id='explain_btn' id='explain_btn'
className='btn text-ai pl-2 pr-0 py-0' 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 () => { onClick={async () => {
const path = active().substr(active().indexOf('/') + 1, active().length) const path = active().substr(active().indexOf('/') + 1, active().length)
const content = await props.plugin.call('fileManager', 'readFile', path) 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) setExplaining(true)
// if plugin is pinned, // if plugin is pinned,
if (await props.plugin.call('pinnedPanel', 'currentFocus') === 'remixAI'){ await props.plugin.call('popupPanel', 'showPopupPanel', true)
setTimeout(async () => {
await props.plugin.call('remixAI', 'chatPipe', 'code_explaining', content) await props.plugin.call('remixAI', 'chatPipe', 'code_explaining', content)
} }, 500)
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)
setTimeout(async () => {
await props.plugin.call('remixAI', 'chatPipe', 'code_explaining', content)
}, 500)
}
setExplaining(false) setExplaining(false)
_paq.push(['trackEvent', 'ai', 'remixAI', 'explain_file']) _paq.push(['trackEvent', 'ai', 'remixAI', 'explain_file'])
} }

@ -44,7 +44,7 @@ export const ElectronMenu = () => {
> >
<div className="recentfolder pb-1"> <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) }} 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 <i
onClick={() => { onClick={() => {
global.dispatchRemoveRecentFolder(folder) global.dispatchRemoveRecentFolder(folder)

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

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

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

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

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

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

@ -1,15 +1,11 @@
{ {
"version": "v0.56.0", "version": "v0.57.0",
"title": "RELEASE HIGHLIGHTS", "title": "RELEASE HIGHLIGHTS",
"highlight1": "Added new 'Contract Verification' plugin to verify contract on multiple platforms", "highlight1": "RemixAI, the new Web3 AI Assistant",
"highlight2": "Added new 'Remix Guide' plugin to learn using Remix IDE using videos", "highlight2": "New Script Configuration plugin",
"highlight3": "Added support for message signing using EIP712", "highlight3": "Routescan added to the Contract Verification plugin",
"highlight4": "", "highlight4": "",
"more": "Read More", "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