Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
3 wei
Eth Value
Less Than $0.01 (@ $2,491.67/ETH)More Info
Private Name Tags
ContractCreator
Latest 6 from a total of 6 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Release | 18726658 | 269 days ago | IN | 0 ETH | 0.00464895 | ||||
Release | 18726650 | 269 days ago | IN | 0 ETH | 0.00331586 | ||||
Release | 18723242 | 270 days ago | IN | 0 ETH | 0.00242263 | ||||
Release | 18720962 | 270 days ago | IN | 0 ETH | 0.00625211 | ||||
Release | 18718486 | 270 days ago | IN | 0 ETH | 0.00322073 | ||||
0x60806040 | 18714816 | 271 days ago | IN | 0 ETH | 0.04494509 |
Latest 13 internal transactions
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
18726658 | 269 days ago | 0.45887765 ETH | ||||
18726650 | 269 days ago | 0.34424429 ETH | ||||
18723242 | 270 days ago | 0.17409465 ETH | ||||
18720962 | 270 days ago | 0.45887765 ETH | ||||
18720846 | 270 days ago | 0.04914405 ETH | ||||
18720366 | 270 days ago | 0.13903728 ETH | ||||
18719237 | 270 days ago | 0.02282934 ETH | ||||
18719008 | 270 days ago | 0.07298947 ETH | ||||
18718750 | 270 days ago | 0.36888744 ETH | ||||
18718486 | 270 days ago | 0.28478299 ETH | ||||
18718475 | 270 days ago | 0.40405641 ETH | ||||
18715677 | 271 days ago | 0.1519899 ETH | ||||
18715021 | 271 days ago | 0.51194332 ETH |
Loading...
Loading
Contract Name:
PaymentSplitter
Compiler Version
v0.8.20+commit.a1b79de6
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-12-04 */ // Sources flattened with hardhat v2.17.2 https://hardhat.org // SPDX-License-Identifier: MIT // File @openzeppelin/contracts/token/ERC20/extensions/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/extensions/IERC20Permit.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. * * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't * need to send a transaction, and thus is not required to hold Ether at all. */ interface IERC20Permit { /** * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens, * given ``owner``'s signed approval. * * IMPORTANT: The same issues {IERC20-approve} has related to transaction * ordering also apply here. * * Emits an {Approval} event. * * Requirements: * * - `spender` cannot be the zero address. * - `deadline` must be a timestamp in the future. * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner` * over the EIP712-formatted function arguments. * - the signature must use ``owner``'s current nonce (see {nonces}). * * For more information on the signature format, see the * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP * section]. */ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; /** * @dev Returns the current nonce for `owner`. This value must be * included whenever a signature is generated for {permit}. * * Every successful call to {permit} increases ``owner``'s nonce by one. This * prevents a signature from being used multiple times. */ function nonces(address owner) external view returns (uint256); /** * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}. */ // solhint-disable-next-line func-name-mixedcase function DOMAIN_SEPARATOR() external view returns (bytes32); } // File @openzeppelin/contracts/token/ERC20/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 amount) external returns (bool); } // File @openzeppelin/contracts/utils/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @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. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @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.8.0/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"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } // File @openzeppelin/contracts/token/ERC20/utils/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.3) (token/ERC20/utils/SafeERC20.sol) pragma solidity ^0.8.0; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; /** * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } /** * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful. */ function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove(IERC20 token, address spender, uint256 value) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } /** * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 oldAllowance = token.allowance(address(this), spender); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance + value)); } /** * @dev Decrease the calling contract's allowance toward `spender` by `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance - value)); } } /** * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval * to be set to zero before setting it to a non-zero value, such as USDT. */ function forceApprove(IERC20 token, address spender, uint256 value) internal { bytes memory approvalCall = abi.encodeWithSelector(token.approve.selector, spender, value); if (!_callOptionalReturnBool(token, approvalCall)) { _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, 0)); _callOptionalReturn(token, approvalCall); } } /** * @dev Use a ERC-2612 signature to set the `owner` approval toward `spender` on `token`. * Revert on invalid signature. */ function safePermit( IERC20Permit token, address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) internal { uint256 nonceBefore = token.nonces(owner); token.permit(owner, spender, value, deadline, v, r, s); uint256 nonceAfter = token.nonces(owner); require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed"); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); require(returndata.length == 0 || abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). * * This is a variant of {_callOptionalReturn} that silents catches all reverts and returns a bool instead. */ function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We cannot use {Address-functionCall} here since this should return false // and not revert is the subcall reverts. (bool success, bytes memory returndata) = address(token).call(data); return success && (returndata.length == 0 || abi.decode(returndata, (bool))) && Address.isContract(address(token)); } } // File @openzeppelin/contracts/utils/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @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; } } // File @openzeppelin/contracts/finance/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (finance/PaymentSplitter.sol) pragma solidity ^0.8.0; /** * @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. * * NOTE: This contract assumes that ERC20 tokens will behave similarly to native tokens (Ether). Rebasing tokens, and * tokens that apply fees during transfers, are likely to not be supported as expected. If in doubt, we encourage you * to run tests before sending real value to this contract. */ contract PaymentSplitter is Context { event PayeeAdded(address account, uint256 shares); event PaymentReleased(address to, uint256 amount); event ERC20PaymentReleased(IERC20 indexed token, address to, uint256 amount); event PaymentReceived(address from, uint256 amount); uint256 private _totalShares; uint256 private _totalReleased; mapping(address => uint256) private _shares; mapping(address => uint256) private _released; address[] private _payees; mapping(IERC20 => uint256) private _erc20TotalReleased; mapping(IERC20 => mapping(address => uint256)) private _erc20Released; /** * @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"); for (uint256 i = 0; i < payees.length; i++) { _addPayee(payees[i], shares_[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 virtual { emit PaymentReceived(_msgSender(), 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 total amount of `token` already released. `token` should be the address of an IERC20 * contract. */ function totalReleased(IERC20 token) public view returns (uint256) { return _erc20TotalReleased[token]; } /** * @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 amount of `token` tokens already released to a payee. `token` should be the address of an * IERC20 contract. */ function released(IERC20 token, address account) public view returns (uint256) { return _erc20Released[token][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 Getter for the amount of payee's releasable `token` tokens. `token` should be the address of an * IERC20 contract. */ function releasable(IERC20 token, address account) public view returns (uint256) { uint256 totalReceived = token.balanceOf(address(this)) + totalReleased(token); return _pendingPayment(account, totalReceived, released(token, 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 virtual { 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; } Address.sendValue(account, payment); emit PaymentReleased(account, payment); } /** * @dev Triggers a transfer to `account` of the amount of `token` tokens they are owed, according to their * percentage of the total shares and their previous withdrawals. `token` must be the address of an IERC20 * contract. */ function release(IERC20 token, address account) public virtual { require(_shares[account] > 0, "PaymentSplitter: account has no shares"); uint256 payment = releasable(token, account); require(payment != 0, "PaymentSplitter: account is not due payment"); // _erc20TotalReleased[token] is the sum of all values in _erc20Released[token]. // If "_erc20TotalReleased[token] += payment" does not overflow, then "_erc20Released[token][account] += payment" // cannot overflow. _erc20TotalReleased[token] += payment; unchecked { _erc20Released[token][account] += payment; } SafeERC20.safeTransfer(token, account, payment); emit ERC20PaymentReleased(token, 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_); } } // File contracts/PaymentSplitter.sol // Original license: SPDX_License_Identifier: MIT pragma solidity ^0.8.0;
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":true,"internalType":"contract IERC20","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ERC20PaymentReleased","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"}],"name":"PayeeAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PaymentReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"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":"contract IERC20","name":"token","type":"address"},{"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":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"release","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"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":"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":[{"internalType":"contract IERC20","name":"token","type":"address"}],"name":"totalReleased","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"}]
Contract Creation Code
60806040526040516200113638038062001136833981016040819052620000269162000422565b8051825114620000985760405162461bcd60e51b815260206004820152603260248201527f5061796d656e7453706c69747465723a2070617965657320616e6420736861726044820152710cae640d8cadccee8d040dad2e6dac2e8c6d60731b60648201526084015b60405180910390fd5b5f825111620000ea5760405162461bcd60e51b815260206004820152601a60248201527f5061796d656e7453706c69747465723a206e6f2070617965657300000000000060448201526064016200008f565b5f5b82518110156200015557620001408382815181106200010f576200010f620004f9565b60200260200101518383815181106200012c576200012c620004f9565b60200260200101516200015e60201b60201c565b806200014c8162000521565b915050620000ec565b50505062000558565b6001600160a01b038216620001cb5760405162461bcd60e51b815260206004820152602c60248201527f5061796d656e7453706c69747465723a206163636f756e74206973207468652060448201526b7a65726f206164647265737360a01b60648201526084016200008f565b5f81116200021c5760405162461bcd60e51b815260206004820152601d60248201527f5061796d656e7453706c69747465723a2073686172657320617265203000000060448201526064016200008f565b6001600160a01b0382165f9081526002602052604090205415620002975760405162461bcd60e51b815260206004820152602b60248201527f5061796d656e7453706c69747465723a206163636f756e7420616c726561647960448201526a206861732073686172657360a81b60648201526084016200008f565b60048054600181019091557f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b0180546001600160a01b0319166001600160a01b0384169081179091555f90815260026020526040812082905554620002fe9082906200053c565b5f55604080516001600160a01b0384168152602081018390527f40c340f65e17194d14ddddb073d3c9f888e3cb52b5aae0c6c7706b4fbc905fac910160405180910390a15050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f191681016001600160401b038111828210171562000385576200038562000346565b604052919050565b5f6001600160401b03821115620003a857620003a862000346565b5060051b60200190565b5f82601f830112620003c2575f80fd5b81516020620003db620003d5836200038d565b6200035a565b82815260059290921b84018101918181019086841115620003fa575f80fd5b8286015b84811015620004175780518352918301918301620003fe565b509695505050505050565b5f806040838503121562000434575f80fd5b82516001600160401b03808211156200044b575f80fd5b818501915085601f8301126200045f575f80fd5b8151602062000472620003d5836200038d565b82815260059290921b8401810191818101908984111562000491575f80fd5b948201945b83861015620004c75785516001600160a01b0381168114620004b7575f8081fd5b8252948201949082019062000496565b91880151919650909350505080821115620004e0575f80fd5b50620004ef85828601620003b2565b9150509250929050565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f600182016200053557620005356200050d565b5060010190565b808201808211156200055257620005526200050d565b92915050565b610bd080620005665f395ff3fe60806040526004361061009d575f3560e01c80639852595c116100625780639852595c146101a2578063a3f8eace146101d6578063c45ac050146101f5578063ce7c2ac214610214578063d79779b214610248578063e33b7de31461027c575f80fd5b806319165587146100ea5780633a98ef391461010b578063406072a91461012d57806348b750441461014c5780638b83209b1461016b575f80fd5b366100e6577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be77033604080516001600160a01b0390921682523460208301520160405180910390a1005b5f80fd5b3480156100f5575f80fd5b50610109610104366004610977565b610290565b005b348015610116575f80fd5b505f545b6040519081526020015b60405180910390f35b348015610138575f80fd5b5061011a610147366004610992565b61037b565b348015610157575f80fd5b50610109610166366004610992565b6103a7565b348015610176575f80fd5b5061018a6101853660046109c9565b6104b3565b6040516001600160a01b039091168152602001610124565b3480156101ad575f80fd5b5061011a6101bc366004610977565b6001600160a01b03165f9081526003602052604090205490565b3480156101e1575f80fd5b5061011a6101f0366004610977565b6104e1565b348015610200575f80fd5b5061011a61020f366004610992565b610527565b34801561021f575f80fd5b5061011a61022e366004610977565b6001600160a01b03165f9081526002602052604090205490565b348015610253575f80fd5b5061011a610262366004610977565b6001600160a01b03165f9081526005602052604090205490565b348015610287575f80fd5b5060015461011a565b6001600160a01b0381165f908152600260205260409020546102cd5760405162461bcd60e51b81526004016102c4906109e0565b60405180910390fd5b5f6102d7826104e1565b9050805f036102f85760405162461bcd60e51b81526004016102c490610a26565b8060015f8282546103099190610a85565b90915550506001600160a01b0382165f90815260036020526040902080548201905561033582826105ca565b604080516001600160a01b0384168152602081018390527fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b056910160405180910390a15050565b6001600160a01b038083165f908152600660209081526040808320938516835292905220545b92915050565b6001600160a01b0381165f908152600260205260409020546103db5760405162461bcd60e51b81526004016102c4906109e0565b5f6103e68383610527565b9050805f036104075760405162461bcd60e51b81526004016102c490610a26565b6001600160a01b0383165f908152600560205260408120805483929061042e908490610a85565b90915550506001600160a01b038084165f9081526006602090815260408083209386168352929052208054820190556104688383836106e4565b604080516001600160a01b038481168252602082018490528516917f3be5b7a71e84ed12875d241991c70855ac5817d847039e17a9d895c1ceb0f18a910160405180910390a2505050565b5f600482815481106104c7576104c7610a98565b5f918252602090912001546001600160a01b031692915050565b5f806104ec60015490565b6104f69047610a85565b9050610520838261051b866001600160a01b03165f9081526003602052604090205490565b610736565b9392505050565b6001600160a01b0382165f9081526005602052604081205481906040516370a0823160e01b81523060048201526001600160a01b038616906370a0823190602401602060405180830381865afa158015610583573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105a79190610aac565b6105b19190610a85565b90506105c2838261051b878761037b565b949350505050565b8047101561061a5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e636500000060448201526064016102c4565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114610663576040519150601f19603f3d011682016040523d82523d5f602084013e610668565b606091505b50509050806106df5760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d6179206861766520726576657274656400000000000060648201526084016102c4565b505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526106df908490610770565b5f80546001600160a01b03851682526002602052604082205483919061075c9086610ac3565b6107669190610ada565b6105c29190610af9565b5f6107c4826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166108439092919063ffffffff16565b905080515f14806107e45750808060200190518101906107e49190610b0c565b6106df5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016102c4565b60606105c284845f85855f80866001600160a01b031685876040516108689190610b4d565b5f6040518083038185875af1925050503d805f81146108a2576040519150601f19603f3d011682016040523d82523d5f602084013e6108a7565b606091505b50915091506108b8878383876108c3565b979650505050505050565b606083156109315782515f0361092a576001600160a01b0385163b61092a5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016102c4565b50816105c2565b6105c283838151156109465781518083602001fd5b8060405162461bcd60e51b81526004016102c49190610b68565b6001600160a01b0381168114610974575f80fd5b50565b5f60208284031215610987575f80fd5b813561052081610960565b5f80604083850312156109a3575f80fd5b82356109ae81610960565b915060208301356109be81610960565b809150509250929050565b5f602082840312156109d9575f80fd5b5035919050565b60208082526026908201527f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f2060408201526573686172657360d01b606082015260800190565b6020808252602b908201527f5061796d656e7453706c69747465723a206163636f756e74206973206e6f742060408201526a191d59481c185e5b595b9d60aa1b606082015260800190565b634e487b7160e01b5f52601160045260245ffd5b808201808211156103a1576103a1610a71565b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215610abc575f80fd5b5051919050565b80820281158282048414176103a1576103a1610a71565b5f82610af457634e487b7160e01b5f52601260045260245ffd5b500490565b818103818111156103a1576103a1610a71565b5f60208284031215610b1c575f80fd5b81518015158114610520575f80fd5b5f5b83811015610b45578181015183820152602001610b2d565b50505f910152565b5f8251610b5e818460208701610b2b565b9190910192915050565b602081525f8251806020840152610b86816040850160208701610b2b565b601f01601f1916919091016040019291505056fea26469706673582212209ba911625e138c64dd6e2b3790af7832025854e515ba0a3adc36552b252ccecb64736f6c63430008140033000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000004000000000000000000000000c57e9cc2e969ea38de04aca3fc6d6c7b2e37c022000000000000000000000000c2af270fff0c8fda64711eb2ba335d1adfce75ae0000000000000000000000001713b32686af3b4898bff216334608d5943ee6980000000000000000000000006898ac00dbf1c776c76bdd61570867dc5d8276cb000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000007d00000000000000000000000000000000000000000000000000000000000000a6a0000000000000000000000000000000000000000000000000000000000000a6a0000000000000000000000000000000000000000000000000000000000000a6a
Deployed Bytecode
0x60806040526004361061009d575f3560e01c80639852595c116100625780639852595c146101a2578063a3f8eace146101d6578063c45ac050146101f5578063ce7c2ac214610214578063d79779b214610248578063e33b7de31461027c575f80fd5b806319165587146100ea5780633a98ef391461010b578063406072a91461012d57806348b750441461014c5780638b83209b1461016b575f80fd5b366100e6577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be77033604080516001600160a01b0390921682523460208301520160405180910390a1005b5f80fd5b3480156100f5575f80fd5b50610109610104366004610977565b610290565b005b348015610116575f80fd5b505f545b6040519081526020015b60405180910390f35b348015610138575f80fd5b5061011a610147366004610992565b61037b565b348015610157575f80fd5b50610109610166366004610992565b6103a7565b348015610176575f80fd5b5061018a6101853660046109c9565b6104b3565b6040516001600160a01b039091168152602001610124565b3480156101ad575f80fd5b5061011a6101bc366004610977565b6001600160a01b03165f9081526003602052604090205490565b3480156101e1575f80fd5b5061011a6101f0366004610977565b6104e1565b348015610200575f80fd5b5061011a61020f366004610992565b610527565b34801561021f575f80fd5b5061011a61022e366004610977565b6001600160a01b03165f9081526002602052604090205490565b348015610253575f80fd5b5061011a610262366004610977565b6001600160a01b03165f9081526005602052604090205490565b348015610287575f80fd5b5060015461011a565b6001600160a01b0381165f908152600260205260409020546102cd5760405162461bcd60e51b81526004016102c4906109e0565b60405180910390fd5b5f6102d7826104e1565b9050805f036102f85760405162461bcd60e51b81526004016102c490610a26565b8060015f8282546103099190610a85565b90915550506001600160a01b0382165f90815260036020526040902080548201905561033582826105ca565b604080516001600160a01b0384168152602081018390527fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b056910160405180910390a15050565b6001600160a01b038083165f908152600660209081526040808320938516835292905220545b92915050565b6001600160a01b0381165f908152600260205260409020546103db5760405162461bcd60e51b81526004016102c4906109e0565b5f6103e68383610527565b9050805f036104075760405162461bcd60e51b81526004016102c490610a26565b6001600160a01b0383165f908152600560205260408120805483929061042e908490610a85565b90915550506001600160a01b038084165f9081526006602090815260408083209386168352929052208054820190556104688383836106e4565b604080516001600160a01b038481168252602082018490528516917f3be5b7a71e84ed12875d241991c70855ac5817d847039e17a9d895c1ceb0f18a910160405180910390a2505050565b5f600482815481106104c7576104c7610a98565b5f918252602090912001546001600160a01b031692915050565b5f806104ec60015490565b6104f69047610a85565b9050610520838261051b866001600160a01b03165f9081526003602052604090205490565b610736565b9392505050565b6001600160a01b0382165f9081526005602052604081205481906040516370a0823160e01b81523060048201526001600160a01b038616906370a0823190602401602060405180830381865afa158015610583573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105a79190610aac565b6105b19190610a85565b90506105c2838261051b878761037b565b949350505050565b8047101561061a5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e636500000060448201526064016102c4565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114610663576040519150601f19603f3d011682016040523d82523d5f602084013e610668565b606091505b50509050806106df5760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d6179206861766520726576657274656400000000000060648201526084016102c4565b505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526106df908490610770565b5f80546001600160a01b03851682526002602052604082205483919061075c9086610ac3565b6107669190610ada565b6105c29190610af9565b5f6107c4826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166108439092919063ffffffff16565b905080515f14806107e45750808060200190518101906107e49190610b0c565b6106df5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016102c4565b60606105c284845f85855f80866001600160a01b031685876040516108689190610b4d565b5f6040518083038185875af1925050503d805f81146108a2576040519150601f19603f3d011682016040523d82523d5f602084013e6108a7565b606091505b50915091506108b8878383876108c3565b979650505050505050565b606083156109315782515f0361092a576001600160a01b0385163b61092a5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016102c4565b50816105c2565b6105c283838151156109465781518083602001fd5b8060405162461bcd60e51b81526004016102c49190610b68565b6001600160a01b0381168114610974575f80fd5b50565b5f60208284031215610987575f80fd5b813561052081610960565b5f80604083850312156109a3575f80fd5b82356109ae81610960565b915060208301356109be81610960565b809150509250929050565b5f602082840312156109d9575f80fd5b5035919050565b60208082526026908201527f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f2060408201526573686172657360d01b606082015260800190565b6020808252602b908201527f5061796d656e7453706c69747465723a206163636f756e74206973206e6f742060408201526a191d59481c185e5b595b9d60aa1b606082015260800190565b634e487b7160e01b5f52601160045260245ffd5b808201808211156103a1576103a1610a71565b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215610abc575f80fd5b5051919050565b80820281158282048414176103a1576103a1610a71565b5f82610af457634e487b7160e01b5f52601260045260245ffd5b500490565b818103818111156103a1576103a1610a71565b5f60208284031215610b1c575f80fd5b81518015158114610520575f80fd5b5f5b83811015610b45578181015183820152602001610b2d565b50505f910152565b5f8251610b5e818460208701610b2b565b9190910192915050565b602081525f8251806020840152610b86816040850160208701610b2b565b601f01601f1916919091016040019291505056fea26469706673582212209ba911625e138c64dd6e2b3790af7832025854e515ba0a3adc36552b252ccecb64736f6c63430008140033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000004000000000000000000000000c57e9cc2e969ea38de04aca3fc6d6c7b2e37c022000000000000000000000000c2af270fff0c8fda64711eb2ba335d1adfce75ae0000000000000000000000001713b32686af3b4898bff216334608d5943ee6980000000000000000000000006898ac00dbf1c776c76bdd61570867dc5d8276cb000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000007d00000000000000000000000000000000000000000000000000000000000000a6a0000000000000000000000000000000000000000000000000000000000000a6a0000000000000000000000000000000000000000000000000000000000000a6a
-----Decoded View---------------
Arg [0] : payees (address[]): 0xC57e9cc2E969Ea38de04AcA3fC6D6c7B2e37C022,0xc2Af270fFf0C8FdA64711Eb2ba335D1AdfCe75aE,0x1713b32686Af3B4898Bff216334608D5943Ee698,0x6898Ac00DBF1c776c76BDd61570867dc5d8276Cb
Arg [1] : shares_ (uint256[]): 2000,2666,2666,2666
-----Encoded View---------------
12 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [3] : 000000000000000000000000c57e9cc2e969ea38de04aca3fc6d6c7b2e37c022
Arg [4] : 000000000000000000000000c2af270fff0c8fda64711eb2ba335d1adfce75ae
Arg [5] : 0000000000000000000000001713b32686af3b4898bff216334608d5943ee698
Arg [6] : 0000000000000000000000006898ac00dbf1c776c76bdd61570867dc5d8276cb
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [8] : 00000000000000000000000000000000000000000000000000000000000007d0
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000a6a
Arg [10] : 0000000000000000000000000000000000000000000000000000000000000a6a
Arg [11] : 0000000000000000000000000000000000000000000000000000000000000a6a
Deployed Bytecode Sourcemap
24617:7286:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26557:40;23003:10;26557:40;;;-1:-1:-1;;;;;206:32:1;;;188:51;;26587:9:0;270:2:1;255:18;;248:34;161:18;26557:40:0;;;;;;;24617:7286;;;;;29078:671;;;;;;;;;;-1:-1:-1;29078:671:0;;;;;:::i;:::-;;:::i;:::-;;26688:91;;;;;;;;;;-1:-1:-1;26732:7:0;26759:12;26688:91;;;851:25:1;;;839:2;824:18;26688:91:0;;;;;;;;27817:135;;;;;;;;;;-1:-1:-1;27817:135:0;;;;;:::i;:::-;;:::i;30017:792::-;;;;;;;;;;-1:-1:-1;30017:792:0;;;;;:::i;:::-;;:::i;28043:100::-;;;;;;;;;;-1:-1:-1;28043:100:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1659:32:1;;;1641:51;;1629:2;1614:18;28043:100:0;1495:203:1;27539:109:0;;;;;;;;;;-1:-1:-1;27539:109:0;;;;;:::i;:::-;-1:-1:-1;;;;;27622:18:0;27595:7;27622:18;;;:9;:18;;;;;;;27539:109;28233:225;;;;;;;;;;-1:-1:-1;28233:225:0;;;;;:::i;:::-;;:::i;28618:260::-;;;;;;;;;;-1:-1:-1;28618:260:0;;;;;:::i;:::-;;:::i;27335:105::-;;;;;;;;;;-1:-1:-1;27335:105:0;;;;;:::i;:::-;-1:-1:-1;;;;;27416:16:0;27389:7;27416:16;;;:7;:16;;;;;;;27335:105;27125:119;;;;;;;;;;-1:-1:-1;27125:119:0;;;;;:::i;:::-;-1:-1:-1;;;;;27210:26:0;27183:7;27210:26;;;:19;:26;;;;;;;27125:119;26873:95;;;;;;;;;;-1:-1:-1;26946:14:0;;26873:95;;29078:671;-1:-1:-1;;;;;29154:16:0;;29173:1;29154:16;;;:7;:16;;;;;;29146:71;;;;-1:-1:-1;;;29146:71:0;;;;;;;:::i;:::-;;;;;;;;;29230:15;29248:19;29259:7;29248:10;:19::i;:::-;29230:37;;29288:7;29299:1;29288:12;29280:68;;;;-1:-1:-1;;;29280:68:0;;;;;;;:::i;:::-;29561:7;29543:14;;:25;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;29604:18:0;;;;;;:9;:18;;;;;:29;;;;;;29657:35;29614:7;29626;29657:17;:35::i;:::-;29708:33;;;-1:-1:-1;;;;;206:32:1;;188:51;;270:2;255:18;;248:34;;;29708:33:0;;161:18:1;29708:33:0;;;;;;;29135:614;29078:671;:::o;27817:135::-;-1:-1:-1;;;;;27914:21:0;;;27887:7;27914:21;;;:14;:21;;;;;;;;:30;;;;;;;;;;27817:135;;;;;:::o;30017:792::-;-1:-1:-1;;;;;30099:16:0;;30118:1;30099:16;;;:7;:16;;;;;;30091:71;;;;-1:-1:-1;;;30091:71:0;;;;;;;:::i;:::-;30175:15;30193:26;30204:5;30211:7;30193:10;:26::i;:::-;30175:44;;30240:7;30251:1;30240:12;30232:68;;;;-1:-1:-1;;;30232:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;30555:26:0;;;;;;:19;:26;;;;;:37;;30585:7;;30555:26;:37;;30585:7;;30555:37;:::i;:::-;;;;-1:-1:-1;;;;;;;30628:21:0;;;;;;;:14;:21;;;;;;;;:30;;;;;;;;;:41;;;;;;30693:47;30643:5;30650:7;30662;30693:22;:47::i;:::-;30756:45;;;-1:-1:-1;;;;;206:32:1;;;188:51;;270:2;255:18;;248:34;;;30756:45:0;;;;;161:18:1;30756:45:0;;;;;;;30080:729;30017:792;;:::o;28043:100::-;28094:7;28121;28129:5;28121:14;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;28121:14:0;;28043:100;-1:-1:-1;;28043:100:0:o;28233:225::-;28291:7;28311:21;28359:15;26946:14;;;26873:95;28359:15;28335:39;;:21;:39;:::i;:::-;28311:63;;28392:58;28408:7;28417:13;28432:17;28441:7;-1:-1:-1;;;;;27622:18:0;27595:7;27622:18;;;:9;:18;;;;;;;27539:109;28432:17;28392:15;:58::i;:::-;28385:65;28233:225;-1:-1:-1;;;28233:225:0:o;28618:260::-;-1:-1:-1;;;;;27210:26:0;;28690:7;27210:26;;;:19;:26;;;;;;28690:7;;28734:30;;-1:-1:-1;;;28734:30:0;;28758:4;28734:30;;;1641:51:1;-1:-1:-1;;;;;28734:15:0;;;;;1614:18:1;;28734:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:53;;;;:::i;:::-;28710:77;;28805:65;28821:7;28830:13;28845:24;28854:5;28861:7;28845:8;:24::i;28805:65::-;28798:72;28618:260;-1:-1:-1;;;;28618:260:0:o;8215:317::-;8330:6;8305:21;:31;;8297:73;;;;-1:-1:-1;;;8297:73:0;;4128:2:1;8297:73:0;;;4110:21:1;4167:2;4147:18;;;4140:30;4206:31;4186:18;;;4179:59;4255:18;;8297:73:0;3926:353:1;8297:73:0;8384:12;8402:9;-1:-1:-1;;;;;8402:14:0;8424:6;8402:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8383:52;;;8454:7;8446:78;;;;-1:-1:-1;;;8446:78:0;;4696:2:1;8446:78:0;;;4678:21:1;4735:2;4715:18;;;4708:30;4774:34;4754:18;;;4747:62;4845:28;4825:18;;;4818:56;4891:19;;8446:78:0;4494:422:1;8446:78:0;8286:246;8215:317;;:::o;16072:177::-;16182:58;;;-1:-1:-1;;;;;206:32:1;;16182:58:0;;;188:51:1;255:18;;;;248:34;;;16182:58:0;;;;;;;;;;161:18:1;;;;16182:58:0;;;;;;;;-1:-1:-1;;;;;16182:58:0;-1:-1:-1;;;16182:58:0;;;16155:86;;16175:5;;16155:19;:86::i;30987:248::-;31133:7;31197:12;;-1:-1:-1;;;;;31177:16:0;;;;:7;:16;;;;;;31212:15;;31197:12;31161:32;;:13;:32;:::i;:::-;31160:49;;;;:::i;:::-;:67;;;;:::i;20418:649::-;20842:23;20868:69;20896:4;20868:69;;;;;;;;;;;;;;;;;20876:5;-1:-1:-1;;;;;20868:27:0;;;:69;;;;;:::i;:::-;20842:95;;20956:10;:17;20977:1;20956:22;:56;;;;20993:10;20982:30;;;;;;;;;;;;:::i;:::-;20948:111;;;;-1:-1:-1;;;20948:111:0;;5933:2:1;20948:111:0;;;5915:21:1;5972:2;5952:18;;;5945:30;6011:34;5991:18;;;5984:62;-1:-1:-1;;;6062:18:1;;;6055:40;6112:19;;20948:111:0;5731:406:1;9711:229:0;9848:12;9880:52;9902:6;9910:4;9916:1;9919:12;9848;11085;11099:23;11126:6;-1:-1:-1;;;;;11126:11:0;11145:5;11152:4;11126:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11084:73;;;;11175:69;11202:6;11210:7;11219:10;11231:12;11175:26;:69::i;:::-;11168:76;10797:455;-1:-1:-1;;;;;;;10797:455:0:o;13370:644::-;13555:12;13584:7;13580:427;;;13612:10;:17;13633:1;13612:22;13608:290;;-1:-1:-1;;;;;7251:19:0;;;13822:60;;;;-1:-1:-1;;;13822:60:0;;7298:2:1;13822:60:0;;;7280:21:1;7337:2;7317:18;;;7310:30;7376:31;7356:18;;;7349:59;7425:18;;13822:60:0;7096:353:1;13822:60:0;-1:-1:-1;13919:10:0;13912:17;;13580:427;13962:33;13970:10;13982:12;14717:17;;:21;14713:388;;14949:10;14943:17;15006:15;14993:10;14989:2;14985:19;14978:44;14713:388;15076:12;15069:20;;-1:-1:-1;;;15069:20:0;;;;;;;;:::i;293:139:1:-;-1:-1:-1;;;;;376:31:1;;366:42;;356:70;;422:1;419;412:12;356:70;293:139;:::o;437:263::-;504:6;557:2;545:9;536:7;532:23;528:32;525:52;;;573:1;570;563:12;525:52;612:9;599:23;631:39;664:5;631:39;:::i;887:418::-;969:6;977;1030:2;1018:9;1009:7;1005:23;1001:32;998:52;;;1046:1;1043;1036:12;998:52;1085:9;1072:23;1104:39;1137:5;1104:39;:::i;:::-;1162:5;-1:-1:-1;1219:2:1;1204:18;;1191:32;1232:41;1191:32;1232:41;:::i;:::-;1292:7;1282:17;;;887:418;;;;;:::o;1310:180::-;1369:6;1422:2;1410:9;1401:7;1397:23;1393:32;1390:52;;;1438:1;1435;1428:12;1390:52;-1:-1:-1;1461:23:1;;1310:180;-1:-1:-1;1310:180:1:o;2237:402::-;2439:2;2421:21;;;2478:2;2458:18;;;2451:30;2517:34;2512:2;2497:18;;2490:62;-1:-1:-1;;;2583:2:1;2568:18;;2561:36;2629:3;2614:19;;2237:402::o;2644:407::-;2846:2;2828:21;;;2885:2;2865:18;;;2858:30;2924:34;2919:2;2904:18;;2897:62;-1:-1:-1;;;2990:2:1;2975:18;;2968:41;3041:3;3026:19;;2644:407::o;3056:127::-;3117:10;3112:3;3108:20;3105:1;3098:31;3148:4;3145:1;3138:15;3172:4;3169:1;3162:15;3188:125;3253:9;;;3274:10;;;3271:36;;;3287:18;;:::i;3605:127::-;3666:10;3661:3;3657:20;3654:1;3647:31;3697:4;3694:1;3687:15;3721:4;3718:1;3711:15;3737:184;3807:6;3860:2;3848:9;3839:7;3835:23;3831:32;3828:52;;;3876:1;3873;3866:12;3828:52;-1:-1:-1;3899:16:1;;3737:184;-1:-1:-1;3737:184:1:o;4921:168::-;4994:9;;;5025;;5042:15;;;5036:22;;5022:37;5012:71;;5063:18;;:::i;5094:217::-;5134:1;5160;5150:132;;5204:10;5199:3;5195:20;5192:1;5185:31;5239:4;5236:1;5229:15;5267:4;5264:1;5257:15;5150:132;-1:-1:-1;5296:9:1;;5094:217::o;5316:128::-;5383:9;;;5404:11;;;5401:37;;;5418:18;;:::i;5449:277::-;5516:6;5569:2;5557:9;5548:7;5544:23;5540:32;5537:52;;;5585:1;5582;5575:12;5537:52;5617:9;5611:16;5670:5;5663:13;5656:21;5649:5;5646:32;5636:60;;5692:1;5689;5682:12;6549:250;6634:1;6644:113;6658:6;6655:1;6652:13;6644:113;;;6734:11;;;6728:18;6715:11;;;6708:39;6680:2;6673:10;6644:113;;;-1:-1:-1;;6791:1:1;6773:16;;6766:27;6549:250::o;6804:287::-;6933:3;6971:6;6965:13;6987:66;7046:6;7041:3;7034:4;7026:6;7022:17;6987:66;:::i;:::-;7069:16;;;;;6804:287;-1:-1:-1;;6804:287:1:o;7454:396::-;7603:2;7592:9;7585:21;7566:4;7635:6;7629:13;7678:6;7673:2;7662:9;7658:18;7651:34;7694:79;7766:6;7761:2;7750:9;7746:18;7741:2;7733:6;7729:15;7694:79;:::i;:::-;7834:2;7813:15;-1:-1:-1;;7809:29:1;7794:45;;;;7841:2;7790:54;;7454:396;-1:-1:-1;;7454:396:1:o
Swarm Source
ipfs://9ba911625e138c64dd6e2b3790af7832025854e515ba0a3adc36552b252ccecb
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | 100.00% | $2,492.57 | 0.000000000000000003 | <$0.000001 |
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.