ETH Price: $3,110.00 (-4.81%)
 

Overview

ETH Balance

0.65890203538424514 ETH

Eth Value

$2,049.19 (@ $3,110.00/ETH)

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Execute217437302025-01-31 9:51:2346 hrs ago1738317083IN
0x7A6F5473...F204488a8
0 ETH0.000169792.95275696
Execute217437072025-01-31 9:46:4746 hrs ago1738316807IN
0x7A6F5473...F204488a8
0 ETH0.000422622.9932683
Execute211716262024-11-12 12:33:2381 days ago1731414803IN
0x7A6F5473...F204488a8
0 ETH0.0037205623.92969638
Execute200244562024-06-05 8:32:59242 days ago1717576379IN
0x7A6F5473...F204488a8
0 ETH0.001552259.79172129
Execute200244482024-06-05 8:31:23242 days ago1717576283IN
0x7A6F5473...F204488a8
0 ETH0.0016176510.04441443
Execute200244392024-06-05 8:29:35242 days ago1717576175IN
0x7A6F5473...F204488a8
0 ETH0.0010823410.23266809
Execute199171382024-05-21 8:37:47256 days ago1716280667IN
0x7A6F5473...F204488a8
0 ETH0.000506648.80338409
Execute198690092024-05-14 15:04:35263 days ago1715699075IN
0x7A6F5473...F204488a8
0 ETH0.0016241211.63466067
Execute198689812024-05-14 14:58:59263 days ago1715698739IN
0x7A6F5473...F204488a8
0 ETH0.0039090212.26373577
Execute198689672024-05-14 14:56:11263 days ago1715698571IN
0x7A6F5473...F204488a8
0 ETH0.0015703813.8903599
Execute198689622024-05-14 14:55:11263 days ago1715698511IN
0x7A6F5473...F204488a8
0 ETH0.0020094412.8787762
Execute196816752024-04-18 10:13:35289 days ago1713435215IN
0x7A6F5473...F204488a8
0 ETH0.001438326.14047317
Execute195182342024-03-26 11:11:35312 days ago1711451495IN
0x7A6F5473...F204488a8
0 ETH0.0014729226.76981402
Execute195182072024-03-26 11:06:11312 days ago1711451171IN
0x7A6F5473...F204488a8
0 ETH0.0042959727.53564014
Execute193185132024-02-27 11:12:47340 days ago1709032367IN
0x7A6F5473...F204488a8
0 ETH0.0098148546.82460575
Execute192616362024-02-19 11:59:35348 days ago1708343975IN
0x7A6F5473...F204488a8
0 ETH0.0044882233.2503221
Execute192615202024-02-19 11:35:59348 days ago1708342559IN
0x7A6F5473...F204488a8
0 ETH0.005809633.48029309
Execute190398652024-01-19 8:59:11379 days ago1705654751IN
0x7A6F5473...F204488a8
0 ETH0.0066384120.99576439
Execute190398572024-01-19 8:57:35379 days ago1705654655IN
0x7A6F5473...F204488a8
0 ETH0.0038959921.54935754
Execute181347082023-09-14 13:07:59506 days ago1694696879IN
0x7A6F5473...F204488a8
0 ETH0.0113696935.60005143
Execute181346662023-09-14 12:58:47506 days ago1694696327IN
0x7A6F5473...F204488a8
0 ETH0.0020735515.60698645
Execute181346562023-09-14 12:56:47506 days ago1694696207IN
0x7A6F5473...F204488a8
0 ETH0.0024077215.8379261
Execute175696642023-06-27 8:56:35585 days ago1687856195IN
0x7A6F5473...F204488a8
0 ETH0.0008425414.60259437
Execute175696512023-06-27 8:53:35585 days ago1687856015IN
0x7A6F5473...F204488a8
0 ETH0.0028410814.52015939
Transfer175696112023-06-27 8:45:35585 days ago1687855535IN
0x7A6F5473...F204488a8
8.65377508 ETH0.0003969716.74148369
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block
From
To
217437302025-01-31 9:51:2346 hrs ago1738317083
0x7A6F5473...F204488a8
7 ETH
200244482024-06-05 8:31:23242 days ago1717576283
0x7A6F5473...F204488a8
2.72133867 ETH
199171382024-05-21 8:37:47256 days ago1716280667
0x7A6F5473...F204488a8
3.89831 ETH
198689812024-05-14 14:58:59263 days ago1715698739
0x7A6F5473...F204488a8
3.85064063 ETH
196816752024-04-18 10:13:35289 days ago1713435215
0x7A6F5473...F204488a8
4.63152 ETH
195182342024-03-26 11:11:35312 days ago1711451495
0x7A6F5473...F204488a8
3.88773 ETH
192615202024-02-19 11:35:59348 days ago1708342559
0x7A6F5473...F204488a8
0.00915083 ETH
190398652024-01-19 8:59:11379 days ago1705654751
0x7A6F5473...F204488a8
0.01081233 ETH
190398652024-01-19 8:59:11379 days ago1705654751
0x7A6F5473...F204488a8
3.73929197 ETH
190398572024-01-19 8:57:35379 days ago1705654655
0x7A6F5473...F204488a8
0.00634966 ETH
181347082023-09-14 13:07:59506 days ago1694696879
0x7A6F5473...F204488a8
0.01515625 ETH
181346662023-09-14 12:58:47506 days ago1694696327
0x7A6F5473...F204488a8
0.00281892 ETH
181346562023-09-14 12:56:47506 days ago1694696207
0x7A6F5473...F204488a8
0.0036495 ETH
175696642023-06-27 8:56:35585 days ago1687856195
0x7A6F5473...F204488a8
0.00132339 ETH
175696642023-06-27 8:56:35585 days ago1687856195
0x7A6F5473...F204488a8
0.00066 ETH
175696512023-06-27 8:53:35585 days ago1687856015
0x7A6F5473...F204488a8
0.00447573 ETH
175696512023-06-27 8:53:35585 days ago1687856015
0x7A6F5473...F204488a8
0.00514304 ETH
175690912023-06-27 7:00:23586 days ago1687849223
0x7A6F5473...F204488a8
0.00450808 ETH
175690182023-06-27 6:44:59586 days ago1687848299
0x7A6F5473...F204488a8
0.00122947 ETH
175690182023-06-27 6:44:59586 days ago1687848299
0x7A6F5473...F204488a8
6 ETH
175188852023-06-20 5:39:23593 days ago1687239563
0x7A6F5473...F204488a8
0.00416422 ETH
174878022023-06-15 20:59:11597 days ago1686862751
0x7A6F5473...F204488a8
0.00633247 ETH
172220112023-05-09 9:29:59634 days ago1683624599
0x7A6F5473...F204488a8
0.01469697 ETH
167417562023-03-02 15:26:23702 days ago1677770783
0x7A6F5473...F204488a8
0.00648311 ETH
167417002023-03-02 15:15:11702 days ago1677770111
0x7A6F5473...F204488a8
0.00825736 ETH
View All Internal Transactions
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
/**
 *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

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

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