From d4d628285be9e42414d767506fc0a7a4f4aa5a0f Mon Sep 17 00:00:00 2001 From: joelamouche Date: Thu, 8 Apr 2021 11:43:24 +0000 Subject: [PATCH 1/2] made a test for reading block gas limit in contracts --- tests/package-lock.json | 97 ++++++++++++++++++++++++++ tests/package.json | 1 + tests/tests/constants/testContracts.ts | 49 +++++++++++++ tests/tests/test-block.ts | 31 +++++++- 4 files changed, 175 insertions(+), 3 deletions(-) diff --git a/tests/package-lock.json b/tests/package-lock.json index 6980e4146f2..f96e7bb2b98 100644 --- a/tests/package-lock.json +++ b/tests/package-lock.json @@ -1368,6 +1368,16 @@ "delayed-stream": "~1.0.0" } }, + "command-exists": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/command-exists/-/command-exists-1.2.9.tgz", + "integrity": "sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==" + }, + "commander": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/commander/-/commander-3.0.2.tgz", + "integrity": "sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow==" + }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -2036,6 +2046,11 @@ "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==" }, + "follow-redirects": { + "version": "1.13.3", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.3.tgz", + "integrity": "sha512-DUgl6+HDzB0iEptNQEXLx/KhTmDb8tZUHSeLqpnjpknR70H0nC2t9N73BK6fN4hOvJ84pKlIQVQ4k5FFlBedKA==" + }, "foreach": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", @@ -2608,6 +2623,14 @@ "json-buffer": "3.0.0" } }, + "klaw": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", + "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=", + "requires": { + "graceful-fs": "^4.1.9" + } + }, "locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -2649,6 +2672,11 @@ "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" }, + "memorystream": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", + "integrity": "sha1-htcJCzDORV1j+64S3aUaR93K+bI=" + }, "merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", @@ -2975,6 +3003,11 @@ "wrappy": "1" } }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" + }, "p-cancelable": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", @@ -3244,6 +3277,11 @@ "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" }, + "require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==" + }, "responselike": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", @@ -3315,6 +3353,11 @@ "node-gyp-build": "^4.2.0" } }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, "send": { "version": "0.17.1", "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", @@ -3407,6 +3450,52 @@ "simple-concat": "^1.0.0" } }, + "solc": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/solc/-/solc-0.8.3.tgz", + "integrity": "sha512-VZvSHtwe2zAsoviClIpWjvrg22bIZ0pLtzFrYD9BtPfR7mhMZYwpptnzRizNaSvMngTR+gB9Ul8IyL5xaC7+jw==", + "requires": { + "command-exists": "^1.2.8", + "commander": "3.0.2", + "follow-redirects": "^1.12.1", + "fs-extra": "^0.30.0", + "js-sha3": "0.8.0", + "memorystream": "^0.3.1", + "require-from-string": "^2.0.0", + "semver": "^5.5.0", + "tmp": "0.0.33" + }, + "dependencies": { + "fs-extra": { + "version": "0.30.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", + "integrity": "sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A=", + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^2.1.0", + "klaw": "^1.0.0", + "path-is-absolute": "^1.0.0", + "rimraf": "^2.2.8" + } + }, + "jsonfile": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", + "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "requires": { + "glob": "^7.1.3" + } + } + } + }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -3616,6 +3705,14 @@ "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=" }, + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "requires": { + "os-tmpdir": "~1.0.2" + } + }, "to-readable-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", diff --git a/tests/package.json b/tests/package.json index 17373db1520..bac73726763 100644 --- a/tests/package.json +++ b/tests/package.json @@ -19,6 +19,7 @@ "mocha": "^8.3.2", "mocha-steps": "^1.3.0", "rimraf": "^3.0.2", + "solc": "^0.8.3", "ts-node": "9.1", "typescript": "^3.9.6", "web3": "^1.3.5" diff --git a/tests/tests/constants/testContracts.ts b/tests/tests/constants/testContracts.ts index e9b8f9d4195..391f9045d49 100644 --- a/tests/tests/constants/testContracts.ts +++ b/tests/tests/constants/testContracts.ts @@ -1,4 +1,33 @@ import { AbiItem } from "web3-utils"; +import solc from "solc"; + +export function compileSolidity(contractContent: string, contractName: string = "Test") { + let result = JSON.parse( + solc.compile( + JSON.stringify({ + language: "Solidity", + sources: { + "main.sol": { + content: contractContent, + }, + }, + settings: { + outputSelection: { + "*": { + "*": ["*"], + }, + }, + }, + }) + ) + ); + + const contract = result.contracts["main.sol"][contractName]; + return { + bytecode: "0x" + contract.evm.bytecode.object, + contract, + }; +} // Solidity: contract test {function multiply(uint a) public pure returns(uint d) {return a * 7;}} export const TEST_CONTRACT_BYTECODE = @@ -201,6 +230,26 @@ export const FINITE_LOOP_CONTRACT_ABI = [ }, ] as AbiItem[]; +// Gas limit test contract + +export const contractSourceBlockGasLimit = ` +pragma solidity >=0.8.0; + +// Docs I'm following to get these properties +// https://docs.soliditylang.org/en/v0.8.2/units-and-global-variables.html + +contract CheckBlockGasLimit { + // This one is broken (evaluates to 0) + uint public gas; + // This one works + uint public chainid; + + constructor() { + gas = block.gaslimit; + chainid = block.chainid; + } +}`; + export const ERC20_BYTECODE = "0x608060405234801561001057600080fd5b50610024336202616061002960201b60201c565b610274565b600073ff" + "ffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156100" + diff --git a/tests/tests/test-block.ts b/tests/tests/test-block.ts index 8f3579f0601..b26436b0359 100644 --- a/tests/tests/test-block.ts +++ b/tests/tests/test-block.ts @@ -1,8 +1,20 @@ import { expect } from "chai"; import { step } from "mocha-steps"; -import { contractCreation, GENESIS_ACCOUNT } from "./constants"; - -import { createAndFinalizeBlock, describeWithMoonbeam, fillBlockWithTx } from "./util"; +import { + compileSolidity, + contractCreation, + contractSourceBlockGasLimit, + GENESIS_ACCOUNT, + GENESIS_ACCOUNT_PRIVATE_KEY, +} from "./constants"; + +import { + createAndFinalizeBlock, + customRequest, + deployContractManualSeal, + describeWithMoonbeam, + fillBlockWithTx, +} from "./util"; describeWithMoonbeam("Moonbeam RPC (Block)", `simple-specs.json`, (context) => { let previousBlock; @@ -198,4 +210,17 @@ describeWithMoonbeam("Moonbeam RPC (Block)", `simple-specs.json`, (context) => { let { txPassed } = await fillBlockWithTx(context, 8193, contractCreation); expect(txPassed).to.eq(0); }); + + it("should be able to access block gas lmit within a contract", async function () { + this.timeout(15000); + const contractCompiled = compileSolidity(contractSourceBlockGasLimit, "CheckBlockGasLimit"); + const contract = await deployContractManualSeal( + context.polkadotApi, + context.web3, + contractCompiled.bytecode, + contractCompiled.contract.abi + ); + console.log("gas", await contract.methods.gas().call()); + expect((await contract.methods.gas().call()) !== "0").to.eq(true); + }); }); From 234e91db267f05288c448034d971e07e4fc80618 Mon Sep 17 00:00:00 2001 From: joelamouche Date: Thu, 8 Apr 2021 11:46:37 +0000 Subject: [PATCH 2/2] lint --- tests/tests/constants/testContracts.ts | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/tests/tests/constants/testContracts.ts b/tests/tests/constants/testContracts.ts index 391f9045d49..80ed11f8af8 100644 --- a/tests/tests/constants/testContracts.ts +++ b/tests/tests/constants/testContracts.ts @@ -239,15 +239,15 @@ pragma solidity >=0.8.0; // https://docs.soliditylang.org/en/v0.8.2/units-and-global-variables.html contract CheckBlockGasLimit { - // This one is broken (evaluates to 0) - uint public gas; - // This one works - uint public chainid; + // This one is broken (evaluates to 0) + uint public gas; + // This one works + uint public chainid; - constructor() { - gas = block.gaslimit; - chainid = block.chainid; - } + constructor() { + gas = block.gaslimit; + chainid = block.chainid; + } }`; export const ERC20_BYTECODE =