Commit 4a177ba1 authored by Kelvin Fichter's avatar Kelvin Fichter

Ported DELEGATECALL tests

parent 4e9fc86f
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
"build": "yarn run build:contracts", "build": "yarn run build:contracts",
"build:contracts": "buidler compile", "build:contracts": "buidler compile",
"test": "yarn run test:contracts", "test": "yarn run test:contracts",
"test:contracts": "buidler test \"test/contracts/OVM/execution/OVM_ExecutionManager/ovmCREATE.spec.ts\"", "test:contracts": "buidler test \"test/contracts/OVM/execution/OVM_ExecutionManager/ovmDELEGATECALL.spec.ts\"",
"lint": "tslint --format stylish --project .", "lint": "tslint --format stylish --project .",
"fix": "prettier --config prettier-config.json --write \"buidler.config.ts\" \"{src,test}/**/*.ts\"" "fix": "prettier --config prettier-config.json --write \"buidler.config.ts\" \"{src,test}/**/*.ts\""
}, },
......
/* Internal Imports */ /* Internal Imports */
import { import {
runExecutionManagerTest, ExecutionManagerTestRunner,
TestDefinition, TestDefinition,
GAS_LIMIT, GAS_LIMIT,
NULL_BYTES32, NULL_BYTES32,
NON_NULL_BYTES32, NON_NULL_BYTES32,
REVERT_FLAGS, REVERT_FLAGS,
DUMMY_BYTECODE, DUMMY_BYTECODE,
VERIFIED_EMPTY_CONTRACT_HASH,
} from '../../../../helpers' } from '../../../../helpers'
const CREATED_CONTRACT_1 = '0x2bda4a99d5be88609d23b1e4ab5d1d34fb1c2feb' const CREATED_CONTRACT_1 = '0x2bda4a99d5be88609d23b1e4ab5d1d34fb1c2feb'
...@@ -41,200 +42,318 @@ const test_ovmDELEGATECALL: TestDefinition = { ...@@ -41,200 +42,318 @@ const test_ovmDELEGATECALL: TestDefinition = {
codeHash: NON_NULL_BYTES32, codeHash: NON_NULL_BYTES32,
ethAddress: '$OVM_CALL_HELPER', ethAddress: '$OVM_CALL_HELPER',
}, },
[CREATED_CONTRACT_1]: {
codeHash: VERIFIED_EMPTY_CONTRACT_HASH,
ethAddress: '0x' + '00'.repeat(20),
},
[CREATED_CONTRACT_2]: {
codeHash: VERIFIED_EMPTY_CONTRACT_HASH,
ethAddress: '0x' + '00'.repeat(20),
},
}, },
}, },
}, },
parameters: [ parameters: [
{ {
name: 'ovmCALL(ADDRESS_1) => ovmDELEGATECALL(ADDRESS_2) => ovmADDRESS',
steps: [
{
functionName: 'ovmCALL',
functionParams: {
gasLimit: GAS_LIMIT,
target: '$DUMMY_OVM_ADDRESS_1',
subSteps: [
{
functionName: 'ovmDELEGATECALL',
functionParams: {
gasLimit: GAS_LIMIT,
target: '$DUMMY_OVM_ADDRESS_2',
subSteps: [
{
functionName: 'ovmADDRESS',
expectedReturnValue: '$DUMMY_OVM_ADDRESS_1',
},
],
},
expectedReturnStatus: true,
},
],
},
expectedReturnStatus: true,
},
],
},
{
name:
'ovmCALL(ADDRESS_1) => ovmCALL(ADDRESS_2) => ovmDELEGATECALL(ADDRESS_3) => ovmCALLER',
steps: [ steps: [
{ {
functionName: 'ovmCALL', functionName: 'ovmCALL',
functionParams: [ functionParams: {
GAS_LIMIT, gasLimit: GAS_LIMIT,
'$DUMMY_OVM_ADDRESS_1', target: '$DUMMY_OVM_ADDRESS_1',
[ subSteps: [
{ {
functionName: 'ovmCALL', functionName: 'ovmCALL',
functionParams: [ functionParams: {
GAS_LIMIT, gasLimit: GAS_LIMIT,
'$DUMMY_OVM_ADDRESS_2', target: '$DUMMY_OVM_ADDRESS_2',
[ subSteps: [
{ {
functionName: 'ovmDELEGATECALL', functionName: 'ovmDELEGATECALL',
functionParams: [ functionParams: {
GAS_LIMIT, gasLimit: GAS_LIMIT,
'$DUMMY_OVM_ADDRESS_3', target: '$DUMMY_OVM_ADDRESS_2',
[ subSteps: [
{ {
functionName: 'ovmCALLER', functionName: 'ovmCALLER',
functionParams: [], expectedReturnValue: '$DUMMY_OVM_ADDRESS_1',
expectedReturnStatus: true,
expectedReturnValues: ['$DUMMY_OVM_ADDRESS_1'],
},
{
functionName: 'ovmADDRESS',
functionParams: [],
expectedReturnStatus: true,
expectedReturnValues: ['$DUMMY_OVM_ADDRESS_2'],
},
{
functionName: 'ovmSSTORE',
functionParams: [
NON_NULL_BYTES32,
NON_NULL_BYTES32,
],
expectedReturnStatus: true,
expectedReturnValues: [],
},
{
functionName: 'ovmSLOAD',
functionParams: [NON_NULL_BYTES32],
expectedReturnStatus: true,
expectedReturnValues: [NON_NULL_BYTES32],
}, },
], ],
], },
expectedReturnStatus: true, expectedReturnStatus: true,
expectedReturnValues: ['$DUMMY_OVM_ADDRESS_1'],
}, },
], ],
], },
expectedReturnStatus: true, expectedReturnStatus: true,
expectedReturnValues: [],
}, },
],
},
expectedReturnStatus: true,
},
],
},
{
name:
'ovmCALL(ADDRESS_1) => (ovmDELEGATECALL(ADDRESS_2) => ovmSSTORE) + ovmSLOAD',
steps: [
{
functionName: 'ovmCALL',
functionParams: {
gasLimit: GAS_LIMIT,
target: '$DUMMY_OVM_ADDRESS_1',
subSteps: [
{ {
functionName: 'ovmCALL', functionName: 'ovmDELEGATECALL',
functionParams: [ functionParams: {
GAS_LIMIT / 2, gasLimit: GAS_LIMIT,
'$DUMMY_OVM_ADDRESS_2', target: '$DUMMY_OVM_ADDRESS_2',
[ subSteps: [
{ {
functionName: 'ovmSLOAD', functionName: 'ovmSSTORE',
functionParams: [NON_NULL_BYTES32], functionParams: {
key: NON_NULL_BYTES32,
value: NON_NULL_BYTES32,
},
expectedReturnStatus: true, expectedReturnStatus: true,
expectedReturnValues: [NON_NULL_BYTES32],
}, },
], ],
], },
expectedReturnStatus: true,
},
{
functionName: 'ovmSLOAD',
functionParams: {
key: NON_NULL_BYTES32,
},
expectedReturnStatus: true, expectedReturnStatus: true,
expectedReturnValues: [], expectedReturnValue: NON_NULL_BYTES32,
}, },
], ],
], },
expectedReturnStatus: true, expectedReturnStatus: true,
expectedReturnValues: [],
}, },
], ],
}, },
{ {
name: 'ovmCALL(ADDRESS_1) => (ovmDELEGATECALL(ADDRESS_2) => ovmCREATE)',
steps: [ steps: [
{ {
functionName: 'ovmCALL', functionName: 'ovmCALL',
functionParams: [ functionParams: {
GAS_LIMIT, gasLimit: GAS_LIMIT,
'$DUMMY_OVM_ADDRESS_1', target: '$DUMMY_OVM_ADDRESS_1',
[ subSteps: [
{ {
functionName: 'ovmDELEGATECALL', functionName: 'ovmDELEGATECALL',
functionParams: [ functionParams: {
GAS_LIMIT, gasLimit: GAS_LIMIT,
'$DUMMY_OVM_ADDRESS_2', target: '$DUMMY_OVM_ADDRESS_2',
[ subSteps: [
{ {
functionName: 'ovmCREATE', functionName: 'ovmCREATE',
functionParams: [DUMMY_BYTECODE, true, []], functionParams: {
bytecode: DUMMY_BYTECODE,
},
expectedReturnStatus: true, expectedReturnStatus: true,
expectedReturnValues: [CREATED_CONTRACT_1], expectedReturnValue: CREATED_CONTRACT_1,
}, },
], ],
], },
expectedReturnStatus: true, expectedReturnStatus: true,
expectedReturnValues: [],
}, },
], ],
], },
expectedReturnStatus: true, expectedReturnStatus: true,
expectedReturnValues: [],
}, },
], ],
}, },
{ {
name:
'ovmCALL(ADDRESS_1) => ovmCALL(ADDRESS_2) => ovmDELEGATECALL(ADDRESS_3) => ovmDELEGATECALL(ADDRESS_4) => ovmCALLER',
steps: [ steps: [
{ {
functionName: 'ovmCALL', functionName: 'ovmCALL',
functionParams: [ functionParams: {
GAS_LIMIT, gasLimit: GAS_LIMIT,
'$DUMMY_OVM_ADDRESS_1', target: '$DUMMY_OVM_ADDRESS_1',
[ subSteps: [
{ {
functionName: 'ovmCALL', functionName: 'ovmCALL',
functionParams: [ functionParams: {
GAS_LIMIT, gasLimit: GAS_LIMIT,
'$DUMMY_OVM_ADDRESS_2', target: '$DUMMY_OVM_ADDRESS_2',
[ subSteps: [
{ {
functionName: 'ovmDELEGATECALL', functionName: 'ovmDELEGATECALL',
functionParams: [ functionParams: {
GAS_LIMIT, gasLimit: GAS_LIMIT,
'$DUMMY_OVM_ADDRESS_3', target: '$DUMMY_OVM_ADDRESS_2',
[ subSteps: [
{ {
functionName: 'ovmDELEGATECALL', functionName: 'ovmDELEGATECALL',
functionParams: [ functionParams: {
GAS_LIMIT, gasLimit: GAS_LIMIT,
'$DUMMY_OVM_ADDRESS_4', target: '$DUMMY_OVM_ADDRESS_3',
[ subSteps: [
{ {
functionName: 'ovmCALLER', functionName: 'ovmCALLER',
functionParams: [], expectedReturnValue: '$DUMMY_OVM_ADDRESS_1',
expectedReturnStatus: true,
expectedReturnValues: [
'$DUMMY_OVM_ADDRESS_1',
],
}, },
],
},
expectedReturnStatus: true,
},
],
},
expectedReturnStatus: true,
},
],
},
expectedReturnStatus: true,
},
],
},
expectedReturnStatus: true,
},
],
},
{
name:
'ovmCALL(ADDRESS_1) => ovmCALL(ADDRESS_2) => ovmDELEGATECALL(ADDRESS_3) => ovmDELEGATECALL(ADDRESS_4) => ovmADDRESS',
steps: [
{
functionName: 'ovmCALL',
functionParams: {
gasLimit: GAS_LIMIT,
target: '$DUMMY_OVM_ADDRESS_1',
subSteps: [
{
functionName: 'ovmCALL',
functionParams: {
gasLimit: GAS_LIMIT,
target: '$DUMMY_OVM_ADDRESS_2',
subSteps: [
{
functionName: 'ovmDELEGATECALL',
functionParams: {
gasLimit: GAS_LIMIT,
target: '$DUMMY_OVM_ADDRESS_2',
subSteps: [
{
functionName: 'ovmDELEGATECALL',
functionParams: {
gasLimit: GAS_LIMIT,
target: '$DUMMY_OVM_ADDRESS_3',
subSteps: [
{ {
functionName: 'ovmADDRESS', functionName: 'ovmADDRESS',
functionParams: [], expectedReturnValue: '$DUMMY_OVM_ADDRESS_2',
expectedReturnStatus: true,
expectedReturnValues: [
'$DUMMY_OVM_ADDRESS_2',
],
}, },
],
},
expectedReturnStatus: true,
},
],
},
expectedReturnStatus: true,
},
],
},
expectedReturnStatus: true,
},
],
},
expectedReturnStatus: true,
},
],
},
{
name:
'ovmCALL(ADDRESS_1) => ovmCALL(ADDRESS_2) => ovmDELEGATECALL(ADDRESS_3) => ovmDELEGATECALL(ADDRESS_4) => ovmCREATE',
steps: [
{
functionName: 'ovmCALL',
functionParams: {
gasLimit: GAS_LIMIT,
target: '$DUMMY_OVM_ADDRESS_1',
subSteps: [
{
functionName: 'ovmCALL',
functionParams: {
gasLimit: GAS_LIMIT,
target: '$DUMMY_OVM_ADDRESS_2',
subSteps: [
{
functionName: 'ovmDELEGATECALL',
functionParams: {
gasLimit: GAS_LIMIT,
target: '$DUMMY_OVM_ADDRESS_2',
subSteps: [
{
functionName: 'ovmDELEGATECALL',
functionParams: {
gasLimit: GAS_LIMIT,
target: '$DUMMY_OVM_ADDRESS_3',
subSteps: [
{ {
functionName: 'ovmCREATE', functionName: 'ovmCREATE',
functionParams: [DUMMY_BYTECODE, true, []], functionParams: {
bytecode: DUMMY_BYTECODE,
},
expectedReturnStatus: true, expectedReturnStatus: true,
expectedReturnValues: [CREATED_CONTRACT_2], expectedReturnValue: CREATED_CONTRACT_2,
}, },
], ],
], },
expectedReturnStatus: true, expectedReturnStatus: true,
expectedReturnValues: [],
}, },
], ],
], },
expectedReturnStatus: true, expectedReturnStatus: true,
expectedReturnValues: [],
}, },
], ],
], },
expectedReturnStatus: true,
expectedReturnValues: [],
},
{
functionName: 'ovmADDRESS',
functionParams: [],
expectedReturnStatus: true, expectedReturnStatus: true,
expectedReturnValues: ['$DUMMY_OVM_ADDRESS_1'],
}, },
], ],
], },
expectedReturnStatus: true, expectedReturnStatus: true,
expectedReturnValues: [],
}, },
], ],
}, },
], ],
} }
runExecutionManagerTest(test_ovmDELEGATECALL) const runner = new ExecutionManagerTestRunner()
runner.run(test_ovmDELEGATECALL)
import { ExecutionManagerTestRunner } from '../../../helpers/test-utils/test-runner'
import { TestDefinition } from '../../../helpers/test-utils/test.types2'
import {
GAS_LIMIT,
NULL_BYTES32,
NON_NULL_BYTES32,
REVERT_FLAGS,
DUMMY_BYTECODE,
VERIFIED_EMPTY_CONTRACT_HASH,
} from '../../../helpers'
const CREATED_CONTRACT_1 = '0x2bda4a99d5be88609d23b1e4ab5d1d34fb1c2feb'
const DUMMY_REVERT_DATA =
'0xdeadbeef1e5420deadbeef1e5420deadbeef1e5420deadbeef1e5420deadbeef1e5420'
const test: TestDefinition = {
name: 'An Example Test',
preState: {
ExecutionManager: {
ovmStateManager: '$OVM_STATE_MANAGER',
ovmSafetyChecker: '$OVM_SAFETY_CHECKER',
messageRecord: {
nuisanceGasLeft: GAS_LIMIT,
},
},
StateManager: {
owner: '$OVM_EXECUTION_MANAGER',
accounts: {
$DUMMY_OVM_ADDRESS_1: {
codeHash: NON_NULL_BYTES32,
ethAddress: '$OVM_CALL_HELPER',
},
$DUMMY_OVM_ADDRESS_2: {
codeHash: NON_NULL_BYTES32,
ethAddress: '$OVM_CALL_HELPER',
},
[CREATED_CONTRACT_1]: {
codeHash: VERIFIED_EMPTY_CONTRACT_HASH,
},
},
},
},
subTests: [
{
name: 'An Example Subtest',
parameters: [
{
name: 'An Example CALL revert test',
steps: [
{
functionName: 'ovmCALL',
functionParams: {
gasLimit: GAS_LIMIT,
target: '$DUMMY_OVM_ADDRESS_1',
subSteps: [
{
functionName: 'ovmCALL',
functionParams: {
gasLimit: GAS_LIMIT,
target: '$DUMMY_OVM_ADDRESS_2',
subSteps: [
{
functionName: 'evmREVERT',
returnData: {
flag: REVERT_FLAGS.INTENTIONAL_REVERT,
data: DUMMY_REVERT_DATA,
},
},
],
},
expectedReturnStatus: false,
expectedReturnValue: DUMMY_REVERT_DATA,
},
],
},
expectedReturnStatus: true,
},
],
},
{
name: 'An Example CREATE test',
steps: [
{
functionName: 'ovmCALL',
functionParams: {
gasLimit: GAS_LIMIT,
target: '$DUMMY_OVM_ADDRESS_1',
subSteps: [
{
functionName: 'ovmCREATE',
functionParams: {
subSteps: [
{
functionName: 'ovmCALLER',
expectedReturnStatus: true,
expectedReturnValue: '$DUMMY_OVM_ADDRESS_1',
},
],
},
expectedReturnStatus: true,
expectedReturnValue: CREATED_CONTRACT_1,
},
],
},
expectedReturnStatus: true,
},
],
},
{
name: 'An Example CALL test',
steps: [
{
functionName: 'ovmCALL',
functionParams: {
gasLimit: GAS_LIMIT,
target: '$DUMMY_OVM_ADDRESS_1',
subSteps: [
{
functionName: 'ovmADDRESS',
expectedReturnStatus: true,
expectedReturnValue: '$DUMMY_OVM_ADDRESS_1',
},
{
functionName: 'ovmCALL',
functionParams: {
gasLimit: GAS_LIMIT,
target: '$DUMMY_OVM_ADDRESS_2',
subSteps: [
{
functionName: 'ovmADDRESS',
expectedReturnStatus: true,
expectedReturnValue: '$DUMMY_OVM_ADDRESS_2',
},
{
functionName: 'ovmCALLER',
expectedReturnStatus: true,
expectedReturnValue: '$DUMMY_OVM_ADDRESS_1',
},
],
},
expectedReturnStatus: true,
},
],
},
expectedReturnStatus: true,
},
],
},
],
},
],
}
const runner = new ExecutionManagerTestRunner()
runner.run(test)
...@@ -113,7 +113,9 @@ export class ExecutionManagerTestRunner { ...@@ -113,7 +113,9 @@ export class ExecutionManagerTestRunner {
} }
} catch (err) { } catch (err) {
if (parameter.expectInvalidStateAccess) { if (parameter.expectInvalidStateAccess) {
expect(err.toString()).to.contain('VM Exception while processing transaction: revert') expect(err.toString()).to.contain(
'VM Exception while processing transaction: revert'
)
} else { } else {
throw err throw err
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment