ETH Price: $2,011.65 (+4.77%)
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Execute175940542023-06-30 19:04:47974 days ago1688151887IN
0xaC44B58d...7EAE57ee1
0 ETH0.0017259734.01875292
Execute173504682023-05-27 12:44:351008 days ago1685191475IN
0xaC44B58d...7EAE57ee1
0 ETH0.0040906424.73526362
Execute173504522023-05-27 12:41:231008 days ago1685191283IN
0xaC44B58d...7EAE57ee1
0 ETH0.0030716524.02264654
Execute170582692023-04-16 8:25:471049 days ago1681633547IN
0xaC44B58d...7EAE57ee1
0 ETH0.0017510325.02225699
Execute170582642023-04-16 8:24:471049 days ago1681633487IN
0xaC44B58d...7EAE57ee1
0 ETH0.0048337524.27280852
Execute170582542023-04-16 8:22:471049 days ago1681633367IN
0xaC44B58d...7EAE57ee1
0 ETH0.0037589925.36775089
Execute170582482023-04-16 8:21:351049 days ago1681633295IN
0xaC44B58d...7EAE57ee1
0 ETH0.0107035826.39562595
Execute170582022023-04-16 8:12:231049 days ago1681632743IN
0xaC44B58d...7EAE57ee1
0 ETH0.0042706822.82542316
Execute170578262023-04-16 6:56:111049 days ago1681628171IN
0xaC44B58d...7EAE57ee1
0 ETH0.002866823.62952584
Execute170578122023-04-16 6:52:591049 days ago1681627979IN
0xaC44B58d...7EAE57ee1
0 ETH0.0084839124.78074827
Execute170577932023-04-16 6:49:111049 days ago1681627751IN
0xaC44B58d...7EAE57ee1
0 ETH0.0039797724.96688183
Execute170212142023-04-11 0:06:471055 days ago1681171607IN
0xaC44B58d...7EAE57ee1
0 ETH0.0011480119.0652796
Execute170211882023-04-11 0:01:351055 days ago1681171295IN
0xaC44B58d...7EAE57ee1
0 ETH0.0033254422.53472738
Execute170173952023-04-10 11:06:111055 days ago1681124771IN
0xaC44B58d...7EAE57ee1
0 ETH0.0017731920.8155641
Execute170173932023-04-10 11:05:471055 days ago1681124747IN
0xaC44B58d...7EAE57ee1
0 ETH0.0017295319.30046834
Execute170173162023-04-10 10:49:351055 days ago1681123775IN
0xaC44B58d...7EAE57ee1
0 ETH0.0017240819.23970455
Execute170106492023-04-09 12:09:351056 days ago1681042175IN
0xaC44B58d...7EAE57ee1
0 ETH0.0019277523.00804838
Execute170106442023-04-09 12:08:231056 days ago1681042103IN
0xaC44B58d...7EAE57ee1
0 ETH0.0018980320.61196724
Execute170106362023-04-09 12:06:471056 days ago1681042007IN
0xaC44B58d...7EAE57ee1
0 ETH0.0023301620.02463286
Execute170106332023-04-09 12:06:111056 days ago1681041971IN
0xaC44B58d...7EAE57ee1
0 ETH0.0117338621.82297871
Execute170105312023-04-09 11:45:231056 days ago1681040723IN
0xaC44B58d...7EAE57ee1
0 ETH0.002808820.10342082
Execute170105262023-04-09 11:44:231056 days ago1681040663IN
0xaC44B58d...7EAE57ee1
0 ETH0.01409922.8414161
Execute170105182023-04-09 11:42:471056 days ago1681040567IN
0xaC44B58d...7EAE57ee1
0 ETH0.0037973620.92072385
Execute170105122023-04-09 11:41:351056 days ago1681040495IN
0xaC44B58d...7EAE57ee1
0 ETH0.0017104621.59046923
Execute170104082023-04-09 11:20:351056 days ago1681039235IN
0xaC44B58d...7EAE57ee1
0 ETH0.0062040419.94079851
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Method Block
From
To
Transfer175940542023-06-30 19:04:47974 days ago1688151887
0xaC44B58d...7EAE57ee1
0.09621241 ETH
Transfer173504682023-05-27 12:44:351008 days ago1685191475
0xaC44B58d...7EAE57ee1
0.00697583 ETH
Transfer173504682023-05-27 12:44:351008 days ago1685191475
0xaC44B58d...7EAE57ee1
0.09390217 ETH
Transfer170582642023-04-16 8:24:471049 days ago1681633487
0xaC44B58d...7EAE57ee1
0.00527454 ETH
Transfer170582022023-04-16 8:12:231049 days ago1681632743
0xaC44B58d...7EAE57ee1
0.00476063 ETH
Transfer170578262023-04-16 6:56:111049 days ago1681628171
0xaC44B58d...7EAE57ee1
0.00351412 ETH
Transfer170578122023-04-16 6:52:591049 days ago1681627979
0xaC44B58d...7EAE57ee1
0.01168774 ETH
Transfer170577932023-04-16 6:49:111049 days ago1681627751
0xaC44B58d...7EAE57ee1
0.00498868 ETH
Transfer170212142023-04-11 0:06:471055 days ago1681171607
0xaC44B58d...7EAE57ee1
0.00138551 ETH
Transfer170212142023-04-11 0:06:471055 days ago1681171607
0xaC44B58d...7EAE57ee1
0.2 ETH
Transfer170211882023-04-11 0:01:351055 days ago1681171295
0xaC44B58d...7EAE57ee1
0.00402667 ETH
Transfer170211882023-04-11 0:01:351055 days ago1681171295
0xaC44B58d...7EAE57ee1
0.2 ETH
Transfer170173952023-04-10 11:06:111055 days ago1681124771
0xaC44B58d...7EAE57ee1
0.00204472 ETH
Transfer170173952023-04-10 11:06:111055 days ago1681124771
0xaC44B58d...7EAE57ee1
0.05 ETH
Transfer170173932023-04-10 11:05:471055 days ago1681124747
0xaC44B58d...7EAE57ee1
0.0020494 ETH
Transfer170173162023-04-10 10:49:351055 days ago1681123775
0xaC44B58d...7EAE57ee1
0.00204294 ETH
Transfer170106492023-04-09 12:09:351056 days ago1681042175
0xaC44B58d...7EAE57ee1
0.0022945 ETH
Transfer170106442023-04-09 12:08:231056 days ago1681042103
0xaC44B58d...7EAE57ee1
0.00268435 ETH
Transfer170106362023-04-09 12:06:471056 days ago1681042007
0xaC44B58d...7EAE57ee1
0.00276898 ETH
Transfer170106332023-04-09 12:06:111056 days ago1681041971
0xaC44B58d...7EAE57ee1
0.013 ETH
Transfer170105312023-04-09 11:45:231056 days ago1681040723
0xaC44B58d...7EAE57ee1
0.00380228 ETH
Transfer170105262023-04-09 11:44:231056 days ago1681040663
0xaC44B58d...7EAE57ee1
0.01737873 ETH
Transfer170105182023-04-09 11:42:471056 days ago1681040567
0xaC44B58d...7EAE57ee1
0.00424067 ETH
Transfer170105122023-04-09 11:41:351056 days ago1681040495
0xaC44B58d...7EAE57ee1
0.00214592 ETH
Transfer170104082023-04-09 11:20:351056 days ago1681039235
0xaC44B58d...7EAE57ee1
0.00685161 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
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.