Latest 25 from a total of 1,100 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Execute | 24491221 | 2 days ago | IN | 0 ETH | 0.00000657 | ||||
| Execute | 24491217 | 2 days ago | IN | 0 ETH | 0.00000675 | ||||
| Execute | 24491217 | 2 days ago | IN | 0 ETH | 0.0000164 | ||||
| Execute | 24484549 | 3 days ago | IN | 0 ETH | 0.0000081 | ||||
| Execute | 24484547 | 3 days ago | IN | 0 ETH | 0.00001649 | ||||
| Execute | 24484408 | 3 days ago | IN | 0 ETH | 0.00000783 | ||||
| Transfer | 24475987 | 4 days ago | IN | 0 ETH | 0.00000104 | ||||
| Execute | 24475982 | 4 days ago | IN | 0 ETH | 0.00000293 | ||||
| Execute | 24448009 | 8 days ago | IN | 0 ETH | 0.00000348 | ||||
| Execute | 24446923 | 8 days ago | IN | 0 ETH | 0.00000353 | ||||
| Execute | 24441030 | 9 days ago | IN | 0 ETH | 0.00035924 | ||||
| Execute | 24439566 | 10 days ago | IN | 0 ETH | 0.00000464 | ||||
| Execute | 24432408 | 11 days ago | IN | 0 ETH | 0.00000545 | ||||
| Execute | 24432401 | 11 days ago | IN | 0 ETH | 0.00000757 | ||||
| Execute | 24398996 | 15 days ago | IN | 0 ETH | 0.00020746 | ||||
| Execute | 24398804 | 15 days ago | IN | 0 ETH | 0.00064914 | ||||
| Execute | 24398752 | 15 days ago | IN | 0 ETH | 0.00002629 | ||||
| Execute | 24389974 | 16 days ago | IN | 0 ETH | 0.00004563 | ||||
| Execute | 24369722 | 19 days ago | IN | 0 ETH | 0.00005597 | ||||
| Execute | 24346907 | 22 days ago | IN | 0 ETH | 0.00001904 | ||||
| Execute | 24346848 | 22 days ago | IN | 0 ETH | 0.00000867 | ||||
| Execute | 24320151 | 26 days ago | IN | 0 ETH | 0.00004948 | ||||
| Execute | 24319405 | 26 days ago | IN | 0 ETH | 0.00003343 | ||||
| Execute | 24292724 | 30 days ago | IN | 0 ETH | 0.00002172 | ||||
| Execute | 24290023 | 30 days ago | IN | 0 ETH | 0.00000518 |
Latest 25 internal transactions (View All)
Advanced mode:
| Parent Transaction Hash | Method | Block |
From
|
|
To
|
||
|---|---|---|---|---|---|---|---|
| Transfer | 24233666 | 38 days ago | 0.00090494 ETH | ||||
| Transfer | 24219201 | 40 days ago | 0.00016177 ETH | ||||
| Renew | 24219201 | 40 days ago | 0.00825059 ETH | ||||
| Transfer | 24196337 | 43 days ago | 0.01618798 ETH | ||||
| Swap Tokens Sing... | 24124721 | 53 days ago | 0.26 ETH | ||||
| Execute Controll... | 24110882 | 55 days ago | 0.5 ETH | ||||
| Swap Tokens Mult... | 24074479 | 60 days ago | 0.01 ETH | ||||
| Swap Tokens Mult... | 24074464 | 60 days ago | 0.5 ETH | ||||
| Transfer | 24017717 | 68 days ago | 0.1 ETH | ||||
| Transfer | 23996429 | 71 days ago | 0.00494157 ETH | ||||
| Renew | 23996429 | 71 days ago | 0.2520204 ETH | ||||
| 0x00000000 | 23995136 | 72 days ago | 2.5 ETH | ||||
| Transfer | 23995135 | 72 days ago | 0.61089196 ETH | ||||
| Deposit To | 23987923 | 73 days ago | 0.2 ETH | ||||
| Transfer | 23820133 | 96 days ago | 0.02 ETH | ||||
| Transfer | 23796295 | 100 days ago | 0.15 ETH | ||||
| Execute Controll... | 23791718 | 100 days ago | 0.7 ETH | ||||
| Transfer | 23782077 | 102 days ago | 0.19667604 ETH | ||||
| Swap Tokens Sing... | 23725748 | 109 days ago | 0.5 ETH | ||||
| 0x000001b9 | 23675239 | 116 days ago | 0.1467193 ETH | ||||
| Swap Tokens Mult... | 23641418 | 121 days ago | 0.1 ETH | ||||
| Start Bridge Tok... | 23634233 | 122 days ago | 0.04 ETH | ||||
| Transfer | 23633073 | 122 days ago | 0.2 ETH | ||||
| Swap And Start B... | 23547409 | 134 days ago | 4 ETH | ||||
| Transfer | 23539047 | 136 days ago | 0.02 ETH |
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Minimal Proxy Contract for 0x2a2b85eb1054d6f0c6c2e37da05ed3e5fea684ef
Contract Name:
Identity
Compiler Version
v0.8.7+commit.e28d00a7
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"}]Loading...
Loading
Loading...
Loading
Net Worth in USD
$111,736.18
Net Worth in ETH
56.624174
Token Allocations
ADX
65.82%
WALLET
24.97%
ETH
6.84%
Others
2.38%
Multichain Portfolio | 34 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|---|---|---|---|---|
| ETH | 65.82% | $0.075893 | 969,000.8688 | $73,540.38 | |
| ETH | 17.36% | $0.007617 | 2,547,131.5929 | $19,402.39 | |
| ETH | 6.19% | $1,973.29 | 3.5077 | $6,921.7 | |
| ETH | 1.35% | $0.999697 | 1,507.001 | $1,506.54 | |
| ETH | 0.01% | $0.006547 | 2,000 | $13.09 | |
| ETH | 0.01% | $1 | 12.7695 | $12.77 | |
| ETH | <0.01% | $0.999679 | 0.3504 | $0.3503 | |
| ETH | <0.01% | $0.00 | 0.01 | $0.00 | |
| BASE | 7.60% | $0.007624 | 1,114,159.3258 | $8,494.82 | |
| BASE | 0.57% | $1,973.39 | 0.3213 | $633.99 | |
| BASE | 0.55% | $1 | 613.0301 | $613.03 | |
| BASE | 0.11% | $2,263.38 | 0.054 | $122.28 | |
| BASE | <0.01% | $0.019895 | 160 | $3.18 | |
| BASE | <0.01% | $0.998334 | 1.7474 | $1.74 | |
| BSC | 0.18% | $0.99971 | 197.952 | $197.89 | |
| BSC | <0.01% | $1.31 | 2.1078 | $2.76 | |
| BSC | <0.01% | $0.514324 | 1.9303 | $0.9928 | |
| BSC | <0.01% | $621.85 | 0.000000000000000001 | <$0.000001 | |
| POL | 0.07% | $65,583 | 0.00122547 | $80.37 | |
| POL | 0.03% | $0.998295 | 30.4662 | $30.41 | |
| POL | <0.01% | $0.997457 | 10.6267 | $10.6 | |
| POL | <0.01% | $0.998551 | 5.528 | $5.52 | |
| POL | <0.01% | $0.00189 | 120 | $0.2267 | |
| POL | <0.01% | $0.00 | 0.1145 | $0.00 | |
| SCROLL | 0.07% | $1,973.29 | 0.04 | $78.89 | |
| OP | 0.02% | $0.999967 | 19.9385 | $19.94 | |
| OP | 0.01% | $0.999757 | 16.1298 | $16.13 | |
| OP | <0.01% | $0.125003 | 50.4471 | $6.31 | |
| OP | <0.01% | $0.99993 | 4.1215 | $4.12 | |
| OP | <0.01% | $1,973.39 | 0.00123637 | $2.44 | |
| GNO | <0.01% | $0.999821 | 5.9999 | $6 | |
| AVAX | <0.01% | $8.98 | 0.4595 | $4.13 | |
| ARB | <0.01% | $1,973.3 | 0.00067561 | $1.33 | |
| ARB | <0.01% | $0.998438 | 1.2357 | $1.23 | |
| ARB | <0.01% | $0.038396 | 10 | $0.3839 |
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.