Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
O
openzeppelin-contracts-upgradeable
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
俞永鹏
openzeppelin-contracts-upgradeable
Commits
b25e8b91
Unverified
Commit
b25e8b91
authored
Oct 08, 2018
by
Nicolás Venturo
Committed by
GitHub
Oct 08, 2018
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #26 from nventuro/sender-param
Added sender parameter to initializers using msg.sender.
parents
716efc4b
14dd3f66
Hide whitespace changes
Inline
Side-by-side
Showing
47 changed files
with
79 additions
and
79 deletions
+79
-79
CapperRole.sol
contracts/access/roles/CapperRole.sol
+3
-3
MinterRole.sol
contracts/access/roles/MinterRole.sol
+3
-3
PauserRole.sol
contracts/access/roles/PauserRole.sol
+3
-3
SignerRole.sol
contracts/access/roles/SignerRole.sol
+3
-3
RefundableCrowdsale.sol
contracts/crowdsale/distribution/RefundableCrowdsale.sol
+1
-1
IndividuallyCappedCrowdsale.sol
...acts/crowdsale/validation/IndividuallyCappedCrowdsale.sol
+2
-2
BreakInvariantBounty.sol
contracts/drafts/BreakInvariantBounty.sol
+2
-2
SignatureBouncer.sol
contracts/drafts/SignatureBouncer.sol
+2
-2
TokenVesting.sol
contracts/drafts/TokenVesting.sol
+3
-2
SampleCrowdsale.sol
contracts/examples/SampleCrowdsale.sol
+2
-2
SimpleToken.sol
contracts/examples/SimpleToken.sol
+3
-3
Pausable.sol
contracts/lifecycle/Pausable.sol
+2
-2
BreakInvariantBountyMock.sol
contracts/mocks/BreakInvariantBountyMock.sol
+1
-1
CapperRoleMock.sol
contracts/mocks/CapperRoleMock.sol
+1
-1
ConditionalEscrowMock.sol
contracts/mocks/ConditionalEscrowMock.sol
+1
-1
ERC20CappedMock.sol
contracts/mocks/ERC20CappedMock.sol
+1
-1
ERC20MintableMock.sol
contracts/mocks/ERC20MintableMock.sol
+1
-2
ERC20PausableMock.sol
contracts/mocks/ERC20PausableMock.sol
+1
-1
ERC721FullMock.sol
contracts/mocks/ERC721FullMock.sol
+2
-1
ERC721MintableBurnableImpl.sol
contracts/mocks/ERC721MintableBurnableImpl.sol
+2
-2
ERC721PausableMock.sol
contracts/mocks/ERC721PausableMock.sol
+1
-1
EscrowMock.sol
contracts/mocks/EscrowMock.sol
+1
-1
IndividuallyCappedCrowdsaleImpl.sol
contracts/mocks/IndividuallyCappedCrowdsaleImpl.sol
+1
-1
MinterRoleMock.sol
contracts/mocks/MinterRoleMock.sol
+1
-1
OwnableMock.sol
contracts/mocks/OwnableMock.sol
+1
-2
PausableMock.sol
contracts/mocks/PausableMock.sol
+1
-1
PauserRoleMock.sol
contracts/mocks/PauserRoleMock.sol
+1
-1
RefundEscrowMock.sol
contracts/mocks/RefundEscrowMock.sol
+1
-1
SampleCrowdsaleMock.sol
contracts/mocks/SampleCrowdsaleMock.sol
+1
-1
SecondaryMock.sol
contracts/mocks/SecondaryMock.sol
+1
-1
SignatureBouncerMock.sol
contracts/mocks/SignatureBouncerMock.sol
+1
-1
SignerRoleMock.sol
contracts/mocks/SignerRoleMock.sol
+1
-1
SimpleTokenMock.sol
contracts/mocks/SimpleTokenMock.sol
+1
-1
TokenVestingMock.sol
contracts/mocks/TokenVestingMock.sol
+2
-1
Ownable.sol
contracts/ownership/Ownable.sol
+2
-2
Secondary.sol
contracts/ownership/Secondary.sol
+2
-2
ConditionalEscrow.sol
contracts/payment/ConditionalEscrow.sol
+2
-2
Escrow.sol
contracts/payment/Escrow.sol
+2
-2
PullPayment.sol
contracts/payment/PullPayment.sol
+1
-1
RefundEscrow.sol
contracts/payment/RefundEscrow.sol
+2
-3
ERC20Capped.sol
contracts/token/ERC20/ERC20Capped.sol
+2
-2
ERC20Mintable.sol
contracts/token/ERC20/ERC20Mintable.sol
+2
-2
ERC20Pausable.sol
contracts/token/ERC20/ERC20Pausable.sol
+2
-2
ERC721MetadataMintable.sol
contracts/token/ERC721/ERC721MetadataMintable.sol
+2
-2
ERC721Mintable.sol
contracts/token/ERC721/ERC721Mintable.sol
+2
-2
ERC721Pausable.sol
contracts/token/ERC721/ERC721Pausable.sol
+2
-2
Ownable.test.js
test/ownership/Ownable.test.js
+2
-2
No files found.
contracts/access/roles/CapperRole.sol
View file @
b25e8b91
...
...
@@ -12,9 +12,9 @@ contract CapperRole is Initializable {
Roles.Role private cappers;
function initialize() public initializer {
if (!isCapper(
msg.
sender)) {
_addCapper(
msg.
sender);
function initialize(
address sender
) public initializer {
if (!isCapper(sender)) {
_addCapper(sender);
}
}
...
...
contracts/access/roles/MinterRole.sol
View file @
b25e8b91
...
...
@@ -12,9 +12,9 @@ contract MinterRole is Initializable {
Roles.Role private minters;
function initialize() public initializer {
if (!isMinter(
msg.
sender)) {
_addMinter(
msg.
sender);
function initialize(
address sender
) public initializer {
if (!isMinter(sender)) {
_addMinter(sender);
}
}
...
...
contracts/access/roles/PauserRole.sol
View file @
b25e8b91
...
...
@@ -12,9 +12,9 @@ contract PauserRole is Initializable {
Roles.Role private pausers;
function initialize() public initializer {
if (!isPauser(
msg.
sender)) {
_addPauser(
msg.
sender);
function initialize(
address sender
) public initializer {
if (!isPauser(sender)) {
_addPauser(sender);
}
}
...
...
contracts/access/roles/SignerRole.sol
View file @
b25e8b91
...
...
@@ -12,9 +12,9 @@ contract SignerRole is Initializable {
Roles.Role private signers;
function initialize() public initializer {
if (!isSigner(
msg.
sender)) {
_addSigner(
msg.
sender);
function initialize(
address sender
) public initializer {
if (!isSigner(sender)) {
_addSigner(sender);
}
}
...
...
contracts/crowdsale/distribution/RefundableCrowdsale.sol
View file @
b25e8b91
...
...
@@ -31,7 +31,7 @@ contract RefundableCrowdsale is Initializable, FinalizableCrowdsale {
// conditional added to make initializer idempotent in case of diamond inheritance
if (address(_escrow) == address(0)) {
_escrow = new RefundEscrow();
_escrow.initialize(wallet());
_escrow.initialize(wallet()
, address(this)
);
}
_goal = goal;
...
...
contracts/crowdsale/validation/IndividuallyCappedCrowdsale.sol
View file @
b25e8b91
...
...
@@ -16,8 +16,8 @@ contract IndividuallyCappedCrowdsale is Initializable, Crowdsale, CapperRole {
mapping(address => uint256) private _contributions;
mapping(address => uint256) private _caps;
function initialize() public initializer {
CapperRole.initialize();
function initialize(
address sender
) public initializer {
CapperRole.initialize(
sender
);
}
/**
...
...
contracts/drafts/BreakInvariantBounty.sol
View file @
b25e8b91
...
...
@@ -16,9 +16,9 @@ contract BreakInvariantBounty is Initializable, PullPayment, Ownable {
event TargetCreated(address createdAddress);
function initialize() public initializer {
function initialize(
address sender
) public initializer {
PullPayment.initialize();
Ownable.initialize();
Ownable.initialize(
sender
);
}
/**
...
...
contracts/drafts/SignatureBouncer.sol
View file @
b25e8b91
...
...
@@ -65,8 +65,8 @@ contract SignatureBouncer is Initializable, SignerRole {
_;
}
function initialize() public initializer {
SignerRole.initialize();
function initialize(
address sender
) public initializer {
SignerRole.initialize(
sender
);
}
/**
...
...
contracts/drafts/TokenVesting.sol
View file @
b25e8b91
...
...
@@ -48,12 +48,13 @@ contract TokenVesting is Initializable, Ownable {
uint256 start,
uint256 cliffDuration,
uint256 duration,
bool revocable
bool revocable,
address sender
)
public
initializer
{
Ownable.initialize();
Ownable.initialize(
sender
);
require(beneficiary != address(0));
require(cliffDuration <= duration);
...
...
contracts/examples/SampleCrowdsale.sol
View file @
b25e8b91
...
...
@@ -18,8 +18,8 @@ contract SampleCrowdsaleToken is Initializable, ERC20Mintable {
string public symbol;
uint8 public decimals;
function initialize() public initializer {
ERC20Mintable.initialize();
function initialize(
address sender
) public initializer {
ERC20Mintable.initialize(
sender
);
name = "Sample Crowdsale Token";
symbol = "SCT";
...
...
contracts/examples/SimpleToken.sol
View file @
b25e8b91
...
...
@@ -20,10 +20,10 @@ contract SimpleToken is Initializable, ERC20 {
uint256 public constant INITIAL_SUPPLY = 10000 * (10 ** uint256(decimals));
/**
* @dev Constructor that gives
msg.
sender all of existing tokens.
* @dev Constructor that gives sender all of existing tokens.
*/
function initialize() public initializer {
_mint(
msg.
sender, INITIAL_SUPPLY);
function initialize(
address sender
) public initializer {
_mint(sender, INITIAL_SUPPLY);
}
}
contracts/lifecycle/Pausable.sol
View file @
b25e8b91
...
...
@@ -14,8 +14,8 @@ contract Pausable is Initializable, PauserRole {
bool private _paused = false;
function initialize() public initializer {
PauserRole.initialize();
function initialize(
address sender
) public initializer {
PauserRole.initialize(
sender
);
}
/**
...
...
contracts/mocks/BreakInvariantBountyMock.sol
View file @
b25e8b91
...
...
@@ -24,7 +24,7 @@ contract TargetMock is Target {
contract BreakInvariantBountyMock is BreakInvariantBounty {
constructor() public {
BreakInvariantBounty.initialize();
BreakInvariantBounty.initialize(
msg.sender
);
}
function _deployContract() internal returns (address) {
...
...
contracts/mocks/CapperRoleMock.sol
View file @
b25e8b91
...
...
@@ -5,7 +5,7 @@ import "../access/roles/CapperRole.sol";
contract CapperRoleMock is CapperRole {
constructor() public {
CapperRole.initialize();
CapperRole.initialize(
msg.sender
);
}
function removeCapper(address account) public {
...
...
contracts/mocks/ConditionalEscrowMock.sol
View file @
b25e8b91
...
...
@@ -8,7 +8,7 @@ contract ConditionalEscrowMock is ConditionalEscrow {
mapping(address => bool) private _allowed;
constructor() public {
ConditionalEscrow.initialize();
ConditionalEscrow.initialize(
msg.sender
);
}
function setAllowed(address payee, bool allowed) public {
...
...
contracts/mocks/ERC20CappedMock.sol
View file @
b25e8b91
...
...
@@ -7,7 +7,7 @@ import "./MinterRoleMock.sol";
contract ERC20CappedMock is ERC20Capped, MinterRoleMock {
constructor(uint256 cap) public {
ERC20Capped.initialize(cap);
ERC20Capped.initialize(cap
, msg.sender
);
}
}
contracts/mocks/ERC20MintableMock.sol
View file @
b25e8b91
...
...
@@ -7,7 +7,6 @@ import "./MinterRoleMock.sol";
contract ERC20MintableMock is ERC20Mintable, MinterRoleMock {
constructor() public {
ERC20Mintable.initialize();
ERC20Mintable.initialize(
msg.sender
);
}
}
contracts/mocks/ERC20PausableMock.sol
View file @
b25e8b91
...
...
@@ -8,7 +8,7 @@ import "./PauserRoleMock.sol";
contract ERC20PausableMock is ERC20Pausable, PauserRoleMock {
constructor(address initialAccount, uint initialBalance) public {
ERC20Pausable.initialize();
ERC20Pausable.initialize(
msg.sender
);
_mint(initialAccount, initialBalance);
}
...
...
contracts/mocks/ERC721FullMock.sol
View file @
b25e8b91
...
...
@@ -15,7 +15,8 @@ contract ERC721FullMock is ERC721Full, ERC721Mintable, ERC721MetadataMintable, E
constructor(string name, string symbol) public
{
ERC721Full.initialize(name, symbol);
ERC721Mintable.initialize();
ERC721Mintable.initialize(msg.sender);
ERC721MetadataMintable.initialize(msg.sender);
ERC721Burnable.initialize();
}
...
...
contracts/mocks/ERC721MintableBurnableImpl.sol
View file @
b25e8b91
...
...
@@ -16,8 +16,8 @@ contract ERC721MintableBurnableImpl
public
{
ERC721Full.initialize("Test", "TEST");
ERC721Mintable.initialize();
ERC721MetadataMintable.initialize();
ERC721Mintable.initialize(
msg.sender
);
ERC721MetadataMintable.initialize(
msg.sender
);
ERC721Burnable.initialize();
}
}
contracts/mocks/ERC721PausableMock.sol
View file @
b25e8b91
...
...
@@ -10,7 +10,7 @@ import "./PauserRoleMock.sol";
*/
contract ERC721PausableMock is ERC721Pausable, PauserRoleMock {
constructor() {
ERC721Pausable.initialize();
ERC721Pausable.initialize(
msg.sender
);
}
function mint(address to, uint256 tokenId) public {
...
...
contracts/mocks/EscrowMock.sol
View file @
b25e8b91
...
...
@@ -4,6 +4,6 @@ import "../payment/Escrow.sol";
contract EscrowMock is Escrow {
constructor() public {
Escrow.initialize();
Escrow.initialize(
msg.sender
);
}
}
contracts/mocks/IndividuallyCappedCrowdsaleImpl.sol
View file @
b25e8b91
...
...
@@ -16,6 +16,6 @@ contract IndividuallyCappedCrowdsaleImpl
public
{
Crowdsale.initialize(rate, wallet, token);
IndividuallyCappedCrowdsale.initialize();
IndividuallyCappedCrowdsale.initialize(
msg.sender
);
}
}
contracts/mocks/MinterRoleMock.sol
View file @
b25e8b91
...
...
@@ -5,7 +5,7 @@ import "../access/roles/MinterRole.sol";
contract MinterRoleMock is MinterRole {
constructor() public {
MinterRole.initialize();
MinterRole.initialize(
msg.sender
);
}
function removeMinter(address account) public {
...
...
contracts/mocks/OwnableMock.sol
View file @
b25e8b91
...
...
@@ -3,8 +3,7 @@ pragma solidity ^0.4.24;
import { Ownable } from "../ownership/Ownable.sol";
contract OwnableMock is Ownable {
constructor() {
Ownable.initialize();
Ownable.initialize(
msg.sender
);
}
}
contracts/mocks/PausableMock.sol
View file @
b25e8b91
...
...
@@ -10,7 +10,7 @@ contract PausableMock is Pausable, PauserRoleMock {
uint256 public count;
constructor() public {
Pausable.initialize();
Pausable.initialize(
msg.sender
);
drasticMeasureTaken = false;
count = 0;
...
...
contracts/mocks/PauserRoleMock.sol
View file @
b25e8b91
...
...
@@ -5,7 +5,7 @@ import "../access/roles/PauserRole.sol";
contract PauserRoleMock is PauserRole {
constructor() public {
PauserRole.initialize();
PauserRole.initialize(
msg.sender
);
}
function removePauser(address account) public {
...
...
contracts/mocks/RefundEscrowMock.sol
View file @
b25e8b91
...
...
@@ -4,6 +4,6 @@ import "../payment/RefundEscrow.sol";
contract RefundEscrowMock is RefundEscrow {
constructor(address beneficiary) public {
RefundEscrow.initialize(beneficiary);
RefundEscrow.initialize(beneficiary
, msg.sender
);
}
}
contracts/mocks/SampleCrowdsaleMock.sol
View file @
b25e8b91
...
...
@@ -5,7 +5,7 @@ import "../examples/SampleCrowdsale.sol";
contract SampleCrowdsaleTokenMock is SampleCrowdsaleToken {
constructor() public {
SampleCrowdsaleToken.initialize();
SampleCrowdsaleToken.initialize(
msg.sender
);
}
}
...
...
contracts/mocks/SecondaryMock.sol
View file @
b25e8b91
...
...
@@ -5,7 +5,7 @@ import "../ownership/Secondary.sol";
contract SecondaryMock is Secondary {
constructor() public {
Secondary.initialize();
Secondary.initialize(
msg.sender
);
}
function onlyPrimaryMock() public view onlyPrimary {
...
...
contracts/mocks/SignatureBouncerMock.sol
View file @
b25e8b91
...
...
@@ -6,7 +6,7 @@ import "./SignerRoleMock.sol";
contract SignatureBouncerMock is SignatureBouncer, SignerRoleMock {
constructor() public {
SignatureBouncer.initialize();
SignatureBouncer.initialize(
msg.sender
);
}
function checkValidSignature(address account, bytes signature)
...
...
contracts/mocks/SignerRoleMock.sol
View file @
b25e8b91
...
...
@@ -5,7 +5,7 @@ import "../access/roles/SignerRole.sol";
contract SignerRoleMock is SignerRole {
constructor() public {
SignerRole.initialize();
SignerRole.initialize(
msg.sender
);
}
function removeSigner(address account) public {
...
...
contracts/mocks/SimpleTokenMock.sol
View file @
b25e8b91
...
...
@@ -4,6 +4,6 @@ import "../examples/SimpleToken.sol";
contract SimpleTokenMock is SimpleToken {
constructor() public {
SimpleToken.initialize();
SimpleToken.initialize(
msg.sender
);
}
}
contracts/mocks/TokenVestingMock.sol
View file @
b25e8b91
...
...
@@ -15,7 +15,8 @@ contract TokenVestingMock is TokenVesting {
start,
cliffDuration,
duration,
revocable
revocable,
msg.sender
);
}
}
contracts/ownership/Ownable.sol
View file @
b25e8b91
...
...
@@ -22,8 +22,8 @@ contract Ownable is Initializable {
* @dev The Ownable constructor sets the original `owner` of the contract to the sender
* account.
*/
function initialize() public initializer {
_owner =
msg.
sender;
function initialize(
address sender
) public initializer {
_owner = sender;
}
/**
...
...
contracts/ownership/Secondary.sol
View file @
b25e8b91
...
...
@@ -12,8 +12,8 @@ contract Secondary is Initializable {
/**
* @dev Sets the primary account to the one that is creating the Secondary contract.
*/
function initialize() public initializer {
_primary =
msg.
sender;
function initialize(
address sender
) public initializer {
_primary = sender;
}
/**
...
...
contracts/payment/ConditionalEscrow.sol
View file @
b25e8b91
...
...
@@ -9,8 +9,8 @@ import "./Escrow.sol";
* @dev Base abstract escrow to only allow withdrawal if a condition is met.
*/
contract ConditionalEscrow is Initializable, Escrow {
function initialize() public initializer {
Escrow.initialize();
function initialize(
address sender
) public initializer {
Escrow.initialize(
sender
);
}
/**
...
...
contracts/payment/Escrow.sol
View file @
b25e8b91
...
...
@@ -20,8 +20,8 @@ contract Escrow is Initializable, Secondary {
mapping(address => uint256) private _deposits;
function initialize() public initializer {
Secondary.initialize();
function initialize(
address sender
) public initializer {
Secondary.initialize(
sender
);
}
function depositsOf(address payee) public view returns (uint256) {
...
...
contracts/payment/PullPayment.sol
View file @
b25e8b91
...
...
@@ -16,7 +16,7 @@ contract PullPayment is Initializable {
// conditional added to make initializer idempotent in case of diamond inheritance
if (address(_escrow) == address(0)) {
_escrow = new Escrow();
_escrow.initialize();
_escrow.initialize(
address(this)
);
}
}
...
...
contracts/payment/RefundEscrow.sol
View file @
b25e8b91
...
...
@@ -23,9 +23,8 @@ contract RefundEscrow is Initializable, ConditionalEscrow {
* @dev Constructor.
* @param beneficiary The beneficiary of the deposits.
*/
function initialize(address beneficiary) public initializer {
Secondary.initialize();
ConditionalEscrow.initialize();
function initialize(address beneficiary, address sender) public initializer {
ConditionalEscrow.initialize(sender);
require(beneficiary != address(0));
_beneficiary = beneficiary;
...
...
contracts/token/ERC20/ERC20Capped.sol
View file @
b25e8b91
...
...
@@ -12,11 +12,11 @@ contract ERC20Capped is Initializable, ERC20Mintable {
uint256 private _cap;
function initialize(uint256 cap)
function initialize(uint256 cap
, address sender
)
public
initializer
{
ERC20Mintable.initialize();
ERC20Mintable.initialize(
sender
);
require(cap > 0);
_cap = cap;
...
...
contracts/token/ERC20/ERC20Mintable.sol
View file @
b25e8b91
...
...
@@ -10,8 +10,8 @@ import "../../access/roles/MinterRole.sol";
* @dev ERC20 minting logic
*/
contract ERC20Mintable is Initializable, ERC20, MinterRole {
function initialize() public initializer {
MinterRole.initialize();
function initialize(
address sender
) public initializer {
MinterRole.initialize(
sender
);
}
/**
...
...
contracts/token/ERC20/ERC20Pausable.sol
View file @
b25e8b91
...
...
@@ -11,8 +11,8 @@ import "../../lifecycle/Pausable.sol";
**/
contract ERC20Pausable is Initializable, ERC20, Pausable {
function initialize() public initializer {
Pausable.initialize();
function initialize(
address sender
) public initializer {
Pausable.initialize(
sender
);
}
function transfer(
...
...
contracts/token/ERC721/ERC721MetadataMintable.sol
View file @
b25e8b91
...
...
@@ -10,9 +10,9 @@ import "../../access/roles/MinterRole.sol";
* @dev ERC721 minting logic with metadata
*/
contract ERC721MetadataMintable is Initializable, ERC721, ERC721Metadata, MinterRole {
function initialize() public initializer {
function initialize(
address sender
) public initializer {
ERC721.initialize();
MinterRole.initialize();
MinterRole.initialize(
sender
);
}
/**
...
...
contracts/token/ERC721/ERC721Mintable.sol
View file @
b25e8b91
...
...
@@ -10,9 +10,9 @@ import "../../access/roles/MinterRole.sol";
* @dev ERC721 minting logic
*/
contract ERC721Mintable is Initializable, ERC721, MinterRole {
function initialize() public initializer {
function initialize(
address sender
) public initializer {
ERC721.initialize();
MinterRole.initialize();
MinterRole.initialize(
sender
);
}
/**
...
...
contracts/token/ERC721/ERC721Pausable.sol
View file @
b25e8b91
...
...
@@ -10,9 +10,9 @@ import "../../lifecycle/Pausable.sol";
* @dev ERC721 modified with pausable transfers.
**/
contract ERC721Pausable is Initializable, ERC721, Pausable {
function initialize() public initializer {
function initialize(
address sender
) public initializer {
ERC721.initialize();
Pausable.initialize();
Pausable.initialize(
sender
);
}
function approve(
...
...
test/ownership/Ownable.test.js
View file @
b25e8b91
...
...
@@ -5,13 +5,13 @@ const { shouldBehaveLikeOwnable } = require('./Ownable.behavior');
const
Ownable
=
artifacts
.
require
(
'OwnableMock'
);
contract
(
'Ownable'
,
function
([
_
,
owner
,
...
otherAccounts
])
{
contract
(
'Ownable'
,
function
([
_
,
owner
,
anyone
,
...
otherAccounts
])
{
beforeEach
(
async
function
()
{
this
.
ownable
=
await
Ownable
.
new
({
from
:
owner
});
});
it
(
'cannot be reinitialized'
,
async
function
()
{
await
expectThrow
(
this
.
ownable
.
initialize
(),
EVMRevert
);
await
expectThrow
(
this
.
ownable
.
initialize
(
anyone
),
EVMRevert
);
});
shouldBehaveLikeOwnable
(
owner
,
otherAccounts
);
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment