This address has been tagged based on hildobby compilation.
FTX: Banruptcy Dust Collector
FTX
Exchange
Latest 25 from a total of 11,125 transactions
| Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Send Multi Sig T... | 24436659 | 11 days ago | IN | 0 ETH | 0.00001249 | ||||
| Send Multi Sig T... | 24436191 | 11 days ago | IN | 0 ETH | 0.00000586 | ||||
| Send Multi Sig T... | 24041803 | 66 days ago | IN | 0 ETH | 0.00000943 | ||||
| Send Multi Sig T... | 24040939 | 66 days ago | IN | 0 ETH | 0.0000739 | ||||
| Send Multi Sig T... | 22619832 | 265 days ago | IN | 0 ETH | 0.00025998 | ||||
| Send Multi Sig T... | 22583745 | 270 days ago | IN | 0 ETH | 0.00032778 | ||||
| Transfer | 22029135 | 348 days ago | IN | 1.41616856 ETH | 0.00014285 | ||||
| Transfer | 22029133 | 348 days ago | IN | 3.81268335 ETH | 0.00014415 | ||||
| Send Multi Sig T... | 21331820 | 445 days ago | IN | 0 ETH | 0.00352934 | ||||
| Send Multi Sig T... | 21323179 | 447 days ago | IN | 0 ETH | 0.00338935 | ||||
| Send Multi Sig T... | 21316718 | 447 days ago | IN | 0 ETH | 0.00316798 | ||||
| Send Multi Sig T... | 20993868 | 492 days ago | IN | 0 ETH | 0.00198378 | ||||
| Send Multi Sig T... | 20987836 | 493 days ago | IN | 0 ETH | 0.00119499 | ||||
| Send Multi Sig T... | 20987324 | 493 days ago | IN | 0 ETH | 0.00182273 | ||||
| Send Multi Sig T... | 20980866 | 494 days ago | IN | 0 ETH | 0.00111324 | ||||
| Send Multi Sig T... | 20923081 | 502 days ago | IN | 0 ETH | 0.00560502 | ||||
| Send Multi Sig T... | 20922282 | 502 days ago | IN | 0 ETH | 0.00434836 | ||||
| Send Multi Sig T... | 20917372 | 503 days ago | IN | 0 ETH | 0.00103909 | ||||
| Send Multi Sig T... | 20917372 | 503 days ago | IN | 0 ETH | 0.00113961 | ||||
| Send Multi Sig T... | 20837218 | 514 days ago | IN | 0 ETH | 0.00242264 | ||||
| Send Multi Sig T... | 20832004 | 515 days ago | IN | 0 ETH | 0.00182922 | ||||
| Send Multi Sig T... | 20694095 | 534 days ago | IN | 0 ETH | 0.00124212 | ||||
| Send Multi Sig T... | 20685776 | 535 days ago | IN | 0 ETH | 0.00050365 | ||||
| Send Multi Sig T... | 20671452 | 537 days ago | IN | 0 ETH | 0.00024489 | ||||
| Send Multi Sig T... | 20643935 | 541 days ago | IN | 0 ETH | 0.00010106 |
Latest 16 internal transactions
Advanced mode:
| Parent Transaction Hash | Method | Block |
From
|
To
|
|||
|---|---|---|---|---|---|---|---|
| Transfer | 19813670 | 657 days ago | 1,609.55057871 ETH | ||||
| Transfer | 19520526 | 698 days ago | 1,350 ETH | ||||
| Transfer | 19485684 | 703 days ago | 1,500 ETH | ||||
| Transfer | 19423822 | 712 days ago | 14.81976728 ETH | ||||
| Transfer | 19416017 | 713 days ago | 0.0027 ETH | ||||
| Transfer | 19214789 | 741 days ago | 346.75570278 ETH | ||||
| Transfer | 19205960 | 743 days ago | 0.04 ETH | ||||
| Transfer | 19193834 | 744 days ago | 240.90716305 ETH | ||||
| Transfer | 19191910 | 744 days ago | 0.004 ETH | ||||
| Transfer | 18799976 | 799 days ago | 0.04610958 ETH | ||||
| Transfer | 18765499 | 804 days ago | 0.1391888 ETH | ||||
| Transfer | 18497825 | 842 days ago | 0.08293545 ETH | ||||
| Deposit | 18345339 | 863 days ago | 608 ETH | ||||
| Deposit | 18345339 | 863 days ago | 3,200 ETH | ||||
| Deposit | 18345339 | 863 days ago | 608 ETH | ||||
| 0x3d602d80 | 15952136 | 1199 days ago | Contract Creation | 0 ETH |
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Latest 13 blocks produced
| Block | Transaction | Difficulty | Gas Used | Reward | |
|---|---|---|---|---|---|
| 19418366 | 713 days ago | 157 | 0.00 TH | 13,358,167 (44.53%) | 0.018466839240776737 ETH |
| 19392535 | 716 days ago | 221 | 0.00 TH | 15,650,267 (52.17%) | 0.032512132381185165 ETH |
| 19269512 | 734 days ago | 137 | 0.00 TH | 12,868,566 (42.90%) | 0.094895528517510182 ETH |
| 19214680 | 741 days ago | 125 | 0.00 TH | 10,814,582 (36.05%) | 0.320511300889581629 ETH |
| 18813856 | 798 days ago | 178 | 0.00 TH | 12,824,696 (42.75%) | 0.067895759099496156 ETH |
| 18799976 | 799 days ago | 181 | 0.00 TH | 11,138,571 (37.13%) | 0.033795036065531447 ETH |
| 18785414 | 802 days ago | 244 | 0.00 TH | 12,847,846 (42.83%) | 0.019418358759924961 ETH |
| 18773273 | 803 days ago | 105 | 0.00 TH | 11,503,146 (38.34%) | 0.037956715290180652 ETH |
| 18647817 | 821 days ago | 92 | 0.00 TH | 9,731,787 (32.44%) | 0.11449200331825522 ETH |
| 18608674 | 826 days ago | 143 | 0.00 TH | 25,823,054 (86.08%) | 0.042484299562733141 ETH |
| 18590567 | 829 days ago | 165 | 0.00 TH | 11,506,643 (38.36%) | 0.015336935810233567 ETH |
| 18572832 | 831 days ago | 115 | 0.00 TH | 8,318,586 (27.73%) | 0.020685404698802459 ETH |
| 18481658 | 844 days ago | 113 | 0.00 TH | 14,905,281 (49.68%) | 0.055392296516534082 ETH |
Latest 25 from a total of 2936 withdrawals (4,472.818485205 ETH withdrawn)
| Validator Index | Block | Amount | |
|---|---|---|---|
| 973649 | 19530609 | 697 days ago | 32.00213246 ETH |
| 973646 | 19530609 | 697 days ago | 32.00213241 ETH |
| 973642 | 19530609 | 697 days ago | 32.002129957 ETH |
| 973640 | 19530609 | 697 days ago | 32.00213722 ETH |
| 973636 | 19530609 | 697 days ago | 32.002136703 ETH |
| 973635 | 19530609 | 697 days ago | 32.002130016 ETH |
| 973631 | 19530609 | 697 days ago | 32.002129456 ETH |
| 973630 | 19530609 | 697 days ago | 32.002124573 ETH |
| 973629 | 19530609 | 697 days ago | 32.002139516 ETH |
| 973628 | 19530609 | 697 days ago | 32.002113328 ETH |
| 973627 | 19530609 | 697 days ago | 32.002143506 ETH |
| 973623 | 19530609 | 697 days ago | 32.00212198 ETH |
| 973621 | 19530609 | 697 days ago | 32.002110896 ETH |
| 973620 | 19530609 | 697 days ago | 32.002113319 ETH |
| 973614 | 19530609 | 697 days ago | 32.002127043 ETH |
| 973613 | 19530608 | 697 days ago | 32.002112836 ETH |
| 973612 | 19530608 | 697 days ago | 32.002136536 ETH |
| 973611 | 19530608 | 697 days ago | 32.002112963 ETH |
| 973610 | 19530608 | 697 days ago | 32.002117493 ETH |
| 973608 | 19530608 | 697 days ago | 32.00213643 ETH |
| 973605 | 19530608 | 697 days ago | 32.00213888 ETH |
| 973596 | 19530608 | 697 days ago | 32.002136552 ETH |
| 973592 | 19530608 | 697 days ago | 32.002136422 ETH |
| 973586 | 19530608 | 697 days ago | 32.002122289 ETH |
| 973585 | 19530608 | 697 days ago | 32.002126681 ETH |
Loading...
Loading
Minimal Proxy Contract for 0xe8e847cf573fc8ed75621660a36affd18c543d7e
Contract Name:
WalletSimple
Compiler Version
v0.7.5+commit.eb77ed08
Contract Source Code (Solidity Multiple files format)
// SPDX-License-Identifier: Apache-2.0
pragma solidity 0.7.5;
import './TransferHelper.sol';
import './Forwarder.sol';
import './ERC20Interface.sol';
/**
*
* WalletSimple
* ============
*
* Basic multi-signer wallet designed for use in a co-signing environment where 2 signatures are required to move funds.
* Typically used in a 2-of-3 signing configuration. Uses ecrecover to allow for 2 signatures in a single transaction.
*
* The first signature is created on the operation hash (see Data Formats) and passed to sendMultiSig/sendMultiSigToken
* The signer is determined by verifyMultiSig().
*
* The second signature is created by the submitter of the transaction and determined by msg.signer.
*
* Data Formats
* ============
*
* The signature is created with ethereumjs-util.ecsign(operationHash).
* Like the eth_sign RPC call, it packs the values as a 65-byte array of [r, s, v].
* Unlike eth_sign, the message is not prefixed.
*
* The operationHash the result of keccak256(prefix, toAddress, value, data, expireTime).
* For ether transactions, `prefix` is "ETHER".
* For token transaction, `prefix` is "ERC20" and `data` is the tokenContractAddress.
*
*
*/
contract WalletSimple {
// Events
event Deposited(address from, uint256 value, bytes data);
event SafeModeActivated(address msgSender);
event Transacted(
address msgSender, // Address of the sender of the message initiating the transaction
address otherSigner, // Address of the signer (second signature) used to initiate the transaction
bytes32 operation, // Operation hash (see Data Formats)
address toAddress, // The address the transaction was sent to
uint256 value, // Amount of Wei sent to the address
bytes data // Data sent when invoking the transaction
);
event BatchTransfer(address sender, address recipient, uint256 value);
// this event shows the other signer and the operation hash that they signed
// specific batch transfer events are emitted in Batcher
event BatchTransacted(
address msgSender, // Address of the sender of the message initiating the transaction
address otherSigner, // Address of the signer (second signature) used to initiate the transaction
bytes32 operation // Operation hash (see Data Formats)
);
// Public fields
mapping(address => bool) public signers; // The addresses that can co-sign transactions on the wallet
bool public safeMode = false; // When active, wallet may only send to signer addresses
bool public initialized = false; // True if the contract has been initialized
// Internal fields
uint256 private constant MAX_SEQUENCE_ID_INCREASE = 10000;
uint256 constant SEQUENCE_ID_WINDOW_SIZE = 10;
uint256[SEQUENCE_ID_WINDOW_SIZE] recentSequenceIds;
/**
* Set up a simple multi-sig wallet by specifying the signers allowed to be used on this wallet.
* 2 signers will be required to send a transaction from this wallet.
* Note: The sender is NOT automatically added to the list of signers.
* Signers CANNOT be changed once they are set
*
* @param allowedSigners An array of signers on the wallet
*/
function init(address[] calldata allowedSigners) external onlyUninitialized {
require(allowedSigners.length == 3, 'Invalid number of signers');
for (uint8 i = 0; i < allowedSigners.length; i++) {
require(allowedSigners[i] != address(0), 'Invalid signer');
signers[allowedSigners[i]] = true;
}
initialized = true;
}
/**
* Get the network identifier that signers must sign over
* This provides protection signatures being replayed on other chains
* This must be a virtual function because chain-specific contracts will need
* to override with their own network ids. It also can't be a field
* to allow this contract to be used by proxy with delegatecall, which will
* not pick up on state variables
*/
function getNetworkId() internal virtual pure returns (string memory) {
return 'ETHER';
}
/**
* Get the network identifier that signers must sign over for token transfers
* This provides protection signatures being replayed on other chains
* This must be a virtual function because chain-specific contracts will need
* to override with their own network ids. It also can't be a field
* to allow this contract to be used by proxy with delegatecall, which will
* not pick up on state variables
*/
function getTokenNetworkId() internal virtual pure returns (string memory) {
return 'ERC20';
}
/**
* Get the network identifier that signers must sign over for batch transfers
* This provides protection signatures being replayed on other chains
* This must be a virtual function because chain-specific contracts will need
* to override with their own network ids. It also can't be a field
* to allow this contract to be used by proxy with delegatecall, which will
* not pick up on state variables
*/
function getBatchNetworkId() internal virtual pure returns (string memory) {
return 'ETHER-Batch';
}
/**
* Determine if an address is a signer on this wallet
* @param signer address to check
* returns boolean indicating whether address is signer or not
*/
function isSigner(address signer) public view returns (bool) {
return signers[signer];
}
/**
* Modifier that will execute internal code block only if the sender is an authorized signer on this wallet
*/
modifier onlySigner {
require(isSigner(msg.sender), 'Non-signer in onlySigner method');
_;
}
/**
* Modifier that will execute internal code block only if the contract has not been initialized yet
*/
modifier onlyUninitialized {
require(!initialized, 'Contract already initialized');
_;
}
/**
* Gets called when a transaction is received with data that does not match any other method
*/
fallback() external payable {
if (msg.value > 0) {
// Fire deposited event if we are receiving funds
Deposited(msg.sender, msg.value, msg.data);
}
}
/**
* Gets called when a transaction is received with ether and no data
*/
receive() external payable {
if (msg.value > 0) {
// Fire deposited event if we are receiving funds
Deposited(msg.sender, msg.value, msg.data);
}
}
/**
* Execute a multi-signature transaction from this wallet using 2 signers: one from msg.sender and the other from ecrecover.
* Sequence IDs are numbers starting from 1. They are used to prevent replay attacks and may not be repeated.
*
* @param toAddress the destination address to send an outgoing transaction
* @param value the amount in Wei to be sent
* @param data the data to send to the toAddress when invoking the transaction
* @param expireTime the number of seconds since 1970 for which this transaction is valid
* @param sequenceId the unique sequence id obtainable from getNextSequenceId
* @param signature see Data Formats
*/
function sendMultiSig(
address toAddress,
uint256 value,
bytes calldata data,
uint256 expireTime,
uint256 sequenceId,
bytes calldata signature
) external onlySigner {
// Verify the other signer
bytes32 operationHash = keccak256(
abi.encodePacked(
getNetworkId(),
toAddress,
value,
data,
expireTime,
sequenceId
)
);
address otherSigner = verifyMultiSig(
toAddress,
operationHash,
signature,
expireTime,
sequenceId
);
// Success, send the transaction
(bool success, ) = toAddress.call{ value: value }(data);
require(success, 'Call execution failed');
emit Transacted(
msg.sender,
otherSigner,
operationHash,
toAddress,
value,
data
);
}
/**
* Execute a batched multi-signature transaction from this wallet using 2 signers: one from msg.sender and the other from ecrecover.
* Sequence IDs are numbers starting from 1. They are used to prevent replay attacks and may not be repeated.
* The recipients and values to send are encoded in two arrays, where for index i, recipients[i] will be sent values[i].
*
* @param recipients The list of recipients to send to
* @param values The list of values to send to
* @param expireTime the number of seconds since 1970 for which this transaction is valid
* @param sequenceId the unique sequence id obtainable from getNextSequenceId
* @param signature see Data Formats
*/
function sendMultiSigBatch(
address[] calldata recipients,
uint256[] calldata values,
uint256 expireTime,
uint256 sequenceId,
bytes calldata signature
) external onlySigner {
require(recipients.length != 0, 'Not enough recipients');
require(
recipients.length == values.length,
'Unequal recipients and values'
);
require(recipients.length < 256, 'Too many recipients, max 255');
// Verify the other signer
bytes32 operationHash = keccak256(
abi.encodePacked(
getBatchNetworkId(),
recipients,
values,
expireTime,
sequenceId
)
);
// the first parameter (toAddress) is used to ensure transactions in safe mode only go to a signer
// if in safe mode, we should use normal sendMultiSig to recover, so this check will always fail if in safe mode
require(!safeMode, 'Batch in safe mode');
address otherSigner = verifyMultiSig(
address(0x0),
operationHash,
signature,
expireTime,
sequenceId
);
batchTransfer(recipients, values);
emit BatchTransacted(msg.sender, otherSigner, operationHash);
}
/**
* Transfer funds in a batch to each of recipients
* @param recipients The list of recipients to send to
* @param values The list of values to send to recipients.
* The recipient with index i in recipients array will be sent values[i].
* Thus, recipients and values must be the same length
*/
function batchTransfer(
address[] calldata recipients,
uint256[] calldata values
) internal {
for (uint256 i = 0; i < recipients.length; i++) {
require(address(this).balance >= values[i], 'Insufficient funds');
(bool success, ) = recipients[i].call{ value: values[i] }('');
require(success, 'Call failed');
emit BatchTransfer(msg.sender, recipients[i], values[i]);
}
}
/**
* Execute a multi-signature token transfer from this wallet using 2 signers: one from msg.sender and the other from ecrecover.
* Sequence IDs are numbers starting from 1. They are used to prevent replay attacks and may not be repeated.
*
* @param toAddress the destination address to send an outgoing transaction
* @param value the amount in tokens to be sent
* @param tokenContractAddress the address of the erc20 token contract
* @param expireTime the number of seconds since 1970 for which this transaction is valid
* @param sequenceId the unique sequence id obtainable from getNextSequenceId
* @param signature see Data Formats
*/
function sendMultiSigToken(
address toAddress,
uint256 value,
address tokenContractAddress,
uint256 expireTime,
uint256 sequenceId,
bytes calldata signature
) external onlySigner {
// Verify the other signer
bytes32 operationHash = keccak256(
abi.encodePacked(
getTokenNetworkId(),
toAddress,
value,
tokenContractAddress,
expireTime,
sequenceId
)
);
verifyMultiSig(toAddress, operationHash, signature, expireTime, sequenceId);
TransferHelper.safeTransfer(tokenContractAddress, toAddress, value);
}
/**
* Execute a token flush from one of the forwarder addresses. This transfer needs only a single signature and can be done by any signer
*
* @param forwarderAddress the address of the forwarder address to flush the tokens from
* @param tokenContractAddress the address of the erc20 token contract
*/
function flushForwarderTokens(
address payable forwarderAddress,
address tokenContractAddress
) external onlySigner {
Forwarder forwarder = Forwarder(forwarderAddress);
forwarder.flushTokens(tokenContractAddress);
}
/**
* Do common multisig verification for both eth sends and erc20token transfers
*
* @param toAddress the destination address to send an outgoing transaction
* @param operationHash see Data Formats
* @param signature see Data Formats
* @param expireTime the number of seconds since 1970 for which this transaction is valid
* @param sequenceId the unique sequence id obtainable from getNextSequenceId
* returns address that has created the signature
*/
function verifyMultiSig(
address toAddress,
bytes32 operationHash,
bytes calldata signature,
uint256 expireTime,
uint256 sequenceId
) private returns (address) {
address otherSigner = recoverAddressFromSignature(operationHash, signature);
// Verify if we are in safe mode. In safe mode, the wallet can only send to signers
require(!safeMode || isSigner(toAddress), 'External transfer in safe mode');
// Verify that the transaction has not expired
require(expireTime >= block.timestamp, 'Transaction expired');
// Try to insert the sequence ID. Will revert if the sequence id was invalid
tryInsertSequenceId(sequenceId);
require(isSigner(otherSigner), 'Invalid signer');
require(otherSigner != msg.sender, 'Signers cannot be equal');
return otherSigner;
}
/**
* Irrevocably puts contract into safe mode. When in this mode, transactions may only be sent to signing addresses.
*/
function activateSafeMode() external onlySigner {
safeMode = true;
SafeModeActivated(msg.sender);
}
/**
* Gets signer's address using ecrecover
* @param operationHash see Data Formats
* @param signature see Data Formats
* returns address recovered from the signature
*/
function recoverAddressFromSignature(
bytes32 operationHash,
bytes memory signature
) private pure returns (address) {
require(signature.length == 65, 'Invalid signature - wrong length');
// We need to unpack the signature, which is given as an array of 65 bytes (like eth.sign)
bytes32 r;
bytes32 s;
uint8 v;
// solhint-disable-next-line
assembly {
r := mload(add(signature, 32))
s := mload(add(signature, 64))
v := and(mload(add(signature, 65)), 255)
}
if (v < 27) {
v += 27; // Ethereum versions are 27 or 28 as opposed to 0 or 1 which is submitted by some signing libs
}
// protect against signature malleability
// S value must be in the lower half orader
// reference: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/051d340171a93a3d401aaaea46b4b62fa81e5d7c/contracts/cryptography/ECDSA.sol#L53
require(
uint256(s) <=
0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0,
"ECDSA: invalid signature 's' value"
);
// note that this returns 0 if the signature is invalid
// Since 0x0 can never be a signer, when the recovered signer address
// is checked against our signer list, that 0x0 will cause an invalid signer failure
return ecrecover(operationHash, v, r, s);
}
/**
* Verify that the sequence id has not been used before and inserts it. Throws if the sequence ID was not accepted.
* We collect a window of up to 10 recent sequence ids, and allow any sequence id that is not in the window and
* greater than the minimum element in the window.
* @param sequenceId to insert into array of stored ids
*/
function tryInsertSequenceId(uint256 sequenceId) private onlySigner {
// Keep a pointer to the lowest value element in the window
uint256 lowestValueIndex = 0;
// fetch recentSequenceIds into memory for function context to avoid unnecessary sloads
uint256[SEQUENCE_ID_WINDOW_SIZE] memory _recentSequenceIds = recentSequenceIds;
for (uint256 i = 0; i < SEQUENCE_ID_WINDOW_SIZE; i++) {
require(_recentSequenceIds[i] != sequenceId, 'Sequence ID already used');
if (_recentSequenceIds[i] < _recentSequenceIds[lowestValueIndex]) {
lowestValueIndex = i;
}
}
// The sequence ID being used is lower than the lowest value in the window
// so we cannot accept it as it may have been used before
require(
sequenceId > _recentSequenceIds[lowestValueIndex],
'Sequence ID below window'
);
// Block sequence IDs which are much higher than the lowest value
// This prevents people blocking the contract by using very large sequence IDs quickly
require(
sequenceId <=
(_recentSequenceIds[lowestValueIndex] + MAX_SEQUENCE_ID_INCREASE),
'Sequence ID above maximum'
);
recentSequenceIds[lowestValueIndex] = sequenceId;
}
/**
* Gets the next available sequence ID for signing when using executeAndConfirm
* returns the sequenceId one higher than the highest currently stored
*/
function getNextSequenceId() public view returns (uint256) {
uint256 highestSequenceId = 0;
for (uint256 i = 0; i < SEQUENCE_ID_WINDOW_SIZE; i++) {
if (recentSequenceIds[i] > highestSequenceId) {
highestSequenceId = recentSequenceIds[i];
}
}
return highestSequenceId + 1;
}
}
File 2 of 4: ERC20Interface.sol
// SPDX-License-Identifier: UNLICENSED
pragma solidity 0.7.5;
/**
* Contract that exposes the needed erc20 token functions
*/
abstract contract ERC20Interface {
// Send _value amount of tokens to address _to
function transfer(address _to, uint256 _value)
public
virtual
returns (bool success);
// Get the account balance of another account with address _owner
function balanceOf(address _owner)
public
virtual
view
returns (uint256 balance);
}
File 3 of 4: Forwarder.sol
// SPDX-License-Identifier: Apache-2.0
pragma solidity 0.7.5;
import './TransferHelper.sol';
import './ERC20Interface.sol';
/**
* Contract that will forward any incoming Ether to the creator of the contract
*
*/
contract Forwarder {
// Address to which any funds sent to this contract will be forwarded
address public parentAddress;
event ForwarderDeposited(address from, uint256 value, bytes data);
/**
* Initialize the contract, and sets the destination address to that of the creator
*/
function init(address _parentAddress) external onlyUninitialized {
parentAddress = _parentAddress;
uint256 value = address(this).balance;
if (value == 0) {
return;
}
(bool success, ) = parentAddress.call{ value: value }('');
require(success, 'Flush failed');
// NOTE: since we are forwarding on initialization,
// we don't have the context of the original sender.
// We still emit an event about the forwarding but set
// the sender to the forwarder itself
emit ForwarderDeposited(address(this), value, msg.data);
}
/**
* Modifier that will execute internal code block only if the sender is the parent address
*/
modifier onlyParent {
require(msg.sender == parentAddress, 'Only Parent');
_;
}
/**
* Modifier that will execute internal code block only if the contract has not been initialized yet
*/
modifier onlyUninitialized {
require(parentAddress == address(0x0), 'Already initialized');
_;
}
/**
* Default function; Gets called when data is sent but does not match any other function
*/
fallback() external payable {
flush();
}
/**
* Default function; Gets called when Ether is deposited with no data, and forwards it to the parent address
*/
receive() external payable {
flush();
}
/**
* Execute a token transfer of the full balance from the forwarder token to the parent address
* @param tokenContractAddress the address of the erc20 token contract
*/
function flushTokens(address tokenContractAddress) external onlyParent {
ERC20Interface instance = ERC20Interface(tokenContractAddress);
address forwarderAddress = address(this);
uint256 forwarderBalance = instance.balanceOf(forwarderAddress);
if (forwarderBalance == 0) {
return;
}
TransferHelper.safeTransfer(
tokenContractAddress,
parentAddress,
forwarderBalance
);
}
/**
* Flush the entire balance of the contract to the parent address.
*/
function flush() public {
uint256 value = address(this).balance;
if (value == 0) {
return;
}
(bool success, ) = parentAddress.call{ value: value }('');
require(success, 'Flush failed');
emit ForwarderDeposited(msg.sender, value, msg.data);
}
}
File 4 of 4: TransferHelper.sol
// SPDX-License-Identifier: Apache-2.0
pragma solidity >=0.7.5;
// helper methods for interacting with ERC20 tokens and sending ETH that do not consistently return true/false
library TransferHelper {
function safeApprove(
address token,
address to,
uint256 value
) internal {
// bytes4(keccak256(bytes('approve(address,uint256)')));
(bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x095ea7b3, to, value));
require(
success && (data.length == 0 || abi.decode(data, (bool))),
'TransferHelper::safeApprove: approve failed'
);
}
function safeTransfer(
address token,
address to,
uint256 value
) internal {
// bytes4(keccak256(bytes('transfer(address,uint256)')));
(bool success, bytes memory data) = token.call(abi.encodeWithSelector(0xa9059cbb, to, value));
require(
success && (data.length == 0 || abi.decode(data, (bool))),
'TransferHelper::safeTransfer: transfer failed'
);
}
function safeTransferFrom(
address token,
address from,
address to,
uint256 value
) internal {
// bytes4(keccak256(bytes('transferFrom(address,address,uint256)')));
(bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x23b872dd, from, to, value));
require(
success && (data.length == 0 || abi.decode(data, (bool))),
'TransferHelper::transferFrom: transferFrom failed'
);
}
function safeTransferETH(address to, uint256 value) internal {
(bool success, ) = to.call{value: value}(new bytes(0));
require(success, 'TransferHelper::safeTransferETH: ETH transfer failed');
}
}
Contract ABI
API[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"msgSender","type":"address"},{"indexed":false,"internalType":"address","name":"otherSigner","type":"address"},{"indexed":false,"internalType":"bytes32","name":"operation","type":"bytes32"}],"name":"BatchTransacted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"BatchTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"}],"name":"Deposited","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"msgSender","type":"address"}],"name":"SafeModeActivated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"msgSender","type":"address"},{"indexed":false,"internalType":"address","name":"otherSigner","type":"address"},{"indexed":false,"internalType":"bytes32","name":"operation","type":"bytes32"},{"indexed":false,"internalType":"address","name":"toAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"}],"name":"Transacted","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"activateSafeMode","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"forwarderAddress","type":"address"},{"internalType":"address","name":"tokenContractAddress","type":"address"}],"name":"flushForwarderTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getNextSequenceId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"allowedSigners","type":"address[]"}],"name":"init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initialized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"signer","type":"address"}],"name":"isSigner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"safeMode","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"toAddress","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"uint256","name":"expireTime","type":"uint256"},{"internalType":"uint256","name":"sequenceId","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"sendMultiSig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"recipients","type":"address[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"},{"internalType":"uint256","name":"expireTime","type":"uint256"},{"internalType":"uint256","name":"sequenceId","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"sendMultiSigBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"toAddress","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"address","name":"tokenContractAddress","type":"address"},{"internalType":"uint256","name":"expireTime","type":"uint256"},{"internalType":"uint256","name":"sequenceId","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"sendMultiSigToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"signers","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]Loading...
Loading
Loading...
Loading
Net Worth in USD
$3,974,379.85
Net Worth in ETH
2,099.755187
Token Allocations
FTX TOKEN
94.18%
XAUT
1.08%
GUSD
1.03%
Others
3.71%
Multichain Portfolio | 34 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|---|---|---|---|---|
| ETH | 94.18% | $0.320018 | 11,695,851.248 | $3,742,882.92 | |
| ETH | 1.08% | $5,197.37 | 8.2599 | $42,929.88 | |
| ETH | 1.03% | $0.999516 | 41,047.21 | $41,027.34 | |
| ETH | 0.56% | $0.832921 | 26,697.5543 | $22,236.95 | |
| ETH | 0.46% | $1.17 | 15,661.5471 | $18,324.01 | |
| ETH | 0.43% | $1 | 17,157.6554 | $17,226.29 | |
| ETH | 0.42% | $0.003005 | 5,596,774.1974 | $16,820.38 | |
| ETH | 0.26% | $0.00476 | 2,163,241.2166 | $10,297.16 | |
| ETH | 0.25% | $1,892.33 | 5.241 | $9,917.81 | |
| ETH | 0.21% | $0.322325 | 25,974.6949 | $8,372.29 | |
| ETH | 0.17% | $62.75 | 110.2647 | $6,919.11 | |
| ETH | 0.09% | $0.025081 | 145,718.2059 | $3,654.8 | |
| ETH | 0.09% | $0.004699 | 773,623.6241 | $3,634.97 | |
| ETH | 0.06% | <$0.000001 | 69,877,509,844.2496 | $2,369.9 | |
| ETH | 0.05% | $1 | 2,174.8632 | $2,174.86 | |
| ETH | 0.04% | $0.000006 | 285,141,011.9314 | $1,736.51 | |
| ETH | 0.04% | $79.57 | 20.8228 | $1,656.87 | |
| ETH | 0.04% | $0.999806 | 1,465.8468 | $1,465.56 | |
| ETH | 0.04% | $1 | 1,453.6396 | $1,453.64 | |
| ETH | 0.03% | $0.304133 | 4,202.8646 | $1,278.23 | |
| ETH | 0.03% | $2.22 | 524.4702 | $1,164.32 | |
| ETH | 0.03% | $0.00315 | 350,572.2507 | $1,104.33 | |
| ETH | 0.03% | $1.04 | 1,039.0034 | $1,080.56 | |
| ETH | 0.02% | $3.3 | 275.0407 | $907.63 | |
| ETH | 0.02% | $1,888.21 | 0.4428 | $836.04 | |
| ETH | 0.02% | $0.304008 | 2,179.9171 | $662.71 | |
| ETH | 0.01% | $0.497604 | 1,090.542 | $542.66 | |
| ETH | 0.01% | $0.996536 | 523.0649 | $521.25 | |
| ETH | 0.01% | $0.205372 | 2,465.6682 | $506.38 | |
| ETH | 0.01% | $0.191879 | 2,499.895 | $479.68 | |
| ETH | 0.01% | $1 | 441 | $441.06 | |
| ETH | 0.01% | $0.516123 | 801.7002 | $413.78 | |
| ETH | 0.01% | $43.45 | 9.4345 | $409.93 | |
| ETH | 0.01% | $1 | 399.114 | $400.31 | |
| ETH | <0.01% | $8.61 | 44.19 | $380.48 | |
| ETH | <0.01% | $0.000001 | 370,721,122.0268 | $380.01 | |
| ETH | <0.01% | $0.025322 | 13,717.752 | $347.37 | |
| ETH | <0.01% | $0.157898 | 2,081.1311 | $328.61 | |
| ETH | <0.01% | $0.005733 | 57,073.5648 | $327.18 | |
| ETH | <0.01% | $0.00 | 251,134.729 | $0.00 | |
| ETH | <0.01% | $2,732.47 | 0.1005 | $274.68 | |
| ETH | <0.01% | $0.06906 | 3,102.471 | $214.26 | |
| ETH | <0.01% | $0.00591 | 35,848.5111 | $211.88 | |
| ETH | <0.01% | $0.00 | 5,521.4724 | $0.00 | |
| ETH | <0.01% | $0.034609 | 5,251.4933 | $181.75 | |
| ETH | <0.01% | $0.070249 | 2,475.415 | $173.9 | |
| ETH | <0.01% | $603.55 | 0.284 | $171.4 | |
| ETH | <0.01% | $0.00 | 5,000 | $0.00 | |
| ETH | <0.01% | $0.004289 | 37,137.2328 | $159.27 | |
| ETH | <0.01% | $0.000252 | 605,453 | $152.63 | |
| ETH | <0.01% | $0.107855 | 1,379.603 | $148.8 | |
| ETH | <0.01% | $0.010121 | 13,957 | $141.26 | |
| ETH | <0.01% | $0.00075 | 185,010 | $138.68 | |
| ETH | <0.01% | $0.00 | 11,671.521 | $0.00 | |
| ETH | <0.01% | $3.55 | 35.8229 | $127.17 | |
| ETH | <0.01% | $0.306556 | 411.7286 | $126.22 | |
| ETH | <0.01% | $0.003481 | 35,546.5637 | $123.72 | |
| ETH | <0.01% | $38.11 | 3.2413 | $123.53 | |
| ETH | <0.01% | $0.000595 | 200,000 | $118.96 | |
| ETH | <0.01% | $0.001193 | 98,052.0559 | $116.97 | |
| ETH | <0.01% | $0.004542 | 25,006.8842 | $113.58 | |
| ETH | <0.01% | $0.99812 | 112.0261 | $111.82 | |
| ETH | <0.01% | $1 | 110.9971 | $111.44 | |
| ETH | <0.01% | $0.000357 | 298,986.0715 | $106.88 | |
| ETH | <0.01% | $0.000534 | 192,500 | $102.89 | |
| ETH | <0.01% | $1.02 | 100.282 | $102.29 | |
| ETH | <0.01% | $0.064835 | 1,499.9392 | $97.25 | |
| ETH | <0.01% | $0.025335 | 3,489.7704 | $88.41 | |
| ETH | <0.01% | $0.004112 | 20,509 | $84.32 | |
| ETH | <0.01% | $0.020723 | 3,822.2701 | $79.21 | |
| ETH | <0.01% | $0.000028 | 2,543,234.9949 | $72.13 | |
| ETH | <0.01% | $0.00 | 7,467.5 | $0.00 | |
| ETH | <0.01% | $0.012942 | 4,986.9343 | $64.54 | |
| ETH | <0.01% | $2,098.64 | 0.0302 | $63.35 | |
| ETH | <0.01% | $0.00428 | 13,658.8941 | $58.45 | |
| ETH | <0.01% | $0.023849 | 2,429.4107 | $57.94 | |
| ETH | <0.01% | $0.226647 | 255.0411 | $57.8 | |
| ETH | <0.01% | $0.015554 | 3,647.1222 | $56.73 | |
| ETH | <0.01% | $0.000361 | 156,440.0534 | $56.48 | |
| ETH | <0.01% | $0.004855 | 11,475.4098 | $55.71 | |
| ETH | <0.01% | $0.999892 | 54.1384 | $54.13 | |
| ETH | <0.01% | $0.01911 | 2,805.0542 | $53.6 | |
| ETH | <0.01% | $0.045506 | 1,125.713 | $51.23 | |
| ETH | <0.01% | $0.004682 | 10,658.5842 | $49.9 | |
| ETH | <0.01% | $0.004939 | 10,000 | $49.39 | |
| ETH | <0.01% | <$0.000001 | 38,513,946,815.8887 | $48.72 | |
| ETH | <0.01% | $0.232453 | 190.5623 | $44.3 | |
| ETH | <0.01% | $0.1469 | 297.0251 | $43.63 | |
| ETH | <0.01% | $0.011147 | 3,561.369 | $39.7 | |
| ETH | <0.01% | $0.001417 | 25,000.9524 | $35.42 | |
| ETH | <0.01% | $0.025969 | 1,276 | $33.14 | |
| ETH | <0.01% | $0.079797 | 402.8 | $32.14 | |
| ETH | <0.01% | $0.001028 | 30,004.0537 | $30.85 | |
| ETH | <0.01% | $0.30516 | 100 | $30.52 | |
| ETH | <0.01% | $0.0003 | 95,967.667 | $28.78 | |
| ETH | <0.01% | $0.092822 | 284.8084 | $26.44 | |
| ETH | <0.01% | <$0.000001 | 2,639,586,549,864,221,700 | $26.4 | |
| ETH | <0.01% | $0.007903 | 3,331.637 | $26.33 | |
| ETH | <0.01% | $0.000181 | 142,400 | $25.77 | |
| ETH | <0.01% | $0.000054 | 472,461 | $25.63 | |
| ETH | <0.01% | $0.00002 | 1,256,168.0107 | $25.31 | |
| ETH | <0.01% | $0.142613 | 146.37 | $20.87 | |
| ETH | <0.01% | $0.06462 | 321.415 | $20.77 | |
| ETH | <0.01% | $0.178791 | 112.4683 | $20.11 | |
| ETH | <0.01% | $0.097383 | 200 | $19.48 | |
| ETH | <0.01% | $0.032448 | 596.2056 | $19.35 | |
| ETH | <0.01% | $1.38 | 13.935 | $19.23 | |
| ETH | <0.01% | $0.037646 | 509.9289 | $19.2 | |
| ETH | <0.01% | $0.017348 | 1,077.5065 | $18.69 | |
| ETH | <0.01% | $0.006556 | 2,830.9364 | $18.56 | |
| ETH | <0.01% | $0.000868 | 19,952.5839 | $17.32 | |
| ETH | <0.01% | $0.000621 | 27,437.1466 | $17.04 | |
| ETH | <0.01% | $0.026152 | 613.8083 | $16.05 | |
| ETH | <0.01% | $0.024501 | 567.2971 | $13.9 | |
| ETH | <0.01% | $0.009758 | 1,420.3958 | $13.86 | |
| ETH | <0.01% | $0.393923 | 32.9332 | $12.97 | |
| ETH | <0.01% | $0.000081 | 136,782.261 | $11.14 | |
| ETH | <0.01% | $0.007406 | 1,416 | $10.49 | |
| ETH | <0.01% | $0.00288 | 3,561.6341 | $10.26 | |
| ETH | <0.01% | $0.012723 | 759 | $9.66 | |
| ETH | <0.01% | $0.006525 | 1,472.82 | $9.61 | |
| ETH | <0.01% | <$0.000001 | 332,861,257.1001 | $9.49 | |
| ETH | <0.01% | $0.00 | 15 | $0.00 | |
| ETH | <0.01% | $0.089745 | 102.183 | $9.17 | |
| ETH | <0.01% | $0.004361 | 2,000 | $8.72 | |
| ETH | <0.01% | $65,492 | 0.00013302 | $8.71 | |
| ETH | <0.01% | $0.144496 | 50.372 | $7.28 | |
| ETH | <0.01% | $0.00013 | 52,906 | $6.89 | |
| ETH | <0.01% | $0.011891 | 500 | $5.95 | |
| ETH | <0.01% | $0.005492 | 1,080.4288 | $5.93 | |
| ETH | <0.01% | $2.03 | 2.8 | $5.68 | |
| ETH | <0.01% | $0.045231 | 113.9031 | $5.15 | |
| ETH | <0.01% | $0.00 | 6,054,534.2078 | $0.00 | |
| ETH | <0.01% | $0.000147 | 31,621.6591 | $4.66 | |
| ETH | <0.01% | $0.020234 | 228.1907 | $4.62 | |
| ETH | <0.01% | $0.000009 | 507,056.0927 | $4.33 | |
| ETH | <0.01% | $0.002562 | 1,582.6074 | $4.05 | |
| ETH | <0.01% | $0.023288 | 170.8483 | $3.98 | |
| ETH | <0.01% | <$0.000001 | 116,462,426.5604 | $3.85 | |
| ETH | <0.01% | $0.001364 | 2,531.5053 | $3.45 | |
| ETH | <0.01% | $0.000024 | 139,119.5738 | $3.33 | |
| ETH | <0.01% | $0.033027 | 100 | $3.3 | |
| ETH | <0.01% | $0.000001 | 5,000,000 | $3.06 | |
| ETH | <0.01% | $0.195379 | 13.1301 | $2.57 | |
| ETH | <0.01% | $0.000078 | 31,560 | $2.46 | |
| ETH | <0.01% | $0.000005 | 466,666 | $2.3 | |
| ETH | <0.01% | $0.000282 | 5,798 | $1.64 | |
| ETH | <0.01% | <$0.000001 | 11,984,845.4614 | $1.48 | |
| ETH | <0.01% | $0.0001 | 14,169.9702 | $1.42 | |
| ETH | <0.01% | $0.000069 | 20,000 | $1.38 | |
| ETH | <0.01% | $0.094184 | 14.3397 | $1.35 | |
| ETH | <0.01% | $0.002192 | 495.009 | $1.08 | |
| ETH | <0.01% | $0.000694 | 1,164.23 | $0.8077 | |
| ETH | <0.01% | $0.000098 | 6,760.3087 | $0.6631 | |
| ETH | <0.01% | $0.000032 | 17,041.3043 | $0.5398 | |
| ETH | <0.01% | $0.000033 | 15,251.957 | $0.5062 | |
| ETH | <0.01% | $0.000188 | 2,000 | $0.3765 | |
| ETH | <0.01% | $0.000054 | 5,759.4888 | $0.3107 | |
| ETH | <0.01% | $0.000701 | 377.465 | $0.2646 | |
| ETH | <0.01% | $0.000251 | 1,000 | $0.2505 | |
| ETH | <0.01% | $0.019773 | 10 | $0.1977 | |
| ETH | <0.01% | <$0.000001 | 50,000,000 | $0.1847 | |
| ETH | <0.01% | <$0.000001 | 178,192,341.6604 | $0.1444 | |
| ARB | <0.01% | $2,258.88 | 0.0835 | $188.52 | |
| ARB | <0.01% | $0.009508 | 10,000 | $95.08 | |
| ARB | <0.01% | $0.092699 | 321.8837 | $29.84 | |
| ARB | <0.01% | $1,892.33 | 0.000000002 | $0.000004 | |
| BSC | <0.01% | $1.02 | 100 | $101.99 | |
| BSC | <0.01% | <$0.000001 | 1,477,801.871 | $0.329 | |
| BSC | <0.01% | $0.000002 | 181,718.7097 | $0.3052 | |
| BASE | <0.01% | $0.019895 | 160 | $3.18 | |
| BASE | <0.01% | <$0.000001 | 295,774,647 | $2.37 | |
| BASE | <0.01% | $0.00048 | 4,324.6182 | $2.08 | |
| BASE | <0.01% | $0.001194 | 111.1112 | $0.1326 | |
| POL | <0.01% | $0.109519 | 0.0001 | $0.000011 |
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ 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.