ETH Price: $2,718.01 (+1.85%)

Contract

0x0da56CDC96F75E2e3B27c643a2d9c574628A1172
 

Overview

ETH Balance

0.260145823582657067 ETH

Eth Value

$707.08 (@ $2,718.01/ETH)

Token Holdings

Multichain Info

1 address found via
Transaction Hash
Method
Block
From
To
Execute218785132025-02-19 6:06:4719 hrs ago1739945207IN
0x0da56CDC...4628A1172
0 ETH0.000077520.85141978
Execute218785112025-02-19 6:06:2319 hrs ago1739945183IN
0x0da56CDC...4628A1172
0 ETH0.000245840.75019939
Execute218635472025-02-17 3:52:592 days ago1739764379IN
0x0da56CDC...4628A1172
0 ETH0.000072380.77383127
Execute218635452025-02-17 3:52:352 days ago1739764355IN
0x0da56CDC...4628A1172
0 ETH0.000274680.84244035
Execute218359852025-02-13 7:10:356 days ago1739430635IN
0x0da56CDC...4628A1172
0 ETH0.000082580.95329478
Execute217921962025-02-07 4:18:1112 days ago1738901891IN
0x0da56CDC...4628A1172
0 ETH0.000104191.11446832
Execute217921942025-02-07 4:17:4712 days ago1738901867IN
0x0da56CDC...4628A1172
0 ETH0.000200611.13109534
Execute217419502025-01-31 3:52:3519 days ago1738295555IN
0x0da56CDC...4628A1172
0 ETH0.000129321.38242339
Execute217419472025-01-31 3:51:5919 days ago1738295519IN
0x0da56CDC...4628A1172
0 ETH0.000383621.19984663
Execute216915382025-01-24 3:01:2326 days ago1737687683IN
0x0da56CDC...4628A1172
0 ETH0.000523455.7491131
Execute216915352025-01-24 3:00:4726 days ago1737687647IN
0x0da56CDC...4628A1172
0 ETH0.001470155.92406136
Execute216748052025-01-21 18:58:5929 days ago1737485939IN
0x0da56CDC...4628A1172
0 ETH0.0019736921.6772929
Execute216748032025-01-21 18:58:3529 days ago1737485915IN
0x0da56CDC...4628A1172
0 ETH0.004967819.70460117
Execute216521742025-01-18 15:09:1132 days ago1737212951IN
0x0da56CDC...4628A1172
0 ETH0.0026103527.90718462
Execute216521702025-01-18 15:08:2332 days ago1737212903IN
0x0da56CDC...4628A1172
0 ETH0.009029928.09054681
Execute216346062025-01-16 4:17:5934 days ago1737001079IN
0x0da56CDC...4628A1172
0 ETH0.000232052.48099545
Execute216346022025-01-16 4:16:5934 days ago1737001019IN
0x0da56CDC...4628A1172
0 ETH0.000794792.51838412
Execute214013862024-12-14 14:35:3567 days ago1734186935IN
0x0da56CDC...4628A1172
0 ETH0.00092699.9138607
Execute214013332024-12-14 14:24:3567 days ago1734186275IN
0x0da56CDC...4628A1172
0 ETH0.001508048.22994626
Execute213637352024-12-09 8:25:3572 days ago1733732735IN
0x0da56CDC...4628A1172
0 ETH0.000827479.09111622
Execute213637282024-12-09 8:24:1172 days ago1733732651IN
0x0da56CDC...4628A1172
0 ETH0.002034828.15255553
Execute213457102024-12-06 20:01:1175 days ago1733515271IN
0x0da56CDC...4628A1172
0 ETH0.0026082828.6508748
Execute213457072024-12-06 20:00:3575 days ago1733515235IN
0x0da56CDC...4628A1172
0 ETH0.0073705729.36380156
Execute213281022024-12-04 9:00:4777 days ago1733302847IN
0x0da56CDC...4628A1172
0 ETH0.0015483817.01277878
Execute213280992024-12-04 9:00:1177 days ago1733302811IN
0x0da56CDC...4628A1172
0 ETH0.0044025316.57275357
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block
From
To
218785132025-02-19 6:06:4719 hrs ago1739945207
0x0da56CDC...4628A1172
0.00054991 ETH
218785112025-02-19 6:06:2319 hrs ago1739945183
0x0da56CDC...4628A1172
0.0013869 ETH
218635472025-02-17 3:52:592 days ago1739764379
0x0da56CDC...4628A1172
0.00039578 ETH
218635452025-02-17 3:52:352 days ago1739764355
0x0da56CDC...4628A1172
0.00157958 ETH
218359852025-02-13 7:10:356 days ago1739430635
0x0da56CDC...4628A1172
0.00040708 ETH
217921962025-02-07 4:18:1112 days ago1738901891
0x0da56CDC...4628A1172
0.00045667 ETH
217921942025-02-07 4:17:4712 days ago1738901867
0x0da56CDC...4628A1172
0.00101908 ETH
217419502025-01-31 3:52:3519 days ago1738295555
0x0da56CDC...4628A1172
0.00040757 ETH
217419472025-01-31 3:51:5919 days ago1738295519
0x0da56CDC...4628A1172
0.00184358 ETH
216915382025-01-24 3:01:2326 days ago1737687683
0x0da56CDC...4628A1172
0.00107866 ETH
216915352025-01-24 3:00:4726 days ago1737687647
0x0da56CDC...4628A1172
0.00267297 ETH
216748052025-01-21 18:58:5929 days ago1737485939
0x0da56CDC...4628A1172
0.00324076 ETH
216748032025-01-21 18:58:3529 days ago1737485915
0x0da56CDC...4628A1172
0.00835412 ETH
216521742025-01-18 15:09:1132 days ago1737212951
0x0da56CDC...4628A1172
0.00426713 ETH
216521702025-01-18 15:08:2332 days ago1737212903
0x0da56CDC...4628A1172
0.01423318 ETH
216346062025-01-16 4:17:5934 days ago1737001079
0x0da56CDC...4628A1172
0.00061383 ETH
216346022025-01-16 4:16:5934 days ago1737001019
0x0da56CDC...4628A1172
0.00182176 ETH
214013862024-12-14 14:35:3567 days ago1734186935
0x0da56CDC...4628A1172
0.00169078 ETH
214013332024-12-14 14:24:3567 days ago1734186275
0x0da56CDC...4628A1172
0.00274948 ETH
213637352024-12-09 8:25:3572 days ago1733732735
0x0da56CDC...4628A1172
0.00138131 ETH
213637282024-12-09 8:24:1172 days ago1733732651
0x0da56CDC...4628A1172
0.0035572 ETH
213457102024-12-06 20:01:1175 days ago1733515271
0x0da56CDC...4628A1172
0.0043188 ETH
213457072024-12-06 20:00:3575 days ago1733515235
0x0da56CDC...4628A1172
0.01027799 ETH
213281022024-12-04 9:00:4777 days ago1733302847
0x0da56CDC...4628A1172
0.00263991 ETH
213280992024-12-04 9:00:1177 days ago1733302811
0x0da56CDC...4628A1172
0.00699246 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.