ETH Price: $1,993.83 (+2.58%)
 

Overview

ETH Balance

0.023870385338498756 ETH

Eth Value

$47.59 (@ $1,993.83/ETH)

More Info

Private Name Tags

Multichain Info

Transaction Hash
Method
Block
From
To
Execute237901082025-11-13 11:52:35109 days ago1763034755IN
ENS Name 0x7777mcdonalds.eth
0 ETH0.00000670.08719998
Execute220675622025-03-17 15:40:23350 days ago1742226023IN
ENS Name 0x7777mcdonalds.eth
0 ETH0.000069770.91971357
Execute220672312025-03-17 14:33:23350 days ago1742222003IN
ENS Name 0x7777mcdonalds.eth
0 ETH0.000057880.76289507
Execute217149542025-01-27 9:25:59399 days ago1737969959IN
ENS Name 0x7777mcdonalds.eth
0 ETH0.007354296.99710884
Execute214811782024-12-25 18:08:35432 days ago1735150115IN
ENS Name 0x7777mcdonalds.eth
0 ETH0.000397865.60443088
Execute214811702024-12-25 18:06:59432 days ago1735150019IN
ENS Name 0x7777mcdonalds.eth
0 ETH0.000402925.49937262
Execute212128142024-11-18 6:28:59470 days ago1731911339IN
ENS Name 0x7777mcdonalds.eth
0 ETH0.0007637110.04245186
Execute212123222024-11-18 4:50:35470 days ago1731905435IN
ENS Name 0x7777mcdonalds.eth
0 ETH0.0017820310.4114282
Execute210797982024-10-30 16:59:35488 days ago1730307575IN
ENS Name 0x7777mcdonalds.eth
0 ETH0.0011463415.49372273
Execute210725152024-10-29 16:34:11489 days ago1730219651IN
ENS Name 0x7777mcdonalds.eth
0 ETH0.0014146219.31257678
Execute210701752024-10-29 8:43:59489 days ago1730191439IN
ENS Name 0x7777mcdonalds.eth
0 ETH0.000586267.91656354
Execute210701742024-10-29 8:43:47489 days ago1730191427IN
ENS Name 0x7777mcdonalds.eth
0 ETH0.000677428.03572648
Execute210701532024-10-29 8:39:35489 days ago1730191175IN
ENS Name 0x7777mcdonalds.eth
0 ETH0.000455037.59376466
Execute210701512024-10-29 8:39:11489 days ago1730191151IN
ENS Name 0x7777mcdonalds.eth
0 ETH0.00056937.77343871
Execute210649392024-10-28 15:10:59490 days ago1730128259IN
ENS Name 0x7777mcdonalds.eth
0 ETH0.0014472517.81043782
Execute210479062024-10-26 6:07:47493 days ago1729922867IN
ENS Name 0x7777mcdonalds.eth
0 ETH0.001415594.28244589
Execute210478732024-10-26 6:01:11493 days ago1729922471IN
ENS Name 0x7777mcdonalds.eth
0 ETH0.000436376.11839708
Execute210478702024-10-26 6:00:35493 days ago1729922435IN
ENS Name 0x7777mcdonalds.eth
0 ETH0.002006936.11983956
Execute210478602024-10-26 5:58:35493 days ago1729922315IN
ENS Name 0x7777mcdonalds.eth
0 ETH0.000403865.66306731
Execute210422272024-10-25 11:07:11493 days ago1729854431IN
ENS Name 0x7777mcdonalds.eth
0 ETH0.000637055.34707429
Execute210420712024-10-25 10:35:47493 days ago1729852547IN
ENS Name 0x7777mcdonalds.eth
0 ETH0.000901576.82249382
Execute210420692024-10-25 10:35:23493 days ago1729852523IN
ENS Name 0x7777mcdonalds.eth
0 ETH0.000599617.03733325
Execute210373162024-10-24 18:41:11494 days ago1729795271IN
ENS Name 0x7777mcdonalds.eth
0 ETH0.0008307610.22521203
Execute210361782024-10-24 14:52:35494 days ago1729781555IN
ENS Name 0x7777mcdonalds.eth
0 ETH0.005926714.09021082
Execute210361772024-10-24 14:52:23494 days ago1729781543IN
ENS Name 0x7777mcdonalds.eth
0 ETH0.0011235913.8744392
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Method Block
From
To
Transfer212123222024-11-18 4:50:35470 days ago1731905435
ENS Name 0x7777mcdonalds.eth
0.00033722 ETH
Multicall212123222024-11-18 4:50:35470 days ago1731905435
ENS Name 0x7777mcdonalds.eth
0.06485675 ETH
Transfer210701532024-10-29 8:39:35489 days ago1730191175
ENS Name 0x7777mcdonalds.eth
0.8 ETH
Transfer210479062024-10-26 6:07:47493 days ago1729922867
ENS Name 0x7777mcdonalds.eth
0.00012178 ETH
Register210479062024-10-26 6:07:47493 days ago1729922867
ENS Name 0x7777mcdonalds.eth
0.00621112 ETH
Transfer210478702024-10-26 6:00:35493 days ago1729922435
ENS Name 0x7777mcdonalds.eth
0.00012178 ETH
Register210478702024-10-26 6:00:35493 days ago1729922435
ENS Name 0x7777mcdonalds.eth
0.00621112 ETH
0x000001ad210422272024-10-25 11:07:11493 days ago1729854431
ENS Name 0x7777mcdonalds.eth
0.45 ETH
Transfer210361782024-10-24 14:52:35494 days ago1729781555
ENS Name 0x7777mcdonalds.eth
1.33464669 ETH
Transfer*209443132024-10-11 18:57:47507 days ago1728673067
ENS Name 0x7777mcdonalds.eth
0.005 ETH
Transfer209258312024-10-09 5:05:59510 days ago1728450359
ENS Name 0x7777mcdonalds.eth
0.4 ETH
Transfer207150382024-09-09 19:07:23539 days ago1725908843
ENS Name 0x7777mcdonalds.eth
0.1 ETH
Transfer205758242024-08-21 8:32:35558 days ago1724229155
ENS Name 0x7777mcdonalds.eth
0.00064741 ETH
Execute205758242024-08-21 8:32:35558 days ago1724229155
ENS Name 0x7777mcdonalds.eth
0.11675793 ETH
Transfer205755372024-08-21 7:34:59558 days ago1724225699
ENS Name 0x7777mcdonalds.eth
0.00359226 ETH
Execute205755372024-08-21 7:34:59558 days ago1724225699
ENS Name 0x7777mcdonalds.eth
0.81234401 ETH
Transfer205125202024-08-12 12:25:47567 days ago1723465547
ENS Name 0x7777mcdonalds.eth
1 ETH
Transfer205113672024-08-12 8:33:23567 days ago1723451603
ENS Name 0x7777mcdonalds.eth
1 ETH
Execute204404932024-08-02 11:14:23577 days ago1722597263
ENS Name 0x7777mcdonalds.eth
0.05 ETH
Execute204329812024-08-01 10:04:11578 days ago1722506651
ENS Name 0x7777mcdonalds.eth
0.1 ETH
Execute204273292024-07-31 15:08:11579 days ago1722438491
ENS Name 0x7777mcdonalds.eth
0.25 ETH
Transfer204006952024-07-27 21:53:23583 days ago1722117203
ENS Name 0x7777mcdonalds.eth
0.00024369 ETH
Register204006952024-07-27 21:53:23583 days ago1722117203
ENS Name 0x7777mcdonalds.eth
0.01242833 ETH
Transfer203985332024-07-27 14:38:23583 days ago1722091103
ENS Name 0x7777mcdonalds.eth
0.5 ETH
Multicall202993972024-07-13 18:33:47597 days ago1720895627
ENS Name 0x7777mcdonalds.eth
0.05 ETH
View All Internal Transactions
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading

Minimal Proxy Contract for 0x2a2b85eb1054d6f0c6c2e37da05ed3e5fea684ef

Contract Name:
Identity

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-11-14
*/

pragma solidity 0.8.7;

// @TODO: Formatting
library LibBytes {
  // @TODO: see if we can just set .length = 
  function trimToSize(bytes memory b, uint newLen)
    internal
    pure
  {
    require(b.length > newLen, "BytesLib: only shrinking");
    assembly {
      mstore(b, newLen)
    }
  }


  /***********************************|
  |        Read Bytes Functions       |
  |__________________________________*/

  /**
   * @dev Reads a bytes32 value from a position in a byte array.
   * @param b Byte array containing a bytes32 value.
   * @param index Index in byte array of bytes32 value.
   * @return result bytes32 value from byte array.
   */
  function readBytes32(
    bytes memory b,
    uint256 index
  )
    internal
    pure
    returns (bytes32 result)
  {
    // Arrays are prefixed by a 256 bit length parameter
    index += 32;

    require(b.length >= index, "BytesLib: length");

    // Read the bytes32 from array memory
    assembly {
      result := mload(add(b, index))
    }
    return result;
  }
}



interface IERC1271Wallet {
	function isValidSignature(bytes32 hash, bytes calldata signature) external view returns (bytes4 magicValue);
}

library SignatureValidator {
	using LibBytes for bytes;

	enum SignatureMode {
		EIP712,
		EthSign,
		SmartWallet,
		Spoof
	}

	// bytes4(keccak256("isValidSignature(bytes32,bytes)"))
	bytes4 constant internal ERC1271_MAGICVALUE_BYTES32 = 0x1626ba7e;

	function recoverAddr(bytes32 hash, bytes memory sig) internal view returns (address) {
		return recoverAddrImpl(hash, sig, false);
	}

	function recoverAddrImpl(bytes32 hash, bytes memory sig, bool allowSpoofing) internal view returns (address) {
		require(sig.length >= 1, "SV_SIGLEN");
		uint8 modeRaw;
		unchecked { modeRaw = uint8(sig[sig.length - 1]); }
		SignatureMode mode = SignatureMode(modeRaw);

		// {r}{s}{v}{mode}
		if (mode == SignatureMode.EIP712 || mode == SignatureMode.EthSign) {
			require(sig.length == 66, "SV_LEN");
			bytes32 r = sig.readBytes32(0);
			bytes32 s = sig.readBytes32(32);
			uint8 v = uint8(sig[64]);
			// Hesitant about this check: seems like this is something that has no business being checked on-chain
			require(v == 27 || v == 28, "SV_INVALID_V");
			if (mode == SignatureMode.EthSign) hash = keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash));
			address signer = ecrecover(hash, v, r, s);
			require(signer != address(0), "SV_ZERO_SIG");
			return signer;
		// {sig}{verifier}{mode}
		} else if (mode == SignatureMode.SmartWallet) {
			// 32 bytes for the addr, 1 byte for the type = 33
			require(sig.length > 33, "SV_LEN_WALLET");
			uint newLen;
			unchecked {
				newLen = sig.length - 33;
			}
			IERC1271Wallet wallet = IERC1271Wallet(address(uint160(uint256(sig.readBytes32(newLen)))));
			sig.trimToSize(newLen);
			require(ERC1271_MAGICVALUE_BYTES32 == wallet.isValidSignature(hash, sig), "SV_WALLET_INVALID");
			return address(wallet);
		// {address}{mode}; the spoof mode is used when simulating calls
		} else if (mode == SignatureMode.Spoof && allowSpoofing) {
			require(tx.origin == address(1), "SV_SPOOF_ORIGIN");
			require(sig.length == 33, "SV_SPOOF_LEN");
			sig.trimToSize(32);
			return abi.decode(sig, (address));
		} else revert("SV_SIGMODE");
	}
}


contract Identity {
	mapping (address => bytes32) public privileges;
	// The next allowed nonce
	uint public nonce;

	// Events
	event LogPrivilegeChanged(address indexed addr, bytes32 priv);
	event LogErr(address indexed to, uint value, bytes data, bytes returnData); // only used in tryCatch

	// Transaction structure
	// we handle replay protection separately by requiring (address(this), chainID, nonce) as part of the sig
	struct Transaction {
		address to;
		uint value;
		bytes data;
	}

	constructor(address[] memory addrs) {
		uint len = addrs.length;
		for (uint i=0; i<len; i++) {
			// @TODO should we allow setting to any arb value here?
			privileges[addrs[i]] = bytes32(uint(1));
			emit LogPrivilegeChanged(addrs[i], bytes32(uint(1)));
		}
	}

	// This contract can accept ETH without calldata
	receive() external payable {}

	// This contract can accept ETH with calldata
	// However, to support EIP 721 and EIP 1155, we need to respond to those methods with their own method signature
	fallback() external payable {
		bytes4 method = msg.sig;
		if (
			method == 0x150b7a02 // bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))
				|| method == 0xf23a6e61 // bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))
				|| method == 0xbc197c81 // bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))
		) {
			// Copy back the method
			// solhint-disable-next-line no-inline-assembly
			assembly {
				calldatacopy(0, 0, 0x04)
				return (0, 0x20)
			}
		}
	}

	function setAddrPrivilege(address addr, bytes32 priv)
		external
	{
		require(msg.sender == address(this), 'ONLY_IDENTITY_CAN_CALL');
		// Anti-bricking measure: if the privileges slot is used for special data (not 0x01),
		// don't allow to set it to true
		if (uint(privileges[addr]) > 1) require(priv != bytes32(uint(1)), 'UNSETTING_SPECIAL_DATA');
		privileges[addr] = priv;
		emit LogPrivilegeChanged(addr, priv);
	}

	function tipMiner(uint amount)
		external
	{
		require(msg.sender == address(this), 'ONLY_IDENTITY_CAN_CALL');
		// See https://docs.flashbots.net/flashbots-auction/searchers/advanced/coinbase-payment/#managing-payments-to-coinbaseaddress-when-it-is-a-contract
		// generally this contract is reentrancy proof cause of the nonce
		executeCall(block.coinbase, amount, new bytes(0));
	}

	function tryCatch(address to, uint value, bytes calldata data)
		external
	{
		require(msg.sender == address(this), 'ONLY_IDENTITY_CAN_CALL');
		(bool success, bytes memory returnData) = to.call{value: value, gas: gasleft()}(data);
		if (!success) emit LogErr(to, value, data, returnData);
	}


	// WARNING: if the signature of this is changed, we have to change IdentityFactory
	function execute(Transaction[] calldata txns, bytes calldata signature)
		external
	{
		require(txns.length > 0, 'MUST_PASS_TX');
		uint currentNonce = nonce;
		// NOTE: abi.encode is safer than abi.encodePacked in terms of collision safety
		bytes32 hash = keccak256(abi.encode(address(this), block.chainid, currentNonce, txns));
		// We have to increment before execution cause it protects from reentrancies
		nonce = currentNonce + 1;

		address signer = SignatureValidator.recoverAddrImpl(hash, signature, true);
		require(privileges[signer] != bytes32(0), 'INSUFFICIENT_PRIVILEGE');
		uint len = txns.length;
		for (uint i=0; i<len; i++) {
			Transaction memory txn = txns[i];
			executeCall(txn.to, txn.value, txn.data);
		}
		// The actual anti-bricking mechanism - do not allow a signer to drop their own priviledges
		require(privileges[signer] != bytes32(0), 'PRIVILEGE_NOT_DOWNGRADED');
	}

	// no need for nonce management here cause we're not dealing with sigs
	function executeBySender(Transaction[] calldata txns) external {
		require(txns.length > 0, 'MUST_PASS_TX');
		require(privileges[msg.sender] != bytes32(0), 'INSUFFICIENT_PRIVILEGE');
		uint len = txns.length;
		for (uint i=0; i<len; i++) {
			Transaction memory txn = txns[i];
			executeCall(txn.to, txn.value, txn.data);
		}
		// again, anti-bricking
		require(privileges[msg.sender] != bytes32(0), 'PRIVILEGE_NOT_DOWNGRADED');
	}

	function executeBySelf(Transaction[] calldata txns) external {
		require(msg.sender == address(this), 'ONLY_IDENTITY_CAN_CALL');
		require(txns.length > 0, 'MUST_PASS_TX');
		uint len = txns.length;
		for (uint i=0; i<len; i++) {
			Transaction memory txn = txns[i];
			executeCall(txn.to, txn.value, txn.data);
		}
	}

	// we shouldn't use address.call(), cause: https://github.com/ethereum/solidity/issues/2884
	// copied from https://github.com/uport-project/uport-identity/blob/develop/contracts/Proxy.sol
	// there's also
	// https://github.com/gnosis/MultiSigWallet/commit/e1b25e8632ca28e9e9e09c81bd20bf33fdb405ce
	// https://github.com/austintgriffith/bouncer-proxy/blob/master/BouncerProxy/BouncerProxy.sol
	// https://github.com/gnosis/safe-contracts/blob/7e2eeb3328bb2ae85c36bc11ea6afc14baeb663c/contracts/base/Executor.sol
	function executeCall(address to, uint256 value, bytes memory data)
		internal
	{
		assembly {
			let result := call(gas(), to, value, add(data, 0x20), mload(data), 0, 0)

			switch result case 0 {
				let size := returndatasize()
				let ptr := mload(0x40)
				returndatacopy(ptr, 0, size)
				revert(ptr, size)
			}
			default {}
		}
		// A single call consumes around 477 more gas with the pure solidity version, for whatever reason
		// WARNING: do not use this, it corrupts the returnData string (returns it in a slightly different format)
		//(bool success, bytes memory returnData) = to.call{value: value, gas: gasleft()}(data);
		//if (!success) revert(string(data));
	}

	// EIP 1271 implementation
	// see https://eips.ethereum.org/EIPS/eip-1271
	function isValidSignature(bytes32 hash, bytes calldata signature) external view returns (bytes4) {
		if (privileges[SignatureValidator.recoverAddr(hash, signature)] != bytes32(0)) {
			// bytes4(keccak256("isValidSignature(bytes32,bytes)")
			return 0x1626ba7e;
		} else {
			return 0xffffffff;
		}
	}

	// EIP 1155 implementation
	// we pretty much only need to signal that we support the interface for 165, but for 1155 we also need the fallback function
	function supportsInterface(bytes4 interfaceID) external pure returns (bool) {
		return
			interfaceID == 0x01ffc9a7 ||    // ERC-165 support (i.e. `bytes4(keccak256('supportsInterface(bytes4)'))`).
			interfaceID == 0x4e2312e0;      // ERC-1155 `ERC1155TokenReceiver` support (i.e. `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)")) ^ bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))`).
	}
}

Contract ABI

API
[{"inputs":[{"internalType":"address[]","name":"addrs","type":"address[]"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"},{"indexed":false,"internalType":"bytes","name":"returnData","type":"bytes"}],"name":"LogErr","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"addr","type":"address"},{"indexed":false,"internalType":"bytes32","name":"priv","type":"bytes32"}],"name":"LogPrivilegeChanged","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[{"components":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"internalType":"struct Identity.Transaction[]","name":"txns","type":"tuple[]"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"execute","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"internalType":"struct Identity.Transaction[]","name":"txns","type":"tuple[]"}],"name":"executeBySelf","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"internalType":"struct Identity.Transaction[]","name":"txns","type":"tuple[]"}],"name":"executeBySender","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"hash","type":"bytes32"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"isValidSignature","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nonce","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"privileges","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"bytes32","name":"priv","type":"bytes32"}],"name":"setAddrPrivilege","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceID","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"tipMiner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"tryCatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading
0x77777777789A8BBEE6C64381e5E89E501fb0e4c8
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ 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.