More Info
Private Name Tags
ContractCreator
Latest 1 from a total of 1 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
0x60806040 | 17117845 | 500 days ago | IN | 0 ETH | 0.0636335 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
17959990 | 382 days ago | 0.0002625 ETH | ||||
17959990 | 382 days ago | 0.00017479 ETH | ||||
17959990 | 382 days ago | 0.00002919 ETH | ||||
17959990 | 382 days ago | 0.00002919 ETH | ||||
17959990 | 382 days ago | 0.00002919 ETH | ||||
17959990 | 382 days ago | 0.00002919 ETH | ||||
17959990 | 382 days ago | 0.00002919 ETH | ||||
17959990 | 382 days ago | 0.00002919 ETH | ||||
17959990 | 382 days ago | 0.00002919 ETH | ||||
17959990 | 382 days ago | 0.00002919 ETH | ||||
17959990 | 382 days ago | 0.00002919 ETH | ||||
17959990 | 382 days ago | 0.0007 ETH | ||||
17947295 | 384 days ago | 0.0002625 ETH | ||||
17947295 | 384 days ago | 0.00017479 ETH | ||||
17947295 | 384 days ago | 0.00002919 ETH | ||||
17947295 | 384 days ago | 0.00002919 ETH | ||||
17947295 | 384 days ago | 0.00002919 ETH | ||||
17947295 | 384 days ago | 0.00002919 ETH | ||||
17947295 | 384 days ago | 0.00002919 ETH | ||||
17947295 | 384 days ago | 0.00002919 ETH | ||||
17947295 | 384 days ago | 0.00002919 ETH | ||||
17947295 | 384 days ago | 0.00002919 ETH | ||||
17947295 | 384 days ago | 0.00002919 ETH | ||||
17947295 | 384 days ago | 0.0007 ETH | ||||
17867219 | 395 days ago | 0.00027543 ETH |
Loading...
Loading
Similar Match Source Code This contract matches the deployed Bytecode of the Source Code for Contract 0xdc8a58EA...E1349bd84 The constructor portion of the code might be different and could alter the actual behaviour of the contract
Contract Name:
PaymentSplitter
Compiler Version
v0.8.17+commit.8df45f5f
Optimization Enabled:
Yes with 800 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (finance/PaymentSplitter.sol) pragma solidity 0.8.17; import "./SplitterAddress.sol"; /** * @title PaymentSplitter * @dev This contract allows to split Ether payments among a group of accounts. The sender does not need to be aware * that the Ether will be split in this way, since it is handled transparently by the contract. * * The split can be in equal parts or in any other arbitrary proportion. The way this is specified is by assigning each * account to a number of shares. Of all the Ether that this contract receives, each account will then be able to claim * an amount proportional to the percentage of total shares they were assigned. The distribution of shares is set at the * time of contract deployment and can't be updated thereafter. * * `PaymentSplitter` follows a _pull payment_ model. This means that payments are not automatically forwarded to the * accounts but kept in this contract, and the actual transfer is triggered as a separate step by calling the {release} * function. * */ contract PaymentSplitter { event PayeeAdded(address indexed account, uint256 shares); event PaymentReleased(address indexed to, uint256 amount); event PaymentReceived(address indexed from, uint256 amount); event Log(string message); uint256 private _totalShares; uint256 private _totalReleased; mapping(address => uint256) private _shares; mapping(address => uint256) private _released; address[] private _payees; /** * @dev Creates an instance of `PaymentSplitter` where each account in `payees` is assigned the number of shares at * the matching position in the `shares` array. * * All addresses in `payees` must be non-zero. Both arrays must have the same non-zero length, and there must be no * duplicates in `payees`. */ constructor(address[] memory payees, uint256[] memory shares_) payable { require(payees.length == shares_.length, "PaymentSplitter: payees and shares length mismatch"); require(payees.length > 0, "PaymentSplitter: no payees"); uint256 limit = payees.length; for (uint256 i = 0; i < limit ;) { _addPayee(payees[i], shares_[i]); unchecked { i++; } } } /** * @dev The Ether received will be logged with {PaymentReceived} events. Note that these events are not fully * reliable: it's possible for a contract to receive Ether without triggering this function. This only affects the * reliability of the events, and not the actual splitting of Ether. * * To learn more about this see the Solidity documentation for * https://solidity.readthedocs.io/en/latest/contracts.html#fallback-function[fallback * functions]. */ receive() external payable { uint256 limit = _payees.length; for(uint256 i = 0; i < limit;){ try this.release(payable(_payees[i])) { } catch { emit Log("PaymentSplitter : external call failed"); } unchecked { i++; } } emit PaymentReceived(msg.sender, msg.value); } /** * @dev Getter for the total shares held by payees. */ function totalShares() public view returns (uint256) { return _totalShares; } /** * @dev Getter for the total amount of Ether already released. */ function totalReleased() public view returns (uint256) { return _totalReleased; } /** * @dev Getter for the amount of shares held by an account. */ function shares(address account) public view returns (uint256) { return _shares[account]; } /** * @dev Getter for the amount of Ether already released to a payee. */ function released(address account) public view returns (uint256) { return _released[account]; } /** * @dev Getter for the address of the payee number `index`. */ function payee(uint256 index) public view returns (address) { return _payees[index]; } /** * @dev Getter for the amount of payee's releasable Ether. */ function releasable(address account) public view returns (uint256) { uint256 totalReceived = address(this).balance + totalReleased(); return _pendingPayment(account, totalReceived, released(account)); } /** * @dev Triggers a transfer to `account` of the amount of Ether they are owed, according to their percentage of the * total shares and their previous withdrawals. */ function release(address payable account) public { require(_shares[account] > 0, "PaymentSplitter: account has no shares"); uint256 payment = releasable(account); require(payment != 0, "PaymentSplitter: account is not due payment"); // _totalReleased is the sum of all values in _released. // If "_totalReleased += payment" does not overflow, then "_released[account] += payment" cannot overflow. _totalReleased += payment; unchecked { _released[account] += payment; } SplitterAddress.sendValue(account, payment); emit PaymentReleased(account, payment); } /** * @dev internal logic for computing the pending payment of an `account` given the token historical balances and * already released amounts. */ function _pendingPayment( address account, uint256 totalReceived, uint256 alreadyReleased ) private view returns (uint256) { return ((totalReceived * _shares[account]) / _totalShares ) - alreadyReleased; } /** * @dev Add a new payee to the contract. * @param account The address of the payee to add. * @param shares_ The number of shares owned by the payee. */ function _addPayee(address account, uint256 shares_) private { require(account != address(0), "PaymentSplitter: account is the zero address"); require(shares_ > 0, "PaymentSplitter: shares are 0"); require(_shares[account] == 0, "PaymentSplitter: account already has shares"); _payees.push(account); _shares[account] = shares_; _totalShares = _totalShares + shares_; emit PayeeAdded(account, shares_); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol) pragma solidity 0.8.17; /** * @dev Collection of functions related to the address type */ library SplitterAddress { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * * Furthermore, `isContract` will also return true if the target contract within * the same transaction is already scheduled for destruction by `SELFDESTRUCT`, * which only has an effect at the end of a transaction. * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } }
{ "optimizer": { "enabled": true, "runs": 800 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address[]","name":"payees","type":"address[]"},{"internalType":"uint256[]","name":"shares_","type":"uint256[]"}],"stateMutability":"payable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"message","type":"string"}],"name":"Log","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"}],"name":"PayeeAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PaymentReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PaymentReleased","type":"event"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"payee","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"releasable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"account","type":"address"}],"name":"release","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"released","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"shares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalReleased","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]
Deployed Bytecode
0x6080604052600436106100745760003560e01c80639852595c1161004e5780639852595c14610274578063a3f8eace146102aa578063ce7c2ac2146102ca578063e33b7de31461030057600080fd5b806319165587146101f65780633a98ef39146102185780638b83209b1461023c57600080fd5b366101f15760045460005b818110156101b957306001600160a01b03166319165587600483815481106100a9576100a9610687565b60009182526020909120015460405160e083901b7fffffffff000000000000000000000000000000000000000000000000000000001681526001600160a01b039091166004820152602401600060405180830381600087803b15801561010e57600080fd5b505af192505050801561011f575060015b6101b1577fcf34ef537ac33ee1ac626ca1587a0a7e8e51561e5514f8cb36afa1c5102b3bab6040516101a89060208082526026908201527f5061796d656e7453706c6974746572203a2065787465726e616c2063616c6c2060408201527f6661696c65640000000000000000000000000000000000000000000000000000606082015260800190565b60405180910390a15b60010161007f565b5060405134815233907f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be7709060200160405180910390a2005b600080fd5b34801561020257600080fd5b506102166102113660046106b5565b610315565b005b34801561022457600080fd5b506000545b6040519081526020015b60405180910390f35b34801561024857600080fd5b5061025c6102573660046106d2565b6104ae565b6040516001600160a01b039091168152602001610233565b34801561028057600080fd5b5061022961028f3660046106b5565b6001600160a01b031660009081526003602052604090205490565b3480156102b657600080fd5b506102296102c53660046106b5565b6104de565b3480156102d657600080fd5b506102296102e53660046106b5565b6001600160a01b031660009081526002602052604090205490565b34801561030c57600080fd5b50600154610229565b6001600160a01b0381166000908152600260205260409020546103a55760405162461bcd60e51b815260206004820152602660248201527f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f2060448201527f736861726573000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b60006103b0826104de565b9050806000036104285760405162461bcd60e51b815260206004820152602b60248201527f5061796d656e7453706c69747465723a206163636f756e74206973206e6f742060448201527f647565207061796d656e74000000000000000000000000000000000000000000606482015260840161039c565b806001600082825461043a9190610701565b90915550506001600160a01b03821660009081526003602052604090208054820190556104678282610526565b816001600160a01b03167fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b056826040516104a291815260200190565b60405180910390a25050565b6000600482815481106104c3576104c3610687565b6000918252602090912001546001600160a01b031692915050565b6000806104ea60015490565b6104f49047610701565b905061051f838261051a866001600160a01b031660009081526003602052604090205490565b610644565b9392505050565b804710156105765760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e6365000000604482015260640161039c565b6000826001600160a01b03168260405160006040518083038185875af1925050503d80600081146105c3576040519150601f19603f3d011682016040523d82523d6000602084013e6105c8565b606091505b505090508061063f5760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d61792068617665207265766572746564000000000000606482015260840161039c565b505050565b600080546001600160a01b03851682526002602052604082205483919061066b908661071a565b6106759190610731565b61067f9190610753565b949350505050565b634e487b7160e01b600052603260045260246000fd5b6001600160a01b03811681146106b257600080fd5b50565b6000602082840312156106c757600080fd5b813561051f8161069d565b6000602082840312156106e457600080fd5b5035919050565b634e487b7160e01b600052601160045260246000fd5b80820180821115610714576107146106eb565b92915050565b8082028115828204841417610714576107146106eb565b60008261074e57634e487b7160e01b600052601260045260246000fd5b500490565b81810381811115610714576107146106eb56fea264697066735822122083294f4d28ab91621394405e4903071c8f52770a24540f26db399ec3721c377164736f6c63430008110033
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | 100.00% | $2,373.5 | 0.0193 | $45.79 |
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.