From 6f6ded53c91857565232fce27a4f8a4135e8411e Mon Sep 17 00:00:00 2001 From: Aniket-Engg Date: Fri, 6 May 2022 14:12:47 +0530 Subject: [PATCH 01/16] default template in dir --- apps/remix-ide/webpack.config.js | 8 + .../workspace/src/lib/actions/workspace.ts | 2 +- .../src/lib/templates/remixDefault.ts | 406 ------------------ .../src/lib/templates/remixDefault/README.txt | 26 ++ .../remixDefault/contracts/1_Storage.sol | 29 ++ .../remixDefault/contracts/2_Owner.sol | 54 +++ .../remixDefault/contracts/3_Ballot.sol | 138 ++++++ .../src/lib/templates/remixDefault/index.ts | 13 + .../scripts/deploy_with_ethers.ts | 14 + .../remixDefault/scripts/deploy_with_web3.ts | 14 + .../templates/remixDefault/scripts/ethers.ts | 24 ++ .../templates/remixDefault/scripts/web3.ts | 24 ++ .../remixDefault/tests/Ballot_test.sol | 28 ++ .../remixDefault/tests/storage.test.js | 22 + 14 files changed, 395 insertions(+), 407 deletions(-) delete mode 100644 libs/remix-ui/workspace/src/lib/templates/remixDefault.ts create mode 100644 libs/remix-ui/workspace/src/lib/templates/remixDefault/README.txt create mode 100644 libs/remix-ui/workspace/src/lib/templates/remixDefault/contracts/1_Storage.sol create mode 100644 libs/remix-ui/workspace/src/lib/templates/remixDefault/contracts/2_Owner.sol create mode 100644 libs/remix-ui/workspace/src/lib/templates/remixDefault/contracts/3_Ballot.sol create mode 100644 libs/remix-ui/workspace/src/lib/templates/remixDefault/index.ts create mode 100644 libs/remix-ui/workspace/src/lib/templates/remixDefault/scripts/deploy_with_ethers.ts create mode 100644 libs/remix-ui/workspace/src/lib/templates/remixDefault/scripts/deploy_with_web3.ts create mode 100644 libs/remix-ui/workspace/src/lib/templates/remixDefault/scripts/ethers.ts create mode 100644 libs/remix-ui/workspace/src/lib/templates/remixDefault/scripts/web3.ts create mode 100644 libs/remix-ui/workspace/src/lib/templates/remixDefault/tests/Ballot_test.sol create mode 100644 libs/remix-ui/workspace/src/lib/templates/remixDefault/tests/storage.test.js diff --git a/apps/remix-ide/webpack.config.js b/apps/remix-ide/webpack.config.js index 529fe58d39..c1c806505d 100644 --- a/apps/remix-ide/webpack.config.js +++ b/apps/remix-ide/webpack.config.js @@ -3,6 +3,7 @@ const TerserPlugin = require('terser-webpack-plugin') const CopyWebpackPlugin = require('copy-webpack-plugin') const version = require('../../package.json').version const fs = require('fs') +const path = require('path') const versionData = { version: version, @@ -14,6 +15,13 @@ fs.writeFileSync('./apps/remix-ide/src/assets/version.json', JSON.stringify(vers module.exports = config => { const nxWebpackConfig = nxWebpack(config) + + nxWebpackConfig.module.rules.push({ test: /\.txt$/, use: 'raw-loader' }) + nxWebpackConfig.module.rules.push({ test: /\.sol$/, use: 'raw-loader' }) + nxWebpackConfig.module.rules.push({ test: /\.test\.js$/, use: 'raw-loader' }) + nxWebpackConfig.module.rules.push({ test: /\web3.ts$/, use: 'raw-loader' }) + nxWebpackConfig.module.rules.push({ test: /\ethers.ts$/, use: 'raw-loader' }) + const webpackConfig = { ...nxWebpackConfig, node: { diff --git a/libs/remix-ui/workspace/src/lib/actions/workspace.ts b/libs/remix-ui/workspace/src/lib/actions/workspace.ts index ccde0a4ff8..724db395cd 100644 --- a/libs/remix-ui/workspace/src/lib/actions/workspace.ts +++ b/libs/remix-ui/workspace/src/lib/actions/workspace.ts @@ -157,7 +157,7 @@ export const loadWorkspacePreset = async (template: WorkspaceTemplate = 'remixDe const files = templateWithContent[template] for (const file in files) { try { - await workspaceProvider.set(files[file].name, files[file].content) + await workspaceProvider.set(file, files[file]) } catch (error) { console.error(error) } diff --git a/libs/remix-ui/workspace/src/lib/templates/remixDefault.ts b/libs/remix-ui/workspace/src/lib/templates/remixDefault.ts deleted file mode 100644 index 8b596ec049..0000000000 --- a/libs/remix-ui/workspace/src/lib/templates/remixDefault.ts +++ /dev/null @@ -1,406 +0,0 @@ -'use strict' - -const storage = `// SPDX-License-Identifier: GPL-3.0 - -pragma solidity >=0.7.0 <0.9.0; - -/** - * @title Storage - * @dev Store & retrieve value in a variable - * @custom:dev-run-script ./scripts/deploy_with_ethers.ts - */ -contract Storage { - - uint256 number; - - /** - * @dev Store value in variable - * @param num value to store - */ - function store(uint256 num) public { - number = num; - } - - /** - * @dev Return value - * @return value of 'number' - */ - function retrieve() public view returns (uint256){ - return number; - } -}` - -const owner = `// SPDX-License-Identifier: GPL-3.0 - -pragma solidity >=0.7.0 <0.9.0; - -import "hardhat/console.sol"; - -/** - * @title Owner - * @dev Set & change owner - */ -contract Owner { - - address private owner; - - // event for EVM logging - event OwnerSet(address indexed oldOwner, address indexed newOwner); - - // modifier to check if caller is owner - modifier isOwner() { - // If the first argument of 'require' evaluates to 'false', execution terminates and all - // changes to the state and to Ether balances are reverted. - // This used to consume all gas in old EVM versions, but not anymore. - // It is often a good idea to use 'require' to check if functions are called correctly. - // As a second argument, you can also provide an explanation about what went wrong. - require(msg.sender == owner, "Caller is not owner"); - _; - } - - /** - * @dev Set contract deployer as owner - */ - constructor() { - console.log("Owner contract deployed by:", msg.sender); - owner = msg.sender; // 'msg.sender' is sender of current call, contract deployer for a constructor - emit OwnerSet(address(0), owner); - } - - /** - * @dev Change owner - * @param newOwner address of new owner - */ - function changeOwner(address newOwner) public isOwner { - emit OwnerSet(owner, newOwner); - owner = newOwner; - } - - /** - * @dev Return owner address - * @return address of owner - */ - function getOwner() external view returns (address) { - return owner; - } -}` - -const ballot = `// SPDX-License-Identifier: GPL-3.0 - -pragma solidity >=0.7.0 <0.9.0; - -/** - * @title Ballot - * @dev Implements voting process along with vote delegation - */ -contract Ballot { - - struct Voter { - uint weight; // weight is accumulated by delegation - bool voted; // if true, that person already voted - address delegate; // person delegated to - uint vote; // index of the voted proposal - } - - struct Proposal { - // If you can limit the length to a certain number of bytes, - // always use one of bytes1 to bytes32 because they are much cheaper - bytes32 name; // short name (up to 32 bytes) - uint voteCount; // number of accumulated votes - } - - address public chairperson; - - mapping(address => Voter) public voters; - - Proposal[] public proposals; - - /** - * @dev Create a new ballot to choose one of 'proposalNames'. - * @param proposalNames names of proposals - */ - constructor(bytes32[] memory proposalNames) { - chairperson = msg.sender; - voters[chairperson].weight = 1; - - for (uint i = 0; i < proposalNames.length; i++) { - // 'Proposal({...})' creates a temporary - // Proposal object and 'proposals.push(...)' - // appends it to the end of 'proposals'. - proposals.push(Proposal({ - name: proposalNames[i], - voteCount: 0 - })); - } - } - - /** - * @dev Give 'voter' the right to vote on this ballot. May only be called by 'chairperson'. - * @param voter address of voter - */ - function giveRightToVote(address voter) public { - require( - msg.sender == chairperson, - "Only chairperson can give right to vote." - ); - require( - !voters[voter].voted, - "The voter already voted." - ); - require(voters[voter].weight == 0); - voters[voter].weight = 1; - } - - /** - * @dev Delegate your vote to the voter 'to'. - * @param to address to which vote is delegated - */ - function delegate(address to) public { - Voter storage sender = voters[msg.sender]; - require(!sender.voted, "You already voted."); - require(to != msg.sender, "Self-delegation is disallowed."); - - while (voters[to].delegate != address(0)) { - to = voters[to].delegate; - - // We found a loop in the delegation, not allowed. - require(to != msg.sender, "Found loop in delegation."); - } - sender.voted = true; - sender.delegate = to; - Voter storage delegate_ = voters[to]; - if (delegate_.voted) { - // If the delegate already voted, - // directly add to the number of votes - proposals[delegate_.vote].voteCount += sender.weight; - } else { - // If the delegate did not vote yet, - // add to her weight. - delegate_.weight += sender.weight; - } - } - - /** - * @dev Give your vote (including votes delegated to you) to proposal 'proposals[proposal].name'. - * @param proposal index of proposal in the proposals array - */ - function vote(uint proposal) public { - Voter storage sender = voters[msg.sender]; - require(sender.weight != 0, "Has no right to vote"); - require(!sender.voted, "Already voted."); - sender.voted = true; - sender.vote = proposal; - - // If 'proposal' is out of the range of the array, - // this will throw automatically and revert all - // changes. - proposals[proposal].voteCount += sender.weight; - } - - /** - * @dev Computes the winning proposal taking all previous votes into account. - * @return winningProposal_ index of winning proposal in the proposals array - */ - function winningProposal() public view - returns (uint winningProposal_) - { - uint winningVoteCount = 0; - for (uint p = 0; p < proposals.length; p++) { - if (proposals[p].voteCount > winningVoteCount) { - winningVoteCount = proposals[p].voteCount; - winningProposal_ = p; - } - } - } - - /** - * @dev Calls winningProposal() function to get the index of the winner contained in the proposals array and then - * @return winnerName_ the name of the winner - */ - function winnerName() public view - returns (bytes32 winnerName_) - { - winnerName_ = proposals[winningProposal()].name; - } -} -` - -const ballotTest = `// SPDX-License-Identifier: GPL-3.0 - -pragma solidity >=0.7.0 <0.9.0; -import "remix_tests.sol"; // this import is automatically injected by Remix. -import "hardhat/console.sol"; -import "../contracts/3_Ballot.sol"; - -contract BallotTest { - - bytes32[] proposalNames; - - Ballot ballotToTest; - function beforeAll () public { - proposalNames.push(bytes32("candidate1")); - ballotToTest = new Ballot(proposalNames); - } - - function checkWinningProposal () public { - console.log("Running checkWinningProposal"); - ballotToTest.vote(0); - Assert.equal(ballotToTest.winningProposal(), uint(0), "proposal at index 0 should be the winning proposal"); - Assert.equal(ballotToTest.winnerName(), bytes32("candidate1"), "candidate1 should be the winner name"); - } - - function checkWinninProposalWithReturnValue () public view returns (bool) { - return ballotToTest.winningProposal() == 0; - } -} -` - -/* eslint-disable no-useless-escape */ -const deployWithWeb3 = ` -// This script can be used to deploy the "Storage" contract using Web3 library. -// Please make sure to compile "./contracts/1_Storage.sol" file before running this script. -// And use Right click -> "Run" from context menu of the file to run the script. Shortcut: Ctrl+Shift+S - -import { deploy } from './web3.ts' - -(async () => { - try { - const result = await deploy('Storage', []) - console.log(\`address: \${result.address\}\`) - } catch (e) { - console.log(e.message) - } -})()` - -const deployWithEthers = ` -// This script can be used to deploy the "Storage" contract using ethers.js library. -// Please make sure to compile "./contracts/1_Storage.sol" file before running this script. -// And use Right click -> "Run" from context menu of the file to run the script. Shortcut: Ctrl+Shift+S - -import { deploy } from './ethers.ts' - -(async () => { - try { - const result = await deploy('Storage', []) - console.log(\`address: \${result.address\}\`) - } catch (e) { - console.log(e.message) - } - })()` - -const libWeb3 = ` -export const deploy = async (contractName: string, arguments: Array, from?: string, gas?: number) => { - - console.log(\`deploying \${contractName\}\`) - // Note that the script needs the ABI which is generated from the compilation artifact. - // Make sure contract is compiled and artifacts are generated - const artifactsPath = \`browser/contracts/artifacts/\${contractName\}.json\` // Change this for different path - - const metadata = JSON.parse(await remix.call('fileManager', 'getFile', artifactsPath)) - - const accounts = await web3.eth.getAccounts() - - let contract = new web3.eth.Contract(metadata.abi) - - contract = contract.deploy({ - data: metadata.data.bytecode.object, - arguments - }) - - const newContractInstance = await contract.send({ - from: from || accounts[0], - gas: gas || 1500000 - }) - return newContractInstance.options -}: Promise` - -const libEthers = ` -export const deploy = async (contractName: string, arguments: Array, from?: string) => { - - console.log(\`deploying \${contractName\}\`) - // Note that the script needs the ABI which is generated from the compilation artifact. - // Make sure contract is compiled and artifacts are generated - const artifactsPath = \`browser/contracts/artifacts/\${contractName\}.json\` // Change this for different path - - const metadata = JSON.parse(await remix.call('fileManager', 'getFile', artifactsPath)) - // 'web3Provider' is a remix global variable object - const signer = (new ethers.providers.Web3Provider(web3Provider)).getSigner() - - let factory = new ethers.ContractFactory(metadata.abi, metadata.data.bytecode.object, signer); - - let contract - if (from) { - contract = await factory.connect(from).deploy(...arguments); - } else { - contract = await factory.deploy(...arguments); - } - - // The contract is NOT deployed yet; we must wait until it is mined - await contract.deployed() - return contract -}: Promise` -/* eslint-enable no-useless-escape */ - -const storageTestJs = `// Right click on the script name and hit "Run" to execute -const { expect } = require("chai"); -const { ethers } = require("hardhat"); - -describe("Storage", function () { - it("test initial value", async function () { - const Storage = await ethers.getContractFactory("Storage"); - const storage = await Storage.deploy(); - await storage.deployed(); - console.log('storage deployed at:'+ storage.address) - expect((await storage.retrieve()).toNumber()).to.equal(0); - }); - it("test updating and retrieving updated value", async function () { - const Storage = await ethers.getContractFactory("Storage"); - const storage = await Storage.deploy(); - await storage.deployed(); - const storage2 = await ethers.getContractAt("Storage", storage.address); - const setValue = await storage2.store(56); - await setValue.wait(); - expect((await storage2.retrieve()).toNumber()).to.equal(56); - }); -});` - -const readme = `REMIX DEFAULT WORKSPACE - -Remix default workspace is present when: -i. Remix loads for the very first time -ii. A new workspace is created -iii. There are no files existing in the File Explorer - -This workspace contains 3 directories: - -1. 'contracts': Holds three contracts with different complexity level, denoted with number prefix in file name. -2. 'scripts': Holds two scripts to deploy a contract. It is explained below. -3. 'tests': Contains one Solidity test file for 'Ballot' contract & one JS test file for 'Storage' contract - -SCRIPTS - -The 'scripts' folder contains two example async/await scripts for deploying the 'Storage' contract. -For the deployment of any other contract, 'contractName' and 'constructorArgs' should be updated (along with other code if required). - -Also, there is a script containing some unit tests for Storage contract inside tests directory. - -To run a script, right click on file name in the file explorer and click 'Run'. Remember, Solidity file must already be compiled. -Output from script will appear in remix terminal. - -Please note, 'require' statement is supported in a limited manner for Remix supported modules. -For now, modules supported by Remix are ethers, web3, swarmgw, chai, remix and hardhat only for hardhat.ethers object/plugin. -For unsupported modules, an error like this will be thrown: ' module require is not supported by Remix IDE will be shown.' -` - -export default { - storage: { name: 'contracts/1_Storage.sol', content: storage }, - owner: { name: 'contracts/2_Owner.sol', content: owner }, - ballot: { name: 'contracts/3_Ballot.sol', content: ballot }, - storageTestJs: { name: 'tests/storage.test.js', content: storageTestJs }, - ballot_test: { name: 'tests/Ballot_test.sol', content: ballotTest }, - deployWithWeb3: { name: 'scripts/deploy_with_web3.ts', content: deployWithWeb3 }, - deployWithEthers: { name: 'scripts/deploy_with_ethers.ts', content: deployWithEthers }, - web3: { name: 'scripts/web3.ts', content: libWeb3 }, - ethers: { name: 'scripts/ethers.ts', content: libEthers }, - readme: { name: 'README.txt', content: readme } -} diff --git a/libs/remix-ui/workspace/src/lib/templates/remixDefault/README.txt b/libs/remix-ui/workspace/src/lib/templates/remixDefault/README.txt new file mode 100644 index 0000000000..a71c4dc2d0 --- /dev/null +++ b/libs/remix-ui/workspace/src/lib/templates/remixDefault/README.txt @@ -0,0 +1,26 @@ +REMIX DEFAULT WORKSPACE + +Remix default workspace is present when: +i. Remix loads for the very first time +ii. A new workspace is created +iii. There are no files existing in the File Explorer + +This workspace contains 3 directories: + +1. 'contracts': Holds three contracts with different complexity level, denoted with number prefix in file name. +2. 'scripts': Holds two scripts to deploy a contract. It is explained below. +3. 'tests': Contains one Solidity test file for 'Ballot' contract & one JS test file for 'Storage' contract + +SCRIPTS + +The 'scripts' folder contains two example async/await scripts for deploying the 'Storage' contract. +For the deployment of any other contract, 'contractName' and 'constructorArgs' should be updated (along with other code if required). + +Also, there is a script containing some unit tests for Storage contract inside tests directory. + +To run a script, right click on file name in the file explorer and click 'Run'. Remember, Solidity file must already be compiled. +Output from script will appear in remix terminal. + +Please note, 'require' statement is supported in a limited manner for Remix supported modules. +For now, modules supported by Remix are ethers, web3, swarmgw, chai, remix and hardhat only for hardhat.ethers object/plugin. +For unsupported modules, an error like this will be thrown: ' module require is not supported by Remix IDE will be shown.' diff --git a/libs/remix-ui/workspace/src/lib/templates/remixDefault/contracts/1_Storage.sol b/libs/remix-ui/workspace/src/lib/templates/remixDefault/contracts/1_Storage.sol new file mode 100644 index 0000000000..6aa93223af --- /dev/null +++ b/libs/remix-ui/workspace/src/lib/templates/remixDefault/contracts/1_Storage.sol @@ -0,0 +1,29 @@ +// SPDX-License-Identifier: GPL-3.0 + +pragma solidity >=0.7.0 <0.9.0; + +/** + * @title Storage + * @dev Store & retrieve value in a variable + * @custom:dev-run-script ./scripts/deploy_with_ethers.ts + */ +contract Storage { + + uint256 number; + + /** + * @dev Store value in variable + * @param num value to store + */ + function store(uint256 num) public { + number = num; + } + + /** + * @dev Return value + * @return value of 'number' + */ + function retrieve() public view returns (uint256){ + return number; + } +} \ No newline at end of file diff --git a/libs/remix-ui/workspace/src/lib/templates/remixDefault/contracts/2_Owner.sol b/libs/remix-ui/workspace/src/lib/templates/remixDefault/contracts/2_Owner.sol new file mode 100644 index 0000000000..e6bc652c0f --- /dev/null +++ b/libs/remix-ui/workspace/src/lib/templates/remixDefault/contracts/2_Owner.sol @@ -0,0 +1,54 @@ +// SPDX-License-Identifier: GPL-3.0 + +pragma solidity >=0.7.0 <0.9.0; + +import "hardhat/console.sol"; + +/** + * @title Owner + * @dev Set & change owner + */ +contract Owner { + + address private owner; + + // event for EVM logging + event OwnerSet(address indexed oldOwner, address indexed newOwner); + + // modifier to check if caller is owner + modifier isOwner() { + // If the first argument of 'require' evaluates to 'false', execution terminates and all + // changes to the state and to Ether balances are reverted. + // This used to consume all gas in old EVM versions, but not anymore. + // It is often a good idea to use 'require' to check if functions are called correctly. + // As a second argument, you can also provide an explanation about what went wrong. + require(msg.sender == owner, "Caller is not owner"); + _; + } + + /** + * @dev Set contract deployer as owner + */ + constructor() { + console.log("Owner contract deployed by:", msg.sender); + owner = msg.sender; // 'msg.sender' is sender of current call, contract deployer for a constructor + emit OwnerSet(address(0), owner); + } + + /** + * @dev Change owner + * @param newOwner address of new owner + */ + function changeOwner(address newOwner) public isOwner { + emit OwnerSet(owner, newOwner); + owner = newOwner; + } + + /** + * @dev Return owner address + * @return address of owner + */ + function getOwner() external view returns (address) { + return owner; + } +} \ No newline at end of file diff --git a/libs/remix-ui/workspace/src/lib/templates/remixDefault/contracts/3_Ballot.sol b/libs/remix-ui/workspace/src/lib/templates/remixDefault/contracts/3_Ballot.sol new file mode 100644 index 0000000000..09fab7bc15 --- /dev/null +++ b/libs/remix-ui/workspace/src/lib/templates/remixDefault/contracts/3_Ballot.sol @@ -0,0 +1,138 @@ +// SPDX-License-Identifier: GPL-3.0 + +pragma solidity >=0.7.0 <0.9.0; + +/** + * @title Ballot + * @dev Implements voting process along with vote delegation + */ +contract Ballot { + + struct Voter { + uint weight; // weight is accumulated by delegation + bool voted; // if true, that person already voted + address delegate; // person delegated to + uint vote; // index of the voted proposal + } + + struct Proposal { + // If you can limit the length to a certain number of bytes, + // always use one of bytes1 to bytes32 because they are much cheaper + bytes32 name; // short name (up to 32 bytes) + uint voteCount; // number of accumulated votes + } + + address public chairperson; + + mapping(address => Voter) public voters; + + Proposal[] public proposals; + + /** + * @dev Create a new ballot to choose one of 'proposalNames'. + * @param proposalNames names of proposals + */ + constructor(bytes32[] memory proposalNames) { + chairperson = msg.sender; + voters[chairperson].weight = 1; + + for (uint i = 0; i < proposalNames.length; i++) { + // 'Proposal({...})' creates a temporary + // Proposal object and 'proposals.push(...)' + // appends it to the end of 'proposals'. + proposals.push(Proposal({ + name: proposalNames[i], + voteCount: 0 + })); + } + } + + /** + * @dev Give 'voter' the right to vote on this ballot. May only be called by 'chairperson'. + * @param voter address of voter + */ + function giveRightToVote(address voter) public { + require( + msg.sender == chairperson, + "Only chairperson can give right to vote." + ); + require( + !voters[voter].voted, + "The voter already voted." + ); + require(voters[voter].weight == 0); + voters[voter].weight = 1; + } + + /** + * @dev Delegate your vote to the voter 'to'. + * @param to address to which vote is delegated + */ + function delegate(address to) public { + Voter storage sender = voters[msg.sender]; + require(!sender.voted, "You already voted."); + require(to != msg.sender, "Self-delegation is disallowed."); + + while (voters[to].delegate != address(0)) { + to = voters[to].delegate; + + // We found a loop in the delegation, not allowed. + require(to != msg.sender, "Found loop in delegation."); + } + sender.voted = true; + sender.delegate = to; + Voter storage delegate_ = voters[to]; + if (delegate_.voted) { + // If the delegate already voted, + // directly add to the number of votes + proposals[delegate_.vote].voteCount += sender.weight; + } else { + // If the delegate did not vote yet, + // add to her weight. + delegate_.weight += sender.weight; + } + } + + /** + * @dev Give your vote (including votes delegated to you) to proposal 'proposals[proposal].name'. + * @param proposal index of proposal in the proposals array + */ + function vote(uint proposal) public { + Voter storage sender = voters[msg.sender]; + require(sender.weight != 0, "Has no right to vote"); + require(!sender.voted, "Already voted."); + sender.voted = true; + sender.vote = proposal; + + // If 'proposal' is out of the range of the array, + // this will throw automatically and revert all + // changes. + proposals[proposal].voteCount += sender.weight; + } + + /** + * @dev Computes the winning proposal taking all previous votes into account. + * @return winningProposal_ index of winning proposal in the proposals array + */ + function winningProposal() public view + returns (uint winningProposal_) + { + uint winningVoteCount = 0; + for (uint p = 0; p < proposals.length; p++) { + if (proposals[p].voteCount > winningVoteCount) { + winningVoteCount = proposals[p].voteCount; + winningProposal_ = p; + } + } + } + + /** + * @dev Calls winningProposal() function to get the index of the winner contained in the proposals array and then + * @return winnerName_ the name of the winner + */ + function winnerName() public view + returns (bytes32 winnerName_) + { + winnerName_ = proposals[winningProposal()].name; + } +} \ No newline at end of file diff --git a/libs/remix-ui/workspace/src/lib/templates/remixDefault/index.ts b/libs/remix-ui/workspace/src/lib/templates/remixDefault/index.ts new file mode 100644 index 0000000000..7140e4a49a --- /dev/null +++ b/libs/remix-ui/workspace/src/lib/templates/remixDefault/index.ts @@ -0,0 +1,13 @@ +export default { + 'contracts/1_Storage.sol': require('./contracts/1_Storage.sol').default, + 'contracts/2_Owner.sol': require('./contracts/2_Owner.sol').default, + 'contracts/3_Ballot.sol': require('./contracts/3_Ballot.sol').default, + 'scripts/deploy_with_ethers.ts': require('./scripts/deploy_with_ethers.ts').default, + 'scripts/deploy_with_web3.ts': require('./scripts/deploy_with_web3.ts').default, + 'scripts/ethers.ts': require('./scripts/ethers.ts').default, + 'scripts/web3.ts': require('./scripts/web3.ts').default, + 'tests/Ballot_test.sol': require('./tests/Ballot_test.sol').default, + 'tests/storage.test.js': require('./tests/storage.test.js').default, + 'README.txt': require('./README.txt').default, + +} \ No newline at end of file diff --git a/libs/remix-ui/workspace/src/lib/templates/remixDefault/scripts/deploy_with_ethers.ts b/libs/remix-ui/workspace/src/lib/templates/remixDefault/scripts/deploy_with_ethers.ts new file mode 100644 index 0000000000..2166c05842 --- /dev/null +++ b/libs/remix-ui/workspace/src/lib/templates/remixDefault/scripts/deploy_with_ethers.ts @@ -0,0 +1,14 @@ +// This script can be used to deploy the "Storage" contract using ethers.js library. +// Please make sure to compile "./contracts/1_Storage.sol" file before running this script. +// And use Right click -> "Run" from context menu of the file to run the script. Shortcut: Ctrl+Shift+S + +import { deploy } from './ethers.ts' + +(async () => { + try { + const result = await deploy('Storage', []) + console.log(`address: ${result.address}`) + } catch (e) { + console.log(e.message) + } + })() \ No newline at end of file diff --git a/libs/remix-ui/workspace/src/lib/templates/remixDefault/scripts/deploy_with_web3.ts b/libs/remix-ui/workspace/src/lib/templates/remixDefault/scripts/deploy_with_web3.ts new file mode 100644 index 0000000000..d6fc672929 --- /dev/null +++ b/libs/remix-ui/workspace/src/lib/templates/remixDefault/scripts/deploy_with_web3.ts @@ -0,0 +1,14 @@ +// This script can be used to deploy the "Storage" contract using Web3 library. +// Please make sure to compile "./contracts/1_Storage.sol" file before running this script. +// And use Right click -> "Run" from context menu of the file to run the script. Shortcut: Ctrl+Shift+S + +import { deploy } from './web3.ts' + +(async () => { + try { + const result = await deploy('Storage', []) + console.log(`address: ${result.address}`) + } catch (e) { + console.log(e.message) + } +})() \ No newline at end of file diff --git a/libs/remix-ui/workspace/src/lib/templates/remixDefault/scripts/ethers.ts b/libs/remix-ui/workspace/src/lib/templates/remixDefault/scripts/ethers.ts new file mode 100644 index 0000000000..be75c474c3 --- /dev/null +++ b/libs/remix-ui/workspace/src/lib/templates/remixDefault/scripts/ethers.ts @@ -0,0 +1,24 @@ +export const deploy = async (contractName: string, args: Array, from?: string): Promise => { + + console.log(`deploying ${contractName}`) + // Note that the script needs the ABI which is generated from the compilation artifact. + // Make sure contract is compiled and artifacts are generated + const artifactsPath = `browser/contracts/artifacts/${contractName}.json` // Change this for different path + + const metadata = JSON.parse(await remix.call('fileManager', 'getFile', artifactsPath)) + // 'web3Provider' is a remix global variable object + const signer = (new ethers.providers.Web3Provider(web3Provider)).getSigner() + + let factory = new ethers.ContractFactory(metadata.abi, metadata.data.bytecode.object, signer); + + let contract + if (from) { + contract = await factory.connect(from).deploy(...args); + } else { + contract = await factory.deploy(...arguments); + } + + // The contract is NOT deployed yet; we must wait until it is mined + await contract.deployed() + return contract +} \ No newline at end of file diff --git a/libs/remix-ui/workspace/src/lib/templates/remixDefault/scripts/web3.ts b/libs/remix-ui/workspace/src/lib/templates/remixDefault/scripts/web3.ts new file mode 100644 index 0000000000..7b9ee72236 --- /dev/null +++ b/libs/remix-ui/workspace/src/lib/templates/remixDefault/scripts/web3.ts @@ -0,0 +1,24 @@ +export const deploy = async (contractName: string, args: Array, from?: string, gas?: number): Promise => { + + console.log(`deploying ${contractName}`) + // Note that the script needs the ABI which is generated from the compilation artifact. + // Make sure contract is compiled and artifacts are generated + const artifactsPath = `browser/contracts/artifacts/${contractName}.json` // Change this for different path + + const metadata = JSON.parse(await remix.call('fileManager', 'getFile', artifactsPath)) + + const accounts = await web3.eth.getAccounts() + + let contract = new web3.eth.Contract(metadata.abi) + + contract = contract.deploy({ + data: metadata.data.bytecode.object, + arguments: args + }) + + const newContractInstance = await contract.send({ + from: from || accounts[0], + gas: gas || 1500000 + }) + return newContractInstance.options +} \ No newline at end of file diff --git a/libs/remix-ui/workspace/src/lib/templates/remixDefault/tests/Ballot_test.sol b/libs/remix-ui/workspace/src/lib/templates/remixDefault/tests/Ballot_test.sol new file mode 100644 index 0000000000..f3b81075f2 --- /dev/null +++ b/libs/remix-ui/workspace/src/lib/templates/remixDefault/tests/Ballot_test.sol @@ -0,0 +1,28 @@ +// SPDX-License-Identifier: GPL-3.0 + +pragma solidity >=0.7.0 <0.9.0; +import "remix_tests.sol"; // this import is automatically injected by Remix. +import "hardhat/console.sol"; +import "../contracts/3_Ballot.sol"; + +contract BallotTest { + + bytes32[] proposalNames; + + Ballot ballotToTest; + function beforeAll () public { + proposalNames.push(bytes32("candidate1")); + ballotToTest = new Ballot(proposalNames); + } + + function checkWinningProposal () public { + console.log("Running checkWinningProposal"); + ballotToTest.vote(0); + Assert.equal(ballotToTest.winningProposal(), uint(0), "proposal at index 0 should be the winning proposal"); + Assert.equal(ballotToTest.winnerName(), bytes32("candidate1"), "candidate1 should be the winner name"); + } + + function checkWinninProposalWithReturnValue () public view returns (bool) { + return ballotToTest.winningProposal() == 0; + } +} \ No newline at end of file diff --git a/libs/remix-ui/workspace/src/lib/templates/remixDefault/tests/storage.test.js b/libs/remix-ui/workspace/src/lib/templates/remixDefault/tests/storage.test.js new file mode 100644 index 0000000000..aa14b35a00 --- /dev/null +++ b/libs/remix-ui/workspace/src/lib/templates/remixDefault/tests/storage.test.js @@ -0,0 +1,22 @@ +// Right click on the script name and hit "Run" to execute +const { expect } = require("chai"); +const { ethers } = require("hardhat"); + +describe("Storage", function () { + it("test initial value", async function () { + const Storage = await ethers.getContractFactory("Storage"); + const storage = await Storage.deploy(); + await storage.deployed(); + console.log('storage deployed at:'+ storage.address) + expect((await storage.retrieve()).toNumber()).to.equal(0); + }); + it("test updating and retrieving updated value", async function () { + const Storage = await ethers.getContractFactory("Storage"); + const storage = await Storage.deploy(); + await storage.deployed(); + const storage2 = await ethers.getContractAt("Storage", storage.address); + const setValue = await storage2.store(56); + await setValue.wait(); + expect((await storage2.retrieve()).toNumber()).to.equal(56); + }); +}); \ No newline at end of file From 534da6ae504c7b576f6bc09e3c11488b4dcea9fa Mon Sep 17 00:00:00 2001 From: Aniket-Engg Date: Fri, 6 May 2022 17:57:28 +0530 Subject: [PATCH 02/16] default ws with NPM module --- libs/remix-ui/workspace/src/lib/actions/workspace.ts | 3 ++- libs/remix-ui/workspace/src/lib/templates/index.ts | 1 - libs/remix-ws-templates/index.js | 3 +++ libs/remix-ws-templates/package.json | 11 +++++++++++ .../remixDefault/README.txt | 0 .../remixDefault/contracts/1_Storage.sol | 0 .../remixDefault/contracts/2_Owner.sol | 0 .../remixDefault/contracts/3_Ballot.sol | 0 .../remixDefault/index.ts | 0 .../remixDefault/scripts/deploy_with_ethers.ts | 0 .../remixDefault/scripts/deploy_with_web3.ts | 0 .../remixDefault/scripts/ethers.ts | 0 .../remixDefault/scripts/web3.ts | 0 .../remixDefault/tests/Ballot_test.sol | 0 .../remixDefault/tests/storage.test.js | 0 package.json | 1 + 16 files changed, 17 insertions(+), 2 deletions(-) create mode 100644 libs/remix-ws-templates/index.js create mode 100644 libs/remix-ws-templates/package.json rename libs/{remix-ui/workspace/src/lib/templates => remix-ws-templates}/remixDefault/README.txt (100%) rename libs/{remix-ui/workspace/src/lib/templates => remix-ws-templates}/remixDefault/contracts/1_Storage.sol (100%) rename libs/{remix-ui/workspace/src/lib/templates => remix-ws-templates}/remixDefault/contracts/2_Owner.sol (100%) rename libs/{remix-ui/workspace/src/lib/templates => remix-ws-templates}/remixDefault/contracts/3_Ballot.sol (100%) rename libs/{remix-ui/workspace/src/lib/templates => remix-ws-templates}/remixDefault/index.ts (100%) rename libs/{remix-ui/workspace/src/lib/templates => remix-ws-templates}/remixDefault/scripts/deploy_with_ethers.ts (100%) rename libs/{remix-ui/workspace/src/lib/templates => remix-ws-templates}/remixDefault/scripts/deploy_with_web3.ts (100%) rename libs/{remix-ui/workspace/src/lib/templates => remix-ws-templates}/remixDefault/scripts/ethers.ts (100%) rename libs/{remix-ui/workspace/src/lib/templates => remix-ws-templates}/remixDefault/scripts/web3.ts (100%) rename libs/{remix-ui/workspace/src/lib/templates => remix-ws-templates}/remixDefault/tests/Ballot_test.sol (100%) rename libs/{remix-ui/workspace/src/lib/templates => remix-ws-templates}/remixDefault/tests/storage.test.js (100%) diff --git a/libs/remix-ui/workspace/src/lib/actions/workspace.ts b/libs/remix-ui/workspace/src/lib/actions/workspace.ts index 724db395cd..1240b790c8 100644 --- a/libs/remix-ui/workspace/src/lib/actions/workspace.ts +++ b/libs/remix-ui/workspace/src/lib/actions/workspace.ts @@ -151,7 +151,8 @@ export const loadWorkspacePreset = async (template: WorkspaceTemplate = 'remixDe default: try { - const templateWithContent = await import('../templates') + // const templateWithContent = await import('../templates') + const templateWithContent = require('remix-ws-templates') const templateList = Object.keys(templateWithContent) if (!templateList.includes(template)) break const files = templateWithContent[template] diff --git a/libs/remix-ui/workspace/src/lib/templates/index.ts b/libs/remix-ui/workspace/src/lib/templates/index.ts index 7433460c53..0fff14d78b 100644 --- a/libs/remix-ui/workspace/src/lib/templates/index.ts +++ b/libs/remix-ui/workspace/src/lib/templates/index.ts @@ -1,3 +1,2 @@ -export { default as remixDefault } from './remixDefault' export { default as erc20 } from './erc20' export { default as blank } from './blank' diff --git a/libs/remix-ws-templates/index.js b/libs/remix-ws-templates/index.js new file mode 100644 index 0000000000..949ea8cdda --- /dev/null +++ b/libs/remix-ws-templates/index.js @@ -0,0 +1,3 @@ +export { default as remixDefault } from './remixDefault' +// export { default as erc20 } from './erc20' +// export { default as blank } from './blank' diff --git a/libs/remix-ws-templates/package.json b/libs/remix-ws-templates/package.json new file mode 100644 index 0000000000..559b906d74 --- /dev/null +++ b/libs/remix-ws-templates/package.json @@ -0,0 +1,11 @@ +{ + "name": "remix-ws-templates", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "author": "Aniket-Engg", + "license": "ISC" +} diff --git a/libs/remix-ui/workspace/src/lib/templates/remixDefault/README.txt b/libs/remix-ws-templates/remixDefault/README.txt similarity index 100% rename from libs/remix-ui/workspace/src/lib/templates/remixDefault/README.txt rename to libs/remix-ws-templates/remixDefault/README.txt diff --git a/libs/remix-ui/workspace/src/lib/templates/remixDefault/contracts/1_Storage.sol b/libs/remix-ws-templates/remixDefault/contracts/1_Storage.sol similarity index 100% rename from libs/remix-ui/workspace/src/lib/templates/remixDefault/contracts/1_Storage.sol rename to libs/remix-ws-templates/remixDefault/contracts/1_Storage.sol diff --git a/libs/remix-ui/workspace/src/lib/templates/remixDefault/contracts/2_Owner.sol b/libs/remix-ws-templates/remixDefault/contracts/2_Owner.sol similarity index 100% rename from libs/remix-ui/workspace/src/lib/templates/remixDefault/contracts/2_Owner.sol rename to libs/remix-ws-templates/remixDefault/contracts/2_Owner.sol diff --git a/libs/remix-ui/workspace/src/lib/templates/remixDefault/contracts/3_Ballot.sol b/libs/remix-ws-templates/remixDefault/contracts/3_Ballot.sol similarity index 100% rename from libs/remix-ui/workspace/src/lib/templates/remixDefault/contracts/3_Ballot.sol rename to libs/remix-ws-templates/remixDefault/contracts/3_Ballot.sol diff --git a/libs/remix-ui/workspace/src/lib/templates/remixDefault/index.ts b/libs/remix-ws-templates/remixDefault/index.ts similarity index 100% rename from libs/remix-ui/workspace/src/lib/templates/remixDefault/index.ts rename to libs/remix-ws-templates/remixDefault/index.ts diff --git a/libs/remix-ui/workspace/src/lib/templates/remixDefault/scripts/deploy_with_ethers.ts b/libs/remix-ws-templates/remixDefault/scripts/deploy_with_ethers.ts similarity index 100% rename from libs/remix-ui/workspace/src/lib/templates/remixDefault/scripts/deploy_with_ethers.ts rename to libs/remix-ws-templates/remixDefault/scripts/deploy_with_ethers.ts diff --git a/libs/remix-ui/workspace/src/lib/templates/remixDefault/scripts/deploy_with_web3.ts b/libs/remix-ws-templates/remixDefault/scripts/deploy_with_web3.ts similarity index 100% rename from libs/remix-ui/workspace/src/lib/templates/remixDefault/scripts/deploy_with_web3.ts rename to libs/remix-ws-templates/remixDefault/scripts/deploy_with_web3.ts diff --git a/libs/remix-ui/workspace/src/lib/templates/remixDefault/scripts/ethers.ts b/libs/remix-ws-templates/remixDefault/scripts/ethers.ts similarity index 100% rename from libs/remix-ui/workspace/src/lib/templates/remixDefault/scripts/ethers.ts rename to libs/remix-ws-templates/remixDefault/scripts/ethers.ts diff --git a/libs/remix-ui/workspace/src/lib/templates/remixDefault/scripts/web3.ts b/libs/remix-ws-templates/remixDefault/scripts/web3.ts similarity index 100% rename from libs/remix-ui/workspace/src/lib/templates/remixDefault/scripts/web3.ts rename to libs/remix-ws-templates/remixDefault/scripts/web3.ts diff --git a/libs/remix-ui/workspace/src/lib/templates/remixDefault/tests/Ballot_test.sol b/libs/remix-ws-templates/remixDefault/tests/Ballot_test.sol similarity index 100% rename from libs/remix-ui/workspace/src/lib/templates/remixDefault/tests/Ballot_test.sol rename to libs/remix-ws-templates/remixDefault/tests/Ballot_test.sol diff --git a/libs/remix-ui/workspace/src/lib/templates/remixDefault/tests/storage.test.js b/libs/remix-ws-templates/remixDefault/tests/storage.test.js similarity index 100% rename from libs/remix-ui/workspace/src/lib/templates/remixDefault/tests/storage.test.js rename to libs/remix-ws-templates/remixDefault/tests/storage.test.js diff --git a/package.json b/package.json index fb127e9f7f..1c8488d9bd 100644 --- a/package.json +++ b/package.json @@ -198,6 +198,7 @@ "react-draggable": "^4.4.4", "react-tabs": "^3.2.2", "regenerator-runtime": "0.13.7", + "remix-ws-templates": "file:libs/remix-ws-templates", "selenium": "^2.20.0", "signale": "^1.4.0", "string-similarity": "^4.0.4", From 45473e7a0d7caf3c78a475a2c346e5f1aebf1d88 Mon Sep 17 00:00:00 2001 From: Aniket-Engg Date: Mon, 9 May 2022 10:58:13 +0530 Subject: [PATCH 03/16] linting fix --- libs/remix-ui/workspace/src/lib/actions/workspace.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/remix-ui/workspace/src/lib/actions/workspace.ts b/libs/remix-ui/workspace/src/lib/actions/workspace.ts index 1240b790c8..20b3ca8d02 100644 --- a/libs/remix-ui/workspace/src/lib/actions/workspace.ts +++ b/libs/remix-ui/workspace/src/lib/actions/workspace.ts @@ -152,7 +152,7 @@ export const loadWorkspacePreset = async (template: WorkspaceTemplate = 'remixDe default: try { // const templateWithContent = await import('../templates') - const templateWithContent = require('remix-ws-templates') + const templateWithContent = await import('remix-ws-templates') const templateList = Object.keys(templateWithContent) if (!templateList.includes(template)) break const files = templateWithContent[template] From 953f05fa86f2992b974acac36c6c11c81ee3d734 Mon Sep 17 00:00:00 2001 From: Aniket-Engg Date: Mon, 9 May 2022 16:35:33 +0530 Subject: [PATCH 04/16] plugin api e2e fix --- apps/remix-ide-e2e/src/tests/plugin_api.ts | 4 ++-- libs/remix-ws-templates/remixDefault/{index.ts => index.js} | 0 2 files changed, 2 insertions(+), 2 deletions(-) rename libs/remix-ws-templates/remixDefault/{index.ts => index.js} (100%) diff --git a/apps/remix-ide-e2e/src/tests/plugin_api.ts b/apps/remix-ide-e2e/src/tests/plugin_api.ts index 8a7ed9a9ec..d0cdfacf13 100644 --- a/apps/remix-ide-e2e/src/tests/plugin_api.ts +++ b/apps/remix-ide-e2e/src/tests/plugin_api.ts @@ -230,7 +230,7 @@ module.exports = { }, 'Should get current files #group7': async function (browser: NightwatchBrowser) { - await clickAndCheckLog(browser, 'fileManager:readdir', { contracts: { isDirectory: true }, tests: { isDirectory: true }, scripts: { isDirectory: true }, 'README.txt': { isDirectory: false } }, null, '/') + await clickAndCheckLog(browser, 'fileManager:readdir', { contracts: { isDirectory: true }, scripts: { isDirectory: true }, tests: { isDirectory: true }, 'README.txt': { isDirectory: false } }, null, '/') }, 'Should throw error on current file #group7': async function (browser: NightwatchBrowser) { await clickAndCheckLog(browser, 'fileManager:getCurrentFile', 'Error from IDE : Error: No such file or directory No file selected', null, null) @@ -285,7 +285,7 @@ module.exports = { 'Should create workspace #group2': async function (browser: NightwatchBrowser) { await clickAndCheckLog(browser, 'filePanel:createWorkspace', null, null, 'testspace') await clickAndCheckLog(browser, 'filePanel:getCurrentWorkspace', { name: 'testspace', isLocalhost: false, absolutePath: '.workspaces/testspace' }, null, null) - await clickAndCheckLog(browser, 'fileManager:readdir', { contracts: { isDirectory: true }, tests: { isDirectory: true }, scripts: { isDirectory: true }, 'README.txt': { isDirectory: false } }, null, null) + await clickAndCheckLog(browser, 'fileManager:readdir', { contracts: { isDirectory: true }, scripts: { isDirectory: true }, tests: { isDirectory: true }, 'README.txt': { isDirectory: false } }, null, null) }, 'Should get all workspaces #group2': async function (browser: NightwatchBrowser) { await clickAndCheckLog(browser, 'filePanel:getWorkspaces', ['default_workspace', 'emptyworkspace', 'testspace'], null, null) diff --git a/libs/remix-ws-templates/remixDefault/index.ts b/libs/remix-ws-templates/remixDefault/index.js similarity index 100% rename from libs/remix-ws-templates/remixDefault/index.ts rename to libs/remix-ws-templates/remixDefault/index.js From 0a51ed95fc68f73e1a0f6d8eeea68f25e501c783 Mon Sep 17 00:00:00 2001 From: Aniket-Engg Date: Tue, 10 May 2022 11:35:13 +0530 Subject: [PATCH 05/16] erc20 template --- .../erc20/contracts/SampleERC20.sol | 15 ++++++++++++ libs/remix-ws-templates/erc20/index.js | 8 +++++++ .../erc20/scripts/deploy_with_ethers.ts | 10 ++++++++ .../erc20/scripts/deploy_with_web3.ts | 10 ++++++++ .../erc20/scripts/ethers.ts | 24 +++++++++++++++++++ libs/remix-ws-templates/erc20/scripts/web3.ts | 24 +++++++++++++++++++ .../erc20/tests/SampleERC20_test.sol | 18 ++++++++++++++ libs/remix-ws-templates/index.js | 2 +- 8 files changed, 110 insertions(+), 1 deletion(-) create mode 100644 libs/remix-ws-templates/erc20/contracts/SampleERC20.sol create mode 100644 libs/remix-ws-templates/erc20/index.js create mode 100644 libs/remix-ws-templates/erc20/scripts/deploy_with_ethers.ts create mode 100644 libs/remix-ws-templates/erc20/scripts/deploy_with_web3.ts create mode 100644 libs/remix-ws-templates/erc20/scripts/ethers.ts create mode 100644 libs/remix-ws-templates/erc20/scripts/web3.ts create mode 100644 libs/remix-ws-templates/erc20/tests/SampleERC20_test.sol diff --git a/libs/remix-ws-templates/erc20/contracts/SampleERC20.sol b/libs/remix-ws-templates/erc20/contracts/SampleERC20.sol new file mode 100644 index 0000000000..23aa792466 --- /dev/null +++ b/libs/remix-ws-templates/erc20/contracts/SampleERC20.sol @@ -0,0 +1,15 @@ +// SPDX-License-Identifier: GPL-3.0 + +pragma solidity >=0.7.0 <0.9.0; + +/** + * @title SampleERC20 + * @dev Create a sample ERC20 standard token + */ + +import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; + +contract SampleERC20 is ERC20 { + + constructor(string memory tokenName, string memory tokenSymbol) ERC20(tokenName, tokenSymbol) {} +} \ No newline at end of file diff --git a/libs/remix-ws-templates/erc20/index.js b/libs/remix-ws-templates/erc20/index.js new file mode 100644 index 0000000000..e3a5cbf078 --- /dev/null +++ b/libs/remix-ws-templates/erc20/index.js @@ -0,0 +1,8 @@ +export default { + 'contracts/SampleERC20.sol': require('./contracts/SampleERC20.sol').default, + 'scripts/deploy_with_ethers.ts': require('./scripts/deploy_with_ethers.ts').default, + 'scripts/deploy_with_web3.ts': require('./scripts/deploy_with_web3.ts').default, + 'scripts/ethers.ts': require('./scripts/ethers.ts').default, + 'scripts/web3.ts': require('./scripts/web3.ts').default, + 'tests/SampleERC20_test.sol': require('./tests/SampleERC20_test.sol').default +} \ No newline at end of file diff --git a/libs/remix-ws-templates/erc20/scripts/deploy_with_ethers.ts b/libs/remix-ws-templates/erc20/scripts/deploy_with_ethers.ts new file mode 100644 index 0000000000..dc2f5286c4 --- /dev/null +++ b/libs/remix-ws-templates/erc20/scripts/deploy_with_ethers.ts @@ -0,0 +1,10 @@ +import { deploy } from './ethers.ts' + +(async () => { + try { + const result = await deploy('SampleERC20', ['testToken', 'TST']) + console.log(`address: ${result.address}`) + } catch (e) { + console.log(e.message) + } + })() \ No newline at end of file diff --git a/libs/remix-ws-templates/erc20/scripts/deploy_with_web3.ts b/libs/remix-ws-templates/erc20/scripts/deploy_with_web3.ts new file mode 100644 index 0000000000..e6dddf65f0 --- /dev/null +++ b/libs/remix-ws-templates/erc20/scripts/deploy_with_web3.ts @@ -0,0 +1,10 @@ +import { deploy } from './web3.ts' + +(async () => { + try { + const result = await deploy('SampleERC20', ['testToken', 'TST']) + console.log(`address: ${result.address}`) + } catch (e) { + console.log(e.message) + } +})() \ No newline at end of file diff --git a/libs/remix-ws-templates/erc20/scripts/ethers.ts b/libs/remix-ws-templates/erc20/scripts/ethers.ts new file mode 100644 index 0000000000..16fbd8c4d7 --- /dev/null +++ b/libs/remix-ws-templates/erc20/scripts/ethers.ts @@ -0,0 +1,24 @@ +export const deploy = async (contractName: string, args: Array, from?: string) => { + + console.log(`deploying ${contractName}`) + // Note that the script needs the ABI which is generated from the compilation artifact. + // Make sure contract is compiled and artifacts are generated + const artifactsPath = `browser/contracts/artifacts/${contractName}.json` + + const metadata = JSON.parse(await remix.call('fileManager', 'getFile', artifactsPath)) + // 'web3Provider' is a remix global variable object + const signer = (new ethers.providers.Web3Provider(web3Provider)).getSigner() + + let factory = new ethers.ContractFactory(metadata.abi, metadata.data.bytecode.object, signer); + + let contract + if (from) { + contract = await factory.connect(from).deploy(...args); + } else { + contract = await factory.deploy(...args); + } + + // The contract is NOT deployed yet; we must wait until it is mined + await contract.deployed() + return contract +}: Promise \ No newline at end of file diff --git a/libs/remix-ws-templates/erc20/scripts/web3.ts b/libs/remix-ws-templates/erc20/scripts/web3.ts new file mode 100644 index 0000000000..6fc26b2030 --- /dev/null +++ b/libs/remix-ws-templates/erc20/scripts/web3.ts @@ -0,0 +1,24 @@ +export const deploy = async (contractName: string, args: Array, from?: string, gas?: number) => { + + console.log(`deploying ${contractName}`) + // Note that the script needs the ABI which is generated from the compilation artifact. + // Make sure contract is compiled and artifacts are generated + const artifactsPath = `browser/contracts/artifacts/${contractName}.json` + + const metadata = JSON.parse(await remix.call('fileManager', 'getFile', artifactsPath)) + + const accounts = await web3.eth.getAccounts() + + let contract = new web3.eth.Contract(metadata.abi) + + contract = contract.deploy({ + data: metadata.data.bytecode.object, + arguments: args + }) + + const newContractInstance = await contract.send({ + from: from || accounts[0], + gas: gas || 1500000 + }) + return newContractInstance.options +}: Promise \ No newline at end of file diff --git a/libs/remix-ws-templates/erc20/tests/SampleERC20_test.sol b/libs/remix-ws-templates/erc20/tests/SampleERC20_test.sol new file mode 100644 index 0000000000..45087c816c --- /dev/null +++ b/libs/remix-ws-templates/erc20/tests/SampleERC20_test.sol @@ -0,0 +1,18 @@ +// SPDX-License-Identifier: GPL-3.0 + +pragma solidity >=0.7.0 <0.9.0; +import "remix_tests.sol"; +import "../contracts/SampleERC20.sol"; + +contract SampleERC20Test { + + SampleERC20 s; + function beforeAll () public { + s = new SampleERC20("TestToken", "TST"); + } + + function testTokenNameAndSymbol () public { + Assert.equal(s.name(), "TestToken", "token name did not match"); + Assert.equal(s.symbol(), "TST", "token symbol did not match"); + } +} \ No newline at end of file diff --git a/libs/remix-ws-templates/index.js b/libs/remix-ws-templates/index.js index 949ea8cdda..a076cfa671 100644 --- a/libs/remix-ws-templates/index.js +++ b/libs/remix-ws-templates/index.js @@ -1,3 +1,3 @@ export { default as remixDefault } from './remixDefault' -// export { default as erc20 } from './erc20' +export { default as erc20 } from './erc20' // export { default as blank } from './blank' From f6c447ff8dbfa621caf33cbd57669fc53459f1cc Mon Sep 17 00:00:00 2001 From: Aniket-Engg Date: Wed, 11 May 2022 12:54:05 +0530 Subject: [PATCH 06/16] raw loader --- apps/remix-ide/webpack.config.js | 2 + .../workspace/src/lib/actions/workspace.ts | 11 +++- libs/remix-ws-templates/.eslintrc | 12 ++++ libs/remix-ws-templates/README.md | 7 +++ libs/remix-ws-templates/erc20/index.js | 8 --- libs/remix-ws-templates/index.js | 3 - libs/remix-ws-templates/package.json | 20 +++---- libs/remix-ws-templates/src/index.ts | 3 + .../src/templates/blank/index.ts | 1 + .../erc20/contracts/SampleERC20.sol | 0 .../src/templates/erc20/index.ts | 18 ++++++ .../erc20/scripts/deploy_with_ethers.ts | 2 +- .../erc20/scripts/deploy_with_web3.ts | 2 +- .../templates}/erc20/scripts/ethers.ts | 9 ++- .../{ => src/templates}/erc20/scripts/web3.ts | 6 +- .../erc20/tests/SampleERC20_test.sol | 4 +- .../templates}/remixDefault/README.txt | 2 +- .../remixDefault/contracts/1_Storage.sol | 0 .../remixDefault/contracts/2_Owner.sol | 8 +-- .../remixDefault/contracts/3_Ballot.sol | 4 +- .../templates/remixDefault/index.ts} | 0 .../scripts/deploy_with_ethers.ts | 2 +- .../remixDefault/scripts/deploy_with_web3.ts | 2 +- .../templates}/remixDefault/scripts/ethers.ts | 4 +- .../templates}/remixDefault/scripts/web3.ts | 2 +- .../remixDefault/tests/Ballot_test.sol | 8 +-- .../remixDefault/tests/storage.test.js | 0 libs/remix-ws-templates/src/types/index.d.ts | 4 ++ libs/remix-ws-templates/tsconfig.json | 7 +++ libs/remix-ws-templates/tsconfig.lib.json | 15 +++++ nx.json | 5 +- tsconfig.base.json | 15 ++++- workspace.json | 57 ++++++++++++++----- 33 files changed, 175 insertions(+), 68 deletions(-) create mode 100644 libs/remix-ws-templates/.eslintrc create mode 100644 libs/remix-ws-templates/README.md delete mode 100644 libs/remix-ws-templates/erc20/index.js delete mode 100644 libs/remix-ws-templates/index.js create mode 100644 libs/remix-ws-templates/src/index.ts create mode 100644 libs/remix-ws-templates/src/templates/blank/index.ts rename libs/remix-ws-templates/{ => src/templates}/erc20/contracts/SampleERC20.sol (100%) create mode 100644 libs/remix-ws-templates/src/templates/erc20/index.ts rename libs/remix-ws-templates/{ => src/templates}/erc20/scripts/deploy_with_ethers.ts (82%) rename libs/remix-ws-templates/{ => src/templates}/erc20/scripts/deploy_with_web3.ts (83%) rename libs/remix-ws-templates/{ => src/templates}/erc20/scripts/ethers.ts (95%) rename libs/remix-ws-templates/{ => src/templates}/erc20/scripts/web3.ts (93%) rename libs/remix-ws-templates/{ => src/templates}/erc20/tests/SampleERC20_test.sol (97%) rename libs/remix-ws-templates/{ => src/templates}/remixDefault/README.txt (99%) rename libs/remix-ws-templates/{ => src/templates}/remixDefault/contracts/1_Storage.sol (100%) rename libs/remix-ws-templates/{ => src/templates}/remixDefault/contracts/2_Owner.sol (98%) rename libs/remix-ws-templates/{ => src/templates}/remixDefault/contracts/3_Ballot.sol (99%) rename libs/remix-ws-templates/{remixDefault/index.js => src/templates/remixDefault/index.ts} (100%) rename libs/remix-ws-templates/{ => src/templates}/remixDefault/scripts/deploy_with_ethers.ts (91%) rename libs/remix-ws-templates/{ => src/templates}/remixDefault/scripts/deploy_with_web3.ts (92%) rename libs/remix-ws-templates/{ => src/templates}/remixDefault/scripts/ethers.ts (94%) rename libs/remix-ws-templates/{ => src/templates}/remixDefault/scripts/web3.ts (99%) rename libs/remix-ws-templates/{ => src/templates}/remixDefault/tests/Ballot_test.sol (98%) rename libs/remix-ws-templates/{ => src/templates}/remixDefault/tests/storage.test.js (100%) create mode 100644 libs/remix-ws-templates/src/types/index.d.ts create mode 100644 libs/remix-ws-templates/tsconfig.json create mode 100644 libs/remix-ws-templates/tsconfig.lib.json diff --git a/apps/remix-ide/webpack.config.js b/apps/remix-ide/webpack.config.js index c1c806505d..38802e0380 100644 --- a/apps/remix-ide/webpack.config.js +++ b/apps/remix-ide/webpack.config.js @@ -18,7 +18,9 @@ module.exports = config => { nxWebpackConfig.module.rules.push({ test: /\.txt$/, use: 'raw-loader' }) nxWebpackConfig.module.rules.push({ test: /\.sol$/, use: 'raw-loader' }) + nxWebpackConfig.module.rules.push({ test: /\.test\.js$/, use: 'raw-loader' }) + nxWebpackConfig.module.rules.push({ test: /\web3.ts$/, use: 'raw-loader' }) nxWebpackConfig.module.rules.push({ test: /\ethers.ts$/, use: 'raw-loader' }) diff --git a/libs/remix-ui/workspace/src/lib/actions/workspace.ts b/libs/remix-ui/workspace/src/lib/actions/workspace.ts index 20b3ca8d02..2fd1f95fe8 100644 --- a/libs/remix-ui/workspace/src/lib/actions/workspace.ts +++ b/libs/remix-ui/workspace/src/lib/actions/workspace.ts @@ -6,6 +6,7 @@ import { checkSlash, checkSpecialChars } from '@remix-ui/helper' import { JSONStandardInput, WorkspaceTemplate } from '../types' import { QueryParams } from '@remix-project/remix-lib' +import * as templateWithContent from '@remix-project/remix-ws-templates' const LOCALHOST = ' - connect to localhost - ' @@ -151,13 +152,17 @@ export const loadWorkspacePreset = async (template: WorkspaceTemplate = 'remixDe default: try { - // const templateWithContent = await import('../templates') - const templateWithContent = await import('remix-ws-templates') + console.log('templateWithContent--->', templateWithContent) const templateList = Object.keys(templateWithContent) if (!templateList.includes(template)) break - const files = templateWithContent[template] + console.log('templateWithContent--->', templateWithContent[template]) + // @ts-ignore + const files = await templateWithContent[template]() + console.log('files--->', files) for (const file in files) { try { + // const f2 = await import(files[file]) + // console.log('files-with await f2-->', f2) await workspaceProvider.set(file, files[file]) } catch (error) { console.error(error) diff --git a/libs/remix-ws-templates/.eslintrc b/libs/remix-ws-templates/.eslintrc new file mode 100644 index 0000000000..0a49d6ddc4 --- /dev/null +++ b/libs/remix-ws-templates/.eslintrc @@ -0,0 +1,12 @@ +{ + "extends": "../../.eslintrc", + "rules": { + }, + "env": { + "browser": true, + "amd": true, + "node": true, + "es6": true + }, + "ignorePatterns": ["!**/*"] +} \ No newline at end of file diff --git a/libs/remix-ws-templates/README.md b/libs/remix-ws-templates/README.md new file mode 100644 index 0000000000..a48800596f --- /dev/null +++ b/libs/remix-ws-templates/README.md @@ -0,0 +1,7 @@ +# remix-ws-templates + +This library was generated with [Nx](https://nx.dev). + +## Running unit tests + +Run `nx test remix-ws-templates` to execute the unit tests via [Jest](https://jestjs.io). diff --git a/libs/remix-ws-templates/erc20/index.js b/libs/remix-ws-templates/erc20/index.js deleted file mode 100644 index e3a5cbf078..0000000000 --- a/libs/remix-ws-templates/erc20/index.js +++ /dev/null @@ -1,8 +0,0 @@ -export default { - 'contracts/SampleERC20.sol': require('./contracts/SampleERC20.sol').default, - 'scripts/deploy_with_ethers.ts': require('./scripts/deploy_with_ethers.ts').default, - 'scripts/deploy_with_web3.ts': require('./scripts/deploy_with_web3.ts').default, - 'scripts/ethers.ts': require('./scripts/ethers.ts').default, - 'scripts/web3.ts': require('./scripts/web3.ts').default, - 'tests/SampleERC20_test.sol': require('./tests/SampleERC20_test.sol').default -} \ No newline at end of file diff --git a/libs/remix-ws-templates/index.js b/libs/remix-ws-templates/index.js deleted file mode 100644 index a076cfa671..0000000000 --- a/libs/remix-ws-templates/index.js +++ /dev/null @@ -1,3 +0,0 @@ -export { default as remixDefault } from './remixDefault' -export { default as erc20 } from './erc20' -// export { default as blank } from './blank' diff --git a/libs/remix-ws-templates/package.json b/libs/remix-ws-templates/package.json index 559b906d74..2e99679b63 100644 --- a/libs/remix-ws-templates/package.json +++ b/libs/remix-ws-templates/package.json @@ -1,11 +1,11 @@ { - "name": "remix-ws-templates", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" - }, - "author": "Aniket-Engg", - "license": "ISC" -} + "name": "@remix-project/remix-ws-templates", + "version": "1.0.0", + "description": "", + "main": "src/index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "author": "Aniket-Engg", + "license": "ISC" + } \ No newline at end of file diff --git a/libs/remix-ws-templates/src/index.ts b/libs/remix-ws-templates/src/index.ts new file mode 100644 index 0000000000..0b1893126b --- /dev/null +++ b/libs/remix-ws-templates/src/index.ts @@ -0,0 +1,3 @@ +export { default as remixDefault } from './templates/remixDefault' +export { default as erc20 } from './templates/erc20' +export { default as blank } from './templates/blank' \ No newline at end of file diff --git a/libs/remix-ws-templates/src/templates/blank/index.ts b/libs/remix-ws-templates/src/templates/blank/index.ts new file mode 100644 index 0000000000..56004c9f9e --- /dev/null +++ b/libs/remix-ws-templates/src/templates/blank/index.ts @@ -0,0 +1 @@ +export default {} \ No newline at end of file diff --git a/libs/remix-ws-templates/erc20/contracts/SampleERC20.sol b/libs/remix-ws-templates/src/templates/erc20/contracts/SampleERC20.sol similarity index 100% rename from libs/remix-ws-templates/erc20/contracts/SampleERC20.sol rename to libs/remix-ws-templates/src/templates/erc20/contracts/SampleERC20.sol diff --git a/libs/remix-ws-templates/src/templates/erc20/index.ts b/libs/remix-ws-templates/src/templates/erc20/index.ts new file mode 100644 index 0000000000..3ee2d68ccd --- /dev/null +++ b/libs/remix-ws-templates/src/templates/erc20/index.ts @@ -0,0 +1,18 @@ +export default async () => { + // @ts-ignore + console.log('------>', await import('raw-loader!./contracts/SampleERC20.sol')) + return { + // @ts-ignore + 'contracts/SampleERC20.sol': (await import('raw-loader!./contracts/SampleERC20.sol')).default, + // @ts-ignore + 'scripts/deploy_with_ethers.ts': (await import('raw-loader!./scripts/deploy_with_ethers.ts')).default, + // @ts-ignore + 'scripts/deploy_with_web3.ts': (await import('raw-loader!./scripts/deploy_with_web3.ts')).default, + // @ts-ignore + 'scripts/ethers.ts': (await import('raw-loader!./scripts/ethers.ts')).default, + // @ts-ignore + 'scripts/web3.ts': (await import('raw-loader!./scripts/web3.ts')).default, + // @ts-ignore + 'tests/SampleERC20_test.sol': (await import('raw-loader!./tests/SampleERC20_test.sol')).default + } +} \ No newline at end of file diff --git a/libs/remix-ws-templates/erc20/scripts/deploy_with_ethers.ts b/libs/remix-ws-templates/src/templates/erc20/scripts/deploy_with_ethers.ts similarity index 82% rename from libs/remix-ws-templates/erc20/scripts/deploy_with_ethers.ts rename to libs/remix-ws-templates/src/templates/erc20/scripts/deploy_with_ethers.ts index dc2f5286c4..f863a6bcd5 100644 --- a/libs/remix-ws-templates/erc20/scripts/deploy_with_ethers.ts +++ b/libs/remix-ws-templates/src/templates/erc20/scripts/deploy_with_ethers.ts @@ -1,4 +1,4 @@ -import { deploy } from './ethers.ts' +import { deploy } from './ethers' (async () => { try { diff --git a/libs/remix-ws-templates/erc20/scripts/deploy_with_web3.ts b/libs/remix-ws-templates/src/templates/erc20/scripts/deploy_with_web3.ts similarity index 83% rename from libs/remix-ws-templates/erc20/scripts/deploy_with_web3.ts rename to libs/remix-ws-templates/src/templates/erc20/scripts/deploy_with_web3.ts index e6dddf65f0..653b1f244e 100644 --- a/libs/remix-ws-templates/erc20/scripts/deploy_with_web3.ts +++ b/libs/remix-ws-templates/src/templates/erc20/scripts/deploy_with_web3.ts @@ -1,4 +1,4 @@ -import { deploy } from './web3.ts' +import { deploy } from './web3' (async () => { try { diff --git a/libs/remix-ws-templates/erc20/scripts/ethers.ts b/libs/remix-ws-templates/src/templates/erc20/scripts/ethers.ts similarity index 95% rename from libs/remix-ws-templates/erc20/scripts/ethers.ts rename to libs/remix-ws-templates/src/templates/erc20/scripts/ethers.ts index 16fbd8c4d7..12f5b7354d 100644 --- a/libs/remix-ws-templates/erc20/scripts/ethers.ts +++ b/libs/remix-ws-templates/src/templates/erc20/scripts/ethers.ts @@ -1,5 +1,8 @@ -export const deploy = async (contractName: string, args: Array, from?: string) => { - + + + +export const deploy = async (contractName: string, args: Array, from?: string): Promise => { + console.log(`deploying ${contractName}`) // Note that the script needs the ABI which is generated from the compilation artifact. // Make sure contract is compiled and artifacts are generated @@ -21,4 +24,4 @@ export const deploy = async (contractName: string, args: Array, from?: stri // The contract is NOT deployed yet; we must wait until it is mined await contract.deployed() return contract -}: Promise \ No newline at end of file +} \ No newline at end of file diff --git a/libs/remix-ws-templates/erc20/scripts/web3.ts b/libs/remix-ws-templates/src/templates/erc20/scripts/web3.ts similarity index 93% rename from libs/remix-ws-templates/erc20/scripts/web3.ts rename to libs/remix-ws-templates/src/templates/erc20/scripts/web3.ts index 6fc26b2030..62f43b6611 100644 --- a/libs/remix-ws-templates/erc20/scripts/web3.ts +++ b/libs/remix-ws-templates/src/templates/erc20/scripts/web3.ts @@ -1,5 +1,5 @@ -export const deploy = async (contractName: string, args: Array, from?: string, gas?: number) => { - +export const deploy = async (contractName: string, args: Array, from?: string, gas?: number): Promise => { + console.log(`deploying ${contractName}`) // Note that the script needs the ABI which is generated from the compilation artifact. // Make sure contract is compiled and artifacts are generated @@ -21,4 +21,4 @@ export const deploy = async (contractName: string, args: Array, from?: stri gas: gas || 1500000 }) return newContractInstance.options -}: Promise \ No newline at end of file +} \ No newline at end of file diff --git a/libs/remix-ws-templates/erc20/tests/SampleERC20_test.sol b/libs/remix-ws-templates/src/templates/erc20/tests/SampleERC20_test.sol similarity index 97% rename from libs/remix-ws-templates/erc20/tests/SampleERC20_test.sol rename to libs/remix-ws-templates/src/templates/erc20/tests/SampleERC20_test.sol index 45087c816c..19eb11d97d 100644 --- a/libs/remix-ws-templates/erc20/tests/SampleERC20_test.sol +++ b/libs/remix-ws-templates/src/templates/erc20/tests/SampleERC20_test.sol @@ -5,12 +5,12 @@ import "remix_tests.sol"; import "../contracts/SampleERC20.sol"; contract SampleERC20Test { - + SampleERC20 s; function beforeAll () public { s = new SampleERC20("TestToken", "TST"); } - + function testTokenNameAndSymbol () public { Assert.equal(s.name(), "TestToken", "token name did not match"); Assert.equal(s.symbol(), "TST", "token symbol did not match"); diff --git a/libs/remix-ws-templates/remixDefault/README.txt b/libs/remix-ws-templates/src/templates/remixDefault/README.txt similarity index 99% rename from libs/remix-ws-templates/remixDefault/README.txt rename to libs/remix-ws-templates/src/templates/remixDefault/README.txt index a71c4dc2d0..5e243584b2 100644 --- a/libs/remix-ws-templates/remixDefault/README.txt +++ b/libs/remix-ws-templates/src/templates/remixDefault/README.txt @@ -23,4 +23,4 @@ Output from script will appear in remix terminal. Please note, 'require' statement is supported in a limited manner for Remix supported modules. For now, modules supported by Remix are ethers, web3, swarmgw, chai, remix and hardhat only for hardhat.ethers object/plugin. -For unsupported modules, an error like this will be thrown: ' module require is not supported by Remix IDE will be shown.' +For unsupported modules, an error like this will be thrown: ' module require is not supported by Remix IDE will be shown.' \ No newline at end of file diff --git a/libs/remix-ws-templates/remixDefault/contracts/1_Storage.sol b/libs/remix-ws-templates/src/templates/remixDefault/contracts/1_Storage.sol similarity index 100% rename from libs/remix-ws-templates/remixDefault/contracts/1_Storage.sol rename to libs/remix-ws-templates/src/templates/remixDefault/contracts/1_Storage.sol diff --git a/libs/remix-ws-templates/remixDefault/contracts/2_Owner.sol b/libs/remix-ws-templates/src/templates/remixDefault/contracts/2_Owner.sol similarity index 98% rename from libs/remix-ws-templates/remixDefault/contracts/2_Owner.sol rename to libs/remix-ws-templates/src/templates/remixDefault/contracts/2_Owner.sol index e6bc652c0f..9949f8cdd6 100644 --- a/libs/remix-ws-templates/remixDefault/contracts/2_Owner.sol +++ b/libs/remix-ws-templates/src/templates/remixDefault/contracts/2_Owner.sol @@ -11,10 +11,10 @@ import "hardhat/console.sol"; contract Owner { address private owner; - + // event for EVM logging event OwnerSet(address indexed oldOwner, address indexed newOwner); - + // modifier to check if caller is owner modifier isOwner() { // If the first argument of 'require' evaluates to 'false', execution terminates and all @@ -25,7 +25,7 @@ contract Owner { require(msg.sender == owner, "Caller is not owner"); _; } - + /** * @dev Set contract deployer as owner */ @@ -51,4 +51,4 @@ contract Owner { function getOwner() external view returns (address) { return owner; } -} \ No newline at end of file +} \ No newline at end of file diff --git a/libs/remix-ws-templates/remixDefault/contracts/3_Ballot.sol b/libs/remix-ws-templates/src/templates/remixDefault/contracts/3_Ballot.sol similarity index 99% rename from libs/remix-ws-templates/remixDefault/contracts/3_Ballot.sol rename to libs/remix-ws-templates/src/templates/remixDefault/contracts/3_Ballot.sol index 09fab7bc15..ffcc6c3609 100644 --- a/libs/remix-ws-templates/remixDefault/contracts/3_Ballot.sol +++ b/libs/remix-ws-templates/src/templates/remixDefault/contracts/3_Ballot.sol @@ -7,7 +7,7 @@ pragma solidity >=0.7.0 <0.9.0; * @dev Implements voting process along with vote delegation */ contract Ballot { - + struct Voter { uint weight; // weight is accumulated by delegation bool voted; // if true, that person already voted @@ -46,7 +46,7 @@ contract Ballot { })); } } - + /** * @dev Give 'voter' the right to vote on this ballot. May only be called by 'chairperson'. * @param voter address of voter diff --git a/libs/remix-ws-templates/remixDefault/index.js b/libs/remix-ws-templates/src/templates/remixDefault/index.ts similarity index 100% rename from libs/remix-ws-templates/remixDefault/index.js rename to libs/remix-ws-templates/src/templates/remixDefault/index.ts diff --git a/libs/remix-ws-templates/remixDefault/scripts/deploy_with_ethers.ts b/libs/remix-ws-templates/src/templates/remixDefault/scripts/deploy_with_ethers.ts similarity index 91% rename from libs/remix-ws-templates/remixDefault/scripts/deploy_with_ethers.ts rename to libs/remix-ws-templates/src/templates/remixDefault/scripts/deploy_with_ethers.ts index 2166c05842..e5fbf05264 100644 --- a/libs/remix-ws-templates/remixDefault/scripts/deploy_with_ethers.ts +++ b/libs/remix-ws-templates/src/templates/remixDefault/scripts/deploy_with_ethers.ts @@ -2,7 +2,7 @@ // Please make sure to compile "./contracts/1_Storage.sol" file before running this script. // And use Right click -> "Run" from context menu of the file to run the script. Shortcut: Ctrl+Shift+S -import { deploy } from './ethers.ts' +import { deploy } from './ethers' (async () => { try { diff --git a/libs/remix-ws-templates/remixDefault/scripts/deploy_with_web3.ts b/libs/remix-ws-templates/src/templates/remixDefault/scripts/deploy_with_web3.ts similarity index 92% rename from libs/remix-ws-templates/remixDefault/scripts/deploy_with_web3.ts rename to libs/remix-ws-templates/src/templates/remixDefault/scripts/deploy_with_web3.ts index d6fc672929..d2fe1ff4ff 100644 --- a/libs/remix-ws-templates/remixDefault/scripts/deploy_with_web3.ts +++ b/libs/remix-ws-templates/src/templates/remixDefault/scripts/deploy_with_web3.ts @@ -2,7 +2,7 @@ // Please make sure to compile "./contracts/1_Storage.sol" file before running this script. // And use Right click -> "Run" from context menu of the file to run the script. Shortcut: Ctrl+Shift+S -import { deploy } from './web3.ts' +import { deploy } from './web3' (async () => { try { diff --git a/libs/remix-ws-templates/remixDefault/scripts/ethers.ts b/libs/remix-ws-templates/src/templates/remixDefault/scripts/ethers.ts similarity index 94% rename from libs/remix-ws-templates/remixDefault/scripts/ethers.ts rename to libs/remix-ws-templates/src/templates/remixDefault/scripts/ethers.ts index be75c474c3..dc236caefb 100644 --- a/libs/remix-ws-templates/remixDefault/scripts/ethers.ts +++ b/libs/remix-ws-templates/src/templates/remixDefault/scripts/ethers.ts @@ -1,5 +1,5 @@ export const deploy = async (contractName: string, args: Array, from?: string): Promise => { - + console.log(`deploying ${contractName}`) // Note that the script needs the ABI which is generated from the compilation artifact. // Make sure contract is compiled and artifacts are generated @@ -15,7 +15,7 @@ export const deploy = async (contractName: string, args: Array, from?: stri if (from) { contract = await factory.connect(from).deploy(...args); } else { - contract = await factory.deploy(...arguments); + contract = await factory.deploy(...args); } // The contract is NOT deployed yet; we must wait until it is mined diff --git a/libs/remix-ws-templates/remixDefault/scripts/web3.ts b/libs/remix-ws-templates/src/templates/remixDefault/scripts/web3.ts similarity index 99% rename from libs/remix-ws-templates/remixDefault/scripts/web3.ts rename to libs/remix-ws-templates/src/templates/remixDefault/scripts/web3.ts index 7b9ee72236..975a7176b4 100644 --- a/libs/remix-ws-templates/remixDefault/scripts/web3.ts +++ b/libs/remix-ws-templates/src/templates/remixDefault/scripts/web3.ts @@ -1,5 +1,5 @@ export const deploy = async (contractName: string, args: Array, from?: string, gas?: number): Promise => { - + console.log(`deploying ${contractName}`) // Note that the script needs the ABI which is generated from the compilation artifact. // Make sure contract is compiled and artifacts are generated diff --git a/libs/remix-ws-templates/remixDefault/tests/Ballot_test.sol b/libs/remix-ws-templates/src/templates/remixDefault/tests/Ballot_test.sol similarity index 98% rename from libs/remix-ws-templates/remixDefault/tests/Ballot_test.sol rename to libs/remix-ws-templates/src/templates/remixDefault/tests/Ballot_test.sol index f3b81075f2..49146e99fa 100644 --- a/libs/remix-ws-templates/remixDefault/tests/Ballot_test.sol +++ b/libs/remix-ws-templates/src/templates/remixDefault/tests/Ballot_test.sol @@ -6,22 +6,22 @@ import "hardhat/console.sol"; import "../contracts/3_Ballot.sol"; contract BallotTest { - + bytes32[] proposalNames; - + Ballot ballotToTest; function beforeAll () public { proposalNames.push(bytes32("candidate1")); ballotToTest = new Ballot(proposalNames); } - + function checkWinningProposal () public { console.log("Running checkWinningProposal"); ballotToTest.vote(0); Assert.equal(ballotToTest.winningProposal(), uint(0), "proposal at index 0 should be the winning proposal"); Assert.equal(ballotToTest.winnerName(), bytes32("candidate1"), "candidate1 should be the winner name"); } - + function checkWinninProposalWithReturnValue () public view returns (bool) { return ballotToTest.winningProposal() == 0; } diff --git a/libs/remix-ws-templates/remixDefault/tests/storage.test.js b/libs/remix-ws-templates/src/templates/remixDefault/tests/storage.test.js similarity index 100% rename from libs/remix-ws-templates/remixDefault/tests/storage.test.js rename to libs/remix-ws-templates/src/templates/remixDefault/tests/storage.test.js diff --git a/libs/remix-ws-templates/src/types/index.d.ts b/libs/remix-ws-templates/src/types/index.d.ts new file mode 100644 index 0000000000..ad12deddd8 --- /dev/null +++ b/libs/remix-ws-templates/src/types/index.d.ts @@ -0,0 +1,4 @@ +declare var remix:any +declare var ethers:any +declare var web3:any +declare var web3Provider:any \ No newline at end of file diff --git a/libs/remix-ws-templates/tsconfig.json b/libs/remix-ws-templates/tsconfig.json new file mode 100644 index 0000000000..eb1415fa71 --- /dev/null +++ b/libs/remix-ws-templates/tsconfig.json @@ -0,0 +1,7 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "types": ["node"], + }, + "include": ["**/*.ts"] +} \ No newline at end of file diff --git a/libs/remix-ws-templates/tsconfig.lib.json b/libs/remix-ws-templates/tsconfig.lib.json new file mode 100644 index 0000000000..b5f51c0965 --- /dev/null +++ b/libs/remix-ws-templates/tsconfig.lib.json @@ -0,0 +1,15 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "module": "commonjs", + "outDir": "../../dist/out-tsc", + "declaration": true, + "rootDir": "./src", + "types": ["node"] + }, + "exclude": [ + "**/*.spec.ts", + "tests/" + ], + "include": ["**/*.ts", "**/*.sol"] +} diff --git a/nx.json b/nx.json index bbf5b08f6f..dc7a59fd15 100644 --- a/nx.json +++ b/nx.json @@ -133,7 +133,7 @@ "remix-ui-app": { "tags": [] }, - "remix-ui-helper": { + "remix-ui-helper": { "tags": [] }, "remix-ui-vertical-icons-panel": { @@ -165,6 +165,9 @@ }, "remix-ui-permission-handler": { "tags": [] + }, + "remix-ws-templates": { + "tags": [] } }, "targetDependencies": { diff --git a/tsconfig.base.json b/tsconfig.base.json index d9e148acdb..fb649a61b5 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -75,10 +75,19 @@ ], "@remix-ui/theme-module": ["libs/remix-ui/theme-module/src/index.ts"], "@remix-ui/panel": ["libs/remix-ui/panel/src/index.ts"], - "@remix-ui/editor-context-view": ["libs/remix-ui/editor-context-view/src/index.ts"], - "@remix-ui/solidity-unit-testing": ["libs/remix-ui/solidity-unit-testing/src/index.ts"], + "@remix-ui/editor-context-view": [ + "libs/remix-ui/editor-context-view/src/index.ts" + ], + "@remix-ui/solidity-unit-testing": [ + "libs/remix-ui/solidity-unit-testing/src/index.ts" + ], "@remix-ui/run-tab": ["libs/remix-ui/run-tab/src/index.ts"], - "@remix-ui/permission-handler": ["libs/remix-ui/permission-handler/src/index.ts"] + "@remix-ui/permission-handler": [ + "libs/remix-ui/permission-handler/src/index.ts" + ], + "@remix-project/remix-ws-templates": [ + "libs/remix-ws-templates/src/index.ts" + ] } }, "exclude": ["node_modules", "tmp"] diff --git a/workspace.json b/workspace.json index 149905a868..7e8853adb6 100644 --- a/workspace.json +++ b/workspace.json @@ -1,4 +1,3 @@ - { "version": 1, "projects": { @@ -756,8 +755,8 @@ } }, "remix-ui-plugin-manager": { - "root": "libs/remix-ui/plugin-manager", - "sourceRoot": "libs/remix-ui/plugin-manager/src", + "root": "libs/remix-ui/plugin-manager", + "sourceRoot": "libs/remix-ui/plugin-manager/src", "projectType": "library", "schematics": {}, "architect": { @@ -1010,7 +1009,6 @@ "tsConfig": ["libs/remix-ui/home-tab/tsconfig.lib.json"], "exclude": ["**/node_modules/**", "!libs/remix-ui/home-tab/**/*"] } - } } }, @@ -1039,8 +1037,8 @@ "builder": "@nrwl/linter:lint", "options": { "linter": "eslint", - "tsConfig": ["libs/remix-ui/editor/tsconfig.lib.json"], - "exclude": ["**/node_modules/**", "!libs/remix-ui/editor/**/*"] + "tsConfig": ["libs/remix-ui/editor/tsconfig.lib.json"], + "exclude": ["**/node_modules/**", "!libs/remix-ui/editor/**/*"] } } } @@ -1101,8 +1099,13 @@ "builder": "@nrwl/linter:lint", "options": { "linter": "eslint", - "tsConfig": ["libs/remix-ui/vertical-icons-panel/tsconfig.lib.json"], - "exclude": ["**/node_modules/**", "!libs/remix-ui/vertical-icons-panel/**/*"] + "tsConfig": [ + "libs/remix-ui/vertical-icons-panel/tsconfig.lib.json" + ], + "exclude": [ + "**/node_modules/**", + "!libs/remix-ui/vertical-icons-panel/**/*" + ] } } } @@ -1136,17 +1139,19 @@ } } } - }, + }, "solidity-unit-testing": { "root": "libs/remix-ui/solidity-unit-testing", - "sourceRoot": "libs/remix-ui/solidity-unit-testing/src", + "sourceRoot": "libs/remix-ui/solidity-unit-testing/src", "projectType": "library", "architect": { "lint": { "builder": "@nrwl/linter:lint", "options": { "linter": "eslint", - "tsConfig": ["libs/remix-ui/solidity-unit-testing/tsconfig.lib.json"], + "tsConfig": [ + "libs/remix-ui/solidity-unit-testing/tsconfig.lib.json" + ], "exclude": [ "**/node_modules/**", "!libs/remix-ui/solidity-unit-testing/**/*" @@ -1165,7 +1170,10 @@ "options": { "linter": "eslint", "tsConfig": ["libs/remix-ui/editor-context-view/tsconfig.lib.json"], - "exclude": ["**/node_modules/**", "!libs/remix-ui/editor-context-view/**/*"] + "exclude": [ + "**/node_modules/**", + "!libs/remix-ui/editor-context-view/**/*" + ] } } } @@ -1180,7 +1188,11 @@ "options": { "linter": "eslint", "tsConfig": ["libs/remix-ui/run-tab/tsconfig.lib.json"], - "exclude": ["**/node_modules/**", "libs/remix-ui/run-tab/**/*.d.ts", "!libs/remix-ui/run-tab/**/*"] + "exclude": [ + "**/node_modules/**", + "libs/remix-ui/run-tab/**/*.d.ts", + "!libs/remix-ui/run-tab/**/*" + ] } } } @@ -1195,7 +1207,24 @@ "options": { "linter": "eslint", "tsConfig": ["libs/remix-ui/permission-handler/tsconfig.lib.json"], - "exclude": ["**/node_modules/**", "libs/remix-ui/permission-handler/**/*.d.ts", "!libs/remix-ui/permission-handler/**/*"] + "exclude": [ + "**/node_modules/**", + "libs/remix-ui/permission-handler/**/*.d.ts", + "!libs/remix-ui/permission-handler/**/*" + ] + } + } + } + }, + "remix-ws-templates": { + "root": "libs/remix-ws-templates", + "sourceRoot": "libs/remix-ws-templates/src", + "projectType": "library", + "architect": { + "lint": { + "builder": "@nrwl/linter:eslint", + "options": { + "lintFilePatterns": ["libs/remix-ws-templates/**/*.ts"] } } } From 10a4c792eccdff382f7da5864ad14b1288fe31e4 Mon Sep 17 00:00:00 2001 From: Aniket-Engg Date: Wed, 11 May 2022 13:52:18 +0530 Subject: [PATCH 07/16] raw loader for templates --- apps/remix-ide/webpack.config.js | 9 ----- .../workspace/src/lib/actions/workspace.ts | 5 --- .../src/templates/blank/index.ts | 2 +- .../src/templates/erc20/index.ts | 10 +++--- .../src/templates/remixDefault/index.ts | 35 ++++++++++++------- 5 files changed, 28 insertions(+), 33 deletions(-) diff --git a/apps/remix-ide/webpack.config.js b/apps/remix-ide/webpack.config.js index 38802e0380..c6d1f19000 100644 --- a/apps/remix-ide/webpack.config.js +++ b/apps/remix-ide/webpack.config.js @@ -15,15 +15,6 @@ fs.writeFileSync('./apps/remix-ide/src/assets/version.json', JSON.stringify(vers module.exports = config => { const nxWebpackConfig = nxWebpack(config) - - nxWebpackConfig.module.rules.push({ test: /\.txt$/, use: 'raw-loader' }) - nxWebpackConfig.module.rules.push({ test: /\.sol$/, use: 'raw-loader' }) - - nxWebpackConfig.module.rules.push({ test: /\.test\.js$/, use: 'raw-loader' }) - - nxWebpackConfig.module.rules.push({ test: /\web3.ts$/, use: 'raw-loader' }) - nxWebpackConfig.module.rules.push({ test: /\ethers.ts$/, use: 'raw-loader' }) - const webpackConfig = { ...nxWebpackConfig, node: { diff --git a/libs/remix-ui/workspace/src/lib/actions/workspace.ts b/libs/remix-ui/workspace/src/lib/actions/workspace.ts index 2fd1f95fe8..909b88d0c9 100644 --- a/libs/remix-ui/workspace/src/lib/actions/workspace.ts +++ b/libs/remix-ui/workspace/src/lib/actions/workspace.ts @@ -152,17 +152,12 @@ export const loadWorkspacePreset = async (template: WorkspaceTemplate = 'remixDe default: try { - console.log('templateWithContent--->', templateWithContent) const templateList = Object.keys(templateWithContent) if (!templateList.includes(template)) break - console.log('templateWithContent--->', templateWithContent[template]) // @ts-ignore const files = await templateWithContent[template]() - console.log('files--->', files) for (const file in files) { try { - // const f2 = await import(files[file]) - // console.log('files-with await f2-->', f2) await workspaceProvider.set(file, files[file]) } catch (error) { console.error(error) diff --git a/libs/remix-ws-templates/src/templates/blank/index.ts b/libs/remix-ws-templates/src/templates/blank/index.ts index 56004c9f9e..6840e8d560 100644 --- a/libs/remix-ws-templates/src/templates/blank/index.ts +++ b/libs/remix-ws-templates/src/templates/blank/index.ts @@ -1 +1 @@ -export default {} \ No newline at end of file +export default async () => { return {}} \ No newline at end of file diff --git a/libs/remix-ws-templates/src/templates/erc20/index.ts b/libs/remix-ws-templates/src/templates/erc20/index.ts index 3ee2d68ccd..cc1f087b55 100644 --- a/libs/remix-ws-templates/src/templates/erc20/index.ts +++ b/libs/remix-ws-templates/src/templates/erc20/index.ts @@ -1,17 +1,15 @@ export default async () => { - // @ts-ignore - console.log('------>', await import('raw-loader!./contracts/SampleERC20.sol')) return { // @ts-ignore 'contracts/SampleERC20.sol': (await import('raw-loader!./contracts/SampleERC20.sol')).default, // @ts-ignore - 'scripts/deploy_with_ethers.ts': (await import('raw-loader!./scripts/deploy_with_ethers.ts')).default, + 'scripts/deploy_with_ethers.ts': (await import('!!raw-loader!./scripts/deploy_with_ethers.ts')).default, // @ts-ignore - 'scripts/deploy_with_web3.ts': (await import('raw-loader!./scripts/deploy_with_web3.ts')).default, + 'scripts/deploy_with_web3.ts': (await import('!!raw-loader!./scripts/deploy_with_web3.ts')).default, // @ts-ignore - 'scripts/ethers.ts': (await import('raw-loader!./scripts/ethers.ts')).default, + 'scripts/ethers.ts': (await import('!!raw-loader!./scripts/ethers.ts')).default, // @ts-ignore - 'scripts/web3.ts': (await import('raw-loader!./scripts/web3.ts')).default, + 'scripts/web3.ts': (await import('!!raw-loader!./scripts/web3.ts')).default, // @ts-ignore 'tests/SampleERC20_test.sol': (await import('raw-loader!./tests/SampleERC20_test.sol')).default } diff --git a/libs/remix-ws-templates/src/templates/remixDefault/index.ts b/libs/remix-ws-templates/src/templates/remixDefault/index.ts index 7140e4a49a..683c616397 100644 --- a/libs/remix-ws-templates/src/templates/remixDefault/index.ts +++ b/libs/remix-ws-templates/src/templates/remixDefault/index.ts @@ -1,13 +1,24 @@ -export default { - 'contracts/1_Storage.sol': require('./contracts/1_Storage.sol').default, - 'contracts/2_Owner.sol': require('./contracts/2_Owner.sol').default, - 'contracts/3_Ballot.sol': require('./contracts/3_Ballot.sol').default, - 'scripts/deploy_with_ethers.ts': require('./scripts/deploy_with_ethers.ts').default, - 'scripts/deploy_with_web3.ts': require('./scripts/deploy_with_web3.ts').default, - 'scripts/ethers.ts': require('./scripts/ethers.ts').default, - 'scripts/web3.ts': require('./scripts/web3.ts').default, - 'tests/Ballot_test.sol': require('./tests/Ballot_test.sol').default, - 'tests/storage.test.js': require('./tests/storage.test.js').default, - 'README.txt': require('./README.txt').default, - +export default async () => { + return { + // @ts-ignore + 'contracts/1_Storage.sol': (await import('raw-loader!./contracts/1_Storage.sol')).default, + // @ts-ignore + 'contracts/2_Owner.sol': (await import('raw-loader!./contracts/2_Owner.sol')).default, + // @ts-ignore + 'contracts/3_Ballot.sol': (await import('raw-loader!./contracts/3_Ballot.sol')).default, + // @ts-ignore + 'scripts/deploy_with_ethers.ts': (await import('!!raw-loader!./scripts/deploy_with_ethers.ts')).default, + // @ts-ignore + 'scripts/deploy_with_web3.ts': (await import('!!raw-loader!./scripts/deploy_with_web3.ts')).default, + // @ts-ignore + 'scripts/ethers.ts': (await import('!!raw-loader!./scripts/ethers.ts')).default, + // @ts-ignore + 'scripts/web3.ts': (await import('!!raw-loader!./scripts/web3.ts')).default, + // @ts-ignore + 'tests/Ballot_test.sol': (await import('raw-loader!./tests/Ballot_test.sol')).default, + // @ts-ignore + 'tests/storage.test.js': (await import('!!raw-loader!./tests/storage.test.js')).default, + // @ts-ignore + 'README.txt': (await import('raw-loader!./README.txt')).default, + } } \ No newline at end of file From 20049fc416fabe510c36b34eb799643c65400bba Mon Sep 17 00:00:00 2001 From: Aniket-Engg Date: Wed, 11 May 2022 14:07:23 +0530 Subject: [PATCH 08/16] remove unnecessary file --- libs/remix-ws-templates/src/types/index.d.ts | 4 ---- 1 file changed, 4 deletions(-) delete mode 100644 libs/remix-ws-templates/src/types/index.d.ts diff --git a/libs/remix-ws-templates/src/types/index.d.ts b/libs/remix-ws-templates/src/types/index.d.ts deleted file mode 100644 index ad12deddd8..0000000000 --- a/libs/remix-ws-templates/src/types/index.d.ts +++ /dev/null @@ -1,4 +0,0 @@ -declare var remix:any -declare var ethers:any -declare var web3:any -declare var web3Provider:any \ No newline at end of file From 238a13afb819de1a35b67873f6fb19074a815b38 Mon Sep 17 00:00:00 2001 From: Aniket-Engg Date: Wed, 11 May 2022 14:13:23 +0530 Subject: [PATCH 09/16] linting fix --- .../src/templates/erc20/scripts/ethers.ts | 2 +- .../src/templates/remixDefault/scripts/ethers.ts | 2 +- libs/remix-ws-templates/tsconfig.lib.json | 2 +- workspace.json | 7 +++++-- 4 files changed, 8 insertions(+), 5 deletions(-) diff --git a/libs/remix-ws-templates/src/templates/erc20/scripts/ethers.ts b/libs/remix-ws-templates/src/templates/erc20/scripts/ethers.ts index 12f5b7354d..04c363322a 100644 --- a/libs/remix-ws-templates/src/templates/erc20/scripts/ethers.ts +++ b/libs/remix-ws-templates/src/templates/erc20/scripts/ethers.ts @@ -12,7 +12,7 @@ export const deploy = async (contractName: string, args: Array, from?: stri // 'web3Provider' is a remix global variable object const signer = (new ethers.providers.Web3Provider(web3Provider)).getSigner() - let factory = new ethers.ContractFactory(metadata.abi, metadata.data.bytecode.object, signer); + const factory = new ethers.ContractFactory(metadata.abi, metadata.data.bytecode.object, signer); let contract if (from) { diff --git a/libs/remix-ws-templates/src/templates/remixDefault/scripts/ethers.ts b/libs/remix-ws-templates/src/templates/remixDefault/scripts/ethers.ts index dc236caefb..5f11f62e5f 100644 --- a/libs/remix-ws-templates/src/templates/remixDefault/scripts/ethers.ts +++ b/libs/remix-ws-templates/src/templates/remixDefault/scripts/ethers.ts @@ -9,7 +9,7 @@ export const deploy = async (contractName: string, args: Array, from?: stri // 'web3Provider' is a remix global variable object const signer = (new ethers.providers.Web3Provider(web3Provider)).getSigner() - let factory = new ethers.ContractFactory(metadata.abi, metadata.data.bytecode.object, signer); + const factory = new ethers.ContractFactory(metadata.abi, metadata.data.bytecode.object, signer); let contract if (from) { diff --git a/libs/remix-ws-templates/tsconfig.lib.json b/libs/remix-ws-templates/tsconfig.lib.json index b5f51c0965..ca57f301c9 100644 --- a/libs/remix-ws-templates/tsconfig.lib.json +++ b/libs/remix-ws-templates/tsconfig.lib.json @@ -11,5 +11,5 @@ "**/*.spec.ts", "tests/" ], - "include": ["**/*.ts", "**/*.sol"] + "include": ["**/*.ts"] } diff --git a/workspace.json b/workspace.json index 7e8853adb6..45726ee4b7 100644 --- a/workspace.json +++ b/workspace.json @@ -1222,9 +1222,12 @@ "projectType": "library", "architect": { "lint": { - "builder": "@nrwl/linter:eslint", + "builder": "@nrwl/linter:lint", "options": { - "lintFilePatterns": ["libs/remix-ws-templates/**/*.ts"] + "linter": "eslint", + "config": "libs/remix-ws-templates/.eslintrc", + "tsConfig": ["libs/remix-ws-templates/tsconfig.lib.json"], + "exclude": ["**/node_modules/**"] } } } From d9de03a3863c7f7dae91f7687f2be9fa4481ce1e Mon Sep 17 00:00:00 2001 From: Aniket-Engg Date: Wed, 11 May 2022 19:05:12 +0530 Subject: [PATCH 10/16] build using nx --- libs/remix-ws-templates/tsconfig.json | 2 +- libs/remix-ws-templates/tsconfig.lib.json | 5 +++-- libs/remix-ws-templates/types/index.d.ts | 4 ++++ package.json | 1 - tsconfig.base.json | 2 +- workspace.json | 22 ++++++++++++++++++++++ 6 files changed, 31 insertions(+), 5 deletions(-) create mode 100644 libs/remix-ws-templates/types/index.d.ts diff --git a/libs/remix-ws-templates/tsconfig.json b/libs/remix-ws-templates/tsconfig.json index eb1415fa71..be70d22834 100644 --- a/libs/remix-ws-templates/tsconfig.json +++ b/libs/remix-ws-templates/tsconfig.json @@ -3,5 +3,5 @@ "compilerOptions": { "types": ["node"], }, - "include": ["**/*.ts"] + "include": ["**/*.ts", "**/*.sol"] } \ No newline at end of file diff --git a/libs/remix-ws-templates/tsconfig.lib.json b/libs/remix-ws-templates/tsconfig.lib.json index ca57f301c9..fa525223fe 100644 --- a/libs/remix-ws-templates/tsconfig.lib.json +++ b/libs/remix-ws-templates/tsconfig.lib.json @@ -9,7 +9,8 @@ }, "exclude": [ "**/*.spec.ts", - "tests/" + "tests/", + "templates/" ], - "include": ["**/*.ts"] + "include": ["**/*.ts", "**/*.sol"] } diff --git a/libs/remix-ws-templates/types/index.d.ts b/libs/remix-ws-templates/types/index.d.ts new file mode 100644 index 0000000000..ad12deddd8 --- /dev/null +++ b/libs/remix-ws-templates/types/index.d.ts @@ -0,0 +1,4 @@ +declare var remix:any +declare var ethers:any +declare var web3:any +declare var web3Provider:any \ No newline at end of file diff --git a/package.json b/package.json index 1c8488d9bd..fb127e9f7f 100644 --- a/package.json +++ b/package.json @@ -198,7 +198,6 @@ "react-draggable": "^4.4.4", "react-tabs": "^3.2.2", "regenerator-runtime": "0.13.7", - "remix-ws-templates": "file:libs/remix-ws-templates", "selenium": "^2.20.0", "signale": "^1.4.0", "string-similarity": "^4.0.4", diff --git a/tsconfig.base.json b/tsconfig.base.json index fb649a61b5..6751f6778e 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -86,7 +86,7 @@ "libs/remix-ui/permission-handler/src/index.ts" ], "@remix-project/remix-ws-templates": [ - "libs/remix-ws-templates/src/index.ts" + "dist/libs/remix-ws-templates/src/index.ts" ] } }, diff --git a/workspace.json b/workspace.json index 45726ee4b7..7ead3dd32b 100644 --- a/workspace.json +++ b/workspace.json @@ -1229,6 +1229,28 @@ "tsConfig": ["libs/remix-ws-templates/tsconfig.lib.json"], "exclude": ["**/node_modules/**"] } + }, + "build": { + "builder": "@nrwl/node:package", + "options": { + "outputPath": "dist/libs/remix-ws-templates", + "tsConfig": "libs/remix-ws-templates/tsconfig.lib.json", + "packageJson": "libs/remix-ws-templates/package.json", + "main": "libs/remix-ws-templates/src/index.ts", + "assets": [ + { + "glob": "templates/**/*", + "ignore": ["templates/**/*/index.ts"], + "input": "libs/remix-ws-templates/src/", + "output": "src/" + }, + { + "glob": "*.md", + "input": "libs/remix-ws-templates/", + "output": "/" + } + ] + } } } } From e64074e9183ea47d1a3f21f60be2b4a4efd205a0 Mon Sep 17 00:00:00 2001 From: Aniket-Engg Date: Wed, 11 May 2022 19:18:37 +0530 Subject: [PATCH 11/16] build fix --- apps/remix-ide/webpack.config.js | 1 - libs/remix-ws-templates/package.json | 8 ++++++++ tsconfig.base.json | 2 +- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/apps/remix-ide/webpack.config.js b/apps/remix-ide/webpack.config.js index c6d1f19000..529fe58d39 100644 --- a/apps/remix-ide/webpack.config.js +++ b/apps/remix-ide/webpack.config.js @@ -3,7 +3,6 @@ const TerserPlugin = require('terser-webpack-plugin') const CopyWebpackPlugin = require('copy-webpack-plugin') const version = require('../../package.json').version const fs = require('fs') -const path = require('path') const versionData = { version: version, diff --git a/libs/remix-ws-templates/package.json b/libs/remix-ws-templates/package.json index 2e99679b63..c0ebf1b058 100644 --- a/libs/remix-ws-templates/package.json +++ b/libs/remix-ws-templates/package.json @@ -3,9 +3,17 @@ "version": "1.0.0", "description": "", "main": "src/index.js", + "types": "src/index.d.ts", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, + "publishConfig": { + "access": "public" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/ethereum/remix-project.git" + }, "author": "Aniket-Engg", "license": "ISC" } \ No newline at end of file diff --git a/tsconfig.base.json b/tsconfig.base.json index 6751f6778e..daadc1ca43 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -86,7 +86,7 @@ "libs/remix-ui/permission-handler/src/index.ts" ], "@remix-project/remix-ws-templates": [ - "dist/libs/remix-ws-templates/src/index.ts" + "dist/libs/remix-ws-templates/src/index.js" ] } }, From da64fc351ce3621bf05e29d2cd2c2e8b9c8436bb Mon Sep 17 00:00:00 2001 From: Aniket-Engg Date: Thu, 12 May 2022 10:03:23 +0530 Subject: [PATCH 12/16] nx.json update to fic build --- libs/remix-ws-templates/tsconfig.json | 2 +- libs/remix-ws-templates/tsconfig.lib.json | 5 ++--- nx.json | 9 +++++---- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/libs/remix-ws-templates/tsconfig.json b/libs/remix-ws-templates/tsconfig.json index be70d22834..eb1415fa71 100644 --- a/libs/remix-ws-templates/tsconfig.json +++ b/libs/remix-ws-templates/tsconfig.json @@ -3,5 +3,5 @@ "compilerOptions": { "types": ["node"], }, - "include": ["**/*.ts", "**/*.sol"] + "include": ["**/*.ts"] } \ No newline at end of file diff --git a/libs/remix-ws-templates/tsconfig.lib.json b/libs/remix-ws-templates/tsconfig.lib.json index fa525223fe..ca57f301c9 100644 --- a/libs/remix-ws-templates/tsconfig.lib.json +++ b/libs/remix-ws-templates/tsconfig.lib.json @@ -9,8 +9,7 @@ }, "exclude": [ "**/*.spec.ts", - "tests/", - "templates/" + "tests/" ], - "include": ["**/*.ts", "**/*.sol"] + "include": ["**/*.ts"] } diff --git a/nx.json b/nx.json index dc7a59fd15..c6fca5f4ad 100644 --- a/nx.json +++ b/nx.json @@ -50,6 +50,9 @@ "remix-url-resolver": { "tags": [] }, + "remix-ws-templates": { + "tags": [] + }, "remix-ide": { "tags": [], "implicitDependencies": [ @@ -60,7 +63,8 @@ "remix-solidity", "remix-tests", "remix-astwalker", - "remix-url-resolver" + "remix-url-resolver", + "remix-ws-templates" ] }, "remix-ide-e2e": { @@ -165,9 +169,6 @@ }, "remix-ui-permission-handler": { "tags": [] - }, - "remix-ws-templates": { - "tags": [] } }, "targetDependencies": { From bec488a69370812175a3ef52a1811b7d40e893c1 Mon Sep 17 00:00:00 2001 From: Aniket-Engg Date: Thu, 12 May 2022 10:18:47 +0530 Subject: [PATCH 13/16] linting fix --- libs/remix-ws-templates/types/index.d.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/libs/remix-ws-templates/types/index.d.ts b/libs/remix-ws-templates/types/index.d.ts index ad12deddd8..a7238130df 100644 --- a/libs/remix-ws-templates/types/index.d.ts +++ b/libs/remix-ws-templates/types/index.d.ts @@ -1,4 +1,4 @@ -declare var remix:any -declare var ethers:any -declare var web3:any -declare var web3Provider:any \ No newline at end of file +declare const remix:any +declare const ethers:any +declare const web3:any +declare const web3Provider:any \ No newline at end of file From ff4507cb3170a6940be9c98758dc88bdb5fcf92a Mon Sep 17 00:00:00 2001 From: Aniket-Engg Date: Thu, 12 May 2022 10:33:33 +0530 Subject: [PATCH 14/16] build only index file --- libs/remix-ws-templates/tsconfig.lib.json | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/libs/remix-ws-templates/tsconfig.lib.json b/libs/remix-ws-templates/tsconfig.lib.json index ca57f301c9..165195b789 100644 --- a/libs/remix-ws-templates/tsconfig.lib.json +++ b/libs/remix-ws-templates/tsconfig.lib.json @@ -2,7 +2,6 @@ "extends": "./tsconfig.json", "compilerOptions": { "module": "commonjs", - "outDir": "../../dist/out-tsc", "declaration": true, "rootDir": "./src", "types": ["node"] @@ -11,5 +10,5 @@ "**/*.spec.ts", "tests/" ], - "include": ["**/*.ts"] + "include": ["**/index.ts"] } From 4c88b83e14accb0d91adaf2f8e2c197618ec4064 Mon Sep 17 00:00:00 2001 From: Aniket-Engg Date: Thu, 12 May 2022 10:43:28 +0530 Subject: [PATCH 15/16] add new lib --- jest.config.js | 3 +++ lerna.json | 3 ++- package.json | 4 ++-- tsconfig.base.json | 6 +++--- 4 files changed, 10 insertions(+), 6 deletions(-) diff --git a/jest.config.js b/jest.config.js index d68c1af4eb..b2722cad44 100644 --- a/jest.config.js +++ b/jest.config.js @@ -17,6 +17,9 @@ module.exports = { "@remix-project/remix-url-resolver": "/../../dist/libs/remix-url-resolver/src/index.js" , + "@remix-project/remix-ws-templates": + "/../../dist/libs/remix-ws-templates/src/index.js" + , "@remix-project/remixd": "/../../dist/libs/remixd/index.js" } }; diff --git a/lerna.json b/lerna.json index 35e3a8c36f..708004a98a 100644 --- a/lerna.json +++ b/lerna.json @@ -7,7 +7,8 @@ "dist/libs/remix-simulator", "dist/libs/remix-solidity", "dist/libs/remix-tests", - "dist/libs/remix-url-resolver" + "dist/libs/remix-url-resolver", + "dist/libs/remix-ws-templates" ], "version": "independent", "command": { diff --git a/package.json b/package.json index fb127e9f7f..20b0ecb93b 100644 --- a/package.json +++ b/package.json @@ -45,8 +45,8 @@ "workspace-schematic": "nx workspace-schematic", "dep-graph": "nx dep-graph", "help": "nx help", - "lint:libs": "nx run-many --target=lint --projects=remix-analyzer,remix-astwalker,remix-debug,remix-lib,remix-simulator,remix-solidity,remix-tests,remix-url-resolver,remixd,remix-ui-tree-view,remix-ui-modal-dialog,remix-ui-toaster,remix-ui-helper,remix-ui-debugger-ui,remix-ui-workspace,remix-ui-static-analyser,remix-ui-checkbox,remix-ui-settings,remix-core-plugin,remix-ui-renderer,remix-ui-publish-to-storage,remix-ui-solidity-compiler,solidity-unit-testing,remix-ui-plugin-manager,remix-ui-terminal,remix-ui-editor,remix-ui-app,remix-ui-tabs,remix-ui-panel,remix-ui-run-tab,remix-ui-permission-handler,remix-ui-search", - "build:libs": "nx run-many --target=build --parallel=false --with-deps=true --projects=remix-analyzer,remix-astwalker,remix-debug,remix-lib,remix-simulator,remix-solidity,remix-tests,remix-url-resolver,remixd", + "lint:libs": "nx run-many --target=lint --projects=remix-analyzer,remix-astwalker,remix-debug,remix-lib,remix-simulator,remix-solidity,remix-tests,remix-url-resolver,remix-ws-templates,remixd,remix-ui-tree-view,remix-ui-modal-dialog,remix-ui-toaster,remix-ui-helper,remix-ui-debugger-ui,remix-ui-workspace,remix-ui-static-analyser,remix-ui-checkbox,remix-ui-settings,remix-core-plugin,remix-ui-renderer,remix-ui-publish-to-storage,remix-ui-solidity-compiler,solidity-unit-testing,remix-ui-plugin-manager,remix-ui-terminal,remix-ui-editor,remix-ui-app,remix-ui-tabs,remix-ui-panel,remix-ui-run-tab,remix-ui-permission-handler,remix-ui-search", + "build:libs": "nx run-many --target=build --parallel=false --with-deps=true --projects=remix-analyzer,remix-astwalker,remix-debug,remix-lib,remix-simulator,remix-solidity,remix-tests,remix-url-resolver,remix-ws-templates,remixd", "test:libs": "nx run-many --target=test --projects=remix-analyzer,remix-astwalker,remix-debug,remix-lib,remix-simulator,remix-solidity,remix-tests,remix-url-resolver,remixd", "publish:libs": "npm run build:libs && lerna publish --skip-git && npm run bumpVersion:libs", "build:e2e": "node apps/remix-ide-e2e/src/buildGroupTests.js && tsc -p apps/remix-ide-e2e/tsconfig.e2e.json", diff --git a/tsconfig.base.json b/tsconfig.base.json index daadc1ca43..409590c800 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -34,6 +34,9 @@ "@remix-project/remix-url-resolver": [ "dist/libs/remix-url-resolver/src/index.js" ], + "@remix-project/remix-ws-templates": [ + "dist/libs/remix-ws-templates/src/index.js" + ], "@remixproject/debugger-plugin": ["apps/debugger/src/index.ts"], "@remixproject/solidity-compiler-plugin": [ "apps/solidity-compiler/src/index.ts" @@ -84,9 +87,6 @@ "@remix-ui/run-tab": ["libs/remix-ui/run-tab/src/index.ts"], "@remix-ui/permission-handler": [ "libs/remix-ui/permission-handler/src/index.ts" - ], - "@remix-project/remix-ws-templates": [ - "dist/libs/remix-ws-templates/src/index.js" ] } }, From b3c643fa0483a51c94526c49516e210ae7f081fa Mon Sep 17 00:00:00 2001 From: Aniket-Engg Date: Thu, 12 May 2022 10:55:12 +0530 Subject: [PATCH 16/16] README updated --- gulpfile.js | 1 + libs/README.md | 1 + libs/remix-ws-templates/README.md | 21 +++++++++++++++++---- libs/remix-ws-templates/package.json | 8 ++++++-- 4 files changed, 25 insertions(+), 6 deletions(-) diff --git a/gulpfile.js b/gulpfile.js index 0d5d2ead87..c32e229f8f 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -51,6 +51,7 @@ task('syncLibVersions', async function () { 'remix-solidity', 'remix-tests', 'remix-url-resolver', + 'remix-ws-templates', 'remixd' ] diff --git a/libs/README.md b/libs/README.md index e8db9a2ad3..498defef08 100644 --- a/libs/README.md +++ b/libs/README.md @@ -23,6 +23,7 @@ Here is the brief description of Remix libraries. + [`remix-lib`](remix-lib/README.md): Common place for libraries being used across multiple modules + [`remix-tests`](remix-tests/README.md): Unit test Solidity smart contracts. It works as a plugin & as CLI both + [`remix-url-resolver`](remix-url-resolver/README.md): Provide helpers for resolving the content from external URL ( including github, swarm, ipfs etc.). ++ [`remix-ws-templates`](remix-ws-templates/README.md): To create a workspace using different templates on Remix IDE + [`remixd`](remixd/README.md): Allow accessing local filesystem from Remix IDE by running a daemon Each library is an NPM package and has basic documentation about its usage in its own `README`. diff --git a/libs/remix-ws-templates/README.md b/libs/remix-ws-templates/README.md index a48800596f..379f5702de 100644 --- a/libs/remix-ws-templates/README.md +++ b/libs/remix-ws-templates/README.md @@ -1,7 +1,20 @@ -# remix-ws-templates +## remix-ws-templates +[![npm version](https://badge.fury.io/js/%40remix-project%2Fremix-ws-templates.svg)](https://www.npmjs.com/package/@remix-project/remix-ws-templates) -This library was generated with [Nx](https://nx.dev). -## Running unit tests +`@remix-project/remix-ws-templates` is used to create a workspace using different templates on Remix IDE. -Run `nx test remix-ws-templates` to execute the unit tests via [Jest](https://jestjs.io). +### Installation + +`@remix-project/remix-ws-templates` is an NPM package and can be installed using NPM as: + +`npm install @remix-project/remix-ws-templates` + +### Contribute + +Please feel free to open an issue or a pull request. + +In case you want to add some code, do have a look to our contribution guidelnes [here](https://github.com/ethereum/remix-project/blob/master/CONTRIBUTING.md). Reach us on [Gitter](https://gitter.im/ethereum/remix) in case of any queries. + +### License +MIT © 2022 Remix Team diff --git a/libs/remix-ws-templates/package.json b/libs/remix-ws-templates/package.json index c0ebf1b058..949c7b21f8 100644 --- a/libs/remix-ws-templates/package.json +++ b/libs/remix-ws-templates/package.json @@ -1,7 +1,7 @@ { "name": "@remix-project/remix-ws-templates", "version": "1.0.0", - "description": "", + "description": "Create a Remix IDE workspace using different templates", "main": "src/index.js", "types": "src/index.d.ts", "scripts": { @@ -15,5 +15,9 @@ "url": "git+https://github.com/ethereum/remix-project.git" }, "author": "Aniket-Engg", - "license": "ISC" + "license": "MIT", + "bugs": { + "url": "https://github.com/ethereum/remix-project/issues" + }, + "homepage": "https://github.com/ethereum/remix-project/tree/master/libs/remix-ws-templates#readme" } \ No newline at end of file