Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Latest 1 internal transaction
Advanced mode:
Parent Transaction Hash | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|
9889403 | 1748 days ago | Contract Creation | 0 ETH |
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Source Code Verified (Exact Match)
Contract Name:
UserWallet
Compiler Version
v0.4.25+commit.59dbf8f1
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2020-10-04 */ /** * verified by 3esmit */ /** * Allows to create contracts which would be able to receive ETH and tokens. * Contract will help to detect ETH deposits faster. * Contract idea was borrowed from Bittrex. * Version: 2 * */ pragma solidity 0.4.25; contract Owned { address public owner1; address public owner2; modifier onlyOwner { require(msg.sender != address(0)); require(msg.sender == owner1 || msg.sender == owner2, "Only owner."); _; } constructor() internal { owner1 = msg.sender; } function setOwner1(address _address) public onlyOwner { require(_address != address(0)); owner1 = _address; } function setOwner2(address _address) public onlyOwner { require(_address != address(0)); owner2 = _address; } } contract RequiringAuthorization is Owned { Casino public casino; bool public casinoAuthorized; mapping(address => bool) public authorized; modifier onlyAuthorized { require(authorized[msg.sender] || casinoAuthorized && casino.authorized(msg.sender), "Caller is not authorized."); _; } constructor(address _casino) internal { authorized[msg.sender] = true; casino = Casino(_casino); casinoAuthorized = true; } function authorize(address _address) public onlyOwner { authorized[_address] = true; } function deauthorize(address _address) public onlyOwner { authorized[_address] = false; } function authorizeCasino() public onlyOwner { casinoAuthorized = true; } function deauthorizeCasino() public onlyOwner { casinoAuthorized = false; } function setCasino(address _casino) public onlyOwner { casino = Casino(_casino); } } contract WalletController is RequiringAuthorization { address public destination; address public defaultSweeper = address(new DefaultSweeper(address(this))); bool public halted = false; mapping(address => address) public sweepers; mapping(address => bool) public wallets; event EthDeposit(address _from, address _to, uint _amount); event WalletCreated(address _address); event Sweeped(address _from, address _to, address _token, uint _amount); modifier onlyWallet { require(wallets[msg.sender], "Caller must be user wallet."); _; } constructor(address _casino) public RequiringAuthorization(_casino) { destination = msg.sender; } function setDestination(address _destination) public onlyOwner { destination = _destination; } function createWallet() public { address wallet = address(new UserWallet(this)); wallets[wallet] = true; emit WalletCreated(wallet); } function createWallets(uint count) public { for (uint i = 0; i < count; i++) { createWallet(); } } function addSweeper(address _token, address _sweeper) public onlyOwner { sweepers[_token] = _sweeper; } function halt() public onlyAuthorized { halted = true; } function start() public onlyOwner { halted = false; } function sweeperOf(address _token) public view returns (address) { address sweeper = sweepers[_token]; if (sweeper == 0) sweeper = defaultSweeper; return sweeper; } function logEthDeposit(address _from, address _to, uint _amount) public onlyWallet { emit EthDeposit(_from, _to, _amount); } function logSweep(address _from, address _to, address _token, uint _amount) public { emit Sweeped(_from, _to, _token, _amount); } } contract UserWallet { WalletController private controller; constructor (address _controller) public { controller = WalletController(_controller); } function () public payable { controller.logEthDeposit(msg.sender, address(this), msg.value); } function tokenFallback(address _from, uint _value, bytes _data) public pure { (_from); (_value); (_data); } function sweep(address _token, uint _amount) public returns (bool) { (_amount); return controller.sweeperOf(_token).delegatecall(msg.data); } } contract AbstractSweeper { WalletController public controller; constructor (address _controller) public { controller = WalletController(_controller); } function () public { revert("Contract does not accept ETH."); } function sweep(address token, uint amount) public returns (bool); modifier canSweep() { if (!(controller.authorized(msg.sender) || controller.casinoAuthorized() && controller.casino().authorized(msg.sender))) revert("Caller is not authorized to sweep."); if (controller.halted()) revert("Contract is halted."); _; } } contract DefaultSweeper is AbstractSweeper { constructor (address controller) public AbstractSweeper(controller) {} function sweep(address _token, uint _amount) public canSweep returns (bool) { bool success = false; address destination = controller.destination(); if (_token != address(0)) { Token token = Token(_token); uint amount = _amount; if (amount > token.balanceOf(this)) { return false; } success = token.transfer(destination, amount); } else { uint amountInWei = _amount; if (amountInWei > address(this).balance) { return false; } success = destination.send(amountInWei); } if (success) { controller.logSweep(this, destination, _token, _amount); } return success; } } contract Token { function balanceOf(address a) public pure returns (uint) { (a); return 0; } function transfer(address a, uint val) public pure returns (bool) { (a); (val); return false; } } contract Casino { mapping(address => bool) public authorized; }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"constant":false,"inputs":[{"name":"_token","type":"address"},{"name":"_amount","type":"uint256"}],"name":"sweep","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_from","type":"address"},{"name":"_value","type":"uint256"},{"name":"_data","type":"bytes"}],"name":"tokenFallback","outputs":[],"payable":false,"stateMutability":"pure","type":"function"},{"inputs":[{"name":"_controller","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"payable":true,"stateMutability":"payable","type":"fallback"}]
Contract Creation Code
608060405234801561001057600080fd5b50604051602080610305833981016040525160008054600160a060020a03909216600160a060020a03199092169190911790556102b3806100526000396000f30060806040526004361061004b5763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416636ea056a981146100de578063c0ee0b8a14610123575b60008054604080517f3128012a000000000000000000000000000000000000000000000000000000008152336004820152306024820152346044820152905173ffffffffffffffffffffffffffffffffffffffff90921692633128012a9260648084019382900301818387803b1580156100c457600080fd5b505af11580156100d8573d6000803e3d6000fd5b50505050005b3480156100ea57600080fd5b5061010f73ffffffffffffffffffffffffffffffffffffffff6004351660243561019b565b604080519115158252519081900360200190f35b34801561012f57600080fd5b50604080516020600460443581810135601f810184900484028501840190955284845261019994823573ffffffffffffffffffffffffffffffffffffffff169460248035953695946064949201919081908401838280828437509497506102829650505050505050565b005b60008054604080517f3c18d31800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff868116600483015291519190921691633c18d31891602480830192602092919082900301818787803b15801561021057600080fd5b505af1158015610224573d6000803e3d6000fd5b505050506040513d602081101561023a57600080fd5b505160405173ffffffffffffffffffffffffffffffffffffffff90911690600090369080838380828437820191505092505050600060405180830381855af495945050505050565b5050505600a165627a7a72305820670b3401d94aec68ef3bdcca24e917d0bcb5bf05491f1d1c1d0f59cf6c11fae600290000000000000000000000004202b62990c763860ffaf5e4ee935b1459890e25
Deployed Bytecode
0x60806040526004361061004b5763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416636ea056a981146100de578063c0ee0b8a14610123575b60008054604080517f3128012a000000000000000000000000000000000000000000000000000000008152336004820152306024820152346044820152905173ffffffffffffffffffffffffffffffffffffffff90921692633128012a9260648084019382900301818387803b1580156100c457600080fd5b505af11580156100d8573d6000803e3d6000fd5b50505050005b3480156100ea57600080fd5b5061010f73ffffffffffffffffffffffffffffffffffffffff6004351660243561019b565b604080519115158252519081900360200190f35b34801561012f57600080fd5b50604080516020600460443581810135601f810184900484028501840190955284845261019994823573ffffffffffffffffffffffffffffffffffffffff169460248035953695946064949201919081908401838280828437509497506102829650505050505050565b005b60008054604080517f3c18d31800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff868116600483015291519190921691633c18d31891602480830192602092919082900301818787803b15801561021057600080fd5b505af1158015610224573d6000803e3d6000fd5b505050506040513d602081101561023a57600080fd5b505160405173ffffffffffffffffffffffffffffffffffffffff90911690600090369080838380828437820191505092505050600060405180830381855af495945050505050565b5050505600a165627a7a72305820670b3401d94aec68ef3bdcca24e917d0bcb5bf05491f1d1c1d0f59cf6c11fae60029
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000004202b62990c763860ffaf5e4ee935b1459890e25
-----Decoded View---------------
Arg [0] : _controller (address): 0x4202B62990c763860FFaF5E4eE935b1459890E25
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000004202b62990c763860ffaf5e4ee935b1459890e25
Deployed Bytecode Sourcemap
3828:611:0:-;;;;;;;;;;;;;;;;;;;;;;;;;4047:10;;;:62;;;;;;4072:10;4047:62;;;;4092:4;4047:62;;;;4099:9;4047:62;;;;;;:10;;;;;:24;;:62;;;;;;;;;;:10;;:62;;;5:2:-1;;;;30:1;27;20:12;5:2;4047:62:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;4047:62:0;;;;3828:611;4272:164;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;4272:164:0;;;;;;;;;;;;;;;;;;;;;;;;;;;4125:139;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;4125:139:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4125:139:0;;-1:-1:-1;4125:139:0;;-1:-1:-1;;;;;;;4125:139:0;;;4272:164;4333:4;4377:10;;:28;;;;;;:10;:28;;;;;;;;;:10;;;;;:20;;:28;;;;;;;;;;;;;;4333:4;4377:10;:28;;;5:2:-1;;;;30:1;27;20:12;5:2;4377:28:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;4377:28:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;4377:28:0;:51;;:41;;;;;4419:8;;;;4377:51;4419:8;;;;4377:51;;;;;;;;;;;;;;;;;;;;;;4272:164;-1:-1:-1;;;;;4272:164:0:o;4125:139::-;;;;:::o
Swarm Source
bzzr://670b3401d94aec68ef3bdcca24e917d0bcb5bf05491f1d1c1d0f59cf6c11fae6
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ 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.