Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 1 from a total of 1 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Transfer | 21403218 | 8 days ago | IN | 0.002 ETH | 0.00017109 |
Latest 1 internal transaction
Advanced mode:
Parent Transaction Hash | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|
21337307 | 17 days ago | 0.00376103 ETH |
Loading...
Loading
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 ]
[ 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.