Merge branch 'master' of https://github.com/ethereum/remix-project into desktope2e
commit
9402f800f6
@ -0,0 +1,42 @@ |
||||
#!/bin/bash |
||||
|
||||
# Determine the OS platform |
||||
OS="$(uname)" |
||||
|
||||
if [ "$OS" == "Darwin" ]; then |
||||
# macOS systems |
||||
if [ -e "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" ]; then |
||||
version=$("/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" --version) |
||||
echo "Google Chrome version on macOS: $version" |
||||
else |
||||
echo "Google Chrome is not installed on your macOS." |
||||
fi |
||||
elif [ "$OS" == "Linux" ]; then |
||||
# Linux systems |
||||
if command -v google-chrome >/dev/null; then |
||||
version=$(google-chrome --version) |
||||
echo "Google Chrome version on Linux: $version" |
||||
else |
||||
echo "Google Chrome is not installed on your Linux." |
||||
fi |
||||
else |
||||
echo "Unsupported OS." |
||||
fi |
||||
|
||||
MAJORVERSION=$(echo "$version" | grep -Eo '[0-9]+\.' | head -1 | cut -d'.' -f1) |
||||
echo "CHROME DRIVER INSTALL $MAJORVERSION" |
||||
|
||||
# Specify the directory to check |
||||
directory="./tmp/webdrivers" |
||||
|
||||
# Check if the directory exists |
||||
if [ -d "$directory" ]; then |
||||
echo "Directory exists: $directory" |
||||
else |
||||
echo "Directory does not exist. Creating directory: $directory" |
||||
mkdir -p "$directory" |
||||
fi |
||||
|
||||
|
||||
yarn init -y --cwd "$directory" || exit 1 |
||||
yarn add -D chromedriver@$MAJORVERSION geckodriver --cwd "$directory" || yarn add -D chromedriver@$MAJORVERSION geckodriver --cwd "$directory" || yarn add -D chromedriver geckodriver --cwd "$directory" || exit 1 |
@ -0,0 +1,54 @@ |
||||
module.exports = { |
||||
src_folders: ['dist/apps/remix-ide-e2e/src/tests'], |
||||
output_folder: './reports/tests', |
||||
custom_commands_path: ['dist/apps/remix-ide-e2e/src/commands'], |
||||
custom_assertions_path: '', |
||||
page_objects_path: '', |
||||
globals_path: '', |
||||
|
||||
webdriver: { |
||||
start_process: true, |
||||
port: 4444, |
||||
server_path: './tmp/webdrivers/node_modules/geckodriver/bin/geckodriver.js', |
||||
}, |
||||
|
||||
test_settings: { |
||||
selenium_port: 4444, |
||||
selenium_host: 'localhost', |
||||
'default': { |
||||
globals: { |
||||
waitForConditionTimeout: 10000, |
||||
asyncHookTimeout: 100000 |
||||
}, |
||||
screenshots: { |
||||
enabled: true, |
||||
path: './reports/screenshots', |
||||
on_failure: true, |
||||
on_error: true |
||||
}, |
||||
exclude: ['dist/apps/remix-ide-e2e/src/tests/runAndDeploy.test.js', 'dist/apps/remix-ide-e2e/src/tests/pluginManager.test.ts'] |
||||
}, |
||||
|
||||
'firefoxDesktop': { |
||||
desiredCapabilities: { |
||||
'browserName': 'firefox', |
||||
'javascriptEnabled': true, |
||||
'acceptSslCerts': true, |
||||
'moz:firefoxOptions': { |
||||
args: ['-width=2560', '-height=1440'] |
||||
} |
||||
} |
||||
}, |
||||
|
||||
'firefox': { |
||||
desiredCapabilities: { |
||||
'browserName': 'firefox', |
||||
'javascriptEnabled': true, |
||||
'acceptSslCerts': true, |
||||
'moz:firefoxOptions': { |
||||
args: ['-headless', '-width=2560', '-height=1440'] |
||||
} |
||||
} |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,74 @@ |
||||
import EventEmitter from 'events' |
||||
import { NightwatchBrowser, NightwatchContractContent } from 'nightwatch' |
||||
|
||||
class AddFileSnekmate extends EventEmitter { |
||||
command(this: NightwatchBrowser, name: string, content: NightwatchContractContent): NightwatchBrowser { |
||||
this.api.perform((done) => { |
||||
addFileSnekmate(this.api, name, content, () => { |
||||
done() |
||||
this.emit('complete') |
||||
}) |
||||
}) |
||||
return this |
||||
} |
||||
} |
||||
|
||||
function addFileSnekmate(browser: NightwatchBrowser, name: string, content: NightwatchContractContent, done: VoidFunction) { |
||||
browser |
||||
.isVisible({ |
||||
selector: "//*[@data-id='sidePanelSwapitTitle' and contains(.,'File explorer')]", |
||||
locateStrategy: 'xpath', |
||||
suppressNotFoundErrors: true, |
||||
timeout: 1000 |
||||
}, (okVisible) => { |
||||
if (!okVisible.value) { |
||||
browser.clickLaunchIcon('filePanel') |
||||
} |
||||
}) |
||||
.scrollInto('li[data-id="treeViewLitreeViewItemREADME.txt"]') |
||||
.waitForElementVisible('li[data-id="treeViewLitreeViewItemLICENSE"]') |
||||
.click('li[data-id="treeViewLitreeViewItemLICENSE"]').pause(1000) // focus on root directory
|
||||
.isVisible({ |
||||
selector: `//*[@data-id="treeViewLitreeViewItem${name}"]`, |
||||
locateStrategy: 'xpath', |
||||
abortOnFailure: false, |
||||
suppressNotFoundErrors: true, |
||||
timeout: 2000 |
||||
}, (okVisible) => { |
||||
// @ts-ignore
|
||||
// status === -1 means the element is not visible, 0 means it is visible.
|
||||
if (okVisible.status === 0) { |
||||
browser.openFile(name) |
||||
.perform(function () { |
||||
done() |
||||
}) |
||||
} else { |
||||
browser.click('[data-id="fileExplorerNewFilecreateNewFile"]') |
||||
.waitForElementContainsText('*[data-id$="fileExplorerTreeItemInput"]', '', 60000) |
||||
.sendKeys('*[data-id$="fileExplorerTreeItemInput"]', name) |
||||
.sendKeys('*[data-id$="fileExplorerTreeItemInput"]', browser.Keys.ENTER) |
||||
// isvisible is protocol action called isDisplayed https://www.selenium.dev/selenium/docs/api/java/org/openqa/selenium/WebElement.html#isDisplayed--
|
||||
.isVisible({ |
||||
selector: `li[data-id="treeViewLitreeViewItem${name}"]`, |
||||
abortOnFailure: false, |
||||
suppressNotFoundErrors: true, |
||||
timeout: 60000 |
||||
}) |
||||
.waitForElementVisible({ |
||||
selector: `//*[@data-id='tab-active' and contains(@data-path, "${name}")]`, |
||||
locateStrategy: 'xpath' |
||||
}) |
||||
.setEditorValue(content.content) |
||||
.getEditorValue((result) => { |
||||
if(result != content.content) { |
||||
browser.setEditorValue(content.content) |
||||
} |
||||
}) |
||||
.perform(function () { |
||||
done() |
||||
}) |
||||
} |
||||
}) |
||||
} |
||||
|
||||
module.exports = AddFileSnekmate |
@ -0,0 +1,22 @@ |
||||
import EventEmitter from "events" |
||||
import { NightwatchBrowser } from "nightwatch" |
||||
|
||||
class SelectFiles extends EventEmitter { |
||||
command (this: NightwatchBrowser, selectedElements: any[]): NightwatchBrowser { |
||||
const browser = this.api |
||||
|
||||
browser.perform(function () { |
||||
const actions = this.actions({ async: true }) |
||||
actions.keyDown(this.Keys.SHIFT) |
||||
for(let i = 0; i < selectedElements.length; i++) { |
||||
actions.click(selectedElements[i].value) |
||||
} |
||||
return actions.contextClick(selectedElements[0].value) |
||||
}) |
||||
this.emit('complete') |
||||
return this |
||||
} |
||||
} |
||||
|
||||
|
||||
module.exports = SelectFiles |
Binary file not shown.
Binary file not shown.
@ -0,0 +1,27 @@ |
||||
import { NightwatchBrowser } from 'nightwatch' |
||||
import init from '../helpers/init' |
||||
|
||||
module.exports = { |
||||
before: function (browser: NightwatchBrowser, done: VoidFunction) { |
||||
init(browser, done) |
||||
}, |
||||
|
||||
'Should select multiple items in file explorer #group1': function (browser: NightwatchBrowser) { |
||||
const selectedElements = [] |
||||
browser |
||||
.openFile('contracts') |
||||
.click({ selector: '//*[@data-id="treeViewLitreeViewItemcontracts/1_Storage.sol"]', locateStrategy: 'xpath' }) |
||||
.findElement({ selector: '//*[@data-id="treeViewLitreeViewItemcontracts/2_Owner.sol"]', locateStrategy: 'xpath' }, (el) => { |
||||
selectedElements.push(el) |
||||
}) |
||||
browser.findElement({ selector: '//*[@data-id="treeViewLitreeViewItemtests"]', locateStrategy: 'xpath' }, |
||||
(el: any) => { |
||||
selectedElements.push(el) |
||||
}) |
||||
browser.selectFiles(selectedElements) |
||||
.assert.visible('.bg-secondary[data-id="treeViewLitreeViewItemcontracts/1_Storage.sol"]') |
||||
.assert.visible('.bg-secondary[data-id="treeViewLitreeViewItemcontracts/2_Owner.sol"]') |
||||
.assert.visible('.bg-secondary[data-id="treeViewLitreeViewItemtests"]') |
||||
.end() |
||||
} |
||||
} |
@ -0,0 +1,106 @@ |
||||
'use strict' |
||||
import { NightwatchBrowser } from 'nightwatch' |
||||
import init from '../helpers/init' |
||||
|
||||
module.exports = { |
||||
'@disabled': true, |
||||
before: function (browser: NightwatchBrowser, done: VoidFunction) { |
||||
init(browser, done) |
||||
}, |
||||
'Should show text in pinned contracts section #group1': function (browser: NightwatchBrowser) { |
||||
browser |
||||
.clickLaunchIcon('udapp') |
||||
.assert.elementPresent('*[data-id="pinnedContracts"]') |
||||
.assert.textContains('*[data-id="pinnedContractsSublabel"]', '(network: vm-cancun)') |
||||
.assert.elementPresent('*[data-id="NoPinnedInstanceText"]') |
||||
.assert.textContains('*[data-id="NoPinnedInstanceText"]', 'No pinned contracts found for selected workspace & network') |
||||
}, |
||||
'Deploy & pin contract #group1': function (browser: NightwatchBrowser) { |
||||
browser |
||||
.clickLaunchIcon('filePanel') |
||||
.waitForElementVisible('*[data-id="treeViewLitreeViewItemcontracts"]') |
||||
.click('*[data-id="treeViewLitreeViewItemcontracts"]') |
||||
.click('*[data-id="treeViewLitreeViewItemcontracts/1_Storage.sol"]') |
||||
.clickLaunchIcon('udapp') |
||||
.click('*[data-id="Deploy - transact (not payable)"]') |
||||
.assert.elementPresent('*[data-id="unpinnedInstance0xd9145CCE52D386f254917e481eB44e9943F39138"]') |
||||
.click('*[data-id="universalDappUiUdappPin"]') |
||||
.assert.elementPresent('*[data-id="deployAndRunNoInstanceText"]') |
||||
.assert.textContains('*[data-id="deployAndRunNoInstanceText"]', 'Currently you have no unpinned contracts to interact with.') |
||||
.assert.not.elementPresent('*[data-id="NoPinnedInstanceText"]') |
||||
.assert.elementPresent('*[data-id="pinnedInstance0xd9145CCE52D386f254917e481eB44e9943F39138"]') |
||||
}, |
||||
'Test pinned contract loading on environment change #group1': function (browser: NightwatchBrowser) { |
||||
browser |
||||
.switchEnvironment('vm-shanghai') |
||||
.assert.elementPresent('*[data-id="pinnedContracts"]') |
||||
.assert.textContains('*[data-id="pinnedContractsSublabel"]', '(network: vm-shanghai)') |
||||
.assert.elementPresent('*[data-id="NoPinnedInstanceText"]') |
||||
.assert.textContains('*[data-id="NoPinnedInstanceText"]', 'No pinned contracts found for selected workspace & network') |
||||
.switchEnvironment('vm-cancun') |
||||
.assert.textContains('*[data-id="pinnedContractsSublabel"]', '(network: vm-cancun)') |
||||
.assert.not.elementPresent('*[data-id="NoPinnedInstanceText"]') |
||||
.assert.elementPresent('*[data-id="pinnedInstance0xd9145CCE52D386f254917e481eB44e9943F39138"]') |
||||
}, |
||||
'Interact with pinned contract #group1': function (browser: NightwatchBrowser) { |
||||
browser |
||||
.click('*[data-id="universalDappUiTitleExpander0"]') |
||||
.assert.elementPresent('*[data-id="instanceContractBal"]') |
||||
.assert.elementPresent('*[data-id="instanceContractPinnedAt"]') |
||||
.assert.elementPresent('*[data-id="instanceContractFilePath"]') |
||||
.assert.textContains('*[data-id="instanceContractFilePath"]', 'default_workspace/contracts/1_Storage.sol') |
||||
.clickFunction('retrieve - call') |
||||
.testFunction('last', |
||||
{ |
||||
to: 'Storage.retrieve() 0xd9145CCE52D386f254917e481eB44e9943F39138', |
||||
'decoded output': { "0": "uint256: 0" } |
||||
}) |
||||
.clickFunction('store - transact (not payable)', { types: 'uint256 num', values: '35' }) |
||||
.testFunction('last', |
||||
{ |
||||
status: '0x1 Transaction mined and execution succeed', |
||||
'decoded input': { "uint256 num": "35" } |
||||
}) |
||||
.clickFunction('retrieve - call') |
||||
.testFunction('last', |
||||
{ |
||||
to: 'Storage.retrieve() 0xd9145CCE52D386f254917e481eB44e9943F39138', |
||||
'decoded output': { "0": "uint256: 35" } |
||||
}) |
||||
}, |
||||
'Unpin & interact #group1': function (browser: NightwatchBrowser) { |
||||
browser |
||||
.click('*[data-id="universalDappUiUdappUnpin"]') |
||||
.assert.textContains('*[data-id="NoPinnedInstanceText"]', 'No pinned contracts found for selected workspace & network') |
||||
.assert.not.elementPresent('*[data-id="deployAndRunNoInstanceText"]') |
||||
.click('*[data-id="universalDappUiTitleExpander0"]') |
||||
.assert.not.elementPresent('*[data-id="instanceContractPinnedAt"]') |
||||
.assert.not.elementPresent('*[data-id="instanceContractFilePath"]') |
||||
.clickFunction('retrieve - call') |
||||
.testFunction('last', |
||||
{ |
||||
to: 'Storage.retrieve() 0xd9145CCE52D386f254917e481eB44e9943F39138', |
||||
'decoded output': { "0": "uint256: 35" } |
||||
}) |
||||
.clickFunction('store - transact (not payable)', { types: 'uint256 num', values: '55' }) |
||||
.testFunction('last', |
||||
{ |
||||
status: '0x1 Transaction mined and execution succeed', |
||||
'decoded input': { "uint256 num": "55" } |
||||
}) |
||||
.clickFunction('retrieve - call') |
||||
.testFunction('last', |
||||
{ |
||||
to: 'Storage.retrieve() 0xd9145CCE52D386f254917e481eB44e9943F39138', |
||||
'decoded output': { "0": "uint256: 55" } |
||||
}) |
||||
}, |
||||
'Re-pin & delete immediately #group1': function (browser: NightwatchBrowser) { |
||||
browser |
||||
.click('*[data-id="universalDappUiUdappPin"]') |
||||
.assert.elementPresent('*[data-id="deployAndRunNoInstanceText"]') |
||||
.click('*[data-id="universalDappUiUdappDelete"]') |
||||
.assert.textContains('*[data-id="NoPinnedInstanceText"]', 'No pinned contracts found for selected workspace & network') |
||||
.assert.textContains('*[data-id="deployAndRunNoInstanceText"]', 'Currently you have no unpinned contracts to interact with.') |
||||
}, |
||||
} |
@ -0,0 +1,272 @@ |
||||
'use strict' |
||||
import { NightwatchBrowser } from 'nightwatch' |
||||
import init from '../helpers/init' |
||||
|
||||
const passphrase = process.env.account_passphrase |
||||
const password = process.env.account_password |
||||
const extension_id = 'nkbihfbeogaeaoehlefnkodbefgpgknn' |
||||
const extension_url = `chrome-extension://${extension_id}/home.html` |
||||
|
||||
const checkBrowserIsChrome = function (browser: NightwatchBrowser) { |
||||
return browser.browserName.indexOf('chrome') > -1 |
||||
} |
||||
|
||||
const checkAlerts = function (browser: NightwatchBrowser){ |
||||
browser.isVisible({ |
||||
selector: '//*[contains(.,"not have enough")]', |
||||
locateStrategy: 'xpath', |
||||
suppressNotFoundErrors: true, |
||||
timeout: 3000 |
||||
}, (okVisible) => { |
||||
if (okVisible.value) { |
||||
browser.assert.fail('Not enough ETH in test account!!') |
||||
browser.end() |
||||
} |
||||
}) |
||||
} |
||||
|
||||
module.exports = { |
||||
'@disabled': true, |
||||
before: function (browser: NightwatchBrowser, done: VoidFunction) { |
||||
init(browser, done) |
||||
}, |
||||
|
||||
'@sources': function () { |
||||
return sources |
||||
}, |
||||
|
||||
'Should connect to Sepolia Test Network using MetaMask #group1': function (browser: NightwatchBrowser) { |
||||
if (!checkBrowserIsChrome(browser)) return |
||||
browser.waitForElementPresent('*[data-id="remixIdeSidePanel"]') |
||||
.setupMetamask(passphrase, password)
|
||||
.useCss().switchBrowserTab(0) |
||||
.refreshPage() |
||||
.waitForElementVisible('*[data-id="remixIdeIconPanel"]', 10000) |
||||
.click('*[data-id="landingPageStartSolidity"]') |
||||
.clickLaunchIcon('udapp') |
||||
.switchEnvironment('injected-MetaMask') |
||||
.waitForElementPresent('*[data-id="settingsNetworkEnv"]') |
||||
.assert.containsText('*[data-id="settingsNetworkEnv"]', 'Sepolia (11155111) network') |
||||
.pause(5000) |
||||
.switchBrowserWindow(extension_url, 'MetaMask', (browser) => { |
||||
browser |
||||
.waitForElementVisible('*[data-testid="page-container-footer-next"]') |
||||
.click('*[data-testid="page-container-footer-next"]') // this connects the metamask account to remix
|
||||
.pause(2000) |
||||
.waitForElementVisible('*[data-testid="page-container-footer-next"]') |
||||
.click('*[data-testid="page-container-footer-next"]') |
||||
// .waitForElementVisible('*[data-testid="popover-close"]')
|
||||
// .click('*[data-testid="popover-close"]')
|
||||
}) |
||||
.switchBrowserTab(0) // back to remix
|
||||
}, |
||||
|
||||
'Should add a contract file #group1': function (browser: NightwatchBrowser) { |
||||
if (!checkBrowserIsChrome(browser)) return |
||||
browser.waitForElementVisible('*[data-id="remixIdeSidePanel"]') |
||||
.clickLaunchIcon('filePanel') |
||||
.addFile('Greet.sol', sources[0]['Greet.sol']) |
||||
.clickLaunchIcon('udapp') |
||||
.waitForElementVisible('*[data-id="Deploy - transact (not payable)"]', 45000) // wait for the contract to compile
|
||||
}, |
||||
|
||||
'Should deploy contract on Sepolia Test Network using MetaMask #group1': function (browser: NightwatchBrowser) { |
||||
if (!checkBrowserIsChrome(browser)) return |
||||
browser.clearConsole().waitForElementPresent('*[data-id="runTabSelectAccount"] option', 45000) |
||||
.clickLaunchIcon('filePanel') |
||||
.openFile('Greet.sol') |
||||
.clickLaunchIcon('udapp') |
||||
.waitForElementPresent('*[data-id="Deploy - transact (not payable)"]') |
||||
.click('*[data-id="Deploy - transact (not payable)"]') |
||||
.pause(5000) |
||||
.perform((done) => { |
||||
browser.switchBrowserWindow(extension_url, 'MetaMask', (browser) => { |
||||
checkAlerts(browser) |
||||
browser |
||||
.waitForElementPresent('[data-testid="page-container-footer-next"]') |
||||
.click('[data-testid="page-container-footer-next"]') // approve the tx
|
||||
.switchBrowserTab(0) // back to remix
|
||||
.waitForElementContainsText('*[data-id="terminalJournal"]', 'view on etherscan', 60000) |
||||
.waitForElementContainsText('*[data-id="terminalJournal"]', 'from: 0x76a...2708f', 60000) |
||||
.perform(() => done()) |
||||
}) |
||||
})
|
||||
}, |
||||
|
||||
'Should run low level interaction (fallback function) on Sepolia Test Network using MetaMask #group1': function (browser: NightwatchBrowser) { |
||||
if (!checkBrowserIsChrome(browser)) return |
||||
browser.clearConsole().waitForElementPresent('*[data-id="remixIdeSidePanel"]') |
||||
.clickInstance(0) |
||||
.waitForElementPresent('*[data-id="pluginManagerSettingsDeployAndRunLLTxSendTransaction"]') |
||||
.click('*[data-id="pluginManagerSettingsDeployAndRunLLTxSendTransaction"]') |
||||
.perform((done) => { |
||||
browser.switchBrowserWindow(extension_url, 'MetaMask', (browser) => { |
||||
browser |
||||
.waitForElementPresent('[data-testid="page-container-footer-next"]') |
||||
.click('[data-testid="page-container-footer-next"]') // approve the tx
|
||||
.switchBrowserTab(0) // back to remix
|
||||
.waitForElementContainsText('*[data-id="terminalJournal"]', 'view on etherscan', 60000) |
||||
.waitForElementContainsText('*[data-id="terminalJournal"]', 'from: 0x76a...2708f', 60000) |
||||
.perform(() => done()) |
||||
})
|
||||
})
|
||||
}, |
||||
|
||||
'Should connect to Ethereum Main Network using MetaMask #group1': function (browser: NightwatchBrowser) { |
||||
if (!checkBrowserIsChrome(browser)) return |
||||
browser.waitForElementPresent('*[data-id="remixIdeSidePanel"]') |
||||
.switchBrowserTab(1) |
||||
.click('[data-testid="network-display"]') |
||||
.click('div[data-testid="Ethereum Mainnet"]') // switch to mainnet
|
||||
.useCss().switchBrowserTab(0) |
||||
.refreshPage() |
||||
.waitForElementVisible('*[data-id="remixIdeIconPanel"]', 10000) |
||||
.click('*[data-id="landingPageStartSolidity"]') |
||||
.clickLaunchIcon('udapp') |
||||
.switchEnvironment('injected-MetaMask') |
||||
.waitForElementPresent('*[data-id="settingsNetworkEnv"]') |
||||
.assert.containsText('*[data-id="settingsNetworkEnv"]', 'Main (1) network') |
||||
}, |
||||
|
||||
'Should deploy contract on Ethereum Main Network using MetaMask #group1': function (browser: NightwatchBrowser) { |
||||
if (!checkBrowserIsChrome(browser)) return |
||||
browser.waitForElementPresent('*[data-id="runTabSelectAccount"] option') |
||||
.clickLaunchIcon('filePanel') |
||||
.openFile('Greet.sol') |
||||
.clickLaunchIcon('udapp') |
||||
.waitForElementPresent('*[data-id="Deploy - transact (not payable)"]') |
||||
.click('*[data-id="Deploy - transact (not payable)"]') |
||||
.waitForElementVisible('*[data-id="udappNotifyModalDialogModalBody-react"]', 65000) |
||||
.modalFooterOKClick('udappNotify') |
||||
.pause(10000) |
||||
.assert.containsText('*[data-id="udappNotifyModalDialogModalBody-react"]', 'You are about to create a transaction on Main Network. Confirm the details to send the info to your provider.') |
||||
.modalFooterCancelClick('udappNotify') |
||||
}, |
||||
|
||||
'Should deploy Ballot to Sepolia using metamask': function (browser: NightwatchBrowser) { |
||||
if (!checkBrowserIsChrome(browser)) return |
||||
browser.waitForElementPresent('*[data-id="remixIdeSidePanel"]') |
||||
.switchBrowserTab(1) |
||||
.click('[data-testid="network-display"]') |
||||
.click('div[data-testid="Sepolia"]') // switch to sepolia
|
||||
.useCss().switchBrowserTab(0) |
||||
.openFile('contracts') |
||||
.openFile('contracts/3_Ballot.sol') |
||||
.clickLaunchIcon('udapp') |
||||
.clearConsole() |
||||
.clearTransactions() |
||||
.clickLaunchIcon('udapp') |
||||
.waitForElementVisible('input[placeholder="bytes32[] proposalNames"]') |
||||
.setValue('input[placeholder="bytes32[] proposalNames"]', '["0x48656c6c6f20576f726c64210000000000000000000000000000000000000000"]') |
||||
.click('*[data-id="Deploy - transact (not payable)"]') // deploy ballot
|
||||
.perform((done) => { |
||||
browser.switchBrowserWindow(extension_url, 'MetaMask', (browser) => { |
||||
browser |
||||
.waitForElementPresent('[data-testid="page-container-footer-next"]') |
||||
.click('[data-testid="page-container-footer-next"]') // approve the tx
|
||||
.switchBrowserTab(0) // back to remix
|
||||
.waitForElementContainsText('*[data-id="terminalJournal"]', 'view on etherscan', 60000) |
||||
.waitForElementContainsText('*[data-id="terminalJournal"]', 'from: 0x76a...2708f', 60000) |
||||
.perform(() => done()) |
||||
}) |
||||
})
|
||||
.waitForElementPresent('*[data-id="universalDappUiContractActionWrapper"]', 60000) |
||||
.clearConsole() |
||||
.clickInstance(0) |
||||
.clickFunction('delegate - transact (not payable)', { types: 'address to', values: '"0x4b0897b0513fdc7c541b6d9d7e929c4e5364d2db"' }) |
||||
.perform((done) => { // call delegate
|
||||
browser.switchBrowserWindow(extension_url, 'MetaMask', (browser) => { |
||||
browser |
||||
.waitForElementPresent('[data-testid="page-container-footer-next"]') |
||||
.click('[data-testid="page-container-footer-next"]') // approve the tx
|
||||
.switchBrowserTab(0) // back to remix
|
||||
.waitForElementContainsText('*[data-id="terminalJournal"]', 'view on etherscan', 60000) |
||||
.waitForElementContainsText('*[data-id="terminalJournal"]', 'from: 0x76a...2708f', 60000) |
||||
.perform(() => done()) |
||||
}) |
||||
}) |
||||
.testFunction('last', |
||||
{ |
||||
status: '0x1 Transaction mined and execution succeed', |
||||
'decoded input': { 'address to': '0x4B0897b0513fdC7C541B6d9D7E929C4e5364D2dB' } |
||||
}) |
||||
}, |
||||
|
||||
/* |
||||
* This test is using 2 different services: |
||||
* - Metamask for getting the transaction |
||||
* - Sepolia node for retrieving the trace and storage |
||||
*/ |
||||
'Should debug Sepolia transaction with source highlighting MetaMask #group1': function (browser: NightwatchBrowser) { |
||||
if (!checkBrowserIsChrome(browser)) return |
||||
let txhash
|
||||
browser.waitForElementVisible('*[data-id="remixIdeIconPanel"]', 10000) |
||||
.clickLaunchIcon('pluginManager') // load debugger and source verification
|
||||
// .scrollAndClick('#pluginManager article[id="remixPluginManagerListItem_sourcify"] button')
|
||||
// debugger already activated .scrollAndClick('#pluginManager article[id="remixPluginManagerListItem_debugger"] button')
|
||||
.clickLaunchIcon('udapp') |
||||
.perform((done) => { |
||||
browser.getLastTransactionHash((hash) => { |
||||
txhash = hash |
||||
done() |
||||
}) |
||||
}) |
||||
.perform((done) => { |
||||
browser |
||||
.waitForElementVisible('*[data-id="remixIdeIconPanel"]', 10000) |
||||
.clickLaunchIcon('debugger') |
||||
.setValue('*[data-id="debuggerTransactionInput"]', txhash) // debug tx
|
||||
.click('*[data-id="debuggerTransactionStartButton"]') |
||||
.waitForElementVisible('*[data-id="treeViewDivto"]', 30000) |
||||
.checkVariableDebug('soliditylocals', localsCheck) |
||||
.perform(() => done()) |
||||
}) |
||||
|
||||
}, |
||||
|
||||
'Call web3.eth.getAccounts() using Injected Provider (Metamask) #group1': function (browser: NightwatchBrowser) { |
||||
if (!checkBrowserIsChrome(browser)) return |
||||
browser |
||||
.executeScriptInTerminal('web3.eth.getAccounts()') |
||||
.journalLastChildIncludes('["0x76a3ABb5a12dcd603B52Ed22195dED17ee82708f"]') |
||||
}
|
||||
} |
||||
|
||||
const localsCheck = { |
||||
to: { |
||||
value: '0x4B0897B0513FDC7C541B6D9D7E929C4E5364D2DB', |
||||
type: 'address' |
||||
} |
||||
} |
||||
|
||||
const sources = [ |
||||
{ |
||||
'Greet.sol': { |
||||
content: |
||||
` |
||||
pragma solidity ^0.8.0; |
||||
contract HelloWorld { |
||||
string public message; |
||||
|
||||
fallback () external { |
||||
message = 'Hello World!'; |
||||
} |
||||
|
||||
function greet(string memory _message) public { |
||||
message = _message; |
||||
} |
||||
}` |
||||
}, |
||||
'checkBalance.sol': { |
||||
content: `pragma solidity ^0.8.0;
|
||||
contract CheckBalance { |
||||
constructor () payable {} |
||||
|
||||
function sendSomeEther(uint256 num) public { |
||||
payable(msg.sender).transfer(num); |
||||
} |
||||
|
||||
}` |
||||
} |
||||
} |
||||
] |
@ -0,0 +1,244 @@ |
||||
|
||||
import React from 'react' |
||||
import { ViewPlugin } from '@remixproject/engine-web' |
||||
import { PluginViewWrapper } from '@remix-ui/helper' |
||||
import { RemixAppManager } from '../../remixAppManager' |
||||
import { RemixUIGridView } from '@remix-ui/remix-ui-grid-view' |
||||
import { RemixUIGridSection } from '@remix-ui/remix-ui-grid-section' |
||||
import { RemixUIGridCell } from '@remix-ui/remix-ui-grid-cell' |
||||
import { ThemeKeys, ThemeObject } from '@microlink/react-json-view' |
||||
//@ts-ignore
|
||||
const _paq = (window._paq = window._paq || []) |
||||
|
||||
const profile = { |
||||
name: 'remixGuide', |
||||
displayName: 'Remix Guide', |
||||
description: 'Learn remix with videos', |
||||
location: 'mainPanel', |
||||
methods: ['showDetails'], |
||||
events: [] |
||||
} |
||||
|
||||
export class RemixGuidePlugin extends ViewPlugin { |
||||
dispatch: React.Dispatch<any> = () => { } |
||||
appManager: RemixAppManager |
||||
element: HTMLDivElement |
||||
payload: any |
||||
themeStyle: any |
||||
theme: ThemeKeys | ThemeObject |
||||
constructor(appManager: RemixAppManager) { |
||||
super(profile) |
||||
this.appManager = appManager |
||||
this.element = document.createElement('div') |
||||
this.element.setAttribute('id', 'remixGuideEl')
|
||||
} |
||||
|
||||
async onActivation() { |
||||
this.handleThemeChange() |
||||
await this.call('tabs', 'focus', 'remixGuide') |
||||
this.renderComponent() |
||||
_paq.push(['trackEvent', 'plugin', 'activated', 'remixGuide']) |
||||
} |
||||
|
||||
onDeactivation(): void { |
||||
} |
||||
|
||||
async showDetails(sentPayload: any) { |
||||
const contractName = Object.entries(sentPayload).find(([key, value]) => key) |
||||
await this.call('tabs', 'focus', 'remixGuide') |
||||
this.profile.displayName = `${contractName[0]}` |
||||
this.payload = sentPayload |
||||
const active = await this.call('theme', 'currentTheme') |
||||
|
||||
this.renderComponent() |
||||
} |
||||
|
||||
private handleThemeChange() { |
||||
this.on('theme', 'themeChanged', (theme: any) => { |
||||
|
||||
this.renderComponent() |
||||
}) |
||||
} |
||||
|
||||
setDispatch(dispatch: React.Dispatch<any>): void { |
||||
this.dispatch = dispatch |
||||
this.renderComponent() |
||||
} |
||||
render() { |
||||
return ( |
||||
<div className="bg-dark" id="remixGuide"> |
||||
<PluginViewWrapper plugin={this} /> |
||||
</div> |
||||
) |
||||
} |
||||
|
||||
renderComponent() { |
||||
this.dispatch({ |
||||
...this, |
||||
...this.payload, |
||||
themeStyle: this.themeStyle, |
||||
theme: this.theme |
||||
}) |
||||
} |
||||
|
||||
updateComponent(state: any) { |
||||
return ( |
||||
<RemixUIGridView |
||||
plugin={this} |
||||
styleList={""} |
||||
logo='/assets/img/YouTubeLogo.webp' |
||||
enableFilter={true} |
||||
showUntagged={true} |
||||
showPin={true} |
||||
tagList={[ |
||||
['beginner', 'danger'], |
||||
['advanced', 'warning'], |
||||
['AI', 'success'], |
||||
['plugins', 'secondary'], |
||||
['solidity', 'primary'], |
||||
['vyper', 'info'], |
||||
['L2', 'danger'] |
||||
]} |
||||
title='Remix Guide' |
||||
description="Streamlined access to categorized video tutorials for mastering Remix IDE. From fundamentals to advanced techniques, level up your development skills with ease." |
||||
//themeStyle={state.themeStyle}
|
||||
> |
||||
<RemixUIGridSection |
||||
plugin={this} |
||||
title='Basics' |
||||
hScrollable= {true} |
||||
> |
||||
<RemixUIGridCell |
||||
plugin={this} |
||||
title="first item" |
||||
tagList={['L2', 'AI']} |
||||
logo='/assets/img/soliditySurvey2023.webp' |
||||
> |
||||
<img src={'/assets/img/soliditySurvey2023.webp'} style={{height: '70px', width: '70px'}} alt=""></img> |
||||
</RemixUIGridCell> |
||||
<RemixUIGridCell |
||||
plugin={this} |
||||
title="next" |
||||
pinned={true} |
||||
tagList={['L2', 'plugins']} |
||||
> |
||||
<img src={'/assets/img/soliditySurvey2023.webp'} style={{height: '70px', width: '70px'}} alt=""></img> |
||||
</RemixUIGridCell> <RemixUIGridCell |
||||
plugin={this} |
||||
title="something" |
||||
pinned={false} |
||||
tagList={['solidity', 'plugins']} |
||||
> |
||||
<img src={'/assets/img/soliditySurvey2023.webp'} style={{height: '70px', width: '70px'}} alt=""></img> |
||||
</RemixUIGridCell> |
||||
<RemixUIGridCell |
||||
plugin={this} |
||||
title="1" |
||||
tagList={['solidity']} |
||||
> |
||||
<img src={'/assets/img/soliditySurvey2023.webp'} style={{height: '70px', width: '70px'}} alt=""></img> |
||||
</RemixUIGridCell> <RemixUIGridCell |
||||
plugin={this} |
||||
title="1" |
||||
> |
||||
<img src={'/assets/img/soliditySurvey2023.webp'} style={{height: '70px', width: '70px'}} alt=""></img> |
||||
</RemixUIGridCell> |
||||
<RemixUIGridCell |
||||
plugin={this} |
||||
title="Something very very long" |
||||
> |
||||
<img src={'/assets/img/soliditySurvey2023.webp'} style={{height: '70px', width: '70px'}} alt=""></img> |
||||
</RemixUIGridCell> <RemixUIGridCell |
||||
plugin={this} |
||||
title="1" |
||||
> |
||||
<img src={'/assets/img/soliditySurvey2023.webp'} style={{height: '70px', width: '70px'}} alt=""></img> |
||||
</RemixUIGridCell> |
||||
<RemixUIGridCell |
||||
plugin={this} |
||||
title="1" |
||||
> |
||||
<img src={'/assets/img/soliditySurvey2023.webp'} style={{height: '70px', width: '70px'}} alt=""></img> |
||||
</RemixUIGridCell> |
||||
<RemixUIGridCell |
||||
plugin={this} |
||||
title="1" |
||||
> |
||||
<img src={'/assets/img/soliditySurvey2023.webp'} style={{height: '70px', width: '70px'}} alt=""></img> |
||||
</RemixUIGridCell> |
||||
<RemixUIGridCell |
||||
plugin={this} |
||||
title="1" |
||||
> |
||||
<img src={'/assets/img/soliditySurvey2023.webp'} style={{height: '70px', width: '70px'}} alt=""></img> |
||||
</RemixUIGridCell> |
||||
</RemixUIGridSection> |
||||
<RemixUIGridSection |
||||
plugin={this} |
||||
title='Basics not scrollable' |
||||
hScrollable= {false} |
||||
> |
||||
<RemixUIGridCell |
||||
plugin={this} |
||||
title="first item" |
||||
logo='/assets/img/soliditySurvey2023.webp' |
||||
> |
||||
<img src={'/assets/img/soliditySurvey2023.webp'} style={{height: '70px', width: '70px'}} alt=""></img> |
||||
</RemixUIGridCell> |
||||
<RemixUIGridCell |
||||
plugin={this} |
||||
title="next" |
||||
> |
||||
<img src={'/assets/img/soliditySurvey2023.webp'} style={{height: '70px', width: '70px'}} alt=""></img> |
||||
</RemixUIGridCell> <RemixUIGridCell |
||||
plugin={this} |
||||
title="something" |
||||
> |
||||
<img src={'/assets/img/soliditySurvey2023.webp'} style={{height: '70px', width: '70px'}} alt=""></img> |
||||
</RemixUIGridCell> |
||||
<RemixUIGridCell |
||||
plugin={this} |
||||
title="1" |
||||
> |
||||
<img src={'/assets/img/soliditySurvey2023.webp'} style={{height: '70px', width: '70px'}} alt=""></img> |
||||
</RemixUIGridCell> <RemixUIGridCell |
||||
plugin={this} |
||||
title="1" |
||||
> |
||||
<img src={'/assets/img/soliditySurvey2023.webp'} style={{height: '70px', width: '70px'}} alt=""></img> |
||||
</RemixUIGridCell> |
||||
<RemixUIGridCell |
||||
plugin={this} |
||||
title="1" |
||||
> |
||||
<img src={'/assets/img/soliditySurvey2023.webp'} style={{height: '70px', width: '70px'}} alt=""></img> |
||||
</RemixUIGridCell> <RemixUIGridCell |
||||
plugin={this} |
||||
title="1" |
||||
> |
||||
<img src={'/assets/img/soliditySurvey2023.webp'} style={{height: '70px', width: '70px'}} alt=""></img> |
||||
</RemixUIGridCell> |
||||
<RemixUIGridCell |
||||
plugin={this} |
||||
title="1" |
||||
> |
||||
<img src={'/assets/img/soliditySurvey2023.webp'} style={{height: '70px', width: '70px'}} alt=""></img> |
||||
</RemixUIGridCell> |
||||
<RemixUIGridCell |
||||
plugin={this} |
||||
title="1" |
||||
> |
||||
<img src={'/assets/img/soliditySurvey2023.webp'} style={{height: '70px', width: '70px'}} alt=""></img> |
||||
</RemixUIGridCell> |
||||
<RemixUIGridCell |
||||
plugin={this} |
||||
title="1" |
||||
> |
||||
<img src={'/assets/img/soliditySurvey2023.webp'} style={{height: '70px', width: '70px'}} alt=""></img> |
||||
</RemixUIGridCell> |
||||
</RemixUIGridSection> |
||||
</RemixUIGridView> |
||||
) |
||||
} |
||||
|
||||
} |
@ -0,0 +1,15 @@ |
||||
{ |
||||
"circuit.compiler": "Компилятор", |
||||
"circuit.autoCompile": "Автокомпиляция", |
||||
"circuit.hideWarnings": "Скрыть предупреждения", |
||||
"circuit.advancedConfigurations": "Расширенные настройки", |
||||
"circuit.compilerConfiguration": "Настройки компилятора", |
||||
"circuit.prime": "Изначально", |
||||
"circuit.useConfigurationFile": "Использовать файл настроек", |
||||
"circuit.compile": "Скомпилировать", |
||||
"circuit.noFileSelected": "нет выбранных файлов", |
||||
"circuit.generateR1cs": "Сгенерировать R1CS", |
||||
"circuit.computeWitness": "Вычислить Witness", |
||||
"circuit.signalInput": "Сигнал ввода", |
||||
"circuit.compute": "Вычислить" |
||||
} |
@ -0,0 +1,26 @@ |
||||
{ |
||||
"debugger.displayName": "Отладчик", |
||||
"debugger.debuggerConfiguration": "Настройки отладчика", |
||||
"debugger.stopDebugging": "Завершить отладку", |
||||
"debugger.provideTxNumber": "Пожалуйста, укажите действительный хэш транзакции", |
||||
"debugger.startDebugging": "Начать отладку", |
||||
"debugger.placeholder": "Хэш транзакции, должен начинаться с 0x", |
||||
"debugger.debugLocaNodeLabel": "Принудительное использование локального узла", |
||||
"debugger.useGeneratedSources": "Использовать сгенерированные источники", |
||||
"debugger.debugWithGeneratedSources": "Когда флажок установлен, то отладчик проверит скомпилированный файл .yul, если он существует.", |
||||
"debugger.introduction": "При отладке с хэшем транзакции, если контракт проверен, Remix попытается получить исходный код из Sourcify или Etherscan. Укажите API ключ Etherscan в настройках Remix. Поддерживаемые сети смотрите в", |
||||
"debugger.forceToUseCurrentLocalNode": "Заставить отладчик использовать текущий локальный узел", |
||||
"debugger.sourceLocationStatus1": "Поиск контрольной точки. Это может занять некоторое время...", |
||||
"debugger.sourceLocationStatus2": "Местоположение источника недоступно ни в Sourcify ни в Etherscan. Пожалуйста, убедитесь, что ключ api Etherscan указан в настройках.", |
||||
"debugger.sourcifyDocs": "Документации Sourcify", |
||||
"debugger.noDataAvailable": "Данные отсутствуют", |
||||
"debugger.loadMore": "Загрузить еще", |
||||
"debugger.copy": "Копировать", |
||||
"debugger.stepOverBack": "Шаг назад", |
||||
"debugger.stepBack": "Назад", |
||||
"debugger.stepInto": "Шаг в", |
||||
"debugger.stepOverForward": "Шаг вперед", |
||||
"debugger.jumpPreviousBreakpoint": "Перейти к предыдущей контрольной точке", |
||||
"debugger.jumpOut": "Выпрыгнуть", |
||||
"debugger.jumpNextBreakpoint": "Перейти к предыдущей контрольной точке" |
||||
} |
@ -0,0 +1,134 @@ |
||||
{ |
||||
"filePanel.displayName": "Файловый менеджер", |
||||
"filePanel.workspace": "ПРОЕКТЫ", |
||||
"filePanel.create": "Создать", |
||||
"filePanel.clone": "Клонировать", |
||||
"filePanel.download": "Скачать", |
||||
"filePanel.backup": "Резервная копия", |
||||
"filePanel.restore": "Восстановить", |
||||
"filePanel.workspace.create": "Создать проект", |
||||
"filePanel.workspace.rename": "Переименовать проект", |
||||
"filePanel.workspace.save_workspace": "Сохранить проект", |
||||
"filePanel.workspace.delete": "Удалить проект", |
||||
"filePanel.workspace.deleteConfirm": "Вы уверены, что хотите удалить текущий проект?", |
||||
"filePanel.workspace.download": "Скачать проект", |
||||
"filePanel.workspace.downloadConfirm": "Текущий проект будет загружен в виде zip-файла. Вы хотите продолжить?", |
||||
"filePanel.workspace.deleteAll": "Удалить все проекты", |
||||
"filePanel.workspace.deleteAllConfirm1": "Вы уверены, что хотите удалить все ваши проекты?", |
||||
"filePanel.workspace.deleteAllConfirm2": "Удаленные проекты не могут быть восстановлены каким-либо образом.", |
||||
"filePanel.workspace.name": "Название проекта", |
||||
"filePanel.workspace.chooseTemplate": "Выбрать шаблон", |
||||
"filePanel.workspace.backup": "Резервное копирование всех проектов", |
||||
"filePanel.workspace.restore": "Восстановить проекты из резервной копии", |
||||
"filePanel.workspace.clone": "Клонировать репозиторий", |
||||
"filePanel.workspace.cloneMessage": "Пожалуйста, укажите действительный url git репозитория.", |
||||
"filePanel.workspace.enterGitUrl": "Введите url git репозитория", |
||||
"filePanel.workspace.switch": "Переключиться на проект", |
||||
"filePanel.workspace.solghaction": "Добавляет предустановленный yml файл для запуска модульных тестов Solidity в действиях github CI.", |
||||
"filePanel.solghaction": "Рабочий процесс тестирования Solidity", |
||||
"filePanel.workspace.tssoltestghaction": "Добавляет предустановленный yml файл для запуска mocha и chai тестов на прочность CI действий на github", |
||||
"filePanel.tssoltestghaction": "Рабочий процесс Mocha Chai Test", |
||||
"filePanel.workspace.addscriptetherscan": "Добавляет скрипты, которые могут использоваться для взаимодействия с Etherscan API", |
||||
"filePanel.addscriptetherscan": "Добавить скрипты Etherscan", |
||||
"filePanel.workspace.addscriptdeployer": "Добавляет скрипты, которые могут использоваться для развертывания контрактов", |
||||
"filePanel.addscriptdeployer": "Добавить скрипты развертывания контракта", |
||||
"filePanel.workspace.slitherghaction": "Добавляет предустановленный yml файл для запуска модульных тестов Solidity в действиях github CI", |
||||
"filePanel.slitherghaction": "Рабочий процесс Slither", |
||||
"filePanel.workspace.helperscripts": "Добавляет удобные скрипты в директорию 'scripts'", |
||||
"filePanel.helperscripts": "Web3 скрипты", |
||||
"filePanel.newFile": "Новый файл", |
||||
"filePanel.newFolder": "Новая папка", |
||||
"filePanel.rename": "Переименовать", |
||||
"filePanel.delete": "Удалить", |
||||
"filePanel.deleteAll": "Удалить всё", |
||||
"filePanel.run": "Запустить", |
||||
"filePanel.pushChangesToGist": "Отправить изменения в Gist", |
||||
"filePanel.publishFolderToGist": "Опубликовать папку в Gist", |
||||
"filePanel.publishFileToGist": "Опубликовать файл в Gist", |
||||
"filePanel.copy": "Копировать", |
||||
"filePanel.copyFileName": "Копировать название", |
||||
"filePanel.copyFilePath": "Копировать путь", |
||||
"filePanel.contractflattener": "Сведение", |
||||
"filePanel.nahmii-compiler": "Компиляция Nahmii", |
||||
"filePanel.solidityumlgen": "Сгенерировать UML", |
||||
"filePanel.doc-gen": "Генерировать документы", |
||||
"filePanel.solidity": "Скомпилировать", |
||||
"filePanel.paste": "Вставить", |
||||
"filePanel.compile": "Скомпилировать", |
||||
"filePanel.compileForNahmii": "Компиляция для Nahmii", |
||||
"filePanel.createNewFile": "Создать новый файл", |
||||
"filePanel.createNewFolder": "Создать новую папку", |
||||
"filePanel.publishToGist": "Опубликовать все файлы в GitHub Gist", |
||||
"filePanel.uploadFile": "Загрузить файлы", |
||||
"filePanel.uploadFolder": "Загрузка папки", |
||||
"filePanel.updateGist": "Обновить текущий обозреватель [gist]", |
||||
"filePanel.viewAllBranches": "Просмотреть все ветки", |
||||
"filePanel.createBranch": "Создать ветку", |
||||
"filePanel.switchBranches": "Переключить ветку", |
||||
"filePanel.checkoutGitBranch": "Проверьте Git ветку", |
||||
"filePanel.findOrCreateABranch": "Найти или создать ветку.", |
||||
"filePanel.initGitRepositoryLabel": "Инициализировать рабочую область как новый git репозиторий", |
||||
"filePanel.initGitRepositoryWarning": "Чтобы использовать функции Git, добавьте имя пользователя и адрес электронной почты в раздел Github на Панели настроек.", |
||||
"filePanel.workspaceName": "Название рабочей области", |
||||
"filePanel.customizeTemplate": "Настроить шаблон", |
||||
"filePanel.features": "Особенности", |
||||
"filePanel.upgradeability": "Улучшение", |
||||
"filePanel.ok": "OK", |
||||
"filePanel.yes": "Да", |
||||
"filePanel.cancel": "Отменить", |
||||
"filePanel.createNewWorkspace": "создать новую рабочую область", |
||||
"filePanel.connectToLocalhost": "подключиться к локальному хосту", |
||||
"filePanel.copiedToClipboard": "Скопировано в буфер обмена {path}", |
||||
"filePanel.downloadFailed": "Ошибка загрузки", |
||||
"filePanel.downloadFailedMsg": "Непредвиденная ошибка при загрузке: {error}", |
||||
"filePanel.close": "Закрыть", |
||||
"filePanel.copyFileFailed": "Ошибка копирования файла", |
||||
"filePanel.copyFileFailedMsg": "Непредвиденная ошибка при копировании файла: {src}", |
||||
"filePanel.copyFolderFailed": "Ошибка копирования папки", |
||||
"filePanel.copyFolderFailedMsg": "Непредвиденная ошибка при копировании папки: {src}", |
||||
"filePanel.runScriptFailed": "Не удалось запустить скрипт", |
||||
"filePanel.createPublicGist": "Создать публичный Gist", |
||||
"filePanel.createPublicGistMsg1": "Вы уверены, что хотите отправить изменения в удалённый файл gist на github.com?", |
||||
"filePanel.createPublicGistMsg2": "Вы уверены, что хотите анонимно опубликовать все ваши файлы в папке {path} как публичный файл на github.com?", |
||||
"filePanel.createPublicGistMsg3": "Вы уверены, что хотите анонимно опубликовать все ваши файлы в папке {path} как публичный файл на github.com?", |
||||
"filePanel.createPublicGistMsg4": "Вы уверены, что хотите анонимно опубликовать все ваши файлы в папке {name} как публичный файл на github.com?", |
||||
"filePanel.deleteMsg": "Вы уверены, что хотите удалить?", |
||||
"filePanel.theseItems": "эти элементы", |
||||
"filePanel.thisItem": "этот элемент", |
||||
"filePanel.deleteItems": "Удалить элементы", |
||||
"filePanel.deleteItem": "Удалить элемент", |
||||
"filePanel.globalToast": "Невозможно записать/изменить файловую систему в режиме только для чтения.", |
||||
"filePanel.basic": "Основной", |
||||
"filePanel.blank": "Пустой", |
||||
"filePanel.multiSigWallet": "Кошелек с мультиподписью", |
||||
"filePanel.mintable": "Чеканный", |
||||
"filePanel.burnable": "Ожигаемый", |
||||
"filePanel.pausable": "Пауза", |
||||
"filePanel.semaphore": "Семафор", |
||||
"filePanel.hashchecker": "Хэш-чекер", |
||||
"filePanel.rln": "Обнулитель ограничения частоты запросов", |
||||
"filePanel.breakthroughLabsUniswapv4Hooks": "Breakthrough-Labs Hooks", |
||||
"filePanel.uniswapV4Periphery": "V4 периферия", |
||||
"filePanel.uniswapV4HookBookMultiSigSwapHook": "HookBook MultiSigSwapHook", |
||||
"filePanel.transparent": "Прозрачный", |
||||
"filePanel.initGitRepoTitle": "Установите флажок для активизации рабочей области как нового git репозитория", |
||||
"filePanel.switchToBranchTitle1": "Проверить новую ветку из удалённой ветки", |
||||
"filePanel.switchToBranchTitle2": "Выдать в локальную ветку", |
||||
"filePanel.readOnly": "только для чтения", |
||||
"filePanel.renameFileFailed": "Не удалось переименовать файл", |
||||
"filePanel.renameFileFailedMsg": "Непредвиденная ошибка при переименовании: {error}", |
||||
"filePanel.fileCreationFailed": "Ошибка создания файла", |
||||
"filePanel.folderCreationFailed": "Ошибка создания папки", |
||||
"filePanel.validationError": "Ошибка проверки", |
||||
"filePanel.validationErrorMsg": "Нельзя использовать специальные символы", |
||||
"filePanel.reservedKeyword": "Зарезервированное ключевое слово", |
||||
"filePanel.reservedKeywordMsg": "Имя файла содержит зарезервированные ключевые слова Remix \".{content}\"", |
||||
"filePanel.moveFile": "Перемещение файлов", |
||||
"filePanel.moveFileMsg1": "Вы уверены, что хотите переместить {src} в {dest}?", |
||||
"filePanel.movingFileFailed": "Не удалось переместить файл", |
||||
"filePanel.movingFileFailedMsg": "Непредвиденная ошибка при перемещении файла: {src}", |
||||
"filePanel.movingFolderFailed": "Не удалось переместить папку", |
||||
"filePanel.movingFolderFailedMsg": "Непредвиденная ошибка при перемещении папки: {src}", |
||||
"filePanel.workspaceActions": "Действия в рабочей области", |
||||
"filePanel.saveCodeSample": "Эта рабочая область примера кода не будет сохранена. Нажмите здесь, чтобы сохранить." |
||||
} |
@ -0,0 +1,69 @@ |
||||
{ |
||||
"home.scamAlert": "Предупреждение о мошенничестве", |
||||
"home.scamAlertText": "Единственный URL, который использует Remix, - это remix.ethereum.org", |
||||
"home.scamAlertText2": "Остерегайтесь видеороликов, рекламирующих \"ботов-передовиков ликвидности\"", |
||||
"home.scamAlertText3": "Дополнительные советы по технике безопасности", |
||||
"home.learnMore": "Узнать больше", |
||||
"home.here": "здесь", |
||||
"home.featured": "Рекомендуемые", |
||||
"home.jumpIntoWeb3": "Перейти в WEB3", |
||||
"home.jumpIntoWeb3More": "Подробнее", |
||||
"home.jumpIntoWeb3Text": "Remix IDE является частью проекта Remix, широкий выбор инструментов которого, может быть использован для всего путешествия по разработке контракта пользователями любого уровня знаний. Узнайте больше на сайте проекта Remix.", |
||||
"home.remixYouTube": "СМОТРИМ И УЧИМСЯ", |
||||
"home.remixYouTubeText1": "Видео советы от команды Remix", |
||||
"home.remixYouTubeMore": "Смотреть", |
||||
"home.remixYouTubeText2": "У Remix растущая библиотека видео, содержащая множество советов по использованию инструмента. Проверьте их и подпишитесь, чтобы получить наши последние обновления.", |
||||
"home.betaTesting": "БЕТА-ТЕСТИРОВАНИЕ", |
||||
"home.betaTestingText1": "Наше сообщество поддерживает нас.", |
||||
"home.betaTestingText2": "Помогите нам запустить бета-тестирование прямо сейчас и ознакомьтесь с новыми функциями", |
||||
"home.betaTestingMore": "Зарегистрироваться", |
||||
"home.featuredPlugins": "Рекомендуемые плагины", |
||||
"home.solidityPluginDesc": "Компиляция, тестирование и анализ смарт-контрактов.", |
||||
"home.cookbookDesc": "Найти смарт-контракты, solidity библиотеки и обнаружить протоколы.", |
||||
"home.codeAnalyizerPluginDesc": "Анализируйте ваш код с помощью Remix, Solhint и Slither.", |
||||
"home.starkNetPluginDesc": "Компиляция и развертывание контрактов с Cairo, родным языком StarkNet.", |
||||
"home.solhintPluginDesc": "Solhint — проект с открытым исходным кодом для линейки кода Solidity.", |
||||
"home.sourcifyPluginDesc": "Контракт Solidity и сервис проверки метаданных.", |
||||
"home.unitTestPluginDesc": "Напишите и запустите модульные тесты для ваших контрактов в Solidity.", |
||||
"home.dgitPluginDesc": "Добавить контроль за исходным кодом в ваши проекты.", |
||||
"home.oneClickDappDesc": "Быстрое создание смарт-контрактных интерфейсов", |
||||
"home.getStarted": "Приступить к работе", |
||||
"home.projectTemplates": "Шаблоны проектов", |
||||
"home.blankTemplateDesc": "Создать пустую рабочую область.", |
||||
"home.remixDefaultTemplateDesc": "Создать рабочую область с файлами примеров.", |
||||
"home.ozerc20TemplateDesc": "Создайте ERC20 токен, импортируя библиотеку OpenZeppelin.", |
||||
"home.ozerc721TemplateDesc": "Создайте NFT токен, импортируя библиотеку OpenZeppelin.", |
||||
"home.ozerc1155TemplateDesc": "Создайте ERC1155 токен, импортируя библиотеку OpenZeppelin.", |
||||
"home.gnosisSafeMultisigTemplateDesc": "Создайте кошельки с мульти-подписью с использованием этого шаблона.", |
||||
"home.zeroxErc20TemplateDesc": "Создайте токен ERC20, импортируя контракт с 0xProject.", |
||||
"home.learn": "Обучение", |
||||
"home.learnEth1": "Основы Remix", |
||||
"home.learnEth1Desc": "Введение в интерфейс Remix-а и основные операции.", |
||||
"home.learnEth2": "Введение в Solidity", |
||||
"home.learnEth2Desc": "Интерактивное изучение концепции Solidity для начинающих.", |
||||
"home.remixAdvanced": "Развертывание с Библиотеками", |
||||
"home.remixAdvancedDesc": "Научитесь развертывать с библиотеками в Remix", |
||||
"home.remixYoutubePlaylist": "Плейлист Remix на Youtube", |
||||
"home.remixTwitterProfile": "Remix Twitter Профиль", |
||||
"home.remixLinkedinProfile": "Remix Linkedin профиль", |
||||
"home.remixMediumPosts": "Remix Medium публикации", |
||||
"home.joinUsOnDiscord": "Присоединяйтесь к нам в Discord", |
||||
"home.nativeIDE": "Родная IDE для разработки WEB3.", |
||||
"home.website": "Веб-сайт", |
||||
"home.documentation": "Документация", |
||||
"home.remixPlugin": "Remix плагин", |
||||
"home.remixDesktop": "Remix Desktop", |
||||
"home.searchDocumentation": "Поиск документации", |
||||
"home.files": "Файлы", |
||||
"home.newFile": "Новый файл", |
||||
"home.startCoding": "Начать кодирование", |
||||
"home.startCodingPlayground": "Откройте площадку для прототипирования и простого обучения", |
||||
"home.openFile": "Открыть файл", |
||||
"home.openFileTooltip": "Откройте файл из вашей файловой системы", |
||||
"home.accessFileSystem": "Доступ к файловой системе", |
||||
"home.loadFrom": "Загрузить из", |
||||
"home.resources": "Источники", |
||||
"home.connectToLocalhost": "Подключиться к локальному хосту", |
||||
"home.seeAllTutorials": "Посмотреть все уроки", |
||||
"home.maintainedByRemix": "Поддерживается Remix" |
||||
} |
@ -0,0 +1,17 @@ |
||||
import enJson from '../en' |
||||
|
||||
function readAndCombineJsonFiles() { |
||||
const dataContext = require.context('./', true, /\.json$/) |
||||
|
||||
let combinedData = {} |
||||
dataContext.keys().forEach((key) => { |
||||
const jsonData = dataContext(key) |
||||
combinedData = {...combinedData, ...jsonData} |
||||
}) |
||||
|
||||
return combinedData |
||||
} |
||||
|
||||
// There may have some un-translated content. Always fill in the gaps with EN JSON.
|
||||
// No need for a defaultMessage prop when render a FormattedMessage component.
|
||||
export default Object.assign({}, enJson, readAndCombineJsonFiles()) |
@ -0,0 +1,10 @@ |
||||
{ |
||||
"panel.author": "Автор", |
||||
"panel.maintainedBy": "Поддерживается", |
||||
"panel.documentation": "Документация", |
||||
"panel.description": "Описание", |
||||
"panel.maintainedByRemix": "Поддерживается Remix", |
||||
"panel.pluginInfo": "Информация о плагине", |
||||
"panel.linkToDoc": "Ссылка на документацию", |
||||
"panel.makeAnissue": "Создать задачу" |
||||
} |
@ -0,0 +1,13 @@ |
||||
{ |
||||
"permissionHandler.allPermissionsReset": "Все разрешения были сброшены.", |
||||
"permissionHandler.rememberText": "изменено и", |
||||
"permissionHandler.permissionHandlerMessage": "\"{from}\" {rememberText} хочет получить доступ к \"{method}\" из \"{to}\"`", |
||||
"permissionHandler.description": "Описание", |
||||
"permissionHandler.noDescriptionProvided": "Описание отсутствует", |
||||
"permissionHandler.makeSureYouTrustThisPlugin": "Убедитесь, что Вы доверяете этому плагину перед обработкой этого вызова. Если Вы запомните выбор для этого вызова, то значение будет сохранено только для текущей сессии.", |
||||
"permissionHandler.rememberThisChoice": "Запомнить этот выбор", |
||||
"permissionHandler.resetAllPermissions": "Сбросить все разрешения", |
||||
"permissionHandler.permissionNeededFor": "Для {to} необходимо разрешение", |
||||
"permissionHandler.accept": "Принять", |
||||
"permissionHandler.decline": "Отклонить" |
||||
} |
@ -0,0 +1,43 @@ |
||||
{ |
||||
"pluginManager.displayName": "Менеджер плагинов", |
||||
"pluginManager.activate": "Активировать", |
||||
"pluginManager.deactivate": "Деактивировать", |
||||
"pluginManager.activeModules": "Активные модули", |
||||
"pluginManager.inactiveModules": "Неактивные модули", |
||||
"pluginManager.connectLocal": "Подключиться к локальному плагину", |
||||
"pluginManager.localForm.title": "Локальный плагин", |
||||
"pluginManager.localForm.pluginName": "Название плагина", |
||||
"pluginManager.localForm.shouldBeCamelCase": "Должно быть в camelCase", |
||||
"pluginManager.localForm.displayName": "Отображаемое название", |
||||
"pluginManager.localForm.nameInTheHeader": "Название в заголовке", |
||||
"pluginManager.localForm.required": "требуется", |
||||
"pluginManager.localForm.commaSeparatedMethod": "список методов через запятую", |
||||
"pluginManager.localForm.commaSeparatedPlugin": "список названий плагинов через запятую", |
||||
"pluginManager.localForm.pluginsItCanActivate": "Плагины, которые могут быть активированы", |
||||
"pluginManager.localForm.typeOfConnection": "Тип соединения", |
||||
"pluginManager.localForm.locationInRemix": "Расположение в Remix", |
||||
"pluginManager.localForm.sidePanel": "Боковая панель", |
||||
"pluginManager.localForm.mainPanel": "Главная панель", |
||||
"pluginManager.localForm.none": "Пусто", |
||||
"pluginManager.localForm.methods": "Методы", |
||||
"pluginManager.localForm.pluginNames": "Имя плагина", |
||||
"pluginManager.localForm.ok": "OK", |
||||
"pluginManager.localForm.cancel": "Отменить", |
||||
"pluginManager.Permissions": "Разрешения", |
||||
"pluginManager.permissions": "разрешения", |
||||
"pluginManager.pluginManagerPermissions": "Разрешения менеджера плагинов", |
||||
"pluginManager.currentPermissionSettings": "Текущие настройки разрешений", |
||||
"pluginManager.noPermissionRequestedYet": "Пока нет запрошенных разрешений.", |
||||
"pluginManager.allow": "Разрешить", |
||||
"pluginManager.toCall": "чтобы вызвать", |
||||
"pluginManager.ok": "OK", |
||||
"pluginManager.cancel": "Отменить", |
||||
"pluginManager.maintainedByRemix": "Поддерживается Remix", |
||||
"pluginManager.linkToDoc": "Ссылка на документацию", |
||||
"pluginManager.versionAlpha": "Альфа-версия", |
||||
"pluginManager.versionBeta": "Бета-версия", |
||||
"pluginManager.deactivatePlugin": "Отключить {pluginName}", |
||||
"pluginManager.activatePlugin": "Включить {pluginName}", |
||||
"pluginManager.search": "Поиск", |
||||
"pluginManager.managePluginsPermissions": "Управление разрешениями плагинов" |
||||
} |
@ -0,0 +1,3 @@ |
||||
{ |
||||
"remixApp.scrollToSeeAllTabs": "Прокрутите, чтобы увидеть все вкладки" |
||||
} |
@ -0,0 +1,7 @@ |
||||
{ |
||||
"remixUiTabs.tooltipText1": "Запуск скрипта (CTRL + SHIFT + S)", |
||||
"remixUiTabs.tooltipText2": "Компилировать CTRL + S", |
||||
"remixUiTabs.tooltipText3": "Выберите файл c расширением .sol или .yul для компиляции или файл .ts или .js для запуска", |
||||
"remixUiTabs.zoomOut": "Уменьшить", |
||||
"remixUiTabs.zoomIn": "Увеличить" |
||||
} |
@ -0,0 +1,24 @@ |
||||
{ |
||||
"search.displayName": "Поиск в файлах", |
||||
"search.replace": "Заменить", |
||||
"search.replaceAll": "Заменить все", |
||||
"search.placeholder1": "Искать ( Введите для поиска )", |
||||
"search.placeholder2": "Включить ie *.sol ( Введите для включения)", |
||||
"search.placeholder3": "Исключить ie .git/**/* ( Введите для исключения )", |
||||
"search.matchCase": "Учитывать регистр", |
||||
"search.matchWholeWord": "Только слово целиком", |
||||
"search.useRegularExpression": "Использовать регулярные выражения", |
||||
"search.replaceWithoutConfirmation": "заменить без подтверждения", |
||||
"search.filesToInclude": "Файлы для включения", |
||||
"search.filesToExclude": "Файлы для исключения", |
||||
"search.toggleReplace": "Переключить замену", |
||||
"search.replaceInFiles": "заменить в файлах", |
||||
"search.stop": "Стоп", |
||||
"search.undoChanges": "Отменить изменения {path}", |
||||
"search.confirmreplaceMsg": "Вы уверены, что вы хотите заменить \"{find}\" на \"{replace}\" в {filename}?", |
||||
"search.yes": "Да", |
||||
"search.no": "Нет", |
||||
"search.loading": "Загрузка", |
||||
"search.text1": "Показать {count} результаты в {fileCount} файлах", |
||||
"search.text2": "Слишком много результатов для отображения...{br} Пожалуйста, сузьте поиск." |
||||
} |
@ -0,0 +1,44 @@ |
||||
{ |
||||
"settings.displayName": "Настройки", |
||||
"settings.reset": "Сбросить до настроек по умолчанию", |
||||
"settings.general": "Общие настройки", |
||||
"settings.generateContractMetadataText": "Генерирует метаданные договора. Генерирует JSON-файл в папке с договором. Позволяет указать адреса библиотек, от которых зависит контракт. Если ничего не указано, то Remix развертывает библиотеки автоматически.", |
||||
"settings.ethereunVMText": "Всегда использовать виртуальную машину Remix при загрузке", |
||||
"settings.wordWrapText": "Обводка слов в редакторе", |
||||
"settings.useAutoCompleteText": "Включение завершения кода в редакторе.", |
||||
"settings.useShowGasInEditorText": "Отобразить в редакторе расчеты газа.", |
||||
"settings.displayErrorsText": "Отображать ошибки в редакторе при вводе текста.", |
||||
"settings.matomoAnalytics": "Включение Matomo Analytics. Мы не собираем личную информацию (ПД). Эта информация используется для улучшения UX и пользовательского интерфейса сайта. Узнайте больше ", |
||||
"settings.enablePersonalModeText": " Включение персонального режима для провайдера web3. Транзакция, отправленная через Web 3, будет использовать web 3.personal API.", |
||||
"settings.warnText": "Убедитесь, что конечная точка открыта перед включением. Этот режим позволяет пользователю предоставить парольную фразу в интерфейсе Remix без необходимости разблокировать аккаунт. Несмотря на то, что это очень удобно, вы должны полностью доверять бэкэнду, к которому вы подключены (Geth, Parity, ...). Remix никогда не будет сохраняться парольная фраза", |
||||
"settings.gitAccessTokenTitle": "Учетные данные Github", |
||||
"settings.gitAccessTokenText": "Токен доступа используется для публикации Gist и получения содержимого GitHub. Возможно, вам потребуется ввести имя пользователя/электронную почту.", |
||||
"settings.gitAccessTokenText2": "Перейдите на страницу токенов github (ссылка ниже), создайте новый токен и сохраните его в Remix. Убедитесь, что этот токен имеет только право 'create gist'", |
||||
"settings.etherscanTokenTitle": "Токен доступа EtherScan", |
||||
"settings.etherscanAccessTokenText": "Управляйте ключом api, используемым для взаимодействия с Etherscan.", |
||||
"settings.etherscanAccessTokenText2": "Перейдите на страницу api ключей Etherscan (ссылка ниже), чтобы создать новый api ключ и сохраните его в Remix.", |
||||
"settings.save": "Сохранить", |
||||
"settings.remove": "Удалить", |
||||
"settings.themes": "Темы", |
||||
"settings.locales": "Язык", |
||||
"settings.swarm": "Настройки Swarm", |
||||
"settings.ipfs": "Настройки IPFS", |
||||
"settings.token": "ТОКЕН", |
||||
"settings.copy": "Копировать", |
||||
"settings.deleteEtherscanToken": "Удалить Etherscan токен", |
||||
"settings.username": "ИМЯ ПОЛЬЗОВАТЕЛЯ", |
||||
"settings.email": "Электронная почта", |
||||
"settings.deleteGithubCredentials": "Удалить учетные данные Github", |
||||
"settings.privateBeeAddress": "ПРИВАТНЫЙ BEE АДРЕС", |
||||
"settings.postageStampID": "ID почтового штампа", |
||||
"settings.host": "Хост", |
||||
"settings.protocol": "Протокол", |
||||
"settings.port": "ПОРТ", |
||||
"settings.projectID": "ID ПРОЕКТА", |
||||
"settings.projectSecret": "СЕКРЕТ ПРОЕКТА", |
||||
"settings.analyticsInRemix": "Аналитика в Remix IDE", |
||||
"settings.copilot": "Solidity второй пилот - Альфа", |
||||
"settings.copilot.activate": "Загрузка и активация копилота", |
||||
"settings.copilot.max_new_tokens": "Максимальное количество слов для генерации", |
||||
"settings.copilot.temperature": "Температура" |
||||
} |
@ -0,0 +1,81 @@ |
||||
{ |
||||
"solidity.displayName": "Компилятор Solidity", |
||||
"solidity._comment_compiler-container.tsx": "libs/remix-ui/solidity-compiler/src/lib/compiler-container.tsx", |
||||
"solidity.compiler": "Компилятор", |
||||
"solidity.addACustomCompiler": "Добавить пользовательский компилятор", |
||||
"solidity.addACustomCompilerWithURL": "Добавить пользовательский компилятор со ссылкой URL", |
||||
"solidity.includeNightlyBuilds": "Включить ночные сборки", |
||||
"solidity.autoCompile": "Автокомпиляция", |
||||
"solidity.hideWarnings": "Скрыть предупреждения", |
||||
"solidity.enableHardhat": "Включить Hardhat компиляцию", |
||||
"solidity.learnHardhat": "Узнайте, как использовать аппаратную компиляцию", |
||||
"solidity.enableTruffle": "Включить компиляцию Truffle", |
||||
"solidity.learnTruffle": "Узнайте, как использовать Truffle компиляцию", |
||||
"solidity.advancedConfigurations": "Расширенные конфигурации", |
||||
"solidity.compilerConfiguration": "Конфигурация Компилятора", |
||||
"solidity.compilationDetails": "Подробности компиляции", |
||||
"solidity.language": "Язык", |
||||
"solidity.evmVersion": "Версия EVM", |
||||
"solidity.enableOptimization": "Включить оптимизацию", |
||||
"solidity.useConfigurationFile": "Использовать файл настроек", |
||||
"solidity.change": "Изменить", |
||||
"solidity.compile": "Скомпилировать", |
||||
"solidity.noFileSelected": "файл не выбран", |
||||
"solidity.compileAndRunScript": "Компиляция и запуск скрипта", |
||||
"solidity.newConfigFileTitle": "Новый файл конфигурации", |
||||
"solidity.newConfigFileMessage": "Файл \"{configFilePathInput}\" который вы ввели не существует. Хотите создать новый?", |
||||
"solidity.create": "Создать", |
||||
"solidity.ok": "OK", |
||||
"solidity.cancel": "Отменить", |
||||
"solidity.noFileSelected1": "Нет выбранных файлов.", |
||||
"solidity.toCompile": "скомпилировать", |
||||
"solidity.noConfigFileSelected": "Не выбран файл конфигурации", |
||||
"solidity.copyNatSpecTag": "Нажмите, чтобы скопировать пользовательский тег NatSpec", |
||||
"solidity.inputTitle1": "Если файл, который вы ввели, не существует, вы сможете создать его на следующем шаге.", |
||||
"solidity.inputTitle2": "Расчетное количество раз, когда каждый опцион развернутого кода будет выполняться в течение всего срока действия контракта.", |
||||
"solidity.tooltipText1": "Выберите сценарий для выполнения сразу после компиляции, добавив тег `dev-run-script` natspec как в:", |
||||
"solidity.tooltipText2": "Нажмите на значок \"i\", чтобы узнать больше", |
||||
"solidity.tooltipText3": "для компиляции и выполнения скрипта", |
||||
"solidity.tooltipText4": "Нажмите, чтобы открыть файл конфигурации", |
||||
"solidity.tooltipText5": "Не удается загрузить список версий компилятора. Возможно, он заблокирован блокировщиком рекламы. Пожалуйста, попробуйте отключить любой из них с этой страницы и перезагрузить. Ошибка: ", |
||||
"solidity.tooltipText6": "Спецификация языка доступна от Компилятора >= v0.5.7", |
||||
"solidity.toastMessage": "Обновление версии компилятора, чтобы соответствовать текущему файлу контракта pragma т.е. {version}", |
||||
"solidity.compileIconAttribute": "компилятор загружается, пожалуйста, подождите несколько минут.", |
||||
"solidity.compilerLicense": "Лицензия Компилятора", |
||||
"solidity.compilerLicenseMsg1": "Загрузка компилятора. Лицензия будет отображаться после загрузки компилятора", |
||||
"solidity.compilerLicenseMsg2": "Не удалось получить лицензию для выбранной версии компилятора", |
||||
"solidity.compilerLicenseMsg3": "Лицензия недоступна", |
||||
"solidity.seeCompilerLicense": "Посмотреть лицензию компилятора", |
||||
"solidity._comment_contract-selection.tsx": "libs/remix-ui/solidity-compiler/src/lib/contract-selection.tsx", |
||||
"solidity.publishOn": "Опубликовано на", |
||||
"solidity.flatten": "Сглаживание контракта до генерации UML.", |
||||
"solidity.generateUML": "Создать UML диаграмму вашего контракта.", |
||||
"solidity.flattenLabel": "Сведение", |
||||
"solidity.generateUMLLabel": "Генерировать UML диаграмму", |
||||
"solidity.copy": "Копировать", |
||||
"solidity.copyABI": "Копировать ABI в буфер обмена", |
||||
"solidity.copyBytecode": "Копировать Bytecode в буфер обмена", |
||||
"solidity.unableToDisplay": "Не удается отобразить", |
||||
"solidity.download": "Скачать", |
||||
"solidity.compileDetails": "Скачать информацию о компиляции (формат JSON)", |
||||
"solidity.close": "Закрыть", |
||||
"solidity.contract": "Контракт", |
||||
"solidity.displayContractDetails": "Показать детали контракта", |
||||
"solidity.noContractCompiled": "Контракт еще не компилирован", |
||||
"solidity.Assembly": "Коды сборки, описывающие контракт, включая соответствующий исходный код Solidity", |
||||
"solidity.Opcodes": "Коды сборки с описанием контракта", |
||||
"solidity.name": "Название скомпилированного контракта", |
||||
"solidity.metadata": "Содержит всю информацию, относящуюся к компиляции", |
||||
"solidity.bytecode": "Байт-код, выполняемый при создании контракта", |
||||
"solidity.abi": "ABI: описание всех функций (входные и выходные параметры, область применения, ...)", |
||||
"solidity.web3Deploy": "Скопируйте или вставьте этот код в любую консоль JavaScript/Web3 для развертывания этого контракта", |
||||
"solidity.metadataHash": "Хэш представляющий всю метаинформацию", |
||||
"solidity.functionHashes": "Список объявленных функций и их соответствующий хэш", |
||||
"solidity.gasEstimates": "Оценка газа для каждого вызова функции", |
||||
"solidity.Runtime Bytecode": "Байт-код хранит состояние и выполняется во время обычного вызова контракта", |
||||
"solidity.storageLayout": "См. документацию по схеме хранилища.", |
||||
"solidity.devdoc": "Документация для разработчиков (natspec)", |
||||
"solidity.userdoc": "Документация пользователя (natspec)", |
||||
"solidity.compilerInput": "Ввод в компилятор Solidity", |
||||
"solidity.swarmLocation": "Url - адрес Swarm в котором можно найти всю информацию о метаданных (контракт должен быть опубликован первым)" |
||||
} |
@ -0,0 +1,41 @@ |
||||
{ |
||||
"solidityUnitTesting.displayName": "Модульное тестирование Solidity", |
||||
"solidityUnitTesting.testDirectory": "Тестовая директория", |
||||
"solidityUnitTesting.testYourSmartContract": "Проверьте ваш смарт - контракт в Solidity.", |
||||
"solidityUnitTesting.selectDirectory": "Выберите директорию для загрузки и создания тестовых файлов.", |
||||
"solidityUnitTesting.uiPathInputTooltip": "Нажмите 'Enter', чтобы изменить путь к тестовым файлами.", |
||||
"solidityUnitTesting.uiPathInputButtonTooltip": "Создать тестовую папку", |
||||
"solidityUnitTesting.create": "Создать", |
||||
"solidityUnitTesting.generateTestsButtonTooltip": "Создать пример тестового файла", |
||||
"solidityUnitTesting.generate": "Генерировать", |
||||
"solidityUnitTesting.generateTestsLinkTooltip": "Ознакомьтесь с документацией.", |
||||
"solidityUnitTesting.howToUse": "Как использовать...", |
||||
"solidityUnitTesting.runButtonTitle1": "Начать тесты", |
||||
"solidityUnitTesting.runButtonTitle2": "Пожалуйста, выберите версию компилятора Solidity выше чем 0.4.12.", |
||||
"solidityUnitTesting.runButtonTitle3": "Не выбран Solidity файл", |
||||
"solidityUnitTesting.runButtonTitle4": "Solidity плагин должен быть активирован", |
||||
"solidityUnitTesting.runButtonTitle5": "Тестовый файл не выбран", |
||||
"solidityUnitTesting.stopButtonLabel1": "Стоп", |
||||
"solidityUnitTesting.stopButtonLabel2": "Останавливается", |
||||
"solidityUnitTesting.run": "Запустить", |
||||
"solidityUnitTesting.runTestsTabStopActionTooltip": "Остановить запуск тестов", |
||||
"solidityUnitTesting.selectAll": "Выбрать все", |
||||
"solidityUnitTesting.testTabTestsExecutionStopped": "Выполнение теста остановлено", |
||||
"solidityUnitTesting.testTabTestsExecutionStoppedError": "Выполнение теста остановлено из-за ошибки(ошибок) в вашем тестовом файле", |
||||
"solidityUnitTesting.progress": "Прогресс: {readyTestsNumber} завершён (из {runningTestsNumber})", |
||||
"solidityUnitTesting.resultFor": "Результат для", |
||||
"solidityUnitTesting.passed": "Успешно", |
||||
"solidityUnitTesting.failed": "Сбой", |
||||
"solidityUnitTesting.timeTaken": "Затраченное время", |
||||
"solidityUnitTesting.errorMessage": "Сообщение об ошибке", |
||||
"solidityUnitTesting.assertion": "Утверждение", |
||||
"solidityUnitTesting.expectedValueShouldBe": "Ожидаемое значение должно быть", |
||||
"solidityUnitTesting.receivedValue": "Полученные значения", |
||||
"solidityUnitTesting.skippingTheRemainingTests": "Пропуск оставшихся тестов функции.", |
||||
"solidityUnitTesting.toasterMsg": "Папка успешно создана", |
||||
"solidityUnitTesting.tooltipText1": "Не удалось выполнить тест по крайней мере одного контракта", |
||||
"solidityUnitTesting.tooltipText2": "Все контрактные тесты пройдены", |
||||
"solidityUnitTesting.tooltipText3": "Начать отладку", |
||||
"solidityUnitTesting.fail": "НЕПРОЙДЕН", |
||||
"solidityUnitTesting.pass": "ПРОЙДЕН" |
||||
} |
@ -0,0 +1,43 @@ |
||||
{ |
||||
"terminal.listen": "прослушивание всех транзакций", |
||||
"terminal.listenTitle": "Если флажок установлен, то Remix будет прослушивать все транзакции, добытые в текущей среде, а не только транзакции, созданные вами", |
||||
"terminal.search": "Поиск по хэшу или адресу транзакции", |
||||
"terminal.used": "используется", |
||||
"terminal.debug": "Отладка", |
||||
"terminal.welcomeText1": "Добро пожаловать в", |
||||
"terminal.welcomeText2": "Ваши файлы хранятся в", |
||||
"terminal.welcomeText3": "Вы можете использовать этот терминал для", |
||||
"terminal.welcomeText4": "Проверьте детали транзакций и начните отладку", |
||||
"terminal.welcomeText5": "Выполнение скриптов JavaScript", |
||||
"terminal.welcomeText6": "Введите сценарий непосредственно в интерфейсе командной строки", |
||||
"terminal.welcomeText7": "Выберите файл Javascript в проводнике файлов, а затем запустите \"remix.execute()\" или \"remix.exeCurrent()\" в интерфейсе командной строки", |
||||
"terminal.welcomeText8": "Щелкните правой кнопкой мыши на файл JavaScript в проводнике и затем нажмите `Выполнить`", |
||||
"terminal.welcomeText9": "Доступны следующие библиотеки", |
||||
"terminal.welcomeText10": "Введите имя библиотеки, чтобы увидеть доступные команды", |
||||
"terminal.text1": "Этот тип команды устарел и больше не функционирует. Пожалуйста, запустите remix.help(), чтобы получить список доступных команд.", |
||||
"terminal.hideTerminal": "Скрыть терминал", |
||||
"terminal.showTerminal": "Показать терминал", |
||||
"terminal.clearConsole": "Очистить консоль", |
||||
"terminal.pendingTransactions": "Ожидающие транзакции", |
||||
"terminal.toasterMsg1": "нет контента для выполнения", |
||||
"terminal.toasterMsg2": "не найден поставщик пути {fileName}", |
||||
"terminal.vmMode": "Режим VM", |
||||
"terminal.vmModeMsg": "Не удается отладить этот вызов. Отладка вызовов возможна только в режиме Remix VM.", |
||||
"terminal.ok": "Ok", |
||||
"terminal.cancel": "Отменить", |
||||
"terminal.callWarning": "(Применяется только в случае вызова контракта)", |
||||
"terminal.msg1": "Транзакция добыта, но выполнение не удалось", |
||||
"terminal.msg2": "Успешное выполнение транзакций", |
||||
"terminal.msg3": "Статус недоступен в данный момент", |
||||
"terminal.status": "статус", |
||||
"terminal.transactionHash": "хеш транзакции", |
||||
"terminal.blockHash": "хеш блока", |
||||
"terminal.blockNumber": "номер блока", |
||||
"terminal.contractAddress": "адрес контракта", |
||||
"terminal.transactionCost": "стоимость транзакции", |
||||
"terminal.executionCost": "стоимость исполнения", |
||||
"terminal.input": "ввод", |
||||
"terminal.decodedInput": "декодированный ввод", |
||||
"terminal.decodedOutput": "декодированный вывод", |
||||
"terminal.logs": "журналы" |
||||
} |
@ -0,0 +1,139 @@ |
||||
{ |
||||
"udapp.displayName": "Развертывание и запуск транзакций", |
||||
"udapp._comment_gasPrice.tsx": "libs/remix-ui/run-tab/src/lib/components/gasPrice.tsx", |
||||
"udapp.gasLimit": "Лимит газа", |
||||
"udapp.tooltipText4": "Стандартный газовой лимит составляет 3М. Регулировка по мере необходимости.", |
||||
"udapp._comment_value.tsx": "libs/remix-ui/run-tab/src/lib/components/value.tsx", |
||||
"udapp.value": "Значение", |
||||
"udapp.tooltipText5": "Введите сумму и выберите ее единицу", |
||||
"udapp._comment_contractDropdownUI.tsx": "libs/remix-ui/run-tab/src/lib/components/contractDropdownUI.tsx", |
||||
"udapp.contract": "Контракт", |
||||
"udapp.compiledBy": "скомпилировано {compilerName}", |
||||
"udapp.warningEvmVersion": "Пожалуйста, убедитесь, что выбранная сеть совместима с данной Evm версией: {evmVersion}. В противном случае развёртывание закончится неудачно.", |
||||
"udapp.infoSyncCompiledContractTooltip": "Нажмите здесь, чтобы импортировать контакты, скомпилированные из внешней платформы.\nЭто действие включается, когда Remix подключён к внешнему фреймворку (hardhat, truffle, foundry) через remixd", |
||||
"udapp.remixIpfsUdappTooltip": "Публикация исходного кода и метаданных IPFS облегчает верификацию исходного кода с помощью Sourcify и значительно ускоряет принятие контракта (аудит, отладка, вызов и т.д...)", |
||||
"udapp.deploy": "Развернуть", |
||||
"udapp.publishTo": "Опубликовать в", |
||||
"udapp.atAddress": "At Address", |
||||
"udapp.atAddressOptionsTitle1": "адрес контракта", |
||||
"udapp.atAddressOptionsTitle2": "Для взаимодействия с развёрнутым контрактом, необходимо выбрать в редакторе файл .abi или скомпилированный файл .sol (с той же конфигурацией компилятора)", |
||||
"udapp.atAddressOptionsTitle3": "Компилируйте *.sol файл или выберите файл *.abi.", |
||||
"udapp.atAddressOptionsTitle4": "Для взаимодействия с развёрнутым контрактом, либо введите его адрес и скомпилируйте исходный файл *.sol (с такими же настройками компилятора) или выберите его .abi файл в редакторе.", |
||||
"udapp.contractOptionsTitle1": "Пожалуйста, скомпилируйте *.sol файл для развертывания или доступа к контракту", |
||||
"udapp.contractOptionsTitle2": "Выберите скомпилированный контракт для развертывания или используйте по адресу.", |
||||
"udapp.contractOptionsTitle3": "Выберите и скомпилируйте *.sol файл для развертывания или доступа к контракту.", |
||||
"udapp.contractOptionsTitle4": "При наличии скомпилированного файла .sol, выберите контракт для развертывания или использования с параметром \"At Address\".", |
||||
"udapp.checkSumWarning": "Похоже вы не используете адрес с контрольной суммой. Адрес с контрольной суммой это адрес который состоит из заглавных букв, как указано в {a}. Контрольные адреса предназначены для предотвращения отправки пользователями транзакций по ошибочному адресу.", |
||||
"udapp.isOverSizePromptEip170": "Инициализация создания контракта возвращает данные длиной более 24576 байт. Развёртывание скорее всего завершится неудачей, если текущая сеть активировала eip 170. Дополнительная информация: {a}", |
||||
"udapp.isOverSizePromptEip3860": "Код инициализации контракта превышает допустимый максимальный размер кода 49152 байта. Развёртывание скорее всего не будет выполнено, если текущая сеть активировала eip 3860. Дополнительная информация: {a}", |
||||
"udapp.thisContractMayBeAbstract": "Этот контракт может быть абстрактным, он может не полностью применять методы абстрактного родительского объекта или он может неправильно вызывать унаследованный конструктор контракта.", |
||||
"udapp.noCompiledContracts": "Компилированных контрактов нет", |
||||
"udapp.addressOfContract": "Адрес контракта", |
||||
"udapp.loadContractFromAddress": "Загрузить контракт из адреса", |
||||
"udapp.ok": "OK", |
||||
"udapp.alert": "Предупреждение", |
||||
"udapp.proceed": "Продолжить", |
||||
"udapp.cancel": "Отменить", |
||||
"udapp.abiFileSelected": "Выбран файл ABI", |
||||
"udapp.evmVersion": "версия EVM", |
||||
"udapp.addressNotValid": "Адрес не действителен", |
||||
"udapp._comment_account.tsx": "libs/remix-ui/run-tab/src/lib/components/account.tsx", |
||||
"udapp.account": "Аккаунт", |
||||
"udapp.signAMessage": "Подписать сообщение", |
||||
"udapp.enterAMessageToSign": "Введите сообщение для подписания", |
||||
"udapp.hash": "хэш", |
||||
"udapp.signature": "подпись", |
||||
"udapp.injectedTitle": "К сожалению, невозможно создать учетную запись с помощью внедрённого провайдера. Пожалуйста, создайте аккаунт непосредственно у вашего провайдера (т.е. Metamask или другого такого же типа).", |
||||
"udapp.createNewAccount": "Создать новый аккаунт", |
||||
"udapp.web3Title": "Создание учетной записи возможно только в Личном режиме. Пожалуйста, перейдите в Настройки, чтобы включить ее.", |
||||
"udapp.defaultTitle": "К сожалению, невозможно создать учетную запись с помощью внешнего кошелька ({selectExEnv}).", |
||||
"udapp.text1": "Пожалуйста, укажите пароль для создания учетной записи", |
||||
"udapp.tooltipText1": "Список учётных записей пуст, пожалуйста, убедитесь, что текущий провайдер правильно подключен к remix", |
||||
"udapp.modalTitle1": "Парольная фраза для подписания сообщения", |
||||
"udapp.modalMessage1": "Введите ваш пароль для этой учётной записи чтобы подписания сообщения", |
||||
"udapp.copyAccount": "Копировать аккаунт в буфер обмена", |
||||
"udapp.signMsgUsingAccount": "Подписать сообщение, используя эту учетную запись", |
||||
"udapp._comment_environment.tsx": "libs/remix-ui/run-tab/src/lib/components/environment.tsx", |
||||
"udapp.environment": "Среда", |
||||
"udapp.environmentDocs": "Нажмите для получения документации о Среде", |
||||
"udapp.tooltipText2": "Откройте chainlist.org и получите данные подключения к цепочке, с которой вы хотите взаимодействовать.", |
||||
"udapp.tooltipText3": "Нажмите, чтобы открыть мост для преобразования L1 mainnet ETH в выбранную сетевую валюту.", |
||||
"udapp._comment_instanceContainerUI.tsx": "libs/remix-ui/run-tab/src/lib/components/instanceContainerUI.tsx", |
||||
"udapp.deployedContracts": "Развернутые контракты", |
||||
"udapp.deployAndRunClearInstances": "Очистить список экземпляров и сбросить рекордер", |
||||
"udapp.deployAndRunNoInstanceText": "В настоящее время у вас нет экземпляров контракта для взаимодействия.", |
||||
"udapp.tooltipText6": "Автоматически создаваемые пользовательские интерфейсы для взаимодействия с развернутыми контрактами", |
||||
"udapp._comment_recorderCardUI.tsx": "libs/remix-ui/run-tab/src/lib/components/recorderCardUI.tsx", |
||||
"udapp.transactionsRecorded": "Транзакции записаны", |
||||
"udapp.transactionsCountTooltip": "Количество записанных транзакций", |
||||
"udapp.transactionSaveTooltip1": "Нет транзакций для сохранения", |
||||
"udapp.transactionSaveTooltip2": "Сохранить транзакцию {count} как файл сценария", |
||||
"udapp.transactionSaveTooltip3": "Сохранить транзакции {count} как файл сценария", |
||||
"udapp.transactionsWalkthroughTooltip": "Начать пошаговое описание для записи.", |
||||
"udapp.infoRecorderTooltip": "Сохранить транзакции (развернутые контракты и выполнение функций) и повторить их в другой среде. Например, транзакции, созданные в Remix VM, могут воспроизводиться во внутреннем провайдере (Injected Provider).", |
||||
"udapp.livemodeRecorderTooltip": "Если контракты обновляются после записи транзакций, то установка этого флажка приведёт к запуску записанных транзакций с последней копией скомпилированных контрактов", |
||||
"udapp.livemodeRecorderLabel": "Выполнить транзакции с использованием последнего результата компиляции", |
||||
"udapp.runRecorderTooltip": "Выполнить транзакцию(и) из текущего файла сценария", |
||||
"udapp.save": "Сохранить", |
||||
"udapp.run": "Запустить", |
||||
"udapp._comment_contractGUI.tsx": "libs/remix-ui/run-tab/src/lib/components/contractGUI.tsx", |
||||
"udapp.parameters": "Параметры", |
||||
"udapp.copyParameters": "Копировать параметры ввода в буфер обмена", |
||||
"udapp.copyCalldata": "Копировать данные вызова в буфер обмена", |
||||
"udapp.deployWithProxy": "Развернуть с прокси", |
||||
"udapp.upgradeWithProxy": "Обновить с прокси", |
||||
"udapp.getEncodedCallError": "невозможно кодировать пустые аргументы", |
||||
"udapp.proxyAddressError1": "прокси адрес не может быть пустым", |
||||
"udapp.proxyAddressError2": "недействительный адрес контракта", |
||||
"udapp.tooltipText11": "Прокси адрес не может быть пустым", |
||||
"udapp.tooltipText12": "Требуется ввод", |
||||
"udapp.tooltipText13": "Развернуто {date}", |
||||
"udapp._comment_universalDappUI.tsx": "libs/remix-ui/run-tab/src/lib/components/universalDappUI.tsx", |
||||
"udapp.tooltipText7": "Удалить из списка", |
||||
"udapp.tooltipText8": "Нажмите для просмотра документации об использовании функций 'receive'/'fallback'", |
||||
"udapp.tooltipText9": "Данные вызова для отправки в резервную функцию контракта.", |
||||
"udapp.tooltipText10": "Отправить данные контракту.", |
||||
"udapp.balance": "Баланс", |
||||
"udapp.lowLevelInteractions": "Взаимодействия низкого уровня", |
||||
"udapp.llIError1": "Отправляемое значение должно быть числом", |
||||
"udapp.llIError2": "Для получения перевода Ether контракт должен иметь функцию 'receive' или оплачиваемую функцию 'fallback'", |
||||
"udapp.llIError3": "Вызываемые данные должны быть допустимым шестнадцатеричным значением с размером не менее одного байта.", |
||||
"udapp.llIError4": "Вызываемые данные должны быть допустимым шестнадцатеричным значением.", |
||||
"udapp.llIError5": "Функция 'Fallback' не определена", |
||||
"udapp.llIError6": "Обе функции 'receive' и 'fallback' не определены", |
||||
"udapp.llIError7": "Пожалуйста, определите функцию 'Fallback' для отправки вызываемых данных или 'Receive' или оплачиваемую функцию 'Fallback' для отправки эфира", |
||||
"udapp.copy": "Копировать", |
||||
"udapp._comment_mainnet.tsx": "libs/remix-ui/run-tab/src/lib/components/mainnet.tsx", |
||||
"udapp.mainnetText1": "Вы собираетесь создать транзакцию в сети {name}. Подтвердите данные для отправки информации вашему провайдеру.", |
||||
"udapp.mainnetText2": "Провайдером для многих пользователей является MetaMask. Провайдер попросит вас подписать транзакцию перед отправкой ее в сеть {name}.", |
||||
"udapp.amount": "Количество", |
||||
"udapp.gasEstimation": "Оценка газа", |
||||
"udapp.maxPriorityFee": "Максимальная плата за приоритет", |
||||
"udapp.maxFee": "Максимальная комиссия (не меньше базовой комиссии {baseFeePerGas} Gwei)", |
||||
"udapp.contractCreation": "Создание контракта", |
||||
"udapp.transactionFee": "Недопустимая операция. Максимальная комиссия не должна быть меньше базовой комиссии", |
||||
"udapp.title1": "Представляет собой часть комиссии, которая направляется майнеру", |
||||
"udapp.title2": "Представляет максимальную сумму комиссии, которую вы платите за эту транзакцию. Минимальная сумма должна быть равной базовой комиссии.", |
||||
"udapp.gasPrice": "Цена газа", |
||||
"udapp.gweiText": "посетите {a} для информации о текущей цене газа.", |
||||
"udapp.maxTransactionFee": "Максимальная комиссия за транзакцию", |
||||
"udapp.mainnetText3": "Больше не показывать это предупреждение.", |
||||
"udapp._comment_run-tab.tsx": "libs/remix-ui/run-tab/src/lib/run-tab.tsx", |
||||
"udapp.gasEstimationPromptText": "При оценке газа произошла ошибка со следующим сообщением (см. ниже). Выполнение транзакции скорее всего закончится неудачно. Хотите принудительно отправить?", |
||||
"udapp._comment_custom-dropdown.tsx": "libs/remix-ui/helper/src/lib/components/custom-dropdown.tsx", |
||||
"udapp.enterProxyAddress": "Введите адрес прокси", |
||||
"udapp._comment_provider": "apps/remix-ide/src/app/providers", |
||||
"udapp.customVmForkProviderText": "Пожалуйста, предоставьте информацию о пользовательском форке. Если URL-адрес узла не указан, Виртуальная Машина запустится с пустого состояния.", |
||||
"udapp.nodeUrl": "URL узла", |
||||
"udapp.blockNumber": "Номер блока (или \"последний\")", |
||||
"udapp.externalHttpProviderText1": "Примечание: Для использования Geth и https://remix.ethereum.org, настройте его так, чтобы он разрешал запросы от Remix:(см. <a>Geth Docs на сервере rpc</a>)", |
||||
"udapp.externalHttpProviderText2": "Для запуска Remix и локального тестового узла Geth используйте эту команду: (см. <a>Geth Docs в режиме Dev mode </a>)", |
||||
"udapp.externalHttpProviderText3": "<b>ВНИМАНИЕ:</b> Не безопасно использование флага --http.corsdomain с подстановочным символом: <b>--http.corsdomain *</b>", |
||||
"udapp.externalHttpProviderText4": "Для дополнительной информации: <a>Remix Docs на внешнем HTTP провайдере</a>", |
||||
"udapp.foundryProviderText1": "Примечание: Чтобы запустить Anvil в системе, запустите:", |
||||
"udapp.foundryProviderText2": "Для получения дополнительной информации, посетите <a>Документация по инструментарию разработки смарт-контрактов (Foundry) </a>", |
||||
"udapp.ganacheProviderText1": "Примечание: Чтобы запустить Ganache в системе, запустите:", |
||||
"udapp.ganacheProviderText2": "Для получения дополнительной информации, посетите: <a>Документация по Ganache</a>", |
||||
"udapp.hardhatProviderText1": "Примечание: Для запуска узла Hardhat в вашей системе, перейдите в папку hardhat проекта и запустите команду:", |
||||
"udapp.hardhatProviderText2": "Для получения дополнительной информации, посетите: <a>Документация по Hardhat</a>" |
||||
} |
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in new issue