Feature Tip: Add private address tag to any address under My Name Tag !
More Info
Private Name Tags
ContractCreator
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
NSender
Compiler Version
v0.8.11+commit.d7f03943
Contract Source Code (Solidity Multiple files format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./Initializable.sol"; import "./OwnableUpgradeable.sol"; import "./TransferHelper.sol"; import "./Address.sol"; import "./SafeMath.sol"; contract NSender is Initializable, OwnableUpgradeable{ uint256 public fees; uint256 public ethFee; event SendToken(address indexed token, address payer, uint256 orderAmount, uint256 fee); event ClaimFee(address claimer, uint256 amount); receive() payable external {} function initialize()public initializer{ __Context_init_unchained(); __Ownable_init_unchained(); } function sendToken(address _token, address[] memory _payees, uint256[] memory _amounts) payable external { require(msg.value >= ethFee); uint256 orderAmount = calculatingOrderAmount(_amounts); for(uint256 index=0; index < _payees.length; index++) { TransferHelper.safeTransferFrom(_token, msg.sender, _payees[index], _amounts[index]); } calculatingFee(); emit SendToken(_token, msg.sender, orderAmount, ethFee); } function sendEth(address[] memory _payees, uint256[] memory _amounts) payable external{ uint256 orderAmount = calculatingOrderAmount(_amounts); uint256 totalAmt = SafeMath.add(orderAmount, ethFee); require(totalAmt <= msg.value); for(uint256 index=0; index < _payees.length; index++) { TransferHelper.safeTransferETH(_payees[index], _amounts[index]); } calculatingFee(); emit SendToken(address(0), msg.sender, orderAmount, ethFee); } function calculatingFee() private { if (ethFee > 0) { fees = SafeMath.add(fees, ethFee); } } function calculatingOrderAmount(uint256[] memory _amounts) private pure returns(uint256) { uint256 totalAmt = 0; for(uint256 index=0; index < _amounts.length; index++) { totalAmt = SafeMath.add(totalAmt, _amounts[index]); } return totalAmt; } function changeEthFee(uint256 _newEthFee) external onlyOwner{ ethFee = _newEthFee; } function claimFee(uint256 _amount) external onlyOwner { require(_amount > 0); require(address(this).balance >= _amount); TransferHelper.safeTransferETH(msg.sender, _amount); emit ClaimFee(msg.sender, _amount); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @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 * ==== * * [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://diligence.consensys.net/posts/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"); } /** * @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 functionCall(target, data, "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"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(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) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(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) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason 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 { // 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 assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library AddressUpgradeable { /** * @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 * ==== * * [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://diligence.consensys.net/posts/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"); } /** * @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 functionCall(target, data, "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"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(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) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason 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 { // 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 assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
// SPDX-License-Identifier: MIT 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; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; import "./Initializable.sol"; /** * @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 ContextUpgradeable is Initializable { function __Context_init() internal onlyInitializing { } function __Context_init_unchained() internal onlyInitializing { } function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[50] private __gap; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev ERC1822: Universal Upgradeable Proxy Standard (UUPS) documents a method for upgradeability through a simplified * proxy whose upgrades are fully controlled by the current implementation. */ interface IERC1822Proxiable { /** * @dev Returns the storage slot that the proxiable contract assumes is being used to store the implementation * address. * * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this * function revert if invoked through a proxy. */ function proxiableUUID() external view returns (bytes32); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./Proxy.sol"; import "./ERC1967Upgrade.sol"; /** * @dev This contract implements an upgradeable proxy. It is upgradeable because calls are delegated to an * implementation address that can be changed. This address is stored in storage in the location specified by * https://eips.ethereum.org/EIPS/eip-1967[EIP1967], so that it doesn't conflict with the storage layout of the * implementation behind the proxy. */ contract ERC1967Proxy is Proxy, ERC1967Upgrade { /** * @dev Initializes the upgradeable proxy with an initial implementation specified by `_logic`. * * If `_data` is nonempty, it's used as data in a delegate call to `_logic`. This will typically be an encoded * function call, and allows initializating the storage of the proxy like a Solidity constructor. */ constructor(address _logic, bytes memory _data) payable { assert(_IMPLEMENTATION_SLOT == bytes32(uint256(keccak256("eip1967.proxy.implementation")) - 1)); _upgradeToAndCall(_logic, _data, false); } /** * @dev Returns the current implementation address. */ function _implementation() internal view virtual override returns (address impl) { return ERC1967Upgrade._getImplementation(); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./IBeacon.sol"; import "./draft-IERC1822.sol"; import "./Address.sol"; import "./StorageSlot.sol"; /** * @dev This abstract contract provides getters and event emitting update functions for * https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots. * * _Available since v4.1._ * * @custom:oz-upgrades-unsafe-allow delegatecall */ abstract contract ERC1967Upgrade { // This is the keccak-256 hash of "eip1967.proxy.rollback" subtracted by 1 bytes32 private constant _ROLLBACK_SLOT = 0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143; /** * @dev Storage slot with the address of the current implementation. * This is the keccak-256 hash of "eip1967.proxy.implementation" subtracted by 1, and is * validated in the constructor. */ bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; /** * @dev Emitted when the implementation is upgraded. */ event Upgraded(address indexed implementation); /** * @dev Returns the current implementation address. */ function _getImplementation() internal view returns (address) { return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value; } /** * @dev Stores a new address in the EIP1967 implementation slot. */ function _setImplementation(address newImplementation) private { require(Address.isContract(newImplementation), "ERC1967: new implementation is not a contract"); StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation; } /** * @dev Perform implementation upgrade * * Emits an {Upgraded} event. */ function _upgradeTo(address newImplementation) internal { _setImplementation(newImplementation); emit Upgraded(newImplementation); } /** * @dev Perform implementation upgrade with additional setup call. * * Emits an {Upgraded} event. */ function _upgradeToAndCall( address newImplementation, bytes memory data, bool forceCall ) internal { _upgradeTo(newImplementation); if (data.length > 0 || forceCall) { Address.functionDelegateCall(newImplementation, data); } } /** * @dev Perform implementation upgrade with security checks for UUPS proxies, and additional setup call. * * Emits an {Upgraded} event. */ function _upgradeToAndCallUUPS( address newImplementation, bytes memory data, bool forceCall ) internal { // Upgrades from old implementations will perform a rollback test. This test requires the new // implementation to upgrade back to the old, non-ERC1822 compliant, implementation. Removing // this special case will break upgrade paths from old UUPS implementation to new ones. if (StorageSlot.getBooleanSlot(_ROLLBACK_SLOT).value) { _setImplementation(newImplementation); } else { try IERC1822Proxiable(newImplementation).proxiableUUID() returns (bytes32 slot) { require(slot == _IMPLEMENTATION_SLOT, "ERC1967Upgrade: unsupported proxiableUUID"); } catch { revert("ERC1967Upgrade: new implementation is not UUPS"); } _upgradeToAndCall(newImplementation, data, forceCall); } } /** * @dev Storage slot with the admin of the contract. * This is the keccak-256 hash of "eip1967.proxy.admin" subtracted by 1, and is * validated in the constructor. */ bytes32 internal constant _ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103; /** * @dev Emitted when the admin account has changed. */ event AdminChanged(address previousAdmin, address newAdmin); /** * @dev Returns the current admin. */ function _getAdmin() internal view returns (address) { return StorageSlot.getAddressSlot(_ADMIN_SLOT).value; } /** * @dev Stores a new address in the EIP1967 admin slot. */ function _setAdmin(address newAdmin) private { require(newAdmin != address(0), "ERC1967: new admin is the zero address"); StorageSlot.getAddressSlot(_ADMIN_SLOT).value = newAdmin; } /** * @dev Changes the admin of the proxy. * * Emits an {AdminChanged} event. */ function _changeAdmin(address newAdmin) internal { emit AdminChanged(_getAdmin(), newAdmin); _setAdmin(newAdmin); } /** * @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy. * This is bytes32(uint256(keccak256('eip1967.proxy.beacon')) - 1)) and is validated in the constructor. */ bytes32 internal constant _BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50; /** * @dev Emitted when the beacon is upgraded. */ event BeaconUpgraded(address indexed beacon); /** * @dev Returns the current beacon. */ function _getBeacon() internal view returns (address) { return StorageSlot.getAddressSlot(_BEACON_SLOT).value; } /** * @dev Stores a new beacon in the EIP1967 beacon slot. */ function _setBeacon(address newBeacon) private { require(Address.isContract(newBeacon), "ERC1967: new beacon is not a contract"); require( Address.isContract(IBeacon(newBeacon).implementation()), "ERC1967: beacon implementation is not a contract" ); StorageSlot.getAddressSlot(_BEACON_SLOT).value = newBeacon; } /** * @dev Perform beacon upgrade with additional setup call. Note: This upgrades the address of the beacon, it does * not upgrade the implementation contained in the beacon (see {UpgradeableBeacon-_setImplementation} for that). * * Emits a {BeaconUpgraded} event. */ function _upgradeBeaconToAndCall( address newBeacon, bytes memory data, bool forceCall ) internal { _setBeacon(newBeacon); emit BeaconUpgraded(newBeacon); if (data.length > 0 || forceCall) { Address.functionDelegateCall(IBeacon(newBeacon).implementation(), data); } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev This is the interface that {BeaconProxy} expects of its beacon. */ interface IBeacon { /** * @dev Must return an address that can be used as a delegate call target. * * {BeaconProxy} will check that this address is a contract. */ function implementation() external view returns (address); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; interface IERC20 { function name() external view returns (string memory); function symbol() external view returns (string memory); function decimals() external view returns (uint8); function totalSupply() external view returns (uint256); function balanceOf(address _owner) external view returns(uint256 balance); function transfer(address _to, uint256 _value) external returns (bool success); function transferFrom(address _from, address _to, uint256 _value) external returns (bool success); function approve(address _spender, uint256 _value) external returns (bool success); function allowance(address _owner, address _spender) external view returns (uint256 remaining); event Transfer(address indexed _from, address indexed _to, uint256 _value); event Approval(address indexed _owner, address indexed _spender, uint256 _value); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./AddressUpgradeable.sol"; abstract contract Initializable { /** * @dev Indicates that the contract has been initialized. */ bool private _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private _initializing; /** * @dev Modifier to protect an initializer function from being invoked twice. */ modifier initializer() { // If the contract is initializing we ignore whether _initialized is set in order to support multiple // inheritance patterns, but we only do this in the context of a constructor, because in other contexts the // contract may have been reentered. require(_initializing ? _isConstructor() : !_initialized, "Initializable: contract is already initialized"); bool isTopLevelCall = !_initializing; if (isTopLevelCall) { _initializing = true; _initialized = true; } _; if (isTopLevelCall) { _initializing = false; } } /** * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the * {initializer} modifier, directly or indirectly. */ modifier onlyInitializing() { require(_initializing, "Initializable: contract is not initializing"); _; } function _isConstructor() private view returns (bool) { return !AddressUpgradeable.isContract(address(this)); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./ERC1967Proxy.sol"; contract NgSenderProxy is ERC1967Proxy { constructor( address _logic, address admin_, bytes memory _data ) payable ERC1967Proxy(_logic, _data) { assert(_ADMIN_SLOT == bytes32(uint256(keccak256("eip1967.proxy.admin")) - 1)); _changeAdmin(admin_); } modifier ifAdmin() { if (msg.sender == _getAdmin()) { _; } else { _fallback(); } } function admin() external ifAdmin returns (address admin_) { admin_ = _getAdmin(); } function implementation() external ifAdmin returns (address implementation_) { implementation_ = _implementation(); } function changeAdmin(address newAdmin) external virtual ifAdmin { _changeAdmin(newAdmin); } function upgradeTo(address newImplementation) external ifAdmin { _upgradeToAndCall(newImplementation, bytes(""), false); } function upgradeToAndCall(address newImplementation, bytes calldata data) external payable ifAdmin { _upgradeToAndCall(newImplementation, data, true); } function _admin() internal view virtual returns (address) { return _getAdmin(); } function _beforeFallback() internal virtual override { require(msg.sender != _getAdmin(), "TransparentUpgradeableProxy: admin cannot fallback to proxy target"); super._beforeFallback(); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./Context.sol"; /** * @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() { _transferOwnership(_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 { _transferOwnership(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"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./ContextUpgradeable.sol"; import "./Initializable.sol"; /** * @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 OwnableUpgradeable is Initializable, ContextUpgradeable { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ function __Ownable_init() internal onlyInitializing { __Ownable_init_unchained(); } function __Ownable_init_unchained() internal onlyInitializing { _transferOwnership(_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 { _transferOwnership(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"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[49] private __gap; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev This abstract contract provides a fallback function that delegates all calls to another contract using the EVM * instruction `delegatecall`. We refer to the second contract as the _implementation_ behind the proxy, and it has to * be specified by overriding the virtual {_implementation} function. * * Additionally, delegation to the implementation can be triggered manually through the {_fallback} function, or to a * different contract through the {_delegate} function. * * The success and return data of the delegated call will be returned back to the caller of the proxy. */ abstract contract Proxy { /** * @dev Delegates the current call to `implementation`. * * This function does not return to its internal call site, it will return directly to the external caller. */ function _delegate(address implementation) internal virtual { assembly { // Copy msg.data. We take full control of memory in this inline assembly // block because it will not return to Solidity code. We overwrite the // Solidity scratch pad at memory position 0. calldatacopy(0, 0, calldatasize()) // Call the implementation. // out and outsize are 0 because we don't know the size yet. let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0) // Copy the returned data. returndatacopy(0, 0, returndatasize()) switch result // delegatecall returns 0 on error. case 0 { revert(0, returndatasize()) } default { return(0, returndatasize()) } } } /** * @dev This is a virtual function that should be overriden so it returns the address to which the fallback function * and {_fallback} should delegate. */ function _implementation() internal view virtual returns (address); /** * @dev Delegates the current call to the address returned by `_implementation()`. * * This function does not return to its internall call site, it will return directly to the external caller. */ function _fallback() internal virtual { _beforeFallback(); _delegate(_implementation()); } /** * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if no other * function in the contract matches the call data. */ fallback() external payable virtual { _fallback(); } /** * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if call data * is empty. */ receive() external payable virtual { _fallback(); } /** * @dev Hook that is called before falling back to the implementation. Can happen as part of a manual `_fallback` * call, or as part of the Solidity `fallback` or `receive` functions. * * If overriden should call `super._beforeFallback()`. */ function _beforeFallback() internal virtual {} }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./TransparentUpgradeableProxy.sol"; import "./Ownable.sol"; contract ProxyAdmin is Ownable { function getProxyImplementation(TransparentUpgradeableProxy proxy) public view virtual returns (address) { // We need to manually run the static call since the getter cannot be flagged as view // bytes4(keccak256("implementation()")) == 0x5c60da1b (bool success, bytes memory returndata) = address(proxy).staticcall(hex"5c60da1b"); require(success); return abi.decode(returndata, (address)); } function getProxyAdmin(TransparentUpgradeableProxy proxy) public view virtual returns (address) { // We need to manually run the static call since the getter cannot be flagged as view // bytes4(keccak256("admin()")) == 0xf851a440 (bool success, bytes memory returndata) = address(proxy).staticcall(hex"f851a440"); require(success); return abi.decode(returndata, (address)); } function changeProxyAdmin(TransparentUpgradeableProxy proxy, address newAdmin) public virtual onlyOwner { proxy.changeAdmin(newAdmin); } function upgrade(TransparentUpgradeableProxy proxy, address implementation) public virtual onlyOwner { proxy.upgradeTo(implementation); } function upgradeAndCall( TransparentUpgradeableProxy proxy, address implementation, bytes memory data ) public payable virtual onlyOwner { proxy.upgradeToAndCall{value: msg.value}(implementation, data); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b > a) return (false, 0); return (true, a - b); } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b == 0) return (false, 0); return (true, a / b); } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b == 0) return (false, 0); return (true, a % b); } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { require(b <= a, "SafeMath: subtraction overflow"); return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { if (a == 0) return 0; uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { require(b > 0, "SafeMath: division by zero"); return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { require(b > 0, "SafeMath: modulo by zero"); return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); return a - b; } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryDiv}. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); return a % b; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Library for reading and writing primitive types to specific storage slots. * * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts. * This library helps with reading and writing to such slots without the need for inline assembly. * * The functions in this library return Slot structs that contain a `value` member that can be used to read or write. * * Example usage to set ERC1967 implementation slot: * ``` * contract ERC1967 { * bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; * * function _getImplementation() internal view returns (address) { * return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value; * } * * function _setImplementation(address newImplementation) internal { * require(Address.isContract(newImplementation), "ERC1967: new implementation is not a contract"); * StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation; * } * } * ``` * * _Available since v4.1 for `address`, `bool`, `bytes32`, and `uint256`._ */ library StorageSlot { struct AddressSlot { address value; } struct BooleanSlot { bool value; } struct Bytes32Slot { bytes32 value; } struct Uint256Slot { uint256 value; } /** * @dev Returns an `AddressSlot` with member `value` located at `slot`. */ function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) { assembly { r.slot := slot } } /** * @dev Returns an `BooleanSlot` with member `value` located at `slot`. */ function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) { assembly { r.slot := slot } } /** * @dev Returns an `Bytes32Slot` with member `value` located at `slot`. */ function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) { assembly { r.slot := slot } } /** * @dev Returns an `Uint256Slot` with member `value` located at `slot`. */ function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) { assembly { r.slot := slot } } }
// SPDX-License-Identifier: GPL-2.0-or-later pragma solidity ^0.8.0; import "./IERC20.sol"; library TransferHelper { /// @notice Transfers tokens from the targeted address to the given destination /// @notice Errors with 'STF' if transfer fails /// @param token The contract address of the token to be transferred /// @param from The originating address from which the tokens will be transferred /// @param to The destination address of the transfer /// @param value The amount to be transferred function safeTransferFrom( address token, address from, address to, uint256 value ) internal { (bool success, bytes memory data) = token.call(abi.encodeWithSelector(IERC20.transferFrom.selector, from, to, value)); require(success && (data.length == 0 || abi.decode(data, (bool))), 'STF'); } /// @notice Transfers tokens from msg.sender to a recipient /// @dev Errors with ST if transfer fails /// @param token The contract address of the token which will be transferred /// @param to The recipient of the transfer /// @param value The value of the transfer function safeTransfer( address token, address to, uint256 value ) internal { (bool success, bytes memory data) = token.call(abi.encodeWithSelector(IERC20.transfer.selector, to, value)); require(success && (data.length == 0 || abi.decode(data, (bool))), 'ST'); } /// @notice Approves the stipulated contract to spend the given allowance in the given token /// @dev Errors with 'SA' if transfer fails /// @param token The contract address of the token to be approved /// @param to The target of the approval /// @param value The amount of the given token the target will be allowed to spend function safeApprove( address token, address to, uint256 value ) internal { (bool success, bytes memory data) = token.call(abi.encodeWithSelector(IERC20.approve.selector, to, value)); require(success && (data.length == 0 || abi.decode(data, (bool))), 'SA'); } /// @notice Transfers ETH to the recipient address /// @dev Fails with `STE` /// @param to The destination of the transfer /// @param value The value to be transferred function safeTransferETH(address to, uint256 value) internal { (bool success, ) = to.call{value: value}(new bytes(0)); require(success, 'STE'); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./ERC1967Proxy.sol"; /** * @dev This contract implements a proxy that is upgradeable by an admin. * * To avoid https://medium.com/nomic-labs-blog/malicious-backdoors-in-ethereum-proxies-62629adf3357[proxy selector * clashing], which can potentially be used in an attack, this contract uses the * https://blog.openzeppelin.com/the-transparent-proxy-pattern/[transparent proxy pattern]. This pattern implies two * things that go hand in hand: * * 1. If any account other than the admin calls the proxy, the call will be forwarded to the implementation, even if * that call matches one of the admin functions exposed by the proxy itself. * 2. If the admin calls the proxy, it can access the admin functions, but its calls will never be forwarded to the * implementation. If the admin tries to call a function on the implementation it will fail with an error that says * "admin cannot fallback to proxy target". * * These properties mean that the admin account can only be used for admin actions like upgrading the proxy or changing * the admin, so it's best if it's a dedicated account that is not used for anything else. This will avoid headaches due * to sudden errors when trying to call a function from the proxy implementation. * * Our recommendation is for the dedicated account to be an instance of the {ProxyAdmin} contract. If set up this way, * you should think of the `ProxyAdmin` instance as the real administrative interface of your proxy. */ contract TransparentUpgradeableProxy is ERC1967Proxy { /** * @dev Initializes an upgradeable proxy managed by `_admin`, backed by the implementation at `_logic`, and * optionally initialized with `_data` as explained in {ERC1967Proxy-constructor}. */ constructor( address _logic, address admin_, bytes memory _data ) payable ERC1967Proxy(_logic, _data) { assert(_ADMIN_SLOT == bytes32(uint256(keccak256("eip1967.proxy.admin")) - 1)); _changeAdmin(admin_); } /** * @dev Modifier used internally that will delegate the call to the implementation unless the sender is the admin. */ modifier ifAdmin() { if (msg.sender == _getAdmin()) { _; } else { _fallback(); } } /** * @dev Returns the current admin. * * NOTE: Only the admin can call this function. See {ProxyAdmin-getProxyAdmin}. * * TIP: To get this value clients can read directly from the storage slot shown below (specified by EIP1967) using the * https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call. * `0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103` */ function admin() external ifAdmin returns (address admin_) { admin_ = _getAdmin(); } /** * @dev Returns the current implementation. * * NOTE: Only the admin can call this function. See {ProxyAdmin-getProxyImplementation}. * * TIP: To get this value clients can read directly from the storage slot shown below (specified by EIP1967) using the * https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call. * `0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc` */ function implementation() external ifAdmin returns (address implementation_) { implementation_ = _implementation(); } /** * @dev Changes the admin of the proxy. * * Emits an {AdminChanged} event. * * NOTE: Only the admin can call this function. See {ProxyAdmin-changeProxyAdmin}. */ function changeAdmin(address newAdmin) external virtual ifAdmin { _changeAdmin(newAdmin); } /** * @dev Upgrade the implementation of the proxy. * * NOTE: Only the admin can call this function. See {ProxyAdmin-upgrade}. */ function upgradeTo(address newImplementation) external ifAdmin { _upgradeToAndCall(newImplementation, bytes(""), false); } /** * @dev Upgrade the implementation of the proxy, and then call a function from the new implementation as specified * by `data`, which should be an encoded function call. This is useful to initialize new storage variables in the * proxied contract. * * NOTE: Only the admin can call this function. See {ProxyAdmin-upgradeAndCall}. */ function upgradeToAndCall(address newImplementation, bytes calldata data) external payable ifAdmin { _upgradeToAndCall(newImplementation, data, true); } /** * @dev Returns the current admin. */ function _admin() internal view virtual returns (address) { return _getAdmin(); } /** * @dev Makes sure the admin cannot access the fallback function. See {Proxy-_beforeFallback}. */ function _beforeFallback() internal virtual override { require(msg.sender != _getAdmin(), "TransparentUpgradeableProxy: admin cannot fallback to proxy target"); super._beforeFallback(); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"claimer","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ClaimFee","type":"event"},{"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":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"payer","type":"address"},{"indexed":false,"internalType":"uint256","name":"orderAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"fee","type":"uint256"}],"name":"SendToken","type":"event"},{"inputs":[{"internalType":"uint256","name":"_newEthFee","type":"uint256"}],"name":"changeEthFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"claimFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"ethFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_payees","type":"address[]"},{"internalType":"uint256[]","name":"_amounts","type":"uint256[]"}],"name":"sendEth","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address[]","name":"_payees","type":"address[]"},{"internalType":"uint256[]","name":"_amounts","type":"uint256[]"}],"name":"sendToken","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
608060405234801561001057600080fd5b50611766806100206000396000f3fe6080604052600436106100955760003560e01c80638da5cb5b116100595780638da5cb5b146101325780639af1d35a1461015d578063e3d9b5b614610188578063f2fde38b146101b1578063f667526a146101da5761009c565b80630a333a0f146100a157806325245b26146100bd5780634cf1115d146100d9578063715018a6146101045780638129fc1c1461011b5761009c565b3661009c57005b600080fd5b6100bb60048036038101906100b69190610f7e565b610203565b005b6100d760048036038101906100d29190611009565b6102e1565b005b3480156100e557600080fd5b506100ee6103cc565b6040516100fb9190611090565b60405180910390f35b34801561011057600080fd5b506101196103d2565b005b34801561012757600080fd5b5061013061045a565b005b34801561013e57600080fd5b5061014761054e565b60405161015491906110ba565b60405180910390f35b34801561016957600080fd5b50610172610578565b60405161017f9190611090565b60405180910390f35b34801561019457600080fd5b506101af60048036038101906101aa91906110d5565b61057e565b005b3480156101bd57600080fd5b506101d860048036038101906101d39190611102565b610604565b005b3480156101e657600080fd5b5061020160048036038101906101fc91906110d5565b6106fc565b005b60665434101561021257600080fd5b600061021d826107d8565b905060005b835181101561027e5761026b85338684815181106102435761024261112f565b5b602002602001015186858151811061025e5761025d61112f565b5b602002602001015161082e565b80806102769061118d565b915050610222565b50610287610986565b8373ffffffffffffffffffffffffffffffffffffffff167fcb7b3e63a19861e25f50c2f781b1f3e2803464af5094d9f34d76c14740d342f833836066546040516102d3939291906111d6565b60405180910390a250505050565b60006102ec826107d8565b905060006102fc826066546109a8565b90503481111561030b57600080fd5b60005b84518110156103685761035585828151811061032d5761032c61112f565b5b60200260200101518583815181106103485761034761112f565b5b6020026020010151610a06565b80806103609061118d565b91505061030e565b50610371610986565b600073ffffffffffffffffffffffffffffffffffffffff167fcb7b3e63a19861e25f50c2f781b1f3e2803464af5094d9f34d76c14740d342f833846066546040516103be939291906111d6565b60405180910390a250505050565b60665481565b6103da610b06565b73ffffffffffffffffffffffffffffffffffffffff166103f861054e565b73ffffffffffffffffffffffffffffffffffffffff161461044e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104459061126a565b60405180910390fd5b6104586000610b0e565b565b600060019054906101000a900460ff166104825760008054906101000a900460ff161561048b565b61048a610bd4565b5b6104ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104c1906112fc565b60405180910390fd5b60008060019054906101000a900460ff16159050801561051a576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b610522610be5565b61052a610c36565b801561054b5760008060016101000a81548160ff0219169083151502179055505b50565b6000603360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60655481565b610586610b06565b73ffffffffffffffffffffffffffffffffffffffff166105a461054e565b73ffffffffffffffffffffffffffffffffffffffff16146105fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105f19061126a565b60405180910390fd5b8060668190555050565b61060c610b06565b73ffffffffffffffffffffffffffffffffffffffff1661062a61054e565b73ffffffffffffffffffffffffffffffffffffffff1614610680576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106779061126a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156106f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106e79061138e565b60405180910390fd5b6106f981610b0e565b50565b610704610b06565b73ffffffffffffffffffffffffffffffffffffffff1661072261054e565b73ffffffffffffffffffffffffffffffffffffffff1614610778576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161076f9061126a565b60405180910390fd5b6000811161078557600080fd5b8047101561079257600080fd5b61079c3382610a06565b7ff40b9ca28516abde647ef8ed0e7b155e16347eb4d8dd6eb29989ed2c0c3d27e833826040516107cd9291906113ae565b60405180910390a150565b6000806000905060005b83518110156108245761080f828583815181106108025761080161112f565b5b60200260200101516109a8565b9150808061081c9061118d565b9150506107e2565b5080915050919050565b6000808573ffffffffffffffffffffffffffffffffffffffff166323b872dd60e01b868686604051602401610865939291906113d7565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516108cf9190611488565b6000604051808303816000865af19150503d806000811461090c576040519150601f19603f3d011682016040523d82523d6000602084013e610911565b606091505b509150915081801561093f575060008151148061093e57508080602001905181019061093d91906114d7565b5b5b61097e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161097590611550565b60405180910390fd5b505050505050565b600060665411156109a65761099f6065546066546109a8565b6065819055505b565b60008082846109b79190611570565b9050838110156109fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109f390611612565b60405180910390fd5b8091505092915050565b60008273ffffffffffffffffffffffffffffffffffffffff1682600067ffffffffffffffff811115610a3b57610a3a610d42565b5b6040519080825280601f01601f191660200182016040528015610a6d5781602001600182028036833780820191505090505b50604051610a7b9190611488565b60006040518083038185875af1925050503d8060008114610ab8576040519150601f19603f3d011682016040523d82523d6000602084013e610abd565b606091505b5050905080610b01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610af89061167e565b60405180910390fd5b505050565b600033905090565b6000603360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081603360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000610bdf30610c97565b15905090565b600060019054906101000a900460ff16610c34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2b90611710565b60405180910390fd5b565b600060019054906101000a900460ff16610c85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7c90611710565b60405180910390fd5b610c95610c90610b06565b610b0e565b565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610cf982610cce565b9050919050565b610d0981610cee565b8114610d1457600080fd5b50565b600081359050610d2681610d00565b92915050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b610d7a82610d31565b810181811067ffffffffffffffff82111715610d9957610d98610d42565b5b80604052505050565b6000610dac610cba565b9050610db88282610d71565b919050565b600067ffffffffffffffff821115610dd857610dd7610d42565b5b602082029050602081019050919050565b600080fd5b6000610e01610dfc84610dbd565b610da2565b90508083825260208201905060208402830185811115610e2457610e23610de9565b5b835b81811015610e4d5780610e398882610d17565b845260208401935050602081019050610e26565b5050509392505050565b600082601f830112610e6c57610e6b610d2c565b5b8135610e7c848260208601610dee565b91505092915050565b600067ffffffffffffffff821115610ea057610e9f610d42565b5b602082029050602081019050919050565b6000819050919050565b610ec481610eb1565b8114610ecf57600080fd5b50565b600081359050610ee181610ebb565b92915050565b6000610efa610ef584610e85565b610da2565b90508083825260208201905060208402830185811115610f1d57610f1c610de9565b5b835b81811015610f465780610f328882610ed2565b845260208401935050602081019050610f1f565b5050509392505050565b600082601f830112610f6557610f64610d2c565b5b8135610f75848260208601610ee7565b91505092915050565b600080600060608486031215610f9757610f96610cc4565b5b6000610fa586828701610d17565b935050602084013567ffffffffffffffff811115610fc657610fc5610cc9565b5b610fd286828701610e57565b925050604084013567ffffffffffffffff811115610ff357610ff2610cc9565b5b610fff86828701610f50565b9150509250925092565b600080604083850312156110205761101f610cc4565b5b600083013567ffffffffffffffff81111561103e5761103d610cc9565b5b61104a85828601610e57565b925050602083013567ffffffffffffffff81111561106b5761106a610cc9565b5b61107785828601610f50565b9150509250929050565b61108a81610eb1565b82525050565b60006020820190506110a56000830184611081565b92915050565b6110b481610cee565b82525050565b60006020820190506110cf60008301846110ab565b92915050565b6000602082840312156110eb576110ea610cc4565b5b60006110f984828501610ed2565b91505092915050565b60006020828403121561111857611117610cc4565b5b600061112684828501610d17565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061119882610eb1565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156111cb576111ca61115e565b5b600182019050919050565b60006060820190506111eb60008301866110ab565b6111f86020830185611081565b6112056040830184611081565b949350505050565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061125460208361120d565b915061125f8261121e565b602082019050919050565b6000602082019050818103600083015261128381611247565b9050919050565b7f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160008201527f647920696e697469616c697a6564000000000000000000000000000000000000602082015250565b60006112e6602e8361120d565b91506112f18261128a565b604082019050919050565b60006020820190508181036000830152611315816112d9565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061137860268361120d565b91506113838261131c565b604082019050919050565b600060208201905081810360008301526113a78161136b565b9050919050565b60006040820190506113c360008301856110ab565b6113d06020830184611081565b9392505050565b60006060820190506113ec60008301866110ab565b6113f960208301856110ab565b6114066040830184611081565b949350505050565b600081519050919050565b600081905092915050565b60005b83811015611442578082015181840152602081019050611427565b83811115611451576000848401525b50505050565b60006114628261140e565b61146c8185611419565b935061147c818560208601611424565b80840191505092915050565b60006114948284611457565b915081905092915050565b60008115159050919050565b6114b48161149f565b81146114bf57600080fd5b50565b6000815190506114d1816114ab565b92915050565b6000602082840312156114ed576114ec610cc4565b5b60006114fb848285016114c2565b91505092915050565b7f5354460000000000000000000000000000000000000000000000000000000000600082015250565b600061153a60038361120d565b915061154582611504565b602082019050919050565b600060208201905081810360008301526115698161152d565b9050919050565b600061157b82610eb1565b915061158683610eb1565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156115bb576115ba61115e565b5b828201905092915050565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000600082015250565b60006115fc601b8361120d565b9150611607826115c6565b602082019050919050565b6000602082019050818103600083015261162b816115ef565b9050919050565b7f5354450000000000000000000000000000000000000000000000000000000000600082015250565b600061166860038361120d565b915061167382611632565b602082019050919050565b600060208201905081810360008301526116978161165b565b9050919050565b7f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960008201527f6e697469616c697a696e67000000000000000000000000000000000000000000602082015250565b60006116fa602b8361120d565b91506117058261169e565b604082019050919050565b60006020820190508181036000830152611729816116ed565b905091905056fea2646970667358221220f4753831d4efbaea8a2b6548f36e11f7d1e2df4c3e60f6ab65dfd7065fb71aee64736f6c634300080b0033
Deployed Bytecode
0x6080604052600436106100955760003560e01c80638da5cb5b116100595780638da5cb5b146101325780639af1d35a1461015d578063e3d9b5b614610188578063f2fde38b146101b1578063f667526a146101da5761009c565b80630a333a0f146100a157806325245b26146100bd5780634cf1115d146100d9578063715018a6146101045780638129fc1c1461011b5761009c565b3661009c57005b600080fd5b6100bb60048036038101906100b69190610f7e565b610203565b005b6100d760048036038101906100d29190611009565b6102e1565b005b3480156100e557600080fd5b506100ee6103cc565b6040516100fb9190611090565b60405180910390f35b34801561011057600080fd5b506101196103d2565b005b34801561012757600080fd5b5061013061045a565b005b34801561013e57600080fd5b5061014761054e565b60405161015491906110ba565b60405180910390f35b34801561016957600080fd5b50610172610578565b60405161017f9190611090565b60405180910390f35b34801561019457600080fd5b506101af60048036038101906101aa91906110d5565b61057e565b005b3480156101bd57600080fd5b506101d860048036038101906101d39190611102565b610604565b005b3480156101e657600080fd5b5061020160048036038101906101fc91906110d5565b6106fc565b005b60665434101561021257600080fd5b600061021d826107d8565b905060005b835181101561027e5761026b85338684815181106102435761024261112f565b5b602002602001015186858151811061025e5761025d61112f565b5b602002602001015161082e565b80806102769061118d565b915050610222565b50610287610986565b8373ffffffffffffffffffffffffffffffffffffffff167fcb7b3e63a19861e25f50c2f781b1f3e2803464af5094d9f34d76c14740d342f833836066546040516102d3939291906111d6565b60405180910390a250505050565b60006102ec826107d8565b905060006102fc826066546109a8565b90503481111561030b57600080fd5b60005b84518110156103685761035585828151811061032d5761032c61112f565b5b60200260200101518583815181106103485761034761112f565b5b6020026020010151610a06565b80806103609061118d565b91505061030e565b50610371610986565b600073ffffffffffffffffffffffffffffffffffffffff167fcb7b3e63a19861e25f50c2f781b1f3e2803464af5094d9f34d76c14740d342f833846066546040516103be939291906111d6565b60405180910390a250505050565b60665481565b6103da610b06565b73ffffffffffffffffffffffffffffffffffffffff166103f861054e565b73ffffffffffffffffffffffffffffffffffffffff161461044e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104459061126a565b60405180910390fd5b6104586000610b0e565b565b600060019054906101000a900460ff166104825760008054906101000a900460ff161561048b565b61048a610bd4565b5b6104ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104c1906112fc565b60405180910390fd5b60008060019054906101000a900460ff16159050801561051a576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b610522610be5565b61052a610c36565b801561054b5760008060016101000a81548160ff0219169083151502179055505b50565b6000603360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60655481565b610586610b06565b73ffffffffffffffffffffffffffffffffffffffff166105a461054e565b73ffffffffffffffffffffffffffffffffffffffff16146105fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105f19061126a565b60405180910390fd5b8060668190555050565b61060c610b06565b73ffffffffffffffffffffffffffffffffffffffff1661062a61054e565b73ffffffffffffffffffffffffffffffffffffffff1614610680576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106779061126a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156106f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106e79061138e565b60405180910390fd5b6106f981610b0e565b50565b610704610b06565b73ffffffffffffffffffffffffffffffffffffffff1661072261054e565b73ffffffffffffffffffffffffffffffffffffffff1614610778576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161076f9061126a565b60405180910390fd5b6000811161078557600080fd5b8047101561079257600080fd5b61079c3382610a06565b7ff40b9ca28516abde647ef8ed0e7b155e16347eb4d8dd6eb29989ed2c0c3d27e833826040516107cd9291906113ae565b60405180910390a150565b6000806000905060005b83518110156108245761080f828583815181106108025761080161112f565b5b60200260200101516109a8565b9150808061081c9061118d565b9150506107e2565b5080915050919050565b6000808573ffffffffffffffffffffffffffffffffffffffff166323b872dd60e01b868686604051602401610865939291906113d7565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516108cf9190611488565b6000604051808303816000865af19150503d806000811461090c576040519150601f19603f3d011682016040523d82523d6000602084013e610911565b606091505b509150915081801561093f575060008151148061093e57508080602001905181019061093d91906114d7565b5b5b61097e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161097590611550565b60405180910390fd5b505050505050565b600060665411156109a65761099f6065546066546109a8565b6065819055505b565b60008082846109b79190611570565b9050838110156109fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109f390611612565b60405180910390fd5b8091505092915050565b60008273ffffffffffffffffffffffffffffffffffffffff1682600067ffffffffffffffff811115610a3b57610a3a610d42565b5b6040519080825280601f01601f191660200182016040528015610a6d5781602001600182028036833780820191505090505b50604051610a7b9190611488565b60006040518083038185875af1925050503d8060008114610ab8576040519150601f19603f3d011682016040523d82523d6000602084013e610abd565b606091505b5050905080610b01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610af89061167e565b60405180910390fd5b505050565b600033905090565b6000603360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081603360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000610bdf30610c97565b15905090565b600060019054906101000a900460ff16610c34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2b90611710565b60405180910390fd5b565b600060019054906101000a900460ff16610c85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7c90611710565b60405180910390fd5b610c95610c90610b06565b610b0e565b565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610cf982610cce565b9050919050565b610d0981610cee565b8114610d1457600080fd5b50565b600081359050610d2681610d00565b92915050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b610d7a82610d31565b810181811067ffffffffffffffff82111715610d9957610d98610d42565b5b80604052505050565b6000610dac610cba565b9050610db88282610d71565b919050565b600067ffffffffffffffff821115610dd857610dd7610d42565b5b602082029050602081019050919050565b600080fd5b6000610e01610dfc84610dbd565b610da2565b90508083825260208201905060208402830185811115610e2457610e23610de9565b5b835b81811015610e4d5780610e398882610d17565b845260208401935050602081019050610e26565b5050509392505050565b600082601f830112610e6c57610e6b610d2c565b5b8135610e7c848260208601610dee565b91505092915050565b600067ffffffffffffffff821115610ea057610e9f610d42565b5b602082029050602081019050919050565b6000819050919050565b610ec481610eb1565b8114610ecf57600080fd5b50565b600081359050610ee181610ebb565b92915050565b6000610efa610ef584610e85565b610da2565b90508083825260208201905060208402830185811115610f1d57610f1c610de9565b5b835b81811015610f465780610f328882610ed2565b845260208401935050602081019050610f1f565b5050509392505050565b600082601f830112610f6557610f64610d2c565b5b8135610f75848260208601610ee7565b91505092915050565b600080600060608486031215610f9757610f96610cc4565b5b6000610fa586828701610d17565b935050602084013567ffffffffffffffff811115610fc657610fc5610cc9565b5b610fd286828701610e57565b925050604084013567ffffffffffffffff811115610ff357610ff2610cc9565b5b610fff86828701610f50565b9150509250925092565b600080604083850312156110205761101f610cc4565b5b600083013567ffffffffffffffff81111561103e5761103d610cc9565b5b61104a85828601610e57565b925050602083013567ffffffffffffffff81111561106b5761106a610cc9565b5b61107785828601610f50565b9150509250929050565b61108a81610eb1565b82525050565b60006020820190506110a56000830184611081565b92915050565b6110b481610cee565b82525050565b60006020820190506110cf60008301846110ab565b92915050565b6000602082840312156110eb576110ea610cc4565b5b60006110f984828501610ed2565b91505092915050565b60006020828403121561111857611117610cc4565b5b600061112684828501610d17565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061119882610eb1565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156111cb576111ca61115e565b5b600182019050919050565b60006060820190506111eb60008301866110ab565b6111f86020830185611081565b6112056040830184611081565b949350505050565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061125460208361120d565b915061125f8261121e565b602082019050919050565b6000602082019050818103600083015261128381611247565b9050919050565b7f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160008201527f647920696e697469616c697a6564000000000000000000000000000000000000602082015250565b60006112e6602e8361120d565b91506112f18261128a565b604082019050919050565b60006020820190508181036000830152611315816112d9565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061137860268361120d565b91506113838261131c565b604082019050919050565b600060208201905081810360008301526113a78161136b565b9050919050565b60006040820190506113c360008301856110ab565b6113d06020830184611081565b9392505050565b60006060820190506113ec60008301866110ab565b6113f960208301856110ab565b6114066040830184611081565b949350505050565b600081519050919050565b600081905092915050565b60005b83811015611442578082015181840152602081019050611427565b83811115611451576000848401525b50505050565b60006114628261140e565b61146c8185611419565b935061147c818560208601611424565b80840191505092915050565b60006114948284611457565b915081905092915050565b60008115159050919050565b6114b48161149f565b81146114bf57600080fd5b50565b6000815190506114d1816114ab565b92915050565b6000602082840312156114ed576114ec610cc4565b5b60006114fb848285016114c2565b91505092915050565b7f5354460000000000000000000000000000000000000000000000000000000000600082015250565b600061153a60038361120d565b915061154582611504565b602082019050919050565b600060208201905081810360008301526115698161152d565b9050919050565b600061157b82610eb1565b915061158683610eb1565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156115bb576115ba61115e565b5b828201905092915050565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000600082015250565b60006115fc601b8361120d565b9150611607826115c6565b602082019050919050565b6000602082019050818103600083015261162b816115ef565b9050919050565b7f5354450000000000000000000000000000000000000000000000000000000000600082015250565b600061166860038361120d565b915061167382611632565b602082019050919050565b600060208201905081810360008301526116978161165b565b9050919050565b7f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960008201527f6e697469616c697a696e67000000000000000000000000000000000000000000602082015250565b60006116fa602b8361120d565b91506117058261169e565b604082019050919050565b60006020820190508181036000830152611729816116ed565b905091905056fea2646970667358221220f4753831d4efbaea8a2b6548f36e11f7d1e2df4c3e60f6ab65dfd7065fb71aee64736f6c634300080b0033
Deployed Bytecode Sourcemap
212:2300:9:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;658:497;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1163:528;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;304:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1889:103:12;;;;;;;;;;;;;:::i;:::-;;527:121:9;;;;;;;;;;;;;:::i;:::-;;1238:87:12;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;276:19:9;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2139:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2147:201:12;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2245:262:9;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;658:497;797:6;;784:9;:19;;776:28;;;;;;817:19;839:32;862:8;839:22;:32::i;:::-;817:54;;888:13;884:165;913:7;:14;905:5;:22;884:165;;;953:84;985:6;993:10;1005:7;1013:5;1005:14;;;;;;;;:::i;:::-;;;;;;;;1021:8;1030:5;1021:15;;;;;;;;:::i;:::-;;;;;;;;953:31;:84::i;:::-;929:7;;;;;:::i;:::-;;;;884:165;;;;1061:16;:14;:16::i;:::-;1105:6;1095:50;;;1113:10;1125:11;1138:6;;1095:50;;;;;;;;:::i;:::-;;;;;;;;763:392;658:497;;;:::o;1163:528::-;1262:19;1284:32;1307:8;1284:22;:32::i;:::-;1262:54;;1329:16;1348:33;1361:11;1374:6;;1348:12;:33::i;:::-;1329:52;;1414:9;1402:8;:21;;1394:30;;;;;;1441:13;1437:144;1466:7;:14;1458:5;:22;1437:144;;;1506:63;1537:7;1545:5;1537:14;;;;;;;;:::i;:::-;;;;;;;;1553:8;1562:5;1553:15;;;;;;;;:::i;:::-;;;;;;;;1506:30;:63::i;:::-;1482:7;;;;;:::i;:::-;;;;1437:144;;;;1593:16;:14;:16::i;:::-;1645:1;1627:54;;;1649:10;1661:11;1674:6;;1627:54;;;;;;;;:::i;:::-;;;;;;;;1249:442;;1163:528;;:::o;304:21::-;;;;:::o;1889:103:12:-;1469:12;:10;:12::i;:::-;1458:23;;:7;:5;:7::i;:::-;:23;;;1450:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1954:30:::1;1981:1;1954:18;:30::i;:::-;1889:103::o:0;527:121:9:-;803:13:8;;;;;;;;;;;:48;;839:12;;;;;;;;;;838:13;803:48;;;819:16;:14;:16::i;:::-;803:48;795:107;;;;;;;;;;;;:::i;:::-;;;;;;;;;915:19;938:13;;;;;;;;;;;937:14;915:36;;966:14;962:101;;;1013:4;997:13;;:20;;;;;;;;;;;;;;;;;;1047:4;1032:12;;:19;;;;;;;;;;;;;;;;;;962:101;577:26:9::1;:24;:26::i;:::-;614;:24;:26::i;:::-;1093:14:8::0;1089:68;;;1140:5;1124:13;;:21;;;;;;;;;;;;;;;;;;1089:68;510:654;527:121:9:o;1238:87:12:-;1284:7;1311:6;;;;;;;;;;;1304:13;;1238:87;:::o;276:19:9:-;;;;:::o;2139:98::-;1469:12:12;:10;:12::i;:::-;1458:23;;:7;:5;:7::i;:::-;:23;;;1450:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2219:10:9::1;2210:6;:19;;;;2139:98:::0;:::o;2147:201:12:-;1469:12;:10;:12::i;:::-;1458:23;;:7;:5;:7::i;:::-;:23;;;1450:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2256:1:::1;2236:22;;:8;:22;;;;2228:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2312:28;2331:8;2312:18;:28::i;:::-;2147:201:::0;:::o;2245:262:9:-;1469:12:12;:10;:12::i;:::-;1458:23;;:7;:5;:7::i;:::-;:23;;;1450:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2330:1:9::1;2320:7;:11;2312:20;;;::::0;::::1;;2378:7;2353:21;:32;;2345:41;;;::::0;::::1;;2399:51;2430:10;2442:7;2399:30;:51::i;:::-;2468:29;2477:10;2489:7;2468:29;;;;;;;:::i;:::-;;;;;;;;2245:262:::0;:::o;1835:296::-;1915:7;1935:16;1954:1;1935:20;;1970:13;1966:132;1995:8;:15;1987:5;:23;1966:132;;;2047:39;2060:8;2070;2079:5;2070:15;;;;;;;;:::i;:::-;;;;;;;;2047:12;:39::i;:::-;2036:50;;2012:7;;;;;:::i;:::-;;;;1966:132;;;;2115:8;2108:15;;;1835:296;;;:::o;538:363:17:-;684:12;698:17;728:5;:10;;762:28;;;792:4;798:2;802:5;739:69;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;728:81;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;683:126;;;;828:7;:57;;;;;855:1;840:4;:11;:16;:44;;;;871:4;860:24;;;;;;;;;;;;:::i;:::-;840:44;828:57;820:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;672:229;;538:363;;;;:::o;1699:128:9:-;1757:1;1748:6;;:10;1744:76;;;1782:26;1795:4;;1801:6;;1782:12;:26::i;:::-;1775:4;:33;;;;1744:76;1699:128::o;2764:179:15:-;2822:7;2842:9;2858:1;2854;:5;;;;:::i;:::-;2842:17;;2883:1;2878;:6;;2870:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;2934:1;2927:8;;;2764:179;;;;:::o;2386:168:17:-;2459:12;2477:2;:7;;2492:5;2509:1;2499:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2477:35;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2458:54;;;2531:7;2523:23;;;;;;;;;;;;:::i;:::-;;;;;;;;;2447:107;2386:168;;:::o;859:98:3:-;912:7;939:10;932:17;;859:98;:::o;2508:191:12:-;2582:16;2601:6;;;;;;;;;;;2582:25;;2627:8;2618:6;;:17;;;;;;;;;;;;;;;;;;2682:8;2651:40;;2672:8;2651:40;;;;;;;;;;;;2571:128;2508:191;:::o;1495:125:8:-;1543:4;1568:44;1606:4;1568:29;:44::i;:::-;1567:45;1560:52;;1495:125;:::o;783:70:3:-;1406:13:8;;;;;;;;;;;1398:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;783:70:3:o;1044:113:12:-;1406:13:8;;;;;;;;;;;1398:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;1117:32:12::1;1136:12;:10;:12::i;:::-;1117:18;:32::i;:::-;1044:113::o:0;1150:326:1:-;1210:4;1467:1;1445:7;:19;;;:23;1438:30;;1150:326;;;:::o;7:75:20:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:126;371:7;411:42;404:5;400:54;389:65;;334:126;;;:::o;466:96::-;503:7;532:24;550:5;532:24;:::i;:::-;521:35;;466:96;;;:::o;568:122::-;641:24;659:5;641:24;:::i;:::-;634:5;631:35;621:63;;680:1;677;670:12;621:63;568:122;:::o;696:139::-;742:5;780:6;767:20;758:29;;796:33;823:5;796:33;:::i;:::-;696:139;;;;:::o;841:117::-;950:1;947;940:12;964:102;1005:6;1056:2;1052:7;1047:2;1040:5;1036:14;1032:28;1022:38;;964:102;;;:::o;1072:180::-;1120:77;1117:1;1110:88;1217:4;1214:1;1207:15;1241:4;1238:1;1231:15;1258:281;1341:27;1363:4;1341:27;:::i;:::-;1333:6;1329:40;1471:6;1459:10;1456:22;1435:18;1423:10;1420:34;1417:62;1414:88;;;1482:18;;:::i;:::-;1414:88;1522:10;1518:2;1511:22;1301:238;1258:281;;:::o;1545:129::-;1579:6;1606:20;;:::i;:::-;1596:30;;1635:33;1663:4;1655:6;1635:33;:::i;:::-;1545:129;;;:::o;1680:311::-;1757:4;1847:18;1839:6;1836:30;1833:56;;;1869:18;;:::i;:::-;1833:56;1919:4;1911:6;1907:17;1899:25;;1979:4;1973;1969:15;1961:23;;1680:311;;;:::o;1997:117::-;2106:1;2103;2096:12;2137:710;2233:5;2258:81;2274:64;2331:6;2274:64;:::i;:::-;2258:81;:::i;:::-;2249:90;;2359:5;2388:6;2381:5;2374:21;2422:4;2415:5;2411:16;2404:23;;2475:4;2467:6;2463:17;2455:6;2451:30;2504:3;2496:6;2493:15;2490:122;;;2523:79;;:::i;:::-;2490:122;2638:6;2621:220;2655:6;2650:3;2647:15;2621:220;;;2730:3;2759:37;2792:3;2780:10;2759:37;:::i;:::-;2754:3;2747:50;2826:4;2821:3;2817:14;2810:21;;2697:144;2681:4;2676:3;2672:14;2665:21;;2621:220;;;2625:21;2239:608;;2137:710;;;;;:::o;2870:370::-;2941:5;2990:3;2983:4;2975:6;2971:17;2967:27;2957:122;;2998:79;;:::i;:::-;2957:122;3115:6;3102:20;3140:94;3230:3;3222:6;3215:4;3207:6;3203:17;3140:94;:::i;:::-;3131:103;;2947:293;2870:370;;;;:::o;3246:311::-;3323:4;3413:18;3405:6;3402:30;3399:56;;;3435:18;;:::i;:::-;3399:56;3485:4;3477:6;3473:17;3465:25;;3545:4;3539;3535:15;3527:23;;3246:311;;;:::o;3563:77::-;3600:7;3629:5;3618:16;;3563:77;;;:::o;3646:122::-;3719:24;3737:5;3719:24;:::i;:::-;3712:5;3709:35;3699:63;;3758:1;3755;3748:12;3699:63;3646:122;:::o;3774:139::-;3820:5;3858:6;3845:20;3836:29;;3874:33;3901:5;3874:33;:::i;:::-;3774:139;;;;:::o;3936:710::-;4032:5;4057:81;4073:64;4130:6;4073:64;:::i;:::-;4057:81;:::i;:::-;4048:90;;4158:5;4187:6;4180:5;4173:21;4221:4;4214:5;4210:16;4203:23;;4274:4;4266:6;4262:17;4254:6;4250:30;4303:3;4295:6;4292:15;4289:122;;;4322:79;;:::i;:::-;4289:122;4437:6;4420:220;4454:6;4449:3;4446:15;4420:220;;;4529:3;4558:37;4591:3;4579:10;4558:37;:::i;:::-;4553:3;4546:50;4625:4;4620:3;4616:14;4609:21;;4496:144;4480:4;4475:3;4471:14;4464:21;;4420:220;;;4424:21;4038:608;;3936:710;;;;;:::o;4669:370::-;4740:5;4789:3;4782:4;4774:6;4770:17;4766:27;4756:122;;4797:79;;:::i;:::-;4756:122;4914:6;4901:20;4939:94;5029:3;5021:6;5014:4;5006:6;5002:17;4939:94;:::i;:::-;4930:103;;4746:293;4669:370;;;;:::o;5045:1039::-;5172:6;5180;5188;5237:2;5225:9;5216:7;5212:23;5208:32;5205:119;;;5243:79;;:::i;:::-;5205:119;5363:1;5388:53;5433:7;5424:6;5413:9;5409:22;5388:53;:::i;:::-;5378:63;;5334:117;5518:2;5507:9;5503:18;5490:32;5549:18;5541:6;5538:30;5535:117;;;5571:79;;:::i;:::-;5535:117;5676:78;5746:7;5737:6;5726:9;5722:22;5676:78;:::i;:::-;5666:88;;5461:303;5831:2;5820:9;5816:18;5803:32;5862:18;5854:6;5851:30;5848:117;;;5884:79;;:::i;:::-;5848:117;5989:78;6059:7;6050:6;6039:9;6035:22;5989:78;:::i;:::-;5979:88;;5774:303;5045:1039;;;;;:::o;6090:894::-;6208:6;6216;6265:2;6253:9;6244:7;6240:23;6236:32;6233:119;;;6271:79;;:::i;:::-;6233:119;6419:1;6408:9;6404:17;6391:31;6449:18;6441:6;6438:30;6435:117;;;6471:79;;:::i;:::-;6435:117;6576:78;6646:7;6637:6;6626:9;6622:22;6576:78;:::i;:::-;6566:88;;6362:302;6731:2;6720:9;6716:18;6703:32;6762:18;6754:6;6751:30;6748:117;;;6784:79;;:::i;:::-;6748:117;6889:78;6959:7;6950:6;6939:9;6935:22;6889:78;:::i;:::-;6879:88;;6674:303;6090:894;;;;;:::o;6990:118::-;7077:24;7095:5;7077:24;:::i;:::-;7072:3;7065:37;6990:118;;:::o;7114:222::-;7207:4;7245:2;7234:9;7230:18;7222:26;;7258:71;7326:1;7315:9;7311:17;7302:6;7258:71;:::i;:::-;7114:222;;;;:::o;7342:118::-;7429:24;7447:5;7429:24;:::i;:::-;7424:3;7417:37;7342:118;;:::o;7466:222::-;7559:4;7597:2;7586:9;7582:18;7574:26;;7610:71;7678:1;7667:9;7663:17;7654:6;7610:71;:::i;:::-;7466:222;;;;:::o;7694:329::-;7753:6;7802:2;7790:9;7781:7;7777:23;7773:32;7770:119;;;7808:79;;:::i;:::-;7770:119;7928:1;7953:53;7998:7;7989:6;7978:9;7974:22;7953:53;:::i;:::-;7943:63;;7899:117;7694:329;;;;:::o;8029:::-;8088:6;8137:2;8125:9;8116:7;8112:23;8108:32;8105:119;;;8143:79;;:::i;:::-;8105:119;8263:1;8288:53;8333:7;8324:6;8313:9;8309:22;8288:53;:::i;:::-;8278:63;;8234:117;8029:329;;;;:::o;8364:180::-;8412:77;8409:1;8402:88;8509:4;8506:1;8499:15;8533:4;8530:1;8523:15;8550:180;8598:77;8595:1;8588:88;8695:4;8692:1;8685:15;8719:4;8716:1;8709:15;8736:233;8775:3;8798:24;8816:5;8798:24;:::i;:::-;8789:33;;8844:66;8837:5;8834:77;8831:103;;;8914:18;;:::i;:::-;8831:103;8961:1;8954:5;8950:13;8943:20;;8736:233;;;:::o;8975:442::-;9124:4;9162:2;9151:9;9147:18;9139:26;;9175:71;9243:1;9232:9;9228:17;9219:6;9175:71;:::i;:::-;9256:72;9324:2;9313:9;9309:18;9300:6;9256:72;:::i;:::-;9338;9406:2;9395:9;9391:18;9382:6;9338:72;:::i;:::-;8975:442;;;;;;:::o;9423:169::-;9507:11;9541:6;9536:3;9529:19;9581:4;9576:3;9572:14;9557:29;;9423:169;;;;:::o;9598:182::-;9738:34;9734:1;9726:6;9722:14;9715:58;9598:182;:::o;9786:366::-;9928:3;9949:67;10013:2;10008:3;9949:67;:::i;:::-;9942:74;;10025:93;10114:3;10025:93;:::i;:::-;10143:2;10138:3;10134:12;10127:19;;9786:366;;;:::o;10158:419::-;10324:4;10362:2;10351:9;10347:18;10339:26;;10411:9;10405:4;10401:20;10397:1;10386:9;10382:17;10375:47;10439:131;10565:4;10439:131;:::i;:::-;10431:139;;10158:419;;;:::o;10583:233::-;10723:34;10719:1;10711:6;10707:14;10700:58;10792:16;10787:2;10779:6;10775:15;10768:41;10583:233;:::o;10822:366::-;10964:3;10985:67;11049:2;11044:3;10985:67;:::i;:::-;10978:74;;11061:93;11150:3;11061:93;:::i;:::-;11179:2;11174:3;11170:12;11163:19;;10822:366;;;:::o;11194:419::-;11360:4;11398:2;11387:9;11383:18;11375:26;;11447:9;11441:4;11437:20;11433:1;11422:9;11418:17;11411:47;11475:131;11601:4;11475:131;:::i;:::-;11467:139;;11194:419;;;:::o;11619:225::-;11759:34;11755:1;11747:6;11743:14;11736:58;11828:8;11823:2;11815:6;11811:15;11804:33;11619:225;:::o;11850:366::-;11992:3;12013:67;12077:2;12072:3;12013:67;:::i;:::-;12006:74;;12089:93;12178:3;12089:93;:::i;:::-;12207:2;12202:3;12198:12;12191:19;;11850:366;;;:::o;12222:419::-;12388:4;12426:2;12415:9;12411:18;12403:26;;12475:9;12469:4;12465:20;12461:1;12450:9;12446:17;12439:47;12503:131;12629:4;12503:131;:::i;:::-;12495:139;;12222:419;;;:::o;12647:332::-;12768:4;12806:2;12795:9;12791:18;12783:26;;12819:71;12887:1;12876:9;12872:17;12863:6;12819:71;:::i;:::-;12900:72;12968:2;12957:9;12953:18;12944:6;12900:72;:::i;:::-;12647:332;;;;;:::o;12985:442::-;13134:4;13172:2;13161:9;13157:18;13149:26;;13185:71;13253:1;13242:9;13238:17;13229:6;13185:71;:::i;:::-;13266:72;13334:2;13323:9;13319:18;13310:6;13266:72;:::i;:::-;13348;13416:2;13405:9;13401:18;13392:6;13348:72;:::i;:::-;12985:442;;;;;;:::o;13433:98::-;13484:6;13518:5;13512:12;13502:22;;13433:98;;;:::o;13537:147::-;13638:11;13675:3;13660:18;;13537:147;;;;:::o;13690:307::-;13758:1;13768:113;13782:6;13779:1;13776:13;13768:113;;;13867:1;13862:3;13858:11;13852:18;13848:1;13843:3;13839:11;13832:39;13804:2;13801:1;13797:10;13792:15;;13768:113;;;13899:6;13896:1;13893:13;13890:101;;;13979:1;13970:6;13965:3;13961:16;13954:27;13890:101;13739:258;13690:307;;;:::o;14003:373::-;14107:3;14135:38;14167:5;14135:38;:::i;:::-;14189:88;14270:6;14265:3;14189:88;:::i;:::-;14182:95;;14286:52;14331:6;14326:3;14319:4;14312:5;14308:16;14286:52;:::i;:::-;14363:6;14358:3;14354:16;14347:23;;14111:265;14003:373;;;;:::o;14382:271::-;14512:3;14534:93;14623:3;14614:6;14534:93;:::i;:::-;14527:100;;14644:3;14637:10;;14382:271;;;;:::o;14659:90::-;14693:7;14736:5;14729:13;14722:21;14711:32;;14659:90;;;:::o;14755:116::-;14825:21;14840:5;14825:21;:::i;:::-;14818:5;14815:32;14805:60;;14861:1;14858;14851:12;14805:60;14755:116;:::o;14877:137::-;14931:5;14962:6;14956:13;14947:22;;14978:30;15002:5;14978:30;:::i;:::-;14877:137;;;;:::o;15020:345::-;15087:6;15136:2;15124:9;15115:7;15111:23;15107:32;15104:119;;;15142:79;;:::i;:::-;15104:119;15262:1;15287:61;15340:7;15331:6;15320:9;15316:22;15287:61;:::i;:::-;15277:71;;15233:125;15020:345;;;;:::o;15371:153::-;15511:5;15507:1;15499:6;15495:14;15488:29;15371:153;:::o;15530:365::-;15672:3;15693:66;15757:1;15752:3;15693:66;:::i;:::-;15686:73;;15768:93;15857:3;15768:93;:::i;:::-;15886:2;15881:3;15877:12;15870:19;;15530:365;;;:::o;15901:419::-;16067:4;16105:2;16094:9;16090:18;16082:26;;16154:9;16148:4;16144:20;16140:1;16129:9;16125:17;16118:47;16182:131;16308:4;16182:131;:::i;:::-;16174:139;;15901:419;;;:::o;16326:305::-;16366:3;16385:20;16403:1;16385:20;:::i;:::-;16380:25;;16419:20;16437:1;16419:20;:::i;:::-;16414:25;;16573:1;16505:66;16501:74;16498:1;16495:81;16492:107;;;16579:18;;:::i;:::-;16492:107;16623:1;16620;16616:9;16609:16;;16326:305;;;;:::o;16637:177::-;16777:29;16773:1;16765:6;16761:14;16754:53;16637:177;:::o;16820:366::-;16962:3;16983:67;17047:2;17042:3;16983:67;:::i;:::-;16976:74;;17059:93;17148:3;17059:93;:::i;:::-;17177:2;17172:3;17168:12;17161:19;;16820:366;;;:::o;17192:419::-;17358:4;17396:2;17385:9;17381:18;17373:26;;17445:9;17439:4;17435:20;17431:1;17420:9;17416:17;17409:47;17473:131;17599:4;17473:131;:::i;:::-;17465:139;;17192:419;;;:::o;17617:153::-;17757:5;17753:1;17745:6;17741:14;17734:29;17617:153;:::o;17776:365::-;17918:3;17939:66;18003:1;17998:3;17939:66;:::i;:::-;17932:73;;18014:93;18103:3;18014:93;:::i;:::-;18132:2;18127:3;18123:12;18116:19;;17776:365;;;:::o;18147:419::-;18313:4;18351:2;18340:9;18336:18;18328:26;;18400:9;18394:4;18390:20;18386:1;18375:9;18371:17;18364:47;18428:131;18554:4;18428:131;:::i;:::-;18420:139;;18147:419;;;:::o;18572:230::-;18712:34;18708:1;18700:6;18696:14;18689:58;18781:13;18776:2;18768:6;18764:15;18757:38;18572:230;:::o;18808:366::-;18950:3;18971:67;19035:2;19030:3;18971:67;:::i;:::-;18964:74;;19047:93;19136:3;19047:93;:::i;:::-;19165:2;19160:3;19156:12;19149:19;;18808:366;;;:::o;19180:419::-;19346:4;19384:2;19373:9;19369:18;19361:26;;19433:9;19427:4;19423:20;19419:1;19408:9;19404:17;19397:47;19461:131;19587:4;19461:131;:::i;:::-;19453:139;;19180:419;;;:::o
Swarm Source
ipfs://f4753831d4efbaea8a2b6548f36e11f7d1e2df4c3e60f6ab65dfd7065fb71aee
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 35 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
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.