@ -195,6 +195,26 @@ module.exports = {
. journalLastChildIncludes ( '"documentation": "param2 from library"' )
. journalLastChildIncludes ( '"documentation": "param3 from library"' )
. journalLastChildIncludes ( 'Debug the transaction to get more information.' )
} ,
'Should compile and deploy 2 simple contracts, the contract creation component state should be correctly reset for the deployment of the second contract #group4' : function ( browser : NightwatchBrowser ) {
browser
. addFile ( 'Storage.sol' , sources [ 6 ] [ 'Storage.sol' ] )
. addFile ( 'Owner.sol' , sources [ 6 ] [ 'Owner.sol' ] )
. clickLaunchIcon ( 'udapp' )
. createContract ( '42' )
. openFile ( 'Storage.sol' )
. clickLaunchIcon ( 'udapp' )
. createContract ( '' ) // this creation will fail if the component hasn't been properly reset.
. clickInstance ( 1 )
. clickFunction ( 'store - transact (not payable)' , { types : 'uint256 num' , values : '24' } )
. testFunction ( 'last' , // we check if the contract is actually reachable.
{
status : 'true Transaction mined and execution succeed' ,
'decoded input' : {
'uint256 num' : '24'
}
} )
. end ( )
}
}
@ -322,5 +342,92 @@ contract C {
}
} `
}
} ,
{
'Owner.sol' : {
content : `
// SPDX-License-Identifier: GPL-3.0
pragma solidity >= 0.7 . 0 < 0.9.0 ;
/ * *
* @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 ( uint p ) {
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 ;
}
} `
} ,
'Storage.sol' : {
content : `
// SPDX-License-Identifier: GPL-3.0
pragma solidity >= 0.7 . 0 < 0.9.0 ;
/ * *
* @title Storage
* @dev Store & retrieve value in a variable
* /
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 ;
}
} `
}
}
]