diff --git a/libs/remix-ui/workspace/src/lib/remix-ui-workspace.tsx b/libs/remix-ui/workspace/src/lib/remix-ui-workspace.tsx index 70551c701f..293b6d63cc 100644 --- a/libs/remix-ui/workspace/src/lib/remix-ui-workspace.tsx +++ b/libs/remix-ui/workspace/src/lib/remix-ui-workspace.tsx @@ -134,6 +134,7 @@ export function Workspace () { + ) diff --git a/libs/remix-ws-templates/src/index.ts b/libs/remix-ws-templates/src/index.ts index bf130689f2..011ddba170 100644 --- a/libs/remix-ws-templates/src/index.ts +++ b/libs/remix-ws-templates/src/index.ts @@ -1,3 +1,4 @@ export { default as remixDefault } from './templates/remixDefault' +export { default as blank } from './templates/blank' export { default as ozerc20 } from './templates/ozerc20' -export { default as blank } from './templates/blank' \ No newline at end of file +export { default as ozerc721 } from './templates/ozerc721' diff --git a/libs/remix-ws-templates/src/templates/ozerc20/index.ts b/libs/remix-ws-templates/src/templates/ozerc20/index.ts index 683bfdd530..cc1f087b55 100644 --- a/libs/remix-ws-templates/src/templates/ozerc20/index.ts +++ b/libs/remix-ws-templates/src/templates/ozerc20/index.ts @@ -3,13 +3,13 @@ export default async () => { // @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/ozerc721/contracts/SampleERC721.sol b/libs/remix-ws-templates/src/templates/ozerc721/contracts/SampleERC721.sol new file mode 100644 index 0000000000..5a0d40c8e3 --- /dev/null +++ b/libs/remix-ws-templates/src/templates/ozerc721/contracts/SampleERC721.sol @@ -0,0 +1,14 @@ +// SPDX-License-Identifier: GPL-3.0 + +pragma solidity >=0.7.0 <0.9.0; + +import "@openzeppelin/contracts/token/ERC721/ERC721.sol"; + +/** + * @title SampleERC721 + * @dev Create a sample ERC721 standard token + */ +contract SampleERC721 is ERC721 { + + constructor(string memory tokenName, string memory tokenSymbol) ERC721(tokenName, tokenSymbol) {} +} \ No newline at end of file diff --git a/libs/remix-ws-templates/src/templates/ozerc721/index.ts b/libs/remix-ws-templates/src/templates/ozerc721/index.ts new file mode 100644 index 0000000000..4d27a7295a --- /dev/null +++ b/libs/remix-ws-templates/src/templates/ozerc721/index.ts @@ -0,0 +1,16 @@ +export default async () => { + return { + // @ts-ignore + 'contracts/SampleERC721.sol': (await import('raw-loader!./contracts/SampleERC721.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/SampleERC721_test.sol': (await import('raw-loader!./tests/SampleERC721_test.sol')).default + } +} \ No newline at end of file diff --git a/libs/remix-ws-templates/src/templates/ozerc721/scripts/deploy_with_ethers.ts b/libs/remix-ws-templates/src/templates/ozerc721/scripts/deploy_with_ethers.ts new file mode 100644 index 0000000000..16a5635ee9 --- /dev/null +++ b/libs/remix-ws-templates/src/templates/ozerc721/scripts/deploy_with_ethers.ts @@ -0,0 +1,10 @@ +import { deploy } from './ethers' + +(async () => { + try { + const result = await deploy('SampleERC721', ['testNFT', 'TNFT']) + console.log(`address: ${result.address}`) + } catch (e) { + console.log(e.message) + } + })() \ No newline at end of file diff --git a/libs/remix-ws-templates/src/templates/ozerc721/scripts/deploy_with_web3.ts b/libs/remix-ws-templates/src/templates/ozerc721/scripts/deploy_with_web3.ts new file mode 100644 index 0000000000..5fc0b3d01b --- /dev/null +++ b/libs/remix-ws-templates/src/templates/ozerc721/scripts/deploy_with_web3.ts @@ -0,0 +1,10 @@ +import { deploy } from './web3' + +(async () => { + try { + const result = await deploy('SampleERC721', ['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/src/templates/ozerc721/scripts/ethers.ts b/libs/remix-ws-templates/src/templates/ozerc721/scripts/ethers.ts new file mode 100644 index 0000000000..04c363322a --- /dev/null +++ b/libs/remix-ws-templates/src/templates/ozerc721/scripts/ethers.ts @@ -0,0 +1,27 @@ + + + +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` + + 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() + + const 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 +} \ No newline at end of file diff --git a/libs/remix-ws-templates/src/templates/ozerc721/scripts/web3.ts b/libs/remix-ws-templates/src/templates/ozerc721/scripts/web3.ts new file mode 100644 index 0000000000..62f43b6611 --- /dev/null +++ b/libs/remix-ws-templates/src/templates/ozerc721/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` + + 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-ws-templates/src/templates/ozerc721/tests/SampleERC721_test.sol b/libs/remix-ws-templates/src/templates/ozerc721/tests/SampleERC721_test.sol new file mode 100644 index 0000000000..27a4c46826 --- /dev/null +++ b/libs/remix-ws-templates/src/templates/ozerc721/tests/SampleERC721_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/SampleERC721.sol"; + +contract SampleERC721Test { + + SampleERC721 s; + function beforeAll () public { + s = new SampleERC721("TestNFT", "TNFT"); + } + + function testTokenNameAndSymbol () public { + Assert.equal(s.name(), "TestNFT", "token name did not match"); + Assert.equal(s.symbol(), "TNFT", "token symbol did not match"); + } +} \ No newline at end of file diff --git a/libs/remix-ws-templates/src/templates/remixDefault/index.ts b/libs/remix-ws-templates/src/templates/remixDefault/index.ts index eb73dba979..683c616397 100644 --- a/libs/remix-ws-templates/src/templates/remixDefault/index.ts +++ b/libs/remix-ws-templates/src/templates/remixDefault/index.ts @@ -7,17 +7,17 @@ export default async () => { // @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, + '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/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, + 'tests/storage.test.js': (await import('!!raw-loader!./tests/storage.test.js')).default, // @ts-ignore 'README.txt': (await import('raw-loader!./README.txt')).default, }