// SPDX-License-Identifier: Unlicensed
pragma solidity ^0.8.9;
interface NooneInterface {
struct PaymentTo {
address addr;
uint256 percentage;
}
event PaymentToChanged(PaymentTo[] payTo);
function paymentTo(uint256 index)
external
view
returns (PaymentTo memory);
function paymentToCount() external view returns (uint256);
event Paid(uint256 amount, address sender);
function pay() external;
}
pragma solidity ^0.8.9;
/**
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
}
pragma solidity ^0.8.9;
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* By default, the owner account will be the one that deploys the contract. This
* can later be changed with {transferOwnership}.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*/
abstract contract Ownable is Context {
address private _owner;
event OwnershipTransferred(
address indexed previousOwner,
address indexed newOwner
);
/**
* @dev Initializes the contract setting the deployer as the initial owner.
*/
constructor() {
_setOwner(_msgSender());
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view virtual returns (address) {
return _owner;
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
require(owner() == _msgSender(), "Ownable: caller is not the owner");
_;
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions anymore. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby removing any functionality that is only available to the owner.
*/
function renounceOwnership() public virtual onlyOwner {
_setOwner(address(0));
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual onlyOwner {
require(
newOwner != address(0),
"Ownable: new owner is the zero address"
);
_setOwner(newOwner);
}
function _setOwner(address newOwner) private {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}
// File: NooneTeam.sol
pragma solidity ^0.8.9;
contract NooneRnD is NooneInterface, Ownable {
mapping(address => bool) public isCallData;
mapping(uint256 => PaymentTo) private paymentTo_;
function paymentTo(uint256 index)
external
view
override
returns (PaymentTo memory)
{
return paymentTo_[index];
}
uint256 public override paymentToCount;
function addArrayToMapping(PaymentTo[] memory array) private {
paymentToCount = array.length;
for (uint256 i; i < array.length; i++) {
paymentTo_[i] = array[i];
}
}
function SetPaymentTo(PaymentTo[] calldata toPayTo)
external
onlyOwner
{
if (paymentToCount != 0) pay();
uint256 totalPercentage = 0;
for (uint256 i; i < toPayTo.length; i++) {
totalPercentage += toPayTo[i].percentage;
}
require(totalPercentage == 100, "Percentage must be 100");
addArrayToMapping(toPayTo);
emit PaymentToChanged(toPayTo);
}
function setisCallData(address _address, bool onoff) external onlyOwner {
isCallData[_address] = onoff;
}
function pay() public override {
require(paymentToCount != 0, "No addresses to distribute set");
if (address(this).balance == 0) return;
uint256 totalBalance = address(this).balance;
for (uint256 i; i < paymentToCount; i++) {
address to = paymentTo_[i].addr;
uint256 amount = totalBalance * paymentTo_[i].percentage / 100;
if (isCallData[to]) {
// Calls with non empty calldata to trigger fallback()
payable(to).call{value: amount}("a");
}
else {
payable(to).call{value: amount}("");
}
}
emit Paid(totalBalance, _msgSender());
}
// solhint-disable-next-line
receive() external payable {}
}
{
"compilationTarget": {
"contracts/Noone_team.sol": "NooneRnD"
},
"evmVersion": "london",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": true,
"runs": 200
},
"remappings": []
}
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"sender","type":"address"}],"name":"Paid","type":"event"},{"anonymous":false,"inputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint256","name":"percentage","type":"uint256"}],"indexed":false,"internalType":"struct NooneInterface.PaymentTo[]","name":"payTo","type":"tuple[]"}],"name":"PaymentToChanged","type":"event"},{"inputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint256","name":"percentage","type":"uint256"}],"internalType":"struct NooneInterface.PaymentTo[]","name":"toPayTo","type":"tuple[]"}],"name":"SetPaymentTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isCallData","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pay","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"paymentTo","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint256","name":"percentage","type":"uint256"}],"internalType":"struct NooneInterface.PaymentTo","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paymentToCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"bool","name":"onoff","type":"bool"}],"name":"setisCallData","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]