Feature Tip: Add private address tag to any address under My Name Tag !
Source Code
Overview
ETH Balance
0 ETH
Eth Value
$0.00Latest 25 from a total of 36,290 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Create Wallet | 15963030 | 1196 days ago | IN | 0 ETH | 0.0034441 | ||||
| Create Wallet | 15961976 | 1196 days ago | IN | 0 ETH | 0.00409896 | ||||
| Create Wallet | 15958238 | 1197 days ago | IN | 0 ETH | 0.00238821 | ||||
| Create Wallet | 15957765 | 1197 days ago | IN | 0 ETH | 0.00318057 | ||||
| Create Wallet | 15957197 | 1197 days ago | IN | 0 ETH | 0.00263217 | ||||
| Create Wallet | 15957116 | 1197 days ago | IN | 0 ETH | 0.00244103 | ||||
| Create Wallet | 15956956 | 1197 days ago | IN | 0 ETH | 0.00249524 | ||||
| Create Wallet | 15956697 | 1197 days ago | IN | 0 ETH | 0.00223671 | ||||
| Create Wallet | 15955721 | 1197 days ago | IN | 0 ETH | 0.00300435 | ||||
| Create Wallet | 15955243 | 1197 days ago | IN | 0 ETH | 0.0033998 | ||||
| Create Wallet | 15955060 | 1197 days ago | IN | 0 ETH | 0.00298726 | ||||
| Create Wallet | 15954723 | 1197 days ago | IN | 0 ETH | 0.00280791 | ||||
| Create Wallet | 15954673 | 1197 days ago | IN | 0 ETH | 0.00279407 | ||||
| Create Wallet | 15954509 | 1197 days ago | IN | 0 ETH | 0.00327543 | ||||
| Create Wallet | 15953921 | 1197 days ago | IN | 0 ETH | 0.0028356 | ||||
| Create Wallet | 15953789 | 1197 days ago | IN | 0 ETH | 0.00310982 | ||||
| Create Wallet | 15953185 | 1197 days ago | IN | 0 ETH | 0.00376962 | ||||
| Create Wallet | 15953023 | 1197 days ago | IN | 0 ETH | 0.00366631 | ||||
| Create Wallet | 15952909 | 1197 days ago | IN | 0 ETH | 0.00314249 | ||||
| Create Wallet | 15952839 | 1198 days ago | IN | 0 ETH | 0.00315053 | ||||
| Create Wallet | 15952565 | 1198 days ago | IN | 0 ETH | 0.0035167 | ||||
| Create Wallet | 15952450 | 1198 days ago | IN | 0 ETH | 0.00386805 | ||||
| Create Wallet | 15952390 | 1198 days ago | IN | 0 ETH | 0.00336599 | ||||
| Create Wallet | 15952263 | 1198 days ago | IN | 0 ETH | 0.00367229 | ||||
| Create Wallet | 15951794 | 1198 days ago | IN | 0 ETH | 0.00339112 |
Latest 25 internal transactions (View All)
Advanced mode:
| Parent Transaction Hash | Method | Block |
From
|
|
To
|
||
|---|---|---|---|---|---|---|---|
| 0x60806040 | 24167889 | 47 days ago | Contract Creation | 0 ETH | |||
| 0x60806040 | 23984871 | 73 days ago | Contract Creation | 0 ETH | |||
| 0x60806040 | 23856381 | 91 days ago | Contract Creation | 0 ETH | |||
| 0x60806040 | 23700318 | 113 days ago | Contract Creation | 0 ETH | |||
| 0x60806040 | 23635536 | 122 days ago | Contract Creation | 0 ETH | |||
| 0x60806040 | 23482688 | 143 days ago | Contract Creation | 0 ETH | |||
| 0x60806040 | 23406133 | 154 days ago | Contract Creation | 0 ETH | |||
| 0x60806040 | 23378856 | 158 days ago | Contract Creation | 0 ETH | |||
| 0x60806040 | 23313449 | 167 days ago | Contract Creation | 0 ETH | |||
| 0x60806040 | 23134533 | 192 days ago | Contract Creation | 0 ETH | |||
| 0x60806040 | 23090823 | 198 days ago | Contract Creation | 0 ETH | |||
| 0x60806040 | 23065203 | 202 days ago | Contract Creation | 0 ETH | |||
| 0x60806040 | 23004278 | 210 days ago | Contract Creation | 0 ETH | |||
| 0x60806040 | 22998246 | 211 days ago | Contract Creation | 0 ETH | |||
| 0x60806040 | 22966443 | 216 days ago | Contract Creation | 0 ETH | |||
| 0x60806040 | 22892524 | 226 days ago | Contract Creation | 0 ETH | |||
| 0x60806040 | 22885187 | 227 days ago | Contract Creation | 0 ETH | |||
| 0x60806040 | 22867257 | 229 days ago | Contract Creation | 0 ETH | |||
| 0x60806040 | 22842163 | 233 days ago | Contract Creation | 0 ETH | |||
| 0x60806040 | 22823754 | 235 days ago | Contract Creation | 0 ETH | |||
| 0x60806040 | 22821823 | 236 days ago | Contract Creation | 0 ETH | |||
| 0x60806040 | 22821450 | 236 days ago | Contract Creation | 0 ETH | |||
| 0x60806040 | 22820198 | 236 days ago | Contract Creation | 0 ETH | |||
| 0x60806040 | 22814645 | 237 days ago | Contract Creation | 0 ETH | |||
| 0x60806040 | 22812247 | 237 days ago | Contract Creation | 0 ETH |
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Name:
WalletFactory
Compiler Version
v0.7.6+commit.7338295f
Optimization Enabled:
Yes with 100000 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: GPL-2.0-or-later
// Copyright 2017 Loopring Technology Limited.
pragma solidity ^0.7.0;
pragma experimental ABIEncoderV2;
import "../iface/ILoopringWalletV2.sol";
import "../lib/EIP712.sol";
import "../lib/SignatureUtil.sol";
import "./WalletDeploymentLib.sol";
/// @title WalletFactory
/// @dev A factory contract to create a new wallet by deploying a proxy
/// in front of a real wallet.
/// @author Daniel Wang - <daniel@loopring.org>
contract WalletFactory is WalletDeploymentLib
{
using SignatureUtil for bytes32;
event WalletCreated (address wallet, address owner);
bytes32 public immutable DOMAIN_SEPARATOR;
bytes32 public constant CREATE_WALLET_TYPEHASH = keccak256(
"createWallet(address owner,address[] guardians,uint256 quota,address inheritor,address feeRecipient,address feeToken,uint256 maxFeeAmount,uint256 salt)");
struct WalletConfig
{
address owner;
address[] guardians;
uint quota;
address inheritor;
address feeRecipient;
address feeToken;
uint maxFeeAmount;
uint salt;
bytes signature;
}
constructor(
address _walletImplementation
)
WalletDeploymentLib(_walletImplementation)
{
DOMAIN_SEPARATOR = EIP712.hash(
EIP712.Domain("WalletFactory", "2.0.0", address(this))
);
}
/// @dev Create a new wallet by deploying a proxy.
/// @param config The wallet's config.
/// @param feeAmount The fee amount actually paid.
/// @return wallet The new wallet address
function createWallet(
WalletConfig calldata config,
uint feeAmount
)
external
returns (address wallet)
{
require(feeAmount <= config.maxFeeAmount, "INVALID_FEE_AMOUNT");
_validateConfig(config);
wallet = _deploy(config.owner, config.salt);
_initializeWallet(wallet, config, feeAmount);
}
/// @dev Computes the wallet address
/// @param salt The initial wallet owner.
/// @param salt A salt.
/// @return wallet The wallet address
function computeWalletAddress(
address owner,
uint salt
)
public
view
returns (address)
{
return _computeWalletAddress(
owner,
salt,
address(this)
);
}
// --- Internal functions ---
function _initializeWallet(
address wallet,
WalletConfig calldata config,
uint feeAmount
)
internal
{
ILoopringWalletV2(wallet).initialize(
config.owner,
config.guardians,
config.quota,
config.inheritor,
config.feeRecipient,
config.feeToken,
feeAmount
);
emit WalletCreated(wallet, config.owner);
}
function _validateConfig(
WalletConfig calldata config
)
private
view
{
require(config.owner != address(0), "INVALID_OWNER");
bytes32 dataHash = keccak256(
abi.encode(
CREATE_WALLET_TYPEHASH,
config.owner,
keccak256(abi.encodePacked(config.guardians)),
config.quota,
config.inheritor,
config.feeRecipient,
config.feeToken,
config.maxFeeAmount,
config.salt
)
);
bytes32 signHash = EIP712.hashPacked(DOMAIN_SEPARATOR, dataHash);
require(signHash.verifySignature(config.owner, config.signature), "INVALID_SIGNATURE");
}
}// SPDX-License-Identifier: GPL-2.0-or-later
// Copyright 2017 Loopring Technology Limited.
pragma solidity ^0.7.0;
/// @title Loopring SmartWallet V2 interface
/// @author Brecht Devos - <brecht@loopring.org>
abstract contract ILoopringWalletV2
{
/// @dev Initializes the smart wallet.
/// @param owner The wallet owner address.
/// @param guardians The initial wallet guardians.
/// @param quota The initial wallet quota.
/// @param inheritor The inheritor of the wallet.
/// @param feeRecipient The address receiving the fee for creating the wallet.
/// @param feeToken The token to use for the fee payment.
/// @param feeAmount The amount of tokens paid to the fee recipient.
function initialize(
address owner,
address[] calldata guardians,
uint quota,
address inheritor,
address feeRecipient,
address feeToken,
uint feeAmount
)
external
virtual;
/// @dev Returns the timestamp the wallet was created.
/// @return The timestamp the wallet was created.
function getCreationTimestamp()
public
view
virtual
returns (uint64);
/// @dev Returns the current wallet owner.
/// @return The current wallet owner.
function getOwner()
public
view
virtual
returns (address);
}// SPDX-License-Identifier: Apache-2.0
// Copyright 2017 Loopring Technology Limited.
pragma solidity ^0.7.0;
pragma experimental ABIEncoderV2;
library EIP712
{
struct Domain {
string name;
string version;
address verifyingContract;
}
bytes32 constant internal EIP712_DOMAIN_TYPEHASH = keccak256(
"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"
);
string constant internal EIP191_HEADER = "\x19\x01";
function hash(Domain memory domain)
internal
pure
returns (bytes32)
{
uint _chainid;
assembly { _chainid := chainid() }
return keccak256(
abi.encode(
EIP712_DOMAIN_TYPEHASH,
keccak256(bytes(domain.name)),
keccak256(bytes(domain.version)),
_chainid,
domain.verifyingContract
)
);
}
function hashPacked(
bytes32 domainSeparator,
bytes32 dataHash
)
internal
pure
returns (bytes32)
{
return keccak256(
abi.encodePacked(
EIP191_HEADER,
domainSeparator,
dataHash
)
);
}
}// SPDX-License-Identifier: GPL-2.0-or-later
// Copyright 2017 Loopring Technology Limited.
pragma solidity ^0.7.0;
pragma experimental ABIEncoderV2;
import "../thirdparty/BytesUtil.sol";
import "./AddressUtil.sol";
import "./ERC1271.sol";
import "./MathUint.sol";
/// @title SignatureUtil
/// @author Daniel Wang - <daniel@loopring.org>
/// @dev This method supports multihash standard. Each signature's last byte indicates
/// the signature's type.
library SignatureUtil
{
using BytesUtil for bytes;
using MathUint for uint;
using AddressUtil for address;
enum SignatureType {
ILLEGAL,
INVALID,
EIP_712,
ETH_SIGN,
WALLET // deprecated
}
bytes4 constant internal ERC1271_MAGICVALUE = 0x1626ba7e;
function verifySignatures(
bytes32 signHash,
address[] memory signers,
bytes[] memory signatures
)
internal
view
returns (bool)
{
require(signers.length == signatures.length, "BAD_SIGNATURE_DATA");
address lastSigner;
for (uint i = 0; i < signers.length; i++) {
require(signers[i] > lastSigner, "INVALID_SIGNERS_ORDER");
lastSigner = signers[i];
if (!verifySignature(signHash, signers[i], signatures[i])) {
return false;
}
}
return true;
}
function verifySignature(
bytes32 signHash,
address signer,
bytes memory signature
)
internal
view
returns (bool)
{
if (signer == address(0)) {
return false;
}
return signer.isContract()?
verifyERC1271Signature(signHash, signer, signature):
verifyEOASignature(signHash, signer, signature);
}
function recoverECDSASigner(
bytes32 signHash,
bytes memory signature
)
internal
pure
returns (address)
{
if (signature.length != 65) {
return address(0);
}
bytes32 r;
bytes32 s;
uint8 v;
// we jump 32 (0x20) as the first slot of bytes contains the length
// we jump 65 (0x41) per signature
// for v we load 32 bytes ending with v (the first 31 come from s) then apply a mask
assembly {
r := mload(add(signature, 0x20))
s := mload(add(signature, 0x40))
v := and(mload(add(signature, 0x41)), 0xff)
}
// See https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/cryptography/ECDSA.sol
if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {
return address(0);
}
if (v == 27 || v == 28) {
return ecrecover(signHash, v, r, s);
} else {
return address(0);
}
}
function verifyEOASignature(
bytes32 signHash,
address signer,
bytes memory signature
)
private
pure
returns (bool success)
{
if (signer == address(0)) {
return false;
}
uint signatureTypeOffset = signature.length.sub(1);
SignatureType signatureType = SignatureType(signature.toUint8(signatureTypeOffset));
// Strip off the last byte of the signature by updating the length
assembly {
mstore(signature, signatureTypeOffset)
}
if (signatureType == SignatureType.EIP_712) {
success = (signer == recoverECDSASigner(signHash, signature));
} else if (signatureType == SignatureType.ETH_SIGN) {
bytes32 hash = keccak256(
abi.encodePacked("\x19Ethereum Signed Message:\n32", signHash)
);
success = (signer == recoverECDSASigner(hash, signature));
} else {
success = false;
}
// Restore the signature length
assembly {
mstore(signature, add(signatureTypeOffset, 1))
}
return success;
}
function verifyERC1271Signature(
bytes32 signHash,
address signer,
bytes memory signature
)
private
view
returns (bool)
{
bytes memory callData = abi.encodeWithSelector(
ERC1271.isValidSignature.selector,
signHash,
signature
);
(bool success, bytes memory result) = signer.staticcall(callData);
return (
success &&
result.length == 32 &&
result.toBytes4(0) == ERC1271_MAGICVALUE
);
}
}// SPDX-License-Identifier: GPL-2.0-or-later
// Copyright 2017 Loopring Technology Limited.
pragma solidity ^0.7.0;
pragma experimental ABIEncoderV2;
import "../thirdparty/Create2.sol";
import "../thirdparty/proxies/WalletProxy.sol";
/// @title WalletDeploymentLib
/// @dev Functionality to compute wallet addresses and to deploy wallets
/// @author Brecht Devos - <brecht@loopring.org>
contract WalletDeploymentLib
{
address public immutable walletImplementation;
string public constant WALLET_CREATION = "WALLET_CREATION";
constructor(
address _walletImplementation
)
{
walletImplementation = _walletImplementation;
}
function getWalletCode()
public
view
returns (bytes memory)
{
return abi.encodePacked(
type(WalletProxy).creationCode,
abi.encode(walletImplementation)
);
}
function computeWalletSalt(
address owner,
uint salt
)
public
pure
returns (bytes32)
{
return keccak256(
abi.encodePacked(
WALLET_CREATION,
owner,
salt
)
);
}
function _deploy(
address owner,
uint salt
)
internal
returns (address payable wallet)
{
wallet = Create2.deploy(
computeWalletSalt(owner, salt),
getWalletCode()
);
}
function _computeWalletAddress(
address owner,
uint salt,
address deployer
)
internal
view
returns (address)
{
return Create2.computeAddress(
computeWalletSalt(owner, salt),
getWalletCode(),
deployer
);
}
}// SPDX-License-Identifier: UNLICENSED
// Taken from https://github.com/GNSPS/solidity-bytes-utils/blob/master/contracts/BytesLib.sol
pragma solidity ^0.7.0;
library BytesUtil {
function slice(
bytes memory _bytes,
uint _start,
uint _length
)
internal
pure
returns (bytes memory)
{
require(_bytes.length >= (_start + _length));
bytes memory tempBytes;
assembly {
switch iszero(_length)
case 0 {
// Get a location of some free memory and store it in tempBytes as
// Solidity does for memory variables.
tempBytes := mload(0x40)
// The first word of the slice result is potentially a partial
// word read from the original array. To read it, we calculate
// the length of that partial word and start copying that many
// bytes into the array. The first word we copy will start with
// data we don't care about, but the last `lengthmod` bytes will
// land at the beginning of the contents of the new array. When
// we're done copying, we overwrite the full first word with
// the actual length of the slice.
let lengthmod := and(_length, 31)
// The multiplication in the next line is necessary
// because when slicing multiples of 32 bytes (lengthmod == 0)
// the following copy loop was copying the origin's length
// and then ending prematurely not copying everything it should.
let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))
let end := add(mc, _length)
for {
// The multiplication in the next line has the same exact purpose
// as the one above.
let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)
} lt(mc, end) {
mc := add(mc, 0x20)
cc := add(cc, 0x20)
} {
mstore(mc, mload(cc))
}
mstore(tempBytes, _length)
//update free-memory pointer
//allocating the array padded to 32 bytes like the compiler does now
mstore(0x40, and(add(mc, 31), not(31)))
}
//if we want a zero-length slice let's just return a zero-length array
default {
tempBytes := mload(0x40)
mstore(0x40, add(tempBytes, 0x20))
}
}
return tempBytes;
}
function toAddress(bytes memory _bytes, uint _start) internal pure returns (address) {
require(_bytes.length >= (_start + 20));
address tempAddress;
assembly {
tempAddress := div(mload(add(add(_bytes, 0x20), _start)), 0x1000000000000000000000000)
}
return tempAddress;
}
function toUint8(bytes memory _bytes, uint _start) internal pure returns (uint8) {
require(_bytes.length >= (_start + 1));
uint8 tempUint;
assembly {
tempUint := mload(add(add(_bytes, 0x1), _start))
}
return tempUint;
}
function toUint16(bytes memory _bytes, uint _start) internal pure returns (uint16) {
require(_bytes.length >= (_start + 2));
uint16 tempUint;
assembly {
tempUint := mload(add(add(_bytes, 0x2), _start))
}
return tempUint;
}
function toUint24(bytes memory _bytes, uint _start) internal pure returns (uint24) {
require(_bytes.length >= (_start + 3));
uint24 tempUint;
assembly {
tempUint := mload(add(add(_bytes, 0x3), _start))
}
return tempUint;
}
function toUint32(bytes memory _bytes, uint _start) internal pure returns (uint32) {
require(_bytes.length >= (_start + 4));
uint32 tempUint;
assembly {
tempUint := mload(add(add(_bytes, 0x4), _start))
}
return tempUint;
}
function toUint64(bytes memory _bytes, uint _start) internal pure returns (uint64) {
require(_bytes.length >= (_start + 8));
uint64 tempUint;
assembly {
tempUint := mload(add(add(_bytes, 0x8), _start))
}
return tempUint;
}
function toUint96(bytes memory _bytes, uint _start) internal pure returns (uint96) {
require(_bytes.length >= (_start + 12));
uint96 tempUint;
assembly {
tempUint := mload(add(add(_bytes, 0xc), _start))
}
return tempUint;
}
function toUint128(bytes memory _bytes, uint _start) internal pure returns (uint128) {
require(_bytes.length >= (_start + 16));
uint128 tempUint;
assembly {
tempUint := mload(add(add(_bytes, 0x10), _start))
}
return tempUint;
}
function toUint(bytes memory _bytes, uint _start) internal pure returns (uint256) {
require(_bytes.length >= (_start + 32));
uint256 tempUint;
assembly {
tempUint := mload(add(add(_bytes, 0x20), _start))
}
return tempUint;
}
function toBytes4(bytes memory _bytes, uint _start) internal pure returns (bytes4) {
require(_bytes.length >= (_start + 4));
bytes4 tempBytes4;
assembly {
tempBytes4 := mload(add(add(_bytes, 0x20), _start))
}
return tempBytes4;
}
function toBytes32(bytes memory _bytes, uint _start) internal pure returns (bytes32) {
require(_bytes.length >= (_start + 32));
bytes32 tempBytes32;
assembly {
tempBytes32 := mload(add(add(_bytes, 0x20), _start))
}
return tempBytes32;
}
function fastSHA256(
bytes memory data
)
internal
view
returns (bytes32)
{
bytes32[] memory result = new bytes32[](1);
bool success;
assembly {
let ptr := add(data, 32)
success := staticcall(sub(gas(), 2000), 2, ptr, mload(data), add(result, 32), 32)
}
require(success, "SHA256_FAILED");
return result[0];
}
}// SPDX-License-Identifier: GPL-2.0-or-later
// Copyright 2017 Loopring Technology Limited.
pragma solidity ^0.7.0;
/// @title Utility Functions for addresses
/// @author Daniel Wang - <daniel@loopring.org>
/// @author Brecht Devos - <brecht@loopring.org>
library AddressUtil
{
using AddressUtil for *;
function isContract(
address addr
)
internal
view
returns (bool)
{
// According to EIP-1052, 0x0 is the value returned for not-yet created accounts
// and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned
// for accounts without code, i.e. `keccak256('')`
bytes32 codehash;
// solhint-disable-next-line no-inline-assembly
assembly { codehash := extcodehash(addr) }
return (codehash != 0x0 &&
codehash != 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470);
}
function toPayable(
address addr
)
internal
pure
returns (address payable)
{
return payable(addr);
}
// Works like address.send but with a customizable gas limit
// Make sure your code is safe for reentrancy when using this function!
function sendETH(
address to,
uint amount,
uint gasLimit
)
internal
returns (bool success)
{
if (amount == 0) {
return true;
}
address payable recipient = to.toPayable();
/* solium-disable-next-line */
(success,) = recipient.call{value: amount, gas: gasLimit}("");
}
// Works like address.transfer but with a customizable gas limit
// Make sure your code is safe for reentrancy when using this function!
function sendETHAndVerify(
address to,
uint amount,
uint gasLimit
)
internal
returns (bool success)
{
success = to.sendETH(amount, gasLimit);
require(success, "TRANSFER_FAILURE");
}
// Works like call but is slightly more efficient when data
// needs to be copied from memory to do the call.
function fastCall(
address to,
uint gasLimit,
uint value,
bytes memory data
)
internal
returns (bool success, bytes memory returnData)
{
if (to != address(0)) {
assembly {
// Do the call
success := call(gasLimit, to, value, add(data, 32), mload(data), 0, 0)
// Copy the return data
let size := returndatasize()
returnData := mload(0x40)
mstore(returnData, size)
returndatacopy(add(returnData, 32), 0, size)
// Update free memory pointer
mstore(0x40, add(returnData, add(32, size)))
}
}
}
// Like fastCall, but throws when the call is unsuccessful.
function fastCallAndVerify(
address to,
uint gasLimit,
uint value,
bytes memory data
)
internal
returns (bytes memory returnData)
{
bool success;
(success, returnData) = fastCall(to, gasLimit, value, data);
if (!success) {
assembly {
revert(add(returnData, 32), mload(returnData))
}
}
}
}// SPDX-License-Identifier: GPL-2.0-or-later
// Copyright 2017 Loopring Technology Limited.
pragma solidity ^0.7.0;
abstract contract ERC1271 {
// bytes4(keccak256("isValidSignature(bytes32,bytes)")
bytes4 constant internal ERC1271_MAGICVALUE = 0x1626ba7e;
function isValidSignature(
bytes32 _hash,
bytes memory _signature)
public
view
virtual
returns (bytes4 magicValue);
}// SPDX-License-Identifier: GPL-2.0-or-later
// Copyright 2017 Loopring Technology Limited.
pragma solidity ^0.7.0;
/// @title Utility Functions for uint
/// @author Daniel Wang - <daniel@loopring.org>
library MathUint
{
function mul(
uint a,
uint b
)
internal
pure
returns (uint c)
{
c = a * b;
require(a == 0 || c / a == b, "MUL_OVERFLOW");
}
function sub(
uint a,
uint b
)
internal
pure
returns (uint)
{
require(b <= a, "SUB_UNDERFLOW");
return a - b;
}
function add(
uint a,
uint b
)
internal
pure
returns (uint c)
{
c = a + b;
require(c >= a, "ADD_OVERFLOW");
}
}// SPDX-License-Identifier: UNLICENSED
// Taken from: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/970f687f04d20e01138a3e8ccf9278b1d4b3997b/contracts/utils/Create2.sol
pragma solidity ^0.7.0;
/**
* @dev Helper to make usage of the `CREATE2` EVM opcode easier and safer.
* `CREATE2` can be used to compute in advance the address where a smart
* contract will be deployed, which allows for interesting new mechanisms known
* as 'counterfactual interactions'.
*
* See the https://eips.ethereum.org/EIPS/eip-1014#motivation[EIP] for more
* information.
*/
library Create2 {
/**
* @dev Deploys a contract using `CREATE2`. The address where the contract
* will be deployed can be known in advance via {computeAddress}. Note that
* a contract cannot be deployed twice using the same salt.
*/
function deploy(bytes32 salt, bytes memory bytecode) internal returns (address payable) {
address payable addr;
// solhint-disable-next-line no-inline-assembly
assembly {
addr := create2(0, add(bytecode, 0x20), mload(bytecode), salt)
}
require(addr != address(0), "CREATE2_FAILED");
return addr;
}
/**
* @dev Returns the address where a contract will be stored if deployed via {deploy}. Any change in the `bytecode`
* or `salt` will result in a new destination address.
*/
function computeAddress(bytes32 salt, bytes memory bytecode) internal view returns (address) {
return computeAddress(salt, bytecode, address(this));
}
/**
* @dev Returns the address where a contract will be stored if deployed via {deploy} from a contract located at
* `deployer`. If `deployer` is this contract's address, returns the same value as {computeAddress}.
*/
function computeAddress(bytes32 salt, bytes memory bytecodeHash, address deployer) internal pure returns (address) {
bytes32 bytecodeHashHash = keccak256(bytecodeHash);
bytes32 _data = keccak256(
abi.encodePacked(bytes1(0xff), deployer, salt, bytecodeHashHash)
);
return address(bytes20(_data << 96));
}
}// SPDX-License-Identifier: LGPL-3.0-or-later
// Taken from: https://github.com/gnosis/safe-contracts/blob/development/contracts/proxies/GnosisSafeProxy.sol
pragma solidity ^0.7.0;
/// @title IProxy - Helper interface to access masterCopy of the Proxy on-chain
/// @author Richard Meissner - <richard@gnosis.io>
interface IProxy {
function masterCopy() external view returns (address);
}
/// @title WalletProxy - Generic proxy contract allows to execute all transactions applying the code of a master contract.
/// @author Stefan George - <stefan@gnosis.io>
/// @author Richard Meissner - <richard@gnosis.io>
contract WalletProxy {
// masterCopy always needs to be first declared variable, to ensure that it is at the same location in the contracts to which calls are delegated.
// To reduce deployment costs this variable is internal and needs to be retrieved via `getStorageAt`
address internal masterCopy;
/// @dev Constructor function sets address of master copy contract.
/// @param _masterCopy Master copy address.
constructor(address _masterCopy)
{
require(_masterCopy != address(0), "Invalid master copy address provided");
masterCopy = _masterCopy;
}
/// @dev Fallback function forwards all transactions and returns all received return data.
fallback()
payable
external
{
// solium-disable-next-line security/no-inline-assembly
assembly {
let _masterCopy := and(sload(0), 0xffffffffffffffffffffffffffffffffffffffff)
// 0xa619486e == keccak("masterCopy()"). The value is right padded to 32-bytes with 0s
if eq(calldataload(0), 0xa619486e00000000000000000000000000000000000000000000000000000000) {
mstore(0, _masterCopy)
return(0, 0x20)
}
calldatacopy(0, 0, calldatasize())
let success := delegatecall(gas(), _masterCopy, 0, calldatasize(), 0, 0)
returndatacopy(0, 0, returndatasize())
if eq(success, 0) { revert(0, returndatasize()) }
return(0, returndatasize())
}
}
}{
"optimizer": {
"enabled": true,
"runs": 100000
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"abi"
]
}
},
"libraries": {}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_walletImplementation","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"wallet","type":"address"},{"indexed":false,"internalType":"address","name":"owner","type":"address"}],"name":"WalletCreated","type":"event"},{"inputs":[],"name":"CREATE_WALLET_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WALLET_CREATION","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"salt","type":"uint256"}],"name":"computeWalletAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"salt","type":"uint256"}],"name":"computeWalletSalt","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address[]","name":"guardians","type":"address[]"},{"internalType":"uint256","name":"quota","type":"uint256"},{"internalType":"address","name":"inheritor","type":"address"},{"internalType":"address","name":"feeRecipient","type":"address"},{"internalType":"address","name":"feeToken","type":"address"},{"internalType":"uint256","name":"maxFeeAmount","type":"uint256"},{"internalType":"uint256","name":"salt","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct WalletFactory.WalletConfig","name":"config","type":"tuple"},{"internalType":"uint256","name":"feeAmount","type":"uint256"}],"name":"createWallet","outputs":[{"internalType":"address","name":"wallet","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getWalletCode","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"walletImplementation","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]Contract Creation Code
60c060405234801561001057600080fd5b5060405161167a38038061167a83398101604081905261002f91610146565b80806001600160a01b03166080816001600160a01b031660601b81525050506100c660405180606001604052806040518060400160405280600d81526020016c57616c6c6574466163746f727960981b8152508152602001604051806040016040528060058152602001640322e302e360dc1b8152508152602001306001600160a01b03168152506100cf60201b61037e1760201c565b60a052506101a0565b6000804690507f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f836000015180519060200120846020015180519060200120838660400151604051602001610128959493929190610174565b60405160208183030381529060405280519060200120915050919050565b600060208284031215610157578081fd5b81516001600160a01b038116811461016d578182fd5b9392505050565b9485526020850193909352604084019190915260608301526001600160a01b0316608082015260a00190565b60805160601c60a0516114aa6101d0600039806101205280610555525080610168528061028d52506114aa6000f3fe608060405234801561001057600080fd5b50600436106100885760003560e01c8063b6830d8f1161005b578063b6830d8f146100dd578063ce158612146100f0578063d70e200014610103578063d92d1f561461010b57610088565b80633644e5151461008d5780634c30d6c9146100ab5780638117abc1146100b357806390610b0e146100c8575b600080fd5b61009561011e565b6040516100a29190611079565b60405180910390f35b610095610142565b6100bb610166565b6040516100a29190610fa8565b6100d061018a565b6040516100a2919061114e565b6100956100eb366004610db9565b6101c3565b6100bb6100fe366004610db9565b61022e565b6100d0610242565b6100bb610119366004610de2565b610305565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f4392cdd6c9d91e0896c5def13bad6473db5d21e2b0def85ab8c2475c3e60d14c81565b7f000000000000000000000000000000000000000000000000000000000000000081565b6040518060400160405280600f81526020017f57414c4c45545f4352454154494f4e000000000000000000000000000000000081525081565b60006040518060400160405280600f81526020017f57414c4c45545f4352454154494f4e0000000000000000000000000000000000815250838360405160200161020f93929190610efe565b6040516020818303038152906040528051906020012090505b92915050565b600061023b8383306103f6565b9392505050565b60606040518060200161025490610d6e565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082820381018352601f9091011660408190526102b5907f000000000000000000000000000000000000000000000000000000000000000090602001610fa8565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290526102f19291602001610ecf565b604051602081830303815290604052905090565b60008260c0013582111561034e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161034590611161565b60405180910390fd5b6103578361041b565b6103716103676020850185610d9f565b8460e00135610613565b905061022881848461062f565b6000804690507f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f8360000151805190602001208460200151805190602001208386604001516040516020016103d79594939291906110de565b604051602081830303815290604052805190602001209150505b919050565b600061041361040585856101c3565b61040d610242565b8461073d565b949350505050565b600061042a6020830183610d9f565b73ffffffffffffffffffffffffffffffffffffffff161415610478576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610345906111cf565b60007f4392cdd6c9d91e0896c5def13bad6473db5d21e2b0def85ab8c2475c3e60d14c6104a86020840184610d9f565b6104b56020850185611206565b6040516020016104c6929190610e66565b6040516020818303038152906040528051906020012084604001358560600160208101906104f49190610d9f565b61050460a0880160808901610d9f565b61051460c0890160a08a01610d9f565b8860c001358960e0013560405160200161053699989796959493929190611082565b604051602081830303815290604052805190602001209050600061057a7f0000000000000000000000000000000000000000000000000000000000000000836107dc565b90506105d861058c6020850185610d9f565b61059a610100860186611272565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508694939250506108289050565b61060e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161034590611198565b505050565b600061023b61062284846101c3565b61062a610242565b61088b565b73ffffffffffffffffffffffffffffffffffffffff831663d6bb65c26106586020850185610d9f565b6106656020860186611206565b604087013561067a6080890160608a01610d9f565b61068a60a08a0160808b01610d9f565b61069a60c08b0160a08c01610d9f565b896040518963ffffffff1660e01b81526004016106be989796959493929190610ff0565b600060405180830381600087803b1580156106d857600080fd5b505af11580156106ec573d6000803e3d6000fd5b507f5b03bfed1c14a02bdeceb5fa582eb1a5765fc0bc64ca0e6af4c20afc9487f081925085915061072290506020850185610d9f565b604051610730929190610fc9565b60405180910390a1505050565b8151602092830120604080517fff000000000000000000000000000000000000000000000000000000000000008186015260609390931b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660218401526035830194909452605580830191909152835180830390910181526075909101909252815191012073ffffffffffffffffffffffffffffffffffffffff1690565b60006040518060400160405280600281526020017f1901000000000000000000000000000000000000000000000000000000000000815250838360405160200161020f93929190610f50565b600073ffffffffffffffffffffffffffffffffffffffff831661084d5750600061023b565b61086c8373ffffffffffffffffffffffffffffffffffffffff1661091c565b6108805761087b848484610953565b610413565b610413848484610a8d565b600080838351602085016000f5905073ffffffffffffffffffffffffffffffffffffffff811661023b57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f435245415445325f4641494c4544000000000000000000000000000000000000604482015290519081900360640190fd5b6000813f801580159061023b57507fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470141592915050565b600073ffffffffffffffffffffffffffffffffffffffff83166109785750600061023b565b8151600090610988906001610be7565b905060006109968483610c5e565b60ff1660048111156109a457fe5b828552905060028160048111156109b757fe5b14156109fc576109c78685610c7a565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16149250610a80565b6003816004811115610a0a57fe5b1415610a7b57600086604051602001610a239190610f77565b604051602081830303815290604052805190602001209050610a458186610c7a565b73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614935050610a80565b600092505b5060010182529392505050565b600080631626ba7e60e01b8584604051602401610aab929190611117565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505090506000808573ffffffffffffffffffffffffffffffffffffffff1683604051610b329190610eb3565b600060405180830381855afa9150503d8060008114610b6d576040519150601f19603f3d011682016040523d82523d6000602084013e610b72565b606091505b5091509150818015610b85575080516020145b8015610bdc57507f1626ba7e00000000000000000000000000000000000000000000000000000000610bb8826000610d52565b7fffffffff0000000000000000000000000000000000000000000000000000000016145b979650505050505050565b600082821115610c5857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f5355425f554e444552464c4f5700000000000000000000000000000000000000604482015290519081900360640190fd5b50900390565b60008160010183511015610c7157600080fd5b50016001015190565b60008151604114610c8d57506000610228565b60208201516040830151604184015160ff167f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0821115610cd35760009350505050610228565b8060ff16601b1480610ce857508060ff16601c145b15610d465760018682858560405160008152602001604052604051610d109493929190611130565b6020604051602081039080840390855afa158015610d32573d6000803e3d6000fd5b505050602060405103519350505050610228565b60009350505050610228565b60008160040183511015610d6557600080fd5b50016020015190565b61016f8061130683390190565b803573ffffffffffffffffffffffffffffffffffffffff811681146103f157600080fd5b600060208284031215610db0578081fd5b61023b82610d7b565b60008060408385031215610dcb578081fd5b610dd483610d7b565b946020939093013593505050565b60008060408385031215610df4578182fd5b823567ffffffffffffffff811115610e0a578283fd5b83016101208186031215610dd4578283fd5b60008151808452610e348160208601602086016112d5565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60008184825b85811015610ea85773ffffffffffffffffffffffffffffffffffffffff610e9283610d7b565b1683526020928301929190910190600101610e6c565b509095945050505050565b60008251610ec58184602087016112d5565b9190910192915050565b60008351610ee18184602088016112d5565b835190830190610ef58183602088016112d5565b01949350505050565b60008451610f108184602089016112d5565b60609490941b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001691909301908152601481019190915260340192915050565b60008451610f628184602089016112d5565b91909101928352506020820152604001919050565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000008152601c810191909152603c0190565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff898116825260e060208084018290529083018990526000918a916101008501845b8c81101561104b578361103886610d7b565b1682529382019390820190600101611026565b50604086019a909a5250968716606084015250509284166080840152921660a082015260c001529392505050565b90815260200190565b98895273ffffffffffffffffffffffffffffffffffffffff97881660208a0152604089019690965260608801949094529185166080870152841660a086015290921660c084015260e08301919091526101008201526101200190565b94855260208501939093526040840191909152606083015273ffffffffffffffffffffffffffffffffffffffff16608082015260a00190565b6000838252604060208301526104136040830184610e1c565b93845260ff9290921660208401526040830152606082015260800190565b60006020825261023b6020830184610e1c565b60208082526012908201527f494e56414c49445f4645455f414d4f554e540000000000000000000000000000604082015260600190565b60208082526011908201527f494e56414c49445f5349474e4154555245000000000000000000000000000000604082015260600190565b6020808252600d908201527f494e56414c49445f4f574e455200000000000000000000000000000000000000604082015260600190565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261123a578283fd5b83018035915067ffffffffffffffff821115611254578283fd5b602090810192508102360382131561126b57600080fd5b9250929050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126112a6578283fd5b83018035915067ffffffffffffffff8211156112c0578283fd5b60200191503681900382131561126b57600080fd5b60005b838110156112f05781810151838201526020016112d8565b838111156112ff576000848401525b5050505056fe608060405234801561001057600080fd5b5060405161016f38038061016f8339818101604052602081101561003357600080fd5b50516001600160a01b03811661007a5760405162461bcd60e51b815260040180806020018281038252602481526020018061014b6024913960400191505060405180910390fd5b600080546001600160a01b039092166001600160a01b031990921691909117905560a2806100a96000396000f3fe6080604052600073ffffffffffffffffffffffffffffffffffffffff8154167fa619486e0000000000000000000000000000000000000000000000000000000082351415604e57808252602082f35b3682833781823684845af490503d82833e806067573d82fd5b503d81f3fea2646970667358221220676404d5a2e50e328cc18fc786619f9629ae43d7ff695286c941717f0a1541e564736f6c63430007060033496e76616c6964206d617374657220636f707920616464726573732070726f7669646564a2646970667358221220031af176f2c7f9ed4a814027955ffc95f97cc7923eee4ae25a9960c5ba61130564736f6c634300070600330000000000000000000000005fc8a17dded0a4da0f9a1e44e6c26f80aa514145
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106100885760003560e01c8063b6830d8f1161005b578063b6830d8f146100dd578063ce158612146100f0578063d70e200014610103578063d92d1f561461010b57610088565b80633644e5151461008d5780634c30d6c9146100ab5780638117abc1146100b357806390610b0e146100c8575b600080fd5b61009561011e565b6040516100a29190611079565b60405180910390f35b610095610142565b6100bb610166565b6040516100a29190610fa8565b6100d061018a565b6040516100a2919061114e565b6100956100eb366004610db9565b6101c3565b6100bb6100fe366004610db9565b61022e565b6100d0610242565b6100bb610119366004610de2565b610305565b7f44b0e1bf0ffabd0a1bf70b2f6fb3293e5e083e1faae650bb590234bf1950621f81565b7f4392cdd6c9d91e0896c5def13bad6473db5d21e2b0def85ab8c2475c3e60d14c81565b7f0000000000000000000000005fc8a17dded0a4da0f9a1e44e6c26f80aa51414581565b6040518060400160405280600f81526020017f57414c4c45545f4352454154494f4e000000000000000000000000000000000081525081565b60006040518060400160405280600f81526020017f57414c4c45545f4352454154494f4e0000000000000000000000000000000000815250838360405160200161020f93929190610efe565b6040516020818303038152906040528051906020012090505b92915050565b600061023b8383306103f6565b9392505050565b60606040518060200161025490610d6e565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082820381018352601f9091011660408190526102b5907f0000000000000000000000005fc8a17dded0a4da0f9a1e44e6c26f80aa51414590602001610fa8565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290526102f19291602001610ecf565b604051602081830303815290604052905090565b60008260c0013582111561034e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161034590611161565b60405180910390fd5b6103578361041b565b6103716103676020850185610d9f565b8460e00135610613565b905061022881848461062f565b6000804690507f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f8360000151805190602001208460200151805190602001208386604001516040516020016103d79594939291906110de565b604051602081830303815290604052805190602001209150505b919050565b600061041361040585856101c3565b61040d610242565b8461073d565b949350505050565b600061042a6020830183610d9f565b73ffffffffffffffffffffffffffffffffffffffff161415610478576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610345906111cf565b60007f4392cdd6c9d91e0896c5def13bad6473db5d21e2b0def85ab8c2475c3e60d14c6104a86020840184610d9f565b6104b56020850185611206565b6040516020016104c6929190610e66565b6040516020818303038152906040528051906020012084604001358560600160208101906104f49190610d9f565b61050460a0880160808901610d9f565b61051460c0890160a08a01610d9f565b8860c001358960e0013560405160200161053699989796959493929190611082565b604051602081830303815290604052805190602001209050600061057a7f44b0e1bf0ffabd0a1bf70b2f6fb3293e5e083e1faae650bb590234bf1950621f836107dc565b90506105d861058c6020850185610d9f565b61059a610100860186611272565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508694939250506108289050565b61060e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161034590611198565b505050565b600061023b61062284846101c3565b61062a610242565b61088b565b73ffffffffffffffffffffffffffffffffffffffff831663d6bb65c26106586020850185610d9f565b6106656020860186611206565b604087013561067a6080890160608a01610d9f565b61068a60a08a0160808b01610d9f565b61069a60c08b0160a08c01610d9f565b896040518963ffffffff1660e01b81526004016106be989796959493929190610ff0565b600060405180830381600087803b1580156106d857600080fd5b505af11580156106ec573d6000803e3d6000fd5b507f5b03bfed1c14a02bdeceb5fa582eb1a5765fc0bc64ca0e6af4c20afc9487f081925085915061072290506020850185610d9f565b604051610730929190610fc9565b60405180910390a1505050565b8151602092830120604080517fff000000000000000000000000000000000000000000000000000000000000008186015260609390931b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660218401526035830194909452605580830191909152835180830390910181526075909101909252815191012073ffffffffffffffffffffffffffffffffffffffff1690565b60006040518060400160405280600281526020017f1901000000000000000000000000000000000000000000000000000000000000815250838360405160200161020f93929190610f50565b600073ffffffffffffffffffffffffffffffffffffffff831661084d5750600061023b565b61086c8373ffffffffffffffffffffffffffffffffffffffff1661091c565b6108805761087b848484610953565b610413565b610413848484610a8d565b600080838351602085016000f5905073ffffffffffffffffffffffffffffffffffffffff811661023b57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f435245415445325f4641494c4544000000000000000000000000000000000000604482015290519081900360640190fd5b6000813f801580159061023b57507fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470141592915050565b600073ffffffffffffffffffffffffffffffffffffffff83166109785750600061023b565b8151600090610988906001610be7565b905060006109968483610c5e565b60ff1660048111156109a457fe5b828552905060028160048111156109b757fe5b14156109fc576109c78685610c7a565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16149250610a80565b6003816004811115610a0a57fe5b1415610a7b57600086604051602001610a239190610f77565b604051602081830303815290604052805190602001209050610a458186610c7a565b73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614935050610a80565b600092505b5060010182529392505050565b600080631626ba7e60e01b8584604051602401610aab929190611117565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505090506000808573ffffffffffffffffffffffffffffffffffffffff1683604051610b329190610eb3565b600060405180830381855afa9150503d8060008114610b6d576040519150601f19603f3d011682016040523d82523d6000602084013e610b72565b606091505b5091509150818015610b85575080516020145b8015610bdc57507f1626ba7e00000000000000000000000000000000000000000000000000000000610bb8826000610d52565b7fffffffff0000000000000000000000000000000000000000000000000000000016145b979650505050505050565b600082821115610c5857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f5355425f554e444552464c4f5700000000000000000000000000000000000000604482015290519081900360640190fd5b50900390565b60008160010183511015610c7157600080fd5b50016001015190565b60008151604114610c8d57506000610228565b60208201516040830151604184015160ff167f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0821115610cd35760009350505050610228565b8060ff16601b1480610ce857508060ff16601c145b15610d465760018682858560405160008152602001604052604051610d109493929190611130565b6020604051602081039080840390855afa158015610d32573d6000803e3d6000fd5b505050602060405103519350505050610228565b60009350505050610228565b60008160040183511015610d6557600080fd5b50016020015190565b61016f8061130683390190565b803573ffffffffffffffffffffffffffffffffffffffff811681146103f157600080fd5b600060208284031215610db0578081fd5b61023b82610d7b565b60008060408385031215610dcb578081fd5b610dd483610d7b565b946020939093013593505050565b60008060408385031215610df4578182fd5b823567ffffffffffffffff811115610e0a578283fd5b83016101208186031215610dd4578283fd5b60008151808452610e348160208601602086016112d5565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60008184825b85811015610ea85773ffffffffffffffffffffffffffffffffffffffff610e9283610d7b565b1683526020928301929190910190600101610e6c565b509095945050505050565b60008251610ec58184602087016112d5565b9190910192915050565b60008351610ee18184602088016112d5565b835190830190610ef58183602088016112d5565b01949350505050565b60008451610f108184602089016112d5565b60609490941b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001691909301908152601481019190915260340192915050565b60008451610f628184602089016112d5565b91909101928352506020820152604001919050565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000008152601c810191909152603c0190565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff898116825260e060208084018290529083018990526000918a916101008501845b8c81101561104b578361103886610d7b565b1682529382019390820190600101611026565b50604086019a909a5250968716606084015250509284166080840152921660a082015260c001529392505050565b90815260200190565b98895273ffffffffffffffffffffffffffffffffffffffff97881660208a0152604089019690965260608801949094529185166080870152841660a086015290921660c084015260e08301919091526101008201526101200190565b94855260208501939093526040840191909152606083015273ffffffffffffffffffffffffffffffffffffffff16608082015260a00190565b6000838252604060208301526104136040830184610e1c565b93845260ff9290921660208401526040830152606082015260800190565b60006020825261023b6020830184610e1c565b60208082526012908201527f494e56414c49445f4645455f414d4f554e540000000000000000000000000000604082015260600190565b60208082526011908201527f494e56414c49445f5349474e4154555245000000000000000000000000000000604082015260600190565b6020808252600d908201527f494e56414c49445f4f574e455200000000000000000000000000000000000000604082015260600190565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261123a578283fd5b83018035915067ffffffffffffffff821115611254578283fd5b602090810192508102360382131561126b57600080fd5b9250929050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126112a6578283fd5b83018035915067ffffffffffffffff8211156112c0578283fd5b60200191503681900382131561126b57600080fd5b60005b838110156112f05781810151838201526020016112d8565b838111156112ff576000848401525b5050505056fe608060405234801561001057600080fd5b5060405161016f38038061016f8339818101604052602081101561003357600080fd5b50516001600160a01b03811661007a5760405162461bcd60e51b815260040180806020018281038252602481526020018061014b6024913960400191505060405180910390fd5b600080546001600160a01b039092166001600160a01b031990921691909117905560a2806100a96000396000f3fe6080604052600073ffffffffffffffffffffffffffffffffffffffff8154167fa619486e0000000000000000000000000000000000000000000000000000000082351415604e57808252602082f35b3682833781823684845af490503d82833e806067573d82fd5b503d81f3fea2646970667358221220676404d5a2e50e328cc18fc786619f9629ae43d7ff695286c941717f0a1541e564736f6c63430007060033496e76616c6964206d617374657220636f707920616464726573732070726f7669646564a2646970667358221220031af176f2c7f9ed4a814027955ffc95f97cc7923eee4ae25a9960c5ba61130564736f6c63430007060033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000005fc8a17dded0a4da0f9a1e44e6c26f80aa514145
-----Decoded View---------------
Arg [0] : _walletImplementation (address): 0x5fC8A17DdED0a4dA0f9a1E44E6C26F80Aa514145
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000005fc8a17dded0a4da0f9a1e44e6c26f80aa514145
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 34 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
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.