Overview
ETH Balance
ETH Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 28 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Transfer Token | 1085509 | 5 days ago | IN | 0 ETH | 0.00000145 | ||||
Transfer Eth | 1051203 | 16 days ago | IN | 0.58 ETH | 0.00000068 | ||||
Transfer Token | 1033780 | 21 days ago | IN | 0 ETH | 0.00000118 | ||||
Transfer Eth | 1011946 | 28 days ago | IN | 0.0029958 ETH | 0.00000069 | ||||
Transfer Token | 1007603 | 29 days ago | IN | 0 ETH | 0.00000151 | ||||
Transfer Eth | 995782 | 34 days ago | IN | 0.932 ETH | 0.00000067 | ||||
Transfer Token | 990207 | 36 days ago | IN | 0 ETH | 0.00000105 | ||||
Transfer Token | 970185 | 40 days ago | IN | 0 ETH | 0.00000121 | ||||
Transfer Eth | 957270 | 43 days ago | IN | 0.008 ETH | 0.00000072 | ||||
Transfer Eth | 957116 | 43 days ago | IN | 0.0453 ETH | 0.00000138 | ||||
Transfer Eth | 956775 | 43 days ago | IN | 0.01 ETH | 0.00000112 | ||||
Transfer Eth | 956345 | 43 days ago | IN | 0.02 ETH | 0.00000309 | ||||
Transfer Eth | 939618 | 47 days ago | IN | 0.00098 ETH | 0.00000066 | ||||
Transfer Token | 922192 | 51 days ago | IN | 0 ETH | 0.00000098 | ||||
Transfer Token | 922172 | 51 days ago | IN | 0 ETH | 0.00000129 | ||||
Transfer Token | 921153 | 51 days ago | IN | 0 ETH | 0.00000145 | ||||
Transfer Token | 899543 | 57 days ago | IN | 0 ETH | 0.00000109 | ||||
Transfer Token | 897621 | 58 days ago | IN | 0 ETH | 0.00000115 | ||||
Transfer Token | 897619 | 58 days ago | IN | 0 ETH | 0.00000146 | ||||
Transfer Token | 890087 | 60 days ago | IN | 0 ETH | 0.00000137 | ||||
Transfer Eth | 890048 | 60 days ago | IN | 0.0015 ETH | 0.00000073 | ||||
Transfer Token | 888260 | 60 days ago | IN | 0 ETH | 0.00000136 | ||||
Transfer Token | 888245 | 60 days ago | IN | 0 ETH | 0.00000123 | ||||
Transfer Token | 887231 | 60 days ago | IN | 0 ETH | 0.00000121 | ||||
Transfer Token | 886753 | 61 days ago | IN | 0 ETH | 0.00000115 |
Latest 9 internal transactions
Loading...
Loading
Contract Name:
RabbitWithdrawalAgent
Compiler Version
v0.7.6+commit.7338295f
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
/** *Submitted for verification at Etherscan.io on 2025-01-01 */ // SPDX-License-Identifier: Apache-2.0 // Copyright 2017 Loopring Technology Limited. pragma solidity ^0.7.6; /// @title Utility Functions for uint /// @author PeterHeng - <[email protected]> library MathUint { using MathUint for uint; function mul( uint a, uint b ) internal pure returns (uint c) { c = a * b; require(a == 0 || c / a == b, "MUL_OVERFLOW"); } function sub( uint a, uint b ) internal pure returns (uint) { require(b <= a, "SUB_UNDERFLOW"); return a - b; } function add( uint a, uint b ) internal pure returns (uint c) { c = a + b; require(c >= a, "ADD_OVERFLOW"); } function add64( uint64 a, uint64 b ) internal pure returns (uint64 c) { c = a + b; require(c >= a, "ADD_OVERFLOW"); } } // Copyright 2017 Loopring Technology Limited. pragma experimental ABIEncoderV2; //Mainly taken from https://github.com/GNSPS/solidity-bytes-utils/blob/master/contracts/BytesLib.sol library BytesUtil { function concat( bytes memory _preBytes, bytes memory _postBytes ) internal pure returns (bytes memory) { bytes memory tempBytes; assembly { // Get a location of some free memory and store it in tempBytes as // Solidity does for memory variables. tempBytes := mload(0x40) // Store the length of the first bytes array at the beginning of // the memory for tempBytes. let length := mload(_preBytes) mstore(tempBytes, length) // Maintain a memory counter for the current write location in the // temp bytes array by adding the 32 bytes for the array length to // the starting location. let mc := add(tempBytes, 0x20) // Stop copying when the memory counter reaches the length of the // first bytes array. let end := add(mc, length) for { // Initialize a copy counter to the start of the _preBytes data, // 32 bytes into its memory. let cc := add(_preBytes, 0x20) } lt(mc, end) { // Increase both counters by 32 bytes each iteration. mc := add(mc, 0x20) cc := add(cc, 0x20) } { // Write the _preBytes data into the tempBytes memory 32 bytes // at a time. mstore(mc, mload(cc)) } // Add the length of _postBytes to the current length of tempBytes // and store it as the new length in the first 32 bytes of the // tempBytes memory. length := mload(_postBytes) mstore(tempBytes, add(length, mload(tempBytes))) // Move the memory counter back from a multiple of 0x20 to the // actual end of the _preBytes data. mc := end // Stop copying when the memory counter reaches the new combined // length of the arrays. end := add(mc, length) for { let cc := add(_postBytes, 0x20) } lt(mc, end) { mc := add(mc, 0x20) cc := add(cc, 0x20) } { mstore(mc, mload(cc)) } // Update the free-memory pointer by padding our last write location // to 32 bytes: add 31 bytes to the end of tempBytes to move to the // next 32 byte block, then round down to the nearest multiple of // 32. If the sum of the length of the two arrays is zero then add // one before rounding down to leave a blank 32 bytes (the length block with 0). mstore(0x40, and( add(add(end, iszero(add(length, mload(_preBytes)))), 31), not(31) // Round down to the nearest 32 bytes. )) } return tempBytes; } function slice( bytes memory _bytes, uint _start, uint _length ) internal pure returns (bytes memory) { require(_bytes.length >= (_start + _length)); bytes memory tempBytes; assembly { switch iszero(_length) case 0 { // Get a location of some free memory and store it in tempBytes as // Solidity does for memory variables. tempBytes := mload(0x40) // The first word of the slice result is potentially a partial // word read from the original array. To read it, we calculate // the length of that partial word and start copying that many // bytes into the array. The first word we copy will start with // data we don't care about, but the last `lengthmod` bytes will // land at the beginning of the contents of the new array. When // we're done copying, we overwrite the full first word with // the actual length of the slice. let lengthmod := and(_length, 31) // The multiplication in the next line is necessary // because when slicing multiples of 32 bytes (lengthmod == 0) // the following copy loop was copying the origin's length // and then ending prematurely not copying everything it should. let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod))) let end := add(mc, _length) for { // The multiplication in the next line has the same exact purpose // as the one above. let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start) } lt(mc, end) { mc := add(mc, 0x20) cc := add(cc, 0x20) } { mstore(mc, mload(cc)) } mstore(tempBytes, _length) //update free-memory pointer //allocating the array padded to 32 bytes like the compiler does now mstore(0x40, and(add(mc, 31), not(31))) } //if we want a zero-length slice let's just return a zero-length array default { tempBytes := mload(0x40) mstore(0x40, add(tempBytes, 0x20)) } } return tempBytes; } function toAddress(bytes memory _bytes, uint _start) internal pure returns (address) { require(_bytes.length >= (_start + 20)); address tempAddress; assembly { tempAddress := div(mload(add(add(_bytes, 0x20), _start)), 0x1000000000000000000000000) } return tempAddress; } function toUint8(bytes memory _bytes, uint _start) internal pure returns (uint8) { require(_bytes.length >= (_start + 1)); uint8 tempUint; assembly { tempUint := mload(add(add(_bytes, 0x1), _start)) } return tempUint; } function toUint16(bytes memory _bytes, uint _start) internal pure returns (uint16) { require(_bytes.length >= (_start + 2)); uint16 tempUint; assembly { tempUint := mload(add(add(_bytes, 0x2), _start)) } return tempUint; } function toUint24(bytes memory _bytes, uint _start) internal pure returns (uint24) { require(_bytes.length >= (_start + 3)); uint24 tempUint; assembly { tempUint := mload(add(add(_bytes, 0x3), _start)) } return tempUint; } function toUint32(bytes memory _bytes, uint _start) internal pure returns (uint32) { require(_bytes.length >= (_start + 4)); uint32 tempUint; assembly { tempUint := mload(add(add(_bytes, 0x4), _start)) } return tempUint; } function toUint64(bytes memory _bytes, uint _start) internal pure returns (uint64) { require(_bytes.length >= (_start + 8)); uint64 tempUint; assembly { tempUint := mload(add(add(_bytes, 0x8), _start)) } return tempUint; } function toUint96(bytes memory _bytes, uint _start) internal pure returns (uint96) { require(_bytes.length >= (_start + 12)); uint96 tempUint; assembly { tempUint := mload(add(add(_bytes, 0xc), _start)) } return tempUint; } function toUint128(bytes memory _bytes, uint _start) internal pure returns (uint128) { require(_bytes.length >= (_start + 16)); uint128 tempUint; assembly { tempUint := mload(add(add(_bytes, 0x10), _start)) } return tempUint; } function toUint(bytes memory _bytes, uint _start) internal pure returns (uint256) { require(_bytes.length >= (_start + 32)); uint256 tempUint; assembly { tempUint := mload(add(add(_bytes, 0x20), _start)) } return tempUint; } function toBytes4(bytes memory _bytes, uint _start) internal pure returns (bytes4) { require(_bytes.length >= (_start + 4)); bytes4 tempBytes4; assembly { tempBytes4 := mload(add(add(_bytes, 0x20), _start)) } return tempBytes4; } function toBytes20(bytes memory _bytes, uint _start) internal pure returns (bytes20) { require(_bytes.length >= (_start + 20)); bytes20 tempBytes20; assembly { tempBytes20 := mload(add(add(_bytes, 0x20), _start)) } return tempBytes20; } function toBytes32(bytes memory _bytes, uint _start) internal pure returns (bytes32) { require(_bytes.length >= (_start + 32)); bytes32 tempBytes32; assembly { tempBytes32 := mload(add(add(_bytes, 0x20), _start)) } return tempBytes32; } function fastSHA256( bytes memory data ) internal view returns (bytes32) { bytes32[] memory result = new bytes32[](1); bool success; assembly { let ptr := add(data, 32) success := staticcall(sub(gas(), 2000), 2, ptr, mload(data), add(result, 32), 32) } require(success, "SHA256_FAILED"); return result[0]; } } /// @title Ownable /// @author Brecht Devos - <[email protected]> /// @dev The Ownable contract has an owner address, and provides basic /// authorization control functions, this simplifies the implementation of /// "user permissions". contract Ownable { address public owner; event OwnershipTransferred( address indexed previousOwner, address indexed newOwner ); /// @dev The Ownable constructor sets the original `owner` of the contract /// to the sender. constructor() { owner = msg.sender; } /// @dev Throws if called by any account other than the owner. modifier onlyOwner() { require(msg.sender == owner, "UNAUTHORIZED"); _; } /// @dev Allows the current owner to transfer control of the contract to a /// new owner. /// @param newOwner The address to transfer ownership to. function transferOwnership( address newOwner ) public virtual onlyOwner { require(newOwner != address(0), "ZERO_ADDRESS"); emit OwnershipTransferred(owner, newOwner); owner = newOwner; } function renounceOwnership() public onlyOwner { emit OwnershipTransferred(owner, address(0)); owner = address(0); } } // Copyright 2017 Loopring Technology Limited. /// @title Claimable /// @author Brecht Devos - <[email protected]> /// @dev Extension for the Ownable contract, where the ownership needs /// to be claimed. This allows the new owner to accept the transfer. contract Claimable is Ownable { address public pendingOwner; /// @dev Modifier throws if called by any account other than the pendingOwner. modifier onlyPendingOwner() { require(msg.sender == pendingOwner, "UNAUTHORIZED"); _; } /// @dev Allows the current owner to set the pendingOwner address. /// @param newOwner The address to transfer ownership to. function transferOwnership( address newOwner ) public override onlyOwner { require(newOwner != address(0) && newOwner != owner, "INVALID_ADDRESS"); pendingOwner = newOwner; } /// @dev Allows the pendingOwner address to finalize the transfer. function claimOwnership() public onlyPendingOwner { emit OwnershipTransferred(owner, pendingOwner); owner = pendingOwner; pendingOwner = address(0); } } /// @title AddressSet /// @author Daniel Wang - <[email protected]> contract AddressSet { struct Set { address[] addresses; mapping (address => uint) positions; uint count; } mapping (bytes32 => Set) private sets; function addAddressToSet( bytes32 key, address addr, bool maintainList ) internal { Set storage set = sets[key]; require(set.positions[addr] == 0, "ALREADY_IN_SET"); if (maintainList) { require(set.addresses.length == set.count, "PREVIOUSLY_NOT_MAINTAILED"); set.addresses.push(addr); } else { require(set.addresses.length == 0, "MUST_MAINTAIN"); } set.count += 1; set.positions[addr] = set.count; } function removeAddressFromSet( bytes32 key, address addr ) internal { Set storage set = sets[key]; uint pos = set.positions[addr]; require(pos != 0, "NOT_IN_SET"); delete set.positions[addr]; set.count -= 1; if (set.addresses.length > 0) { address lastAddr = set.addresses[set.count]; if (lastAddr != addr) { set.addresses[pos - 1] = lastAddr; set.positions[lastAddr] = pos; } set.addresses.pop(); } } function removeSet(bytes32 key) internal { delete sets[key]; } function isAddressInSet( bytes32 key, address addr ) internal view returns (bool) { return sets[key].positions[addr] != 0; } function numAddressesInSet(bytes32 key) internal view returns (uint) { Set storage set = sets[key]; return set.count; } function addressesInSet(bytes32 key) internal view returns (address[] memory) { Set storage set = sets[key]; require(set.count == set.addresses.length, "NOT_MAINTAINED"); return sets[key].addresses; } } contract OwnerManagable is Claimable, AddressSet { bytes32 internal constant MANAGER = keccak256("__MANAGED__"); event ManagerAdded (address indexed manager); event ManagerRemoved(address indexed manager); modifier onlyManager(address addr) { require(isManager(addr), "NOT_MANAGER"); _; } modifier onlyFromManager { require(isManager(msg.sender), "NOT_MANAGER"); _; } modifier onlyOwnerOrManager { require(msg.sender == owner || isManager(msg.sender), "NOT_OWNER_OR_MANAGER"); _; } constructor() Claimable() {} /// @dev Gets the managers. /// @return The list of managers. function managers() public view returns (address[] memory) { return addressesInSet(MANAGER); } /// @dev Gets the number of managers. /// @return The numer of managers. function numManagers() public view returns (uint) { return numAddressesInSet(MANAGER); } /// @dev Checks if an address is a manger. /// @param addr The address to check. /// @return True if the address is a manager, False otherwise. function isManager(address addr) public view returns (bool) { return isAddressInSet(MANAGER, addr); } /// @dev Adds a new manager. /// @param manager The new address to add. function addManager(address manager) public virtual onlyOwner { addManagerInternal(manager); } /// @dev Removes a manager. /// @param manager The manager to remove. function removeManager(address manager) public virtual onlyOwner { removeAddressFromSet(MANAGER, manager); emit ManagerRemoved(manager); } function addManagerInternal(address manager) internal { addAddressToSet(MANAGER, manager, true); emit ManagerAdded(manager); } } // Copyright 2017 Loopring Technology Limited. /// @title Utility Functions for addresses /// @author Daniel Wang - <[email protected]> /// @author Brecht Devos - <[email protected]> library AddressUtil { using AddressUtil for *; function isContract( address addr ) internal view returns (bool) { // According to EIP-1052, 0x0 is the value returned for not-yet created accounts // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned // for accounts without code, i.e. `keccak256('')` bytes32 codehash; // solhint-disable-next-line no-inline-assembly assembly { codehash := extcodehash(addr) } return (codehash != 0x0 && codehash != 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470); } function toPayable( address addr ) internal pure returns (address payable) { return payable(addr); } // Works like address.send but with a customizable gas limit // Make sure your code is safe for reentrancy when using this function! function sendETH( address to, uint amount, uint gasLimit ) internal returns (bool success) { if (amount == 0) { return true; } address payable recipient = to.toPayable(); /* solium-disable-next-line */ (success, ) = recipient.call{value: amount, gas: gasLimit}(""); } // Works like address.transfer but with a customizable gas limit // Make sure your code is safe for reentrancy when using this function! function sendETHAndVerify( address to, uint amount, uint gasLimit ) internal returns (bool success) { success = to.sendETH(amount, gasLimit); require(success, "TRANSFER_FAILURE"); } // Works like call but is slightly more efficient when data // needs to be copied from memory to do the call. function fastCall( address to, uint gasLimit, uint value, bytes memory data ) internal returns (bool success, bytes memory returnData) { if (to != address(0)) { assembly { // Do the call success := call(gasLimit, to, value, add(data, 32), mload(data), 0, 0) // Copy the return data let size := returndatasize() returnData := mload(0x40) mstore(returnData, size) returndatacopy(add(returnData, 32), 0, size) // Update free memory pointer mstore(0x40, add(returnData, add(32, size))) } } } // Like fastCall, but throws when the call is unsuccessful. function fastCallAndVerify( address to, uint gasLimit, uint value, bytes memory data ) internal returns (bytes memory returnData) { bool success; (success, returnData) = fastCall(to, gasLimit, value, data); if (!success) { assembly { revert(add(returnData, 32), mload(returnData)) } } } } // Copyright 2017 Loopring Technology Limited. /// @title ERC20 safe transfer /// @dev see https://github.com/sec-bit/badERC20Fix /// @author Brecht Devos - <[email protected]> library ERC20SafeTransfer { function safeTransferAndVerify( address token, address to, uint value ) internal { safeTransferWithGasLimitAndVerify( token, to, value, gasleft() ); } function safeTransfer( address token, address to, uint value ) internal returns (bool) { return safeTransferWithGasLimit( token, to, value, gasleft() ); } function safeTransferWithGasLimitAndVerify( address token, address to, uint value, uint gasLimit ) internal { require( safeTransferWithGasLimit(token, to, value, gasLimit), "TRANSFER_FAILURE" ); } function safeTransferWithGasLimit( address token, address to, uint value, uint gasLimit ) internal returns (bool) { // A transfer is successful when 'call' is successful and depending on the token: // - No value is returned: we assume a revert when the transfer failed (i.e. 'call' returns false) // - A single boolean is returned: this boolean needs to be true (non-zero) // bytes4(keccak256("transfer(address,uint256)")) = 0xa9059cbb bytes memory callData = abi.encodeWithSelector( bytes4(0xa9059cbb), to, value ); (bool success, ) = token.call{gas: gasLimit}(callData); return checkReturnValue(success); } function safeTransferFromAndVerify( address token, address from, address to, uint value ) internal { safeTransferFromWithGasLimitAndVerify( token, from, to, value, gasleft() ); } function safeTransferFrom( address token, address from, address to, uint value ) internal returns (bool) { return safeTransferFromWithGasLimit( token, from, to, value, gasleft() ); } function safeTransferFromWithGasLimitAndVerify( address token, address from, address to, uint value, uint gasLimit ) internal { bool result = safeTransferFromWithGasLimit( token, from, to, value, gasLimit ); require(result, "TRANSFER_FAILURE"); } function safeTransferFromWithGasLimit( address token, address from, address to, uint value, uint gasLimit ) internal returns (bool) { // A transferFrom is successful when 'call' is successful and depending on the token: // - No value is returned: we assume a revert when the transfer failed (i.e. 'call' returns false) // - A single boolean is returned: this boolean needs to be true (non-zero) // bytes4(keccak256("transferFrom(address,address,uint256)")) = 0x23b872dd bytes memory callData = abi.encodeWithSelector( bytes4(0x23b872dd), from, to, value ); (bool success, ) = token.call{gas: gasLimit}(callData); return checkReturnValue(success); } function checkReturnValue( bool success ) internal pure returns (bool) { // A transfer/transferFrom is successful when 'call' is successful and depending on the token: // - No value is returned: we assume a revert when the transfer failed (i.e. 'call' returns false) // - A single boolean is returned: this boolean needs to be true (non-zero) if (success) { assembly { switch returndatasize() // Non-standard ERC20: nothing is returned so if 'call' was successful we assume the transfer succeeded case 0 { success := 1 } // Standard ERC20: a single boolean value is returned which needs to be true case 32 { returndatacopy(0, 0, 32) success := mload(0) } // None of the above: not successful default { success := 0 } } } return success; } } // Copyright 2017 Loopring Technology Limited. /// @title ReentrancyGuard /// @author Brecht Devos - <[email protected]> /// @dev Exposes a modifier that guards a function against reentrancy /// Changing the value of the same storage value multiple times in a transaction /// is cheap (starting from Istanbul) so there is no need to minimize /// the number of times the value is changed contract ReentrancyGuard { //The default value must be 0 in order to work behind a proxy. uint private _guardValue; // Use this modifier on a function to prevent reentrancy modifier nonReentrant() { // Check if the guard value has its original value require(_guardValue == 0, "REENTRANCY"); // Set the value to something else _guardValue = 1; // Function body _; // Set the value back _guardValue = 0; } } contract RabbitWithdrawalAgent is ReentrancyGuard, OwnerManagable { using AddressUtil for address; using AddressUtil for address payable; using ERC20SafeTransfer for address; using MathUint for uint; event EthTransferred(address indexed sender, address indexed recipient, uint256 amount, uint256 callId); event TokenTransferred(address indexed sender, address indexed recipient, address token, uint256 amount, uint256 callId); // transfer eth function transferEth(address payable recipient, uint256 callId) external payable onlyManager(msg.sender) { require(msg.value > 0, "Transfer amount must be greater than zero"); transfer(msg.sender, recipient, address(0), msg.value); emit EthTransferred(msg.sender, recipient, msg.value, callId); } // transfer erc20 function transferToken(address token, address recipient, uint256 amount, uint256 callId) external onlyManager(msg.sender) { require(token != address(0), "Invalid token address"); require(amount > 0, "Transfer amount must be greater than zero"); transfer(msg.sender, recipient, token, amount); emit TokenTransferred(msg.sender, recipient, token, amount, callId); } // -- Internal -- function transfer( address from, address to, address token, uint amount ) internal { if (amount > 0) { if (token == address(0)) { to.sendETHAndVerify(amount, gasleft()); // ETH } else { token.safeTransferFromAndVerify(from, to, amount); // ERC20 token } } } }
{ "optimizer": { "enabled": true, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"callId","type":"uint256"}],"name":"EthTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"manager","type":"address"}],"name":"ManagerAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"manager","type":"address"}],"name":"ManagerRemoved","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":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"callId","type":"uint256"}],"name":"TokenTransferred","type":"event"},{"inputs":[{"internalType":"address","name":"manager","type":"address"}],"name":"addManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"isManager","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"managers","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numManagers","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"manager","type":"address"}],"name":"removeManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"recipient","type":"address"},{"internalType":"uint256","name":"callId","type":"uint256"}],"name":"transferEth","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"callId","type":"uint256"}],"name":"transferToken","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b50600180546001600160a01b03191633179055610fd4806100326000396000f3fe6080604052600436106100a75760003560e01c8063ac18de4311610064578063ac18de4314610165578063e30c397814610185578063e68777d71461019a578063e9bb84c2146101bc578063f2fde38b146101cf578063f3ae2415146101ef576100a7565b8063036ebef9146100ac5780632d06177a146100ce5780634e71e0c8146100ee578063715018a61461010357806372311705146101185780638da5cb5b14610143575b600080fd5b3480156100b857600080fd5b506100cc6100c7366004610c47565b61021c565b005b3480156100da57600080fd5b506100cc6100e9366004610c00565b6102f3565b3480156100fa57600080fd5b506100cc610329565b34801561010f57600080fd5b506100cc6103b9565b34801561012457600080fd5b5061012d61042d565b60405161013a9190610d1e565b60405180910390f35b34801561014f57600080fd5b5061015861044b565b60405161013a9190610cc5565b34801561017157600080fd5b506100cc610180366004610c00565b61045a565b34801561019157600080fd5b506101586104d3565b3480156101a657600080fd5b506101af6104e2565b60405161013a9190610f52565b6100cc6101ca366004610c1c565b6104fb565b3480156101db57600080fd5b506100cc6101ea366004610c00565b6105a0565b3480156101fb57600080fd5b5061020f61020a366004610c00565b61062e565b60405161013a9190610d5f565b336102268161062e565b61024b5760405162461bcd60e51b815260040161024290610db9565b60405180910390fd5b6001600160a01b0385166102715760405162461bcd60e51b815260040161024290610ec4565b600083116102915760405162461bcd60e51b815260040161024290610e7b565b61029d3385878661064e565b836001600160a01b0316336001600160a01b03167f8a5f0ac031419eaec74adaefa92516a2b529c110f67e20899c4a0c76f0b9bf5f8786866040516102e493929190610cfd565b60405180910390a35050505050565b6001546001600160a01b0316331461031d5760405162461bcd60e51b815260040161024290610d93565b61032681610699565b50565b6002546001600160a01b031633146103535760405162461bcd60e51b815260040161024290610d93565b6002546001546040516001600160a01b0392831692909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a360028054600180546001600160a01b03199081166001600160a01b03841617909155169055565b6001546001600160a01b031633146103e35760405162461bcd60e51b815260040161024290610d93565b6001546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600180546001600160a01b0319169055565b6060610446600080516020610f7f8339815191526106ea565b905090565b6001546001600160a01b031681565b6001546001600160a01b031633146104845760405162461bcd60e51b815260040161024290610d93565b61049c600080516020610f7f8339815191528261078b565b6040516001600160a01b038216907fef69f7d97228658c92417be1b16b19058315de71fecb435d07b7d23728b6bd3190600090a250565b6002546001600160a01b031681565b6000610446600080516020610f7f8339815191526108b7565b336105058161062e565b6105215760405162461bcd60e51b815260040161024290610db9565b600034116105415760405162461bcd60e51b815260040161024290610e7b565b61054e338460003461064e565b826001600160a01b0316336001600160a01b03167f35a16817dadc35c23b4a7e9809b4b2ea9369a08191f45f6438592c5e9d6818c33485604051610593929190610f5b565b60405180910390a3505050565b6001546001600160a01b031633146105ca5760405162461bcd60e51b815260040161024290610d93565b6001600160a01b038116158015906105f057506001546001600160a01b03828116911614155b61060c5760405162461bcd60e51b815260040161024290610d6a565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b6000610648600080516020610f7f833981519152836108cc565b92915050565b8015610693576001600160a01b03821661067e57610678815a6001600160a01b03861691906108fa565b50610693565b6106936001600160a01b038316858584610936565b50505050565b6106b3600080516020610f7f833981519152826001610943565b6040516001600160a01b038216907f3b4a40cccf2058c593542587329dd385be4f0b588db5471fbd9598e56dd7093a90600090a250565b60008181526003602052604090208054600282015460609291146107205760405162461bcd60e51b815260040161024290610f2a565b6000838152600360209081526040918290208054835181840281018401909452808452909183018282801561077e57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610760575b5050505050915050919050565b60008281526003602090815260408083206001600160a01b03851684526001810190925290912054806107d05760405162461bcd60e51b815260040161024290610e57565b6001600160a01b03831660009081526001830160205260408120556002820180546000190190558154156106935760008260000183600201548154811061081357fe5b6000918252602090912001546001600160a01b03908116915084168114610883578083600001600184038154811061084757fe5b600091825260208083209190910180546001600160a01b0319166001600160a01b03948516179055918316815260018501909152604090208290555b825483908061088e57fe5b600082815260209020810160001990810180546001600160a01b03191690550190555050505050565b60009081526003602052604090206002015490565b60008281526003602090815260408083206001600160a01b0385168452600101909152902054151592915050565b60006109106001600160a01b0385168484610a33565b90508061092f5760405162461bcd60e51b815260040161024290610dde565b9392505050565b610693848484845a610ac0565b60008381526003602090815260408083206001600160a01b03861684526001810190925290912054156109885760405162461bcd60e51b815260040161024290610e08565b81156109e25760028101548154146109b25760405162461bcd60e51b815260040161024290610ef3565b80546001810182556000828152602090200180546001600160a01b0319166001600160a01b038516179055610a01565b805415610a015760405162461bcd60e51b815260040161024290610e30565b6002810180546001908101918290556001600160a01b0390941660009081529190930160205260409020919091555050565b600082610a425750600161092f565b6000610a56856001600160a01b0316610af6565b9050806001600160a01b0316848490604051610a7190610af6565b600060405180830381858888f193505050503d8060008114610aaf576040519150601f19603f3d011682016040523d82523d6000602084013e610ab4565b606091505b50909695505050505050565b6000610acf8686868686610af9565b905080610aee5760405162461bcd60e51b815260040161024290610dde565b505050505050565b90565b6000806323b872dd60e01b868686604051602401610b1993929190610cd9565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b03838183161783525050505090506000876001600160a01b03168483604051610b699190610c8c565b60006040518083038160008787f1925050503d8060008114610ba7576040519150601f19603f3d011682016040523d82523d6000602084013e610bac565b606091505b50509050610bb981610bc5565b98975050505050505050565b60008115610bfc573d8015610be55760208114610bee5760009250610bfa565b60019250610bfa565b60206000803e60005192505b505b5090565b600060208284031215610c11578081fd5b813561092f81610f69565b60008060408385031215610c2e578081fd5b8235610c3981610f69565b946020939093013593505050565b60008060008060808587031215610c5c578182fd5b8435610c6781610f69565b93506020850135610c7781610f69565b93969395505050506040820135916060013590565b60008251815b81811015610cac5760208186018101518583015201610c92565b81811115610cba5782828501525b509190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b039390931683526020830191909152604082015260600190565b6020808252825182820181905260009190848201906040850190845b81811015610ab45783516001600160a01b031683529284019291840191600101610d3a565b901515815260200190565b6020808252600f908201526e494e56414c49445f4144445245535360881b604082015260600190565b6020808252600c908201526b15539055551213d49256915160a21b604082015260600190565b6020808252600b908201526a2727aa2fa6a0a720a3a2a960a91b604082015260600190565b60208082526010908201526f5452414e534645525f4641494c55524560801b604082015260600190565b6020808252600e908201526d1053149150511657d25397d4d15560921b604082015260600190565b6020808252600d908201526c26aaa9aa2fa6a0a4a72a20a4a760991b604082015260600190565b6020808252600a90820152691393d517d25397d4d15560b21b604082015260600190565b60208082526029908201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206040820152687468616e207a65726f60b81b606082015260800190565b602080825260159082015274496e76616c696420746f6b656e206164647265737360581b604082015260600190565b60208082526019908201527f50524556494f55534c595f4e4f545f4d41494e5441494c454400000000000000604082015260600190565b6020808252600e908201526d1393d517d350525395105253915160921b604082015260600190565b90815260200190565b918252602082015260400190565b6001600160a01b038116811461032657600080fdfeae79206ff8d89355a31a27bc7df0c55f5fe15ce3ae94530629cd19b6712ea1f8a2646970667358221220328e15ebc4c5b3401f8394d67f6e18df94a86dc42a7c2783b86c556f699ee0b364736f6c63430007060033
Deployed Bytecode
0x6080604052600436106100a75760003560e01c8063ac18de4311610064578063ac18de4314610165578063e30c397814610185578063e68777d71461019a578063e9bb84c2146101bc578063f2fde38b146101cf578063f3ae2415146101ef576100a7565b8063036ebef9146100ac5780632d06177a146100ce5780634e71e0c8146100ee578063715018a61461010357806372311705146101185780638da5cb5b14610143575b600080fd5b3480156100b857600080fd5b506100cc6100c7366004610c47565b61021c565b005b3480156100da57600080fd5b506100cc6100e9366004610c00565b6102f3565b3480156100fa57600080fd5b506100cc610329565b34801561010f57600080fd5b506100cc6103b9565b34801561012457600080fd5b5061012d61042d565b60405161013a9190610d1e565b60405180910390f35b34801561014f57600080fd5b5061015861044b565b60405161013a9190610cc5565b34801561017157600080fd5b506100cc610180366004610c00565b61045a565b34801561019157600080fd5b506101586104d3565b3480156101a657600080fd5b506101af6104e2565b60405161013a9190610f52565b6100cc6101ca366004610c1c565b6104fb565b3480156101db57600080fd5b506100cc6101ea366004610c00565b6105a0565b3480156101fb57600080fd5b5061020f61020a366004610c00565b61062e565b60405161013a9190610d5f565b336102268161062e565b61024b5760405162461bcd60e51b815260040161024290610db9565b60405180910390fd5b6001600160a01b0385166102715760405162461bcd60e51b815260040161024290610ec4565b600083116102915760405162461bcd60e51b815260040161024290610e7b565b61029d3385878661064e565b836001600160a01b0316336001600160a01b03167f8a5f0ac031419eaec74adaefa92516a2b529c110f67e20899c4a0c76f0b9bf5f8786866040516102e493929190610cfd565b60405180910390a35050505050565b6001546001600160a01b0316331461031d5760405162461bcd60e51b815260040161024290610d93565b61032681610699565b50565b6002546001600160a01b031633146103535760405162461bcd60e51b815260040161024290610d93565b6002546001546040516001600160a01b0392831692909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a360028054600180546001600160a01b03199081166001600160a01b03841617909155169055565b6001546001600160a01b031633146103e35760405162461bcd60e51b815260040161024290610d93565b6001546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600180546001600160a01b0319169055565b6060610446600080516020610f7f8339815191526106ea565b905090565b6001546001600160a01b031681565b6001546001600160a01b031633146104845760405162461bcd60e51b815260040161024290610d93565b61049c600080516020610f7f8339815191528261078b565b6040516001600160a01b038216907fef69f7d97228658c92417be1b16b19058315de71fecb435d07b7d23728b6bd3190600090a250565b6002546001600160a01b031681565b6000610446600080516020610f7f8339815191526108b7565b336105058161062e565b6105215760405162461bcd60e51b815260040161024290610db9565b600034116105415760405162461bcd60e51b815260040161024290610e7b565b61054e338460003461064e565b826001600160a01b0316336001600160a01b03167f35a16817dadc35c23b4a7e9809b4b2ea9369a08191f45f6438592c5e9d6818c33485604051610593929190610f5b565b60405180910390a3505050565b6001546001600160a01b031633146105ca5760405162461bcd60e51b815260040161024290610d93565b6001600160a01b038116158015906105f057506001546001600160a01b03828116911614155b61060c5760405162461bcd60e51b815260040161024290610d6a565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b6000610648600080516020610f7f833981519152836108cc565b92915050565b8015610693576001600160a01b03821661067e57610678815a6001600160a01b03861691906108fa565b50610693565b6106936001600160a01b038316858584610936565b50505050565b6106b3600080516020610f7f833981519152826001610943565b6040516001600160a01b038216907f3b4a40cccf2058c593542587329dd385be4f0b588db5471fbd9598e56dd7093a90600090a250565b60008181526003602052604090208054600282015460609291146107205760405162461bcd60e51b815260040161024290610f2a565b6000838152600360209081526040918290208054835181840281018401909452808452909183018282801561077e57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610760575b5050505050915050919050565b60008281526003602090815260408083206001600160a01b03851684526001810190925290912054806107d05760405162461bcd60e51b815260040161024290610e57565b6001600160a01b03831660009081526001830160205260408120556002820180546000190190558154156106935760008260000183600201548154811061081357fe5b6000918252602090912001546001600160a01b03908116915084168114610883578083600001600184038154811061084757fe5b600091825260208083209190910180546001600160a01b0319166001600160a01b03948516179055918316815260018501909152604090208290555b825483908061088e57fe5b600082815260209020810160001990810180546001600160a01b03191690550190555050505050565b60009081526003602052604090206002015490565b60008281526003602090815260408083206001600160a01b0385168452600101909152902054151592915050565b60006109106001600160a01b0385168484610a33565b90508061092f5760405162461bcd60e51b815260040161024290610dde565b9392505050565b610693848484845a610ac0565b60008381526003602090815260408083206001600160a01b03861684526001810190925290912054156109885760405162461bcd60e51b815260040161024290610e08565b81156109e25760028101548154146109b25760405162461bcd60e51b815260040161024290610ef3565b80546001810182556000828152602090200180546001600160a01b0319166001600160a01b038516179055610a01565b805415610a015760405162461bcd60e51b815260040161024290610e30565b6002810180546001908101918290556001600160a01b0390941660009081529190930160205260409020919091555050565b600082610a425750600161092f565b6000610a56856001600160a01b0316610af6565b9050806001600160a01b0316848490604051610a7190610af6565b600060405180830381858888f193505050503d8060008114610aaf576040519150601f19603f3d011682016040523d82523d6000602084013e610ab4565b606091505b50909695505050505050565b6000610acf8686868686610af9565b905080610aee5760405162461bcd60e51b815260040161024290610dde565b505050505050565b90565b6000806323b872dd60e01b868686604051602401610b1993929190610cd9565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b03838183161783525050505090506000876001600160a01b03168483604051610b699190610c8c565b60006040518083038160008787f1925050503d8060008114610ba7576040519150601f19603f3d011682016040523d82523d6000602084013e610bac565b606091505b50509050610bb981610bc5565b98975050505050505050565b60008115610bfc573d8015610be55760208114610bee5760009250610bfa565b60019250610bfa565b60206000803e60005192505b505b5090565b600060208284031215610c11578081fd5b813561092f81610f69565b60008060408385031215610c2e578081fd5b8235610c3981610f69565b946020939093013593505050565b60008060008060808587031215610c5c578182fd5b8435610c6781610f69565b93506020850135610c7781610f69565b93969395505050506040820135916060013590565b60008251815b81811015610cac5760208186018101518583015201610c92565b81811115610cba5782828501525b509190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b039390931683526020830191909152604082015260600190565b6020808252825182820181905260009190848201906040850190845b81811015610ab45783516001600160a01b031683529284019291840191600101610d3a565b901515815260200190565b6020808252600f908201526e494e56414c49445f4144445245535360881b604082015260600190565b6020808252600c908201526b15539055551213d49256915160a21b604082015260600190565b6020808252600b908201526a2727aa2fa6a0a720a3a2a960a91b604082015260600190565b60208082526010908201526f5452414e534645525f4641494c55524560801b604082015260600190565b6020808252600e908201526d1053149150511657d25397d4d15560921b604082015260600190565b6020808252600d908201526c26aaa9aa2fa6a0a4a72a20a4a760991b604082015260600190565b6020808252600a90820152691393d517d25397d4d15560b21b604082015260600190565b60208082526029908201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206040820152687468616e207a65726f60b81b606082015260800190565b602080825260159082015274496e76616c696420746f6b656e206164647265737360581b604082015260600190565b60208082526019908201527f50524556494f55534c595f4e4f545f4d41494e5441494c454400000000000000604082015260600190565b6020808252600e908201526d1393d517d350525395105253915160921b604082015260600190565b90815260200190565b918252602082015260400190565b6001600160a01b038116811461032657600080fdfeae79206ff8d89355a31a27bc7df0c55f5fe15ce3ae94530629cd19b6712ea1f8a2646970667358221220328e15ebc4c5b3401f8394d67f6e18df94a86dc42a7c2783b86c556f699ee0b364736f6c63430007060033
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 34 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.