GLMR Price: $0.077687 (+10.32%)

Contract

0x114C4042B11a2b16F58Fe1BFe847589a122F678a

Overview

GLMR Balance

Moonbeam Chain LogoMoonbeam Chain LogoMoonbeam Chain Logo0 GLMR

GLMR Value

$0.00

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Execute16371642022-08-12 14:04:18984 days ago1660313058IN
0x114C4042...a122F678a
0 GLMR0.0083751100
Execute16371542022-08-12 14:02:18984 days ago1660312938IN
0x114C4042...a122F678a
0 GLMR0.0083811100
Execute16371512022-08-12 14:01:42984 days ago1660312902IN
0x114C4042...a122F678a
0 GLMR0.0082769100

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

Optimization Enabled:
N/A

Other Settings:
default evmVersion, 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

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}]

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


Block Transaction Gas Used Reward
view all blocks collator

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

Validator Index Block Amount
View All Withdrawals

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