Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Advanced mode: Intended for advanced users or developers and will display all Internal Transactions including zero value transfers. Name tag integration is not available in advanced view.
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block |
From
|
To
|
||||
---|---|---|---|---|---|---|---|
21762478 | 1 min ago | 0 ETH | |||||
21762478 | 1 min ago | 0 ETH | |||||
21762477 | 1 min ago | 0 ETH | |||||
21762477 | 1 min ago | 0 ETH | |||||
21762476 | 1 min ago | 0 ETH | |||||
21762476 | 1 min ago | 0 ETH | |||||
21762471 | 2 mins ago | 0 ETH | |||||
21762471 | 2 mins ago | 0 ETH | |||||
21762467 | 3 mins ago | 0 ETH | |||||
21762467 | 3 mins ago | 0 ETH | |||||
21762459 | 5 mins ago | 0 ETH | |||||
21762459 | 5 mins ago | 0 ETH | |||||
21762459 | 5 mins ago | 0 ETH | |||||
21762459 | 5 mins ago | 0 ETH | |||||
21762455 | 5 mins ago | 0 ETH | |||||
21762455 | 5 mins ago | 0 ETH | |||||
21762453 | 6 mins ago | 0 ETH | |||||
21762453 | 6 mins ago | 0 ETH | |||||
21762452 | 6 mins ago | 0 ETH | |||||
21762452 | 6 mins ago | 0 ETH | |||||
21762451 | 6 mins ago | 0 ETH | |||||
21762451 | 6 mins ago | 0 ETH | |||||
21762450 | 6 mins ago | 0 ETH | |||||
21762450 | 6 mins ago | 0 ETH | |||||
21762450 | 6 mins ago | 0 ETH |
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
Delegate
Compiler Version
v0.8.17+commit.8df45f5f
Optimization Enabled:
Yes with 20000 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity 0.8.17; import { ERC721 } from "lib/solmate/src/tokens/ERC721.sol"; import { ERC1155 } from "lib/solmate/src/tokens/ERC1155.sol"; import { ERC20 } from "lib/solmate/src/tokens/ERC20.sol"; import "./lib/Constants.sol"; import { AssetType, OrderType, Transfer } from "./lib/Structs.sol"; contract Delegate { error Unauthorized(); error InvalidLength(); address private immutable _EXCHANGE; constructor(address exchange) { _EXCHANGE = exchange; } modifier onlyApproved() { if (msg.sender != _EXCHANGE) { revert Unauthorized(); } _; } function transfer( address taker, OrderType orderType, Transfer[] calldata transfers, uint256 length ) external onlyApproved returns (bool[] memory successful) { if (transfers.length < length) { revert InvalidLength(); } successful = new bool[](length); for (uint256 i; i < length; ) { assembly { let calldataPointer := mload(0x40) let transfersPointer := add(transfers.offset, mul(Transfer_size, i)) let assetType := calldataload(add(transfersPointer, Transfer_assetType_offset)) switch assetType case 0 { // AssetType_ERC721 mstore(calldataPointer, ERC721_safeTransferFrom_selector) switch orderType case 0 { // OrderType_ASK; taker is recipient mstore(add(calldataPointer, ERC721_safeTransferFrom_to_offset), taker) mstore( add(calldataPointer, ERC721_safeTransferFrom_from_offset), calldataload(add(transfersPointer, Transfer_trader_offset)) ) } case 1 { // OrderType_BID; taker is sender mstore(add(calldataPointer, ERC721_safeTransferFrom_from_offset), taker) mstore( add(calldataPointer, ERC721_safeTransferFrom_to_offset), calldataload(add(transfersPointer, Transfer_trader_offset)) ) } default { revert(0, 0) } mstore( add(calldataPointer, ERC721_safeTransferFrom_id_offset), calldataload(add(transfersPointer, Transfer_id_offset)) ) let collection := calldataload( add(transfersPointer, Transfer_collection_offset) ) let success := call( gas(), collection, 0, calldataPointer, ERC721_safeTransferFrom_size, 0, 0 ) mstore(add(add(successful, 0x20), mul(0x20, i)), success) } case 1 { // AssetType_ERC1155 mstore(calldataPointer, ERC1155_safeTransferFrom_selector) switch orderType case 0 { // OrderType_ASK; taker is recipient mstore( add(calldataPointer, ERC1155_safeTransferFrom_from_offset), calldataload( add( transfersPointer, Transfer_trader_offset ) ) ) mstore(add(calldataPointer, ERC1155_safeTransferFrom_to_offset), taker) } case 1 { // OrderType_BID; taker is sender mstore( add(calldataPointer, ERC1155_safeTransferFrom_to_offset), calldataload( add( transfersPointer, Transfer_trader_offset ) ) ) mstore(add(calldataPointer, ERC1155_safeTransferFrom_from_offset), taker) } default { revert(0, 0) } mstore(add(calldataPointer, ERC1155_safeTransferFrom_data_pointer_offset), 0xa0) mstore(add(calldataPointer, ERC1155_safeTransferFrom_data_offset), 0) mstore( add(calldataPointer, ERC1155_safeTransferFrom_id_offset), calldataload( add(transfersPointer, Transfer_id_offset) ) ) mstore( add(calldataPointer, ERC1155_safeTransferFrom_amount_offset), calldataload( add( transfersPointer, Transfer_amount_offset ) ) ) let collection := calldataload( add( transfersPointer, Transfer_collection_offset ) ) let success := call( gas(), collection, 0, calldataPointer, ERC1155_safeTransferFrom_size, 0, 0 ) mstore(add(add(successful, 0x20), mul(0x20, i)), success) } default { revert(0, 0) } } unchecked { ++i; } } } }
// SPDX-License-Identifier: AGPL-3.0-only pragma solidity >=0.8.0; /// @notice Modern, minimalist, and gas efficient ERC-721 implementation. /// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC721.sol) abstract contract ERC721 { /*////////////////////////////////////////////////////////////// EVENTS //////////////////////////////////////////////////////////////*/ event Transfer(address indexed from, address indexed to, uint256 indexed id); event Approval(address indexed owner, address indexed spender, uint256 indexed id); event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /*////////////////////////////////////////////////////////////// METADATA STORAGE/LOGIC //////////////////////////////////////////////////////////////*/ string public name; string public symbol; function tokenURI(uint256 id) public view virtual returns (string memory); /*////////////////////////////////////////////////////////////// ERC721 BALANCE/OWNER STORAGE //////////////////////////////////////////////////////////////*/ mapping(uint256 => address) internal _ownerOf; mapping(address => uint256) internal _balanceOf; function ownerOf(uint256 id) public view virtual returns (address owner) { require((owner = _ownerOf[id]) != address(0), "NOT_MINTED"); } function balanceOf(address owner) public view virtual returns (uint256) { require(owner != address(0), "ZERO_ADDRESS"); return _balanceOf[owner]; } /*////////////////////////////////////////////////////////////// ERC721 APPROVAL STORAGE //////////////////////////////////////////////////////////////*/ mapping(uint256 => address) public getApproved; mapping(address => mapping(address => bool)) public isApprovedForAll; /*////////////////////////////////////////////////////////////// CONSTRUCTOR //////////////////////////////////////////////////////////////*/ constructor(string memory _name, string memory _symbol) { name = _name; symbol = _symbol; } /*////////////////////////////////////////////////////////////// ERC721 LOGIC //////////////////////////////////////////////////////////////*/ function approve(address spender, uint256 id) public virtual { address owner = _ownerOf[id]; require(msg.sender == owner || isApprovedForAll[owner][msg.sender], "NOT_AUTHORIZED"); getApproved[id] = spender; emit Approval(owner, spender, id); } function setApprovalForAll(address operator, bool approved) public virtual { isApprovedForAll[msg.sender][operator] = approved; emit ApprovalForAll(msg.sender, operator, approved); } function transferFrom( address from, address to, uint256 id ) public virtual { require(from == _ownerOf[id], "WRONG_FROM"); require(to != address(0), "INVALID_RECIPIENT"); require( msg.sender == from || isApprovedForAll[from][msg.sender] || msg.sender == getApproved[id], "NOT_AUTHORIZED" ); // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. unchecked { _balanceOf[from]--; _balanceOf[to]++; } _ownerOf[id] = to; delete getApproved[id]; emit Transfer(from, to, id); } function safeTransferFrom( address from, address to, uint256 id ) public virtual { transferFrom(from, to, id); require( to.code.length == 0 || ERC721TokenReceiver(to).onERC721Received(msg.sender, from, id, "") == ERC721TokenReceiver.onERC721Received.selector, "UNSAFE_RECIPIENT" ); } function safeTransferFrom( address from, address to, uint256 id, bytes calldata data ) public virtual { transferFrom(from, to, id); require( to.code.length == 0 || ERC721TokenReceiver(to).onERC721Received(msg.sender, from, id, data) == ERC721TokenReceiver.onERC721Received.selector, "UNSAFE_RECIPIENT" ); } /*////////////////////////////////////////////////////////////// ERC165 LOGIC //////////////////////////////////////////////////////////////*/ function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) { return interfaceId == 0x01ffc9a7 || // ERC165 Interface ID for ERC165 interfaceId == 0x80ac58cd || // ERC165 Interface ID for ERC721 interfaceId == 0x5b5e139f; // ERC165 Interface ID for ERC721Metadata } /*////////////////////////////////////////////////////////////// INTERNAL MINT/BURN LOGIC //////////////////////////////////////////////////////////////*/ function _mint(address to, uint256 id) internal virtual { require(to != address(0), "INVALID_RECIPIENT"); require(_ownerOf[id] == address(0), "ALREADY_MINTED"); // Counter overflow is incredibly unrealistic. unchecked { _balanceOf[to]++; } _ownerOf[id] = to; emit Transfer(address(0), to, id); } function _burn(uint256 id) internal virtual { address owner = _ownerOf[id]; require(owner != address(0), "NOT_MINTED"); // Ownership check above ensures no underflow. unchecked { _balanceOf[owner]--; } delete _ownerOf[id]; delete getApproved[id]; emit Transfer(owner, address(0), id); } /*////////////////////////////////////////////////////////////// INTERNAL SAFE MINT LOGIC //////////////////////////////////////////////////////////////*/ function _safeMint(address to, uint256 id) internal virtual { _mint(to, id); require( to.code.length == 0 || ERC721TokenReceiver(to).onERC721Received(msg.sender, address(0), id, "") == ERC721TokenReceiver.onERC721Received.selector, "UNSAFE_RECIPIENT" ); } function _safeMint( address to, uint256 id, bytes memory data ) internal virtual { _mint(to, id); require( to.code.length == 0 || ERC721TokenReceiver(to).onERC721Received(msg.sender, address(0), id, data) == ERC721TokenReceiver.onERC721Received.selector, "UNSAFE_RECIPIENT" ); } } /// @notice A generic interface for a contract which properly accepts ERC721 tokens. /// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC721.sol) abstract contract ERC721TokenReceiver { function onERC721Received( address, address, uint256, bytes calldata ) external virtual returns (bytes4) { return ERC721TokenReceiver.onERC721Received.selector; } }
// SPDX-License-Identifier: AGPL-3.0-only pragma solidity >=0.8.0; /// @notice Minimalist and gas efficient standard ERC1155 implementation. /// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC1155.sol) abstract contract ERC1155 { /*////////////////////////////////////////////////////////////// EVENTS //////////////////////////////////////////////////////////////*/ event TransferSingle( address indexed operator, address indexed from, address indexed to, uint256 id, uint256 amount ); event TransferBatch( address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] amounts ); event ApprovalForAll(address indexed owner, address indexed operator, bool approved); event URI(string value, uint256 indexed id); /*////////////////////////////////////////////////////////////// ERC1155 STORAGE //////////////////////////////////////////////////////////////*/ mapping(address => mapping(uint256 => uint256)) public balanceOf; mapping(address => mapping(address => bool)) public isApprovedForAll; /*////////////////////////////////////////////////////////////// METADATA LOGIC //////////////////////////////////////////////////////////////*/ function uri(uint256 id) public view virtual returns (string memory); /*////////////////////////////////////////////////////////////// ERC1155 LOGIC //////////////////////////////////////////////////////////////*/ function setApprovalForAll(address operator, bool approved) public virtual { isApprovedForAll[msg.sender][operator] = approved; emit ApprovalForAll(msg.sender, operator, approved); } function safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes calldata data ) public virtual { require(msg.sender == from || isApprovedForAll[from][msg.sender], "NOT_AUTHORIZED"); balanceOf[from][id] -= amount; balanceOf[to][id] += amount; emit TransferSingle(msg.sender, from, to, id, amount); require( to.code.length == 0 ? to != address(0) : ERC1155TokenReceiver(to).onERC1155Received(msg.sender, from, id, amount, data) == ERC1155TokenReceiver.onERC1155Received.selector, "UNSAFE_RECIPIENT" ); } function safeBatchTransferFrom( address from, address to, uint256[] calldata ids, uint256[] calldata amounts, bytes calldata data ) public virtual { require(ids.length == amounts.length, "LENGTH_MISMATCH"); require(msg.sender == from || isApprovedForAll[from][msg.sender], "NOT_AUTHORIZED"); // Storing these outside the loop saves ~15 gas per iteration. uint256 id; uint256 amount; for (uint256 i = 0; i < ids.length; ) { id = ids[i]; amount = amounts[i]; balanceOf[from][id] -= amount; balanceOf[to][id] += amount; // An array can't have a total length // larger than the max uint256 value. unchecked { ++i; } } emit TransferBatch(msg.sender, from, to, ids, amounts); require( to.code.length == 0 ? to != address(0) : ERC1155TokenReceiver(to).onERC1155BatchReceived(msg.sender, from, ids, amounts, data) == ERC1155TokenReceiver.onERC1155BatchReceived.selector, "UNSAFE_RECIPIENT" ); } function balanceOfBatch(address[] calldata owners, uint256[] calldata ids) public view virtual returns (uint256[] memory balances) { require(owners.length == ids.length, "LENGTH_MISMATCH"); balances = new uint256[](owners.length); // Unchecked because the only math done is incrementing // the array index counter which cannot possibly overflow. unchecked { for (uint256 i = 0; i < owners.length; ++i) { balances[i] = balanceOf[owners[i]][ids[i]]; } } } /*////////////////////////////////////////////////////////////// ERC165 LOGIC //////////////////////////////////////////////////////////////*/ function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) { return interfaceId == 0x01ffc9a7 || // ERC165 Interface ID for ERC165 interfaceId == 0xd9b67a26 || // ERC165 Interface ID for ERC1155 interfaceId == 0x0e89341c; // ERC165 Interface ID for ERC1155MetadataURI } /*////////////////////////////////////////////////////////////// INTERNAL MINT/BURN LOGIC //////////////////////////////////////////////////////////////*/ function _mint( address to, uint256 id, uint256 amount, bytes memory data ) internal virtual { balanceOf[to][id] += amount; emit TransferSingle(msg.sender, address(0), to, id, amount); require( to.code.length == 0 ? to != address(0) : ERC1155TokenReceiver(to).onERC1155Received(msg.sender, address(0), id, amount, data) == ERC1155TokenReceiver.onERC1155Received.selector, "UNSAFE_RECIPIENT" ); } function _batchMint( address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual { uint256 idsLength = ids.length; // Saves MLOADs. require(idsLength == amounts.length, "LENGTH_MISMATCH"); for (uint256 i = 0; i < idsLength; ) { balanceOf[to][ids[i]] += amounts[i]; // An array can't have a total length // larger than the max uint256 value. unchecked { ++i; } } emit TransferBatch(msg.sender, address(0), to, ids, amounts); require( to.code.length == 0 ? to != address(0) : ERC1155TokenReceiver(to).onERC1155BatchReceived(msg.sender, address(0), ids, amounts, data) == ERC1155TokenReceiver.onERC1155BatchReceived.selector, "UNSAFE_RECIPIENT" ); } function _batchBurn( address from, uint256[] memory ids, uint256[] memory amounts ) internal virtual { uint256 idsLength = ids.length; // Saves MLOADs. require(idsLength == amounts.length, "LENGTH_MISMATCH"); for (uint256 i = 0; i < idsLength; ) { balanceOf[from][ids[i]] -= amounts[i]; // An array can't have a total length // larger than the max uint256 value. unchecked { ++i; } } emit TransferBatch(msg.sender, from, address(0), ids, amounts); } function _burn( address from, uint256 id, uint256 amount ) internal virtual { balanceOf[from][id] -= amount; emit TransferSingle(msg.sender, from, address(0), id, amount); } } /// @notice A generic interface for a contract which properly accepts ERC1155 tokens. /// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC1155.sol) abstract contract ERC1155TokenReceiver { function onERC1155Received( address, address, uint256, uint256, bytes calldata ) external virtual returns (bytes4) { return ERC1155TokenReceiver.onERC1155Received.selector; } function onERC1155BatchReceived( address, address, uint256[] calldata, uint256[] calldata, bytes calldata ) external virtual returns (bytes4) { return ERC1155TokenReceiver.onERC1155BatchReceived.selector; } }
// SPDX-License-Identifier: AGPL-3.0-only pragma solidity >=0.8.0; /// @notice Modern and gas efficient ERC20 + EIP-2612 implementation. /// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC20.sol) /// @author Modified from Uniswap (https://github.com/Uniswap/uniswap-v2-core/blob/master/contracts/UniswapV2ERC20.sol) /// @dev Do not manually set balances without updating totalSupply, as the sum of all user balances must not exceed it. abstract contract ERC20 { /*////////////////////////////////////////////////////////////// EVENTS //////////////////////////////////////////////////////////////*/ event Transfer(address indexed from, address indexed to, uint256 amount); event Approval(address indexed owner, address indexed spender, uint256 amount); /*////////////////////////////////////////////////////////////// METADATA STORAGE //////////////////////////////////////////////////////////////*/ string public name; string public symbol; uint8 public immutable decimals; /*////////////////////////////////////////////////////////////// ERC20 STORAGE //////////////////////////////////////////////////////////////*/ uint256 public totalSupply; mapping(address => uint256) public balanceOf; mapping(address => mapping(address => uint256)) public allowance; /*////////////////////////////////////////////////////////////// EIP-2612 STORAGE //////////////////////////////////////////////////////////////*/ uint256 internal immutable INITIAL_CHAIN_ID; bytes32 internal immutable INITIAL_DOMAIN_SEPARATOR; mapping(address => uint256) public nonces; /*////////////////////////////////////////////////////////////// CONSTRUCTOR //////////////////////////////////////////////////////////////*/ constructor( string memory _name, string memory _symbol, uint8 _decimals ) { name = _name; symbol = _symbol; decimals = _decimals; INITIAL_CHAIN_ID = block.chainid; INITIAL_DOMAIN_SEPARATOR = computeDomainSeparator(); } /*////////////////////////////////////////////////////////////// ERC20 LOGIC //////////////////////////////////////////////////////////////*/ function approve(address spender, uint256 amount) public virtual returns (bool) { allowance[msg.sender][spender] = amount; emit Approval(msg.sender, spender, amount); return true; } function transfer(address to, uint256 amount) public virtual returns (bool) { balanceOf[msg.sender] -= amount; // Cannot overflow because the sum of all user // balances can't exceed the max uint256 value. unchecked { balanceOf[to] += amount; } emit Transfer(msg.sender, to, amount); return true; } function transferFrom( address from, address to, uint256 amount ) public virtual returns (bool) { uint256 allowed = allowance[from][msg.sender]; // Saves gas for limited approvals. if (allowed != type(uint256).max) allowance[from][msg.sender] = allowed - amount; balanceOf[from] -= amount; // Cannot overflow because the sum of all user // balances can't exceed the max uint256 value. unchecked { balanceOf[to] += amount; } emit Transfer(from, to, amount); return true; } /*////////////////////////////////////////////////////////////// EIP-2612 LOGIC //////////////////////////////////////////////////////////////*/ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) public virtual { require(deadline >= block.timestamp, "PERMIT_DEADLINE_EXPIRED"); // Unchecked because the only math done is incrementing // the owner's nonce which cannot realistically overflow. unchecked { address recoveredAddress = ecrecover( keccak256( abi.encodePacked( "\x19\x01", DOMAIN_SEPARATOR(), keccak256( abi.encode( keccak256( "Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)" ), owner, spender, value, nonces[owner]++, deadline ) ) ) ), v, r, s ); require(recoveredAddress != address(0) && recoveredAddress == owner, "INVALID_SIGNER"); allowance[recoveredAddress][spender] = value; } emit Approval(owner, spender, value); } function DOMAIN_SEPARATOR() public view virtual returns (bytes32) { return block.chainid == INITIAL_CHAIN_ID ? INITIAL_DOMAIN_SEPARATOR : computeDomainSeparator(); } function computeDomainSeparator() internal view virtual returns (bytes32) { return keccak256( abi.encode( keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"), keccak256(bytes(name)), keccak256("1"), block.chainid, address(this) ) ); } /*////////////////////////////////////////////////////////////// INTERNAL MINT/BURN LOGIC //////////////////////////////////////////////////////////////*/ function _mint(address to, uint256 amount) internal virtual { totalSupply += amount; // Cannot overflow because the sum of all user // balances can't exceed the max uint256 value. unchecked { balanceOf[to] += amount; } emit Transfer(address(0), to, amount); } function _burn(address from, uint256 amount) internal virtual { balanceOf[from] -= amount; // Cannot underflow because a user's balance // will never be larger than the total supply. unchecked { totalSupply -= amount; } emit Transfer(from, address(0), amount); } }
// SPDX-License-Identifier: MIT pragma solidity 0.8.17; uint256 constant Bytes1_shift = 0xf8; uint256 constant Bytes4_shift = 0xe0; uint256 constant Bytes20_shift = 0x60; uint256 constant One_word = 0x20; uint256 constant Memory_pointer = 0x40; uint256 constant AssetType_ERC721 = 0; uint256 constant AssetType_ERC1155 = 1; uint256 constant OrderType_ASK = 0; uint256 constant OrderType_BID = 1; uint256 constant Pool_withdrawFrom_selector = 0x9555a94200000000000000000000000000000000000000000000000000000000; uint256 constant Pool_withdrawFrom_from_offset = 0x04; uint256 constant Pool_withdrawFrom_to_offset = 0x24; uint256 constant Pool_withdrawFrom_amount_offset = 0x44; uint256 constant Pool_withdrawFrom_size = 0x64; uint256 constant Pool_deposit_selector = 0xf340fa0100000000000000000000000000000000000000000000000000000000; uint256 constant Pool_deposit_user_offset = 0x04; uint256 constant Pool_deposit_size = 0x24; uint256 constant ERC20_transferFrom_selector = 0x23b872dd00000000000000000000000000000000000000000000000000000000; uint256 constant ERC721_safeTransferFrom_selector = 0x42842e0e00000000000000000000000000000000000000000000000000000000; uint256 constant ERC1155_safeTransferFrom_selector = 0xf242432a00000000000000000000000000000000000000000000000000000000; uint256 constant ERC20_transferFrom_size = 0x64; uint256 constant ERC721_safeTransferFrom_size = 0x64; uint256 constant ERC1155_safeTransferFrom_size = 0xc4; uint256 constant OracleSignatures_size = 0x59; uint256 constant OracleSignatures_s_offset = 0x20; uint256 constant OracleSignatures_v_offset = 0x40; uint256 constant OracleSignatures_blockNumber_offset = 0x41; uint256 constant OracleSignatures_oracle_offset = 0x45; uint256 constant Signatures_size = 0x41; uint256 constant Signatures_s_offset = 0x20; uint256 constant Signatures_v_offset = 0x40; uint256 constant ERC20_transferFrom_from_offset = 0x4; uint256 constant ERC20_transferFrom_to_offset = 0x24; uint256 constant ERC20_transferFrom_amount_offset = 0x44; uint256 constant ERC721_safeTransferFrom_from_offset = 0x4; uint256 constant ERC721_safeTransferFrom_to_offset = 0x24; uint256 constant ERC721_safeTransferFrom_id_offset = 0x44; uint256 constant ERC1155_safeTransferFrom_from_offset = 0x4; uint256 constant ERC1155_safeTransferFrom_to_offset = 0x24; uint256 constant ERC1155_safeTransferFrom_id_offset = 0x44; uint256 constant ERC1155_safeTransferFrom_amount_offset = 0x64; uint256 constant ERC1155_safeTransferFrom_data_pointer_offset = 0x84; uint256 constant ERC1155_safeTransferFrom_data_offset = 0xa4; uint256 constant Delegate_transfer_selector = 0xa1ccb98e00000000000000000000000000000000000000000000000000000000; uint256 constant Delegate_transfer_calldata_offset = 0x1c; uint256 constant Order_size = 0x100; uint256 constant Order_trader_offset = 0x00; uint256 constant Order_collection_offset = 0x20; uint256 constant Order_listingsRoot_offset = 0x40; uint256 constant Order_numberOfListings_offset = 0x60; uint256 constant Order_expirationTime_offset = 0x80; uint256 constant Order_assetType_offset = 0xa0; uint256 constant Order_makerFee_offset = 0xc0; uint256 constant Order_salt_offset = 0xe0; uint256 constant Exchange_size = 0x80; uint256 constant Exchange_askIndex_offset = 0x00; uint256 constant Exchange_proof_offset = 0x20; uint256 constant Exchange_maker_offset = 0x40; uint256 constant Exchange_taker_offset = 0x60; uint256 constant BidExchange_size = 0x80; uint256 constant BidExchange_askIndex_offset = 0x00; uint256 constant BidExchange_proof_offset = 0x20; uint256 constant BidExchange_maker_offset = 0x40; uint256 constant BidExchange_taker_offset = 0x60; uint256 constant Listing_size = 0x80; uint256 constant Listing_index_offset = 0x00; uint256 constant Listing_tokenId_offset = 0x20; uint256 constant Listing_amount_offset = 0x40; uint256 constant Listing_price_offset = 0x60; uint256 constant Taker_size = 0x40; uint256 constant Taker_tokenId_offset = 0x00; uint256 constant Taker_amount_offset = 0x20; uint256 constant StateUpdate_size = 0x80; uint256 constant StateUpdate_salt_offset = 0x20; uint256 constant StateUpdate_leaf_offset = 0x40; uint256 constant StateUpdate_value_offset = 0x60; uint256 constant Transfer_size = 0xa0; uint256 constant Transfer_trader_offset = 0x00; uint256 constant Transfer_id_offset = 0x20; uint256 constant Transfer_amount_offset = 0x40; uint256 constant Transfer_collection_offset = 0x60; uint256 constant Transfer_assetType_offset = 0x80; uint256 constant ExecutionBatch_selector_offset = 0x20; uint256 constant ExecutionBatch_calldata_offset = 0x40; uint256 constant ExecutionBatch_base_size = 0xa0; // size of the executionBatch without the flattened dynamic elements uint256 constant ExecutionBatch_taker_offset = 0x00; uint256 constant ExecutionBatch_orderType_offset = 0x20; uint256 constant ExecutionBatch_transfers_pointer_offset = 0x40; uint256 constant ExecutionBatch_length_offset = 0x60; uint256 constant ExecutionBatch_transfers_offset = 0x80;
// SPDX-License-Identifier: MIT pragma solidity ^0.8.17; struct TakeAsk { Order[] orders; Exchange[] exchanges; FeeRate takerFee; bytes signatures; address tokenRecipient; } struct TakeAskSingle { Order order; Exchange exchange; FeeRate takerFee; bytes signature; address tokenRecipient; } struct TakeBid { Order[] orders; Exchange[] exchanges; FeeRate takerFee; bytes signatures; } struct TakeBidSingle { Order order; Exchange exchange; FeeRate takerFee; bytes signature; } enum AssetType { ERC721, ERC1155 } enum OrderType { ASK, BID } struct Exchange { // Size: 0x80 uint256 index; // 0x00 bytes32[] proof; // 0x20 Listing listing; // 0x40 Taker taker; // 0x60 } struct Listing { // Size: 0x80 uint256 index; // 0x00 uint256 tokenId; // 0x20 uint256 amount; // 0x40 uint256 price; // 0x60 } struct Taker { // Size: 0x40 uint256 tokenId; // 0x00 uint256 amount; // 0x20 } struct Order { // Size: 0x100 address trader; // 0x00 address collection; // 0x20 bytes32 listingsRoot; // 0x40 uint256 numberOfListings; // 0x60 uint256 expirationTime; // 0x80 AssetType assetType; // 0xa0 FeeRate makerFee; // 0xc0 uint256 salt; // 0xe0 } /* Reference only; struct is composed manually using calldata formatting in execution struct ExecutionBatch { // Size: 0x80 address taker; // 0x00 OrderType orderType; // 0x20 Transfer[] transfers; // 0x40 uint256 length; // 0x60 } */ struct Transfer { // Size: 0xa0 address trader; // 0x00 uint256 id; // 0x20 uint256 amount; // 0x40 address collection; // 0x60 AssetType assetType; // 0x80 } struct FungibleTransfers { uint256 totalProtocolFee; uint256 totalSellerTransfer; uint256 totalTakerFee; uint256 feeRecipientId; uint256 makerId; address[] feeRecipients; address[] makers; uint256[] makerTransfers; uint256[] feeTransfers; AtomicExecution[] executions; } struct AtomicExecution { // Size: 0xe0 uint256 makerId; // 0x00 uint256 sellerAmount; // 0x20 uint256 makerFeeRecipientId; // 0x40 uint256 makerFeeAmount; // 0x60 uint256 takerFeeAmount; // 0x80 uint256 protocolFeeAmount; // 0xa0 StateUpdate stateUpdate; // 0xc0 } struct StateUpdate { // Size: 0xa0 address trader; // 0x00 bytes32 hash; // 0x20 uint256 index; // 0x40 uint256 value; // 0x60 uint256 maxAmount; // 0x80 } struct Fees { // Size: 0x40 FeeRate protocolFee; // 0x00 FeeRate takerFee; // 0x20 } struct FeeRate { // Size: 0x40 address recipient; // 0x00 uint16 rate; // 0x20 } struct Cancel { bytes32 hash; uint256 index; uint256 amount; }
{ "viaIR": false, "metadata": { "bytecodeHash": "none" }, "optimizer": { "enabled": true, "runs": 20000 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {}, "remappings": [ "@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/", "@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/", "ds-test/=lib/forge-std/lib/ds-test/src/", "erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/", "forge-std/=lib/forge-std/src/", "openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/", "openzeppelin-contracts/=lib/openzeppelin-contracts/", "openzeppelin/=lib/openzeppelin-contracts/contracts/", "solmate/=lib/solmate/src/" ] }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"exchange","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"InvalidLength","type":"error"},{"inputs":[],"name":"Unauthorized","type":"error"},{"inputs":[{"internalType":"address","name":"taker","type":"address"},{"internalType":"enum OrderType","name":"orderType","type":"uint8"},{"components":[{"internalType":"address","name":"trader","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"collection","type":"address"},{"internalType":"enum AssetType","name":"assetType","type":"uint8"}],"internalType":"struct Transfer[]","name":"transfers","type":"tuple[]"},{"internalType":"uint256","name":"length","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool[]","name":"successful","type":"bool[]"}],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60a060405234801561001057600080fd5b5060405161046f38038061046f83398101604081905261002f91610040565b6001600160a01b0316608052610070565b60006020828403121561005257600080fd5b81516001600160a01b038116811461006957600080fd5b9392505050565b6080516103e561008a6000396000607301526103e56000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063a1ccb98e14610030575b600080fd5b61004361003e3660046102a9565b610059565b6040516100509190610363565b60405180910390f35b60603373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146100ca576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81831015610104576040517f947d5a8400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8167ffffffffffffffff81111561011d5761011d6103a9565b604051908082528060200260200182016040528015610146578160200160208202803683370190505b50905060005b8281101561029f5760405160a082028601608081013580801561017657600181146101f957600080fd5b7f42842e0e0000000000000000000000000000000000000000000000000000000084528980156101ad57600181146101c057600080fd5b602485018c9052833560048601526101cf565b600485018c9052833560248601525b506020830135604485015260608301356000806064876000855af160208088028901015250610290565b7ff242432a000000000000000000000000000000000000000000000000000000008452898015610230576001811461024357600080fd5b83356004860152602485018c9052610252565b83356024860152600485018c90525b5060a06084850152600060a48501526020830135604485015260408301356064850152606083013560008060c4876000855af1602080880289010152505b5050505080600101905061014c565b5095945050505050565b6000806000806000608086880312156102c157600080fd5b853573ffffffffffffffffffffffffffffffffffffffff811681146102e557600080fd5b94506020860135600281106102f957600080fd5b9350604086013567ffffffffffffffff8082111561031657600080fd5b818801915088601f83011261032a57600080fd5b81358181111561033957600080fd5b89602060a08302850101111561034e57600080fd5b96999598505060200195606001359392505050565b6020808252825182820181905260009190848201906040850190845b8181101561039d57835115158352928401929184019160010161037f565b50909695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fdfea164736f6c6343000811000a000000000000000000000000b2ecfe4e4d61f8790bbb9de2d1259b9e2410cea5
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061002b5760003560e01c8063a1ccb98e14610030575b600080fd5b61004361003e3660046102a9565b610059565b6040516100509190610363565b60405180910390f35b60603373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000b2ecfe4e4d61f8790bbb9de2d1259b9e2410cea516146100ca576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81831015610104576040517f947d5a8400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8167ffffffffffffffff81111561011d5761011d6103a9565b604051908082528060200260200182016040528015610146578160200160208202803683370190505b50905060005b8281101561029f5760405160a082028601608081013580801561017657600181146101f957600080fd5b7f42842e0e0000000000000000000000000000000000000000000000000000000084528980156101ad57600181146101c057600080fd5b602485018c9052833560048601526101cf565b600485018c9052833560248601525b506020830135604485015260608301356000806064876000855af160208088028901015250610290565b7ff242432a000000000000000000000000000000000000000000000000000000008452898015610230576001811461024357600080fd5b83356004860152602485018c9052610252565b83356024860152600485018c90525b5060a06084850152600060a48501526020830135604485015260408301356064850152606083013560008060c4876000855af1602080880289010152505b5050505080600101905061014c565b5095945050505050565b6000806000806000608086880312156102c157600080fd5b853573ffffffffffffffffffffffffffffffffffffffff811681146102e557600080fd5b94506020860135600281106102f957600080fd5b9350604086013567ffffffffffffffff8082111561031657600080fd5b818801915088601f83011261032a57600080fd5b81358181111561033957600080fd5b89602060a08302850101111561034e57600080fd5b96999598505060200195606001359392505050565b6020808252825182820181905260009190848201906040850190845b8181101561039d57835115158352928401929184019160010161037f565b50909695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fdfea164736f6c6343000811000a
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000b2ecfe4e4d61f8790bbb9de2d1259b9e2410cea5
-----Decoded View---------------
Arg [0] : exchange (address): 0xb2ecfE4E4D61f8790bbb9DE2D1259B9e2410CEA5
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000b2ecfe4e4d61f8790bbb9de2d1259b9e2410cea5
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ 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.