Merge pull request #4953 from ethereum/addressPayableTests

Update test suite to use address payable.
This commit is contained in:
chriseth 2018-09-12 17:39:16 +02:00 committed by GitHub
commit 9214c7c34f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
26 changed files with 121 additions and 67 deletions

View File

@ -27,12 +27,12 @@ contract ico is safeMath {
uint256 constant oneSegment = 40320; uint256 constant oneSegment = 40320;
address public owner; address payable public owner;
address public tokenAddr; address payable public tokenAddr;
address public premiumAddr; address payable public premiumAddr;
uint256 public startBlock; uint256 public startBlock;
uint256 public icoDelay; uint256 public icoDelay;
address public foundationAddress; address payable public foundationAddress;
address public icoEtcPriceAddr; address public icoEtcPriceAddr;
uint256 public icoExchangeRate; uint256 public icoExchangeRate;
uint256 public icoExchangeRateSetBlock; uint256 public icoExchangeRateSetBlock;
@ -50,7 +50,7 @@ contract ico is safeMath {
uint256 public totalMint; uint256 public totalMint;
uint256 public totalPremiumMint; uint256 public totalPremiumMint;
constructor(address foundation, address priceSet, uint256 exchangeRate, uint256 startBlockNum, address[] memory genesisAddr, uint256[] memory genesisValue) public { constructor(address payable foundation, address priceSet, uint256 exchangeRate, uint256 startBlockNum, address[] memory genesisAddr, uint256[] memory genesisValue) public {
/* /*
Installation function. Installation function.
@ -248,7 +248,7 @@ contract ico is safeMath {
aborted = true; aborted = true;
} }
function connectTokens(address tokenContractAddr, address premiumContractAddr) external { function connectTokens(address payable tokenContractAddr, address payable premiumContractAddr) external {
/* /*
Installation function which joins the two token contracts with this contract. Installation function which joins the two token contracts with this contract.
Only callable by the owner Only callable by the owner
@ -284,7 +284,7 @@ contract ico is safeMath {
require( buy(msg.sender, address(0x00)) ); require( buy(msg.sender, address(0x00)) );
} }
function buy(address beneficiaryAddress, address affilateAddress) public payable returns (bool success) { function buy(address payable beneficiaryAddress, address affilateAddress) public payable returns (bool success) {
/* /*
Buying a token Buying a token

View File

@ -1,8 +1,8 @@
pragma solidity ^0.4.11; pragma solidity ^0.4.11;
contract abstractModuleHandler { contract abstractModuleHandler {
function transfer(address from, address to, uint256 value, bool fee) external returns (bool success) {} function transfer(address payable from, address payable to, uint256 value, bool fee) external returns (bool success) {}
function balanceOf(address owner) public view returns (bool success, uint256 value) {} function balanceOf(address payable owner) public view returns (bool success, uint256 value) {}
} }
contract module { contract module {
@ -19,7 +19,7 @@ contract module {
status public moduleStatus; status public moduleStatus;
uint256 public disabledUntil; uint256 public disabledUntil;
address public moduleHandlerAddress; address payable public moduleHandlerAddress;
function disableModule(bool forever) external onlyForModuleHandler returns (bool success) { function disableModule(bool forever) external onlyForModuleHandler returns (bool success) {
_disableModule(forever); _disableModule(forever);
@ -36,11 +36,11 @@ contract module {
else { disabledUntil = block.number + 5760; } else { disabledUntil = block.number + 5760; }
} }
function replaceModuleHandler(address newModuleHandlerAddress) external onlyForModuleHandler returns (bool success) { function replaceModuleHandler(address payable newModuleHandlerAddress) external onlyForModuleHandler returns (bool success) {
_replaceModuleHandler(newModuleHandlerAddress); _replaceModuleHandler(newModuleHandlerAddress);
return true; return true;
} }
function _replaceModuleHandler(address newModuleHandlerAddress) internal { function _replaceModuleHandler(address payable newModuleHandlerAddress) internal {
/* /*
Replace the ModuleHandler address. Replace the ModuleHandler address.
This function calls the Publisher module. This function calls the Publisher module.
@ -77,11 +77,11 @@ contract module {
moduleStatus = status.Disconnected; moduleStatus = status.Disconnected;
} }
function replaceModule(address newModuleAddress) external onlyForModuleHandler returns (bool success) { function replaceModule(address payable newModuleAddress) external onlyForModuleHandler returns (bool success) {
_replaceModule(newModuleAddress); _replaceModule(newModuleAddress);
return true; return true;
} }
function _replaceModule(address newModuleAddress) internal { function _replaceModule(address payable newModuleAddress) internal {
/* /*
Replace the module for an another new module. Replace the module for an another new module.
This function calls the Publisher module. This function calls the Publisher module.
@ -101,20 +101,20 @@ contract module {
moduleStatus = status.Disconnected; moduleStatus = status.Disconnected;
} }
function transferEvent(address from, address to, uint256 value) external onlyForModuleHandler returns (bool success) { function transferEvent(address payable from, address payable to, uint256 value) external onlyForModuleHandler returns (bool success) {
return true; return true;
} }
function newSchellingRoundEvent(uint256 roundID, uint256 reward) external onlyForModuleHandler returns (bool success) { function newSchellingRoundEvent(uint256 roundID, uint256 reward) external onlyForModuleHandler returns (bool success) {
return true; return true;
} }
function registerModuleHandler(address _moduleHandlerAddress) internal { function registerModuleHandler(address payable _moduleHandlerAddress) internal {
/* /*
Module constructor function for registering ModuleHandler address. Module constructor function for registering ModuleHandler address.
*/ */
moduleHandlerAddress = _moduleHandlerAddress; moduleHandlerAddress = _moduleHandlerAddress;
} }
function isModuleHandler(address addr) internal returns (bool ret) { function isModuleHandler(address payable addr) internal returns (bool ret) {
/* /*
Test for ModuleHandler address. Test for ModuleHandler address.
If the module is not connected then returns always false. If the module is not connected then returns always false.
@ -140,4 +140,6 @@ contract module {
require( msg.sender == moduleHandlerAddress ); require( msg.sender == moduleHandlerAddress );
_; _;
} }
function() external payable {
}
} }

View File

@ -25,7 +25,7 @@ contract abstractModule {
contract moduleHandler is multiOwner, announcementTypes { contract moduleHandler is multiOwner, announcementTypes {
struct modules_s { struct modules_s {
address addr; address payable addr;
bytes32 name; bytes32 name;
bool schellingEvent; bool schellingEvent;
bool transferEvent; bool transferEvent;
@ -37,7 +37,7 @@ contract moduleHandler is multiOwner, announcementTypes {
constructor(address[] memory newOwners) multiOwner(newOwners) public {} constructor(address[] memory newOwners) multiOwner(newOwners) public {}
function load(address foundation, bool forReplace, address Token, address Premium, address Publisher, address Schelling, address Provider) public { function load(address payable foundation, bool forReplace, address payable Token, address payable Premium, address payable Publisher, address payable Schelling, address payable Provider) public {
/* /*
Loading modulest to ModuleHandler. Loading modulest to ModuleHandler.
@ -140,7 +140,7 @@ contract moduleHandler is multiOwner, announcementTypes {
} }
return (true, false, 0); return (true, false, 0);
} }
function replaceModule(string calldata name, address addr, bool callCallback) external returns (bool success) { function replaceModule(string calldata name, address payable addr, bool callCallback) external returns (bool success) {
/* /*
Module replace, can be called only by the Publisher contract. Module replace, can be called only by the Publisher contract.
@ -178,7 +178,7 @@ contract moduleHandler is multiOwner, announcementTypes {
return true; return true;
} }
function newModule(string calldata name, address addr, bool schellingEvent, bool transferEvent) external returns (bool success) { function newModule(string calldata name, address payable addr, bool schellingEvent, bool transferEvent) external returns (bool success) {
/* /*
Adding new module to the database. Can be called only by the Publisher contract. Adding new module to the database. Can be called only by the Publisher contract.

View File

@ -12,7 +12,7 @@ contract thirdPartyPContractAbstract {
contract ptokenDB is tokenDB {} contract ptokenDB is tokenDB {}
contract premium is module, safeMath { contract premium is module, safeMath {
function replaceModule(address addr) external returns (bool success) { function replaceModule(address payable addr) external returns (bool success) {
require( super.isModuleHandler(msg.sender) ); require( super.isModuleHandler(msg.sender) );
require( db.replaceOwner(addr) ); require( db.replaceOwner(addr) );
super._replaceModule(addr); super._replaceModule(addr);
@ -40,7 +40,7 @@ contract premium is module, safeMath {
mapping(address => bool) public genesis; mapping(address => bool) public genesis;
constructor(bool forReplace, address moduleHandler, address dbAddress, address icoContractAddr, address[] memory genesisAddr, uint256[] memory genesisValue) public { constructor(bool forReplace, address payable moduleHandler, address dbAddress, address icoContractAddr, address[] memory genesisAddr, uint256[] memory genesisValue) public {
/* /*
Setup function. Setup function.
If an ICOaddress is defined then the balance of the genesis addresses will be set as well. If an ICOaddress is defined then the balance of the genesis addresses will be set as well.

View File

@ -16,7 +16,7 @@ contract provider is module, safeMath, announcementTypes {
require( _success ); require( _success );
return true; return true;
} }
function transferEvent(address from, address to, uint256 value) external returns (bool success) { function transferEvent(address payable from, address payable to, uint256 value) external returns (bool success) {
/* /*
Transaction completed. This function is only available for the modulehandler. Transaction completed. This function is only available for the modulehandler.
It should be checked if the sender or the acceptor does not connect to the provider or it is not a provider itself if so than the change should be recorded. It should be checked if the sender or the acceptor does not connect to the provider or it is not a provider itself if so than the change should be recorded.
@ -118,7 +118,7 @@ contract provider is module, safeMath, announcementTypes {
uint256 private currentSchellingRound = 1; uint256 private currentSchellingRound = 1;
constructor(address _moduleHandler) public { constructor(address payable _moduleHandler) public {
/* /*
Install function. Install function.
@ -147,7 +147,7 @@ contract provider is module, safeMath, announcementTypes {
else { return false; } else { return false; }
return true; return true;
} }
function getUserDetails(address addr, uint256 schellingRound) public view returns (address ProviderAddress, uint256 ProviderHeight, uint256 ConnectedOn, uint256 value) { function getUserDetails(address payable addr, uint256 schellingRound) public view returns (address ProviderAddress, uint256 ProviderHeight, uint256 ConnectedOn, uint256 value) {
/* /*
Collecting the datas of the client. Collecting the datas of the client.
@ -213,7 +213,7 @@ contract provider is module, safeMath, announcementTypes {
return ( ! priv && ( rate >= publicMinRate && rate <= publicMaxRate ) ) || return ( ! priv && ( rate >= publicMinRate && rate <= publicMaxRate ) ) ||
( priv && ( rate >= privateMinRate && rate <= privateMaxRate ) ); ( priv && ( rate >= privateMinRate && rate <= privateMaxRate ) );
} }
function createProvider(bool priv, string calldata name, string calldata website, string calldata country, string calldata info, uint8 rate, bool isForRent, address admin) isReady external { function createProvider(bool priv, string calldata name, string calldata website, string calldata country, string calldata info, uint8 rate, bool isForRent, address payable admin) isReady external {
/* /*
Creating a provider. Creating a provider.
During the ICO its not allowed to create provider. During the ICO its not allowed to create provider.
@ -270,7 +270,7 @@ contract provider is module, safeMath, announcementTypes {
} }
emit EProviderOpen(msg.sender, currHeight); emit EProviderOpen(msg.sender, currHeight);
} }
function setProviderDetails(address addr, string calldata website, string calldata country, string calldata info, uint8 rate, address admin) isReady external { function setProviderDetails(address payable addr, string calldata website, string calldata country, string calldata info, uint8 rate, address payable admin) isReady external {
/* /*
Modifying the datas of the provider. Modifying the datas of the provider.
This can only be invited by the providers admin. This can only be invited by the providers admin.
@ -321,7 +321,7 @@ contract provider is module, safeMath, announcementTypes {
info = providers[addr].data[height].info; info = providers[addr].data[height].info;
create = providers[addr].data[height].create; create = providers[addr].data[height].create;
} }
function getProviderDetails(address addr, uint256 height) public view returns (uint8 rate, bool isForRent, uint256 clientsCount, bool priv, bool getInterest, bool valid) { function getProviderDetails(address payable addr, uint256 height) public view returns (uint8 rate, bool isForRent, uint256 clientsCount, bool priv, bool getInterest, bool valid) {
/* /*
Asking for the datas of the provider. Asking for the datas of the provider.
In case the height is unknown then the system will use the last known height. In case the height is unknown then the system will use the last known height.

View File

@ -9,7 +9,7 @@ contract publisher is announcementTypes, module, safeMath {
/* /*
module callbacks module callbacks
*/ */
function transferEvent(address from, address to, uint256 value) external returns (bool success) { function transferEvent(address payable from, address payable to, uint256 value) external returns (bool success) {
/* /*
Transaction completed. This function is available only for moduleHandler Transaction completed. This function is available only for moduleHandler
If a transaction is carried out from or to an address which participated in the objection of an announcement, its objection purport is automatically set If a transaction is carried out from or to an address which participated in the objection of an announcement, its objection purport is automatically set
@ -54,14 +54,14 @@ contract publisher is announcementTypes, module, safeMath {
string _str; string _str;
uint256 _uint; uint256 _uint;
address _addr; address payable _addr;
} }
mapping(uint256 => announcements_s) public announcements; mapping(uint256 => announcements_s) public announcements;
uint256 announcementsLength = 1; uint256 announcementsLength = 1;
mapping (address => uint256[]) public opponents; mapping (address => uint256[]) public opponents;
constructor(address moduleHandler) public { constructor(address payable moduleHandler) public {
/* /*
Installation function. The installer will be registered in the admin list automatically Installation function. The installer will be registered in the admin list automatically
@ -116,7 +116,7 @@ contract publisher is announcementTypes, module, safeMath {
return _amount * oppositeRate / 100 > weight; return _amount * oppositeRate / 100 > weight;
} }
function newAnnouncement(announcementType Type, string calldata Announcement, string calldata Link, bool Oppositable, string calldata _str, uint256 _uint, address _addr) onlyOwner external { function newAnnouncement(announcementType Type, string calldata Announcement, string calldata Link, bool Oppositable, string calldata _str, uint256 _uint, address payable _addr) onlyOwner external {
/* /*
New announcement. Can be called only by those in the admin list New announcement. Can be called only by those in the admin list

View File

@ -133,13 +133,13 @@ contract schelling is module, announcementTypes, schellingVars {
/* /*
module callbacks module callbacks
*/ */
function replaceModule(address addr) external returns (bool) { function replaceModule(address payable addr) external returns (bool) {
require( super.isModuleHandler(msg.sender) ); require( super.isModuleHandler(msg.sender) );
require( db.replaceOwner(addr) ); require( db.replaceOwner(addr) );
super._replaceModule(addr); super._replaceModule(addr);
return true; return true;
} }
function transferEvent(address from, address to, uint256 value) external returns (bool) { function transferEvent(address payable from, address payable to, uint256 value) external returns (bool) {
/* /*
Transaction completed. This function can be called only by the ModuleHandler. Transaction completed. This function can be called only by the ModuleHandler.
If this contract is the receiver, the amount will be added to the prize pool of the current round. If this contract is the receiver, the amount will be added to the prize pool of the current round.
@ -247,7 +247,7 @@ contract schelling is module, announcementTypes, schellingVars {
bytes1 public belowChar = 0x30; bytes1 public belowChar = 0x30;
schellingDB private db; schellingDB private db;
constructor(address _moduleHandler, address _db, bool _forReplace) public { constructor(address payable _moduleHandler, address _db, bool _forReplace) public {
/* /*
Installation function. Installation function.

View File

@ -15,7 +15,7 @@ contract token is safeMath, module, announcementTypes {
/* /*
module callbacks module callbacks
*/ */
function replaceModule(address addr) external returns (bool success) { function replaceModule(address payable addr) external returns (bool success) {
require( super.isModuleHandler(msg.sender) ); require( super.isModuleHandler(msg.sender) );
require( db.replaceOwner(addr) ); require( db.replaceOwner(addr) );
super._replaceModule(addr); super._replaceModule(addr);
@ -37,18 +37,18 @@ contract token is safeMath, module, announcementTypes {
uint8 public decimals = 6; uint8 public decimals = 6;
tokenDB public db; tokenDB public db;
address public icoAddr; address payable public icoAddr;
uint256 public transactionFeeRate = 20; uint256 public transactionFeeRate = 20;
uint256 public transactionFeeRateM = 1e3; uint256 public transactionFeeRateM = 1e3;
uint256 public transactionFeeMin = 20000; uint256 public transactionFeeMin = 20000;
uint256 public transactionFeeMax = 5000000; uint256 public transactionFeeMax = 5000000;
uint256 public transactionFeeBurn = 80; uint256 public transactionFeeBurn = 80;
address public exchangeAddress; address payable public exchangeAddress;
bool public isICO = true; bool public isICO = true;
mapping(address => bool) public genesis; mapping(address => bool) public genesis;
constructor(bool forReplace, address moduleHandler, address dbAddr, address icoContractAddr, address exchangeContractAddress, address[] memory genesisAddr, uint256[] memory genesisValue) public payable { constructor(bool forReplace, address payable moduleHandler, address dbAddr, address payable icoContractAddr, address payable exchangeContractAddress, address payable[] memory genesisAddr, uint256[] memory genesisValue) public payable {
/* /*
Installation function Installation function

View File

@ -32,7 +32,7 @@ contract MultisigWallet is Multisig, Shareable, DayLimit {
/** /**
* @dev destroys the contract sending everything to `_to`. * @dev destroys the contract sending everything to `_to`.
*/ */
function destroy(address _to) onlymanyowners(keccak256(msg.data)) external { function destroy(address payable _to) onlymanyowners(keccak256(msg.data)) external {
selfdestruct(_to); selfdestruct(_to);
} }

View File

@ -22,7 +22,7 @@ contract Crowdsale {
uint256 public endBlock; uint256 public endBlock;
// address where funds are collected // address where funds are collected
address public wallet; address payable public wallet;
// how many token units a buyer gets per wei // how many token units a buyer gets per wei
uint256 public rate; uint256 public rate;
@ -40,7 +40,7 @@ contract Crowdsale {
event TokenPurchase(address indexed purchaser, address indexed beneficiary, uint256 value, uint256 amount); event TokenPurchase(address indexed purchaser, address indexed beneficiary, uint256 value, uint256 amount);
constructor(uint256 _startBlock, uint256 _endBlock, uint256 _rate, address _wallet) public { constructor(uint256 _startBlock, uint256 _endBlock, uint256 _rate, address payable _wallet) public {
require(_startBlock >= block.number); require(_startBlock >= block.number);
require(_endBlock >= _startBlock); require(_endBlock >= _startBlock);
require(_rate > 0); require(_rate > 0);

View File

@ -15,20 +15,20 @@ contract RefundVault is Ownable {
enum State { Active, Refunding, Closed } enum State { Active, Refunding, Closed }
mapping (address => uint256) public deposited; mapping (address => uint256) public deposited;
address public wallet; address payable public wallet;
State public state; State public state;
event Closed(); event Closed();
event RefundsEnabled(); event RefundsEnabled();
event Refunded(address indexed beneficiary, uint256 weiAmount); event Refunded(address indexed beneficiary, uint256 weiAmount);
constructor(address _wallet) public { constructor(address payable _wallet) public {
require(_wallet != address(0x0)); require(_wallet != address(0x0));
wallet = _wallet; wallet = _wallet;
state = State.Active; state = State.Active;
} }
function deposit(address investor) public onlyOwner payable { function deposit(address payable investor) public onlyOwner payable {
require(state == State.Active); require(state == State.Active);
deposited[investor] = deposited[investor].add(msg.value); deposited[investor] = deposited[investor].add(msg.value);
} }
@ -46,7 +46,7 @@ contract RefundVault is Ownable {
emit RefundsEnabled(); emit RefundsEnabled();
} }
function refund(address investor) public { function refund(address payable investor) public {
require(state == State.Refunding); require(state == State.Refunding);
uint256 depositedValue = deposited[investor]; uint256 depositedValue = deposited[investor];
deposited[investor] = 0; deposited[investor] = 0;

View File

@ -19,7 +19,7 @@ contract Destructible is Ownable {
selfdestruct(owner); selfdestruct(owner);
} }
function destroyAndSend(address _recipient) public onlyOwner { function destroyAndSend(address payable _recipient) public onlyOwner {
selfdestruct(_recipient); selfdestruct(_recipient);
} }
} }

View File

@ -10,7 +10,7 @@ import './Ownable.sol';
* This allows the new owner to accept the transfer. * This allows the new owner to accept the transfer.
*/ */
contract Claimable is Ownable { contract Claimable is Ownable {
address public pendingOwner; address payable public pendingOwner;
/** /**
* @dev Modifier throws if called by any account other than the pendingOwner. * @dev Modifier throws if called by any account other than the pendingOwner.
@ -26,7 +26,7 @@ contract Claimable is Ownable {
* @dev Allows the current owner to set the pendingOwner address. * @dev Allows the current owner to set the pendingOwner address.
* @param newOwner The address to transfer ownership to. * @param newOwner The address to transfer ownership to.
*/ */
function transferOwnership(address newOwner) public onlyOwner { function transferOwnership(address payable newOwner) public onlyOwner {
pendingOwner = newOwner; pendingOwner = newOwner;
} }

View File

@ -7,7 +7,7 @@ pragma solidity ^0.4.11;
* functions, this simplifies the implementation of "user permissions". * functions, this simplifies the implementation of "user permissions".
*/ */
contract Ownable { contract Ownable {
address public owner; address payable public owner;
/** /**
@ -34,7 +34,7 @@ contract Ownable {
* @dev Allows the current owner to transfer control of the contract to a newOwner. * @dev Allows the current owner to transfer control of the contract to a newOwner.
* @param newOwner The address to transfer ownership to. * @param newOwner The address to transfer ownership to.
*/ */
function transferOwnership(address newOwner) public onlyOwner { function transferOwnership(address payable newOwner) public onlyOwner {
if (newOwner != address(0)) { if (newOwner != address(0)) {
owner = newOwner; owner = newOwner;
} }

View File

@ -29,7 +29,7 @@ contract PullPayment {
* @dev withdraw accumulated balance, called by payee. * @dev withdraw accumulated balance, called by payee.
*/ */
function withdrawPayments() public { function withdrawPayments() public {
address payee = msg.sender; address payable payee = msg.sender;
uint256 payment = payments[payee]; uint256 payment = payments[payee];
if (payment == 0) { if (payment == 0) {

View File

@ -66,7 +66,7 @@ contract AuctionSystem {
/// Function that is called once an auction ends. /// Function that is called once an auction ends.
function onAuctionEnd(string memory _name) internal; function onAuctionEnd(string memory _name) internal;
function bid(string memory _name, address _bidder, uint _value) internal { function bid(string memory _name, address payable _bidder, uint _value) internal {
Auction storage auction = m_auctions[_name]; Auction storage auction = m_auctions[_name];
if (auction.endDate > 0 && now > auction.endDate) if (auction.endDate > 0 && now > auction.endDate)
{ {
@ -91,7 +91,7 @@ contract AuctionSystem {
uint constant c_biddingTime = 7 days; uint constant c_biddingTime = 7 days;
struct Auction { struct Auction {
address highestBidder; address payable highestBidder;
uint highestBid; uint highestBid;
uint secondHighestBid; uint secondHighestBid;
uint sumOfBids; uint sumOfBids;
@ -102,7 +102,7 @@ contract AuctionSystem {
contract GlobalRegistrar is Registrar, AuctionSystem { contract GlobalRegistrar is Registrar, AuctionSystem {
struct Record { struct Record {
address owner; address payable owner;
address primary; address primary;
address subRegistrar; address subRegistrar;
bytes32 content; bytes32 content;
@ -156,7 +156,7 @@ contract GlobalRegistrar is Registrar, AuctionSystem {
modifier onlyrecordowner(string memory _name) { if (m_toRecord[_name].owner == msg.sender) _; } modifier onlyrecordowner(string memory _name) { if (m_toRecord[_name].owner == msg.sender) _; }
function transfer(string memory _name, address _newOwner) onlyrecordowner(_name) public { function transfer(string memory _name, address payable _newOwner) onlyrecordowner(_name) public {
m_toRecord[_name].owner = _newOwner; m_toRecord[_name].owner = _newOwner;
emit Changed(_name); emit Changed(_name);
} }

View File

@ -81,7 +81,7 @@ contract FixedFeeRegistrar is Registrar {
emit Changed(_name); emit Changed(_name);
} }
} }
function disown(string memory _name, address _refund) onlyrecordowner(_name) public { function disown(string memory _name, address payable _refund) onlyrecordowner(_name) public {
delete m_recordData[uint(keccak256(bytes(_name))) / 8]; delete m_recordData[uint(keccak256(bytes(_name))) / 8];
if (!_refund.send(c_fee)) if (!_refund.send(c_fee))
revert(); revert();

View File

@ -375,7 +375,7 @@ contract Wallet is multisig, multiowned, daylimit {
} }
// destroys the contract sending everything to `_to`. // destroys the contract sending everything to `_to`.
function kill(address _to) onlymanyowners(keccak256(msg.data)) external { function kill(address payable _to) onlymanyowners(keccak256(msg.data)) external {
selfdestruct(_to); selfdestruct(_to);
} }

View File

@ -2215,7 +2215,7 @@ BOOST_AUTO_TEST_CASE(send_ether)
char const* sourceCode = R"( char const* sourceCode = R"(
contract test { contract test {
constructor() payable public {} constructor() payable public {}
function a(address addr, uint amount) public returns (uint ret) { function a(address payable addr, uint amount) public returns (uint ret) {
addr.send(amount); addr.send(amount);
return address(this).balance; return address(this).balance;
} }
@ -2233,11 +2233,11 @@ BOOST_AUTO_TEST_CASE(transfer_ether)
char const* sourceCode = R"( char const* sourceCode = R"(
contract A { contract A {
constructor() public payable {} constructor() public payable {}
function a(address addr, uint amount) public returns (uint) { function a(address payable addr, uint amount) public returns (uint) {
addr.transfer(amount); addr.transfer(amount);
return address(this).balance; return address(this).balance;
} }
function b(address addr, uint amount) public { function b(address payable addr, uint amount) public {
addr.transfer(amount); addr.transfer(amount);
} }
} }
@ -2406,7 +2406,7 @@ BOOST_AUTO_TEST_CASE(selfdestruct)
char const* sourceCode = R"( char const* sourceCode = R"(
contract test { contract test {
constructor() public payable {} constructor() public payable {}
function a(address receiver) public returns (uint ret) { function a(address payable receiver) public returns (uint ret) {
selfdestruct(receiver); selfdestruct(receiver);
return 10; return 10;
} }
@ -7151,7 +7151,7 @@ BOOST_AUTO_TEST_CASE(failing_send)
} }
contract Main { contract Main {
constructor() public payable {} constructor() public payable {}
function callHelper(address _a) public returns (bool r, uint bal) { function callHelper(address payable _a) public returns (bool r, uint bal) {
r = !_a.send(5); r = !_a.send(5);
bal = address(this).balance; bal = address(this).balance;
} }
@ -8838,7 +8838,7 @@ BOOST_AUTO_TEST_CASE(reject_ether_sent_to_library)
library lib {} library lib {}
contract c { contract c {
constructor() public payable {} constructor() public payable {}
function f(address x) public returns (bool) { function f(address payable x) public returns (bool) {
return x.send(1); return x.send(1);
} }
function () external payable {} function () external payable {}
@ -10095,6 +10095,54 @@ BOOST_AUTO_TEST_CASE(cleanup_bytes_types_shortening)
ABI_CHECK(callContractFunction("f()"), encodeArgs("\xff\xff\xff\xff")); ABI_CHECK(callContractFunction("f()"), encodeArgs("\xff\xff\xff\xff"));
} }
BOOST_AUTO_TEST_CASE(cleanup_address_types)
{
// Checks that address types are properly cleaned before they are compared.
char const* sourceCode = R"(
contract C {
function f(address a) public returns (uint) {
if (a != 0x1234567890123456789012345678901234567890) return 1;
return 0;
}
function g(address payable a) public returns (uint) {
if (a != 0x1234567890123456789012345678901234567890) return 1;
return 0;
}
}
)";
compileAndRun(sourceCode, 0, "C");
// We input longer data on purpose.
ABI_CHECK(callContractFunction("f(address)", u256("0xFFFF1234567890123456789012345678901234567890")), encodeArgs(0));
ABI_CHECK(callContractFunction("g(address)", u256("0xFFFF1234567890123456789012345678901234567890")), encodeArgs(0));
}
BOOST_AUTO_TEST_CASE(cleanup_address_types_shortening)
{
char const* sourceCode = R"(
contract C {
function f() public pure returns (address r) {
bytes21 x = 0x1122334455667788990011223344556677889900ff;
bytes20 y;
assembly { y := x }
address z = address(y);
assembly { r := z }
require(z == 0x1122334455667788990011223344556677889900);
}
function g() public pure returns (address payable r) {
bytes21 x = 0x1122334455667788990011223344556677889900ff;
bytes20 y;
assembly { y := x }
address payable z = address(y);
assembly { r := z }
require(z == 0x1122334455667788990011223344556677889900);
}
}
)";
compileAndRun(sourceCode, 0, "C");
ABI_CHECK(callContractFunction("f()"), encodeArgs(u256("0x1122334455667788990011223344556677889900")));
ABI_CHECK(callContractFunction("g()"), encodeArgs(u256("0x1122334455667788990011223344556677889900")));
}
BOOST_AUTO_TEST_CASE(skip_dynamic_types) BOOST_AUTO_TEST_CASE(skip_dynamic_types)
{ {
// The EVM cannot provide access to dynamically-sized return values, so we have to skip them. // The EVM cannot provide access to dynamically-sized return values, so we have to skip them.
@ -12446,7 +12494,7 @@ BOOST_AUTO_TEST_CASE(interface_contract)
} }
contract C { contract C {
function f(address _interfaceAddress) public returns (bool) { function f(address payable _interfaceAddress) public returns (bool) {
I i = I(_interfaceAddress); I i = I(_interfaceAddress);
return i.f(); return i.f();
} }

View File

@ -1,6 +1,6 @@
contract C { contract C {
function f() public { function f() public {
address addr; address payable addr;
uint balance = addr.balance; uint balance = addr.balance;
(bool callSuc,) = addr.call(""); (bool callSuc,) = addr.call("");
(bool delegatecallSuc,) = addr.delegatecall(""); (bool delegatecallSuc,) = addr.delegatecall("");

View File

@ -6,6 +6,8 @@ contract C {
function transfer(uint amount) public { function transfer(uint amount) public {
address(this).transfer(amount); // to avoid pureness warning address(this).transfer(amount); // to avoid pureness warning
} }
function() payable external {
}
} }
contract D { contract D {
function f() public { function f() public {

View File

@ -16,6 +16,8 @@ contract C {
(bool success,) = address(this).call(""); (bool success,) = address(this).call("");
require(success); require(success);
} }
function() payable external {
}
} }
// ---- // ----
// TypeError: (52-77): Function declared as view, but this expression (potentially) modifies the state and thus requires non-payable (the default) or payable. // TypeError: (52-77): Function declared as view, but this expression (potentially) modifies the state and thus requires non-payable (the default) or payable.