ETH Price: $2,313.70 (-1.86%)

Contract

0xCD4D4a1955852c6dC2b8fd7E3FEB7724373DB9Cc
 

Overview

ETH Balance

0.000677067685300313 ETH

Eth Value

$1.57 (@ $2,313.70/ETH)

Token Holdings

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Execute239527282025-12-06 8:43:47101 days ago1765010627IN
0xCD4D4a19...4373DB9Cc
0 ETH0.000001670.02599386
Execute239527222025-12-06 8:42:23101 days ago1765010543IN
0xCD4D4a19...4373DB9Cc
0 ETH0.000001920.02361087
Transfer239527172025-12-06 8:41:23101 days ago1765010483IN
0xCD4D4a19...4373DB9Cc
0.00065964 ETH0.000001430.0605
Execute235678442025-10-13 9:16:35155 days ago1760346995IN
0xCD4D4a19...4373DB9Cc
0 ETH0.000020530.3047992
Execute235678392025-10-13 9:15:35155 days ago1760346935IN
0xCD4D4a19...4373DB9Cc
0 ETH0.000021610.32077784
Execute235678382025-10-13 9:15:23155 days ago1760346923IN
0xCD4D4a19...4373DB9Cc
0 ETH0.000020050.29765103
Execute235678342025-10-13 9:14:35155 days ago1760346875IN
0xCD4D4a19...4373DB9Cc
0 ETH0.000021790.32340016
Execute235675672025-10-13 8:21:11155 days ago1760343671IN
0xCD4D4a19...4373DB9Cc
0 ETH0.000013730.20396252
Execute235334222025-10-08 13:47:35160 days ago1759931255IN
0xCD4D4a19...4373DB9Cc
0 ETH0.000033680.48327041
Execute235332462025-10-08 13:11:59160 days ago1759929119IN
0xCD4D4a19...4373DB9Cc
0 ETH0.000147521.74628129
Execute227152172025-06-16 6:11:47274 days ago1750054307IN
0xCD4D4a19...4373DB9Cc
0 ETH0.000039540.42405757
Execute227152132025-06-16 6:10:59274 days ago1750054259IN
0xCD4D4a19...4373DB9Cc
0 ETH0.000110550.47706262
Execute226650602025-06-09 5:53:35281 days ago1749448415IN
0xCD4D4a19...4373DB9Cc
0 ETH0.000046380.58262892
Execute226650562025-06-09 5:52:47281 days ago1749448367IN
0xCD4D4a19...4373DB9Cc
0 ETH0.000072340.56086513
Execute224454722025-05-09 10:59:11312 days ago1746788351IN
0xCD4D4a19...4373DB9Cc
0 ETH0.000705754.81809293
Transfer224454662025-05-09 10:57:59312 days ago1746788279IN
0xCD4D4a19...4373DB9Cc
0.00127754 ETH0.000111254.69195252
Execute219796332025-03-05 8:56:59377 days ago1741165019IN
0xCD4D4a19...4373DB9Cc
0 ETH0.000056310.77610992
Execute218254282025-02-11 19:40:11399 days ago1739302811IN
0xCD4D4a19...4373DB9Cc
0 ETH0.000373774.42551653
Execute212011692024-11-16 15:31:35486 days ago1731771095IN
0xCD4D4a19...4373DB9Cc
0 ETH0.0017471315.07993696
Transfer211633072024-11-11 8:40:11491 days ago1731314411IN
0xCD4D4a19...4373DB9Cc
0.000001 ETH0.0003092613.04239336
Execute190885572024-01-26 4:59:59781 days ago1706245199IN
0xCD4D4a19...4373DB9Cc
0 ETH0.0012032719.99267964
Execute184543902023-10-29 7:36:11870 days ago1698564971IN
0xCD4D4a19...4373DB9Cc
0 ETH0.000913915.18466262
Execute184543852023-10-29 7:35:11870 days ago1698564911IN
0xCD4D4a19...4373DB9Cc
0 ETH0.0027745616.35042825
Execute184481292023-10-28 10:33:47871 days ago1698489227IN
0xCD4D4a19...4373DB9Cc
0 ETH0.0007815512.47016044
Execute177989432023-07-29 13:18:23962 days ago1690636703IN
0xCD4D4a19...4373DB9Cc
0 ETH0.0017287725.66087665
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Method Block
From
To
Transfer224454722025-05-09 10:59:11312 days ago1746788351
0xCD4D4a19...4373DB9Cc
0.00126012 ETH
Transfer219796332025-03-05 8:56:59377 days ago1741165019
0xCD4D4a19...4373DB9Cc
0.00281962 ETH
Transfer218254282025-02-11 19:40:11399 days ago1739302811
0xCD4D4a19...4373DB9Cc
0.00049026 ETH
Transfer212011692024-11-16 15:31:35486 days ago1731771095
0xCD4D4a19...4373DB9Cc
0.00194605 ETH
Transfer190885572024-01-26 4:59:59781 days ago1706245199
0xCD4D4a19...4373DB9Cc
0.00170934 ETH
Transfer190885572024-01-26 4:59:59781 days ago1706245199
0xCD4D4a19...4373DB9Cc
0.045 ETH
Transfer184543902023-10-29 7:36:11870 days ago1698564971
0xCD4D4a19...4373DB9Cc
0.00110331 ETH
Transfer184543902023-10-29 7:36:11870 days ago1698564971
0xCD4D4a19...4373DB9Cc
0.6 ETH
Transfer184543852023-10-29 7:35:11870 days ago1698564911
0xCD4D4a19...4373DB9Cc
0.00386404 ETH
Transfer184543852023-10-29 7:35:11870 days ago1698564911
0xCD4D4a19...4373DB9Cc
0.56131005 ETH
Transfer184481292023-10-28 10:33:47871 days ago1698489227
0xCD4D4a19...4373DB9Cc
0.00090593 ETH
Transfer184481292023-10-28 10:33:47871 days ago1698489227
0xCD4D4a19...4373DB9Cc
0.05 ETH
Transfer177989432023-07-29 13:18:23962 days ago1690636703
0xCD4D4a19...4373DB9Cc
0.00200198 ETH
Transfer177987222023-07-29 12:34:11962 days ago1690634051
0xCD4D4a19...4373DB9Cc
0.00194026 ETH
Transfer177986912023-07-29 12:27:59962 days ago1690633679
0xCD4D4a19...4373DB9Cc
1.105 ETH
Transfer177986832023-07-29 12:26:23962 days ago1690633583
0xCD4D4a19...4373DB9Cc
0.00332082 ETH
Transfer177986832023-07-29 12:26:23962 days ago1690633583
0xCD4D4a19...4373DB9Cc
1.10832315 ETH
Transfer176490142023-07-08 12:22:47983 days ago1688818967
0xCD4D4a19...4373DB9Cc
0.00155084 ETH
Transfer176490142023-07-08 12:22:47983 days ago1688818967
0xCD4D4a19...4373DB9Cc
0.34 ETH
Transfer176489632023-07-08 12:12:35983 days ago1688818355
0xCD4D4a19...4373DB9Cc
0.00450866 ETH
Transfer176489632023-07-08 12:12:35983 days ago1688818355
0xCD4D4a19...4373DB9Cc
0.49391551 ETH
Transfer176120922023-07-03 7:55:23988 days ago1688370923
0xCD4D4a19...4373DB9Cc
0.00194767 ETH
Transfer176120792023-07-03 7:52:47988 days ago1688370767
0xCD4D4a19...4373DB9Cc
0.0025394 ETH
Transfer175334762023-06-22 6:46:59999 days ago1687416419
0xCD4D4a19...4373DB9Cc
0.00109824 ETH
Transfer175334762023-06-22 6:46:59999 days ago1687416419
0xCD4D4a19...4373DB9Cc
0.001 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
0xCD4D4a1955852c6dC2b8fd7E3FEB7724373DB9Cc
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.