More Info
Private Name Tags
ContractCreator
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
Vyper_contract
Compiler Version
vyper:0.3.1
Contract Source Code (Vyper language format)
# @version 0.3.1 """ @title ProxyAdmin @notice Thin proxy allowing shared ownership of contracts @author Ben Hauser @license MIT """ event TransactionExecuted: admin: indexed(address) target: indexed(address) calldata: Bytes[100000] value: uint256 event RequestAdminChange: current_admin: address future_admin: address event RevokeAdminChange: current_admin: address future_admin: address calling_admin: address event ApproveAdminChange: current_admin: address future_admin: address calling_admin: address event AcceptAdminChange: previous_admin: address current_admin: address admins: public(address[2]) pending_current_admin: uint256 pending_new_admin: address change_approved: bool @external def __init__(_authorized: address[2]): """ @notice Contract constructor @param _authorized Admin accounts for this contract """ self.admins = _authorized @payable @external def execute(_target: address, _calldata: Bytes[100000]): """ @notice Execute a contract call @dev Ether sent when calling this function is forwarded onward @param _target Address of the contract to call @param _calldata Calldata to use in the call """ assert msg.sender in self.admins # dev: only admin raw_call(_target, _calldata, value=msg.value) log TransactionExecuted(msg.sender, _target, _calldata, msg.value) @view @external def get_admin_change_status() -> (address, address, bool): """ @notice Get information about a pending admin change @return Admin address to be replaced, admin address to be added, has change been approved? """ idx: uint256 = self.pending_current_admin if idx == 0: return ZERO_ADDRESS, ZERO_ADDRESS, False else: return self.admins[idx - 1], self.pending_new_admin, self.change_approved @external def request_admin_change(_new_admin: address): """ @notice Initiate changing an admin address @param _new_admin New admin address (replaces msg.sender) """ assert self.pending_current_admin == 0 # dev: already an active request admin_list: address[2] = self.admins assert _new_admin not in admin_list # dev: new admin is already admin for i in range(2): if admin_list[i] == msg.sender: self.pending_current_admin = i + 1 self.pending_new_admin = _new_admin log RequestAdminChange(msg.sender, _new_admin) return raise # dev: only admin @external def approve_admin_change(): """ @notice Approve changing an admin address @dev Only callable by the 2nd admin address (the one that will not change) """ idx: uint256 = self.pending_current_admin assert idx > 0 # dev: no active request assert msg.sender == self.admins[idx % 2] # dev: caller is not 2nd admin self.change_approved = True log ApproveAdminChange(self.admins[idx - 1], self.pending_new_admin, msg.sender) @external def revoke_admin_change(): """ @notice Revoke changing an admin address @dev May be called by either admin at any time to reset the process, even if approval has previous been given """ assert msg.sender in self.admins # dev: only admin idx: uint256 = self.pending_current_admin pending_admin: address = ZERO_ADDRESS if idx > 0: pending_admin = self.admins[idx - 1] log RevokeAdminChange(pending_admin, self.pending_new_admin, msg.sender) self.pending_current_admin = 0 self.pending_new_admin = ZERO_ADDRESS self.change_approved = False @external def accept_admin_change(): """ @notice Accept a changed admin address @dev Only callable by the new admin address, after approval has been given """ assert self.change_approved == True # dev: change not approved assert msg.sender == self.pending_new_admin # dev: only new admin idx: uint256 = self.pending_current_admin - 1 log AcceptAdminChange(self.admins[idx], msg.sender) self.admins[idx] = msg.sender self.pending_current_admin = 0 self.pending_new_admin = ZERO_ADDRESS self.change_approved = False
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"name":"TransactionExecuted","inputs":[{"name":"admin","type":"address","indexed":true},{"name":"target","type":"address","indexed":true},{"name":"calldata","type":"bytes","indexed":false},{"name":"value","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"name":"RequestAdminChange","inputs":[{"name":"current_admin","type":"address","indexed":false},{"name":"future_admin","type":"address","indexed":false}],"anonymous":false,"type":"event"},{"name":"RevokeAdminChange","inputs":[{"name":"current_admin","type":"address","indexed":false},{"name":"future_admin","type":"address","indexed":false},{"name":"calling_admin","type":"address","indexed":false}],"anonymous":false,"type":"event"},{"name":"ApproveAdminChange","inputs":[{"name":"current_admin","type":"address","indexed":false},{"name":"future_admin","type":"address","indexed":false},{"name":"calling_admin","type":"address","indexed":false}],"anonymous":false,"type":"event"},{"name":"AcceptAdminChange","inputs":[{"name":"previous_admin","type":"address","indexed":false},{"name":"current_admin","type":"address","indexed":false}],"anonymous":false,"type":"event"},{"stateMutability":"nonpayable","type":"constructor","inputs":[{"name":"_authorized","type":"address[2]"}],"outputs":[]},{"stateMutability":"payable","type":"function","name":"execute","inputs":[{"name":"_target","type":"address"},{"name":"_calldata","type":"bytes"}],"outputs":[],"gas":968065},{"stateMutability":"view","type":"function","name":"get_admin_change_status","inputs":[],"outputs":[{"name":"","type":"address"},{"name":"","type":"address"},{"name":"","type":"bool"}],"gas":9067},{"stateMutability":"nonpayable","type":"function","name":"request_admin_change","inputs":[{"name":"_new_admin","type":"address"}],"outputs":[],"gas":152486},{"stateMutability":"nonpayable","type":"function","name":"approve_admin_change","inputs":[],"outputs":[],"gas":46585},{"stateMutability":"nonpayable","type":"function","name":"revoke_admin_change","inputs":[],"outputs":[],"gas":74003},{"stateMutability":"nonpayable","type":"function","name":"accept_admin_change","inputs":[],"outputs":[],"gas":106364},{"stateMutability":"view","type":"function","name":"admins","inputs":[{"name":"arg0","type":"uint256"}],"outputs":[{"name":"","type":"address"}],"gas":2679}]
Contract Creation Code
61056e6020816080396080518060a01c6105695760e0526020602082016080396080518060a01c61056957610100525060e0516000556101005160015561055156600436101561000d57610505565b60046000601c37600051631cff79cd811861014e576004358060a01c61050b5760e052602435600401620186a081351161050b578080356020018082610100375050506000620187c052620187c060c060006002818352015b60c0515433186100795760018352610089565b8151600101808352811415610066575b505050620187c0511561050b576101005060006000610100516101203460e0515af16100ba573d600060003e3d6000fd5b60e051337fcaac11c45e5fdb5c513e20ac229a3f9f99143580b5eb08d0fecbdd5ae8c81ef5620187c08060408082528083018061010080516020018083828460045afa905050508051806020830101818260206001820306601f8201039050033682375050805160200160206001820306601f8201039050905090508101905060208201915034825290509050620187c0a3005b3461050b576364bcd73081186101ca5760025460e05260e051156101ac57600160e051600180821061050b5780820390509050600281101561050b57025461010052600354610120526004546101405260606101006101c8566101c8565b60006101005260006101205260006101405260606101006101c8565bf35b63a52e736981186102dd576004358060a01c61050b5760e05260025461050b57600054610100526001546101205260006101405261014060c060006002818352015b60c051602002610100015160e051186102285760018352610238565b815160010180835281141561020c575b5050506101405161050b5761014060006002818352015b3361010061014051600281101561050b576020020151186102c457610140516001818183011061050b578082019050905060025560e0516003557f3dbc538770ecfcda0a15ac4731d922045333e3f55a9dbff4923d5ae950fd4b68336101605260e051610180526040610160a15050506102db565b815160010180835281141561024f57505060006000fd5b005b63d1266a1281186103765760025460e052600060e051111561050b57600160e051600280820690509050600281101561050b570254331861050b5760016004557fb4a2afe1602258539e7638f32a9c55473646a5b004d1a2f76ed802bdd6b3c611600160e051600180821061050b5780820390509050600281101561050b570254610100526003546101205233610140526060610100a1005b631d43f539811861044957600060e05260e060c060006002818352015b60c0515433186103a657600183526103b6565b8151600101808352811415610393575b50505060e0511561050b5760025460e052600061010052600060e05111156103fd57600160e051600180821061050b5780820390509050600281101561050b570254610100525b7f65d4d3bd6f71ee062f64e7b4a0b8f2a379c599a6844765e697f102360580029661010051610120526003546101405233610160526060610120a1600060025560006003556000600455005b63980cbc1481186104df5760016004541861050b57600354331861050b57600254600180821061050b578082039050905060e0527f3f26d618a9f0bbc232d4e0814ca8f1b77fec61eff610a967d549270accd437fc600160e051600281101561050b5702546101005233610120526040610100a133600160e051600281101561050b570255600060025560006003556000600455005b6314bfd6d08118610503576001600435600281101561050b57025460e052602060e0f35b505b60006000fd5b600080fd5b61004161055103610041600039610041610551036000f35b600080fd000000000000000000000000babe61887f1de2713c6f97e567623453d3c79f67000000000000000000000000745748bcfd8f9c2de519a71d789be8a63dd7d66c
Deployed Bytecode
0x600436101561000d57610505565b60046000601c37600051631cff79cd811861014e576004358060a01c61050b5760e052602435600401620186a081351161050b578080356020018082610100375050506000620187c052620187c060c060006002818352015b60c0515433186100795760018352610089565b8151600101808352811415610066575b505050620187c0511561050b576101005060006000610100516101203460e0515af16100ba573d600060003e3d6000fd5b60e051337fcaac11c45e5fdb5c513e20ac229a3f9f99143580b5eb08d0fecbdd5ae8c81ef5620187c08060408082528083018061010080516020018083828460045afa905050508051806020830101818260206001820306601f8201039050033682375050805160200160206001820306601f8201039050905090508101905060208201915034825290509050620187c0a3005b3461050b576364bcd73081186101ca5760025460e05260e051156101ac57600160e051600180821061050b5780820390509050600281101561050b57025461010052600354610120526004546101405260606101006101c8566101c8565b60006101005260006101205260006101405260606101006101c8565bf35b63a52e736981186102dd576004358060a01c61050b5760e05260025461050b57600054610100526001546101205260006101405261014060c060006002818352015b60c051602002610100015160e051186102285760018352610238565b815160010180835281141561020c575b5050506101405161050b5761014060006002818352015b3361010061014051600281101561050b576020020151186102c457610140516001818183011061050b578082019050905060025560e0516003557f3dbc538770ecfcda0a15ac4731d922045333e3f55a9dbff4923d5ae950fd4b68336101605260e051610180526040610160a15050506102db565b815160010180835281141561024f57505060006000fd5b005b63d1266a1281186103765760025460e052600060e051111561050b57600160e051600280820690509050600281101561050b570254331861050b5760016004557fb4a2afe1602258539e7638f32a9c55473646a5b004d1a2f76ed802bdd6b3c611600160e051600180821061050b5780820390509050600281101561050b570254610100526003546101205233610140526060610100a1005b631d43f539811861044957600060e05260e060c060006002818352015b60c0515433186103a657600183526103b6565b8151600101808352811415610393575b50505060e0511561050b5760025460e052600061010052600060e05111156103fd57600160e051600180821061050b5780820390509050600281101561050b570254610100525b7f65d4d3bd6f71ee062f64e7b4a0b8f2a379c599a6844765e697f102360580029661010051610120526003546101405233610160526060610120a1600060025560006003556000600455005b63980cbc1481186104df5760016004541861050b57600354331861050b57600254600180821061050b578082039050905060e0527f3f26d618a9f0bbc232d4e0814ca8f1b77fec61eff610a967d549270accd437fc600160e051600281101561050b5702546101005233610120526040610100a133600160e051600281101561050b570255600060025560006003556000600455005b6314bfd6d08118610503576001600435600281101561050b57025460e052602060e0f35b505b60006000fd5b600080fd
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000babe61887f1de2713c6f97e567623453d3c79f67000000000000000000000000745748bcfd8f9c2de519a71d789be8a63dd7d66c
-----Decoded View---------------
Arg [0] : _authorized (address[2]): 0xbabe61887f1de2713c6f97e567623453d3C79f67,0x745748bcFd8F9c2De519a71D789be8A63dd7d66C
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000babe61887f1de2713c6f97e567623453d3c79f67
Arg [1] : 000000000000000000000000745748bcfd8f9c2de519a71d789be8a63dd7d66c
Loading...
Loading
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 34 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
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.