CELO Price: $1.26 (-2.71%)
Gas: 5 GWei

Contract

0x56bc95Ded2BEF162131905dfd600F2b9F1B380a4

Overview

CELO Balance

Celo Chain LogoCelo Chain LogoCelo Chain Logo0 CELO

CELO Value

$0.00

Multichain Info

N/A
Transaction Hash
Method
Block
From
To
Value
Execute183004732023-03-18 20:15:28376 days ago1679170528IN
0x56bc95De...9F1B380a4
0 CELO0.0048137225
Execute166667292022-12-14 7:07:59471 days ago1671001679IN
0x56bc95De...9F1B380a4
0 CELO0.000039250.5
Execute161654672022-11-15 6:55:35500 days ago1668495335IN
0x56bc95De...9F1B380a4
0 CELO0.000031430.5
Execute161654572022-11-15 6:54:45500 days ago1668495285IN
0x56bc95De...9F1B380a4
0 CELO0.000096240.5
Execute161654482022-11-15 6:54:00500 days ago1668495240IN
0x56bc95De...9F1B380a4
0 CELO0.000095860.5

Latest 1 internal transaction

Parent Txn Hash Block From To Value
127024742022-04-27 20:25:23701 days ago1651091123  Contract Creation0 CELO
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Vyper_contract

Compiler Version
vyper:0.3.1

Optimization Enabled:
N/A

Other Settings:
None license

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

Contract ABI

[{"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

61056e6020816080396080518060a01c6105695760e0526020602082016080396080518060a01c61056957610100525060e0516000556101005160015561055156600436101561000d57610505565b60046000601c37600051631cff79cd811861014e576004358060a01c61050b5760e052602435600401620186a081351161050b578080356020018082610100375050506000620187c052620187c060c060006002818352015b60c0515433186100795760018352610089565b8151600101808352811415610066575b505050620187c0511561050b576101005060006000610100516101203460e0515af16100ba573d600060003e3d6000fd5b60e051337fcaac11c45e5fdb5c513e20ac229a3f9f99143580b5eb08d0fecbdd5ae8c81ef5620187c08060408082528083018061010080516020018083828460045afa905050508051806020830101818260206001820306601f8201039050033682375050805160200160206001820306601f8201039050905090508101905060208201915034825290509050620187c0a3005b3461050b576364bcd73081186101ca5760025460e05260e051156101ac57600160e051600180821061050b5780820390509050600281101561050b57025461010052600354610120526004546101405260606101006101c8566101c8565b60006101005260006101205260006101405260606101006101c8565bf35b63a52e736981186102dd576004358060a01c61050b5760e05260025461050b57600054610100526001546101205260006101405261014060c060006002818352015b60c051602002610100015160e051186102285760018352610238565b815160010180835281141561020c575b5050506101405161050b5761014060006002818352015b3361010061014051600281101561050b576020020151186102c457610140516001818183011061050b578082019050905060025560e0516003557f3dbc538770ecfcda0a15ac4731d922045333e3f55a9dbff4923d5ae950fd4b68336101605260e051610180526040610160a15050506102db565b815160010180835281141561024f57505060006000fd5b005b63d1266a1281186103765760025460e052600060e051111561050b57600160e051600280820690509050600281101561050b570254331861050b5760016004557fb4a2afe1602258539e7638f32a9c55473646a5b004d1a2f76ed802bdd6b3c611600160e051600180821061050b5780820390509050600281101561050b570254610100526003546101205233610140526060610100a1005b631d43f539811861044957600060e05260e060c060006002818352015b60c0515433186103a657600183526103b6565b8151600101808352811415610393575b50505060e0511561050b5760025460e052600061010052600060e05111156103fd57600160e051600180821061050b5780820390509050600281101561050b570254610100525b7f65d4d3bd6f71ee062f64e7b4a0b8f2a379c599a6844765e697f102360580029661010051610120526003546101405233610160526060610120a1600060025560006003556000600455005b63980cbc1481186104df5760016004541861050b57600354331861050b57600254600180821061050b578082039050905060e0527f3f26d618a9f0bbc232d4e0814ca8f1b77fec61eff610a967d549270accd437fc600160e051600281101561050b5702546101005233610120526040610100a133600160e051600281101561050b570255600060025560006003556000600455005b6314bfd6d08118610503576001600435600281101561050b57025460e052602060e0f35b505b60006000fd5b600080fd5b61004161055103610041600039610041610551036000f35b600080fd000000000000000000000000745748bcfd8f9c2de519a71d789be8a63dd7d66c000000000000000000000000babe61887f1de2713c6f97e567623453d3c79f67

Deployed Bytecode

0x600436101561000d57610505565b60046000601c37600051631cff79cd811861014e576004358060a01c61050b5760e052602435600401620186a081351161050b578080356020018082610100375050506000620187c052620187c060c060006002818352015b60c0515433186100795760018352610089565b8151600101808352811415610066575b505050620187c0511561050b576101005060006000610100516101203460e0515af16100ba573d600060003e3d6000fd5b60e051337fcaac11c45e5fdb5c513e20ac229a3f9f99143580b5eb08d0fecbdd5ae8c81ef5620187c08060408082528083018061010080516020018083828460045afa905050508051806020830101818260206001820306601f8201039050033682375050805160200160206001820306601f8201039050905090508101905060208201915034825290509050620187c0a3005b3461050b576364bcd73081186101ca5760025460e05260e051156101ac57600160e051600180821061050b5780820390509050600281101561050b57025461010052600354610120526004546101405260606101006101c8566101c8565b60006101005260006101205260006101405260606101006101c8565bf35b63a52e736981186102dd576004358060a01c61050b5760e05260025461050b57600054610100526001546101205260006101405261014060c060006002818352015b60c051602002610100015160e051186102285760018352610238565b815160010180835281141561020c575b5050506101405161050b5761014060006002818352015b3361010061014051600281101561050b576020020151186102c457610140516001818183011061050b578082019050905060025560e0516003557f3dbc538770ecfcda0a15ac4731d922045333e3f55a9dbff4923d5ae950fd4b68336101605260e051610180526040610160a15050506102db565b815160010180835281141561024f57505060006000fd5b005b63d1266a1281186103765760025460e052600060e051111561050b57600160e051600280820690509050600281101561050b570254331861050b5760016004557fb4a2afe1602258539e7638f32a9c55473646a5b004d1a2f76ed802bdd6b3c611600160e051600180821061050b5780820390509050600281101561050b570254610100526003546101205233610140526060610100a1005b631d43f539811861044957600060e05260e060c060006002818352015b60c0515433186103a657600183526103b6565b8151600101808352811415610393575b50505060e0511561050b5760025460e052600061010052600060e05111156103fd57600160e051600180821061050b5780820390509050600281101561050b570254610100525b7f65d4d3bd6f71ee062f64e7b4a0b8f2a379c599a6844765e697f102360580029661010051610120526003546101405233610160526060610120a1600060025560006003556000600455005b63980cbc1481186104df5760016004541861050b57600354331861050b57600254600180821061050b578082039050905060e0527f3f26d618a9f0bbc232d4e0814ca8f1b77fec61eff610a967d549270accd437fc600160e051600281101561050b5702546101005233610120526040610100a133600160e051600281101561050b570255600060025560006003556000600455005b6314bfd6d08118610503576001600435600281101561050b57025460e052602060e0f35b505b60006000fd5b600080fd

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

000000000000000000000000745748bcfd8f9c2de519a71d789be8a63dd7d66c000000000000000000000000babe61887f1de2713c6f97e567623453d3c79f67

-----Decoded View---------------
Arg [0] : _authorized (address[2]): 0x745748bcFd8F9c2De519a71D789be8A63dd7d66C,0xbabe61887f1de2713c6f97e567623453d3C79f67

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000745748bcfd8f9c2de519a71d789be8a63dd7d66c
Arg [1] : 000000000000000000000000babe61887f1de2713c6f97e567623453d3c79f67


Block Transaction Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Txn Hash Block Value Eth2 PubKey Valid
View All Deposits
[ 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.